DOCS · ERROS

Erros e códigos de resposta

Toda resposta não-2xx devolve um envelope estruturado. Mesma forma pra 4xx e 5xx — leia uma vez e maneje todos os erros da API com um único branch.

01 · ENVELOPE

Envelope de erro

Toda resposta de erro — 4xx ou 5xx — vem com essa forma. Sem variantes, sem surpresas. Se precisar de suporte, copia o request_id no ticket e a gente consegue rastrear o request exato.

JSON4xx · 5xx
{
  "code": "invalid_input",
  "message": "value must be a string.",
  "field": "value"
}

Campos do envelope

  • codestring · estável e machine-readable. Use pra branchear no seu cliente.
  • messagestring · descrição human-readable em inglês por design. Se precisar de mensagens em português ou espanhol pro usuário final, traduz na sua UI mapeando por code.
  • fieldOpcional. Nomeia o campo de entrada que causou o erro.
02 · HTTP

Códigos de status HTTP

valid: false não é um erro HTTP — devolvemos 200 com valid: false e um motivo legível. Os códigos abaixo se aplicam a falhas de transporte, autenticação, schema ou disponibilidade.

StatusSignificadoQuandoO que fazererror.code exemplo
200OKRequest válido e processado.Inspecione value.valid pro resultado da validação.
400Bad RequestFalta um campo obrigatório, tipo errado, JSON mal formado.Confere o error.code e o shape do body que está mandando.empty_batch · batch_too_large · invalid_input
401UnauthorizedHeader X-API-Key ausente ou inválido.Confere o formato nd_… e que a key está ativa.invalid_api_key
429Too Many RequestsExcedeu a cota da sua conta.Honra o header Retry-After. Ver /docs/rate-limits.quota_exceeded · rate_limit_exceeded
5xxBad Gateway · Unavailable · TimeoutProblema temporário de infraestrutura ou upstream.Tenta de novo com exponential backoff + jitter.internal_error
POR ITEM

Falhas por item

Uma entrada que não pode ser validada nunca interrompe o lote. O resultado desse item traz valid: false e um campo error com o motivo acionável. O resto dos itens é devolvido normalmente.

EndpointExemplo de error
tax-ids · accountscheck digit does not match
tax-idsunsupported type for country AR
accountsaccount checksum is not verified
emailstypo in domain: did you mean gmail.com?
phonesnot a valid phone number for BR
EXEMPLOS

Corpos de resposta por status

O sucesso (200) devolve { results: [...] } com um resultado por item (cada um com seu valid e, se falhar, error). Os erros de lote devolvem { code, message, field? }.

JSON200 OK
{
  "results": [
    {
      "id": "a",
      "country": "AR",
      "type": "cuit",
      "valid": true,
      "normalized": "20123456786",
      "formatted": "20-12345678-6"
    },
    {
      "id": "b",
      "country": "AR",
      "type": "cuit",
      "valid": false,
      "error": "check digit does not match"
    }
  ]
}
JSON400 Bad Request
{
  "code": "empty_batch",
  "message": "The `items` array must contain at least one item."
}
JSON401 Unauthorized
{
  "code": "invalid_api_key",
  "message": "Missing or invalid X-API-Key header."
}
JSON429 Too Many Requests
{
  "code": "quota_exceeded",
  "message": "This batch of 250 requests exceeds the remaining monthly quota."
}
JSON5xx Server Error
{
  "code": "internal_error",
  "message": "Unexpected server error. Retry after 5s with jitter."
}
05 · RETRIES

Estratégia de retries

Os códigos 5xx e 429 são seguros pra tentar de novo — são falhas transitórias ou de capacidade. Implementa exponential backoff com jitter pra evitar thundering herd em recuperações.

Os códigos 4xx (exceto 429) NÃO devem ser tentados de novo. São falhas de request — o request vai falhar do mesmo jeito se você mandar de novo sem mudar nada. Olha primeiro o error.code e corrige o request antes de tentar de novo.

RESUMO

Retry seguro: 5xx, 429. NÃO retry: 400, 401, 403, 404, 422. Pra 429, honra Retry-After.

Ver detalhes de rate limits