Un éditeur SaaS ouvre son API aux intégrateurs. Deux semaines plus tard, un partenaire ERP synchronise 200 000 fiches produit en boucle — sans pagination — un week-end. Lundi matin : base PostgreSQL à 100 % CPU, factures Cloud triplées, clients principaux en timeout. La réunion post-mortem révèle qu'il n'y avait ni quota, ni alerte, ni 429 documenté.
Ouvrir une API publique, ce n'est pas exposer des endpoints. C'est accepter que des inconnues contrôleront votre charge — parfois par malice, souvent par erreur d'intégration. Les limites doivent exister avant le premier client, pas après la première panne.
Les quatre garde-fous non négociables
| Garde-fou | Sans lui | Minimum viable |
|---|---|---|
| Authentification | Abus anonyme | Clé API ou OAuth2 client credentials |
| Rate limiting | Boucles infinies | Par clé + par IP en secours |
| Quotas | Un client monopolise | Req/jour + burst/min documentés |
| Observabilité | Post-mortem aveugle | Logs structurés, métriques p95, alertes 429/5xx |
Une API sans 429 est une API qui confond politesse et robustesse. Rejeter proprement protège tout le monde.
Rate limiting : stratégie par tier
Exemple de grille publique :
| Tier | Burst/min | Quota/jour | Usage typique |
|---|---|---|---|
| Sandbox | 30 | 1 000 | Dev, tests |
| Standard | 120 | 50 000 | PME intégrateur |
| Partner | 600 | 500 000 | ERP, marketplace |
Implémentation :
- Nginx
limit_req_zonepour plafond IP global. - Redis compteur par
api_keypour quotas journaliers. - Gateway (Traefik, Kong) pour centraliser sans redeploy app.
Répondez en 429 avec Retry-After et corps JSON explicite — pas en laissant le client deviner un timeout TCP.
Pour le détail technique, voir Rate limiting : protéger une API sans punir les bons clients.
Dimensionnement hébergement : la base compte plus que le CPU API
Une requête API « simple » peut coûter :
- 1 SELECT indexé → 2 ms
- 1 SELECT sans index + JOIN → 800 ms × 500 req/s → mort
Checklist infra :
- Pagination obligatoire (
limitmax 100, cursor preferred). - Cache Redis sur lectures idempotentes (catalogue, référentiels).
- Pool connexions (PgBouncer) — voir Pool de connexions.
- Workers séparés sync lourde vs API interactive.
- Autoscaling sur queue depth, pas seulement CPU.
Mutualisé : non pour API publique sérieuse. VPS minimum ; cloud avec load balancer dès plusieurs clients payants.
Versioning, dépréciation et communication
Limites techniques sans limites produit = dette :
- Préfixe
/v1/figé ; breaking change =/v2/. - Header
Sunsetet email 90 jours avant retrait. - Page statut ou RSS incidents — les intégrateurs ne lisent pas toujoin Slack interne.
Observabilité : métriques qui alertent avant Twitter
- p95/p99 latence par endpoint (pas seulement moyenne).
- Taux 429 par clé — détecte intégration bancale avant saturation.
- Connexions DB actives vs pool max.
- Top consumers : tableau hebdo des clés les plus gourmandes.
Alerte si p95 > SLA interne pendant 5 min ou si une clé dépasse 80 % quota à 14 h.
Le sommet : le pire client est celui qui a signé un contrat
Marketing veut « API ouverte ». Finance veut prévisibilité. L'exploitation doit imposer des murs souples : assez hauts pour les bons usages, assez visibles pour arrêter les erreurs avant la base.
Décider et avancer sans angle mort
- Publiez limites + exemples 429 avant la première clé.
- Load-test avec scénario « client qui boucle » (pas seulement happy path).
- Redis + PgBouncer avant le lancement partenaire.
- Dashboard top consumers revu chaque semaine le premier mois.
- Runbook : couper une clé, mode dégradé read-only, communiquer statut.
Comparez VPS et cloud dans notre annuaire et comparateur.
Questions fréquentes
Faut-il un rate limit dès la v1 ?
Oui — même modeste — pour éviter boucles accidentelles et cadrer les quotas tôt.
Où placer le rate limiting ?
Nginx + clé API minimum ; gateway pour politiques avancées ; code pour règles métier.
Comment dimensionner l'hébergement d'une API ?
Pics par client, p95 cible, coût DB/requête ; cache et pagination avant scale horizontal.
Que documenter avant l'ouverture ?
Limites par tier, 429, Retry-After, dépréciation, statut incident.
Une API publique mature refuse des requêtes avec élégance — avant que la base ne refuse tout le monde sans préavis.