Fix yt-dlp "Sign in to confirm you're not a bot"
yt-dlp works on your laptop, then on a server it stops with ERROR: [youtube] ...: Sign in to confirm you're not a bot. Here's what is going on and what you can do.
Why it happens
YouTube scores each request. Requests from cloud provider IP ranges, or many requests from one IP, look automated, and YouTube answers with a sign-in wall instead of the video. Updating yt-dlp (yt-dlp -U) is always the first step, because YouTube changes often and the project ships fixes quickly, but on a flagged IP an update alone rarely fixes it.
Option 1: pass cookies from a logged-in browser
yt-dlp --cookies-from-browser firefox URL # or, on a server, an exported cookies.txt yt-dlp --cookies cookies.txt URL
This usually gets past the wall. The cost: the requests are now tied to a Google account, and accounts used for heavy scraping can be flagged or suspended. Cookies also expire, so a server job breaks again after a while. Use a throwaway account and expect to refresh the cookies.
Option 2: rotating residential proxies
yt-dlp accepts --proxy. Residential IPs look like home users and are blocked far less than datacenter IPs. You pay for bandwidth, and downloading video uses a lot of it; subtitles alone use little. Expect some retries.
Option 3: PO tokens
YouTube increasingly expects a "proof of origin" token from its web clients. yt-dlp documents how to supply one, including plugins that generate it. It helps on some clients and IPs, but it is extra moving parts that change when YouTube changes.
Option 4: if you only need the transcript
Many people run yt-dlp only to get subtitles for an LLM, search or a summary. In that case you don't need to download anything: a transcript API returns the text in one request, from any server, with no cookies or proxies on your side.
curl -H "x-api-key: YOUR_KEY" \ "https://api.transkrio.com/v1/transcript?url=https://youtu.be/dQw4w9WgXcQ&format=text"
Videos without captions are transcribed from the audio, and failed requests are free. The free key includes 100 credits. Compare yt-dlp and a transcript API side by side, or see the same problem in the Python library: RequestBlocked errors.