YouTube Transcript API Rate Limit: What It Is and How to Handle 429s
Why APIs return 429 Too Many Requests, what RFC 6585 and the Retry-After header actually specify, how rate limits differ from daily quota, and how to implement correct retry and backoff logic.
00:08:00 · SEP 13, 2026
Réponse rapide
429 signifie que vous envoyez des requêtes plus vite que ne le permet le plafond de requêtes par minute de votre offre - cela n'a rien à voir avec les crédits ou le quota quotidien. Si la réponse inclut un en-tête Retry-After, attendez exactement ce délai. Si ce n'est pas le cas, utilisez un backoff exponentiel avec du jitter, et limitez séparément le nombre de requêtes simultanément en vol.Limite de débit contre quota
Ce sont deux contraintes différentes souvent confondues :
- Quota - total de requêtes autorisées sur une fenêtre plus longue (par ex. une journée). L'épuiser signifie attendre une réinitialisation, parfois à plusieurs heures d'écart.
- Limite de débit - requêtes autorisées par courte fenêtre (par ex. une minute). L'atteindre signifie ralentir de quelques secondes à une minute, pas des heures.
Sous le capot, la plupart des API implémentent la limitation de débit soit avec un token bucket (vous accumulez des "jetons" de requête à un rythme constant et en dépensez un par requête, permettant de courtes rafales), soit avec un compteur à fenêtre fixe ou glissante (un plafond strict par minute calendaire, réinitialisé à la limite). Le mécanisme utilisé par une API donnée change la manière dont votre trafic peut se permettre d'être en rafale - un token bucket tolère mieux un pic court qu'une fenêtre fixe.
Le standard HTTP : RFC 6585 et Retry-After
429 Too Many Requests n'est pas un folklore propre à un fournisseur - il a été formellement défini dans la RFC 6585 (avril 2012) comme un code de statut HTTP standard. Selon la RFC 9110, un serveur conforme peut attacher un en-tête Retry-After à une réponse 429 (ou 503), sous l'une de ces deux formes :
- Forme délai en secondes - un entier, par ex.
Retry-After: 120, signifiant attendre 120 secondes. - Forme date HTTP - un horodatage absolu, par ex.
Retry-After: Wed, 21 Oct 2026 07:28:00 GMT.
Lorsqu'il est présent, cet en-tête fait autorité - le serveur vous indique exactement quand il acceptera de nouvelles requêtes. N'ajoutez pas votre propre backoff exponentiel par-dessus ; cela ne fait que retarder davantage votre reprise. Ne recourez au backoff que lorsque l'en-tête est absent.
Les limites de débit de GetYouTubeTranscript
| Offre | Limite de débit |
|---|---|
| Gratuit | 60 req/min |
| Mensuel (5 $/mois) | 200 req/min |
| Annuel (4,50 $/mois) | 300 req/min |
Comment cela est réellement appliqué
Retry-After, traitez donc tout 429 de cette API comme "attendez jusqu'à ~60 secondes et réessayez avec un backoff", en utilisant le modèle de code ci-dessous plutôt qu'en analysant un en-tête qui ne sera pas là.Bien gérer les 429
Le bon ordre des opérations : vérifiez d'abord Retry-After, et ne recourez au backoff exponentiel avec jitter que s'il est absent. Le jitter (randomiser légèrement le délai) compte car lorsque de nombreux clients atteignent une limite simultanément et réessaient tous selon un calendrier identique, ils se synchronisent et créent une "ruée" qui redéclenche immédiatement la même limite.
Node.js :
async function getTranscriptWithRetry(videoId, apiKey, maxRetries = 4) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch(
`https://getyoutubetranscript.com/api/v1/transcript?v=${videoId}`,
{ headers: { Authorization: `Bearer ${apiKey}` } }
);
if (res.status !== 429) return res.json();
const retryAfter = res.headers.get('retry-after');
const waitMs = retryAfter
? Number(retryAfter) * 1000
: 500 * 2 ** attempt + Math.random() * 250; // exponential backoff + jitter
await new Promise((r) => setTimeout(r, waitMs));
}
throw new Error('Rate limited after retries');
}Python :
import os, time, random, requests
def get_transcript_with_retry(video_id, api_key, max_retries=4):
url = "https://getyoutubetranscript.com/api/v1/transcript"
for attempt in range(max_retries + 1):
res = requests.get(url, params={"v": video_id}, headers={"Authorization": f"Bearer {api_key}"})
if res.status_code != 429:
return res.json()
retry_after = res.headers.get("Retry-After")
wait = float(retry_after) if retry_after else (0.5 * 2 ** attempt + random.uniform(0, 0.25))
time.sleep(wait)
raise RuntimeError("Rate limited after retries")Débit contre concurrence - un problème distinct
Un plafond de requêtes par minute et un plafond de concurrence en vol ne sont pas la même chose. Déclencher 50 requêtes simultanément avec Promise.all peut provoquer un 429 même si votre total pour la minute est bien en dessous du budget, car le serveur (ou un proxy devant lui) peut aussi plafonner les connexions simultanées. Lors du traitement en lot de nombreuses vidéos, limitez la concurrence indépendamment de votre backoff de limite de débit :
import pLimit from 'p-limit';
const limit = pLimit(5); // at most 5 requests in flight at once
const results = await Promise.all(
videoIds.map((id) => limit(() => getTranscriptWithRetry(id, apiKey)))
);Pour des lots soutenus à fort volume, passer à une offre supérieure augmente directement le plafond de req/min - consultez les tarifs dans la documentation API, ou démarrez avec 100 crédits gratuits depuis le tableau de bord.
FAQ sur les limites de débit
Quelle est la différence entre une limite de débit et un quota ?
Un quota plafonne l'usage total sur une période (par ex. par jour). Une limite de débit plafonne le nombre de requêtes que vous pouvez effectuer par unité de temps (par ex. par minute), indépendamment de votre usage quotidien total - vous pouvez atteindre une limite de débit tout en restant bien en dessous de votre quota quotidien. Consultez notre guide sur le quota de l'API YouTube pour le volet quota.
Que signifie une réponse 429 ?
429 Too Many Requests a été formellement défini dans la RFC 6585 en 2012. Cela signifie que vous avez dépassé la limite de requêtes par fenêtre pour votre offre - c'est un signal pour ralentir et réessayer, pas que votre requête était invalide ou que vous n'avez plus de crédits.
Qu'est-ce que l'en-tête Retry-After, et dois-je toujours lui faire confiance ?
Selon la RFC 9110, un serveur peut inclure un en-tête Retry-After sur une réponse 429 ou 503, sous l'une de ces deux formes : un nombre entier de secondes (Retry-After: 120) ou une date HTTP absolue. S'il est présent, respectez-le exactement plutôt que d'ajouter votre propre backoff par-dessus - le serveur vous a donné une réponse faisant autorité sur le moment de réessayer.
Quelle est la limite de débit de GetYouTubeTranscript, et envoie-t-elle un en-tête Retry-After ?
60 requêtes/minute sur l'offre gratuite, 200 req/min sur l'offre mensuelle, et 300 req/min sur l'offre annuelle, appliquées comme une fenêtre fixe d'1 minute par clé API (pas une fenêtre glissante). Elle n'envoie actuellement pas d'en-tête Retry-After sur les 429, implémentez donc votre propre backoff (voir le code ci-dessous) plutôt que d'en attendre un - comme la fenêtre est fixe plutôt que glissante, l'attente est au maximum le reste de la minute en cours.
Un 429 consomme-t-il un crédit ?
Non - une requête limitée en débit n'est jamais facturée. Seules les requêtes réussies consomment des crédits.
Devrais-je ouvrir plusieurs clés API pour obtenir plus de débit ?
Non - cela viole généralement les conditions d'usage équitable d'un fournisseur, et sur GetYouTubeTranscript en particulier, la limitation de débit est déjà appliquée par clé API, mais les crédits et l'état du compte sont suivis au niveau du compte quel que soit le nombre de clés que vous générez. Si vous avez besoin de plus de débit, passez plutôt à une offre supérieure, ce qui augmente directement le plafond de req/min.
Pourquoi mes requêtes échouent-elles même si je suis en dessous de la limite de requêtes par minute ?
C'est généralement un problème de concurrence, pas de débit - déclencher 50 requêtes en parallèle peut submerger un serveur même si votre total pour la minute reste dans le budget. Utilisez un limiteur de concurrence (comme p-limit en Node ou un sémaphore en Python) pour plafonner le nombre de requêtes en vol à la fois, séparément du nombre que vous envoyez par minute.
À lire aussi
- YouTube API Quota Exceeded: Causes and Fixes
- YouTube Transcript MCP Server: Setup Guide for Claude and Other AI Tools
- YouTube Transcripts in n8n: HTTP Request Workflow Guide
- GetYouTubeTranscript vs TranscriptAPI
- GetYouTubeTranscript vs youtubetotranscript.com
- GetYouTubeTranscript vs youtube-transcript.io