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.
Can provide more logs if needed. Thanks in advance!
[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
Checklist
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
-vUbecause 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=1but 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
yt-dlp -vU <your command line>)'verbose': TruetoYoutubeDLparams instead[debug] Command-line config) and insert it belowComplete Verbose Output