yt-dlp “HTTP Error 404: Not Found” — what it means and how to fix each cause
By Tunelio teamPublished
A 404 from yt-dlp means the thing it asked for does not exist at that address any more. Usually that is the video: deleted, made private, or a mistyped ID. Sometimes it is a media fragment whose signed URL expired, a playlist entry that was removed, or an outdated yt-dlp asking for an endpoint YouTube moved. Check the URL in a browser, update yt-dlp, and read the -v output — the section below tells you which case you have.
First, two commands
yt-dlp -U # an outdated build 404s on endpoints YouTube has moved
yt-dlp -vU --rm-cache-dir "URL" # verbose: WHERE did the 404 happen — info page, API call, or media fragment?Then open the same URL in a browser. If the browser also shows “Video unavailable”, no yt-dlp option will help; if the browser plays it, the cause is one of the technical ones below.
Cause 1: the video is gone, private or the ID is wrong
The most common 404. Videos get deleted by uploaders, removed for policy reasons, or switched to private or unlisted-with-restrictions. A video ID is exactly 11 characters (letters, digits, - and _); a copied URL with a trailing character, a missing character or tracking junk inside the ID gives a clean 404. yt-dlp usually reports these as “Video unavailable”, “This video has been removed” or “Private video” rather than a raw 404, but some paths surface the HTTP status directly.
# normalise the URL yourself: watch?v=ID, youtu.be/ID, shorts/ID all work
yt-dlp "https://www.youtube.com/watch?v=dQw4w9WgXcQ"Private videos shared with your account need cookies from that account (see the cookies guide); age-restricted videos give a different error and also want cookies or another client.
Cause 2: the media URL expired (404 mid-download or on fragments)
The googlevideo URLs yt-dlp receives are signed and valid for roughly six hours. If a download is paused, resumed much later, or a script extracted the URL and used it hours afterwards, the media server answers 404 (or 403). Fragmented formats show this as “fragment N not found”. Re-run the extraction — yt-dlp -c resumes the file with fresh URLs.
yt-dlp -c --fragment-retries 10 --retries 5 "URL"Cause 3: a playlist or channel contains removed items
yt-dlp --ignore-errors --download-archive done.txt "PLAYLIST_URL"Playlists keep references to videos that no longer exist. Without --ignore-errors (-i) yt-dlp aborts the whole run at the first dead entry; with it, the entry is skipped and logged. --download-archive makes reruns incremental so you do not re-hit the same dead items every time.
Cause 4: outdated yt-dlp hitting a moved endpoint
YouTube changes internal API paths and player asset locations. A months-old yt-dlp can request a player JS file or an API route that no longer exists and report the resulting 404 as an extraction failure. This is fixed only by updating (see the update guide) — and check that the copy on your PATH is the one you updated.
Cause 5: region and account restrictions that surface as 404
Some region-blocked or members-only videos return “not available” pages that a few code paths report as 404. Try from another network or with a proxy (proxy guide) for region blocks; members-only content needs cookies from a subscribed account.
Symptom → cause
- Browser also says unavailable → deleted/private/wrong ID (cause 1). Nothing to fix on your side.
- Browser plays it; -v shows 404 on a player/API URL → outdated yt-dlp (cause 4).
- Download starts, then 404 on fragments or after a resume → expired signed URL (cause 2); re-extract with -c.
- Only some playlist items fail → removed entries (cause 3); add --ignore-errors.
- Fails only from the server, works at home → region/IP (cause 5) — or a 403 misread; see the 403 guide.
In a script or bot
Treat 404 as a permanent failure for that video (do not retry in a loop — retries do nothing for a deleted video and burn your IP reputation), log the video ID and the exact message, and move on. If you resolve URLs ahead of time, always re-resolve before downloading rather than caching signed links.
A hosted API does that classification for you: Tunelio (our own service) returns a clear 404 with a message for private or removed videos and refunds the request, so your bot can answer the user without parsing yt-dlp output. New accounts get 100 free credits.
Sources
- yt-dlp README — Download options (-c, --fragment-retries, --retries), --ignore-errors, --download-archive.
- yt-dlp wiki — FAQ on “Video unavailable” and outdated versions.
- yt-dlp issue tracker — 404 reports tied to expired fragment URLs and moved player assets.
Frequently asked questions
Does 404 mean my IP is blocked?
No — blocks show up as 403 or a bot-check message. 404 means the resource does not exist at that URL: usually a deleted/private video, an expired media link, or an outdated yt-dlp asking for a moved endpoint.
How do I download a private video with yt-dlp?
Only if your account can see it: pass that account’s cookies (--cookies cookies.txt exported from a private window). Otherwise it stays 404/unavailable.
Why does a playlist stop at a 404?
By default yt-dlp aborts on the first error. Add --ignore-errors to skip dead entries and --download-archive to make reruns incremental.
The video played yesterday and 404s today — what changed?
Either the uploader removed or privatised it, or you reused a signed media URL that expired (~6 h). Re-run the extraction; if the browser also fails, the video is gone.