# Débit, quotas et 429

> Comment la passerelle vous dit de ralentir, et comment un client bien écrit s'y règle. Côté produit : Contrôle du trafic et quotas ; côté exploitation : Poser…

Guide - Depuis la version 0.1.0 - Flexway v1.6.3 - https://flexway.io/docs/developer-rate-limits/

> Comment la passerelle vous dit de ralentir, et comment un client bien écrit s'y règle.
>
> Côté produit : [Contrôle du trafic et quotas](https://flexway.io/docs/product-traffic-quotas/) ; côté exploitation : [Poser des quotas](https://flexway.io/docs/operations-quotas/).

## Les en-têtes

| En-tête | Quand | Sens |
| --- | --- | --- |
| `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` | Sur toute réponse limitée, **succès compris** | Ralentissez avant d'être refusé |
| `Retry-After` | `429`, `503` | Secondes à attendre |

## Les refus

| Réponse | Sens | Attente |
| --- | --- | --- |
| `429 rate_limited` | Votre débit (par identité, par classe ou par opération) | `Retry-After`, quelques secondes |
| `429 quota_exceeded` | Le quota de votre tenant pour le jour ou le mois (UTC) | `Retry-After` jusqu'à la fin de la fenêtre |
| `429 budget_exceeded` | Budget d'inférence du tenant ([inférence](https://flexway.io/docs/developer-inference/)) | Fin de la fenêtre |
| `503 overloaded` | La passerelle déleste sous saturation (`Flexway-Degraded: shedding`) | `Retry-After` |

Le débit compte **par identité** (sujet du jeton, clé d'API, certificat), pas par adresse. Un succès
de cache compte aussi.

```python
import random, time, requests
def call(url, **kw):
    for attempt in range(5):
        r = requests.get(url, **kw)
        if r.status_code not in (429, 503):
            return r
        wait = int(r.headers.get("Retry-After", 1))
        time.sleep(wait + random.uniform(0, wait / 2))   # gigue : n'arrivez pas tous ensemble
    return r
```

Pour Kafka, le débit se dit par `throttle_time_ms` : voir [clients Kafka](https://flexway.io/docs/developer-kafka/).
