Erros
Toda resposta de erro tem a mesma forma, para que exista um único caminho de tratamento no seu código.
{
"code": "INSUFFICIENT_FUNDS",
"message": "Saldo insuficiente para esta operação.",
"requestId": "7c3d4b589e21",
"details": {}
}A message é sempre segura para exibir ao usuário final: nada de erro de driver, nome de tabela ou caminho de arquivo. O detalhe técnico vai para o log do servidor, ligado a esta resposta pelo requestId.
requestId
Vem no corpo do erro e no cabeçalho X-Request-Id de toda resposta. É o que o suporte pede: ele liga a resposta que você recebeu ao registro do servidor. Guarde-o nos seus próprios logs — sem ele, investigar uma chamada específica vira arqueologia.
Se você enviar um X-Request-Id na requisição, ele é preservado, e a mesma chamada fica rastreável dos dois lados.
Códigos
| Código | HTTP | Significa | O que fazer |
|---|---|---|---|
INVALID_REQUEST | 400 · 422 | Corpo malformado, campo desconhecido ou valor inválido. | Corrija a requisição. Campo desconhecido é recusado de propósito: “ammount” em vez de “amount” viraria zero em silêncio. |
UNAUTHORIZED | 401 | Credencial ausente, inválida, revogada, expirada, de outro ambiente ou, numa chave de produção recém-emitida, ainda aguardando a aprovação do banco. | Leia a mensagem — ela distingue os seis casos. Numa sessão, renove o token; numa integração, confira a chave e a URL base. |
FORBIDDEN | 403 | Autenticado, mas sem permissão para esta operação. | Não repita. A permissão não vai mudar sozinha. Chave de API em rota que só aceita sessão (cobrança por boleto, TED) cai aqui, e também toda chamada com a chave de uma conta bloqueada ou encerrada. |
STEP_UP_REQUIRED | 403 | Falta a confirmação de segundo fator para esta operação. | Chame POST /v1/auth/step-up com o purpose certo e repita com X-Step-Up. |
BIOMETRIC_REQUIRED | 403 | Operação de valor alto confirmada só com o código: esta instalação exige também a selfie, conferida contra a biometria cadastrada. | Emita a prova de novo em POST /v1/auth/step-up, agora com o campo selfie, e repita a operação com o novo X-Step-Up. A mensagem diz a partir de que valor a regra vale. |
NOT_FOUND | 404 | O registro não existe — ou não é seu. | Transação de outra conta responde 404, e não 403: é o que impede descobrir identificadores por tentativa. |
CONFLICT | 409 | A operação conflita com o estado atual. A transação já foi decidida, por exemplo. | Releia o estado antes de decidir de novo. |
IDEMPOTENCY_KEY_REUSED | 409 | A mesma chave de idempotência já foi usada com outro conteúdo. | Use uma chave nova para uma operação nova. Não reaproveite chave entre pedidos diferentes. |
IDEMPOTENCY_IN_FLIGHT | 409 | A operação com esta chave ainda está rodando. | Espere o que Retry-After indica e repita. A resposta será a da primeira. |
INSUFFICIENT_FUNDS | 422 | Saldo insuficiente. | Confira o saldo disponível: heldCents já saiu do balanceCents. |
LIMIT_EXCEEDED | 422 | Um limite da conta foi atingido. | A mensagem traz o valor que falta. Limites em vigor estão em GET /v1/limits. |
APPROVAL_REQUIRED | 422 | A operação passa da alçada de aprovação conjunta da conta da empresa: não é executada por quem pediu. | Não repita. Repetir dá o mesmo resultado; a operação precisa ficar dentro da alçada. |
RATE_LIMITED | 429 | Limite de requisições por minuto atingido. | Espere o que Retry-After indica. Não repita em laço apertado. |
TOO_MANY_ATTEMPTS | 429 | Cinco erros de senha ou de código em quinze minutos. No login e na recuperação de senha, a trava é do documento a partir daquela origem (endereço): quem erra não tranca o titular de verdade, que segue entrando de outra origem. Nas etapas já autenticadas, a trava é da própria identidade. | Espere o que Retry-After indica. Repetir na hora só prolonga a trava. |
PROVIDER_ERROR | 422 · 503 | O arranjo de pagamento recusou (422) ou está indisponível (503). Em 503, details.reason pode dizer que nada foi enviado ao banco: LOCATION_REQUIRED (faltou X-Client-Location, que o provedor exige) ou DEVICE_REQUIRED (a sessão foi aberta sem identificar o aparelho). | Em 503 sem details.reason, repita com a mesma chave de idempotência. Com LOCATION_REQUIRED, mande a localização e repita; com DEVICE_REQUIRED, entre de novo enviando deviceFingerprint no login. Em 422, confira os dados: repetir dará o mesmo resultado. |
DEVICE_NOT_ENABLED | 403 · 401 | O aparelho não está habilitado para a conta. 403 no login (POST /v1/auth/mfa): senha e código certos, nenhuma sessão aberta. 401 na renovação e nas rotas autenticadas, quando a instalação impõe a regra e o aparelho da sessão deixou de estar habilitado. details.deviceStatus diz o estado. | Não repita, e entrar de novo pelo mesmo aparelho também não resolve: mostre o bloqueio. PENDING aguarda habilitação; BLOCKED só o atendimento libera; UNKNOWN é login sem deviceFingerprint. |
CARD_* | 409 · 422 | Recusas do cartão: CARD_TERMS_REQUIRED (termo não aceito), CARD_ELIGIBILITY_REQUIRED (análise não aprovada), CARD_KIND_UNAVAILABLE (tipo indisponível), CARD_BLOCKED_BY_INSTITUTION (bloqueado pelo banco), CARD_NOT_ACTIVE (ainda não confirmado pelo emissor), CARD_USE_REVEAL e CARD_USE_SECURE_VIEW (a instalação mostra os dados do cartão pelo outro caminho). | Cada rota de /v1/cards diz, na referência, qual destes pode responder e o HTTP de cada um. Conduza o titular ao passo que falta (aceitar o termo, esperar a análise) em vez de repetir. |
FEATURE_DISABLED | 403 | A funcionalidade está desligada nesta instalação. details.feature diz qual (pix_transfer, billet_issue, subscriptions, merchant_portal…). Cada módulo — assinaturas, portal do estabelecimento, rede de indicação, benefícios — é uma funcionalidade que a instalação liga ou desliga. Não é falta de permissão. | Não repita: outra credencial ou outra tentativa dão o mesmo resultado. Consulte GET /v1/features e esconda da tela o que não está ligado. |
INTERNAL_ERROR | 500 | Erro não previsto do nosso lado. | Repita com a mesma chave de idempotência. Se persistir, mande o requestId para o suporte. |
O que dá para repetir
Repita 429, 500 e 503 — sempre com a mesma chave de idempotência, e com espera crescente entre as tentativas. Repetir 4xx de validação só produz o mesmo erro mais rápido.
A página de idempotência tem um exemplo de laço de repetição que não cobra duas vezes.