yt-dlp Not Working? Every Common YouTube Error and How to Fix It (2026)
yt-dlp stopped working on YouTube? Find your exact error message (403 Forbidden, 'Sign in to confirm you're not a bot', 'Requested format is not available', n challenge failures, cookie and ffmpeg errors) and the fix for each.
Vid Kraken · Updated October 27, 2026
When yt-dlp stops working on YouTube, the cause is almost always one of four things: your yt-dlp is out of date, it has no JavaScript runtime, YouTube is blocking your IP or session, or the video itself is restricted. The error message tells you which one.
Short version: run yt-dlp -U, make sure Deno is installed, then re-run your command with -v and read the first ERROR: or WARNING: line. Find that message in the table below.
Start here: three checks that fix most failures
Update yt-dlp
YouTube changes often, and fixes only reach you in new releases. Run
yt-dlp -Ufor the standalone binary, orpython3 -m pip install -U "yt-dlp[default]"if you installed with pip. Package managers likeaptare often weeks behind. See how to update yt-dlp for every install method.Install a JavaScript runtime
Current yt-dlp needs an external JavaScript runtime to solve YouTube's challenges, and only Deno is enabled by default. Without one, many formats disappear. The official yt-dlp executables and the pip
yt-dlp[default]package already include the challenge solver scripts; you only need to install Deno itself.Run it with -v
yt-dlp -v "URL"prints your yt-dlp version, the JavaScript runtime it found (a line like[debug] JS runtimes: deno-2.x.x;nonemeans it found none) and the full error. Then open the video in a browser on the same network. If it plays there, the problem is your setup, not the video.
Find your error
| Message you see | What it means | Fix |
|---|---|---|
HTTP Error 403: Forbidden | YouTube refused the request for the video file | Fixing yt-dlp 403 Forbidden |
Sign in to confirm you're not a bot | YouTube flagged your IP or session | Fixing the bot check |
Requested format is not available | The format you asked for isn't in the list yt-dlp found | List formats with -F; see below |
n challenge solving failed, Signature solving failed or No supported JavaScript runtime could be found | yt-dlp couldn't run YouTube's JavaScript challenge | Install Deno and update |
formats require a GVS PO Token which was not provided | YouTube wants a proof-of-origin token for those formats | A PO Token provider plugin; see below |
formats have been skipped as they are missing a URL | YouTube is serving that client SABR streams only | See "PO tokens and SABR" below |
Video unavailable or This video is not available | Private, removed, region-locked, or your IP is blocked | Check in a browser first; see below |
Sign in to confirm your age | Age-restricted video | Cookies from an age-verified account |
HTTP Error 429: Too Many Requests | You're rate-limited | Slow down; see below |
Could not copy Chrome cookie database or Failed to decrypt with DPAPI | yt-dlp can't read Chrome's cookies on Windows | Close Chrome, or use Firefox or a cookies.txt |
The provided YouTube account cookies are no longer valid | YouTube rotated your cookies | Re-export them; see below |
ffprobe and ffmpeg not found | yt-dlp needs ffmpeg to merge video and audio | Install ffmpeg |
Unable to extract … | yt-dlp's YouTube code no longer matches YouTube | Update, then try the nightly build |
"Requested format is not available"
ERROR: [youtube] VIDEO_ID: Requested format is not available. Use --list-formats for a list of available formats
This has two quite different causes, and -F tells them apart:
yt-dlp -F "https://www.youtube.com/watch?v=VIDEO_ID"
The list is full, but your format isn't in it. Your -f selector asks for something this video doesn't have, such as a fixed format ID or a 4K stream on a 1080p video. Use a selector with fallbacks instead of exact IDs:
yt-dlp -f "bv*[height<=1080]+ba/b[height<=1080]/b" "https://www.youtube.com/watch?v=VIDEO_ID"
Or drop -f entirely and let yt-dlp pick the best available format.
The list is nearly empty. If -F shows only storyboard images (sb0 to sb3), maybe with format 18 (360p MP4), your selector isn't the problem. yt-dlp could only see a few formats. That's the same reason yt-dlp sometimes downloads only 360p. The usual causes are a missing JavaScript runtime, a missing PO token, or SABR streaming, covered in the next two sections. Check the warnings printed above the error.
"n challenge solving failed" and missing JavaScript runtimes
WARNING: [youtube] VIDEO_ID: n challenge solving failed: Some formats may be missing. Ensure you have a supported JavaScript runtime and challenge solver script distribution installed.
WARNING: No supported JavaScript runtime could be found. Only deno is enabled by default; to use another runtime add --js-runtimes RUNTIME[:PATH] to your command/config.
YouTube scrambles its video URLs with JavaScript challenges. yt-dlp solves them by running YouTube's player code in a JavaScript runtime. Without one, it falls back to fewer clients and most formats go missing. Signature solving failed is the same problem for a second type of challenge. Older yt-dlp versions reported these failures as nsig extraction failed.
curl -fsSL https://deno.land/install.sh | sh
yt-dlp -v "https://www.youtube.com/watch?v=VIDEO_ID"yt-dlp --js-runtimes node "https://www.youtube.com/watch?v=VIDEO_ID"python3 -m pip install -U "yt-dlp[default]"yt-dlp also supports Node, QuickJS and Bun through --js-runtimes. If you installed with plain pip install yt-dlp, the solver scripts may be missing; reinstall with the [default] extra. yt-dlp's EJS wiki page has the details.
PO tokens and SABR: when formats get skipped
Two warnings mean YouTube is holding back formats from the client yt-dlp is using:
WARNING: [youtube] VIDEO_ID: CLIENT client https formats require a GVS PO Token which was not provided. They will be skipped as they may yield HTTP Error 403.
A PO (proof-of-origin) token is a token YouTube expects from some clients to prove the request comes from a real app. Without it, yt-dlp skips those formats rather than download files that would fail with 403. The fix is a PO Token provider plugin, which generates tokens automatically. yt-dlp's PO Token Guide lists the options.
WARNING: [youtube] VIDEO_ID: Some CLIENT client https formats have been skipped as they are missing a URL. YouTube may have enabled the SABR-only streaming experiment for the current session.
SABR is a streaming protocol YouTube uses in its own player, and yt-dlp can't download it. When YouTube serves a client only SABR streams, those formats have no download URL. If the message says "for your account", YouTube has put the signed-in account in that experiment. Refreshing its cookies won't help, but trying without cookies or with another account usually does.
"Video unavailable" and "This video is not available"
These usually describe the video, not your setup:
| Message | Meaning |
|---|---|
Private video | The owner made it private |
Video unavailable. This video has been removed | Deleted, by the uploader or YouTube |
The uploader has not made this video available in your country | Region-locked |
Join this channel to get access to members-only content | Members only |
Sign in to confirm your age | Age-restricted |
Before you change anything, open the video in a browser on the same network, signed out. If it plays there but yt-dlp says it's unavailable, YouTube is blocking your IP or session, and the bot check fixes apply. Some blocks show up as The page needs to be reloaded, which needs the same fixes.
If the video really is restricted:
- Region-locked: route through a proxy in a country where it plays, with
--proxy. - Age-restricted, private (shared with you) or members-only: pass cookies from an account that can watch it (see the next section).
- Removed: nothing will download it.
For a fuller guide to telling these apart, including how to check a video before you download it, see YouTube download error codes.
Cookie errors
yt-dlp asks for cookies when YouTube wants a signed-in viewer: for bot checks, age-restricted videos, and private or members-only content. You can read them straight from a browser or pass an exported cookies.txt:
yt-dlp --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"
yt-dlp --cookies cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"
Common cookie errors:
Could not copy Chrome cookie database: on Windows, Chrome locks its cookie file while it's running. Close Chrome completely, including background processes, or use Firefox.Failed to decrypt with DPAPI: recent Chrome versions on Windows encrypt cookies in a way yt-dlp can't read. Use Firefox, or export acookies.txtfrom the browser.The provided YouTube account cookies are no longer valid: YouTube rotates cookies in an open browser tab as a security measure, which invalidates your export. yt-dlp's guide recommends exporting them from a private window that you then close, so they stop rotating (how to export YouTube cookies).
Use a secondary account
yt-dlp's own documentation warns that downloading with your account's cookies can get the account flagged or banned. Don't use an account you can't afford to lose.
"HTTP Error 429: Too Many Requests"
YouTube is rate-limiting your IP. Space your requests out:
yt-dlp --sleep-requests 1 --sleep-interval 5 --max-sleep-interval 15 "https://www.youtube.com/watch?v=VIDEO_ID"
--sleep-requests pauses between requests while extracting; --sleep-interval and --max-sleep-interval add a random pause between downloads. For playlists and batches, also download one video at a time. The yt-dlp commands cheat sheet has more rate-limiting options.
"ffmpeg not found"
ERROR: You have requested merging of multiple formats but ffmpeg is not installed. Aborting due to --abort-on-error
YouTube serves high-quality video and audio as separate streams, and yt-dlp needs ffmpeg to merge them (and to convert audio to MP3). Install it, or point yt-dlp at it:
sudo apt install ffmpegbrew install ffmpegyt-dlp --ffmpeg-location /path/to/ffmpeg "https://www.youtube.com/watch?v=VIDEO_ID"Without ffmpeg, -f b downloads a single pre-merged file, but on YouTube that is usually only 360p.
"Unable to extract …"
An Unable to extract error means yt-dlp's YouTube code no longer matches what YouTube sends. Update first. If the latest release still fails, the fix may only be in the nightly build so far:
yt-dlp --update-to nightly
If that fails too, search the yt-dlp issue tracker for your message. Someone has usually reported it within hours. If you open a new issue, include the full -v output.
Works on your laptop, fails on a server
Datacenter IP ranges (AWS, GCP, Azure and most VPS providers) are heavily bot-flagged. The same command that works at home gets 403s, bot checks or Video unavailable from a server. The fixes are residential proxies, rotating IPs, or cookies, and all of them need ongoing upkeep. Both the 403 guide and the bot check guide cover the trade-offs.
When to stop debugging yt-dlp
If you download the occasional video for yourself, yt-dlp is the right tool, and the fixes above are worth the few minutes.
If yt-dlp runs inside a product, every fix on this page becomes something you maintain: version bumps, a JavaScript runtime, PO tokens, cookie rotation and proxy pools. All of it breaks again when YouTube changes. That's the work a managed API takes on. With Vid Kraken, bot checks and blocked requests are retried on our side, and what's left reaches you as a typed error code such as AGE_RESTRICTED or GEO_RESTRICTED, instead of a message to parse.
Is it your setup or the video?
Paste the URL. If our API returns a file, the video is fine and the problem is local.
Paste a link. See it work.
Paste a YouTube link, pick a format, and hit download.
Stop fixing yt-dlp in production.
Vid Kraken is a YouTube download API. Send a URL, get a direct download link. We keep yt-dlp, its JavaScript runtime, cookies and IPs working, so you don't have to.
Frequently asked questions
Why did yt-dlp suddenly stop working?+
Usually because YouTube changed something and your installed version can't handle it yet. Run yt-dlp -U (or upgrade with pip), make sure Deno is installed, and try again. If the newest release still fails, try the nightly build with yt-dlp --update-to nightly.
How do I see the real yt-dlp error?+
Run the same command with -v. Verbose output shows your yt-dlp version, the JavaScript runtime it found, and every warning before the final error. The first warning is often the real cause.
Why does yt-dlp only download 360p?+
If yt-dlp -F lists only storyboards and format 18, yt-dlp couldn't see the other formats. The usual causes are a missing JavaScript runtime, a missing PO token, or YouTube serving SABR-only streams. Install Deno, update yt-dlp, and read the warnings in the -v output.
Why is yt-dlp asking for cookies?+
YouTube wants a signed-in viewer, either because it flagged your IP as a bot or because the video is age-restricted, private or members-only. Pass --cookies-from-browser or --cookies, ideally from a secondary account.
Does a VPN fix yt-dlp errors?+
Only errors caused by your IP, such as bot checks, 403s and region locks. Most consumer VPNs exit from datacenter IPs that YouTube already flags, so results vary. A VPN won't fix an outdated yt-dlp, a missing JavaScript runtime, or ffmpeg errors.