Saltar al contenido principal

Errores y códigos

Todo error de la API v1 vuelve en el mismo envelope:

{
"message": "Valor original deve ser positivo",
"code": "VALIDATION_ERROR",
"details": { "...": "opcional; ex.: erros de validacao campo a campo" }
}

message es legible (y puede cambiar); code es estable — programa contra el código, no contra el mensaje. Trata cualquier código desconocido según el status HTTP.

Códigos por status HTTP

400 — solicitud inválida

CódigoCuándo
VALIDATION_ERRORBody o query inválidos; details trae los campos
INVALID_IDID fuera del formato UUID
INVALID_WEBHOOK_URLURL de webhook rechazada (no HTTPS o red interna)
INVALID_WEBHOOK_AUTHConfiguración de autenticación del webhook incompleta
SSRF_BLOCKEDLa URL resuelve hacia un destino bloqueado
INVALID_RECIPIENTDestinatario inválido para el canal de la notificación
INVALID_STATUS_FOR_RESENDNotificación en un estado que no permite reenvío
MISSING_CONTENT_PLACEHOLDERLayout de e-mail sin {{content}}
SELF_DEACTIVATION / SELF_ROLE_CHANGEIntento de desactivar la propia cuenta / cambiar el propio rol
EMAIL_EXISTSE-mail ya registrado

401 — no autenticado

CódigoCuándo
UNAUTHORIZEDClave ausente, inválida, revocada o expirada; sesión inválida

403 — sin permiso

CódigoCuándo
FORBIDDENEl actor no tiene el permiso requerido
API_KEY_FORBIDDENClave de API intentando un recurso administrativo o fuera del scope; required indica el permiso que faltó

404 — no encontrado

CódigoCuándo
NOT_FOUNDRecurso inexistente (o de otra organización)
PERSON_NOT_FOUND, CHARGE_NOT_FOUND, CLASSIFICATION_NOT_FOUND, COLLECTION_RULE_NOT_FOUND, STEP_NOT_FOUND, MESSAGE_TEMPLATE_NOT_FOUND, NOTIFICATION_NOT_FOUNDVariantes específicas cuando la ruta valida un vínculo

409 — conflicto de estado

CódigoCuándo
CONFLICT / DUPLICATEEl registro entra en conflicto con uno existente (documento, nombre...) o con el estado actual — ej.: aceptar un acuerdo que ya no está proposed (ya aceptado o aceptación concurrente)
USER_EXISTS / INVITATION_EXISTSInvitación a un e-mail ya usuario / ya invitado
LAST_ADMINDegradar o desactivar al último administrador
ROLE_IN_USE, RULE_IN_USE, STEP_IN_USE, WORKSPACE_IN_USE, COMPANY_IN_USE, HAS_BRANCHESEliminación bloqueada: el recurso está en uso
CHARGE_HAS_RELATED_RECORDSUn cobro con notificaciones/interacciones/negativaciones/protestos no puede eliminarse; details trae los conteos
ENDPOINT_INACTIVEReenvío de webhook a un endpoint inactivo
IDEMPOTENCY_KEY_REUSEDMisma X-Idempotency-Key con body distinto
IDEMPOTENCY_REQUEST_IN_PROGRESSSolicitud concurrente con la misma clave aún en curso
NOT_READYEl recurso todavía no está listo (ej.: exportación en procesamiento)

410, 413, 422

StatusCódigoCuándo
410EXPIREDRecurso expirado (ej.: descarga de exportación vencida)
413FILE_TOO_LARGEArchivo de importación por encima del límite
422DEFAULT_IMMUTABLEEl workspace principal / la empresa matriz no pueden eliminarse
422SYSTEM_ROLE_IMMUTABLELos roles de sistema no pueden editarse/eliminarse

429 y 500

StatusCódigoCuándo
429RATE_LIMITEDLímite de solicitudes de la clave excedido; reintenta con backoff (detalles)
500INTERNAL_ERRORFallo inesperado en el servidor; reintenta con la misma X-Idempotency-Key

Receta de manejo

  • 4xx excepto 409/429: error tuyo; corrige la solicitud antes de repetir.
  • 409: lee el código; casi siempre es una regla de negocio protegiendo el estado (no se resuelve con reintentos).
  • 429 y 5xx: reintenta con backoff exponencial y la misma clave de idempotencia — la idempotencia garantiza que nada se ejecuta dos veces.