Skip to content

[YouTube] Intermittent "HTTP Error 403: Forbidden" when downloading videos #17395

Description

@BillyCool

Checklist

  • I've read the NO AI / NO LLM POLICY and understand I may be blocked from the repository if it is violated
  • I'm reporting that yt-dlp is broken on a supported site
  • I've verified that I have updated yt-dlp to nightly or master (update instructions)
  • I've checked that all provided URLs are playable in a browser with the same IP and same login details
  • I've checked that all URLs and arguments with special characters are properly quoted or escaped
  • I've searched known issues, the FAQ, and the bugtracker for similar issues including closed ones. DO NOT post duplicates
  • I've read about sharing account credentials and I'm willing to share it if required

Region

Australia

Provide a description that is worded well enough to be understood

Lately noticed a lot of my videos intermittently fail to download with ERROR: unable to download video data: HTTP Error 403: Forbidden. The same videos will download successfully after a few retries without me changing anything. Issue is present on both Windows and Linux (Docker), with VPN on or off (off here), account cookies on or off (off here) has been going on for a few weeks now.

Tried searching through similar issues raised but didn't find any working solutions. I am not using -vU because my app that integrates with yt-dlp checks for updates on every startup so checking again on every download is redundant. I am on the latest nightly version at the time of writing. Yes, the video is playable on my browser, with and without account, across multiple browsers.

I am attached some log files for recent single video, each log is a download attempt via a separate terminal/process, attempts happened back to back. Only thing altered in the logs is my IP for safety. One thing that stood out to me is that all failing logs have this query parameter siu=1 but I don't know what it is, maybe it helps someone who does.

Example of a video with account cookies off:
iQZ81MbjKpU-20260808-195246-failed-redacted.log
iQZ81MbjKpU-20260808-195607-success-redacted.log

Example of a different video with account cookies on:
rg3aBTjsUms-20260808-200652-failed-redacted.log
rg3aBTjsUms-20260808-200734-failed-redacted.log
rg3aBTjsUms-20260808-200910-success-redacted.log

Can provide more logs if needed. Thanks in advance!

Provide verbose output that clearly demonstrates the problem

  • Run your yt-dlp command with -vU flag added (yt-dlp -vU <your command line>)
  • If using API, add 'verbose': True to YoutubeDL params instead
  • Copy the WHOLE output (starting with [debug] Command-line config) and insert it below

Complete Verbose Output

[debug] Command-line config: ['--extractor-args', 'youtubepot-bgutilhttp:base_url=http://host.docker.internal:4416', '-P', '/media/youtube/People/LaurieWired', '-P', 'temp:/media/youtube/.temp', '-S', 'res:1080', '-f', 'bv*[fps<=60]+ba/b', 'https://www.youtube.com/watch?v=iQZ81MbjKpU']
[debug] System config "/etc/yt-dlp.conf": ['--no-js-runtimes', '--js-runtimes', 'node', '--live-from-start', '--no-playlist', '--concurrent-fragments', '4', '--output', '%(channel)s - %(upload_date>%Y-%m-%d)s - %(title)s.%(ext)s', '--output', 'subtitle:Subtitles/%(id)s.%(ext)s', '--output', 'thumbnail:Thumbnails/%(id)s.%(ext)s', '--windows-filenames', '--force-overwrites', '--write-thumbnail', '--write-subs', '--write-auto-subs', '--sub-format', 'vtt', '--sub-langs', '.*-orig', '--embed-subs', '--embed-thumbnail', '--embed-metadata', '--embed-chapters', '--extractor-args', 'youtube:player-client=mweb', '-t', 'sleep', '--force-ipv4', '--verbose']
[debug] Encodings: locale utf-8, fs utf-8, pref utf-8, out utf-8 (No ANSI), error utf-8 (No ANSI), screen utf-8 (No ANSI)
[debug] yt-dlp version nightly@2026.08.04.234419 from yt-dlp/yt-dlp-nightly-builds (linux_exe)
[debug] Python 3.14.6 (CPython x86_64 64bit) - Linux-6.6.87.2-microsoft-standard-WSL2-x86_64-with-glibc2.39 (OpenSSL 3.5.7 9 Jun 2026, glibc 2.39)
[debug] exe versions: ffmpeg 6.1.1 (setts), ffprobe 6.1.1
[debug] Optional libraries: Cryptodome-3.23.0, brotli-1.2.0, certifi-2026.06.17, curl_cffi-0.15.0, mutagen-1.48.1, requests-2.34.2, secretstorage-3.5.0, sqlite3-3.53.3, urllib3-2.7.0, websockets-16.0, yt_dlp_ejs-0.8.0
[debug] JS runtimes: node-22.23.2
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Plugin directories: /etc/yt-dlp/plugins/bgutil-ytdlp-pot-provider/yt_dlp_plugins
[debug] Loaded 1744 extractors
[debug] [youtube] [pot:bgutil:script-node] No server_home or script_path passed, defaulting to /root/bgutil-ytdlp-pot-provider/server
[debug] [youtube] [pot:bgutil:script-node] Script path doesn't exist: /root/bgutil-ytdlp-pot-provider/server/build/generate_once.js
[debug] [youtube] [pot:bgutil:script-deno] No server_home or script_path passed, defaulting to /root/bgutil-ytdlp-pot-provider/server
[debug] [youtube] [pot:bgutil:script-deno] Script path doesn't exist: /root/bgutil-ytdlp-pot-provider/server/src/generate_once.ts
[debug] [youtube] [pot] PO Token Providers: bgutil:http-1.3.1 (external), bgutil:script-node-1.3.1 (external, unavailable), bgutil:script-deno-1.3.1 (external, unavailable)
[debug] [youtube] [pot] PO Token Cache Providers: memory
[debug] [youtube] [pot] PO Token Cache Spec Providers: webpo
[debug] [youtube] [jsc] JS Challenge Providers: bun (unavailable), deno (unavailable), node, quickjs (unavailable)
[youtube] Extracting URL: https://www.youtube.com/watch?v=iQZ81MbjKpU
[youtube] iQZ81MbjKpU: Downloading webpage
[youtube] Sleeping 0.75 seconds ...
[youtube] iQZ81MbjKpU: Downloading mweb client config
[debug] [youtube] Forcing "main" player JS variant for player 854a788e
        original url = /s/player/854a788e/player_es6.vflset/en_US/base.js
[debug] [youtube] iQZ81MbjKpU: Detected experiment to bind GVS PO Token to video ID for mweb client
[youtube] Sleeping 0.75 seconds ...
[youtube] iQZ81MbjKpU: Downloading mweb player API JSON
[debug] [youtube] iQZ81MbjKpU: Detected a 6s ad skippable after 5s for mweb
[youtube] [pot:bgutil:http] Generating a gvs PO Token for mweb client via bgutil HTTP server
[debug] [youtube] iQZ81MbjKpU: Retrieved a gvs PO Token for mweb client
[youtube] Sleeping 0.75 seconds ...
[youtube] iQZ81MbjKpU: Downloading player 854a788e-main
[youtube] [jsc:node] Solving JS challenges using node
[debug] [youtube] [jsc:node] Using challenge solver lib script v0.8.0 (source: python package, variant: minified)
[debug] [youtube] [jsc:node] Using challenge solver core script v0.8.0 (source: python package, variant: minified)
[debug] [youtube] [jsc:node] Running node: node --experimental-permission --no-warnings=ExperimentalWarning -
[debug] [youtube] iQZ81MbjKpU: Retrieved a subs PO Token for mweb client
[info] iQZ81MbjKpU: Downloading subtitles: en-orig
[debug] Sort order given by user: res:1080
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, res:1080(1080.0), quality, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[info] iQZ81MbjKpU: Downloading 1 format(s): 399+251
[info] Writing video subtitles to: /media/youtube/.temp/LaurieWired - 2025-07-01 - grep isn't what you think it means....en-orig.vtt
[debug] Invoking http downloader on "https://www.youtube.com/api/timedtext?v=iQZ81MbjKpU&ei=8Ih3aoScH_TfssUPva_H4Qc&caps=asr&opi=112496729&exp=xpe&xoaf=5&xowf=1&hl=en&ip=0.0.0.0&ipbits=0&expire=1786243936&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cexp%2Cxoaf&signature=A7915111CB91444BC076EB29AC14CB3271BEA94B.D062EE4886EB404406DB20840772F3CE1560C430&key=yt8&kind=asr&lang=en&pot=MlsA8FSRn4MzegC0VOtZTPDY48tUPJsr87OVfGiOGEdJCj3HhE-B90BU6Z2q9q4AukKbXzDPU0zFmlBLMWO5U86lQppTAyioZ9xdjqNi8XJQKt6sTYd6ggqp55Di&potc=1&c=MWEB&fmt=vtt"
[download] Sleeping 5.00 seconds ...
[download] Destination: /media/youtube/.temp/LaurieWired - 2025-07-01 - grep isn't what you think it means....en-orig.vtt

[download]    1.00KiB at  299.04KiB/s (00:00:00)
[download]    3.00KiB at  748.85KiB/s (00:00:00)
[download]    7.00KiB at    1.55MiB/s (00:00:00)
[download]   15.00KiB at    2.94MiB/s (00:00:00)
[download]   31.00KiB at    5.50MiB/s (00:00:00)
[download]   63.00KiB at    9.53MiB/s (00:00:00)
[download]   98.29KiB at   10.25MiB/s (00:00:00)
[download] 100% of   98.29KiB in 00:00:00 at 349.43KiB/s
[info] Downloading video thumbnail 42 ...
[info] Writing video thumbnail 42 to: /media/youtube/.temp/LaurieWired - 2025-07-01 - grep isn't what you think it means....webp
WARNING: webm doesn't support embedding a thumbnail, mkv will be used
[download] Sleeping 16.52 seconds ...
[debug] Invoking http downloader on "https://rr1---sn-ajhxac-5c.googlevideo.com/videoplayback?expire=1786240336&ei=8Ih3aoScH_TfssUPva_H4Qc&ip=192.168.1.1&id=o-ADvkTzlR8CQWJJbj1ZefmoPyE86t8EpbtOaDc4AwOiTz&itag=399&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C271%2C278%2C313%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C598&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&cps=246&met=1786218736%2C&mh=Y3&mm=31%2C26&mn=sn-ajhxac-5c%2Csn-u1ntq5-52&ms=au%2Conr&mv=m&mvi=1&pl=22&rms=au%2Cau&initcwndbps=2720000&bui=AZFlqhOQ4RUQqr3EzxbnUY4dOtMPmolGP1kpvbgV7b10i8FN7iiClhOh0wiJB0lUX0mkhdn6GGx7kfIT&spc=KBGBcq-1KpjvlFcgXU0GZY-VK0DBuSuvNnE6f5v-C8cJFKjpiXlfC4-7_aFahxjc274d1qBoDq65lkJEOfzxDlJnx2c&vprv=1&svpuc=1&mime=video%2Fmp4&ns=8qPTRflZg6SFsJ7qMNxNCO8X&rqh=1&gir=yes&clen=82990296&dur=692.358&lmt=1751625787822220&mt=1786218300&fvip=1&keepalive=yes&fexp=51565116%2C51973818%2C52089683&c=MWEB&sefc=1&txp=5537534&n=SxGPabqXCFXbGw&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AE0s2JYwRAIgXTA6FJ-cI_h0seVPdDJ2Uyrmlq4ZXUssNnwFIYRTLfACICYM5dME3b9hsH-WdxF6AOoeRNx9mkKAQ4RrEwqkeNtR&lsparams=cps%2Cmet%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwndbps&lsig=APaTxxMwRgIhAIcaF3vBJY7GeOftB3WUorKX3iCle_cnKYwxdAZqYFKVAiEAqhrsvtwRfEfS5xvrai_qaIg3IeqYD5rgwn57reAfB-Y%3D&pot=MlsA8FSRn4MzegC0VOtZTPDY48tUPJsr87OVfGiOGEdJCj3HhE-B90BU6Z2q9q4AukKbXzDPU0zFmlBLMWO5U86lQppTAyioZ9xdjqNi8XJQKt6sTYd6ggqp55Di"
ERROR: unable to download video data: HTTP Error 403: Forbidden
Traceback (most recent call last):
  File "yt_dlp/YoutubeDL.py", line 3571, in process_info
  File "yt_dlp/YoutubeDL.py", line 3324, in dl
  File "yt_dlp/downloader/common.py", line 480, in download
  File "yt_dlp/downloader/http.py", line 362, in real_download
  File "yt_dlp/downloader/http.py", line 119, in establish_connection
  File "yt_dlp/YoutubeDL.py", line 4305, in urlopen
  File "yt_dlp/networking/common.py", line 117, in send
  File "yt_dlp/networking/_helper.py", line 194, in wrapper
  File "yt_dlp/networking/common.py", line 359, in send
  File "yt_dlp/networking/_requests.py", line 361, in _send
yt_dlp.networking.exceptions.HTTPError: HTTP Error 403: Forbidden

Metadata

Metadata

Assignees

No one assigned

    Labels

    duplicateThis issue or pull request already existsexternal-issueIssue with an external tool or site

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions