# Limites de débit

> 120 requêtes par minute et 3000 par heure par adresse IP, avec les en-têtes RateLimit et Retry-After.

Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/limites

## Quotas

Chaque adresse IP peut faire **120 requêtes par minute** et **3000 par heure** (fenêtres glissantes). Toutes les requêtes comptent, y compris les réponses `304` et les erreurs.

C’est large pour un bot, un site ou un outil personnel, et cela protège le petit serveur qui sert WoWDB à tout le monde.

**Lire les en-têtes**

#### cURL

```bash
curl -s -D - -o /dev/null https://api.wowdb.assemblee-defias.fr/v1/stats | grep -i ratelimit
# RateLimit-Limit: 120
# RateLimit-Remaining: 119
# RateLimit-Reset: 60
# RateLimit-Policy: 120;w=60, 3000;w=3600
```

## En-têtes

| En-tête | Valeur |
| --- | --- |
| `RateLimit-Limit` | Requêtes permises dans la fenêtre qui s’applique. |
| `RateLimit-Remaining` | Requêtes restantes avant le refus. |
| `RateLimit-Reset` | Secondes avant qu’une place se libère. |
| `RateLimit-Policy` | Les deux fenêtres : `120;w=60, 3000;w=3600`. |
| `Retry-After` | Sur une réponse `429` seulement : secondes à attendre. |

Ces en-têtes sont exposés au JavaScript des navigateurs (CORS).

## En cas de dépassement

La réponse est `429 Too Many Requests`, avec `Retry-After` et une erreur `rate_limit_error` / `rate_limited`. Attendez le délai indiqué avant de réessayer ; inutile d’insister avant, chaque requête refusée compte aussi.

**Réessayer après Retry-After**

#### JavaScript

```js
// Réessaie après le délai de Retry-After, au plus trois fois.
async function getAvecPatience(url, essais = 3) {
  for (let i = 0; ; i++) {
    const res = await fetch(url);
    if (res.status !== 429 || i >= essais) return res;
    const attente = Number(res.headers.get("Retry-After") || 1);
    await new Promise(r => setTimeout(r, attente * 1000));
  }
}
```

#### Python

```python
import time
import urllib.error
import urllib.request

def get_avec_patience(url, essais=3):
    """Réessaie après le délai de Retry-After, au plus trois fois."""
    for i in range(essais + 1):
        try:
            return urllib.request.urlopen(url)
        except urllib.error.HTTPError as e:
            if e.code != 429 or i == essais:
                raise
            time.sleep(int(e.headers.get("Retry-After", "1")))
```

## Bonnes pratiques

- Gardez les réponses en cache : les données ne changent qu’aux mises à jour de WoWDB ([cache et ETag](https://docs.wowdb.assemblee-defias.fr/cache)).
- Utilisez `limit=100` pour parcourir une liste : 50 fois moins de requêtes qu’avec des pages de 2.
- Préférez une recherche ou un filtre à des centaines de fiches lues une à une.
- Pour un très gros besoin, écrivez-nous sur le [forum](https://forum.assemblee-defias.fr/) avant de lancer l’import.

---

API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt.
