spicyapiDocumentación
Referencia
Contenido principal

Límites de solicitudes

Cómo funcionan los límites de lectura y escritura, qué consume cada uno, qué otros límites puedes alcanzar y por qué la concurrencia es independiente.

Un límite de solicitudes restringe cuántas solicitudes puedes enviar en un período breve. Si lo superas, la API responde 429 («demasiadas solicitudes») en lugar de ejecutar el trabajo e indica cuánto debes esperar. Es una protección contra scripts descontrolados, no una cuota sobre cuánto contenido puedes generar.

Resumen de límites

LímiteValor predeterminadoQué recibes al alcanzarloDetalles
Solicitudes por cuenta1,000 cada 10 segundos para lecturas y otras tantas para escrituras429 con Retry-AfterMás abajo
Solicitudes de URL de subida1,000 cada 10 segundos429 con Retry-AfterMás abajo
URL de subida solicitadas pero aún no utilizadas128 archivos o 1 GiB429; esperar no ayudaMás abajo
Informe de uso30 por minuto; intervalo de 92 días429 / 400Más abajo, Facturación
Saldo disponible—40201Facturación
Límites de gasto de una clave (diario / mensual / total)Ninguno salvo que lo configures40202Facturación
Límites diarios / mensuales del equipoNinguno40202Facturación
Equipos de tu propiedad / miembros por equipo10 / 100409 en la consolaConsola y equipos

Dos grupos de capacidad por cuenta: lecturas y escrituras

La API —todo lo incluido en /api/v1/* y los endpoints compatibles de /v1/* y /v1beta/*— limita las solicitudes por cuenta, no por clave: si el límite fuera por clave, bastaría con crear más claves para eludirlo.

Las lecturas y escrituras se contabilizan en dos grupos de capacidad separados, con el mismo límite. El umbral de protección predeterminado es de 1,000 solicitudes cada 10 segundos en cada uno: unas 100 RPS sostenidas (solicitudes por segundo), con una ráfaga de 1,000. Es una protección general contra el abuso y los clientes descontrolados, no una cuota reducida para el tráfico normal de generación de pago.

Se utiliza un mecanismo de token bucket en lugar de un contador con ventanas fijas: tiene capacidad para 1,000 tokens y se repone a lo largo de 10 segundos, aproximadamente 100 tokens por segundo. Cada solicitud consume un token y estos se recuperan de forma continua. A diferencia de una ventana fija, este mecanismo evita un salto brusco de capacidad al cambiar de período.

Las lecturas y escrituras consumen capacidades independientes

Las lecturas incluyen todas las solicitudes GET —recordInfo, la lista jobs, chat/credit, usage, models— y jobs/quote, que solo calcula el precio. Las escrituras incluyen todo lo demás: createTask, retry, stream, purge, common/upload-url, common/download-url y los endpoints compatibles chat/completions, messages y de generación Gemini. Los endpoints nativos y compatibles comparten los mismos dos grupos de capacidad, así que cambiar una integración de texto de /api/v1 a /v1 no añade otro límite disponible.

Las consultas de estado ya no pueden agotar la capacidad destinada a enviar tareas. Un bucle descontrolado de consultas solo agota la capacidad de lectura: recordInfo empieza a devolver 429, mientras que createTask sigue aceptando solicitudes. Las consultas siguen consumiendo solicitudes, así que las integraciones de producción deberían preferir webhooks para reducir llamadas innecesarias y latencia.

El catálogo de modelos consume capacidad de lectura. No descargues un esquema que no cambió antes de cada tarea: guárdalo en caché según su fecha de actualización y renuévalo después de fallos de validación.

upload-url tiene su propia protección general de 1,000 solicitudes cada 10 segundos, además del límite de escritura anterior. Protege por separado la autorización de escritura en el almacenamiento de objetos; las subidas normales no deberían acercarse a ella.

usage tiene una protección adicional mucho más estricta: 30 solicitudes por minuto, además del límite de lectura anterior. Como agrega tareas históricas, cada llamada requiere mucho más trabajo que una lectura normal y la protección general no basta. Úsalo para conciliar el uso, no como endpoint de consultas continuas. Este límite tampoco permite pasar el tráfico cuando no puede decidir: siempre devuelve 429 si el sistema de límites no está disponible, mientras que otros grupos pueden configurarse para permitirlo.

URL de subida que todavía no utilizaste

Por separado, una cuenta puede mantener como máximo 128 URL de subida aún no utilizadas, o 1 GiB de tamaño declarado de archivos entre todas ellas. Solicitar otra devuelve 429 con Too many pending uploads; finish existing uploads before requesting more y sin Retry-After.

Esperar no ayuda en este caso, así que no dejes que un bucle de reintentos genérico lo intente indefinidamente. Sube y confirma los archivos para los que ya solicitaste una URL, o deja que sus URL venzan, lo que tarda unos 20 minutos; al hacerlo, se libera la capacidad inmediatamente. Este error suele indicar que un script solicita URL de subida en lote y después no las utiliza. Consulta Medios.

Todos los grupos de capacidad

Los límites se aplican por grupo de endpoints, de modo que todos los endpoints de un mismo grupo comparten una cadena de middleware. Como consumidor de la API, puedes encontrarte con los primeros cinco:

GrupoQué cubreCómo se contabilizaCapacidad predeterminada
RedTodas las solicitudes de API, antes de comprobar la claveDirección IP de origen (en IPv6, su red /64)6,000 por minuto, muy por encima del uso normal; varias personas de una misma red empresarial lo comparten
open_apiEscrituras en /api/v1/*, /v1/* y /v1beta/* (todos los métodos salvo GET/HEAD, con la excepción de jobs/quote)Cuenta1,000 cada 10 segundos (unas 100 RPS sostenidas)
open_api_readLecturas en las mismas rutas: GET/HEAD (incluido el catálogo models) y jobs/quoteCuenta1,000 cada 10 segundos (unas 100 RPS sostenidas)
upload_url/api/v1/common/upload-urlCuenta1,000 cada 10 segundos (además de open_api)
api_usage/api/v1/usageCuenta30 por minuto (además de open_api_read)
ConsolaEndpoints autenticados de /console/v1/*Cuenta120 por minuto para lecturas y otras tantas para escrituras
catalogCatálogo público y anónimo utilizado por el sitio comercial (no /api/v1/models)IP de origen300 por minuto

Por cuenta, no por clave

open_api y open_api_read se contabilizan para la cuenta. Crear más claves no aumenta la capacidad: si el límite fuera por clave, bastaría un clic en la consola para eludirlo.

En cambio, upload_url y api_usage sí son grupos independientes: subir una imagen de referencia consume un token de open_api y otro de upload_url; una lectura de usage consume uno de open_api_read y otro de api_usage. Agotar cualquiera de los dos devuelve 429.

Estas cifras son valores predeterminados que podemos cambiar sin publicar una versión nueva. Tu capacidad actual siempre aparece en el encabezado X-RateLimit-Limit y en Resumen de la consola. Confía en el encabezado y no fijes los valores predeterminados en el código del cliente.

Encabezados de respuesta

EncabezadoCuándo apareceSignificado
X-RateLimit-LimitEn todas las respuestasCapacidad del período actual
X-RateLimit-RemainingEn todas las respuestasTokens restantes
Retry-AfterEn un 429 debido a un límite de solicitudesSegundos que debes esperar, con un mínimo de 1

Una respuesta normal de una cuenta con la capacidad predeterminada incluye:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 997

X-RateLimit-Remaining también se envía en las respuestas correctas, para que puedas reducir el ritmo antes de recibir un 429.

En un 401, estos encabezados describen el límite de red (6000), no el de tu cuenta, porque no se identificó la clave.

Cómo se presenta un límite

{
  "code": 429,
  "msg": "Too many requests. Retry in a moment",
  "request_id": "req_…"
}

Estado HTTP 429, con Retry-After.

Las solicitudes que superan el límite se rechazan; no entran en cola

Se devuelven inmediatamente. Ponerlas en cola solo acumularía latencia y dejaría una conexión que nunca responde, más difícil de gestionar que un 429 claro. Una solicitud rechazada nunca se aceptó, por lo que no cuesta nada.

Cómo gestionarlo

Lee Retry-After. No envíes solicitudes insistentemente a un intervalo fijo. Los ejemplos se detienen después de cinco intentos, lo que también impide que el 429 de «subidas pendientes» descrito anteriormente provoque un bucle infinito.

JavaScript
async function callRespectingLimits(url, init) {
  for (let i = 0; i < 5; i++) {
    const res = await fetch(url, init);

    if (res.status !== 429) return res;

    // The server already told you how long to wait; don't guess
    const wait = Number(res.headers.get('retry-after') ?? 1);
    await new Promise((r) => setTimeout(r, wait * 1000));
  }
  throw new Error('persistently rate-limited');
}
Python
import time, requests


def call_respecting_limits(method: str, url: str, **kwargs) -> requests.Response:
    for _ in range(5):
        res = requests.request(method, url, **kwargs)

        if res.status_code != 429:
            return res

        # The server already told you how long to wait; don't guess
        time.sleep(float(res.headers.get("retry-after", 1)))

    raise RuntimeError("persistently rate-limited")

La concurrencia es una cuestión independiente

El límite controla la frecuencia de envío, no cuántas tareas se ejecutan

Una vez aceptada en la cola, una tarea deja de consumir capacidad del límite de solicitudes. Tener cien tareas generándose simultáneamente no provoca un 429.

Lo que realmente limita las tareas en curso, sin que ninguno de estos factores sea el límite de solicitudes:

  • Saldo disponible: cada tarea en curso retiene fondos. Cuando se agota el saldo, las tareas nuevas reciben 40201.
  • Límites de gasto: los límites diario, mensual y total de cada clave, los límites diario y mensual del equipo (para las claves que pertenecen a un equipo) y el límite diario de la plataforma. Alcanzar cualquiera de ellos devuelve 40202. Consulta Límites de gasto.
  • Capacidad de ejecución: si un modelo no puede ejecutarse en absoluto, recibes 50301.

Por eso, si quieres más tareas ejecutándose simultáneamente, normalmente necesitas añadir saldo o aumentar un límite de gasto, no aumentar el límite de solicitudes.

Cómo solicitar más capacidad

La capacidad actual aparece en Resumen de la consola. Para pedir más, abre una conversación en Soporte, con el tema Integración de API, y describe tu tráfico: solicitudes máximas por segundo, si ejecutas lotes y qué tamaño alcanzan. Esa información agiliza considerablemente la revisión.

Mientras tanto, mantén acotada la concurrencia del cliente y respeta Retry-After. Elige el máximo de concurrencia según la carga de trabajo, el tiempo de generación y el saldo disponible, en lugar de reducirlo artificialmente para ajustarlo al límite predeterminado de solicitudes.

Cuando el propio sistema de límites no está disponible

Los límites de solicitudes dependen de un contador externo. Si falla, la configuración determina qué ocurre: permitir el tráfico para seguir prestando servicio o rechazarlo para proteger la capacidad. Rechazar es la opción predeterminada: «no pudimos leer la configuración» nunca debe convertirse en «no hay límite».

Cuando está configurado para rechazar, recibes 429 con Retry-After: 1, no 500. Es deliberado: 500 indica que el servicio está fallando y la mayoría de los SDK lo reintentan inmediatamente, aumentando la carga durante un incidente. 429 con Retry-After indica que debes reducir el ritmo y volver más tarde, que es lo que hace falta.

Por tanto, no interpretes 429 como prueba de que enviaste demasiado rápido. Respetar Retry-After es la respuesta correcta en ambos casos.

En esta página