Twitter X Media Scraper
Pricing
from $1.60 / 1,000 media links
Twitter X Media Scraper
Get public Twitter/X images, videos, and GIFs from tweet URLs, IDs, profiles, hashtags, or keywords. Export direct media links with post, author, profile, and engagement data.
Pricing
from $1.60 / 1,000 media links
Rating
0.0
(0)
Developer
Maxime Dupré
Maintained by CommunityActor stats
0
Bookmarked
43
Total users
5
Monthly active users
9 days ago
Last modified
Categories
Share
📥 Get public Twitter/X media links
Twitter X Media Scraper helps researchers, marketers, and developers find public images, videos, and GIFs. Give it tweet URLs, IDs, profiles, hashtags, or keywords. It returns direct source-hosted media links with post, author, profile, and engagement data.
- Use a Twitter scraper to collect media and post data for research.
- Use an X scraper to watch public hashtags and keywords.
- Run a Twitter media image scraper to get direct image links with author data.
- Build a Twitter media archive from known public tweet URLs or IDs.
- Send Twitter media API workflows direct links and post data for later steps.
📊 What data does it return?
Each dataset row is one image, video, or GIF. If the same media appears through more than one target, the row keeps the first target that found it. Data can include:
- A direct media URL, thumbnail, media type, size, alt text, and source order
- The source post URL, text, date, language, and public engagement counts
- The author's username, name, profile URL, avatar, and verification status
- Profile facts when media comes from a profile target
- The best playable video link and other video quality choices
🚀 How to run the Actor
- Choose one Target type.
- Fill in the matching tweet, profile, hashtag, or keyword field.
- Pick the media types you want.
- Set Media item limit, or leave it empty to get all available results until the source is exhausted.
- Start the Actor and open Media items in the dataset.
Known tweet URLs and IDs get media from those posts. Profiles can cover public profile history up to your run limit. Hashtag and keyword searches find recent public posts. The Actor gives you links; it does not download, change, or bundle the files.
🎯 Input
Only fields for the chosen Target are used.
| Field | Type | What it does |
|---|---|---|
target | string | Chooses tweets, profiles, hashtags, or keyword search. |
tweetTargets | string[] | Lists public tweet URLs or raw tweet IDs, one per line. Used for the Tweets target. |
replyScope | string | Includes no replies, direct replies, or all reply levels for tweet targets. |
profiles | string[] | Lists public handles such as @NASA, one per line. Used for the Profiles target. |
profileFilters | object | Holds optional filters for posts found through profiles. |
profileFilters.minLikes | integer | Keeps posts with at least this many likes. Leave empty for no likes filter. |
profileFilters.minReposts | integer | Keeps posts with at least this many reposts. Leave empty for no repost filter. |
profileFilters.minReplies | integer | Keeps posts with at least this many replies. Leave empty for no reply filter. |
profileFilters.authorVerification | string | Keeps any author, verified authors, or authors not marked as verified. |
profileFilters.language | string | Keeps a language code such as en, es, or fr. Leave empty for any language. |
hashtags | string[] | Lists hashtags such as #nasa, one per line. Used for the Hashtags target. |
keywords | string[] | Lists search keywords or phrases, one search per line. Used for Keyword Search. |
mediaTypes | string[] | Chooses images, videos, GIFs, or any mix of them. |
maxItems | integer | Stops after this many saved media items across the run. Leave empty to get all available results until the source is exhausted. |
This example is from a successful run with the prefilled tweet:
{"target": "tweets","tweetTargets": ["https://x.com/teslaownersSV/status/2004891561180758165"],"replyScope": "direct","mediaTypes": ["image","video","gif"],"maxItems": 5}
📄 Output
All media types use the same row shape. Fields may be null when Twitter/X does not give the value.
| Field | Type | What it does |
|---|---|---|
mediaUrl | string | Main direct source-hosted image, video, or GIF URL. |
mediaType | string | Says whether the row is an image, video, or GIF. |
mediaIndex | integer | Gives the media position in the post, starting at 1. |
mediaId | string or null | Gives the Twitter/X media ID when available. |
thumbnailUrl | string or null | Gives a source-hosted preview image URL. |
altText | string or null | Gives accessibility text added to the media. |
width | integer or null | Gives media width in pixels. |
height | integer or null | Gives media height in pixels. |
durationMs | integer or null | Gives video or GIF length in milliseconds. |
aspectRatio | string or null | Gives a video or GIF aspect ratio. |
contentType | string or null | Gives the media MIME type. |
videoVariants | object[] | Lists other source-hosted video choices from highest to lowest bitrate. |
videoVariants.url | string | Gives the direct URL for a video choice. |
videoVariants.bitrate | integer or null | Gives bitrate in bits per second. |
videoVariants.width | integer or null | Gives variant width in pixels. |
videoVariants.height | integer or null | Gives variant height in pixels. |
videoVariants.contentType | string or null | Gives the variant MIME type. |
target | string | Gives the submitted value that first found the media. |
targetType | string | Gives the target kind that first found the media. |
tweetId | string | Gives the source post ID. |
tweetUrl | string | Gives the public source post URL. |
conversationId | string or null | Gives the Twitter/X conversation ID. |
text | string or null | Gives the source post text. |
postedAt | string or null | Gives the date and time the post was published. |
language | string or null | Gives Twitter/X's language code for the post. |
postingSource | string or null | Gives the app or service used to publish the post. |
authorUsername | string or null | Gives the author's username without @. |
authorName | string or null | Gives the author's display name. |
authorProfileUrl | string or null | Gives the author's public profile URL. |
authorAvatarUrl | string or null | Gives the author's public avatar URL. |
authorVerified | boolean or null | Says whether Twitter/X marks the author as verified. |
engagement | object | Holds public counts for the source post. |
engagement.likes | integer or null | Gives the number of likes. |
engagement.retweets | integer or null | Gives the number of reposts. |
engagement.replies | integer or null | Gives the number of replies. |
engagement.views | integer or null | Gives the number of views. |
engagement.quotes | integer or null | Gives the number of quote posts. |
engagement.bookmarks | integer or null | Gives the number of bookmarks. |
profile | object or null | Holds more profile facts for media found through a profile target. |
profile.bio | string or null | Gives the public profile bio. |
profile.location | string or null | Gives the public profile location. |
profile.websiteUrl | string or null | Gives the public website linked from the profile. |
profile.followers | integer or null | Gives the follower count. |
profile.following | integer or null | Gives the number of followed accounts. |
profile.createdAt | string or null | Gives the account creation date and time. |
profile.posts | integer or null | Gives the total profile post count. |
profile.media | integer or null | Gives the total profile media post count. |
This complete row comes from a successful profile run:
{"target": "@NASA","targetType": "profile","tweetId": "2081772453093593253","tweetUrl": "https://x.com/NASA/status/2081772453093593253","authorUsername": "NASA","authorName": "NASA","text": "This August, our astronauts will be stepping outside the @Space_Station three times! NASA experts will discuss our upcoming spacewalks at 2pm ET (1800 UTC) on July 30. Learn how to tune in: https://t.co/7CyQqEN9bF https://t.co/Dxa5zMAxzh","postedAt": "2026-07-27T16:03:24.000Z","mediaType": "image","mediaUrl": "https://pbs.twimg.com/media/HOPxABqXMAAvEjg.jpg","mediaIndex": 1,"thumbnailUrl": "https://pbs.twimg.com/media/HOPxABqXMAAvEjg.jpg","altText": "A photo of NASA astronaut Jessica Meir's reflection in a spacesuit helmet visor as she swaps and installs parts. Credit: NASA/Jack Hathaway","engagement": {"likes": 666,"retweets": 84,"replies": 82,"views": 250921,"quotes": 6,"bookmarks": 28},"conversationId": "2081772453093593253","authorProfileUrl": "https://x.com/NASA","authorAvatarUrl": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg","authorVerified": true,"language": "en","postingSource": null,"mediaId": "2081772435523710976","width": 8192,"height": 5461,"durationMs": null,"aspectRatio": null,"contentType": null,"videoVariants": [],"profile": {"bio": "Making the seemingly impossible, possible. ✨","location": null,"websiteUrl": "http://www.nasa.gov/","followers": 92217924,"following": 119,"createdAt": "2007-12-19T20:20:32.000Z","posts": 74256,"media": 28047}}
💸 Pricing
This Actor uses pay-per-event pricing. You are charged for each direct link for a public image, video, or GIF that is saved to the dataset. A target with no saved media link does not create this event.
Use Media item limit to control the run size. Leaving it empty gets all available results until the source is exhausted.
🔌 Integrations
Use the Apify API, schedules, webhooks, Make, Zapier, Google Sheets, or cloud storage. You can also export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.
❓ FAQ
Can it get private or deleted media?
No. It only works with public Twitter/X content. It does not get private, protected, deleted, or age-gated content.
Do I need a Twitter/X login or API key?
No. You do not need to give the Actor Twitter/X credentials.
Can I choose images, videos, or GIFs?
Yes. Pick one type or any mix in Media types.
Can it include media from replies?
Yes, for tweet targets. Choose direct replies or all reply levels in Replies.
Does it save the media files?
No. It returns direct source-hosted links and data. It does not copy or change the files.
What happens when two targets find the same media?
The first eligible match is saved right away. Later matches for that same source media are ignored, so the saved row keeps only the first target that found it.
Is this a general Twitter scraper?
No. It saves rows only for the media types you ask for. It is not meant to collect posts with no requested media.
📝 Changelog
- 0.2: Added media discovery from public profiles, hashtags, and keywords, with richer author, engagement, and video data.
- 0.1: Initial release.
🆘 Support
For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡
🔗 Related Actors
- Twitter (X) Scraper — Collect broader public post, profile, and trend data.
- Twitter Screenshot Generator — Turn public posts into clean screenshot images.
- Instagram Downloader API — Get media links from public Instagram posts and reels.
- Facebook Media Downloader — Get playable links from public Facebook videos and reels.
- Telegram Media Downloader — Get photos and videos from public Telegram posts and channels.
Made with ❤️ by Maxime Dupré