Buscar en la documentación

Errores de la API

Formato de los errores (RFC 9457) y catálogo de códigos generales y de validación.

3 min de lecturaVer en GitHub

Todos los errores salen con Content-Type: application/problem+json siguiendo el estándar RFC 9457. El backend entrega códigos; el frontend los traduce a mensajes claros desde su catálogo. Nunca se devuelven trazas, consultas SQL ni nombres de clases.

Formato

{
  "type": "urn:trazo:error:validation-failed",
  "title": "Validation failed",
  "status": 422,
  "code": "VALIDATION_FAILED",
  "errors": {
    "title": [{ "code": "TOO_LONG", "params": { "max": "80" } }],
    "email": [{ "code": "INVALID_EMAIL" }]
  },
  "trace_id": "01JB7Q3W0Z5K8R2M4N6P9T1V3X"
}
CampoSiempreDescripción
typeSíIdentificador del tipo de error
titleSíDescripción corta en inglés, para quien desarrolla
statusSíEstado HTTP
codeSíCódigo estable que el front traduce
paramsNoDatos para construir el mensaje (p. ej. estados de una transición)
errorsNoErrores por campo, cada uno con su code y sus params
trace_idSíIdentificador de la petición; coincide con la cabecera X-Request-Id

Los 429 y los 423 incluyen Retry-After, y los 405 incluyen Allow.

Códigos generales

CódigoEstadoCuándo
MALFORMED_REQUEST400La petición no se puede interpretar
UNAUTHENTICATED401No hay sesión o expiró
FORBIDDEN_ACTION403No tiene permiso para esa acción
RESOURCE_NOT_FOUND404No existe o no puede verlo
METHOD_NOT_ALLOWED405El método HTTP no aplica a esa ruta
VALIDATION_FAILED422Uno o más campos no son válidos (ver errors)
TOO_MANY_REQUESTS429Superó el límite de peticiones
SERVICE_UNAVAILABLE503Modo mantenimiento
INTERNAL_ERROR500Error inesperado (el detalle queda solo en los logs)

Los códigos de negocio de cada módulo (por ejemplo INVALID_STATUS_TRANSITION) se documentan en su módulo. Los de sesión (INVALID_CREDENTIALS y ACCOUNT_LOCKED) están en Módulo Auth, y los de incidentes en Módulo Incidents.

Códigos de validación por campo

CódigoReglaParámetros
REQUIREDCampo obligatorio—
MUST_BE_TEXT, MUST_BE_INTEGER, MUST_BE_NUMBER, MUST_BE_BOOLEAN, MUST_BE_LISTTipo de dato—
INVALID_EMAIL, INVALID_DATE, INVALID_IDENTIFIERFormato—
TOO_SHORT / TOO_LONGMínimo / máximomin / max
OUT_OF_RANGEEntre dos valoresmin, max
WRONG_SIZETamaño exactosize
INVALID_OPTIONValor fuera de la lista permitida—
INVALID_REFERENCEReferencia a algo que no existe—
ALREADY_TAKENValor que debe ser único—
CONFIRMATION_MISMATCHLa confirmación no coincide—
DATE_TOO_EARLY / DATE_TOO_LATEFecha fuera del rango permitidodate
NOT_ALLOWEDCampo que no se puede enviar—

Una regla no listada se expone con su nombre en mayúsculas (ACTIVE_URL). Las reglas propias implementan HasErrorCode para definir su código. Si una regla puede fallar por varios motivos (por ejemplo, NotWeakPassword), implementa HasErrorCodes: falla con el código como mensaje y declara todos los posibles, y el formateador usa el que corresponda.

Dónde está en el código