All-in-One X/Twitter Scraper
Pricing
from $0.20 / 1,000 tweet results
All-in-One X/Twitter Scraper
Scrape X (Twitter) data at the lowest price on Apify. 8 modes: tweets, profiles, followers, comments, search, and more. From $0.20/1K results. No proxy needed. 256MB memory. HTTP-only, blazing fast. Compatible with apidojo output format. No login required for basic modes.
Pricing
from $0.20 / 1,000 tweet results
Rating
0.0
(0)
Developer
Japi Cricket
Actor stats
0
Bookmarked
6
Total users
5
Monthly active users
2 days ago
Last modified
Categories
Share
The most affordable X/Twitter scraper on Apify. 10 scraping modes in one actor. 40-50% cheaper than any competitor. Extract tweets, profiles, followers, comments, lists, timelines, and more from X (formerly Twitter).
At $0.20/1K results (Business plan), we are the cheapest pay-per-event X scraper on Apify — while delivering the same data quality as scrapers costing 2-3x more.
Why Choose This Scraper?
- Cheapest on Apify — $0.24/1K (Starter) vs $0.40/1K (apidojo) = 40% savings
- 10 modes in 1 actor — no need to rent multiple scrapers
- No proxy needed — saves you $8/GB on residential proxy costs
- 128MB memory — lowest possible compute unit cost
- No login required for 3 modes (posts, profiles, data extractor)
- Compatible output format — drop-in replacement for apidojo scrapers
- Cookie rotation — support multiple login cookies for large runs
- Resume capability — pick up where failed runs left off
- Query Wizard — build complex queries through simple UI fields
10 Scraping Modes
| Mode | What it does | Auth Required | Proxy |
|---|---|---|---|
| x-post-scraper | Scrape specific tweets by URL | None | No |
| x-data-extractor | Lightweight tweet URL scraper | None | No |
| x-profile-scraper | Full user profiles with stats | None | No |
| x-tweet-scraper | Search tweets by keywords/hashtags | Login cookies | No |
| x-timeline-scraper | Scrape a user's tweet timeline | Login cookies | No |
| x-user-search-scraper | Search for users by keywords | Login cookies | No |
| x-follower-scraper | Get followers/following lists | Login cookies | No |
| x-comment-scraper | Get replies/conversation threads | Login cookies | No |
| x-list-scraper | Scrape tweets from X/Twitter lists | Login cookies | No |
| x-scraper | All-in-one (combines all above) | Depends | No |
Pricing — Cheapest on Apify
| Event | Free/1K | Starter/1K | Scale/1K | Business/1K | vs Best Competitor |
|---|---|---|---|---|---|
| Tweet result | $6.00 | $0.24 | $0.22 | $0.20 | 40-50% cheaper than apidojo ($0.40) |
| Post result | $6.00 | $0.24 | $0.22 | $0.20 | 40-50% cheaper than apidojo |
| Profile result | $6.00 | $0.24 | $0.22 | $0.20 | 40-50% cheaper than apidojo |
| Follower result | $2.25 | $0.09 | $0.08 | $0.07 | 40-53% cheaper than kaitoeasyapi ($0.15) |
| Comment result | $6.00 | $0.24 | $0.22 | $0.20 | 40-50% cheaper than apidojo |
| Search result | $6.00 | $0.24 | $0.22 | $0.20 | 40-50% cheaper than apidojo |
| Extractor result | $6.00 | $0.24 | $0.22 | $0.20 | 40-50% cheaper than apidojo |
Quick Start Examples
Scrape tweets by URL (no auth needed)
{"scrapeMode": "x-post-scraper","tweetURLs": ["https://x.com/elonmusk/status/1728108619189874825","https://x.com/NASA/status/1630332507265589248"]}
Scrape user profiles (no auth needed)
{"scrapeMode": "x-profile-scraper","profiles": ["elonmusk", "NASA", "OpenAI"]}
Search tweets (requires login cookies)
{"scrapeMode": "x-tweet-scraper","searchQueries": ["from:NASA", "#AI lang:en"],"maxResults": 100,"sort": "Latest","loginCookies": "auth_token=xxx; ct0=yyy"}
Search with Query Wizard filters
{"scrapeMode": "x-tweet-scraper","searchQueries": ["artificial intelligence"],"author": "elonmusk","start": "2024-01-01","end": "2024-12-31","minimumFavorites": 100,"onlyImage": true,"languageFilter": "en","maxResults": 200,"sort": "Top","loginCookies": "auth_token=xxx; ct0=yyy"}
Scrape a user's timeline
{"scrapeMode": "x-timeline-scraper","profiles": ["NASA"],"maxResults": 500,"includeReplies": false,"loginCookies": "auth_token=xxx; ct0=yyy"}
Get followers (requires login cookies)
{"scrapeMode": "x-follower-scraper","profiles": ["apify"],"maxResults": 500,"followerMode": "followers","loginCookies": "auth_token=xxx; ct0=yyy"}
Get comments/replies
{"scrapeMode": "x-comment-scraper","tweetURLs": ["https://x.com/elonmusk/status/1728108619189874825"],"maxResults": 50,"loginCookies": "auth_token=xxx; ct0=yyy"}
Scrape from a Twitter List
{"scrapeMode": "x-list-scraper","listURLs": ["https://x.com/i/lists/1234567890"],"maxResults": 100,"loginCookies": "auth_token=xxx; ct0=yyy"}
Search for users
{"scrapeMode": "x-user-search-scraper","searchQueries": ["AI researcher"],"maxResults": 50,"loginCookies": "auth_token=xxx; ct0=yyy"}
All-in-one mode with startUrls
{"scrapeMode": "x-scraper","startUrls": ["https://x.com/elonmusk/status/1728108619189874825","https://x.com/NASA","https://x.com/i/lists/1234567890"],"searchQueries": ["from:apify"],"maxResults": 20,"loginCookies": "auth_token=xxx; ct0=yyy"}
Using Latest + Top sort (maximizes results)
{"scrapeMode": "x-tweet-scraper","searchQueries": ["bitcoin"],"sort": "Latest + Top","maxResults": 500,"loginCookies": "auth_token=xxx; ct0=yyy"}
Using conversation IDs
{"scrapeMode": "x-tweet-scraper","conversationIds": ["1728108619189874825"],"sort": "Latest","maxResults": 100,"loginCookies": "auth_token=xxx; ct0=yyy"}
Resume a failed run
{"scrapeMode": "x-tweet-scraper","searchQueries": ["from:NASA"],"maxResults": 1000,"resumeFromDataset": "PREVIOUS_DATASET_ID","loginCookies": "auth_token=xxx; ct0=yyy"}
Cookie rotation for large runs
{"scrapeMode": "x-follower-scraper","profiles": ["elonmusk"],"maxResults": 5000,"loginCookies": "auth_token=aaa; ct0=bbb|||auth_token=ccc; ct0=ddd"}
Custom map function
{"scrapeMode": "x-tweet-scraper","searchQueries": ["web scraping"],"maxResults": 50,"customMapFunction": "(item) => ({ id: item.tweetId, text: item.text, likes: item.likeCount, author: item.author?.userName })","loginCookies": "auth_token=xxx; ct0=yyy"}
Output Examples
Tweet (from search, post scraper, timeline, lists, or comments)
{"type": "tweet","tweetId": "1728108619189874825","url": "https://x.com/elonmusk/status/1728108619189874825","twitterUrl": "https://twitter.com/elonmusk/status/1728108619189874825","text": "More than 10 per human on average","likeCount": 93200,"retweetCount": 8934,"replyCount": 5943,"quoteCount": 2862,"viewCount": 37422813,"bookmarkCount": 702,"createdAt": "Fri Nov 24 17:49:36 +0000 2023","lang": "en","source": "Twitter for Android","isReply": false,"isRetweet": false,"isQuote": true,"conversationId": "1728108619189874825","hashtags": [],"urls": [],"userMentions": [],"media": [],"author": {"type": "user","userName": "elonmusk","name": "Elon Musk","twitterId": "44196397","isBlueVerified": true,"profilePicture": "https://pbs.twimg.com/profile_images/.../image_400x400.jpg","followers": 237310283,"following": 538}}
User Profile (from profile scraper, followers, or user search)
{"type": "user","twitterId": "11348282","userName": "NASA","name": "NASA","url": "https://x.com/NASA","twitterUrl": "https://twitter.com/NASA","description": "Official NASA account.","location": "Pale Blue Dot","website": "http://www.nasa.gov/","followers": 90104714,"following": 116,"statusesCount": 73499,"favouritesCount": 16553,"listedCount": 96558,"mediaCount": 27785,"isVerified": false,"isBlueVerified": true,"verifiedType": "Government","profilePicture": "https://pbs.twimg.com/profile_images/.../image_400x400.jpg","coverPicture": "https://pbs.twimg.com/profile_banners/11348282/...","createdAt": "Wed Dec 19 20:20:32 +0000 2007","canDm": false,"isProtected": false}
How to Get Login Cookies
Some modes require X/Twitter login cookies. Here's how:
- Open x.com in your browser and log in
- Open Developer Tools (F12 or Cmd+Opt+I)
- Go to Application > Cookies > x.com
- Copy the values of
auth_tokenandct0 - Paste as:
auth_token=YOUR_TOKEN; ct0=YOUR_CT0
Modes that do NOT require cookies: x-post-scraper, x-profile-scraper, x-data-extractor.
Cookie rotation: For large runs, provide multiple cookies separated by |||:
auth_token=aaa; ct0=bbb|||auth_token=ccc; ct0=ddd
Query Wizard
Build complex search queries without learning advanced syntax. Use the Query Wizard fields in the UI:
| Field | What it does | Equivalent syntax |
|---|---|---|
| From User | Tweets from specific user | from:username |
| In Reply To | Replies to specific user | to:username |
| Mentioning User | Mentions of user | @username |
| Start Date | Tweets after date | since:YYYY-MM-DD |
| End Date | Tweets before date | until:YYYY-MM-DD |
| Minimum Likes | Min like threshold | min_faves:N |
| Minimum Retweets | Min RT threshold | min_retweets:N |
| Minimum Replies | Min reply threshold | min_replies:N |
| Language Filter | Filter by language | lang:xx |
| Only Verified | Verified users only | filter:verified |
| Only Images | Tweets with images | filter:images |
| Only Videos | Tweets with videos | filter:videos |
| Only Quotes | Quote tweets only | filter:quote |
| Geotagged Near | Location filter | near:"city" |
| Within Radius | Radius from location | within:10km |
These fields auto-append to your search queries. Combine with manual query syntax for maximum power.
Advanced Search Syntax
The tweet search mode supports X/Twitter advanced search operators:
| Operator | Example | Description |
|---|---|---|
from:user | from:NASA | Tweets from specific user |
to:user | to:support | Replies to specific user |
@user | @OpenAI | Mentions of specific user |
#hashtag | #AI | Tweets with hashtag |
$cashtag | $TSLA | Tweets with cashtag |
since:date | since:2024-01-01 | Tweets after date |
until:date | until:2024-12-31 | Tweets before date |
min_faves:N | min_faves:100 | Minimum likes |
min_retweets:N | min_retweets:50 | Minimum retweets |
min_replies:N | min_replies:10 | Minimum replies |
lang:xx | lang:en | Filter by language |
filter:media | filter:media | Only tweets with media |
filter:images | filter:images | Only tweets with images |
filter:videos | filter:videos | Only tweets with videos |
filter:links | filter:links | Only tweets with links |
filter:verified | filter:verified | Only verified users |
filter:blue_verified | filter:blue_verified | Only X Premium users |
-filter:retweets | -filter:retweets | Exclude retweets |
-filter:replies | -filter:replies | Exclude replies |
filter:quote | filter:quote | Only quote tweets |
conversation_id:ID | conversation_id:123 | Thread replies |
near:"city" | near:"San Francisco" | Geotagged tweets |
within:radius | within:10km | Within radius |
Combine operators: from:NASA #space since:2024-01-01 min_faves:100 lang:en -filter:retweets
Input Parameters
| Field | Type | Description | Default |
|---|---|---|---|
| scrapeMode | string | Which scraper to run | x-tweet-scraper |
| startUrls | array | Auto-detect URLs (tweets, profiles, lists) | [] |
| searchQueries | array | Search queries with advanced syntax | [] |
| profiles | array | Usernames, @handles, or profile URLs | [] |
| twitterHandles | array | Alias for profiles (apidojo compatible) | [] |
| tweetURLs | array | Tweet URLs or tweet IDs | [] |
| listURLs | array | X/Twitter list URLs or list IDs | [] |
| conversationIds | array | Conversation IDs for reply scraping | [] |
| maxResults | integer | Max results per input item | 100 |
| sort | string | Latest, Top, or Latest + Top | Latest |
| followerMode | string | followers or following | followers |
| includeReplies | boolean | Include replies in timelines | false |
| languageFilter | string | ISO 639-1 language code | "" |
| tweetLanguage | string | Alias for languageFilter | "" |
| start | string | Date range start (YYYY-MM-DD) | "" |
| end | string | Date range end (YYYY-MM-DD) | "" |
| minimumFavorites | integer | Min likes filter | null |
| minimumRetweets | integer | Min retweets filter | null |
| minimumReplies | integer | Min replies filter | null |
| author | string | From user (query wizard) | "" |
| inReplyTo | string | In reply to user | "" |
| mentioning | string | Mentioning user | "" |
| geotaggedNear | string | Near location | "" |
| withinRadius | string | Radius from location | "" |
| onlyVerifiedUsers | boolean | Verified users only | false |
| onlyTwitterBlue | boolean | X Premium users only | false |
| onlyImage | boolean | Images only | false |
| onlyVideo | boolean | Videos only | false |
| onlyQuote | boolean | Quote tweets only | false |
| includeSearchTerms | boolean | Tag results with search query | false |
| loginCookies | string | auth_token + ct0 cookies | "" |
| customMapFunction | string | JS transform function | "" |
| resumeFromDataset | string | Dataset ID to resume from | "" |
| proxyConfiguration | object | Proxy settings (optional) | {} |
Features
- 10 scraping modes covering every X/Twitter data need
- Query Wizard — build queries through UI fields without syntax knowledge
- Advanced search — full X/Twitter search operator support
- Latest + Top sort — dual search for maximum results
- Cookie rotation — multiple cookies for large-scale runs
- Resume capability — skip already-scraped items from previous runs
- Custom map function — transform output to your exact schema
- startUrls auto-detect — paste any X URL and it routes correctly
- apidojo-compatible — twitterHandles, tweetLanguage, includeSearchTerms aliases
- No proxy required — zero additional costs
- 128MB memory — lowest compute unit consumption
- Conversation threading — scrape reply threads via conversationIds
Technical Details
- Stack: Node.js 20, Impit (Chrome TLS fingerprinting), Apify SDK 3
- Memory: 128-256MB (HTTP-only, no browser)
- Speed: 2-8 seconds per run, ~50MB peak memory
- No proxy required for any mode
- No login needed for post scraping, profiles, and data extraction
Troubleshooting
Getting no results?
- Check that your search query isn't too restrictive
- Try
sort: Topinstead ofLatest— X sometimes returns fewer results with Latest - Remove
until:date filters if getting low counts
Authentication errors?
- Your cookies may have expired. Get fresh
auth_tokenandct0from x.com - Both
auth_tokenandct0are required - Format:
auth_token=YOUR_TOKEN; ct0=YOUR_CT0
Missing tweets?
- Some tweets are shadow-banned or filtered by X. This is outside our control.
- Try different date ranges or search terms
Want to resume a failed run?
- Copy the dataset ID from the previous run
- Add it to
resumeFromDataset— already-scraped items will be skipped
Support
Found a bug or need help? Open an issue on the Issues tab.