X Posts Scraper (Twitter) avatar

X Posts Scraper (Twitter)

Pricing

from $3.99 / 1,000 results

Go to Apify Store
X Posts Scraper (Twitter)

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

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

0

Monthly active users

5 days ago

Last modified

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?

GroupFields
📝 Postid, url, description (post text), date_posted, hashtags, tagged_users, quoted_post
📊 Engagementviews, likes, reposts, replies, quotes, bookmarks
🖼️ Mediaphotos, videos
👤 Authoruser_posted, name, biography, followers, following, posts_count, is_verified, profile_image_link, external_url
🔎 Provenanceinput.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

  1. Open the Actor and add targets to Twitter URLs, Usernames, or Keywords — one per line.
  2. Choose a Sort Order: recent, oldest or popular.
  3. Set Max Tweets per User.
  4. (Optional) Enable Apify Proxy if you see blocks, timeouts or empty results.
  5. 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

FieldTypeDefaultDescription
startUrlsarray— (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.
sortOrderstringrecentrecent — newest first. oldest — oldest first. popular — most liked first. Applied before results are saved.
maxTweetsinteger10Upper limit of posts collected per profile or input. Higher values take longer.
proxyConfigurationobjectno proxyDefault 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 ApifyClient
client = 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 None
print(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

  • maxTweets is 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 — popular returns the most-liked of the posts it fetched, not the most-liked posts of all time.
  • views is 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.

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.


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.