# Limites de débit et en-têtes

> Limites de débit des requêtes par clé d’API, en-têtes de réponse relatifs aux limites de débit, retry-after pour les statuts 429 et 503, et autres en-têtes définis par l’API Fileverity.

Source : https://fileverity.com/fr/docs/rate-limits

Chaque clé d’API peut effectuer 120 requêtes par minute. La limite est comptée par fenêtres d’une minute et s’applique à tous les points d’accès, y compris aux requêtes qui renvoient une erreur. Lorsqu’une fenêtre est épuisée, les requêtes suivantes reçoivent `429` avec le code `rate_limited` jusqu’à la réinitialisation de la fenêtre.

Besoin de limites plus élevées ou de tarifs sur volume ? [Contactez l’équipe commerciale](https://fileverity.com/fr/contact).

## En-têtes de limite de débit

Chaque réponse à une requête authentifiée indique l’état de votre fenêtre :

| En-tête | Signification |
| --- | --- |
| `x-ratelimit-limit-requests` | Nombre de requêtes autorisées par fenêtre. |
| `x-ratelimit-remaining-requests` | Nombre de requêtes restantes dans la fenêtre en cours. |
| `x-ratelimit-reset-requests` | Secondes restantes avant la réinitialisation de la fenêtre. |
| `retry-after` | Uniquement avec `429` et le code `rate_limited`, et avec `503` et le code `service_unavailable`. Nombre de secondes à attendre avant la requête suivante. `pending_files_limit` (également `429`) ne l’inclut pas. |

Les requêtes rejetées pour clé manquante ou invalide (`401`) ne comportent pas ces en-têtes.

**Respecter 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");
}
```

**Respecter 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")
```

Étalez les pics de requêtes dans le temps, préférez les [webhooks](https://fileverity.com/fr/docs/webhooks.md) aux boucles d’interrogation rapprochées et utilisez `Prefer: wait` sur les [analyses](https://fileverity.com/fr/docs/analyses.md) plutôt que d’interroger l’API. Lorsque la capacité est saturée, `POST /analyses` renvoie `503 service_unavailable` avec `retry-after` ; voir [Lorsque le service est saturé](https://fileverity.com/fr/docs/analyses.md#busy).

## Autres en-têtes de réponse

| En-tête | Applicable à | Signification |
| --- | --- | --- |
| `x-request-id` | Toutes les réponses | L’ID de la requête, également présent dans les corps d’erreur. |
| `cache-control: no-store` | Toutes les réponses | Les réponses de l’API ne sont jamais mises en cache. |
| `preference-applied` | `POST /analyses` | `wait=N` lorsque votre en-tête `Prefer` a été pris en compte. |
| `idempotent-replayed` | Points d’accès POST | `true` lorsque la réponse est une réponse enregistrée rejouée. Voir [Idempotence](https://fileverity.com/fr/docs/idempotency.md). |
| `x-evidence-included` | `GET /analyses/{id}/report.pdf` | `false` lorsque les preuves du document ont déjà expiré et que le PDF ne les contient pas. |

## En-têtes que vous envoyez

- `Authorization: Bearer <key>` : obligatoire. Voir [Authentification et clés](https://fileverity.com/fr/docs/authentication.md).
- `Content-Type: application/json` pour les corps JSON ; `multipart/form-data` pour les téléversements `POST /files`.
- `Idempotency-Key` : facultatif, sur les requêtes POST.
- `Prefer: wait=N` : facultatif, sur `POST /analyses`.

Exemple : `curl -i https://api.fileverity.com/v1/models -H "Authorization: Bearer $FILEVERITY_API_KEY"` affiche tous les en-têtes de réponse.

