Twitter (X) Scraper
Pricing
from $0.40 / 1,000 scraped tweets
Twitter (X) Scraper
The best Apify Twitter (X) scraper. It offers a variety of filter options without needing any account credentials.
Pricing
from $0.40 / 1,000 scraped tweets
Rating
0.0
(0)
Developer
Maxime Dupré
Maintained by CommunityActor stats
1
Bookmarked
79
Total users
25
Monthly active users
a day ago
Last modified
Categories
Share
Find Twitter/X posts, profiles, and trending topics
Twitter Scraper helps you search Twitter/X for public posts about a topic, brand, person, or trend, discover matching public profiles through People search, and export current trending topics for a verified region.
Start with the prefilled Exact phrase, keep Maximum items at 25, and review matching posts in minutes.
- ✅ Flexible post discovery - combine phrase, word, author, hashtag, list, date, language, and engagement filters in one run.
- ✅ Profile search - discover matching Twitter/X accounts from one or more People search queries with profile identity, bio, counts, and ranking provenance.
- ✅ Conversation context included - keep quoted-post context and reply relationships when X exposes them, so each match is easier to review.
- ✅ Search-mode control - choose newest-first latest results or X top-search ordering depending on how you want to track the conversation.
- ✅ Trending topics - export current Twitter/X trends for Worldwide or a verified country-level region without scraping posts for each trend.
- ✅ Small first run - one search filter plus a low
Maximum itemscap is enough to test the search before you widen it. - ✅ Partial-result guardrail - later-page failures can still return rows already collected.
🏆 Benefits
- 🔁 Turn manual Twitter/X searching into a repeatable export you can hand to analysts, founders, or ops workflows.
- 🔗 Keep canonical post URLs and IDs so your team can review, join, or dedupe results later.
- 👤 Build profile discovery lists from query-ranked Twitter/X account matches, with each row tied back to the submitted query.
- 🧠 Feed raw text, timestamps, authors, and engagement counts into your own scoring, alerts, or AI prompts.
- 💬 Preserve quoted-post and reply-to context when X exposes it, so downstream review keeps more conversation context.
- 🛟 Keep useful rows even when a later page fails, instead of losing everything from the run.
🚀 Quick start
- Open the Input tab and keep
Search phraseas the prefilledopenai, or replace it with your own phrase. - Keep
What to collectset toSearch postsfor post rows, switch toSearch profilesand add one or moreProfile search queries, or switch toTrending topicsand choose a verifiedTrend region. - Keep
Include original posts,Include quote posts, andInclude replieson. LeaveInclude repostsoff unless you also want reposts without added text. - Keep
Search modeset toLatest postsfor newest-first results, switch it toTop postsfor X top-ranked ordering, keep the date fields empty unless you need a time window, and setMaximum items across the whole runto25for a small first run. - Run the actor, then review the dataset rows in the finished run or through the API.
⚙️ Features
- 🔎 Runs one search across exact phrases, required words, optional words, excluded words, accounts, mentions, hashtags, list scope, date bounds, language, post IDs, and engagement thresholds.
- 👤 Searches Twitter/X profiles from query text and emits flat profile rows with profile identity, public bio fields, follower/following counts, ranking position, and scrape time when X exposes them in People search.
- 📈 Emits current trending-topic rows for Worldwide or verified country-level regions.
- 🧾 Emits one raw post contract with text, author identity, timestamps, engagement metrics, media URLs, hashtags, quoted-post fields, and reply-to fields.
- 🧭 Switches between latest-style results and X top-search ordering.
- 🎛️ Lets you include or exclude original posts, reposts, quote posts, and replies.
- 🩹 Keeps rows even when some X fields are unavailable.
- 📚 Keeps dataset order aligned with the selected search mode.
📊 Output
See the full Output tab for the complete contract.
Search Posts runs emit post rows. Search Profiles runs emit profile rows. Trending Topics runs emit trend rows; the actor does not mix post, profile, and trend rows in one dataset.
Example
{"postId": "2042296046009626989","postUrl": "https://x.com/OpenAI/status/2042296046009626989","postText": "Our existing $200 Pro tier still remains our highest usage option. And as a thank you to our existing Pro users on the $200 tier, we’re extending our 2x Codex usage promo (until May 31st) and we’ve reset your Codex rate limits (yes, again).","postDateTime": "2026-04-09T17:38:16.000Z","authorHandle": "OpenAI","authorDisplayName": "OpenAI","authorAvatarUrl": "https://pbs.twimg.com/profile_images/1885410181409820672/ztsaR0JW_normal.jpg","nbLikes": 5231,"nbReposts": 291,"nbReplies": 366,"nbViews": 765606,"nbBookmarks": 440,"imageUrls": [],"videoUrls": [],"hashtags": [],"quotedPostId": "2042295688323875316","quotedPostText": "We’re updating our ChatGPT Pro and Plus subscriptions to better support the growing use of Codex.\n\nWe’re introducing a new $100/month Pro tier. This new tier offers 5x more Codex usage than Plus and is best for longer, high-effort Codex sessions. \n\nIn ChatGPT, this new Pro tier still offers access to all Pro features, including the exclusive Pro model and unlimited access to Instant and Thinking models.\n\nTo celebrate the launch, we’re increasing Codex usage for a limited time through May 31st so that Pro $100 subscribers get up to 10x usage of ChatGPT Plus on Codex to build your most ambitious ideas.","quotedAuthorHandle": "OpenAI","replyToHandle": null,"replyToPostId": null}
Params
| Field | Type | Description |
|---|---|---|
postId | string or null | X post ID when available. |
postUrl | string or null | Canonical X post URL when available. |
postText | string or null | Raw post text. |
postDateTime | string or null | Post timestamp in ISO 8601 format. |
authorHandle | string or null | Author handle without @. |
authorDisplayName | string or null | Author display name. |
authorAvatarUrl | string or null | Author avatar image URL. |
nbLikes | number or null | Like count. |
nbReposts | number or null | Repost count. |
nbReplies | number or null | Reply count. |
nbViews | number or null | View count. |
nbBookmarks | number or null | Bookmark count. |
imageUrls | string[] | Image media URLs from the post. |
videoUrls | string[] | Video media URLs from the post. |
hashtags | string[] | Hashtags extracted from the post. |
quotedPostId | string or null | Quoted post ID when the result quotes another post. |
quotedPostText | string or null | Quoted post text when available. |
quotedAuthorHandle | string or null | Quoted post author handle when available. |
replyToHandle | string or null | Replied-to handle when the post is a reply. |
replyToPostId | string or null | Replied-to post ID when available. |
Trending topic row params
| Field | Type | Description |
|---|---|---|
rowType | trend | Identifies a trending-topic row. |
trendName | string | Trend name returned by Twitter/X. |
trendRank | number | Position in the selected region's trend list. |
trendQuery | string or null | Search query associated with the trend when exposed. |
trendSearchUrl | string or null | Search-ready X URL for posts about the trend. |
tweetVolume | number or null | Tweet volume when Twitter/X exposes it. |
regionId | string | Verified trend-region ID used for the run. |
regionName | string | Verified trend-region name used for the run. |
regionCountry | string | Country or global label for the region. |
regionCountryCode | string or null | ISO country code, or null for Worldwide. |
scrapedAt | string | Time the trend list was scraped, in ISO 8601 format. |
Profile row params
| Field | Type | Description |
|---|---|---|
rowType | profile | Identifies a profile-search row. |
profileId | string or null | X profile ID when exposed in the profile search result. |
profileUrl | string or null | Canonical X profile URL. |
twitterUrl | string or null | twitter.com profile URL. |
handle | string or null | Profile handle without @. |
displayName | string or null | Profile display name. |
bio | string or null | Bio text when exposed in the search result. |
location | string or null | Public profile location when exposed in the search result. |
avatarUrl | string or null | Profile avatar image URL. |
bannerUrl | string or null | Profile banner image URL when exposed in the search result. |
followersCount | number or null | Follower count when exposed in the search result. |
followingCount | number or null | Following count when exposed in the search result. |
postsCount | number or null | Public post count when exposed in the search result. |
likesCount | number or null | Public like count when exposed in the search result. |
isVerified | boolean or null | Verification flag when exposed in the search result. |
pinnedPostIds | string[] | Pinned post IDs when exposed in the search result. |
searchQuery | string | Submitted profile search query that produced the row. |
resultPosition | number | 1-based position within that submitted profile search query. |
scrapedAt | string | Time the profile search run scraped the row, in ISO 8601 format. |
🛠️ Input
Example
{"fromUsers": ["OpenAI"],"language": "en","searchMode": "top","startDate": "2026-03-15","maxNbItemsToScrape": 25}
{"target": "searchProfiles","profileSearchQueries": ["AI researcher","developer tools founder"],"maxNbItemsToScrape": 25}
Params
| Param | Type | Description | Default / empty behavior |
|---|---|---|---|
target | searchPosts / searchProfiles / trendingTopics | Choose whether the run emits post rows, profile rows, or trending-topic rows. | Defaults to searchPosts. |
trendRegionId | string | Verified Twitter/X trend region for Trending Topics runs. | Defaults to Worldwide. |
profileSearchQueries | string[] | People search queries for Search Profiles runs. | Empty means unused unless target is searchProfiles. |
includePhrase | string | Exact contiguous phrase that must match. Enter it without wrapping quote characters. | Empty means unused. |
includeWords | string[] | All listed words must be present somewhere in the post. | Empty means unused. |
optionalWords | string[] | Any listed words may be present. | Empty means unused. |
excludeWords | string[] | Exclude posts containing these words. | Empty means unused. |
mentions | string[] | Require posts that mention these handles. Do not include @. | Empty means unused. |
fromUsers | string[] | Require posts from these handles. Do not include @. | Empty means unused. |
hashtags | string[] | Require these hashtags. Do not include #. | Empty means unused. |
toUsers | string[] | Require posts addressed to these handles. Do not include @. | Empty means unused. |
quotedPostId | string | Return posts that quote this X post ID. | Empty means unused. |
shouldIncludeOriginalPosts | boolean | Keep original posts in the output. | Defaults to true. |
shouldIncludeReposts | boolean | Keep reposts without added text in the output. | Defaults to false. |
shouldIncludeQuotePosts | boolean | Keep quote posts in the output. | Defaults to true. |
shouldIncludeReplies | boolean | Keep replies in the output. | Defaults to true. |
postType | all / link / text | Restrict the search to all posts, link posts, or text-only posts. | Defaults to all. |
searchMode | latest / top | Use latest-style results or X top-search ordering. | Defaults to latest. |
startDate | string | Only include posts on or after this ISO 8601 or YYYY-MM-DD value. | Empty searches from 30 days before run start. |
endDate | string | Only include posts on or before this ISO 8601 or YYYY-MM-DD value. | Empty leaves the upper bound open. |
language | string | Restrict the search to a language code such as en. | Empty means unused. |
list | string | Restrict the search to an X list ID. | Empty means unused. |
maxId | string | Only include posts at or before this X post ID. | Empty means unused. |
sinceId | string | Only include posts after this X post ID. | Empty means unused. |
minLikes | integer | Only include posts with at least this many likes. | Empty means unused. |
minReplies | integer | Only include posts with at least this many replies. | Empty means unused. |
minRetweets | integer | Only include posts with at least this many reposts. | Empty means unused. |
maxNbItemsToScrape | integer | Maximum number of dataset rows to emit. | Defaults to 0, which emits all matching rows after filtering and ordering. |
shouldIncludePromotedPosts | boolean | Keep promoted search results in the output. | Defaults to false. |
Important
- Search Posts runs must provide at least one positive selector:
includePhrase,includeWords,optionalWords,mentions,fromUsers,hashtags,toUsers,quotedPostId, orlist. - Search Profiles runs must provide at least one
profileSearchQueriesvalue. They emit one row per matched profile search result and do not scrape profile timelines, followers, following, or profile-about pages. - Trending Topics runs use verified region choices only and do not automatically scrape posts for each trend.
- At least one of
shouldIncludeOriginalPosts,shouldIncludeReposts,shouldIncludeQuotePosts, orshouldIncludeRepliesmust staytrue. - Latest mode emits newest-first results. Top mode preserves X top-search ordering.
maxNbItemsToScrape: 0emits all matching rows after filtering and ordering.- You only provide search filters. Account rotation and proxy selection stay managed inside the actor.
🔍 Error handling
- Invalid input combinations fail before any Twitter/X requests start. This includes runs with no positive selector or runs with all four content-type switches turned off.
- If the actor cannot initialize the required Apify proxy path, the run fails before sending live Twitter/X traffic.
- When Twitter/X rejects or exhausts one internal account, the actor rotates to another account and retries the page when possible.
- If the first search page cannot be completed with any account, the run fails with a clear error.
- If a later page fails after rows were already collected, the run still finishes successfully with partial results and a concise status message explaining the early stop.
Changelog
0.2: Added Search Profiles for query-based Twitter/X profile discovery with flat profile rows and search provenance.0.1: Added Trending Topics, verified trend regions, grouped target-specific inputs, 256 MB runtime default, and pay-per-event pricing.
🆘 Support
For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡
🔗 Other actors
- Reddit Scraper - Search Reddit posts and comments to track conversations around a topic or brand.
- Product Hunt Scraper - Turn Product Hunt launches into lead-ready rows with optional website enrichment.
- Website Emails Scraper - Turn any list of websites into one row per discovered contact email.
- Uneed Scraper - Collect Uneed launches with maker links, ranks, and optional website emails.
- Tiny Startups Scraper - Export Tiny Startups listings with promoted-listing control and optional email enrichment.
- TinySeed Scraper - Scrape the TinySeed portfolio into company rows with descriptions and optional website emails.
Made with ❤️ by Maxime Dupré