Límites de uso
La API cuenta los pedidos por minuto de cada token y de cada cuenta. Un sistema bien hecho no llega al tope; el límite está para frenar a uno que quedó en un bucle.
Los topes
| Se cuenta por | Tope | Para qué |
|---|---|---|
| Token | 120 pedidos por minuto | Que un sistema no se coma la cuota de los demás. |
| Cuenta | 600 pedidos por minuto, sumando todos sus tokens | Que crear más tokens no multiplique el límite. |
- La API y el servidor MCP comparten la cuenta de pedidos: el mismo token gasta de la misma cuota por los dos lados.
- La ventana es de un minuto de reloj. Cuando termina, el contador vuelve a cero.
- Los pedidos rechazados por el límite también cuentan: insistir sin esperar alarga el bloqueo.
Encabezados de cuota
Toda respuesta de la API y del MCP a un pedido con un token válido dice cuánto queda. No los traen el 401 de un token que no pasa, el 403 con el código no_activo de una cuenta que no está activa o no tiene la API, ni /v1/openapi.json, que se pide sin token:
| Encabezado | Qué dice |
|---|---|
RateLimit-Limit | El tope de la ventana: el del token o, si la cuenta está más cerca del suyo, el de la cuenta. |
RateLimit-Remaining | Cuántos pedidos quedan en esta ventana. |
RateLimit-Reset | En cuántos segundos vuelve a haber lugar. |
Retry-After | Solo en el 429: los segundos que hay que esperar antes de reintentar. |
Si el token y la cuenta están los dos cerca del tope, los encabezados muestran el más ajustado de los dos.
HTTP/1.1 200 OK
RateLimit-Limit: 120
RateLimit-Remaining: 117
RateLimit-Reset: 42
x-kaptativa-pedido: ped_3f9a1c0b7d2e4f6a8b1c2d3e4f5a6b7cCuando te pasás
La API responde 429 con el código limite y no ejecuta el pedido. El mensaje dice qué tope se pasó: el del token o el de la cuenta («La cuenta pasó los 600 pedidos por minuto entre todos sus tokens. Esperá un momento.»), y RateLimit-Limit trae ese tope.
HTTP/1.1 429 Too Many Requests
Retry-After: 18
RateLimit-Limit: 120
RateLimit-Remaining: 0
RateLimit-Reset: 18
{
"error": {
"codigo": "limite",
"mensaje": "Pasaste los 120 pedidos por minuto de este token. Esperá un momento.",
"pedido": "ped_5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d"
}
}Esperá los segundos de Retry-After y repetí. Si el pedido cambia algo, con la misma clave de idempotencia.
async function pedir(direccion, opciones) {
for (;;) {
const respuesta = await fetch(direccion, opciones);
if (respuesta.status !== 429) return respuesta;
const segundos = Number(respuesta.headers.get("retry-after")) || 5;
await new Promise((listo) => setTimeout(listo, segundos * 1000));
}
}Para no llegar al tope
- Pedí páginas grandes: con
limite=100una lista larga cuesta menos pedidos. Mirá Paginación. - No consultes cada tanto para ver si algo cambió: suscribite al evento con un webhook.
- Si corrés procesos en paralelo con el mismo token, mirá
RateLimit-Remainingy frená antes de llegar a cero. - Guardá de tu lado lo que no cambia seguido, como la lista de operaciones.
Los pedidos con un token que no existe, está revocado o venció también se cuentan, por dirección IP: después de 30 seguidos en un minuto, esa dirección queda frenada 60 segundos y recibe 429, con lo que falta en Retry-After. Los tokens que venían funcionando siguen pasando, y unos pocos pedidos por minuto se atienden igual para que un token que vale no quede afuera. En IPv6 se cuenta por red /64. Si te pasa, revisá el token antes de reintentar.
El cuerpo de un pedido puede pesar hasta 100 KB y cada cuenta puede tener hasta 20 tokens sin revocar.