X (Twitter) Posts Scraper avatar

X (Twitter) Posts Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
X (Twitter) Posts Scraper

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

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

5 days ago

Last modified

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. bookmarkCount sits 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

  1. Open the Actor and add your targets — handles, profile URLs, or status URLs (the username is extracted).
  2. Set Max Posts per Target (1–1,000).
  3. (Optional) Enable Apify Proxy for larger runs.
  4. 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

FieldTypeDefaultDescription
startUrlsarray— (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.
maxTweetsinteger10Maximum posts per target, from 1 to 1,000.
proxyConfigurationobjectno proxyOptional 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 ApifyClient
client = 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 maxTweets is 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 isPinned for 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.

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.


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.