DOCS · ERRORES

Errores y códigos de respuesta

Cada respuesta no-2xx devuelve un envelope estructurado. Misma forma para 4xx y 5xx — leélo una vez y manejá todos los errores de la API con un solo branch.

01 · ENVELOPE

Envelope de error

Toda respuesta de error — 4xx o 5xx — viene con esta forma. Sin variantes, sin sorpresas. Si necesitás soporte, copiá el request_id en el ticket y vamos a poder trazar el request exacto.

JSON4xx · 5xx
{
  "error": {
    "code": "invalid_input",
    "message": "value must be a string",
    "request_id": "req_a1b2c3d4e5f6g7"
  }
}

Campos del envelope

  • codestring · estable y machine-readable. Usalo para branchear en tu cliente.
  • messagestring · descripción human-readable en inglés por diseño. Si necesitás mensajes en español o portugués para usuarios finales, traducí en tu UI mapeando por code.
  • request_idstring · matchea el header X-Request-Id de la respuesta. Lo loggeamos del lado nuestro por 30 días — incluilo en cualquier reporte a soporte.
02 · HTTP

Códigos de status HTTP

valid: false no es un error HTTP — devolvemos 200 con valid: false y razón legible. Los códigos abajo aplican a fallas de transporte, autenticación, schema o disponibilidad.

StatusSignificadoCuándoQué hacererror.code ejemplo
200OKRequest válido y procesado.Inspeccioná value.valid para el resultado de validación.
400Bad RequestFalta un campo requerido, tipo incorrecto, JSON mal formado.Revisá el error.code y el shape del body que estás mandando.invalid_input · missing_required_field
401UnauthorizedHeader X-API-Key faltante o inválido.Verificá el formato nd_… y que la key esté activa.unauthorized · invalid_api_key
403ForbiddenEndpoint no autorizado para tu scope.Contactá a soporte si deberías tener acceso a este endpoint.forbidden
404Not FoundURL inexistente.Revisá los paths de los endpoints (/v1/verify/…).not_found
422Unprocessable EntityInput con shape incorrecto para el endpoint (ej. mandar un email a /verify/tax-id).Usá Smart Parse o el endpoint correcto para el tipo de dato.wrong_endpoint_for_input
429Too Many RequestsExcedido el quota de tu plan.Honrá el header Retry-After. Ver /docs/rate-limits.rate_limited
500Internal Server ErrorBug del lado nuestro.Reintentá con backoff exponencial; reportá con el request_id.internal_error
502/503/504Bad Gateway · Unavailable · TimeoutProblema temporal de infraestructura o upstream.Reintentá con exponential backoff + jitter.bad_gateway · unavailable · timeout
03 · WARNINGS

Códigos de warning

Cuando un endpoint procesa parcialmente o detecta algo sospechoso, devuelve warnings en el array warnings junto a un 200 OK. No son errores — son señales para tu UI o pipeline.

CodeCuándo apareceQué significa
UNKNOWN_TAX_IDEl formato del tax ID no matchea ningún país conocido.Devuelto con valid: false cuando Smart Parse no puede detectar el país. Pedile al usuario que confirme el país y reenvíe.
LOW_CONFIDENCESmart Parse hizo un best-guess de ruteo con confidence < 0.5.Pasá un country_hint para desambiguar y subir el confidence.
AMBIGUOUS_MATCHMúltiples tipos matchearon el input con confidence similar.Tomá el primer candidato (el más probable) o revisá el array warnings para ver todos los candidatos.
INVALID_CHECKSUMFormato ok pero el dígito verificador no calza.Probablemente un typo del usuario. Surface inline error en tu UI y pedile que revise.
COMPONENTS_IGNOREDMandaste full_name y first_name juntos — full_name ganó.Inspeccioná el diff entre source y normalized para ver qué se descartó.
DISPOSABLE_DOMAINEl email viene de un proveedor desechable conocido.Surfacealo como soft warning — no necesariamente bloquear, depende de tu caso de uso.
RESERVED_RANGEEl número de teléfono está en un rango reservado (ej. 555 en US).Rechazá como data de prueba — esos números no son alcanzables en red real.
04 · REQUEST ID

X-Request-Id

Cada respuesta — éxito o error — incluye el header X-Request-Id con un ID único formato req_… que también aparece dentro del envelope de error.

Loggeamos request_id del lado nuestro por 30 días. Cuando abras un ticket en hello@normadata.io o reportes un bug, copiá el request_id — sin él no podemos trazar la request exacta en nuestros logs.

05 · RETRIES

Estrategia de retries

Los códigos 5xx y 429 son seguros para reintentar — son fallas transitorias o de capacidad. Implementá exponential backoff con jitter para evitar thundering herd en recuperaciones.

Los códigos 4xx (excepto 429) NO se deben reintentar. Son fallas de request — el request va a fallar igual si lo mandás de nuevo sin cambios. Fijate primero el error.code y corregí el request antes de reintentar.

RESUMEN

Retry seguro: 5xx, 429. NO retry: 400, 401, 403, 404, 422. Para 429, honrá Retry-After.

Ver detalles de rate limits