Si vous voyez 429 Too Many Requests, c’est que vous sollicitez l’API trop fréquemment. Voici comment le gérer correctement.
L’erreur
HTTP 429 Too Many Requests
{
"error": "Limit exceed."
}
Pourquoi cela arrive
Les limites de débit protègent l’API contre une utilisation excessive :
Trop de requêtes en peu de temps
Interrogation fréquente ou scraping agressif
Absence de délai entre les requêtes
Requêtes concurrentes sans limitation (throttling)
Stratégie de backoff exponentiel
La meilleure façon de gérer les limites de débit est d’utiliser un backoff exponentiel : attendez plus longtemps après chaque nouvelle tentative :
async function fetchWithBackoff(url, options, maxRetries = 5) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(url, options);
if (response.status === 429) {
const waitTime = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s, 8s, 16s
console.log(`Rate limited. Waiting ${waitTime}ms before retry ${attempt + 1}/${maxRetries}`);
await new Promise(resolve => setTimeout(resolve, waitTime));
continue;
}
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
if (attempt === maxRetries - 1) throw error;
}
}
throw new Error('Max retries exceeded');
}
Prévenir les limitations de débit
Ajoutez des délais entre les requêtes :
// Mauvais : requêtes en rafale
for (const id of mediaIds) {
await api.getResource(id); // Pas de délai
}
// Bon : requêtes limitées
for (const id of mediaIds) {
await api.getResource(id);
await sleep(500); // Délai de 500ms
}
Traitez par lots :
// Traiter par lots de 10 avec des délais
const batchSize = 10;
for (let i = 0; i < mediaIds.length; i += batchSize) {
const batch = mediaIds.slice(i, i + batchSize);
await Promise.all(batch.map(id => api.getResource(id)));
if (i + batchSize < mediaIds.length) {
await sleep(2000); // 2s entre les lots
}
}
Mettre en cache les réponses :
const cache = new Map();
async function getCachedResource(mediaId) {
if (cache.has(mediaId)) {
return cache.get(mediaId);
}
const data = await api.getResource(mediaId);
cache.set(mediaId, data);
return data;
}
Ce qu’il ne faut PAS faire
❌ Réessayer immédiatement sans délai
❌ Faire des requêtes en parallèle sans limite
❌ Ignorer les erreurs 429
❌ Utiliser des délais fixes et courts (utilisez toujours un backoff exponentiel)
Si les problèmes persistent
Contactez l’assistance développeurs si vous avez réellement besoin de limites de débit plus élevées pour votre cas d’usage. Indiquez :
Votre application et votre cas d’usage
Le volume de requêtes attendu
Votre implémentation actuelle (avec backoff)