Twitter / X Scraper | No API Key | Pay Per Tweet avatar

Twitter / X Scraper | No API Key | Pay Per Tweet

Pricing

from $0.90 / 1,000 tweets

Go to Apify Store
Twitter / X Scraper | No API Key | Pay Per Tweet

Twitter / X Scraper | No API Key | Pay Per Tweet

Scrape public tweets from X (Twitter) by keyword, hashtag or username without a paid API key. Returns text, likes, retweets, views, date and media URLs. MCP ready. Pay per tweet, first 10 free.

Pricing

from $0.90 / 1,000 tweets

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

17

Total users

4

Monthly active users

3 days ago

Last modified

Share

67 tweets from 3 X accounts in 20 seconds: a recorded test run returned the latest posts of @AnthropicAI, @NASA and @verge in 20.0 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

This actor pulls the latest public posts of any X (formerly Twitter) accounts you name and returns one clean row per post: author, post link, text, date, likes, reposts, replies, views, reply and repost flags, media links, mentions and hashtags. No X developer account, no paid API plan and no login are needed for accounts. Keyword search is also available, but X only allows it with a logged-in session that you supply (see "Can I search by keyword or hashtag?").

Why choose this actor?

  • The latest posts of many accounts in seconds. On 1 Oct 2026 a test run returned 67 posts from @AnthropicAI, @NASA and @verge in 20 seconds, with no login and no X API key. Each account gives the 20 to 24 posts X shows on its timeline, with the author and a link on every row.
  • Engagement on every row. All 67 rows carried like, repost, reply and view counts, the post date and reply and repost flags, so comparing accounts or posts needs no clean-up.
  • From $0.90 per 1,000 tweets. You pay per post saved, plus Apify's start event of $0.005 per run at the default memory. An account that cannot be found, an empty timeline, a failed fetch and a search without a session are never charged.

Run it on Apify

Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.

Try it in one minute

Paste this into the JSON tab of the input page and press Start. It returns the 10 latest posts of @NASA; our daily one-account runs on Apify take 6 to 33 seconds.

{
"handles": ["NASA"],
"maxTweets": 10
}

The actor takes X usernames in handles, with or without the @, not post links or profile links. Keyword and hashtag search goes in searchTerms and needs your own X session cookies in sessionCookies. The input form starts with two example search terms and a placeholder cookie filled in: delete them if you only want accounts.

Apify's free plan includes $5 of credit every month, which covers about 3,330 results at this actor's price.

Copy to your AI assistant

themineworks/twitter-x-scraper on Apify. It returns the latest public posts of X (Twitter) accounts, without an X API key or login, one row per post with tweetId, tweetUrl, authorName, authorHandle, authorUrl, authorVerified, text, date, likes, retweets, replies, views, isRetweet, isReply, mediaUrls, mentions, hashtags and source (the account or search term). Call ApifyClient("TOKEN").actor("themineworks/twitter-x-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: handles (array of usernames such as ["NASA", "verge"]) or searchTerms. Optional: maxTweets (per account or term, default 20, maximum 100, but an account returns about 20 to 24 posts), searchFilter ("top" or "latest", search only), sessionCookies (array of the user's own X cookies including auth_token and ct0; needed for searchTerms), useBrowserFallback (default false). Search without sessionCookies returns a no_results row, not posts. Rows with a _type field (no_results, summary, info) are run notes, not posts. An account's rows can include the original of each repost and the posts it quoted, written by other accounts; authorHandle shows who wrote each row. Full spec: GET https://api.apify.com/v2/acts/themineworks~twitter-x-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations

Key features

  • 19 fields per post: 15 on every row (ID, post link, author name, handle and profile link, verified flag, text, date, likes, reposts, replies, reply flag, repost flag, source and timestamp), plus views, media links, mentions and hashtags when X has them.
  • Many accounts in one run. List as many usernames as you like; each one is fetched separately and labelled in source.
  • No login for accounts. Account timelines are read over plain HTTP the way a logged-out visitor's browser reads them, with no browser and no X API key.
  • Video links included. For a video, mediaUrls holds the highest quality MP4 X offers; for photos, the image links.
  • Clear notes instead of silent gaps. An account that is missing, protected or empty, or a search that cannot run, gets its own no_results row with the reason, and is not charged.
  • A summary row at the end of every run with posts delivered and charged. It is never charged.

How to use it

Basic: one account

{
"handles": ["AnthropicAI"],
"maxTweets": 20
}

You get the posts X shows on the account's timeline to logged out visitors, including its replies and reposts, in X's order: for most accounts that is the newest first, with the posts of a thread kept together. For some large accounts X shows older popular posts instead (see "What data do you get?").

Competitor and brand monitoring

{
"handles": ["verge", "techcrunch", "WIRED"],
"maxTweets": 25
}

Save this as a task and schedule it every few hours or daily, for example with the cron 0 */6 * * *. Each run returns each account's latest 20 or so posts, so keep the tweetId values you have stored and add only new ones. For a busy account that posts more than 20 times between runs, run more often.

Engagement benchmarking

{
"handles": ["NASA", "ESA", "SpaceX"],
"maxTweets": 25
}

Compare views, likes, retweets and replies per post across accounts, and split by isReply and isRetweet to see original posts only. On a repost, likes reads 0 and retweets is the original post's count, so leave reposts out of like averages.

Keyword or hashtag search with your own X session

{
"searchTerms": ["#Crew13", "Claude Sonnet"],
"searchFilter": "latest",
"maxTweets": 20,
"sessionCookies": [
{"name": "auth_token", "value": "YOUR_AUTH_TOKEN", "domain": ".x.com", "path": "/"},
{"name": "ct0", "value": "YOUR_CT0", "domain": ".x.com", "path": "/"}
]
}

X only serves search to logged-in users. With your session's auth_token and ct0 cookies the actor runs search over plain HTTP, top or latest. Read "Can I search by keyword or hashtag?" before you use your own account.

Collect media from an account

{
"handles": ["NASA"],
"maxTweets": 25
}

Keep rows that have mediaUrls: 11 of NASA's 23 posts in our test carried a photo or video link.

Input parameters

ParameterTypeDefaultWhat it does
handlesarray of stringsnoneX usernames, with or without @, such as NASA or @verge. No login needed.
searchTermsarray of stringsnoneKeywords or hashtags to search. Needs sessionCookies (see below).
maxTweetsinteger, 1 to 10020Cap on posts per account or per search term. An account returns about 20 to 24 posts whatever the cap.
searchFilterstring: top or latesttopOrder of search results. Search only; account timelines come in X's own order.
sessionCookiesarray of cookie objectsnoneCookies from your own logged-in X session. Search needs both auth_token and ct0.
authTokenstring (secret)noneThe auth_token value alone. On its own it does not enable search, because X also needs ct0; use sessionCookies.
useBrowserFallbackbooleanfalseTry search without a session by loading X's search page in a browser. It is slower and usually returns nothing, because X shows a login wall.
proxyConfigobjectApify residential proxyUsed only by the browser fallback. Account and session search requests use the actor's own proxy setting.

Give at least one of handles or searchTerms. The input form starts with AnthropicAI, maxTweets: 5, two example search terms and a placeholder cookie; delete the examples you do not need. Runs started through the API or an AI assistant get only what you send, plus the defaults above.

What data do you get?

One row per post. A field X does not attach to a post is left out of that row rather than sent as null.

The post: tweetId, text, date (ISO 8601 in UTC), isReply and isRetweet.

Engagement: likes, retweets (reposts), replies and views, as counts at the moment of the run.

Media and entities: mediaUrls (photo links, or the best MP4 link for a video), mentions (usernames without @) and hashtags (without #), each only when the post has them.

Author and origin: authorName (display name), authorHandle (username without @), authorUrl (profile link), authorVerified (whether the posting account has a verified badge), tweetUrl (link to the post) and source, the @handle or search term that returned the post.

Timing: scraped_at, when the row was collected.

Run rows: a _type: "no_results" row for each account or search term that returned nothing, with the reason; a _type: "summary" row at the end of every run with total_tweets_scraped and total_charged; and a _type: "info" row when at least one post was delivered. None is charged. Filter on _type to keep only posts.

What we saw in 814 posts from 27 accounts on 1 Oct 2026, so you can plan for it:

  • Author and link on every row. authorName, authorHandle, authorUrl and tweetUrl were on all 814 rows, and every tweetUrl has the form https://x.com/<authorHandle>/status/<tweetId>.
  • Other accounts' posts can appear in an account's rows. X's timeline carries the original post behind each repost and the post behind each quote, and the actor returns those as rows too, charged like any post. 80 of 814 rows were such posts, for example @claudeai posts quoted by @AnthropicAI. Their source is still the account you asked for; authorHandle shows who wrote them, so keep rows where it matches if you only want the account's own posts.
  • Not always the newest posts. For most accounts the rows were the latest few days of posts, but for some X shows logged out visitors older, popular posts instead: @Reuters gave posts from 2018 to 2023, @nytimes from 2017 to 2025, and @elonmusk one post from that week and 19 from 2022 to 2024. Check date before you treat a run as "latest".
  • views is missing on posts from before X started counting views in late 2022 (93 of 814 rows, all from those older timelines).
  • Reposts are short. On the 6 reposts, text starts with RT @user: and is cut with "…", likes reads 0 and retweets is the original post's count.
  • Long posts can be cut. text is X's classic post text, so a post longer than the classic limit can end mid sentence. The longest text we saw was 326 characters, links included.
  • mediaUrls appeared on 349 rows, mentions on 196 and hashtags on 31.

Stable fields for automations

These 15 fields were present in every one of the 814 posts we sampled on 1 Oct 2026. Their names will not change, so a Sheet, Zap, Make scenario or n8n flow can map to them safely.

FieldWhat it is
tweetIdX's post ID. Use it as the unique key.
tweetUrlLink to the post on x.com
authorNameDisplay name of the account that wrote the post
authorHandleUsername of that account, without @
authorUrlProfile link of that account
textPost text
dateWhen the post was published, ISO 8601 in UTC
likesLike count
retweetsRepost count
repliesReply count
isReplytrue if the post is a reply
isRetweettrue if the post is a repost
authorVerifiedtrue if the posting account is verified
sourceThe @handle or search term that returned it
scraped_atWhen the row was collected, ISO 8601 in UTC

Output examples

Real rows from our 1 Oct 2026 test run.

An original post with a link

{
"tweetId": "2105657774286021117",
"tweetUrl": "https://x.com/verge/status/2105657774286021117",
"authorName": "The Verge",
"authorHandle": "verge",
"authorUrl": "https://x.com/verge",
"authorVerified": true,
"text": "Most microdramas are vertical content, but not all vertical content feels like a real microdrama. https://t.co/Squu2fxnvu",
"date": "2026-10-01T13:55:09.000Z",
"likes": 4,
"retweets": 0,
"replies": 4,
"views": 4592,
"isRetweet": false,
"isReply": false,
"source": "@verge",
"scraped_at": "2026-10-01T14:20:32.384Z"
}

A thread reply with a video and mentions

{
"tweetId": "2105657490608390546",
"tweetUrl": "https://x.com/NASA/status/2105657490608390546",
"authorName": "NASA",
"authorHandle": "NASA",
"authorUrl": "https://x.com/NASA",
"authorVerified": true,
"text": "@Space_Station @SpaceX If you were living on the @Space_Station for six months, what would you bring with you?\n \nThe members of the Crew-13 mission are bringing reminders of home, such as toys that belong to their children, rosaries, and a hundred-year-old pocket watch passed down through generations. https://t.co/zFrnR483ho",
"date": "2026-10-01T13:54:01.000Z",
"likes": 35,
"retweets": 2,
"replies": 6,
"views": 10919,
"isRetweet": false,
"isReply": true,
"mediaUrls": ["https://video.twimg.com/amplify_video/2105657200186204160/vid/avc1/3840x2160/8EM_B7qUx2nk6_W6.mp4?tag=29"],
"mentions": ["Space_Station", "SpaceX", "Space_Station"],
"source": "@NASA",
"scraped_at": "2026-10-01T14:20:26.192Z"
}

A repost, with a hashtag

{
"tweetId": "2105633890350358880",
"tweetUrl": "https://x.com/NASA/status/2105633890350358880",
"authorName": "NASA",
"authorHandle": "NASA",
"authorUrl": "https://x.com/NASA",
"authorVerified": true,
"text": "RT @nasahqphoto: Check out images of @NASA's @SpaceX #Crew13 departing the Neil A. Armstrong Operations and Checkout Building to head to La…",
"date": "2026-10-01T12:20:14.000Z",
"likes": 0,
"retweets": 63,
"replies": 0,
"views": 40340,
"isRetweet": true,
"isReply": false,
"hashtags": ["Crew13"],
"mentions": ["nasahqphoto", "NASA", "SpaceX"],
"source": "@NASA",
"scraped_at": "2026-10-01T14:20:26.195Z"
}

A search term sent without a session, and the summary row

{
"_type": "no_results",
"source": "AI agents",
"type": "search",
"reason": "Keyword search requires authentication. Provide sessionCookies (with ct0), or use handles instead. Nothing was charged.",
"scraped_at": "2026-10-01T14:20:32.392Z"
}
{
"_type": "summary",
"total_tweets_scraped": 67,
"total_charged": 67,
"charged": 67,
"charge_failures": 0,
"uncharged_rows": 0,
"budget_exhausted": false,
"generated_at": "2026-10-01T14:20:32.392Z"
}

Pricing

Pay per event: you are charged for each post saved to your dataset, plus Apify's standard start event. The price per post drops as your Apify plan goes up.

EventFree planBronze (Starter)Silver (Scale)Gold and above (Business)
tweet-scraped, per post$0.0015$0.00128$0.00108$0.0009
Per 1,000 posts$1.50$1.28$1.08$0.90
apify-actor-start, per run$0.005 per GB of memory$0.005 per GB$0.005 per GB$0.005 per GB
  • Start fee: $0.005 per GB of run memory, with a minimum of one event. At the default 512 MB that is $0.005 per run, charged even when a run returns nothing. The actor needs no more than the default unless you turn on the browser fallback.
  • Never charged: no_results, summary and info rows, accounts that cannot be found, protected or empty timelines, failed fetches, searches without a session, and repeats of the same post within one account or search term.
  • Spending cap: if you set a maximum cost per run in Apify, the actor stops charging once that budget is used, and you never pay past your cap.
  • No price change is scheduled. The current prices, including the start event, have applied since 14 Sep 2026.

Worked examples on the Free plan: the latest posts of 10 accounts (about 220 posts) cost about $0.33 plus the $0.005 start fee. On Gold, the same run costs about $0.20 plus $0.005.

FAQ

Do I need an X API key or developer account? No. Account timelines are read the way x.com shows them to logged-out visitors. You only need an Apify account.

How many posts can I get per account? About 20 to 24, one page of the account's timeline, including any reposted or quoted posts by other accounts. In our test @AnthropicAI gave 24, @NASA 23 and @verge 20 with maxTweets at 100. maxTweets lowers that number but cannot raise it. For older posts, this actor is not the right tool; for a running archive, schedule it and keep every tweetId.

Can I search by keyword or hashtag? Only with a logged-in X session, because X does not serve search to logged-out visitors. Paste the auth_token and ct0 cookies of your own X session into sessionCookies and the actor searches over plain HTTP. Know the trade-off: the session belongs to your X account, automated use can break X's rules, and X can limit or suspend the account. Without a session, each search term gets a no_results row and costs nothing. useBrowserFallback tries without a session but usually meets X's login wall. We could not test session search for this page, so start with one term and a small maxTweets.

Can I filter by date range? There is no date filter in the input. Filter on date in the output. For search with a session, searchFilter: "latest" returns the newest posts first.

How fresh is the data? Each run reads X live when it starts. There is no cache, and engagement counts are the values at that moment.

Why did a run return no posts? Either the account is missing, suspended, protected or empty (you get a no_results row with the reason), or X's guest access did not answer. In 6 of our last 30 daily runs on Apify the connection to X timed out or dropped before any account was read; those runs ended with only the summary row and charged only the start fee. Run again, or schedule runs so one miss does not matter.

Do I need a proxy? No. The actor sets its own proxy for account and session requests. proxyConfig only applies to the browser fallback.

Why do some rows have a different author from the account I asked for? When an account reposts or quotes a post, X's timeline also carries that original post, and the actor returns it as a row with the original writer in authorName and authorHandle. source still names the account you asked for. Filter on authorHandle to keep only the account's own posts.

How is this different from the official X API? No developer application, no monthly plan, and you pay only for posts delivered. The trade-off is scope: you get recent public posts and their engagement counts, not full history, streaming, private data or posting.

Which formats can I export? JSON, CSV, Excel, XML, RSS or HTML from the run's Storage tab, or through the Apify API. In CSV and Excel, list fields such as mediaUrls are split into numbered columns.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/twitter-x-scraper.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http twitter-x-scraper "https://mcp.apify.com/?tools=themineworks/twitter-x-scraper".

Is it legal to scrape X? Without a session, the actor reads only public posts that anyone can see logged out. Posts are written by people, so they can contain personal data, and using a session of your own adds X's account rules to the picture. You are responsible for how you use the data, including X's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice.

Integrations

  • Google Sheets: send each run's dataset to a sheet with Apify's Google Sheets integration.
  • Make, Zapier and n8n: start a run and read the posts with the official Apify modules and nodes.
  • Webhooks: have Apify call your URL when a run finishes, then fetch the dataset.
  • API: start runs and read results over HTTP, or with the Python and JavaScript clients.
  • MCP clients: Claude, ChatGPT, Cursor and other MCP clients can call the actor through https://mcp.apify.com.

More from The Mine Works

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a bug or need a field we do not return? Open an issue in the Issues tab. Want a social network or data source we do not cover yet? Email dmineworks@gmail.com. A guide for this actor also lives at themineworks.com.

This actor is an independent tool and is not affiliated with, endorsed by or sponsored by X Corp.

Twitter / X Scraper returns the latest public posts of any X accounts with full engagement counts, no API key and no login, from $0.90 per 1,000 posts.