yt-dlp: "Sign in to confirm you're not a bot" — Why It Happens and How to Fix It

yt-dlp failing with 'Sign in to confirm you're not a bot'? Here's why YouTube blocks it and every fix that works — updating yt-dlp, browser cookies, PO tokens, rate limiting, and clean IPs.

Vid Kraken · Updated October 28, 2026

If yt-dlp suddenly stops working with this:

ERROR: [youtube] VIDEO_ID: Sign in to confirm you're not a bot.
Use --cookies-from-browser or --cookies for the authentication.

…YouTube has flagged your request as automated and is refusing to serve the video without a signed-in session. This started appearing far more often in 2024–2025 as YouTube ramped up bot detection, and it's now one of the most common yt-dlp failures.

Here's what triggers it and every fix that actually works, in the order most likely to resolve it.

Why YouTube shows "confirm you're not a bot"

YouTube decides a request looks robotic and demands proof of a real, signed-in user. The usual triggers:

  • Your yt-dlp is out of date — YouTube changed something and your version's extractor hasn't caught up.
  • You're on a flagged IP — datacenter IPs (AWS, GCP, Azure, most VPS/CI) are heavily scrutinized, so a script that works on your laptop fails on a server.
  • No authentication — anonymous requests get challenged more aggressively, especially at volume.
  • Too many requests — rapid, repeated calls from one IP trip rate-based bot detection.

Closely related to 403 Forbidden

This message rejects the metadata request; a 403 Forbidden rejects the media request. Same root cause, and the fixes below overlap heavily.

Fix 1: Update yt-dlp first

Most "not a bot" errors are just a stale binary. YouTube breaks extractors constantly and the maintainers patch them quickly — but only new releases get the fix.

yt-dlp -U

apt/brew builds are stale

Distro packages of yt-dlp are often weeks behind — old enough to trigger this error on their own. Use yt-dlp -U or pip, then check yt-dlp --version.

Fix 2: Pass your browser cookies

This is the fix YouTube's own error message suggests. Exporting cookies makes yt-dlp request as a logged-in user.

  1. Sign in to YouTube in a browser

    Log into your Google account in Chrome, Firefox, Edge, Brave, or Safari as you normally would.

  2. Point yt-dlp at that browser's cookies

    yt-dlp --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

On headless servers there's no browser to read, so export a cookies.txt on a normal machine and copy it over (the last tab above).

Cookies are fragile to automate

Session cookies expire, and YouTube invalidates them faster when it sees them used from a datacenter IP. Great for a one-off download; painful to keep alive in production.

Fix 3: Install a JavaScript runtime, and leave the player client alone

Current yt-dlp needs a JavaScript runtime (Deno by default) to solve YouTube's URL challenges. Without one, it falls back to fewer player clients, and the ones left are more likely to be challenged:

curl -fsSL https://deno.land/install.sh | sh
yt-dlp -v "https://www.youtube.com/watch?v=VIDEO_ID"

Older advice, including earlier versions of this page, says to force player_client=android. Don't do that with current yt-dlp. The Android client now needs a PO token for most formats and can't use cookies, so forcing it usually makes things worse. yt-dlp's default clients include ones that don't need a token. If the -v output warns that formats "require a GVS PO Token", install a PO Token provider plugin. yt-dlp not working covers that warning and the others like it.

Fix 4: Slow down

Bulk downloads are the fastest way to get flagged. Add pauses and rate limits:

yt-dlp --sleep-requests 2 --sleep-interval 5 --max-sleep-interval 15 --limit-rate 2M \
  "https://www.youtube.com/watch?v=VIDEO_ID"

Fix 5: Get off flagged IPs

If it only happens on a server, your IP reputation is the problem. Route through residential proxies, rotate IPs, or move the workload somewhere with cleaner reputation:

yt-dlp --proxy "http://user:pass@residential-proxy:port" "https://www.youtube.com/watch?v=VIDEO_ID"

Want to know if the video is even the problem?

Paste the URL — if our API returns a file, the video is fine and the block is on your setup.

Paste a link. See it work.

Paste a YouTube link, pick a format, and hit download.

When the fixes stop scaling

Each fix works for one download on one machine. In production, none of them stay fixed: yt-dlp needs re-updating every couple of weeks, cookies expire, player-client tricks change, and IPs get flagged. Teams that download YouTube programmatically end up maintaining a cookie-rotation-and-proxy side project instead of shipping their own product.

Never see this error again.

Vid Kraken, our YouTube download API, handles bot detection, proxies and YouTube's changes on our side. Send a URL, get a direct download from our CDN — no sign-in prompts, no maintenance.

Start free

Quick reference

SituationFirst thing to try
Happens on every videoUpdate yt-dlp (yt-dlp -U)
Only age/members-only videos--cookies-from-browser
Only on a server / cloud hostFlagged IP — residential proxy
During bulk downloads--sleep-interval + --limit-rate
Still stuck after updatingInstall Deno, then a PO Token provider plugin

Frequently asked questions

Why does yt-dlp work on my laptop but not on my server?+

Datacenter IPs (AWS, GCP, Azure, most VPS providers) are heavily bot-flagged, so YouTube challenges them far more often than a home connection. The same command can succeed locally and fail on a server purely because of IP reputation.

Is it safe to use my main Google account's cookies?+

Using cookies ties the downloads to that account, and heavy automated use from a flagged IP can get the account rate-limited or challenged. For anything beyond occasional use, prefer a throwaway account or a managed API.

Do I have to keep updating yt-dlp forever?+

With self-hosted yt-dlp, effectively yes — YouTube's changes guarantee recurring breakage, so you re-update, re-export cookies, and adjust flags on an ongoing basis. A managed API absorbs that maintenance instead.