Twitter / X Scraper - Tweets, Profiles & Engagement
Eimantas V · @amethyst
Scrape tweets from any public Twitter / X account by handle or URL. Full text, likes, retweets, replies, quotes, bookmarks and view counts, plus hashtags, mentions, expanded links, images and playable video URLs. Retweets carry the original post's engagement. No API key, no browser.
About
Twitter / X Scraper — Tweets, Profiles & Engagement
Pull the posts from any public X (Twitter) account, with the numbers that matter attached: likes, retweets, replies, quotes, bookmarks and view counts. No login, no API key, no browser, and no X developer account.
Give it a handle, an @handle, or a profile URL. You get one row per tweet and one row per
account.
What you get for every tweet
| Field | Notes |
|---|---|
text | Full post text, including long posts that X truncates elsewhere |
createdAt | ISO 8601, UTC |
likeCount, retweetCount, replyCount | |
quoteCount, bookmarkCount, viewCount | Views as X reports them |
isRetweet, isReply, isQuote | |
retweetedFrom | The account a retweet came from |
authorHandle, authorName, authorFollowers, authorVerified | |
hashtags, mentions, links | Links are expanded, not t.co |
mediaUrls, mediaType | photo, video or animated_gif |
videoUrls | Playable MP4s, highest quality first — mediaUrls holds only the poster frame for a video |
lang, url, tweetId |
Retweets report the original post's engagement. X hands a retweet its own counters set to zero; this Actor reads through to the post that was retweeted, so a retweet of something with 805 likes says 805, not 0. That is the difference between usable data and a silently wrong column.
And for every account
displayName, description, followers, following, tweetsTotal, listedCount,
location, website, joinedAt, verified, profileImageUrl, bannerUrl — plus
tweetsFetched, pagesFetched and stoppedOn, so you can always tell why a run returned
what it did.
Pricing
Pay per result. You are charged for tweets you actually receive.
| Event | Price |
|---|---|
| Tweet scraped | $0.40 per 1,000 |
| Profile scraped | $0.002 each |
| Actor start | $0.00005 |
Accounts that do not exist, are suspended, or could not be reached are never charged — results are written to your dataset before any charge is raised, so you cannot be billed for something you did not get.
Example input
{
"profiles": ["nasa", "@Interior", "https://x.com/NASAWebb"],
"maxTweetsPerProfile": 100,
"maxTotalTweets": 1000,
"includeRetweets": true
}
Example output
{
"tweetId": "2100212144692179390",
"url": "https://x.com/nasa/status/2100212144692179390",
"text": "LIVE: Tune in as an uncrewed cargo spacecraft lifts off to the @Space_Station…",
"createdAt": "2026-09-16T13:16:05.000Z",
"authorHandle": "NASA",
"authorFollowers": 92368095,
"isRetweet": false,
"likeCount": 1969,
"retweetCount": 353,
"viewCount": 1647803,
"mentions": ["Space_Station"],
"mediaType": null,
"lang": "en"
}
Limits worth knowing before you run it
These are X's, not this Actor's, and no scraper can get around them:
- About 3,200 posts per account. X's own timeline stops there. Asking for more returns
what exists and says so in
stoppedOn. - Replies are not in the Posts timeline. X serves an account's replies on a separate tab
this Actor does not read, so
includeRepliesonly decides whether a reply that appears anyway is kept. It cannot fetch an account's reply history. - Protected accounts return no posts. The profile row still comes back, with real
follower counts and
stoppedOn: "protected", so you can tell "private" from "empty". - About 10 tweets per request. X returns 20 timeline entries whatever page size is asked for, and only some of them are posts — the first page of a timeline yields around 17, deeper pages fewer. Measured over a full run: 300 tweets took 29 requests. Speed is bounded by that, not by this Actor.
Speed and blocking
X rate-limits by address. The default settings run comfortably; if a run starts getting refused, raise Delay between requests or switch the proxy to the RESIDENTIAL group in the input — no rebuild needed. Guest sessions are renewed automatically when X expires them.
Integrations
Results land in a standard Apify dataset, so you can export to JSON, CSV or Excel, or push them onward with any Apify integration — Make, Zapier, Google Sheets, Slack, or the API. Two ready-made views are included: Tweets and Profiles.
Support
Something wrong, or a field you need that isn't here? Open an issue on this Actor's page — that reaches the developer directly and is the fastest way to get it fixed.
Is scraping X legal?
This Actor reads only public posts — the same content any logged-out visitor sees — and touches no private data and no account of yours. Scraping publicly available information is broadly lawful, but what you do with it is not automatically so: personal data carries obligations under the GDPR and similar laws, and X's own terms apply to you as a user. If you are collecting personal data at scale, take your own legal advice first.
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
Fields
profilesHandles or profile URLs. "nasa", "@nasa" and "https://x.com/nasa" are all accepted.
maxTweetsPerProfileX returns 20 timeline entries per request whatever page size is asked for, which works out at roughly 10 tweets per request over a run. 100 tweets is about 10 requests. Its own timeline stops at about 3,200 posts per account.
maxTotalTweetsA ceiling across every profile in the run, so a long list cannot run away with your budget.
includeRetweetsRetweets carry the original post's text and engagement, with retweetedFrom naming the account it came from. Turn off for original posts only.
includeRepliesX's Posts timeline does not serve replies, so this only decides whether a reply that appears anyway is kept. It cannot make this Actor fetch an account's reply history.
requestDelayMsX rate-limits by address. Raise this if runs start being refused.
proxyConfigDatacenter works today and is far cheaper. Switch to RESIDENTIAL if X starts refusing the run.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is amethyst/twitter-scraper (or amethyst~twitter-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"profiles": [
"nasa"
],
"maxTweetsPerProfile": 100,
"maxTotalTweets": 1000,
"includeRetweets": true,
"includeReplies": false,
"requestDelayMs": 700,
"proxyConfig": {
"useApifyProxy": true
}
};
const run = await client.actor('amethyst/twitter-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"profiles": [
"nasa"
],
"maxTweetsPerProfile": 100,
"maxTotalTweets": 1000,
"includeRetweets": True,
"includeReplies": False,
"requestDelayMs": 700,
"proxyConfig": {
"useApifyProxy": True
}
}
run = client.actor("amethyst/twitter-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/amethyst~twitter-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profiles":["nasa"],"maxTweetsPerProfile":100,"maxTotalTweets":1000,"includeRetweets":true,"includeReplies":false,"requestDelayMs":700,"proxyConfig":{"useApifyProxy":true}}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.
Related
More Actors from the same publisher.

Instagram Profile Scraper - Followers, Posts & Emails
Eimantas V · @amethyst
Scrape Instagram profiles by username, URL or ID: exact followers, following and post counts, bio, links, emails and phones from the bio, category, verified and business flags, engagement rate, 12 latest posts and related profiles. No login. From $1.60 / 1,000.
Social mediaLead generationMarketing$19/mo7-day free trial
Facebook Ads Library Scraper - Meta Ads, All Countries
Eimantas V · @amethyst
Scrape the Facebook Ads Library by keyword, Page or Ad Library link, in any country: ad copy, images and videos, landing pages, CTAs, run dates, platforms and the advertiser Page with its likes. Political ad spend included. No login, no token.
MarketingSocial mediaBusiness$29/mo7-day free trial
Google Search Results Scraper - SERP API
Eimantas V · @amethyst
Scrape Google search results by keyword or URL: organic results with real URLs and ranks, places, top stories, knowledge panel, related searches, News and Videos tabs. Optional AI Overview, People also ask and ads. Any country, language or city. From $0.40 per 1,000 pages.
SEO toolsMarketingLead generation$19/mo7-day free trial
YouTube Channel & Video Scraper
Eimantas V · @amethyst
Scrape YouTube channels and videos without a browser: subscriber counts, full video lists, exact view counts, durations, publish dates, keywords, and optional likes and comment counts.
Social mediaBusinessMarketing$19/mo7-day free trial