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
Kurzantwort
429 bedeutet, dass Sie Anfragen schneller senden, als die Obergrenze für Anfragen pro Minute Ihres Plans erlaubt – das hat nichts mit Credits oder Tageskontingent zu tun. Enthält die Antwort einen Retry-After-Header, warten Sie genau so lange. Fehlt er, nutzen Sie exponentielles Backoff mit Jitter, und begrenzen Sie separat, wie viele Anfragen gleichzeitig unterwegs sind.Rate-Limit vs. Kontingent
Das sind zwei unterschiedliche Beschränkungen, die häufig verwechselt werden:
- Kontingent – Gesamtzahl erlaubter Anfragen über ein längeres Fenster (z. B. einen Tag). Ist es aufgebraucht, müssen Sie auf ein Reset warten, das manchmal viele Stunden entfernt ist.
- Rate-Limit – Anzahl erlaubter Anfragen pro kurzem Fenster (z. B. einer Minute). Wird es erreicht, bedeutet das ein paar Sekunden bis eine Minute Verlangsamung, nicht Stunden.
Im Hintergrund implementieren die meisten APIs Rate-Limiting entweder über einen Token-Bucket (Sie sammeln in stetigem Tempo Anfrage-"Tokens" an und verbrauchen einen pro Anfrage, was kurze Bursts erlaubt) oder einen Fixed-/Sliding-Window-Zähler (eine feste Obergrenze pro Kalenderminute, die an der Grenze zurückgesetzt wird). Welche eine bestimmte API verwendet, bestimmt, wie ausbrechend Ihr Traffic sicher sein kann – ein Token-Bucket verträgt einen kurzen Spitzenwert besser als ein festes Fenster.
Der HTTP-Standard: RFC 6585 und Retry-After
429 Too Many Requests ist keine anbieterspezifische Folklore – er wurde formal in RFC 6585 (April 2012) als Standard-HTTP-Statuscode definiert. Gemäß RFC 9110 kann ein konformer Server einer 429- (oder 503-)Antwort einen Retry-After-Header in einer von zwei Formen anhängen:
- Delay-Seconds-Form – eine Ganzzahl, z. B.
Retry-After: 120, bedeutet 120 Sekunden warten. - HTTP-Date-Form – ein absoluter Zeitstempel, z. B.
Retry-After: Wed, 21 Oct 2026 07:28:00 GMT.
Ist er vorhanden, ist dieser Header maßgeblich – der Server sagt Ihnen genau, wann er wieder Anfragen akzeptiert. Legen Sie kein eigenes exponentielles Backoff darüber – das verzögert Ihre Erholung nur weiter. Greifen Sie nur dann auf Backoff zurück, wenn der Header fehlt.
Die Rate-Limits von GetYouTubeTranscript
| Plan | Rate-Limit |
|---|---|
| Kostenlos | 60 Anfragen/Min. |
| Monatlich (5 $/Monat) | 200 Anfragen/Min. |
| Jährlich (4,50 $/Monat) | 300 Anfragen/Min. |
Wie das tatsächlich durchgesetzt wird
Retry-After-Header gesendet, behandeln Sie also jeden 429 dieser API als "bis zu ~60 Sekunden warten und mit Backoff erneut versuchen", nach dem untenstehenden Code-Muster, statt einen Header zu parsen, der nicht vorhanden sein wird.429s korrekt behandeln
Die richtige Reihenfolge: zuerst auf Retry-After prüfen, und nur auf exponentielles Backoff mit Jitter zurückgreifen, wenn er fehlt. Jitter (das leichte Zufälligmachen der Wartezeit) ist wichtig, weil viele Clients, die ein Limit gleichzeitig treffen und alle nach einem identischen Zeitplan erneut versuchen, sich synchronisieren und einen "Thundering Herd" erzeugen, der dasselbe Limit sofort erneut auslöst.
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")Rate vs. Nebenläufigkeit – ein eigenständiges Problem
Eine Obergrenze für Anfragen pro Minute und eine Obergrenze für gleichzeitig laufende Anfragen sind nicht dasselbe. Das gleichzeitige Abfeuern von 50 Anfragen mit Promise.all kann einen 429 auslösen, selbst wenn Ihr Gesamtwert für die Minute deutlich unter dem Budget liegt, weil der Server (oder ein vorgeschalteter Proxy) auch die Zahl gleichzeitiger Verbindungen begrenzen kann. Begrenzen Sie bei der Stapelverarbeitung vieler Videos die Nebenläufigkeit unabhängig von Ihrem Rate-Limit-Backoff:
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)))
);Für anhaltend hohes Volumen erhöht ein Plan-Upgrade die Obergrenze für Anfragen/Min. direkt – siehe Preise in der API-Dokumentation, oder starten Sie mit 100 kostenlosen Credits über das Dashboard.
FAQs zum Rate-Limit
Was ist der Unterschied zwischen einem Rate-Limit und einem Kontingent?
Ein Kontingent begrenzt die Gesamtnutzung über einen Zeitraum (z. B. pro Tag). Ein Rate-Limit begrenzt, wie viele Anfragen Sie pro Zeiteinheit stellen können (z. B. pro Minute), unabhängig von Ihrer täglichen Gesamtnutzung – Sie können ein Rate-Limit treffen und dabei noch deutlich unter Ihrem Tageskontingent liegen. Siehe unseren Leitfaden zum YouTube-API-Kontingent für die Kontingentseite davon.
Was bedeutet eine 429-Antwort?
429 Too Many Requests wurde 2012 formal in RFC 6585 definiert. Es bedeutet, dass Sie das Anfragen-pro-Fenster-Limit Ihres Plans überschritten haben – ein Signal zum Verlangsamen und erneuten Versuchen, nicht, dass Ihre Anfrage ungültig war oder Sie keine Credits mehr haben.
Was ist der Retry-After-Header, und sollte ich ihm immer vertrauen?
Gemäß RFC 9110 kann ein Server einer 429- oder 503-Antwort einen Retry-After-Header in einer von zwei Formen beifügen: eine Ganzzahl in Sekunden (Retry-After: 120) oder ein absolutes HTTP-Datum. Ist er vorhanden, befolgen Sie ihn exakt, statt ein eigenes Backoff darüberzulegen – der Server hat Ihnen eine maßgebliche Antwort darauf gegeben, wann Sie es erneut versuchen sollten.
Was ist das Rate-Limit von GetYouTubeTranscript, und sendet es einen Retry-After-Header?
60 Anfragen/Minute im kostenlosen Plan, 200 Anfragen/Min im monatlichen Plan und 300 Anfragen/Min im jährlichen Plan, durchgesetzt als festes 1-Minuten-Fenster pro API-Schlüssel (kein rollierendes Fenster). Derzeit wird bei 429s kein Retry-After-Header gesendet, implementieren Sie also Ihr eigenes Backoff (siehe Code unten), statt eines zu erwarten – da das Fenster fest statt rollierend ist, beträgt die Wartezeit höchstens den Rest der aktuellen Minute.
Verbraucht ein 429 einen Credit?
Nein – eine ratenbegrenzte Anfrage wird nie berechnet. Nur erfolgreiche Anfragen verbrauchen Credits.
Sollte ich mehrere API-Schlüssel eröffnen, um mehr Durchsatz zu bekommen?
Nein – das verstößt in der Regel gegen die Fair-Use-Bedingungen eines Anbieters, und bei GetYouTubeTranscript speziell wird das Rate-Limiting bereits pro API-Schlüssel durchgesetzt, aber Credits und Kontostatus werden unabhängig davon, wie viele Schlüssel Sie erzeugen, auf Kontoebene verfolgt. Brauchen Sie mehr Durchsatz, upgraden Sie stattdessen die Plan-Stufe, was die Obergrenze für Anfragen/Min direkt anhebt.
Warum schlagen meine Anfragen fehl, obwohl ich unter dem Anfragen-pro-Minute-Limit liege?
Das ist meist ein Nebenläufigkeitsproblem, kein Ratenproblem – 50 Anfragen parallel abzufeuern kann einen Server überlasten, selbst wenn Ihr Gesamtwert für die Minute im Budget liegt. Nutzen Sie einen Nebenläufigkeitsbegrenzer (wie p-limit in Node oder ein Semaphore in Python), um zu begrenzen, wie viele Anfragen gleichzeitig unterwegs sind, unabhängig davon, wie viele Sie pro Minute senden.
Verwandte Themen
- 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