Erros

Toda resposta de erro tem o mesmo formato, em qualquer rota:

{
  "code": "SPLIT_INVALID",
  "message": "A soma do split passa do valor da venda.",
  "details": [
    { "field": "splitRules[1].amountCents", "message": "..." }
  ]
}
CampoPra que serve
codeO tipo do erro. Estável: é nele que o seu código deve se basear.
messageExplicação pra uma pessoa ler. Pode mudar de texto; não compare com ela.
detailsSó aparece quando dá pra apontar o campo ou cabeçalho com problema.

Como tratar

O código HTTP diz de que lado está o problema, e o que fazer:

StatusO que quer dizerO que fazer
400O pedido está errado (campo faltando ou inválido)Corrija e mande de novo. Repetir igual não adianta.
401Chave de API ausente, inválida ou do ambiente erradoConfira a chave e o ambiente.
403A chave não tem permissão pra essa rotaFale com a SwitchPay.
404O que você pediu não existe ou não é da sua empresaConfira o id.
409O pedido bate de frente com o estado atualVeja o code: cada um tem um motivo.
410O prazo passou (intenção expirada)Crie outra.
422O pedido é bem formado, mas uma regra do negócio recusouVeja o code e corrija o dado.
429Muitas chamadas em pouco tempoEspere o tempo de Retry-After e repita.
5xxFalha do nosso lado ou da adquirenteRepita com a mesma Idempotency-Key, com intervalo.

Cartão recusado não é erro. Quando o banco recusa o cartão, o confirm responde 201 com a transação em FAILED. Erro HTTP é quando a chamada em si não pôde ser atendida.

Lendo o details

Em erro de validação, details traz um item por problema, todos de uma vez:

{
  "code": "VALIDATION_ERROR",
  "message": "...",
  "details": [
    { "field": "amountCents", "message": "..." },
    { "field": "buyer.email", "message": "..." }
  ]
}

field usa o caminho do campo no corpo (buyer.email, splitRules[1].amountCents) ou o nome do cabeçalho (Idempotency-Key). Dá pra usar direto pra marcar o campo errado na sua tela.

Todos os códigos

Pedido e acesso

CódigoHTTPQuando acontece
VALIDATION_ERROR400Campo ou cabeçalho faltando ou inválido (details diz qual)
UNAUTHORIZED401Chave ausente, inválida, revogada ou do ambiente errado
FORBIDDEN403Chave sem permissão pra esta rota
NOT_FOUND404O recurso não existe ou não é seu
RATE_LIMITED429Muitas chamadas; veja Retry-After

Intenção e cobrança

CódigoHTTPQuando acontece
REFERENCE_ID_IN_USE409referenceId já usado por intenção em andamento ou por transação
INTENT_ALREADY_PROCESSED409Intenção já confirmada, cancelada ou expirada
INTENT_EXPIRED410A intenção passou dos 5 minutos; crie outra
PAYMENT_METHOD_NOT_AVAILABLE422Forma de pagamento não habilitada pra sua empresa
SELLER_NOT_FOUND422Sua empresa ainda não tem conta de vendedor aprovada
SPLIT_INVALID422Split passa do valor, percentual acima de 100 ou regra sem valor
SPLIT_RECIPIENT_NOT_FOUND422Documento do split não é de conta aprovada na SwitchPay

Idempotência

CódigoHTTPQuando acontece
IDEMPOTENCY_KEY_REUSED409Mesma chave com corpo diferente
IDEMPOTENCY_IN_PROGRESS409A primeira chamada ainda está processando; tente de novo

Cartão e cofre

CódigoHTTPQuando acontece
TICKET_INVALID401O ticket não é válido pra este cofre ou foi alterado
TICKET_EXPIRED401O ticket passou dos 5 minutos
TICKET_USED401O ticket já foi usado
TOKEN_REQUIRED422Intenção de cartão confirmada sem token
TOKEN_INVALID422Token inválido, vencido ou de outra intenção

Webhooks e sandbox

CódigoHTTPQuando acontece
WEBHOOK_URL_INVALID422A URL não é https ou aponta pra endereço interno
SANDBOX_ONLY404A rota só existe no sandbox
TRANSACTION_NOT_PENDING409No sandbox, só transação PENDING pode ser simulada

Falhas do lado de cá

CódigoHTTPQuando acontece
PROVIDER_ERROR502A adquirente não respondeu ou falhou
INTERNAL_ERROR500Falha inesperada do nosso lado; repita com a mesma Idempotency-Key
SERVICE_UNAVAILABLE503Serviço fora do ar; nada foi criado; repita depois de Retry-After

Boas práticas

  • Decida o que fazer pelo code, nunca pelo texto de message.
  • Trate código que você não conhece como erro genérico: a lista pode ganhar itens novos.
  • Guarde em log o code, o message e o details de todo erro. Facilita muito o suporte.
  • Em 5xx e em 429, repita com espera crescente entre as tentativas, e sempre com a mesma Idempotency-Key.