Saltearse al contenido

Rate limits

Darwin aplica rate limiting por tenant, distinguiendo entre llamadas read y llamadas write contra la API, y entre eventos de captura on-chain y entregas de webhooks. Esta página describe las cuotas por tier y el comportamiento esperado del cliente cuando se acerca al límite.

Los tiers actuales son los siguientes. Los números son representativos y se aplican por tenant, no por usuario.

TierRequests / minRequests / mesEventos de captura / mesWebhook deliveries / mes
Sandbox (evaluación)60100.0005.00025.000
Starter (producción inicial)3001.000.00050.000250.000
Growth (escala intermedia)1.50010.000.000500.0002.500.000
Scale (alto volumen)7.500100.000.0005.000.00025.000.000
EnterpriseCuotas a medidaCuotas a medidaCuotas a medidaCuotas a medida

Las llamadas write (eventos prepare, transferencias de custodia, recalls) consumen cuota tanto en requests como en la cuota específica de eventos de captura. Las llamadas read (consultas a NFTs, lineage, reportes) consumen solo la cuota de requests.

Cada respuesta de la API incluye headers con el estado actual de tu cuota:

HeaderSignificado
X-RateLimit-LimitCuota máxima de requests por minuto en tu tier
X-RateLimit-RemainingRequests restantes en la ventana actual
X-RateLimit-ResetTimestamp Unix en el que la ventana se reinicia
Retry-AfterCuando se devuelve 429, segundos a esperar antes de reintentar

Cuando un request supera el límite por minuto, la API responde con HTTP 429 Too Many Requests y un cuerpo JSON con el detalle del límite excedido:

{
"error": "rate_limit_exceeded",
"scope": "requests_per_minute",
"retryAfter": 12
}

El cliente debe:

  1. Leer Retry-After (segundos) o X-RateLimit-Reset (timestamp).
  2. Esperar al menos ese tiempo antes de reintentar.
  3. Aplicar backoff exponencial con jitter si los 429 persisten, para evitar thundering herd al expirar la ventana.

Las cuotas mensuales (requests, eventos de captura, webhook deliveries) se reinician al primer día UTC del mes calendario. Si una cuota mensual se agota, la API devuelve 429 con scope: "requests_per_month", scope: "events_per_month" o scope: "webhooks_per_month" según corresponda.

Las entregas salientes de webhooks no consumen tu cuota de requests inbound. Tienen su propia cuota mensual por tier (columna Webhook deliveries / mes arriba). Si tu endpoint receptor responde con 429, Tracium respeta el header Retry-After y reintenta dentro de la política de 3 reintentos con backoff exponencial.

El paso de Sandbox a Starter, de Starter a Growth, de Growth a Scale, o de cualquier tier a Enterprise se acuerda con el área comercial. Las cuotas Enterprise se escriben en el contrato y pueden incluir:

  • Burst rates más altos por minuto.
  • Cuotas mensuales sin tope o con tope acordado.
  • Prioridad en la cola de webhooks.
  • SLA de soporte y de disponibilidad.

Contactá al equipo en tech@darwinevolution.io con tu tier actual, tu uso proyectado y el horizonte temporal. Te respondemos con la cuota recomendada y los siguientes pasos.

  • Batch por idempotencia: Captia usa UUIDs idempotentes generados por el cliente. Reintentar un evento perdido no genera duplicados ni consume cuota adicional si el servidor ya lo procesó.
  • Caché en lectura: las consultas de inventario NFT, ancestry y reportes operacionales soportan caching agresivo del lado del cliente. La metadata canónica no cambia tras el anclaje on-chain.
  • GraphQL para queries compuestas: una sola query GraphQL bien formada consume un request en lugar de varios REST. Útil para dashboards.
  • Respeta Retry-After: nunca reintentes antes del valor indicado. Reintentos prematuros se cuentan contra tu cuota y prolongan la ventana de bloqueo.