Tweet Scraper — X (Twitter) Search, Hashtags & Profiles
Pricing
from $1.84 / 1,000 tweets
Tweet Scraper — X (Twitter) Search, Hashtags & Profiles
Scrape tweets from X (Twitter) by search query, hashtag, username or tweet URL. Returns tweet text, engagement metrics, author details and media for each tweet.
Pricing
from $1.84 / 1,000 tweets
Rating
5.0
(1)
Developer
Khadin Akbar
Maintained by CommunityActor stats
2
Bookmarked
160
Total users
23
Monthly active users
13 hours ago
Last modified
Categories
Features
Share
Get the tweets of any X (Twitter) account, hashtag, mention, tweet link, reply thread or list, with likes, reposts, replies, views, author and media. No login, no cookies, JSON/CSV/Excel export. Pay only for tweets returned.
What you get
| Need | Input | Result |
|---|---|---|
| A account's timeline | handles | latest tweets, original only if you wish |
| Topic tracking | hashtags, searchQuery, mentioning | tweets with date, language and engagement filters |
| Exact tweets | tweetIds, startUrls | one row per tweet |
| Conversation | repliesToTweets, quotesOfTweets | replies or quote tweets |
| Curated feeds | listIds | list timeline |
| Watching | onlyNewSinceLastRun + a schedule | only tweets you have not received yet |
Which X Actor should I use?
| You want | Use |
|---|---|
| Accounts, hashtags, tweet IDs, replies, lists, monitoring | This Actor |
| Open keyword search with Top/Latest/People/Photos/Media tabs | X Twitter Search Scraper |
| Profile details (bio, followers) | X Twitter Profile Scraper |
Pricing
Pay per tweet returned: $0.002 (volume plans pay less: Silver about 3% off, Gold about 8% off). Start fee $0.00005. Apify platform usage is included in the price. 100 tweets cost about $0.20, 1,000 about $2. Free Apify plan runs return up to 50 tweets per run.
How we compare
| This Actor | Typical rival | |
|---|---|---|
| Price per tweet | $0.002, platform usage included | $0.00015 to $0.0004, platform usage often extra |
| Monitor mode (only new tweets) | yes | no |
| Replies, quotes, lists, tweet IDs in one Actor | yes | usually add-ons or separate Actors |
| Input checks | bad dates or language stop the run, nothing billed | silent empty result |
| Run cost | lean, no browser | varies |
Input fields
| Field | Type | Purpose |
|---|---|---|
searchQuery | string | Keywords or X advanced search syntax |
hashtags | array[string] | Hashtags to scrape, one query per hashtag |
handles | array[string] | X usernames to scrape via from:username queries |
startUrls | array[object] | Direct X.com or twitter.com profile/search URLs |
mentioning | string | Username to find tweets that mention that account |
sort | string | Latest, Top, or Both |
maxTweetsPerQuery | integer | Max tweets per source |
lang | string | ISO 639-1 language filter |
startDate | string | Since date in YYYY-MM-DD format |
endDate | string | Until date in YYYY-MM-DD format |
minimumLikes | integer | Minimum likes filter |
minimumRetweets | integer | Minimum retweets filter |
minimumReplies | integer | Minimum replies filter |
onlyVerified | boolean | Verified-account filter |
onlyImages | boolean | Image-only filter |
onlyVideos | boolean | Video-only filter |
excludeReplies | boolean | Excludes reply tweets |
excludeRetweets | boolean | Excludes retweets |
includeSourceQuery | boolean | Adds source_query to each record |
tweetIds | array[string] | Exact tweets by ID or link |
repliesToTweets | array[string] | Replies to these tweets |
quotesOfTweets | array[string] | Quote tweets of these tweets |
listIds | array[string] | Timelines of X Lists |
onlyNewSinceLastRun | boolean | Monitor mode: skip tweets returned by earlier runs of the same sources |
Focused input example
{"handles": ["OpenAI"], "sort": "Latest", "lang": "en", "maxTweetsPerQuery": 10, "excludeRetweets": true, "onlyNewSinceLastRun": true}
Output fields
| Field | Type | Purpose |
|---|---|---|
tweet_id | string | Unique tweet identifier |
text | string | Tweet display text |
full_text | string | Complete tweet text |
author_handle | string | Author username without @ |
author_name | string | Author display name |
author_id | string | Numeric author ID |
author_followers | number or null | Followers count |
author_following | number or null | Following count |
author_verified | boolean | Verified status |
created_at | string | Tweet timestamp |
like_count | number | Like count |
retweet_count | number | Retweet count |
reply_count | number | Reply count |
quote_count | number | Quote count |
view_count | number or null | View count when available |
is_reply | boolean | Reply indicator |
is_retweet | boolean | Retweet indicator |
is_quote | boolean | Quote-tweet indicator |
has_media | boolean | Media indicator |
media_urls | array[string] | Media URLs |
hashtags | array[string] | Hashtags in the tweet |
urls | array[string] | Expanded external URLs |
lang | string or null | Detected language |
conversation_id | string or null | Conversation root ID |
in_reply_to_user | string or null | Replied-to username |
url | string | Direct tweet permalink |
source_url | string | Queried API URL |
scraped_at | string | Extraction timestamp |
Illustrative output record
{"tweet_id": "1773456789012345678","text": "Just launched our new AI product! 🚀 #AI #tech","full_text": "Just launched our new AI product! 🚀 #AI #tech https://t.co/example","author_handle": "openai","author_name": "OpenAI","author_id": "1288285673","author_followers": 2500000,"author_following": 342,"author_verified": true,"created_at": "Mon Mar 25 14:30:00 +0000 2024","like_count": 4200,"retweet_count": 1100,"reply_count": 830,"quote_count": 210,"view_count": 980000,"is_reply": false,"is_retweet": false,"is_quote": false,"has_media": true,"media_urls": ["https://pbs.twimg.com/media/example.jpg"],"hashtags": ["AI", "tech"],"urls": ["https://openai.com/blog/example"],"lang": "en","conversation_id": "1773456789012345678","in_reply_to_user": null,"url": "https://x.com/openai/status/1773456789012345678","source_url": "https://twitter.com/i/api/2/search/adaptive.json?q=AI&count=40","scraped_at": "2026-03-31T12:00:00.000Z"}
Use with AI agents (MCP)
Available through Apify MCP as khadinakbar/x-tweet-scraper. Agents can pay per request (x402) with no account setup. Every row has tweet_id, url and source_url for deduplication. Example prompt: "Get the 20 latest English tweets from @OpenAI, originals only, with like counts."
Example with the Apify API
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/x-tweet-scraper').call({ handles: ['OpenAI'], maxTweetsPerQuery: 5, excludeRetweets: true });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
FAQ
Do I need an X account or cookies?
No. Collection is cookieless.
How does monitor mode work?
Turn on onlyNewSinceLastRun and schedule the Actor. It remembers tweet IDs per set of sources and returns only new ones.
Why are some results fewer than I asked for?
Public data only: deleted, private or protected tweets are not returned. You are charged only for tweets returned.
Can I get an account's followers or bio?
Use the Profile Scraper linked above.
What happens on bad input?
The run stops with INVALID_INPUT and nothing is charged.
How fresh is the data?
Live at the time of the run.
Legal
Collects publicly available data. You are responsible for complying with X's terms and applicable law (GDPR, CCPA) when storing or using personal data.