# Límites de peticiones y reintentos

Límites de la cuenta y de cada clave, qué recibes cuando todas las líneas están ocupadas, y cómo reintentar y fijar los tiempos de espera.

> https://nezhagate.com/es/docs/guide/rate-limits

## Sin límite de peticiones por defecto

NezhaGate no fija por defecto ningún límite de peticiones por cuenta, y la capacidad crece con tu uso. Para acotar el uso, ponle a cada clave sus propios límites.

## Límites por clave

Se configuran para cada clave en la página API Keys de la consola; vacío o 0 significa sin límite:

| Ajuste | Qué hace | Al superarlo |
| --- | --- | --- |
| **Peticiones por minuto** | El máximo de peticiones que esta clave puede enviar en un minuto. | `429` `rate_limit_exceeded` |
| **Presupuesto diario** | Lo máximo que esta clave puede gastar al día (UTC), en dólares estadounidenses. | `402` `insufficient_quota` |
| **Límite total** | Lo máximo que esta clave puede gastar en total, en dólares estadounidenses; útil para automatizaciones que no deben descontrolarse. | `402` `insufficient_quota` |
| **Lista de modelos permitidos** | Esta clave solo puede llamar a los modelos de la lista. | `403` `permission_denied` |
| **Lista de IP permitidas** | Solo se aceptan peticiones desde las IP o rangos de la lista. | `403` `permission_denied` |

## Cuando todas las líneas están ocupadas

- Cada modelo se sirve por varias líneas y la pasarela reparte las peticiones entre ellas. Si todas las líneas de un modelo están al límite de su capacidad a la vez, recibes un 429; los endpoints compatibles con OpenAI añaden la cabecera `Retry-After` con los segundos que hay que esperar.

- Los trabajos de imagen y vídeo no se rechazan por falta de capacidad: esperan en una cola (`status` es `queued`, con la posición y la espera estimada) y empiezan solos.

- Los modelos gratuitos por promoción también tienen una cuota diaria de llamadas; al superarla recibes 429 hasta que se reinicia a las 00:00 UTC.

## Cuándo reintentar

| HTTP | Qué hacer |
| --- | --- |
| **429** | Espera los segundos que indica la cabecera `Retry-After` y reintenta; si no viene, espera 1, 2 y luego 4 segundos. |
| **500 / 502 / 503 / 504** | Reintenta con espera exponencial (1, 2, 4, 8 segundos, más un margen aleatorio); suelen bastar 3–5 intentos. Estos fallos no se cobran. |
| **Otros 4xx** | Reintentar sin cambios no sirve: primero corrige la petición según `error.code` (parámetros, modelo, clave, saldo). |
| **Error de red / tiempo de espera agotado** | El chat se puede reintentar sin más. Para imágenes y vídeo, busca primero el trabajo en el registro de llamadas y luego decide si vuelves a enviarlo. |

```
import random
import time
import requests

def post_with_retry(url, headers, payload, tries=5):
    for attempt in range(tries):
        r = requests.post(url, headers=headers, json=payload, timeout=600)
        if r.status_code == 429:
            time.sleep(float(r.headers.get("Retry-After", 2 ** attempt)))
            continue
        if r.status_code >= 500:
            time.sleep(2 ** attempt + random.random())     # 1, 2, 4, 8 s ... plus jitter
            continue
        return r                                           # 2xx, or a 4xx to fix in the request
    return r
```

## Tiempos de espera

- Una petición sin streaming puede durar unos 10 minutos antes de que la pasarela de borde la corte (HTTP 524). Para respuestas largas y modelos de razonamiento, usa `stream: true`.

- Configura en tu cliente un tiempo de espera de al menos 10 minutos; si no, tu lado dejará de esperar antes de que llegue una respuesta larga.

- La imagen y el vídeo son trabajos asíncronos: la llamada de envío responde rápido, así que este límite no les afecta.

## ¿Necesitas más capacidad?

Si necesitas alta concurrencia de forma sostenida, cuéntanos tu volumen con antelación en el [grupo de Telegram](https://t.me/+-erBoH9-AYY4MTM1) o a través del soporte, y ampliaremos la capacidad para ese volumen.
