Rate Limits

Cada respuesta de la API v2 incluye tres headers que te dicen cuántas llamadas te quedan antes de alcanzar tu límite. No tienes que esperar un error para saberlo.


Headers en cada respuesta

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1745018460
HeaderTipoDescripción
X-RateLimit-LimitintegerMáximo de requests permitidos por minuto para tu API key.
X-RateLimit-RemainingintegerRequests que te quedan en la ventana actual.
X-RateLimit-ResetintegerUnix timestamp (segundos) en que la ventana se reinicia.
X-RateLimit-ReasonstringSolo en 429: razón del límite alcanzado (ver tabla abajo).

Headers de diagnóstico

Además de los headers de rate limit, cada respuesta de la API v2 incluye dos headers de diagnóstico útiles para depuración:

X-Allsign-Request-Id: req_4a3f2b1c8e7d6f5a
X-Allsign-Environment: dev
HeaderDescripción
X-Allsign-Request-IdID único del request, generado por el servidor. Empieza con req_. Inclúyelo al reportar un problema al soporte.
X-Allsign-EnvironmentAmbiente de tu API key (dev, test, live). Solo aparece en requests autenticados con una API key v2.

Scopes en cada respuesta

Cada respuesta de la API v2 incluye dos headers que muestran los permisos del request — incluso en respuestas exitosas y en errores 403:

X-Accepted-Scopes: document:write, document:*
X-Your-Scopes: document:read, analytics:read
HeaderDescripción
X-Accepted-ScopesLos scopes que el endpoint acepta. Aparece en todas las respuestas del endpoint, incluyendo 403.
X-Your-ScopesLos scopes que tiene tu API key. Aparece en cualquier request autenticado.

El caso de uso clave es el debugging de permisos. Cuando recibes un 403, no tienes que leer el body del error — los headers te dicen exactamente qué scope necesitas añadir:

# Respuesta 403
HTTP/1.1 403 Forbidden
X-Accepted-Scopes: document:write, document:*
X-Your-Scopes: document:read

# → Necesitas añadir document:write a tu API key

Esto es especialmente útil en herramientas como Postman o en logs de un SDK — ves el problema en la vista de headers sin tener que parsear JSON.


Límites por ambiente

El límite viene de tu plan de suscripción activo y aplica igual para todos los ambientes (dev, test, live) del mismo tenant.

PlanLímite
Sin plan activo10 req/min
Freemium10 req/min
Esencial100 req/min
Colabora100 req/min
Conecta100 req/min
Business150 req/min

Si tu suscripción tiene un api_rpm_override acordado con nosotros, ese valor gana sobre el del plan.


Límites por endpoint

Algunos endpoints tienen un límite propio además del de tu plan, porque cada llamada cuesta bastante más que una request normal. Se cuentan por separado: consumir el de un endpoint no gasta el presupuesto de otro ni el de tu plan.

EndpointLímitePor qué
POST /v2/documents/{id}/invite-bulk10/minCada llamada se abre en un envío por participante.
POST /v3/constancias20/minCada llamada es una emisión facturada ante el PSC.
POST /v3/devassist/chat10/minCada turno dispara una llamada a un modelo de lenguaje.

El resto de los endpoints no tiene un límite propio por debajo del de tu plan: si tu plan dice 100 req/min, puedes crear documentos e invitar firmantes hasta ese número.

Un 429 de este tipo trae X-RateLimit-Reason: endpoint. Distínguelo del de tu plan (per-tenant) antes de asumir que necesitas otro paquete: si el header dice endpoint, subir de plan no lo resuelve.


Qué hacer con un 429

Cuando superas el límite recibirás un 429 Too Many Requests. El cuerpo incluye toda la información necesaria para hacer retry de forma inteligente:

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "type": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Limit: 100 req/min.",
    "limit": 100,
    "remaining": 0,
    "reset": 1745018460,
    "retry_after": 23,
    "environment": "live"
  }
}

El header Retry-After también viene en la respuesta con el mismo valor en segundos:

Retry-After: 23

Patrón recomendado de retry

async function callWithRetry(fn: () => Promise<Response>): Promise<Response> {
  const resp = await fn()

  if (resp.status === 429) {
    const retryAfter = parseInt(resp.headers.get('Retry-After') ?? '60', 10)
    await new Promise(resolve => setTimeout(resolve, retryAfter * 1000))
    return fn() // un solo retry
  }

  return resp
}

Para integraciones de alto volumen, implementa exponential backoff con jitter en lugar de un retry único.

Campos del error 429

Todos los campos van anidados bajo error (envelope estándar de la API v2):

CampoTipoDescripción
error.codestringSiempre RATE_LIMIT_EXCEEDED.
error.typestringSiempre rate_limit_exceeded.
error.limitintegerLímite de tu key.
error.remainingintegerSiempre 0 en un 429.
error.resetintegerUnix timestamp de reinicio de ventana.
error.retry_afterintegerSegundos hasta que puedes reintentar.
error.environmentstringAmbiente de la key (dev, test, live).

X-RateLimit-Reason

El header X-RateLimit-Reason indica qué tipo de límite fue el que se superó:

ValorDescripción
per-tenantLímite determinado por tu plan de suscripción. El más común.
endpointLímite propio de ese endpoint — ver Límites por endpoint. Subir de plan NO lo cambia.
daily-ipLímite diario por IP para requests sin API key válida.

Embedded Signing

Los endpoints de Embedded Signing tienen límites adicionales independientes del límite global. Cuando los excedes recibirás también headers específicos:

X-Embedded-RateLimit-Limit-Minute: 30
X-Embedded-RateLimit-Remaining-Minute: 0
X-Embedded-RateLimit-Reset-Minute: 1745018460
X-Embedded-RateLimit-Limit-Day: 1000
X-Embedded-RateLimit-Remaining-Day: 847
X-Embedded-RateLimit-Reset-Day: 1745104860

Los error_code para estos 429 son EMBEDDED_RATE_LIMIT_MINUTE y EMBEDDED_RATE_LIMIT_DAY. Consulta la guía de Embedded Signing para más detalle.

Was this page helpful?