November 10, 2026 · 5 min read
yt-dlp "Sign in to confirm you're not a bot": Fix for Subtitles and Transcripts
In short
yt-dlp shows "Sign in to confirm you're not a bot" when YouTube distrusts your IP, usually a cloud server. Cookies work briefly and risk the account. For subtitles and transcripts, a hosted API avoids the check.
ERROR: [youtube] VIDEO_ID: Sign in to confirm you're not a bot. yt-dlp prints this when YouTube decides the request comes from automation, which is almost always the case on AWS, Google Cloud, Azure, Hetzner, DigitalOcean, and other datacenter IPs, and sometimes on a busy home connection. Updating yt-dlp helps only when YouTube changed something; the IP is the main cause.
What you see
yt-dlp --write-auto-subs --sub-langs en --skip-download "https://youtu.be/5f3Pn-N6yLc" # ERROR: [youtube] 5f3Pn-N6yLc: Sign in to confirm you're not a bot. # Use --cookies-from-browser or --cookies for the authentication.
Fixes that work, and what they cost
- Update first: yt-dlp -U (or pip install -U yt-dlp). Fixes the error only when it came from a YouTube change.
- Run from a residential connection: works for one-off jobs, but a home IP that downloads a lot gets the same check.
- Cookies: --cookies-from-browser chrome, or --cookies cookies.txt exported from a logged-in browser. Works until the cookies rotate; the account takes the risk.
- PO token provider plugins: newer yt-dlp setups can attach YouTube's proof-of-origin tokens through a plugin. More moving parts to keep current.
- Residential proxies: --proxy http://user:pass@host:port. Reliable, billed per GB.
If you only need the text, skip yt-dlp
Most yt-dlp subtitle jobs are really transcript jobs: summaries, search, RAG, or SRT files. The TranscriptYT API runs the YouTube side on its own proxy network and returns the captions in the format you ask for, so there is nothing to sign in to. Videos without captions are transcribed with AI.
# SRT, like --write-subs --convert-subs srt curl "https://transcript-yt.com/v1/transcript?url=5f3Pn-N6yLc&format=srt" \ -H "Authorization: Bearer $TRANSCRIPTYT_KEY" -o 5f3Pn-N6yLc.srt # Plain text for an LLM curl "https://transcript-yt.com/v1/transcript?url=5f3Pn-N6yLc&format=text" \ -H "Authorization: Bearer $TRANSCRIPTYT_KEY"
Whole channels and playlists
yt-dlp is often used to loop over a channel. The batch endpoint takes a playlist or channel URL and returns every video's transcript in one call; see download all transcripts from a channel.
Common questions
Why does yt-dlp say sign in to confirm you're not a bot?
YouTube gates requests from IP addresses it associates with automation, mostly cloud and datacenter ranges. The same command usually works from a home connection.
Does --cookies-from-browser fix it?
Often, for a while. The cookies tie your requests to a Google account; heavy automated use can get that account flagged, and cookies exported from a browser expire or rotate. Use a throwaway account if you go this way.
Will updating yt-dlp fix the bot check?
Run yt-dlp -U first, since YouTube changes often break older versions. If the error persists on a current version, the cause is your IP, not the tool.
I only need subtitles, not the video. Is there an easier way?
Yes. Caption text doesn't need the video download at all. A transcript API returns the subtitles as JSON, text, SRT, or VTT over HTTPS, with no cookies, proxies, or bot checks on your side.
Do residential proxies fix yt-dlp's bot check?
Usually, since residential IPs are trusted more. You pay per GB, and video or audio downloads use a lot of bandwidth, which is why proxies are cheapest when you only fetch captions.