Errores de la API v3

Toda respuesta no-2xx es un documento RFC 9457 application/problem+json. Los clientes programan contra code (estable, append-only), nunca contra detail (inglés técnico, puede cambiar).

Estructura del error

Shape plano (sin envoltorio): 5 miembros core de RFC 9457 + extensiones de AllSign.

{
  "type": "https://developers.allsign.io/errors#DOCUMENT_NOT_FOUND",
  "title": "Document not found",
  "status": 404,
  "detail": "No document exists with id doc_...",
  "instance": "/v3/documents/doc_...",
  "code": "DOCUMENT_NOT_FOUND",
  "requestId": "req_...",
  "errors": []
}

Extensiones por código

Algunos códigos agregan campos: DOCUMENT_NOT_SENDABLE trae reason; PERMISSION_DENIED trae requiredScope y yourScopes; RATE_LIMITED viaja con el header Retry-After. Cada type enlaza al ancla de su código en esta página.

Errores a nivel de campo

La validación semántica (422 VALIDATION_ERROR) puebla errors[] con un objeto por campo: field (dot/bracket), pointer (JSON Pointer), code y detail.

"errors": [
  { "field": "signers[0].email", "pointer": "/signers/0/email",
    "code": "invalid_email", "detail": "not a valid email address" }
]

Catálogo de códigos

La taxonomía completa: 62 códigos, congelada y append-only. Cada fila tiene id="<CODE>" para que el type URI ancle aquí.

Activo significa que la API lo emite hoy. Reservado (18 de 62) significa que el código forma parte del contrato pero ninguna ruta lo devuelve todavía: o el caso lo cubre otro código (un JSON malformado sale como VALIDATION_ERROR, no como MALFORMED_JSON), o espera una capacidad que aún no lanzamos (los TOKEN_* esperan OAuth), o la política de seguridad lo colapsa a propósito (cruzar de ambiente responde 404, no ENVIRONMENT_MISMATCH, para no confirmar que el recurso existe).

No programes una rama para un código reservado — sería código muerto. Un reservado nunca cambia de nombre ni de significado al activarse, así que agregarlo después es seguro; anticiparlo, no.

CódigoStatusTítuloEstado
API_KEY_EXPIRED 401 Unauthorized Activo
API_KEY_INVALID 401 Unauthorized Reservado
API_KEY_REVOKED 401 Unauthorized Reservado
AUTHENTICATION_REQUIRED 401 Authentication required Activo
BATCH_NOT_FOUND 404 Bulk-send batch not found Activo
CONSTANCIA_NOT_FOUND 404 Constancia not found Activo
CONTRACT_REQUIRED 403 NOM-151 contract required Activo
DEV_FEATURE_RESTRICTED 403 Feature restricted in this environment Activo
DOCUMENT_ALREADY_SIGNED 409 Document already signed Activo
DOCUMENT_ALREADY_VOIDED 409 Conflict Reservado
DOCUMENT_CONFLICT 409 Document conflict Activo
DOCUMENT_HAS_NO_FIELDS 422 Unprocessable Entity Reservado
DOCUMENT_NOT_FOUND 404 Document not found Activo
DOCUMENT_NOT_SENDABLE 409 Document not sendable Activo
DOCUMENT_TOO_LARGE 413 Document too large Activo
DUPLICATE_SIGNER 422 Unprocessable Entity Reservado
ENVIRONMENT_MISMATCH 403 Forbidden Reservado
EVENT_NOT_FOUND 404 Not Found Reservado
EXPAND_DEPTH_EXCEEDED 400 Expand depth exceeded Activo
EXTERNAL_ID_CONFLICT 409 External id already used Activo
FOLDER_NOT_EMPTY 409 Conflict Activo
FOLDER_NOT_FOUND 404 Folder not found Activo
IDEMPOTENCY_KEY_IN_PROGRESS 409 Idempotency key in progress Activo
IDEMPOTENCY_KEY_INVALID 400 Idempotency key invalid Activo
IDEMPOTENCY_KEY_REQUIRED 400 Idempotency key required Activo
IDEMPOTENCY_KEY_REUSED 409 Idempotency key reused Activo
INSUFFICIENT_CREDITS 402 Insufficient credits Activo
INSUFFICIENT_SCOPE 403 Forbidden Activo
INTERNAL_ERROR 500 Internal server error Activo
INVALID_CURSOR 400 Invalid cursor Activo
INVALID_EXPAND 400 Invalid expand path Activo
INVALID_FILTER 400 Bad Request Reservado
INVALID_ID 400 Malformed identifier Activo
INVALID_SORT 400 Bad Request Reservado
INVALID_STATE_TRANSITION 409 Conflict Activo
IP_NOT_ALLOWED 403 IP address not allowed Activo
LIMIT_OUT_OF_RANGE 400 Bad Request Reservado
MALFORMED_JSON 400 Bad Request Reservado
METHOD_NOT_ALLOWED 405 Method Not Allowed Activo
NOT_ACCEPTABLE 406 Not Acceptable Activo
OAUTH_NOT_ENABLED 401 Unauthorized Reservado
OAUTH_NOT_IMPLEMENTED 501 Not Implemented Activo
PAYLOAD_TOO_LARGE 413 Request Entity Too Large Reservado
PERMISSION_DENIED 403 Permission denied Activo
QUOTA_EXCEEDED 429 Too Many Requests Reservado
RATE_LIMITED 429 Rate limited Activo
RESOURCE_NOT_FOUND 404 Resource not found Activo
SEGURIDATA_UNAVAILABLE 503 Constancia provider unavailable Activo
SERVICE_UNAVAILABLE 503 Service Unavailable Activo
SIGNER_INVALID 422 Unprocessable Entity Reservado
SIGNER_NOT_FOUND 404 Not Found Activo
TEMPLATE_NOT_FOUND 404 Template not found Activo
TOKEN_AUDIENCE_MISMATCH 403 Forbidden Reservado
TOKEN_EXPIRED 401 Unauthorized Reservado
TOKEN_INVALID 401 Unauthorized Reservado
UNKNOWN_EVENT_TYPE 422 Unknown event type Activo
UNSUPPORTED_API_VERSION 400 Unsupported API version Activo
UNSUPPORTED_MEDIA_TYPE 415 Unsupported Media Type Activo
VALIDATION_ERROR 422 Validation failed Activo
WEBHOOK_LIMIT_EXCEEDED 409 Conflict Activo
WEBHOOK_NOT_FOUND 404 Webhook endpoint not found Activo
WEBHOOK_URL_INVALID 422 Webhook URL invalid Activo

Correlación con AllSign-Request-Id

Cada respuesta trae el header AllSign-Request-Id: req_… y lo repite en requestId dentro del cuerpo del error. Cítalo al reportar un problema — es la llave para rastrear la petición en nuestros logs.