X (Twitter) Video Downloader - MP4 or MP3
Pricing
from $0.44 / 1,000 megabytes
X (Twitter) Video Downloader - MP4 or MP3
Download the video from a public X (Twitter) post as an MP4, or just its sound as an MP3. Paste post links; each file is stored in the run and its row carries a direct download link, title, author, resolution and size. No login or cookies. $0.45 per 1,000 megabytes.
Pricing
from $0.44 / 1,000 megabytes
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Paste links to public X or Twitter posts and get each video back as an MP4 file, or its sound as an MP3. Each file is saved in the run, and the dataset row that goes with it carries a direct download link, the title, the author, the resolution and the exact file size.
The part worth knowing first: this only reaches posts anyone can open signed out. A protected account,
a post behind a login, or a deleted one comes back as a sentence in the run's ERRORS record and adds
nothing to your bill.
| Input | Public x.com or twitter.com post links |
| Output | An MP4 or MP3 file per link, plus one dataset row with its download link, title, author, resolution, duration and size |
| Ceiling | 500 MB per video by default, 4,000 MB at most |
| Account needed | None |
| Price | $0.45 per 1,000 MB delivered ($0.00045 per MB), flat on every plan. The free plan's $5 a month covers about 11,000 MB |
🔍 What X (Twitter) Video Downloader does
You give it post links. For each one it reads the post, picks the format, checks the file size before a single media byte moves, downloads it, checks the file actually plays, stores it, and only then lists it in the dataset.
X publishes the same picture twice: as one ready-made MP4, and as a streaming version split into picture and sound. This takes the ready-made MP4, so the file arrives whole with its audio already in it and its size known in advance. Nothing is stitched together afterwards.
With Audio only on you get a 128 kbit/s MP3 of the same post instead. No login, no cookies, nothing to paste in besides the link.
📋 What data you get from each download
| What you get | Field |
|---|---|
| The post link you gave, and the site | url, host |
| The account name followed by the post's text, and the author | title, author |
| Length, picture size and file type, read off the finished file | durationSeconds, resolution, format |
| The stored file's exact size, and what it counted as | fileSizeBytes, billedMegabytes |
| The record name in the run's storage, and a direct download link | mediaKey, mediaUrl |
▶️ How to download X (Twitter) videos
- Open X (Twitter) Video Downloader and click Try for free.
- Paste your post links into X post links, one per line.
- Pick a Max quality, or tick Audio only (MP3).
- Set Max megabytes per video if you want a tighter cap than 500.
- Click Start, then take
mediaUrlfrom each dataset row, or open the run's Storage tab.
💰 How much does it cost to download X videos?
$0.00045 for every megabyte delivered, which is $0.45 per 1,000 MB, the same on every Apify plan. Each file is counted in whole megabytes, rounded up: the 15-second clip in the example below counted as 2 MB. On the free plan, the $5 Apify gives you each month covers about 11,000 MB of files.
You are billed only after a file is stored and listed. A link that fails, a post that is private or
gone, a link to another site, and a video skipped for being over maxMegabytes add no megabytes.
Higher quality means a bigger file, and a bigger file costs more. audioOnly is much smaller than
the video of the same post.
📥 What you give it
{"urls": ["https://x.com/historyinmemes/status/1790637656616943991","https://twitter.com/someone/status/1234567890123456789"],"quality": "1080","audioOnly": false,"maxMegabytes": 500}
| Field | Default | What it is |
|---|---|---|
urls | none | Required. One link per line. x.com and twitter.com both work, with or without www. or mobile.. Query strings are ignored. |
quality | 1080 | best, 1080, 720, 480 or 360, measured on the short side of the picture. A video that does not come in that size gives you the closest it has. |
audioOnly | false | An MP3 of the sound instead of the video. |
maxMegabytes | 500 | 1 to 4,000. A video bigger than this is skipped before it is downloaded. |
A post with several videos gives you the first one. End the link with /video/2 to ask for the
second instead.
Duplicates are dropped, and a link that points somewhere else is refused with a note telling you
which actor takes it. A t.co short link is refused too: open it, and paste the address it lands on.
File size is bounded by the run's memory. A run can hold a file of roughly 70% of the memory it
was given, so about 716 MB at the default 1,024 MB. For anything bigger, raise the run's memory as
well as maxMegabytes.
📤 What you get back
Two things per link: the file in the run's key-value store, and a row in the dataset pointing at it.
A real row, from run 4kPIloPIN7IwX9npC, with the signed link trimmed:
{"url": "https://x.com/historyinmemes/status/1790637656616943991","host": "x","title": "Historic Vids - One of the most intense moments in history","author": "Historic Vids","durationSeconds": 15.56,"resolution": "728x720","format": "mp4","fileSizeBytes": 1404023,"billedMegabytes": 2,"mediaKey": "x-1790637589910654976.mp4","mediaUrl": "https://api.apify.com/v2/key-value-stores/E2Boy2HNCFDNWIzez/records/x-...?signature=..."}
| Field | How to read it |
|---|---|
mediaUrl | A ready-to-use download link to the stored file. This is what you hand to whatever comes next. |
mediaKey | The record name in the run's key-value store. It uses the media id, which is not the post id. |
fileSizeBytes | The size of the stored file, read back after it was written. |
billedMegabytes | What that file counted as, in whole megabytes. |
🧾 Reading the output
A failure never reaches the dataset. Every row in there is a file that exists and was stored.
Links that did not work go into a key-value record called ERRORS, each as {url, error} with the
reason in plain words. It is saved as each failure happens, so a run that runs out of time still tells
you what it managed and what it did not.
| What you read | What it means |
|---|---|
| "This post is gone, or its video was removed." | The post or its media is no longer there. |
| "This post is only visible to signed-in accounts." | Protected or otherwise not public. Only public posts can be read. |
| "This post has no video in it." | A photo or text post, or a GIF with no video stream. |
| "This video is 18.0 MB, over your limit of 5 MB per video" | Over maxMegabytes, so it was skipped before downloading. |
| "X is limiting requests right now." | Too many in a short time. Come back in a few minutes. |
| "t.co is X's link shortener." | Open it in a browser and paste the address it lands on. |
| "This video has no sound to turn into an MP3." | Audio only was asked for on a silent video. |
If every link in a run fails, the run ends as failed and the status message points at ERRORS.
💡 What people use it for
- Keeping a copy of a clip before the post that carries it disappears.
- Pulling the audio out of an interview or a speech to transcribe it somewhere else.
- Feeding
mediaUrlinto an editor, a captioner or an uploader as the next step in a pipeline. - Archiving a set of posts at a fixed quality, so file sizes stay predictable.
Keeping the clips an account posted this month, in three steps:
- Run Tweet Scraper on the handle with
sinceset to the first of the month. - Keep the rows where an entry in
mediahas avideolink. - Paste their
urlvalues here and take each clip frommediaUrl.
🚧 What it does not do
- Public posts only. Protected accounts and anything behind a login fail with a sentence saying so.
- No photos, no GIF-only posts, no Spaces and no broadcasts.
- The first video of a multi-video post, unless you ask for another with
/video/<n>. - No post text, likes, replies or metrics. The
titlecarries the post's text and that is all. For the post as data, use Tweet Scraper. - No
t.colinks. They are refused with an instruction rather than followed. - No subtitles or captions.
- Files live in the run's key-value store, which is not permanent. Copy anything you want to keep,
and treat
mediaUrlas a link to fetch now rather than store for later.
🧭 Which downloader do you need?
| If you want | Use |
|---|---|
| The video in an X or Twitter post, saved as an MP4 or MP3 | This one |
| An account's posts as data, to pick the video links from | Tweet Scraper |
| Posts with video on a topic, found by keyword | Twitter (X) Search Scraper |
| A YouTube video, up to 8K, or its audio or captions | YouTube Downloader Pro |
| A TikTok video | TikTok Video Downloader |
❓ Questions people ask
Do I need an X account or cookies to download X videos?
No. Nothing to paste in and nothing that expires.
Where is my downloaded file?
In the run's key-value store. The fastest way to it is mediaUrl on the dataset row; the Storage
tab of the run shows the same records under mediaKey.
Can I download every video an account posted?
Not from here. This takes links you supply. Collect the post links first with Tweet Scraper, as in the three steps above, then feed them in.
Why is my video smaller than 1080p?
Because the post does not have a 1080p version. You get the closest size X published.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code
for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/x-video-downloader. Either way the run
happens on your Apify account at the same price.
Is downloading X videos legal?
The post being public does not make the video yours. Copyright still applies, and so does data-protection law where a person is identifiable. Have a reason for what you are collecting. Apify's write-up on the legality of web scraping is a fair start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the exact post link, and paste the
ERRORS record from the run's key-value store: it carries the sentence for every link that failed.