Saltar al contenido principal

Errores

Toda respuesta de error usa un envoltorio JSON estable.

aviso

Ramifica tu lógica por el code, nunca por el texto de message — el mensaje es legible por humanos y puede cambiar; el code es contrato.

Envoltorio

{
"error": {
"code": "unprocessable_entity",
"message": "Request body validation failed.",
"details": {
"issues": [
{ "path": "amount", "code": "invalid_string", "message": "Invalid" }
]
}
}
}
CampoDescripción
error.codeCódigo estable (tabla abajo). Ramifica por él.
error.messageTexto legible, en inglés. No lo parsees.
error.detailsPresente en algunos errores — datos estructurados útiles (campo ofensor, motivo, alcance faltante). Ver ejemplos abajo.

Códigos

codeHTTPCuándo
bad_request400Query/body malformado — JSON inválido, filtro/operador desconocido, cursor inválido, valor de filtro vacío, limit inválido.
invalid_token401Token ausente, malformado, con firma inválida o expirado.
invalid_audience401El aud del token no es aceptado.
token_revoked401Token revocado.
insufficient_scope403Token válido, pero sin el alcance exigido. details trae required y granted.
unknown_organization403El sub del token no corresponde a ningún workspace.
not_found404Recurso inexistente o fuera de tu workspace — por aislamiento, un recurso de otro tenant se lee como 404.
conflict409Conflicto de estado: X-Idempotency-Key reutilizada con cuerpo diferente, solicitud idéntica aún en curso, o carrera en una constraint única. details.reason cuando aplica.
unprocessable_entity422Cuerpo válido, pero los datos violan una regla — validación de schema, referencia (FK) fuera del tenant, o transición de estado inválida. details.issues en la validación de schema.
rate_limited429Límite de solicitudes alcanzado. Ver Límite de Solicitudes.
internal_error500Falla inesperada en el servidor. Nunca lleva details. Reenvía con backoff.

Ejemplos de details

Validación de schema (422):

{
"error": {
"code": "unprocessable_entity",
"message": "Request body validation failed.",
"details": {
"issues": [
{ "path": "amount", "code": "invalid_string", "message": "Invalid" }
]
}
}
}

Alcance insuficiente (403):

{
"error": {
"code": "insufficient_scope",
"message": "Token is missing required scope: finance.payables.dispatch.",
"details": {
"required": "finance.payables.dispatch",
"granted": ["finance.payables"]
}
}
}

Idempotency-Key reutilizada con cuerpo diferente (409):

{
"error": {
"code": "conflict",
"message": "X-Idempotency-Key was already used with different request parameters. Reuse the original parameters or generate a new key.",
"details": { "reason": "idempotency_key_reused" }
}
}