How to update yt-dlp — every install method, plus nightly and why it matters
By Tunelio teamPublished
yt-dlp breaks when YouTube changes its player, and YouTube changes it every few weeks. Keeping yt-dlp current fixes more “403”, “bot check” and “unable to extract” errors than any flag. The command depends on how you installed it: yt-dlp -U for the binary, pip install -U yt-dlp for pip, brew upgrade yt-dlp on Homebrew, winget upgrade yt-dlp on Windows. Details, channels and automation below.
First: find out how yt-dlp was installed
yt-dlp --version # e.g. 2026.08.12 — dates, not semver
which yt-dlp # /usr/local/bin → binary, ~/.local/bin or venv → pip, /opt/homebrew → brew
pip show yt-dlp 2>/dev/null | head -2The version is a date. If it is more than a month old, update before debugging anything else. Updating with the wrong method (pip on top of a distro package, for example) leaves two copies and the old one keeps running — the single most common reason “I updated but it still fails”.
Update by install method
Official binary (Linux, macOS, Windows exe)
yt-dlp -U # self-update to the latest stable release
yt-dlp --update-to nightly # switch to the nightly channel (recommended when stable lags)
yt-dlp --update-to stable # go back
yt-dlp --update-to master # bleeding edge, built from every commitThe self-updater replaces the executable in place; on Linux/macOS the file must be writable by you (use sudo only if you installed it as root). The nightly channel is the maintainers’ recommended choice when YouTube has just changed something and the fix is merged but not yet in a stable release.
pip / pipx
python3 -m pip install -U "yt-dlp[default]" # stable + recommended extras (curl_cffi, etc.)
python3 -m pip install -U --pre "yt-dlp[default]" # nightly pre-releases
pipx upgrade yt-dlp # if installed with pipxyt-dlp -U does not work for pip installs (it tells you so). Use the same interpreter that runs yt-dlp — python3 -m pip avoids updating a different Python. The [default] extra pulls in optional dependencies such as curl_cffi for browser impersonation.
Homebrew (macOS/Linux)
brew update && brew upgrade yt-dlpWindows: winget, scoop, choco
winget upgrade yt-dlp
scoop update yt-dlp
choco upgrade yt-dlpLinux distro packages (apt, dnf, pacman)
Debian/Ubuntu and most distro repositories ship yt-dlp months behind upstream, which for YouTube means broken. Either remove the package and install the official binary or pip version, or accept that it will fail regularly. Arch’s package tracks upstream closely; Ubuntu’s does not.
sudo apt remove yt-dlp
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlpDocker
# rebuild without cache so the pip layer re-resolves the latest version
docker build --no-cache -t yt-dlp-image .
# or pin explicitly in the Dockerfile: pip install "yt-dlp[default]==2026.9.1"Containers freeze the version at build time, so “updating” means rebuilding. Add ffmpeg and a JavaScript runtime (Deno) to the image; both are required for full YouTube support today.
Don’t forget the JavaScript runtime and ffmpeg
Since 2025 yt-dlp needs an external JS runtime to solve YouTube’s signature challenges — updating yt-dlp alone is not enough if Deno (or Node/Bun) is missing. ffmpeg is needed to merge video and audio for 1080p+ and to convert audio. Check both with yt-dlp -v: the debug header lists the runtime and ffmpeg it found.
Automate it
# cron: update every night at 04:00 (binary install)
0 4 * * * /usr/local/bin/yt-dlp -U >/var/log/yt-dlp-update.log 2>&1
# in a script: update, then run
yt-dlp -U >/dev/null 2>&1 || true
yt-dlp "$URL"For anything unattended, a nightly update is cheaper than a 3 a.m. outage. Log the version with every failure so you can tell a YouTube change from a bug in your own code.
Why old builds break
YouTube’s player JavaScript computes the signature and the “n” parameter every media URL must carry. When the player changes, an old yt-dlp computes them wrong and downloads fail with 403 Forbidden, throttle to a few KB/s, or lose formats entirely. Bot-check heuristics and the list of trusted player clients also move. None of this is fixable from your side except by updating — that is why the maintainers ask for a current version before looking at any bug report.
If updating did not fix it
- Run yt-dlp -vU and read the first lines: version, runtime, ffmpeg, and any “WARNING” about missing components.
- Make sure the updated copy is the one on your PATH (which yt-dlp).
- Then work through the 403 guide and the bot-check guide — after the version, the usual suspects are IP reputation, missing PO tokens and cookies.
Tired of updating?
If yt-dlp runs inside a product, every YouTube change becomes an emergency update. A hosted API absorbs those changes server-side and keeps one stable contract: GET /create with a URL returns a download link. Tunelio is our own service, so weigh the pitch accordingly; new accounts get 100 free credits.
Sources
- yt-dlp README — Installation, “Update” section, --update-to channels.
- yt-dlp wiki — Installation FAQ (distro packages, pip vs binary).
- yt-dlp releases — SHA2-256SUMS for verifying downloads.
Frequently asked questions
Why does yt-dlp -U say it cannot update?
You installed via pip, a package manager or a distro package. Use that tool instead: pip install -U yt-dlp, brew upgrade yt-dlp, winget upgrade yt-dlp, or reinstall the binary.
Should I use nightly?
Yes when YouTube just broke something and the fix is merged but not released — the maintainers recommend nightly for that. Switch with --update-to nightly or pip install -U --pre yt-dlp.
How do I check the current version?
yt-dlp --version prints a date like 2026.08.12. Anything older than about a month should be updated before troubleshooting.
Do I also need to update ffmpeg or Deno?
Rarely, but both must be present. yt-dlp -v shows which versions it found; missing ones cause lost formats and 403s.
Related guides
- yt-dlp 403 Forbidden: why it happens and the fix order that works →
- yt-dlp: "Sign in to confirm you're not a bot" — what it means and how to fix it →
- yt-dlp and ffmpeg: why you need it, how to install it, and the commands that use it →
- Using yt-dlp from Python: the embedded API, options, hooks and running it in a server →