# Límites de frecuencia y encabezados

> Límites de frecuencia de las solicitudes por clave de API, encabezados de respuesta del límite de frecuencia, retry-after en 429 y 503 y los demás encabezados que establece la API de Fileverity.

Fuente: https://fileverity.com/es/docs/rate-limits

Cada clave de API puede hacer 120 solicitudes por minuto. El límite se cuenta en ventanas de un minuto y abarca todos los endpoints, incluidas las solicitudes que devuelven un error. Cuando se agota una ventana, las solicitudes posteriores reciben `429` con el código `rate_limited` hasta que la ventana se reinicia.

¿Necesita límites más altos o precios por volumen? [Hable con ventas](https://fileverity.com/es/contacto).

## Encabezados del límite de frecuencia

Toda respuesta a una solicitud autenticada incluye el estado de su ventana:

| Encabezado | Significado |
| --- | --- |
| `x-ratelimit-limit-requests` | Solicitudes permitidas por ventana. |
| `x-ratelimit-remaining-requests` | Solicitudes restantes en la ventana actual. |
| `x-ratelimit-reset-requests` | Segundos hasta que se reinicia la ventana. |
| `retry-after` | Solo en `429` con el código `rate_limited` y en `503` con el código `service_unavailable`. Segundos que hay que esperar antes de la siguiente solicitud. `pending_files_limit` (también `429`) no lo incluye. |

Las solicitudes rechazadas por una clave ausente o no válida (`401`) no incluyen estos encabezados.

**Respetar retry-after: JavaScript**

```javascript
async function call(url, init) {
  for (let attempt = 0; attempt < 5; attempt++) {
    const response = await fetch(url, init);
    if (response.status !== 429) return response;
    const wait = Number(response.headers.get("retry-after")) || 1;
    await new Promise((resolve) => setTimeout(resolve, wait * 1000));
  }
  throw new Error("Rate limited");
}
```

**Respetar retry-after: Python**

```python
import time

def call(method, url, **kwargs):
    for attempt in range(5):
        response = requests.request(method, url, **kwargs)
        if response.status_code != 429:
            return response
        time.sleep(int(response.headers.get("retry-after", 1)))
    raise RuntimeError("Rate limited")
```

Distribuya las ráfagas en el tiempo, prefiera los [webhooks](https://fileverity.com/es/docs/webhooks.md) a los bucles de consultas frecuentes y use `Prefer: wait` en los [análisis](https://fileverity.com/es/docs/analyses.md) en lugar de consultar periódicamente. Cuando la capacidad está ocupada, `POST /analyses` devuelve `503 service_unavailable` con `retry-after`; consulte [Cuando el servicio está ocupado](https://fileverity.com/es/docs/analyses.md#busy).

## Otros encabezados de respuesta

| Encabezado | Dónde | Significado |
| --- | --- | --- |
| `x-request-id` | Todas las respuestas | El ID de la solicitud, también en los cuerpos de error. |
| `cache-control: no-store` | Todas las respuestas | Las respuestas de la API nunca se almacenan en caché. |
| `preference-applied` | `POST /analyses` | `wait=N` cuando se aplicó su encabezado `Prefer`. |
| `idempotent-replayed` | Endpoints POST | `true` cuando la respuesta es una respuesta guardada que se reutiliza. Consulte [Idempotencia](https://fileverity.com/es/docs/idempotency.md). |
| `x-evidence-included` | `GET /analyses/{id}/report.pdf` | `false` cuando las evidencias del documento ya han caducado y el PDF las omite. |

## Encabezados que usted envía

- `Authorization: Bearer <key>`: obligatorio. Consulte [Autenticación y claves](https://fileverity.com/es/docs/authentication.md).
- `Content-Type: application/json` para los cuerpos JSON; `multipart/form-data` para las subidas con `POST /files`.
- `Idempotency-Key`: opcional, en las solicitudes POST.
- `Prefer: wait=N`: opcional, en `POST /analyses`.

Ejemplo: `curl -i https://api.fileverity.com/v1/models -H "Authorization: Bearer $FILEVERITY_API_KEY"` muestra todos los encabezados de la respuesta.

