November 10, 2026 · 4 min read
yt-dlp Subtitles: HTTP Error 429 Too Many Requests
In short
yt-dlp's "Unable to download video subtitles: HTTP Error 429" means YouTube is rate-limiting your IP's caption requests. Slow down with --sleep-subtitles, change IP, or fetch captions through a transcript API.
When you download subtitles for many videos, yt-dlp starts failing with "Unable to download video subtitles for 'en': HTTP Error 429: Too Many Requests". YouTube's caption endpoint rate-limits by IP, and it is far stricter with datacenter IPs and with bursts of requests. The limit eventually lifts, but a bulk job rarely finishes without a change of approach.
The error
yt-dlp --write-auto-subs --sub-langs en --skip-download -a video_ids.txt # ERROR: Unable to download video subtitles for 'en': # HTTP Error 429: Too Many Requests
Slow down and ask for less
Each language is a separate request, so --sub-langs all multiplies the load. Ask only for what you need and add delays. This is enough for a few hundred videos from a residential IP.
yt-dlp --skip-download --write-subs --write-auto-subs \ --sub-langs "en.*" --sub-format vtt \ --sleep-subtitles 5 --sleep-requests 1 \ -a video_ids.txt
Spread the requests across IPs
Rotating residential proxies (--proxy) give each request a different exit, which keeps any one IP under the limit. You pay per GB and handle failed exits yourself.
Or fetch captions from an API built for bulk
The TranscriptYT API takes up to 500 videos in one batch request, or a playlist or channel URL, and returns each transcript in JSON, text, SRT, or VTT. Paid plans allow 200 requests a minute, rate limits and retries on the YouTube side are handled for you, and failed videos aren't billed.
curl -X POST "https://transcript-yt.com/v1/transcripts" \
-H "Authorization: Bearer $TRANSCRIPTYT_KEY" \
-H "Content-Type: application/json" \
-d '{"playlist": "https://www.youtube.com/@mkbhd", "limit": 50, "format": "vtt"}'Common questions
What does HTTP Error 429 mean in yt-dlp subtitles?
YouTube is rate-limiting caption downloads from your IP address. It isn't a yt-dlp bug, and it usually clears after minutes to hours if you stop.
How do I avoid 429 when downloading subtitles in bulk?
Add delays with --sleep-subtitles 5 and --sleep-requests 1, download only the subtitle languages you need with --sub-langs, and spread jobs over time. For thousands of videos, use rotating proxies or a transcript API.
Does --sleep-interval apply to subtitles?
No. --sleep-interval waits before each video download. Use --sleep-subtitles for subtitle downloads and --sleep-requests between the extraction requests.
Why do I get 429 on the first request from a server?
Cloud IP ranges are often already rate-limited by heavy use from other customers. The same command may work from home and fail on a fresh VPS.