Tutorial · HLS · DevTools
How to Find the M3U8 URL of Any Video Stream (2026)
A 60-second DevTools workflow to capture the M3U8 URL of any HLS video, including private streams that require cookies or a Referer header. Chrome, Edge, Firefox.
Finding the M3U8 URL of a video stream is the first step in any manual HLS download workflow. ffmpeg, yt-dlp, VLC, every command-line tool starts with that URL. The good news is that capturing it takes about 60 seconds with browser DevTools, and the same workflow works on Chrome, Edge, Brave, Vivaldi, Opera, and Firefox. The bad news is that some players make it slightly harder than others, and the playlist URL can expire silently. This guide covers both.
If you have never opened DevTools or you are unsure what an M3U8 file actually is, our M3U8 explainer covers the format end to end. The rest of this article assumes you can open DevTools.
1. Why you might need the M3U8 URL
Most readers land here for one of three reasons:
- To download the video with ffmpeg or yt-dlp. Both tools take an M3U8 URL as input and download the segments. See our M3U8 to MP4 guide for the full command lines.
- To play the stream in VLC, mpv, or another desktop player. Drag and drop a copied M3U8 URL into VLC and it plays. Useful when the source page is heavy or annoying.
- To debug a custom player or LMS. Developers building HLS players or troubleshooting playback issues need to verify the manifest is well-formed.
For all three, the workflow is the same: capture the URL from the Network tab, then act on it.
2. Method 1: Chrome DevTools (recommended)
Chrome covers about 65 percent of desktop browsers and the same workflow works on Edge, Brave, Opera, and Vivaldi. The Network tab is the most reliable place to capture playlist URLs.
Step-by-step
- Open the page that hosts the video. Do not press play yet.
- Open DevTools: press F12 on Windows or Linux, Cmd + Opt + I on Mac. You can also right-click anywhere on the page and choose Inspect.
- Switch to the Network tab at the top of DevTools.
- In the filter bar (just below the toolbar), type
m3u8. This filters every request to those whose URL contains m3u8. - Now press play on the video. Within a second, one or more M3U8 requests appear in the filtered list. The first one is usually the master playlist.
- Click the request to inspect it. The Headers tab shows the URL, the Response tab shows the playlist content.
- Right-click the request and choose Copy > Copy link address. The full URL with any query parameters is now in your clipboard.
Capturing cookies and headers (for private streams)
If the M3U8 URL needs authentication, copying the URL alone is not enough. ffmpeg or yt-dlp will get a 403 Forbidden when they request it without your session cookies. The fix is to capture the full request as cURL:
- Right-click the M3U8 request in the Network tab.
- Choose Copy > Copy as cURL (or Copy as cURL (bash) on Windows).
- Paste it into your terminal. You now have a one-liner that includes the URL, the Cookie header, the Referer, and any other custom headers the player used.
To turn that cURL command into an ffmpeg command, replace curl 'URL' with ffmpeg -headers $'Header1: value\r\nHeader2: value\r\n' -i 'URL' -c copy output.mp4. Tedious but reliable.
3. Method 2: Firefox Developer Tools
Firefox's developer tools follow the same workflow with slightly different naming.
- Open the page (without playing yet).
- Press F12 or Cmd + Opt + I on Mac.
- Click the Network tab.
- Type
m3u8in the URL filter at the top of the request list. - Press play on the video. The playlist request appears.
- Right-click the request and choose Copy > Copy URL for the bare URL, or Copy > Copy as cURL for the full request with headers.
Firefox sometimes labels HLS playlists as application/x-mpegurl or application/vnd.apple.mpegurl. The Type column shows the MIME, which is a quick way to confirm you have the right request. The official MIME types for HLS are documented on MDN.
4. The browser extension shortcut
If you find yourself capturing M3U8 URLs more than once a month, a browser extension automates the entire workflow. Instead of opening DevTools, filtering, copying URLs, and pasting them into ffmpeg, the extension detects the playlist when playback starts, captures the headers from your active session, and offers a one-click download.
Why this is the right move for most users
- The extension runs inside your authenticated session. Cookies, Referer, and any custom headers are inherited automatically.
- The M3U8 detection is automatic. No filtering, no scrolling through hundreds of requests on a heavy page.
- The extension can also handle the conversion to MP4, including AES-128 decryption if the stream is encrypted.
Vidora is the option we build, optimized specifically for Vimeo, Bunny.net, HLS streams, and MP4 sources. For a deeper comparison of detection methods, see the Bunny.net guide and the Vimeo guide, which cover platform-specific quirks.
5. How to read the M3U8 to pick the right quality
Once you have the M3U8 URL, opening it in a browser tab (or piping it through curl in a terminal) shows the playlist content. Two structures are common.
Master playlist
A master playlist lists multiple quality renditions, each pointing to a separate media playlist. It looks like this:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2425000,RESOLUTION=1280x720,CODECS="avc1.4d401f,mp4a.40.2"
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=4585000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2"
1080p/playlist.m3u8
Each EXT-X-STREAM-INF line describes a quality, and the next line is the URL of that quality's media playlist. Pass the master playlist URL to ffmpeg or yt-dlp and they pick the highest quality automatically. Pass the specific 1080p media playlist URL if you want to force that resolution.
Media playlist
A media playlist contains the actual segment URLs:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:9.96,
seg-001.ts
#EXTINF:9.92,
seg-002.ts
...
#EXT-X-ENDLIST
The #EXT-X-ENDLIST tag at the bottom indicates a complete VOD playlist. Live streams omit this tag and keep updating the playlist as new segments become available. ffmpeg and yt-dlp handle both cases.
6. Common gotchas
The M3U8 URL changes every time you reload
Most CDNs use signed URLs with a short-lived token. The token is part of the URL or a query parameter, and it expires within minutes to hours. If you save an M3U8 URL today, it may not work tomorrow. Capture fresh URLs each time, or use a tool that re-fetches the playlist as needed.
The Network tab is empty after pressing play
Either the page uses Service Workers that intercept requests (rare), or the request fired before you opened DevTools. Reload the page with DevTools already open and the request is captured from the start.
The M3U8 URL works in browser but fails in ffmpeg
The CDN requires a Referer header. Capture the request as cURL to get the headers, then forward them to ffmpeg with -headers. This is the single most common cause of "URL works in VLC but fails on the command line".
The captured URL is for a single segment, not the playlist
Your filter caught a .ts or .m4s request before the playlist scrolled into view. Reload, filter strictly by m3u8, and capture the first request that matches.
The page never requests an M3U8
The video might be served as a single MP4 file (progressive download) rather than HLS. Filter by .mp4 in the Network tab. If you find an MP4 request that returns a video stream, copy its URL the same way. Some sites also use DASH (.mpd), which is a different format covered in our M3U8 explainer.
7. Frequently asked questions
What is an M3U8 URL?
It is the address of a playlist file that lists the video segments of an HLS stream. The browser fetches it once when playback starts, then downloads the segments listed inside it. Capturing this URL is the first step in any manual HLS workflow.
Why can I not see the M3U8 in the Network tab?
Either the player has not requested it yet (press play to trigger) or the playlist was loaded as a data URI inline in JavaScript (rare). For the second case, search the page source for the m3u8 string instead.
Master playlist vs media playlist, what is the difference?
A master playlist lists multiple quality renditions, each pointing to its own media playlist. A media playlist contains the segment URLs. ffmpeg accepts either: with the master, it picks the highest available quality automatically.
Can I use the M3U8 URL outside the browser?
Sometimes. Public unauthenticated URLs work anywhere. Signed URLs with tokens work until expiration (often 30 minutes to a few hours). URLs that need cookies or Referer require those headers passed explicitly. Copy as cURL captures everything.
Why does my M3U8 URL stop working after some time?
CDNs use signed URLs with short lifetimes to prevent hotlinking. Once the token expires, the URL returns 403. Re-capture from a fresh playback if you need it again. Browser extensions sidestep this by re-fetching as needed.
Does this work on mobile browsers?
Mobile DevTools are limited. The reliable workflow is to open the same page on desktop with the same login, capture there, then use the URL from the desktop session. iOS Safari has a remote debugging mode that connects to a Mac, which works but is fiddly.
About the author
RGC Digital LLC builds Vidora, a Pro video downloader Chrome extension for Vimeo, Bunny.net, HLS streams, and MP4. Based in Albuquerque, NM. We write about video tooling, streaming protocols, and Chrome extension engineering.