Pricing
from $0.10 / 1,000 results
X (Twitter) Account Tweets Scraper
Get recent tweets from any public X (Twitter) account by handle. Returns up to ~100 most recent tweets per account with text, media, counts (likes/retweets/replies/views), entities, and author metadata. HTTP-only, no login required.
Pricing
from $0.10 / 1,000 results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Bulk-scrape recent tweets from any public X (Twitter) account β full text (including long tweets over 280 characters), media URLs, view count, like / retweet / reply / quote counts, hashtags, mentions, and author metadata β in a clean structured JSON output.
Why use this actor
- No account / no login required β just give it an X handle, an
@handle, or a profile URL. - No API key needed β get the same data the X web app shows, without paying for the X API.
- Full tweet text, not truncated β long tweets (>280 chars, premium long-form) are returned in full via the
full_textfield; the legacy 280-char shape is preserved for backward compatibility. - All public engagement counters β view count, likes, retweets, replies, quotes, and bookmarks per tweet.
- Paginated timeline β automatically follows the next-page cursor so you can pull dozens of tweets per account in one run.
- Bulk input β pass a list of handles in a single run; each account is processed independently with its own error envelope.
- Stable JSON output suitable for pipelines, spreadsheets, and databases β every row carries
_input,_source, and_scrapedAtenvelope fields so you can join results back to your input list.
How it works
- You provide a list of X handles (e.g.
jack) or profile URLs (e.g.https://x.com/elonmusk). - The actor resolves each handle to the underlying account, then reads its public timeline page by page the same way the X web app does.
- For tweets with long-form content, the full rich-text body is lifted into
full_textautomatically. - Results stream into your dataset, ready to download as JSON, CSV, or Excel.
You do not need to manage scrapers, browsers, or rotating IPs β all handled internally.
Input
{"handles":["jack","elonmusk"],"maxTweets":50,"includeReplies":false,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
handles | array | List of X (Twitter) accounts to scrape. Bare handle (jack), @handle, or full profile URL all accepted. |
maxTweets | integer | Maximum tweets to return per account. Default 50. X serves up to ~100 tweets per anonymous page; higher values rely on pagination and may stop early when no further page is available. |
includeReplies | boolean | If true, return the tweets-and-replies timeline (conversational view). Default false (original tweets and retweets only). |
proxyConfiguration | object | Apify Proxy settings. Datacenter proxy is sufficient and is the cheapest option. |
Output
Input: jack, maxTweets: 3
{"_input":"jack","_source":"S1-primary","_scrapedAt":"2026-05-18T11:04:21.569704+00:00","rest_id":"1833951636005552366","id_str":"1833951636005552366","conversation_id_str":"1833951636005552366","created_at":"Wed Sep 11 19:31:57 +0000 2024","lang":"en","full_text":"We reject: kings, presidents, and voting.\nWe believe in: rough consensus and running code.\n\nβDavid Clark, 1992","display_text_range":[0,110],"favorite_count":26190,"retweet_count":4333,"reply_count":3646,"quote_count":674,"bookmark_count":3474,"views":{"count":"7990536","state":"EnabledWithCount"},"entities":{"hashtags":[],"user_mentions":[],"urls":[],"symbols":[],"smarttags":[],"timestamps":[]},"is_quote_status":false,"source":"<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Twitter Web App</a>","user_id_str":"12","author":{"screen_name":"jack","name":"jack","rest_id":"12","description":"no state is the best state","followers_count":7537418,"friends_count":3,"statuses_count":30509,"media_count":2963,"listed_count":33146,"is_blue_verified":true,"profile_banner_url":"https://pbs.twimg.com/profile_banners/12/1742427520"}}
{"_input":"jack","_source":"S1-primary","_scrapedAt":"2026-05-18T11:04:21.570681+00:00","rest_id":"1247616214769086465","id_str":"1247616214769086465","created_at":"Tue Apr 07 20:04:19 +0000 2020","lang":"en","full_text":"I'm moving $1B of my Square equity (~28% of my wealth) to #startsmall LLC to fund global COVID-19 relief. After we disarm this pandemic, the focus will shift to girl's health and education, and UBI. It will operate transparently, all flows tracked here: https://t.co/hVkUczDQmz","favorite_count":353958,"retweet_count":62405,"reply_count":29511,"quote_count":19200,"bookmark_count":4932,"views":{"state":"Enabled"},"entities":{"hashtags":[{"indices":[58,69],"text":"startsmall"}],"urls":[{"display_url":"docs.google.com/spreadsheets/dβ¦","expanded_url":"https://docs.google.com/spreadsheets/d/1-eGxq2mMoEGwgSpNVL5j2sa6ToojZUZ-Zun8h2oBAR4","indices":[254,277],"url":"https://t.co/hVkUczDQmz"}],"user_mentions":[]},"is_quote_status":false,"user_id_str":"12","author":{"screen_name":"jack","name":"jack","rest_id":"12","followers_count":7537418}}
| Field | Type | Description |
|---|---|---|
_input | string | The handle or URL exactly as you supplied it. Use this to join results back to your input list. |
_source | string | Internal tag for the path used to fetch the record. S1-primary means the fastest path; values starting with S2- indicate a fallback. |
_scrapedAt | string | ISO-8601 UTC timestamp when the tweet was scraped. |
rest_id / id_str | string | The tweet's unique numeric ID. |
conversation_id_str | string | ID of the thread / conversation this tweet belongs to. |
created_at | string | When the tweet was posted (X's native timestamp format, UTC). |
lang | string | Detected language code (en, id, ja, β¦). |
full_text | string | Complete tweet text. For long-form tweets (>280 chars) this holds the entire body, not the legacy 280-char truncation. |
display_text_range | array | [start, end] character offsets of the visible tweet body (excludes trailing media links). |
favorite_count | integer | Number of likes. |
retweet_count | integer | Number of retweets. |
reply_count | integer | Number of direct replies. |
quote_count | integer | Number of quote tweets. |
bookmark_count | integer | Number of bookmarks (when X exposes it). |
views | object | { "count": "7990536", "state": "EnabledWithCount" } β total view count and view-tracking state. For older tweets count may be absent and state is "Enabled". |
entities | object | Hashtags, user mentions, URLs, symbols, and smart tags, each with character offsets back into the tweet text. |
extended_entities.media | array | When the tweet has media: photos, videos (with all bitrate variants), and GIFs β URLs, dimensions, durations, and types β passed through verbatim. |
note_tweet | object | Present only on long-form tweets. Holds the rich-text body, inline media references, and rich-text formatting tags (bold, italic, etc.). |
is_quote_status | boolean | true if this tweet quotes another tweet. |
source | string | Client used to post (e.g. "Twitter Web App", "Twitter for iPhone"). |
user_id_str | string | The author's numeric account ID. |
author | object | Author snapshot: screen_name, name, rest_id, description, followers_count, friends_count, statuses_count, media_count, listed_count, is_blue_verified, profile_banner_url, etc. |
Error envelope
Handles that don't exist, are suspended, or return an empty anonymous timeline surface a structured error instead of crashing the run:
{"_input":"this-handle-does-not-exist-xyz","_error":"resolve_failed","_errorDetail":"could not resolve handle 'this-handle-does-not-exist-xyz' to user_id","_source":"S1-primary","_scrapedAt":"2026-05-18T11:04:21.570681+00:00"}
Possible _error values: resolve_failed (handle does not exist or is unavailable), empty_timeline (account is private, suspended, or anonymous reads restricted), exception (transport-level failure after retries). Filter on _error to triage failed rows β errors are not billed.
Pricing
This actor is billed per result: $8.00 per 1,000 tweets. Each successful tweet returned = 1 result. Error rows (resolve_failed, empty_timeline, exception) are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Twitter / X | X Account Scraper | Profile metadata + counters for any handle |
| Twitter / X | X Post Detail Scraper | Full single-tweet detail + replies tree |
| Twitter / X | X Search Scraper | Search tweets by keyword, hashtag, or query |
| Bluesky | Bluesky Account Posts Scraper | Recent posts from any Bluesky handle |
| Threads | Threads Account Threads Scraper | Recent threads from any Threads account |
| Instagram Account Posts Scraper | Recent posts (media + captions) for any IG account | |
| Mastodon | Mastodon Account Scraper | Profile + recent toots for any Mastodon handle |
Browse the full catalog at apify.com/xtracto.
Notes
- Protected / private accounts return one row with
_error: "empty_timeline"and no tweets β anonymous access cannot see follower-only content. - Long tweets (>280 characters, X Premium long-form) are returned with the full body in
full_text; the rich-text shape (with bold/italic spans and inline-media references) is preserved undernote_tweetfor callers that need it. - Pinned tweets appear first when present; chronological order of the remaining timeline is approximate.
- Pagination via the next-page cursor is followed automatically until
maxTweetsis reached or the timeline ends. Anonymous reads are typically capped near ~100 tweets per account before X stops returning a usable cursor. - Media tweets carry the full
extended_entities.mediaarray verbatim (image URLs, video variants with bitrate, durations, sizes). - For large jobs (>50 handles), enable Apify Proxy rotation to avoid per-IP rate limits.
