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"
  }
}
CampoTipoDescripción
error.codestringCódigo numérico único (E1000–E1999). Úsalo para soporte técnico y manejo programático.
error.typestringCategoría del error (validation_error, not_found, conflict, etc.)
error.messagestringMensaje legible describiendo el problema.
error.fieldstring?Solo en errores de validación. Indica el campo del request que causó el error (ej. participants[0].email).

Idioma de los mensajes

La API habla inglés. Tu integración se apoya en el code; el texto es para que una persona entienda qué pasó.

QuéIdiomaCompromiso
error.code (v2) y code (v3)Identificador estableEs el contrato: no cambia. Programa tu manejo de errores contra él, nunca contra el texto.
error.message, hint, suggestion, upgrade_message (v2) y title, detail (v3)Inglés técnicoPuede mejorar de redacción sin aviso. No lo compares con cadenas fijas ni lo muestres tal cual a tus usuarios finales.
Mensajes de éxito (message en respuestas 200)Inglés técnicoInformativos. No dependas de su texto.
Textos que ve el firmante: iframe de firma embebida, correos y WhatsAppIdioma del firmante o de tu espacio de trabajoLa firma embebida se muestra en el idioma que pidas con locale en el SDK (0.3.1 o posterior); sin locale, en inglés si el idioma principal del navegador del firmante es inglés, y en español en cualquier otro caso.
Valores de estado (ESPERANDO_FIRMAS, WAITING FOR SIGNATURE, …)Tokens congeladosEn v2 conservan su forma actual para no romper integraciones. Ver la tabla de equivalencias v2 → v3.

Si necesitas mostrarle un error a tu usuario final, decide el texto en tu aplicación a partir del code (y de campos estructurados como field cuando vienen), en el idioma de tu producto.


Códigos de error (E1XXX)

Autenticación (E1000–E1099)

CódigoDescripción
E1000Falta el header Authorization
E1001Formato de API key inválido (debe ser Bearer allsign_live_sk_xxx)
E1002API key inválida o expirada (mismo código para ambos casos)
E1004Service key inválida

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 emitidoStatusDescripciónCampos extra
INSUFFICIENT_SCOPE403Scopes insuficientes para esta operaciónrequired_scopes, your_scopes, hint
TRIAL_FEATURE_RESTRICTED / DEV_FEATURE_RESTRICTED403Feature no disponible para tu plan / ambientefeature_requested, environment, allowed_features, upgrade_message, upgrade_url
INSUFFICIENT_DELEGATION_SCOPE403Scope de delegación faltante (app-mode keys)required_scopes
E1101403IP no permitida por las restricciones de la key—

Ejemplo de DEV_FEATURE_RESTRICTED: una key allsign_dev_sk_* pide una función que solo existe con keys live (aquí, firma con e.firma del SAT):

{
  "error": {
    "code": "DEV_FEATURE_RESTRICTED",
    "type": "permission_error",
    "message": "The feature 'fiel_sat' is not available with your current API key (environment: dev).",
    "feature_requested": "fiel_sat",
    "environment": "dev",
    "allowed_features": ["firma_autografa", "firma_simple", "embedded_signing"],
    "allowed_features_display": ["Firma Autógrafa (Wet Signature)", "Firma Simple (Click-to-sign)", "Embedded Signing Widget"],
    "upgrade_message": "This feature is only available with a production key (allsign_live_sk_…). Create a live key in your AllSign dashboard under Developers → API Keys.",
    "upgrade_url": "https://allsign.io/pricing",
    "documentation_url": "https://developers.allsign.io/environments"
  }
}

feature_requested y allowed_features son los códigos estables; allowed_features_display es el nombre comercial de cada función. Con una key trial (TRIAL_FEATURE_RESTRICTED), upgrade_message es "Subscribe to a plan to unlock every feature.".

Validación (E1200–E1299)

CódigoDescripción
E1200Error de validación general — campo con formato incorrecto. Revisa error.field y error.message.

Not Found (E1300–E1399)

CódigoDescripción
E1300Recurso no encontrado o no pertenece a tu cuenta

Pago / Créditos (E1400–E1499)

CódigoDescripción
E1400Créditos insuficientes. El mensaje incluye cuántos se requieren y cuántos tienes disponibles.

Rate Limiting (E1500–E1599)

error.code emitidoDescripción
RATE_LIMIT_EXCEEDEDExcediste el límite de peticiones de tu plan (per-tenant). El body va envuelto en error con limit, remaining, reset, retry_after, environment.

Conflicto (E1600–E1699)

CódigoDescripción
E1600Conflicto 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ódigoDescripción
E1700Petición inválida — lógica de negocio rechazada (ej. firmante no encontrado en documento, estado incompatible).
E1701Método HTTP no permitido en esa ruta (type: method_not_allowed, status 405). Antes salía como E1900.

Internal (E1900–E1999)

CódigoDescripción
E1900Error 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.code real es un string: INSUFFICIENT_SCOPE, TRIAL_FEATURE_RESTRICTED/DEV_FEATURE_RESTRICTED o INSUFFICIENT_DELEGATION_SCOPE (los E1100–E1103 son solo fallback por status).

  • Name
    404 Not Found
    Description

    El recurso no existe o no pertenece a tu cuenta. Código: E1300.

  • Name
    405 Method Not Allowed
    Description

    La ruta existe pero no acepta ese método (p. ej. PUT /v2/documents). Código: E1701, type: method_not_allowed.

  • 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.code real es RATE_LIMIT_EXCEEDED (el E1500 es solo fallback por status). La respuesta incluye el header Retry-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 trae errorCode: "WORKFLOW_TIMEOUT" y el workflowId (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. La redacción exacta del mensaje cambia según el endpoint, y algunos 402 traen además los campos required y available. No parsees el texto: usa el code y, si vienen, esos campos.

"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:

CapaQué revisaEjemplo 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:

  1. Verifica que el correo del participante esté escrito correctamente (sin typos)
  2. Confirma con el firmante que su dirección recibe correos externos
  3. Si el dominio es corporativo, puede requerir ser whitelisteado — usa WhatsApp como canal alternativo
  4. Dominios .xyz, .info o 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:

  1. El document_id sea un UUID válido
  2. El documento pertenezca al tenant de tu API key
  3. 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 (100 req/min en los planes de pago, 150 en Business). Algunos endpoints caros tienen además un límite propio. Consulta la página de Rate Limits para la tabla completa, los headers y el patrón de retry recomendado.

Si necesitas más capacidad, contáctanos para un plan personalizado.

Was this page helpful?