All guides

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.

Try the YouTube Transcript API

Get transcripts as JSON, text, SRT, or VTT. 100 free credits, no card required.

More guides