cauril/Docs

Errores

Una sola forma de error en toda la API.

Todos los errores comparten la misma estructura. Siempre.

JSON
{
  "error": {
    "type": "provider_error",
    "code": "card_declined",
    "message": "The card was declined.",
    "param": "payment_method",
    "doc_url": "https://docs.cauril.com/errors/card_declined",
    "request_id": "req_01J...",
    "provider_error": { "provider": "stripe", "raw_code": "card_declined" }
  }
}
CampoDescripción
typeCategoría del error (ver tabla abajo).
codeCódigo específico y estable, apto para switch en tu código.
messageTexto legible para humanos. No lo parsees; usá code.
paramEl campo que causó el error, si aplica.
doc_urlLink a la documentación de ese código.
request_idIdentificador de la request, útil para soporte.
provider_errorDetalle crudo del PSP, cuando el error vino de él.

Tipos y status HTTP

typeHTTPCuándo
invalid_request_error400 / 422Body o parámetros inválidos.
authentication_error401API key faltante o inválida.
permission_error403La key no tiene permiso para el recurso.
not_found_error404El recurso no existe (o no es de tu organización).
idempotency_error409Idempotency-Key reusada con otro body.
conflict_error409El estado actual no permite la operación (ej. reembolsar un pago no exitoso).
rate_limit_error429Demasiadas requests.
provider_error402El PSP rechazó o falló la operación (ej. tarjeta declinada).
api_error500Algo falló de nuestro lado.

Transitorios vs. permanentes

Un provider_error puede ser permanente (una tarjeta declinada va a declinar de nuevo → no reintentes igual) o transitorio (un 5xx o 429 del PSP → reintentá con la misma Idempotency-Key). Los errores api_error (5xx) también son transitorios.

Nunca tomes decisiones de negocio a partir del message (puede cambiar). Usá siempre type + code.