X (Twitter) Posts Scraper
Pricing
from $3.99 / 1,000 results
X (Twitter) Posts Scraper
X (Twitter) Posts Scraper extracts public posts, tweets, captions, hashtags, timestamps, engagement metrics, media, and author details from X. Automate social media research, content monitoring, trend analysis, competitor tracking, and audience insights.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperForge
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
X (Twitter) Posts Scraper — Timeline Posts with Full Author Profiles
Scrape posts from any public X (Twitter) profile — up to 1,000 posts per target — with full text, engagement counts including bookmarks, media, entities, conversation context, and the complete author profile attached to every row.
Paste handles, profile URLs or even a status link; the Actor works out the account and pulls its timeline.
What is X (Twitter) Posts Scraper?
This is the deep timeline extractor in the collection. Where the search-oriented Actors cap out at smaller batches, this one is built to pull a lot of posts from a specific set of accounts.
Two things make the output more useful than a plain post dump:
- Bookmarks are included.
bookmarkCountsits alongside likes, retweets, replies and quotes. Bookmarks are the strongest signal of genuine value on X — people save what they intend to come back to — and most scrapers omit it entirely. - Pinned posts are detected properly. X returns pinned posts outside the normal timeline flow. The Actor captures them and flags them with
isPinned, so "the latest 50 posts" is not silently distorted by a post from two years ago.
What data can you extract?
Post
id, url, twitterUrl, text, fullText, createdAt, lang, source (client used), isReply, isRetweet, isQuote, isPinned, conversationId, inReplyToId, inReplyToUserId, inReplyToUsername, isConversationControlled, scrapedTimestamp.
Engagement
likeCount, retweetCount, replyCount, quoteCount, bookmarkCount.
Media and context
media, extendedEntities, entities (hashtags, mentions, URLs, symbols), card (link preview), place (geo), imageUrl, authorDisplay.
author — full profile on every post
userName, name, id, url, twitterUrl, description (bio), location, followers, following, createdAt (join date), isBlueVerified, profilePicture, coverPicture, statusesCount, mediaCount, favouritesCount, fastFollowersCount, pinnedTweetIds, professional, entities, canDm, canMediaTag, hasCustomTimelines, isTranslator, possiblySensitive, withheldInCountries, affiliatesHighlightedLabel.
Why teams scrape X timelines
For competitor monitoring
A full timeline export shows posting cadence, format mix and what actually lands — not just the handful of posts that reached your feed.
For influencer vetting
Follower count and total posts sit in the same row as engagement, so engagement rate is one division. fastFollowersCount alongside followers is a quality signal worth checking before paying anyone.
For content research
bookmarkCount identifies genuinely useful content, which is different from content that merely got likes. If you are studying what to write, bookmarks are the better target.
For thread and conversation analysis
conversationId, inReplyToId and inReplyToUsername let you reconstruct threads instead of reading isolated posts.
For brand monitoring and archiving
Timestamped, permalinked posts with author context make a durable record of what an account published.
For lead generation
Author bios, locations and professional metadata are attached to every post, so a timeline export doubles as a prospect record.
How to scrape X posts step by step
- Open the Actor and add your targets — handles, profile URLs, or status URLs (the username is extracted).
- Set Max Posts per Target (1–1,000).
- (Optional) Enable Apify Proxy for larger runs.
- Click Start, then export the Output tab as JSON (recommended) or CSV.
⬇️ Input
Example input
{"startUrls": ["elonmusk", "@nasa", "https://x.com/bbcworld"],"maxTweets": 200}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | — (required) | One target per line. Accepts username, @username, https://x.com/username, or a status URL (https://x.com/username/status/123…) — in the last case the username is used. |
maxTweets | integer | 10 | Maximum posts per target, from 1 to 1,000. |
proxyConfiguration | object | no proxy | Optional Apify Proxy settings for higher reliability on large runs. |
⬆️ Output
Example output (trimmed)
{"type": "tweet","id": "1789012345678901234","url": "https://x.com/exampleuser/status/1789012345678901234","text": "Shipped a big update today. Full changelog in the replies 👇","createdAt": "Tue Aug 04 14:22:31 +0000 2026","lang": "en","likeCount": 18420,"retweetCount": 2140,"replyCount": 612,"quoteCount": 184,"bookmarkCount": 3902,"isReply": false,"isRetweet": false,"isQuote": false,"isPinned": false,"conversationId": "1789012345678901234","source": "Twitter Web App","entities": { "hashtags": [], "user_mentions": [] },"author": {"userName": "exampleuser","name": "Example User","id": "44196397","description": "Building things on the internet.","location": "Berlin, Germany","followers": 482100,"following": 913,"isBlueVerified": true,"statusesCount": 26410,"createdAt": "Tue Mar 21 20:50:14 +0000 2017","profilePicture": "https://pbs.twimg.com/profile_images/…"},"scrapedTimestamp": "2026-08-10T11:02:14Z"}
Illustrative values — a live run returns current X data.
Usage recipes
Several accounts in one run
{"startUrls": ["elonmusk", "@nasa", "https://x.com/bbcworld"],"maxTweets": 200}
Deep pull from one account
{"startUrls": ["yourcompetitor"],"maxTweets": 1000,"proxyConfiguration": { "useApifyProxy": true }}
Original content only
Export any target, then keep rows where isRetweet, isQuote and isReply are all false.
Find genuinely valuable content
Sort by bookmarkCount rather than likeCount. Likes are cheap; bookmarks mean someone intends to return to it.
Compute engagement rate
Divide likeCount (or bookmarkCount) by author.followers — both are already in the same row.
Chronological analysis without pinned distortion
Filter out isPinned: true before sorting by createdAt, so a years-old pinned post does not sit at the top of your "recent" set.
Daily archive
Save your targets as a Task, attach a daily Schedule, and deduplicate on id.
How does this compare to X's official API?
X's API is a paid, tiered product with monthly post caps; useful read access starts at the Basic tier and scales up in price from there. The free tier does not provide meaningful timeline reading.
This Actor reads publicly visible timelines without a developer account, an API key or a subscription. If you need X's official guarantees, full-archive search or contractual SLAs, use the paid API — for research, monitoring and competitive analysis at ordinary volumes, this covers the same ground.
Integrate and automate
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperforge/Twitter-Posts-Scraper").call(run_input={"startUrls": ["elonmusk"],"maxTweets": 200,})for t in client.dataset(run["defaultDatasetId"]).iterate_items():print(t["createdAt"], t["bookmarkCount"], "bookmarks |", t["text"][:70])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperforge/Twitter-Posts-Scraper').call({startUrls: ['elonmusk'],maxTweets: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
REST API
curl -X POST "https://api.apify.com/v2/acts/scraperforge~Twitter-Posts-Scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"startUrls":["elonmusk"],"maxTweets":200}'
n8n, Make, Zapier and AI agents
Call the Actor from n8n, Make, Zapier or an MCP-capable agent for scheduled competitor monitoring or content research.
Schedules and webhooks
Attach a Schedule and deduplicate on id for a rolling archive, then use webhooks or the Google Sheets / Airtable / Slack integrations to route results.
Pricing and what you are charged for
Pay-per-event: a small Actor-start charge plus a charge per post row delivered. maxTweets multiplied by the number of targets is your ceiling.
Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run.
Limits, reliability and blocking
- Maximum 1,000 posts per target, and
maxTweetsis per target — five accounts at 200 each can return 1,000 rows. - Public profiles only. Protected accounts are not accessible.
- X decides timeline depth, so very old posts may be unreachable regardless of your limit.
- Pinned posts are included and flagged. Filter on
isPinnedfor strictly chronological analysis. - Engagement counts are live values at scrape time — timestamp your runs for trend work.
- Media URLs expire — they point at X's CDN.
- This Actor covers profile timelines. Keyword search, replies to a specific post and follower lists are separate jobs.
- Enable a proxy for large or repeated runs to reduce rate limiting.
- Default run options are 4 GB memory and a 1-hour timeout.
Is it legal to scrape X (Twitter)?
This Actor collects only publicly available X content — the same posts any visitor can see without logging in. It does not log in, post, follow, or access private data.
Posts and media remain the property of their authors, and handles, bios, locations and avatars are personal data. Ensure your use complies with X's terms, copyright, and GDPR or comparable regulations, and do not use scraped profile data for unsolicited bulk messaging.
❓ Frequently asked questions
Do I need an X account or API key?
No. The Actor reads public profile timelines without authentication or a developer app.
What can I paste as a target?
A username, @username, a profile URL, or a status URL — the username is extracted automatically from the last of these.
Why does bookmarkCount matter?
Bookmarks indicate content people intend to return to, which correlates far better with genuine usefulness than likes do. Most X scrapers do not return it.
Are retweets and replies included?
Yes, flagged with isRetweet, isQuote and isReply so you can filter for original content.
Do I get the author's follower count?
Yes — the full author profile is attached to every post row, so engagement-rate maths needs no second lookup.
Why is an old post at the top of my results?
It is probably pinned. Filter on isPinned before sorting chronologically.
Can I scrape protected accounts?
No. Only public profiles are accessible.
How many posts can I get?
Up to 1,000 per target, subject to how deep X lets the timeline be paged.
Which export format should I use?
JSON — author, entities, media and card are nested objects. CSV works if you only need text and counts.
🔗 Related scrapers
- X Posts Search Scraper — keyword search with full X operator support.
- Twitter (X) Tweets Profiles Scraper — mix profiles and keywords in one run.
- Twitter Profile Scraper — date-bounded extraction with replies and about data.
- X Posts Scraper (Twitter) — another timeline extraction option.
Browse the full collection on the ScraperForge profile.
💬 Feedback
Need keyword search, reply threads, or a custom X monitoring pipeline? Open an issue on the Issues tab of this Actor.