X Posts Scraper (Twitter)
Pricing
from $3.99 / 1,000 results
X Posts Scraper (Twitter)
X Posts Scraper (Twitter) extracts public posts, tweets, captions, hashtags, timestamps, engagement metrics, media, and author details from X. Automate content research, trend monitoring, competitor analysis, social listening, and audience insights with structured data.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperForge
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
X Posts Scraper (Twitter) — Posts with Views, Bookmarks & Sorted Output
Scrape posts from X (Twitter) profiles, usernames or keywords, and get each post with its text, hashtags, tagged users, photos and videos, engagement counts including views and bookmarks, and the author's bio, follower count and external link.
Choose how results are ordered — newest, oldest or most liked — before they are saved.
What is X Posts Scraper (Twitter)?
This Actor produces a flat, readable post record with snake_case field names (date_posted, user_posted, posts_count) rather than X's internal API shape. That makes the export immediately usable in a spreadsheet or a database table without unnesting anything.
It also returns two metrics that most X scrapers omit:
views— how many times the post was seen, which is the denominator any real engagement calculation needs.bookmarks— how many people saved it, the strongest available signal that content was genuinely useful.
And it sorts before saving. sortOrder lets you write the dataset already ordered by recency, age or popularity, so "the 20 most-liked posts from this account" is a run configuration rather than a post-processing step.
What data can you extract?
| Group | Fields |
|---|---|
| 📝 Post | id, url, description (post text), date_posted, hashtags, tagged_users, quoted_post |
| 📊 Engagement | views, likes, reposts, replies, quotes, bookmarks |
| 🖼️ Media | photos, videos |
| 👤 Author | user_posted, name, biography, followers, following, posts_count, is_verified, profile_image_link, external_url |
| 🔎 Provenance | input.url |
Why teams scrape X posts
For real engagement analysis
Likes divided by followers is a crude proxy. views gives you the actual denominator, so you can compute engagement against reach rather than audience size — a materially different and more honest number.
For content research
Sorting by popular returns an account's best-performing posts directly. bookmarks then separates content people found useful from content they merely reacted to.
For competitor monitoring
Author fields on every row — followers, post count, bio, external URL — mean a timeline export doubles as an account snapshot.
For social listening
Keyword inputs turn the same Actor into a topic monitor, with the same flat output shape.
For media and creative research
photos and videos are separate fields, so filtering to visual content takes one step.
For lead generation
biography and external_url on every post row give you both qualification and a destination, without a second profile lookup.
How to scrape X posts step by step
- Open the Actor and add targets to Twitter URLs, Usernames, or Keywords — one per line.
- Choose a Sort Order:
recent,oldestorpopular. - Set Max Tweets per User.
- (Optional) Enable Apify Proxy if you see blocks, timeouts or empty results.
- Click Start, then export the Output tab as CSV, Excel or JSON.
⬇️ Input
Example input
{"startUrls": ["https://x.com/elonmusk","@nasa","ai tools"],"sortOrder": "popular","maxTweets": 100}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | — (required) | One value per line: profile URLs (https://x.com/username, https://twitter.com/username), usernames (username, @username), or keyword-style input. Clear handles and full profile URLs give the most reliable results. |
sortOrder | string | recent | recent — newest first. oldest — oldest first. popular — most liked first. Applied before results are saved. |
maxTweets | integer | 10 | Upper limit of posts collected per profile or input. Higher values take longer. |
proxyConfiguration | object | no proxy | Default is no Apify proxy. The Actor steps through fallback proxies (datacenter, then residential retries) when requests fail. Enable it when you see blocks, timeouts or empty results. |
⬆️ Output
Example output
{"id": "1789012345678901234","url": "https://x.com/exampleuser/status/1789012345678901234","user_posted": "exampleuser","name": "Example User","description": "Shipped a big update today. Full changelog in the replies 👇 #buildinpublic","date_posted": "2026-08-04T14:22:31.000Z","views": 812400,"likes": 18420,"reposts": 2140,"replies": 612,"quotes": 184,"bookmarks": 3902,"hashtags": ["buildinpublic"],"tagged_users": [],"photos": ["https://pbs.twimg.com/media/…"],"videos": [],"quoted_post": null,"biography": "Building things on the internet.","followers": 482100,"following": 913,"posts_count": 26410,"is_verified": true,"profile_image_link": "https://pbs.twimg.com/profile_images/…","external_url": "https://example.com","input": { "url": "https://x.com/exampleuser/status/1789012345678901234/" }}
Illustrative values — a live run returns current X data.
Usage recipes
An account's best-performing posts
{"startUrls": ["yourcompetitor"],"sortOrder": "popular","maxTweets": 100}
The dataset arrives already ranked by likes — no sorting step needed.
Earliest posts from an account
{"startUrls": ["exampleaccount"],"sortOrder": "oldest","maxTweets": 200}
Useful for studying how an account's positioning evolved.
True engagement rate
Divide likes by views rather than by followers. Views measure reach; followers only measure potential reach.
Find the genuinely useful posts
Sort your export by bookmarks. High bookmarks with modest likes usually indicates reference material — often the most valuable content to study.
Visual content only
Filter for rows where photos or videos is non-empty.
Prospect list from a topic
Run keyword inputs, then filter biography for the role you sell to and keep rows where external_url is present.
How does this compare to X's official API?
X's API is a paid, tiered product: meaningful read access to timelines and search begins at the Basic tier and rises steeply, with monthly post caps at every level. The free tier does not support this kind of research.
This Actor reads publicly visible posts without a developer account or subscription, and returns view and bookmark counts in a flat structure. If you need X's official guarantees, full-archive search or contractual SLAs, the paid API is the correct route.
Integrate and automate
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperforge/Twitter-X-Posts-Scraper").call(run_input={"startUrls": ["elonmusk"],"sortOrder": "popular","maxTweets": 100,})for p in client.dataset(run["defaultDatasetId"]).iterate_items():rate = (p["likes"] / p["views"]) if p.get("views") else Noneprint(p["user_posted"], "|", p["likes"], "likes /", p["views"], "views |", rate)
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperforge/Twitter-X-Posts-Scraper').call({startUrls: ['elonmusk'],sortOrder: 'popular',maxTweets: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
REST API
curl -X POST "https://api.apify.com/v2/acts/scraperforge~Twitter-X-Posts-Scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"startUrls":["elonmusk"],"sortOrder":"popular","maxTweets":100}'
n8n, Make, Zapier and AI agents
Call the Actor from n8n, Make, Zapier or an MCP-capable agent for scheduled monitoring or content research.
Schedules and webhooks
Attach a Schedule with sortOrder: "recent" and deduplicate on id for a rolling archive, then route results with webhooks or the Google Sheets / Airtable / Slack integrations.
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
maxTweetsis per profile or input, so five targets at 100 each can return up to 500 rows.- Sorting happens before saving, within the set the Actor collected —
popularreturns the most-liked of the posts it fetched, not the most-liked posts of all time. viewsis not published on every post. Older posts in particular may have no view count, in which case engagement-versus-reach maths is not possible for that row.- Public profiles only. Protected accounts are not accessible.
- X limits timeline depth, so very old posts may be unreachable regardless of your limit.
- Media URLs expire — they point at X's CDN.
- Enable a proxy when results look wrong. Empty results, timeouts and blocks are the symptoms; datacenter then residential fallback is the fix.
- 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 or direct messages.
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 API key?
No. The Actor reads public posts without a developer account or paid subscription.
What can I put in the input?
Profile URLs, usernames with or without @, or keyword-style input — one per line. Handles and full URLs are the most reliable.
What does sortOrder actually do?
It orders results before they are written to the dataset: recent, oldest or popular (most liked). It sorts the posts the run collected, not all posts ever.
Why does views matter?
It is the reach denominator. Likes ÷ views is a real engagement rate; likes ÷ followers is only an approximation.
Why are views missing on some posts?
X does not publish a view count for every post, particularly older ones. Those rows come back without it.
What are bookmarks good for?
Bookmarks indicate content people intend to revisit — usually the most genuinely useful posts, and a better research target than raw likes.
Can I scrape protected accounts?
No. Only public profiles are accessible.
Do I need a proxy?
Not for small runs. Enable it if you see blocks, timeouts or unexpectedly empty results.
Which export format should I use?
CSV or Excel — the output is deliberately flat. JSON works equally well for pipelines.
🔗 Related scrapers
- X (Twitter) Posts Scraper — up to 1,000 posts per target with X's native field structure.
- X Posts Search Scraper — search-first, with advanced operators and time windows.
- Twitter Profile Scraper — date-bounded extraction with replies and about data.
- Twitter (X) Tweets Profiles Scraper — profiles and keywords mixed in one input.
Browse the full collection on the ScraperForge profile.
💬 Feedback
Need higher limits, extra fields, or a custom X research pipeline? Open an issue on the Issues tab of this Actor.