Error: rate_limit_exceeded
Qué significa
Section titled “Qué significa”Tu aplicación envió demasiados requests en un corto periodo de tiempo y superó el límite asignado a tu API key o tenant.
Envelope de ejemplo
Section titled “Envelope de ejemplo”{ "error": { "type": "rate_limited", "code": "rate_limit_exceeded", "message": "Límite de requests excedido. Reintenta en 1 segundo.", "doc_url": "https://docs.emitia.co/errors/rate_limit_exceeded", "request_id": "req_01HX…" }}HTTP status: 429 Too Many Requests
Límites por defecto
Section titled “Límites por defecto”| Nivel | Límite |
|---|---|
| Por API key | 100 req/s, burst 200 |
| Por tenant (todas las keys) | 500 req/s |
Los límites son configurables por plan. Contacta soporte si necesitas límites más altos.
Headers de respuesta
Section titled “Headers de respuesta”La respuesta 429 incluye:
RateLimit-Limit: 100RateLimit-Remaining: 0RateLimit-Reset: 1716480601Retry-After: 1Retry-Afterindica los segundos a esperar antes del siguiente intento.
Cómo resolverlo
Section titled “Cómo resolverlo”- Lee el header
Retry-Aftery espera ese número de segundos. - Implementa backoff exponencial con jitter en tu cliente.
- Distribuye los requests en el tiempo si estás enviando lotes grandes.
async function retryWithBackoff<T>( fn: () => Promise<T>, maxRetries = 5,): Promise<T> { for (let i = 0; i < maxRetries; i++) { try { return await fn(); } catch (err: unknown) { const e = err as { status?: number; headers?: { get: (k: string) => string | null } }; if (e?.status === 429) { const retryAfter = parseInt(e.headers?.get('Retry-After') ?? '1', 10); const jitter = Math.random() * 500; // ms await new Promise((r) => setTimeout(r, (retryAfter * 1000) + jitter)); continue; } throw err; } } throw new Error('Max retries reached');}Ver también
Section titled “Ver también”- Conceptos: Idempotencia — retry seguro con Idempotency-Key