X (Twitter) Post & Tweet Scraper-MCP & API for AI Agents, LLM's
Pricing
$0.49 / 1,000 results
X (Twitter) Post & Tweet Scraper-MCP & API for AI Agents, LLM's
Scrape posts and tweets from X (Twitter): search, timelines, URLs, and threads, no official API key. Structured JSON for apps, AI agents, and LLM/RAG. You pay per unique tweet delivered, no duplicates; empty runs cost nothing, with no mock or placeholder data. Unofficial, not affiliated with X Corp.
Pricing
$0.49 / 1,000 results
Rating
5.0
(2)
Developer
CodePerfection
Maintained by CommunityActor stats
1
Bookmarked
3
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Real tweets from X (Twitter) — with billing you can audit. Search posts and tweets, expand threads, pull profiles and single tweets, and get clean structured JSON. You pay per unique real tweet delivered — every run ends with a receipt where accepted = charged = dataset items. Empty runs cost $0. No mock data, no duplicates, no phantom charges — ever.
No official Twitter/X API key required. Output is ready for apps, spreadsheets, OSINT and research workflows, AI agents, and LLM/RAG pipelines.
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by X Corp or Twitter. "X" and "Twitter" are trademarks of their respective owners.
Twitter (X) scraper with an auditable per-tweet bill
Most X scrapers lead on price and speed and stay quiet about what you actually get billed for. This one leads on the opposite:
- Pay per unique real tweet. One charge per delivered tweet — deduplicated by tweet ID across pages, sources, and search terms. You are never billed for the same tweet twice.
- $0 on an empty run. No results found? You pay nothing. No minimum, no "we returned some placeholder rows so we could charge you."
- A receipt every run. The run writes a reconciliation record where
accepted = charged = dataset items. If those three don't independently match, the run fails instead of billing you for something it can't prove. - No mock/placeholder data. Every row is a real tweet. Filtered-out, deduplicated, and unroutable inputs are disclosed in the run log — not padded into your billed dataset.
Tweets you are never charged for
| Not billed | Why |
|---|---|
| Empty runs (0 results) | You pay for tweets, and there weren't any |
| Duplicate tweets | Deduplicated by ID before delivery |
| Filtered-out tweets | Removed by your filters, never delivered |
| Unroutable inputs | Disclosed in SKIPPED_SEEDS, never charged |
| The free dry-run | Validate your output shape for $0 (see below) |
| Output shaping | Presets, projections, and jq transforms are included |
Pricing: $0.49 per 1,000 tweets
$0.49 per 1,000 tweets — that's $0.00049 per unique tweet delivered. Platform usage (compute, proxy, storage) is included, so your invoice is one clean per-tweet line.
| Tweets delivered | You pay |
|---|---|
| 0 (empty run) | $0.00 |
| 100 | $0.049 |
| 1,000 | $0.49 |
| 10,000 | $4.90 |
Scrape tweets by keyword, hashtag, handle, URL, or thread
No 3-Actor split, no bouncing between listings. One input covers every X search mode, and everything is merged and deduplicated into one billed result set:
- Search — full X advanced-search syntax (
from:,filter:,since:/until:,min_faves:, language, media, hashtags, and more). This is a full Twitter search scraper. - Handles — scrape a list of accounts' tweets (a Twitter profile scraper: pull a user's tweets by handle).
- URLs — a tweet URL (that exact tweet), a profile URL, a search URL, a list URL, or a hashtag URL.
- Threads — expand a conversation into its replies.
Filter tweets by date, likes, language, and media
Every filter you set is applied as an X advanced-search operator and re-checked on each returned tweet. A tweet that doesn't genuinely match is dropped (counted as filtered, never delivered, never charged) rather than leaked through. If the data can't verify a filter on a returned tweet, that's disclosed in the run log — it's never silently ignored.
Date range, from/reply-to handle, mentions, minimum likes/retweets/replies, language, media type, verified / blue-verified, and quote-only are all enforced this way. Tweet IDs are returned as strings, so 64-bit IDs are never rounded; quoted and retweeted tweets are fully expanded.
Export tweets to CSV or JSON
Shape and download the data however you need. It never changes your bill — you always get exactly one row per tweet:
- Ready-made formats —
full(complete nested JSON),compact(the fields most people use), orcsvFlat(CSV columns for spreadsheets and Excel). - Pick the fields you want (no code) — keep only the fields you need, rename them, reorder them, flatten nested fields into columns, and add your own tag columns.
- Custom formulas (advanced) — a
jqexpression for calculated fields like total engagement, ratios, and conditionals. - Free preview — set
validateTransformOnly: trueto see exactly what one row will look like against a sample tweet, with no scrape, no rows, and no charge.
No Twitter or X API key required
Scrape Twitter without an API key. There is no official X API access, developer account, app registration, or bearer token to set up, and no rate-limit tier to buy. Provide your search terms, handles, or URLs and run — the Actor handles collection and hands back clean tweets.
Twitter data for AI agents, OSINT, and LLM/RAG
Clean, consistently-shaped JSON per tweet — author, engagement counts, media, and fully-expanded quoted & retweeted tweets — or projected/jq'd down to exactly the fields you need. No official API key to manage. As a standard pay-per-event Actor with limited permissions, it's discoverable and callable by AI agents and assistants — Claude, ChatGPT, Gemini, Codex, and any MCP client — via MCP and agentic payments, as well as from the API, UI, and scheduler. It's a clean building block for OSINT and research, monitoring, and real-time LLM/RAG workflows.
Scrape tweets from your AI agent (MCP)
Call this scraper straight from Claude, ChatGPT, Cursor, or any MCP client — no code. Your agent finds it as a tool, runs it, and reads the tweets back for you.
1. Connect. Point your MCP client at this URL:
https://mcp.apify.com/?tools=codeperfection/x-twitter-scraper
In Claude Desktop (Settings → Developer → Edit Config), that is:
{"mcpServers": {"x-twitter-scraper": {"url": "https://mcp.apify.com/?tools=codeperfection/x-twitter-scraper"}}}
Claude Desktop signs you in to Apify through your browser on first use. For Cursor, VS Code, and other token-based clients, add the same url plus a header: "Authorization": "Bearer YOUR_APIFY_TOKEN".
2. Just ask. Talk to your agent in plain language:
"Get the 20 latest tweets from @NatGeo."
"Search X for #AI posts in English with at least 100 likes."
"Pull the replies in this thread: https://x.com/NatGeo/status/…"
Your agent runs the scraper and fetches the results for you — no steps to manage. Billing is identical to the UI and API: $0.49 / 1,000 tweets, and empty results cost $0.
Quick start
Search tweets by keyword or advanced-search operators:
{ "searchTerms": ["\"climate change\" min_faves:100 lang:en", "#ai filter:images"], "maxTweets": 100, "sort": "Latest" }
Scrape a user's tweets (one or more handles):
{ "twitterHandles": ["NatGeo", "BBCEarth"], "maxTweets": 50 }
A single tweet, a profile, and a thread, by URL / conversation ID:
{"startUrls": ["https://x.com/NatGeo/status/2075663637319217267", "https://x.com/NatGeo"],"conversationIds": ["2073460397902827575"]}
A hashtag or a saved search, by URL:
{ "startUrls": ["https://x.com/hashtag/ai", "https://x.com/search?q=climate%20min_faves%3A100&f=live"], "maxTweets": 200 }
Advanced filters (all provably enforced):
{ "searchTerms": ["climate"], "fromUser": "NatGeo", "startDate": "7 days", "minFaves": 100, "language": "en", "media": "images" }
Output
Each item is one real tweet (the full preset shown trimmed):
{"id": "2075663637319217267","url": "https://x.com/NatGeo/status/2075663637319217267","text": "...","created_at": "2022-10-26T13:00:00.000Z","lang": "en","like_count": 12043, "retweet_count": 1876, "reply_count": 402, "quote_count": 55, "view_count": 980112,"hashtags": [], "mentions": [], "urls": [], "media": [],"author": { "username": "NatGeo", "followers": 27926325, "verified": false, "blue_verified": true },"quoted": null, "retweeted": null}
Prefer columns? Use outputPreset: "csvFlat", or a projection / jq to keep exactly the fields you want.
The receipt
At the end of every run, the key-value store holds a RECEIPT record:
{ "billingEvent": "apify-default-dataset-item", "acceptedUniqueTweets": 100, "chargedTweets": 100, "datasetItems": 100, "reconciled": true, "reconciliationStatus": "ok" }
datasetItems is read back independently from the dataset — so the receipt genuinely reconciles what you were charged against what was stored, rather than restating one number twice. Per-term SUMMARY_* records break down what each search delivered vs. fetched.
Free plan
Free-plan (non-paying Apify) accounts get a capped preview of up to 5 tweets per run so you can try the Actor end to end — the full receipt is still written. Upgrade to any paid Apify plan for uncapped runs.
FAQ
How do I scrape tweets without a Twitter/X API key? Provide search terms, handles, or X URLs and run. There is no official X API, developer account, app, or bearer token to set up — the Actor collects the tweets for you.
Can I export tweets to CSV or JSON? Yes. Set outputPreset: "csvFlat" for flat spreadsheet columns, keep full or compact for nested JSON, or use the field picker / jq to choose exactly the columns you want. Shaping the output never changes your bill.
How do I scrape all tweets from a user? Add the account to twitterHandles (or pass its profile URL in startUrls) and raise maxTweets. Each handle runs as a from: search, so your date, engagement, and language filters still apply.
How do I scrape tweets from a hashtag? Put the term in searchTerms (for example #ai), or pass a hashtag URL like https://x.com/hashtag/ai in startUrls.
How much does it cost? $0.49 per 1,000 unique tweets delivered, which is $0.00049 each. Empty runs cost $0, and platform usage (compute, proxy, storage) is included.
Do you charge for tweets you didn't return? No. Billing is one charge per unique real tweet actually delivered to your dataset. Empty runs, duplicates, and filtered-out tweets cost nothing.
What if a run finds nothing? It costs $0 and reports no results — no minimum, no placeholder rows.
How do I control cost? maxTweets caps per search term; maxTotalTweets caps the whole run; and Apify's per-run max-cost limit is respected.
Why did a run say "partial"? You hit a cap (e.g. maxTweets) and more results existed — the run tells you exactly how many were left so you can raise the cap. It's honesty, not an error.
Support
Found a bug or need a field added? Open an issue on the Actor and it'll get looked at.