Skip to content
curl-x
twittervideohlsm3u8formatdeveloper

Does Twitter Use HLS? How to Find the m3u8 Video URL

Yes — X streams tweet video as HLS (.m3u8 playlists) on video.twimg.com alongside progressive MP4 renditions. Learn to spot the m3u8 in DevTools and why curl-x resolves it to a direct MP4.

Share:

Want to try it now? Paste a post link from any supported platform to download its media instantly.

Open Downloader

Yes, Twitter/X streams video over HLS. When you play a tweet's video, the browser fetches a .m3u8 playlist from video.twimg.com that lists several MP4-segment variant streams at different resolutions and bitrates, then switches between them as bandwidth changes. The same post also has plain progressive MP4 renditions. curl-x resolves both into one direct MP4 download, so you never have to touch the playlist yourself.

Table of contents

How X actually serves tweet video

Twitter/X's video player is built on HTTP Live Streaming (HLS). Instead of handing the browser one file, it hands it a master playlist — a .m3u8 text file hosted on video.twimg.com — that points to several variant streams, each a different resolution/bitrate encode of the same clip, broken into small .ts or fragmented-MP4 segments. The player picks a variant based on connection speed and screen size and switches mid-playback if conditions change, which is why a video can look sharper or softer a few seconds into watching it.

Alongside the HLS ladder, the same tweet also exposes progressive MP4 renditions — ordinary, single-file MP4s at fixed bitrates, not chunked into segments. These are what most downloaders (including curl-x) actually use, since a progressive MP4 is a complete file you can save and play anywhere, with no playlist logic required. For the deeper breakdown of codecs and containers, see What Format Are Twitter Videos In?

How to find the m3u8 URL in DevTools

If you want to see the playlist yourself:

  1. Open the tweet in a desktop browser and open DevTools (F12 or Cmd+Option+I).
  2. Switch to the Network tab and filter by m3u8 (or just media/XHR).
  3. Play the video. A request to a path under video.twimg.com ending in .m3u8 should appear.
  4. Open that request's Response tab — you'll see plain text: a master playlist referencing several child playlists, one per quality variant.
  5. Following one of those child .m3u8 links leads to another playlist that lists the actual segment URLs (.ts or .mp4 fragments) the player downloads and stitches together during playback.

This confirms the stream is HLS, but it doesn't hand you a single downloadable file — that's the whole point of the format. You now have a playlist, not a video.

Why right-click "Save Video As" doesn't work

Right-clicking an HTML5 <video> element normally offers "Save Video As," and on most sites that saves the file the browser is currently playing. On Twitter/X it usually fails, saves an empty/tiny file, or grabs only whatever segment happened to be buffered — because there is no single video file loaded in memory. The player is assembling short segments from an HLS playlist on the fly and discarding old ones; there's no complete asset for the browser to hand back to your filesystem the way there is with a plain <video src="file.mp4">. Some browsers additionally treat the player's blob: or MSE (Media Source Extensions) buffer as non-savable entirely.

That's the practical reason tools built specifically for the platform exist: they skip the player and go straight to a progressive MP4 rendition instead of trying to capture segments out of a live buffer.

What a variant playlist ladder looks like

A typical HLS master playlist lists each variant with its approximate bitrate and resolution, roughly like this:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=284000,RESOLUTION=480x270
480x270/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=832000,RESOLUTION=640x360
640x360/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2176000,RESOLUTION=1280x720
1280x720/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=9216000,RESOLUTION=1920x1080
1920x1080/playlist.m3u8

Each #EXT-X-STREAM-INF line is one rung of the ladder: a bitrate (BANDWIDTH, in bits/sec) paired with a pixel resolution. The player starts low and climbs the ladder as it confirms bandwidth, or jumps straight to a high rung on a fast, stable connection. This is exactly the same idea covered in more depth in Why Some Twitter Videos Have Multiple Quality Options — the ladder is the mechanism behind those quality choices.

How curl-x turns the ladder into a direct MP4

curl-x's Twitter/X extractor talks to Twitter's public syndication API for a tweet and reads back its full video_info.variants list — the same set of renditions the player chooses from, each tagged with a content_type. That list mixes HLS-oriented entries with plain video/mp4 entries; curl-x filters the list down to the video/mp4 renditions only and discards the rest, then ranks what's left by bitrate to offer the best single-file download. Because the syndication API doesn't expose per-variant pixel dimensions directly, curl-x reads the encoded resolution out of the MP4 URL's own path (renditions look like .../vid/avc1/720x1280/<id>.mp4) to label each option correctly.

The result: paste a tweet URL into curl-x, and you get a plain, complete MP4 file — no playlist, no DevTools, no segment-stitching. Prefer the command line? curl -OJ https://www.curl-x.com/<username>/status/<tweetId> does the same resolution and streams the file straight to disk in one step; see how to download a Twitter video with curl for the full walkthrough.

FAQ

Are Twitter videos HLS?

Yes for playback. X streams tweet video through HLS — a .m3u8 master playlist on video.twimg.com referencing several bitrate/resolution variants — so the in-app and web player can adapt to connection speed. The same post also exposes progressive MP4 files, which is what downloaders actually save.

How do I find the m3u8 URL of a tweet video?

Open the tweet in a browser, open DevTools' Network tab, filter for m3u8, and play the video. A request to a .m3u8 path under video.twimg.com will appear; its response body is the playlist text listing the variant streams.

Can I download an m3u8 stream directly?

Not as a single file in the normal sense — an .m3u8 is a text playlist, not a video. To get a playable file you either need a tool that fetches and stitches every segment (like ffmpeg -i playlist.m3u8 -c copy out.mp4) or you use the platform's separate progressive MP4 rendition, which is already one complete file. curl-x takes the second route: it resolves the tweet's MP4 renditions directly, so there's no playlist to reconstruct.

Why can't I right-click and save a Twitter video?

Because the player never holds one complete video file in memory — it's continuously buffering and discarding small HLS segments. "Save Video As" has nothing single to save. Going around the player to the post's progressive MP4 rendition, which is what curl-x does, avoids the problem entirely.

Does curl-x give me the highest-quality MP4 available?

Yes — curl-x ranks the video/mp4 renditions Twitter exposes for a tweet by bitrate and resolution and serves the best one it finds, whether you use the web form or the curl/wget shortcut.

Bottom line

Twitter/X really does use HLS — a .m3u8 master playlist with a ladder of bitrate/resolution variants — to stream video in the browser and app. You can inspect that playlist yourself in DevTools, but it's a coordination file, not a downloadable video, which is why right-click-save fails. The progressive MP4 renditions sitting alongside that playlist are what you actually want, and curl-x resolves them automatically, whether you paste a link into the site or fetch it straight from a terminal.

Ready to download from any platform?

Try curl-x — free, fast, and no login required.

Download Now
Share: