Limites d'appel et quota
Deux chiffres, dont un seul refuse
Un volume mensuel est ce que votre offre comprend, et une limite de rafale plafonne les requêtes par seconde pour qu'un client n'évince pas les autres.
Seule la limite de rafale refuse une requête. Dépasser le volume inclus ne vous coupe pas l'accès : votre intégration continue de fonctionner, et un trafic qui s'installe nettement au-dessus de ce que vous payez donne lieu à une discussion sur le passage à l'offre supérieure au prochain renouvellement, pas à un 429 à trois heures du matin. Écrivez votre client face à la limite de rafale ; le chiffre mensuel est la taille de l'offre que vous avez achetée.
Les deux sont fixées par votre offre. La consommation actuelle figure sur la
page des clés et dans GET /v1/api/me ; les chiffres par offre sont sur la
page entreprises.
En-têtes
Chaque réponse porte votre situation actuelle, afin qu'un client bien élevé puisse ralentir avant d'être refusé plutôt qu'après.
RateLimit-Limit: 100000
RateLimit-Remaining: 58796
RateLimit-Reset: 1725148800
RateLimit-Policy: 100000;w=2592000, 20;w=1| En-tête | Signification |
|---|---|
RateLimit-Limit | Requêtes autorisées dans la fenêtre actuelle. |
RateLimit-Remaining | Requêtes restantes. Surveillez ceci plutôt que de compter vos propres appels. |
RateLimit-Reset | Horodatage Unix du basculement de la fenêtre. |
Retry-After | Envoyé uniquement avec un 429. Secondes à attendre, et fait autorité : préférez-le à toute temporisation que vous calculeriez. |
Temporiser correctement
async function call(request, attempts = 5) {
for (let attempt = 0; attempt < attempts; attempt++) {
const response = await fetch(request);
if (response.status !== 429 && response.status < 500) {
return response;
}
// Le serveur sait quand il vous laissera revenir. Croyez-le.
const retryAfter = Number(response.headers.get("Retry-After") ?? 0);
const backoff = retryAfter > 0
? retryAfter * 1000
: Math.min(2 ** attempt * 250, 30_000);
// Sans décalage aléatoire, une flotte de workers réessaie au même instant et
// recrée le pic qui a provoqué le 429 au départ.
await sleep(backoff + Math.random() * 500);
}
throw new Error("Exhausted retry budget");
}Dépenser moins de quota
- Utilisez les webhooks. Une livraison ne coûte pas de quota. Interroger un marché toutes les cinq minutes pour attraper un changement qui survient deux fois par jour est la source la plus courante de requêtes gaspillées.
- Ne demandez que ce qui a changé.
updated_sincetransforme une relecture complète en une poignée de fiches. - Envoyez If-None-Match. Un 304 ne compte pas dans votre quota.
- Paginez plus large. Une requête pour 200 fiches coûte une requête ; quatre pour 50 en coûtent quatre.
- Étendez au lieu de suivre.
expand=imagesévite une requête supplémentaire par bien. - Testez avec des clés de test. Une clé
sk_test_ne puise pas dans votre quota de production : une suite d'intégration continue bruyante ne coûte donc rien.
S'il vous en faut davantage
Dites-nous ce que vous construisez plutôt que de contourner la limite. Un volume élevé soutenu est généralement mieux servi par un export que par une exploration plus rapide, et nous préférons relever un quota plutôt que vous voir redécouvrir la limite de rafale en production.