---
title: yt-dlp Not Working? Every Common YouTube Error and How to Fix It (2026)
description: 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.
url: https://vidkraken.com/blog/yt-dlp-not-working
author: Vid Kraken
published: '2026-10-27'
---

# 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 · Published 2026-10-27

Source: https://vidkraken.com/blog/yt-dlp-not-working

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](https://deno.com) 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

1. **Update yt-dlp**

   YouTube changes often, and fixes only reach you in new releases. Run `yt-dlp -U` for the standalone binary, or `python3 -m pip install -U "yt-dlp[default]"` if you installed with pip. Package managers like `apt` are often weeks behind. See [how to update yt-dlp](https://vidkraken.com/blog/how-to-update-yt-dlp) for every install method.

2. **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.

3. **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`; `none` means 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](https://vidkraken.com/blog/yt-dlp-403-forbidden)         |
| `Sign in to confirm you're not a bot`                                                                        | YouTube flagged your IP or session                      | [Fixing the bot check](https://vidkraken.com/blog/yt-dlp-sign-in-to-confirm-not-a-bot) |
| `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"

```text
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:

```bash
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:

```bash
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

```text
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.
```

```text
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`.

**Deno (default)**

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

**Use Node instead**

```bash
yt-dlp --js-runtimes node "https://www.youtube.com/watch?v=VIDEO_ID"
```

**pip install**

```bash
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](https://github.com/yt-dlp/yt-dlp/wiki/EJS) 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:

```text
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](https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guide) lists the options.

```text
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](https://vidkraken.com/blog/yt-dlp-sign-in-to-confirm-not-a-bot) 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](https://vidkraken.com/blog/youtube-download-api-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`:

```bash
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 a `cookies.txt` from 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](https://github.com/yt-dlp/yt-dlp/wiki/Extractors#exporting-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:

```bash
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](https://vidkraken.com/blog/yt-dlp-commands) has more rate-limiting options.

## "ffmpeg not found"

```text
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:

**Ubuntu/Debian**

```bash
sudo apt install ffmpeg
```

**macOS**

```bash
brew install ffmpeg
```

**Custom path**

```bash
yt-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:

```bash
yt-dlp --update-to nightly
```

If that fails too, search the [yt-dlp issue tracker](https://github.com/yt-dlp/yt-dlp/issues) 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](https://vidkraken.com/blog/yt-dlp-403-forbidden) and the [bot check guide](https://vidkraken.com/blog/yt-dlp-sign-in-to-confirm-not-a-bot) 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](https://vidkraken.com/blog/youtube-download-api-error-codes) such as `AGE_RESTRICTED` or `GEO_RESTRICTED`, instead of a message to parse.

> **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.
>
> [Start free](https://vidkraken.com/login)

## 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.
