Errores
Cuando una petición a la API falla, recibirás un código HTTP que indica qué salió mal. Todos los errores v2 usan un formato estandarizado con códigos numéricos para soporte técnico.
Formato de respuesta de error
Todos los errores de la API v2 devuelven un JSON con esta estructura:
{
"error": {
"code": "E1200",
"type": "validation_error",
"message": "Invalid email format: 'correo-sin-arroba'",
"field": "participants[0].email"
}
}
| Campo | Tipo | Descripción |
|---|---|---|
error.code | string | Código numérico único (E1000–E1999). Úsalo para soporte técnico y manejo programático. |
error.type | string | Categoría del error (validation_error, not_found, conflict, etc.) |
error.message | string | Mensaje legible describiendo el problema. |
error.field | string? | Solo en errores de validación. Indica el campo del request que causó el error (ej. participants[0].email). |
El campo field usa dot-notation con índices de array. Ejemplo: participants[0].email indica el email del primer participante.
Códigos de error (E1XXX)
Autenticación (E1000–E1099)
| Código | Descripción |
|---|---|
E1000 | Falta el header Authorization |
E1001 | Formato de API key inválido (debe ser Bearer allsign_live_sk_xxx) |
E1002 | API key inválida o expirada (mismo código para ambos casos) |
E1004 | Service key inválida |
Una API key expirada devuelve el mismo E1002 que una inválida. Si el usuario asociado a una X-Service-Key no existe, la respuesta es 404 con código E1300 (no un código de autenticación dedicado).
Permisos (E1100–E1199)
Los errores de permisos emiten un código string descriptivo, no el numérico. Los E11XX son solo fallbacks por status code y rara vez aparecen en el wire.
error.code emitido | Status | Descripción | Campos extra |
|---|---|---|---|
INSUFFICIENT_SCOPE | 403 | Scopes insuficientes para esta operación | required_scopes, your_scopes, hint |
TRIAL_FEATURE_RESTRICTED / DEV_FEATURE_RESTRICTED | 403 | Feature no disponible para tu plan / ambiente | upgrade_message |
INSUFFICIENT_DELEGATION_SCOPE | 403 | Scope de delegación faltante (app-mode keys) | required_scopes |
E1101 | 403 | IP no permitida por las restricciones de la key | — |
Los numéricos E1100, E1102 y E1103 existen como fallback por status, pero el handler usa el error.code explícito cuando lo hay — para estos casos casi siempre verás los strings de arriba.
Validación (E1200–E1299)
| Código | Descripción |
|---|---|
E1200 | Error de validación general — campo con formato incorrecto. Revisa error.field y error.message. |
El error de entregabilidad de email (uno o más correos de participantes no pueden recibir mensajes) no usa un código numérico. Devuelve error.code = "EMAIL_VALIDATION_FAILED" (string) con error.type = "validation_error" y status 422. El campo error.details lista cada correo con el motivo específico.
Not Found (E1300–E1399)
| Código | Descripción |
|---|---|
E1300 | Recurso no encontrado o no pertenece a tu cuenta |
Pago / Créditos (E1400–E1499)
| Código | Descripción |
|---|---|
E1400 | Créditos insuficientes. El mensaje incluye cuántos se requieren y cuántos tienes disponibles. |
Rate Limiting (E1500–E1599)
error.code emitido | Descripción |
|---|---|
RATE_LIMIT_EXCEEDED | Excediste el límite de peticiones de tu plan (per-tenant). El body va envuelto en error con limit, remaining, reset, retry_after, environment. |
Existe un segundo 429 (límite por endpoint, p.ej. bulk invitations) con un body distinto: {"error":"Rate limit exceeded","message":...,"retry_after":...} sin campo code. El numérico E1500 es solo fallback por status y no se emite para ninguno de los dos 429 reales. Detalle en la página de Rate Limits.
Conflicto (E1600–E1699)
| Código | Descripción |
|---|---|
E1600 | Conflicto de estado — el recurso ya fue modificado, completado, anulado, o está en un estado que no permite la operación. |
Bad Request (E1700–E1799)
| Código | Descripción |
|---|---|
E1700 | Petición inválida — lógica de negocio rechazada (ej. firmante no encontrado en documento, estado incompatible). |
Internal (E1900–E1999)
| Código | Descripción |
|---|---|
E1900 | Error interno del servidor. Si persiste, contacta soporte con el código. |
Códigos de estado HTTP
- Name
400 Bad Request- Description
Los datos que enviaste no son válidos o la lógica de negocio los rechaza. Código:
E1700.
- Name
401 Unauthorized- Description
No se reconoce tu API key. Verifica el header
Authorization: Bearer allsign_live_sk_xxx. Códigos:E1000–E1004.
- Name
402 Payment Required- Description
Créditos insuficientes para la operación. Código:
E1400.
- Name
403 Forbidden- Description
Tu API key no tiene permisos para esta acción. El
error.codereal es un string:INSUFFICIENT_SCOPE,TRIAL_FEATURE_RESTRICTED/DEV_FEATURE_RESTRICTEDoINSUFFICIENT_DELEGATION_SCOPE(losE1100–E1103son solo fallback por status).
- Name
404 Not Found- Description
El recurso no existe o no pertenece a tu cuenta. Código:
E1300.
- Name
409 Conflict- Description
El recurso está en un estado incompatible. Código:
E1600.
- Name
422 Unprocessable Entity- Description
Datos con formato incorrecto o validación fallida. Códigos:
E1200(formato),EMAIL_VALIDATION_FAILED(email no entregable).
- Name
429 Too Many Requests- Description
Rate limit excedido. El
error.codereal esRATE_LIMIT_EXCEEDED(elE1500es solo fallback por status). La respuesta incluye el headerRetry-After.
- Name
500 Internal Server Error- Description
Error interno. Código:
E1900. Si persiste, contacta soporte.
- Name
504 Gateway Timeout- Description
Solo en la creación de documentos con
mode=sync: el procesamiento excedió el límite del servidor (~10 min). El workflow sigue corriendo en segundo plano — el payload traeerrorCode: "WORKFLOW_TIMEOUT"y elworkflowId(en ambas convenciones) para rastrearlo por SSE. No reenvíes el create a ciegas. Ver Create document.
Errores comunes y soluciones
"API key no válida" (E1001 / E1002)
# ❌ Incorrecto — falta el prefijo Bearer
curl -H "Authorization: allsign_live_sk_xxx" ...
# ✅ Correcto
curl -H "Authorization: Bearer allsign_live_sk_xxx" ...
"Scope insuficiente" (INSUFFICIENT_SCOPE)
Tu API key necesita el scope correcto para la operación. Por ejemplo, crear documentos requiere document:write. El error 403 incluye error.required_scopes, error.your_scopes y error.hint para que sepas exactamente qué añadir. Genera una nueva key con los scopes necesarios en el Dashboard.
"Créditos insuficientes" (E1400)
{
"error": {
"code": "E1400",
"type": "payment_required",
"message": "Insufficient credits. Required: 3, Available: 1"
}
}
Agrega créditos desde el Dashboard antes de reintentar.
"Email de participante no entregable" (EMAIL_VALIDATION_FAILED)
Ocurre cuando uno o más correos en el array participants no pueden recibir mensajes (mailbox inválido, dominio sin MX records, etc.). La validación sucede antes de crear el documento — no habrá registros huérfanos.
AllSign valida emails en dos capas:
| Capa | Qué revisa | Ejemplo de error |
|---|---|---|
| Formato (instantánea) | Que el email tenga @, dominio válido, sin espacios | "soyisraelortiz.com" — falta @ |
| Entregabilidad (SendGrid) | Que el buzón exista, dominio tenga MX records, no sea desechable | "israel@gmail.con" — dominio sin MX records |
Solo los emails con veredicto Invalid son rechazados. Los emails Risky (sospechosos pero posiblemente válidos) se envían con una advertencia interna.
Respuesta de error de formato (HTTP 422):
Los errores de formato (Pydantic) devuelven un único error con el envelope estándar { "error": { ... } } — solo el primer campo inválido, sin array:
{
"error": {
"code": "E1200",
"type": "validation_error",
"message": "Invalid email format: 'soyisraelortiz.com'. Expected format: user@example.com",
"field": "participants[0].email"
}
}
Para errores de entregabilidad (dominio inválido, buzón inexistente), error.details lista cada correo rechazado:
{
"error": {
"code": "EMAIL_VALIDATION_FAILED",
"type": "validation_error",
"message": "One or more signer email addresses are not valid.",
"details": [
{
"email": "israel@gmail.con",
"reason": "domain cannot receive email (no MX records)",
"suggestion": "Did you mean israel@gmail.com?"
}
]
}
}
Cómo manejar el error en tu código:
try {
const response = await fetch('/v2/documents', { ... });
const data = await response.json();
if (response.status === 422) {
const err = data.error;
// Errores de entregabilidad (SendGrid): error.details lista cada correo
if (err.code === 'EMAIL_VALIDATION_FAILED' && err.details) {
err.details.forEach(d => {
const msg = d.suggestion
? `${d.reason} ${d.suggestion}`
: d.reason;
showFieldError(d.email, msg);
});
return;
}
// Errores de formato (Pydantic): un solo campo en error.field
if (err.field) {
showFieldError(err.field, err.message);
return;
}
// Error genérico de validación
showError(err.message);
}
} catch (error) {
showError('Error de conexión');
}
Cómo resolverlo:
- Verifica que el correo del participante esté escrito correctamente (sin typos)
- Confirma con el firmante que su dirección recibe correos externos
- Si el dominio es corporativo, puede requerir ser whitelisteado — usa WhatsApp como canal alternativo
- Dominios
.xyz,.infoo genéricos a menudo tienen filtros estrictos — solicita un correo personal de respaldo
Recomendación UX: Valida el formato del email en tu formulario antes de enviar a la API. Usa un regex como ^[^\s@]+@[^\s@]+\.[^\s@]+$ para atrapar errores obvios y dar retroalimentación instantánea al usuario.
"Documento no encontrado" (E1300)
Verifica que:
- El
document_idsea un UUID válido - El documento pertenezca al tenant de tu API key
- El documento no haya sido eliminado
Rate limiting (RATE_LIMIT_EXCEEDED)
El límite de peticiones está determinado por tu plan de suscripción activo. El default es 100 req/min. Consulta la página de Rate Limits para ver los headers y el patrón de retry recomendado.
Si necesitas más capacidad, contáctanos para un plan personalizado.

