Modelo de rate limiting
Cada tier tiene un RPM (requests per minute) sostenido y una capacidad de burst que permite picos cortos. El RPM se mide en ventana móvil de 60 s; el burst se permite hasta 5 minutos por hora consecutivos. Pasados esos 5 min, las requests por encima del sostenido devuelven 429.
Límites por tier
| Tier | RPM sostenido | Burst | Sublímites por servicio |
|---|---|---|---|
| Async | — (queue de jobs) | — | Solo LLM + embeddings; sin Whisper/TTS |
| Lite (450 €/mes) | 50 | 100 (5 min/h) | Embeddings 100 RPM · Whisper 10 RPM · TTS 10 RPM |
| Pro (650 €/mes) | 200 | 400 (5 min/h) | Embeddings 400 RPM · Whisper 30 RPM · TTS 30 RPM |
| Scale | 500 | 700 (5 min/h) | Sin sublímites — bundle completo |
| Enterprise | 5 000+ | Negociable según hardware | Sin sublímites |
Headers de respuesta
Cada respuesta de la API incluye headers para que el cliente conozca su estado de cuota sin esperar a un 429.
| Header | Significado |
|---|---|
| `X-RateLimit-Limit-Requests` | Tu RPM sostenido para este endpoint |
| `X-RateLimit-Remaining-Requests` | Requests disponibles en la ventana actual |
| `X-RateLimit-Reset-Requests` | Segundos hasta que se restaure la cuota |
| `Retry-After` (solo en 429) | Segundos a esperar antes de reintentar |
Manejo de 429
Cuando recibes un 429, la respuesta incluye el header `Retry-After`. Espera al menos ese tiempo antes de reintentar. Recomendación de backoff exponencial con jitter:
Backoff exponencial con jitter
import time, random
def call_with_retry(fn, max_retries=5):
for attempt in range(max_retries):
try:
return fn()
except RateLimitError as e:
if attempt == max_retries - 1:
raise
delay = max(
int(e.response.headers.get("Retry-After", "1")),
(2 ** attempt) + random.random()
)
time.sleep(delay)Subir o bajar de tier
- Upgrades son inmediatos (toma efecto en <60 s después de confirmación). El RPM sube en la siguiente ventana.
- Downgrades aplican al ciclo de facturación siguiente para evitar cortes a mitad de mes.
- Para upgrades temporales (campaña, evento), pide a soporte una "ventana de burst extendida" en lugar de cambiar de tier.