X Timeline Scraper | Tweets and Engagement Stats avatar

X Timeline Scraper | Tweets and Engagement Stats

Pricing

from $0.30 / 1,000 posts

Go to Apify Store
X Timeline Scraper | Tweets and Engagement Stats

X Timeline Scraper | Tweets and Engagement Stats

X (Twitter) timeline scraper: get the posts of any account without login, each tweet with full text, likes, reposts, replies, quotes, bookmarks, views, images, videos and the author's followers. The default run returned 40 posts in 3 seconds, 29 fields each. Many accounts per run, date filters.

Pricing

from $0.30 / 1,000 posts

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

X Timeline Scraper (Twitter) | Tweets, Likes, Views and Media from Any Account (2026)

X Timeline posts, 29 fields each, from any username.

From SilentFlow. Creators of Facebook Search Scraper and Pinterest Scraper, with 600,000+ combined lifetime runs.

Every post an X (Twitter) account shows on its timeline, one clean row each, with the full text, the likes, reposts, replies, quotes, bookmarks and views, the images and videos, and the account's own numbers on the same row. Type a handle or paste a link, press Start: the prefilled form returned the 40 latest posts of NASA and SpaceX on our test run, with 28 data fields filled on at least half of the rows. No X account, no API key, no developer portal.

Why choose this actor?

Copying tweets into a spreadsheet one by one, and losing the view counts on the way? Running one job per account when you follow twenty? Getting a repost back as a cut-off "RT @..." line with zero likes?

  • 28 filled data fields per post, the account included. Each row carries the post (id, link, full text, language, mentions, links), its engagement (likes, reposts, replies, quotes, bookmarks, views), its context (reply, repost and quote flags with the original post and author, pinned and sensitive flags), its media, and the account behind it (name, avatar, followers, following, post count, location, blue badge and verified type). On the default run (40 posts of NASA and SpaceX), 28 of the 39 data fields were filled on at least half the rows: 18 posts came with images, 8 with a video file, 24 with expanded links, and the 6 reposts carried the full text and engagement of the original post.
  • Start from a handle, a profile link or the link of any post, for as many accounts as you need. Type NASA or @OpenAI, paste https://x.com/SpaceX, or drop the link of a post you saw and the actor reads its author's timeline. One run with four accounts (NASA, SpaceX, OpenAI and Google), kept to the last 7 days without reposts, returned 52 posts on our test run.
  • Nothing to fill in before you press Start. No field is mandatory: one handle or one link is enough, the post cap has a default, and every filter is optional. The prefilled form, left as it is, returned 40 posts from 2 accounts.

Try X Timeline Scraper

Try your first X posts

Paste this input in the JSON tab, or keep the prefilled form and press Start. It reads the 20 latest posts of NASA and of SpaceX, each with its text, engagement, media and the account's follower count, and finished in a few seconds on our test runs.

{
"usernames": ["NASA"],
"startUrls": [
{ "url": "https://x.com/SpaceX" }
],
"maxItems": 20
}

Runs on the Apify Free plan: sign up, open the actor, press Start. Each post lands as one row of the dataset, which you can open as a table, download as CSV, Excel or JSON, or read from the API. Swap NASA for the accounts you follow (a competitor, a public figure, a newsroom, your own brand) and the dataset fills with their posts instead.

How it works

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the X Timeline Scraper on Apify: silentflow/x-timeline-scraper
It returns one dataset row per post of the timeline of one or more X (Twitter) accounts, newest first.
No field is required. Give at least one account in usernames or startUrls.
Input schema:
- usernames (array of string): handles, with or without @, or profile links. e.g. ["NASA", "@OpenAI"]
- startUrls (array of {url}): x.com or twitter.com links. A profile (https://x.com/SpaceX) or any post (https://x.com/NASA/status/2113358139999265160), which reads the timeline of its author.
- maxItems (integer, default 20, max 3200): posts per account, newest first
- onlyPostsNewerThan (string): keep posts published on or after a date ("2026-09-01") or within an age ("7 days", "2 weeks", "24 hours")
- onlyPostsOlderThan (string): keep posts published before a date or an age
- excludeRetweets (boolean, default false): leave reposts out
- excludePinned (boolean, default false): leave the pinned post out
- debugMode (boolean, default false)
Output per post (40 keys: 39 data fields and scrapedAt; absent values are null, lists are [] when empty):
- id (string), url (string, https://x.com/{handle}/status/{id})
- text (string, full text, links expanded; for a repost, the original's text), lang (string, language code such as "en", null for a post with no words)
- hashtags, mentions, links (array of string)
- authorId, authorUsername, authorName, authorAvatar (string)
- authorFollowers, authorFollowing, authorPostsCount (integer), authorLocation (string)
- isAuthorBlueVerified (boolean), authorVerifiedType (string: "Business", "Government" or null)
- likeCount, retweetCount, replyCount, quoteCount, bookmarkCount (integer), viewCount (integer or null)
- conversationId (string), isReply (boolean), inReplyToId, inReplyToUsername (string)
- isRetweet (boolean), retweetedPostId, retweetedUsername (string)
- isQuote (boolean), quotedPostId, quotedUsername, quotedText (string)
- isPinned, isSensitive (boolean)
- createdAt (RFC 3339, UTC: when the account posted or reposted it)
- images (array of image URLs), videos (array of mp4 URLs, best quality)
- scrapedAt (RFC 3339, UTC)
Use apify-client for Python or JS: client.actor("silentflow/x-timeline-scraper").call(run_input=...)

How to scrape X (Twitter) posts from any account

Get the latest posts of one account

Type the handle as it appears on the profile, with or without the @. The posts come back newest first, the pinned post included and flagged.

{
"usernames": ["OpenAI"],
"maxItems": 50
}

Pull only what an account wrote itself

Switch reposts off to keep the account's own posts, threads and quotes. On our test run, OpenAI without reposts returned 60 posts over 4 timeline pages, the pinned post included.

{
"usernames": ["OpenAI"],
"maxItems": 60,
"excludeRetweets": true
}

Read a watch list for the last 7 days

List the accounts and an age. Each account stops being read as soon as its timeline goes past the date, so a daily or weekly schedule stays short. Four accounts over the last 7 days, without reposts, returned 52 posts on our test run: 18 from Google, 16 from SpaceX, 9 from NASA and 9 from OpenAI.

{
"usernames": ["NASA", "SpaceX", "OpenAI", "Google"],
"onlyPostsNewerThan": "7 days",
"excludeRetweets": true,
"maxItems": 50
}

Input parameters

FieldTypeDescription
usernamesarray of stringsThe accounts to read, one per line. NASA, @NASA and https://x.com/NASA all work.
startUrlsarray of { "url": ... }x.com or twitter.com links: a profile, or the link of any post (the actor reads the timeline of the post's author).
maxItemsinteger, default 20Posts per account, newest first, from 1 to 3,200.
onlyPostsNewerThanstringKeep posts published on or after a date (2026-09-01, 2026-09-01T08:00:00Z) or within an age (24 hours, 7 days, 2 weeks, 3 months, 1 year).
onlyPostsOlderThanstringKeep posts published before a date or an age. With the field above it reads one period.
excludeRetweetsboolean, default falseLeave out the posts the account reposted from others.
excludePinnedboolean, default falseLeave out the post pinned at the top of the profile.
debugModeboolean, default falseAdds detailed lines to the run log. Leave it off for normal runs.

Formats accepted for an account, in either field:

  • a handle: NASA, @NASA (1 to 15 letters, digits or underscores, case does not matter)
  • a profile link: https://x.com/NASA, https://twitter.com/NASA, https://mobile.twitter.com/NASA, x.com/NASA/media
  • a post link: https://x.com/NASA/status/2113358139999265160, which reads NASA's timeline

The same account typed twice, in two spellings, is read once. An entry that is not an X account (a Google link, a 30-character name) is skipped with a line in the log and the rest of the run goes on.

What data can you extract from X?

One row per post, 40 keys: 39 data fields and the time of the run. Lists come back as [] when empty and values X does not publish for a post are null, never an empty text.

GroupFields
Identity (2)id, url
Content (5)text, lang, hashtags, mentions, links
Account (10)authorId, authorUsername, authorName, authorAvatar, authorFollowers, authorFollowing, authorPostsCount, authorLocation, isAuthorBlueVerified, authorVerifiedType
Engagement (6)likeCount, retweetCount, replyCount, quoteCount, bookmarkCount, viewCount
Context (13)conversationId, isReply, inReplyToId, inReplyToUsername, isRetweet, retweetedPostId, retweetedUsername, isQuote, quotedPostId, quotedUsername, quotedText, isPinned, isSensitive
Time (1)createdAt (RFC 3339, UTC)
Media (2)images, videos
Meta (1)scrapedAt (RFC 3339, UTC)

Output example

A post of NASA from the default run, as it lands in the dataset:

{
"id": "2113358139999265160",
"url": "https://x.com/NASA/status/2113358139999265160",
"text": "That's our jam ๐ŸŽผ\n \nAstronomers used @ChandraXray to find out that this radio wave formation, known as the \"Treble Clef\" thanks to its distinctive shape, was likely caused by an outburst from a supermassive black hole, followed by a collision of two galaxy clusters.",
"lang": "en",
"hashtags": [],
"mentions": ["chandraxray"],
"links": [],
"authorId": "11348282",
"authorUsername": "NASA",
"authorName": "NASA",
"authorAvatar": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB.jpg",
"authorFollowers": 92311045,
"authorFollowing": 115,
"authorPostsCount": 74451,
"authorLocation": "Pale Blue Dot",
"isAuthorBlueVerified": true,
"authorVerifiedType": "Government",
"likeCount": 4473,
"retweetCount": 707,
"replyCount": 259,
"quoteCount": 54,
"bookmarkCount": 262,
"viewCount": 880068,
"conversationId": "2113358139999265160",
"isReply": false,
"inReplyToId": null,
"inReplyToUsername": null,
"isRetweet": false,
"retweetedPostId": null,
"retweetedUsername": null,
"isQuote": false,
"quotedPostId": null,
"quotedUsername": null,
"quotedText": null,
"isPinned": false,
"isSensitive": false,
"createdAt": "2026-10-22T19:53:39Z",
"images": ["https://pbs.twimg.com/media/HVQoB1nXIAAiLcW.jpg"],
"videos": [],
"scrapedAt": "2026-10-23T18:52:09Z"
}

A quote post of SpaceX from the same run carries the post it quotes (account block left out here):

{
"id": "2112637394654822514",
"url": "https://x.com/SpaceX/status/2112637394654822514",
"text": "Our Q3 2026 earnings report is now public โ†’ https://ir.spacex.com/files/content_files/SpaceX-Reports-Third-Quarter-2026-Results.pdf\n\nThe live webcast with @ElonMusk, @Gwynne_Shotwell, and @BretWJ will begin in 30 minutes",
"mentions": ["elonmusk", "Gwynne_Shotwell", "BretWJ"],
"links": ["https://ir.spacex.com/files/content_files/SpaceX-Reports-Third-Quarter-2026-Results.pdf"],
"likeCount": 4325,
"retweetCount": 539,
"viewCount": 786122,
"isQuote": true,
"quotedPostId": "2112559638579499258",
"quotedUsername": "SpaceX",
"quotedText": "Watch live as SpaceX discusses our Q3 2026 earnings at 3:30pm CT today โ†’ https://x.com/i/broadcasts/1PKqrNbLZbPGb",
"createdAt": "2026-10-20T20:09:40Z"
}

Good to know when you store the data:

  • id is X's own post id and url the permanent link of the post: both are stable keys to join runs on. authorId never changes, even when an account renames its handle.
  • text is the whole post, not the preview: on the September run of OpenAI, 30 of the 64 posts were longer than 280 characters and came back complete. Short links are expanded to their real address, and a reply loses the leading list of @handles that X adds in front of it.
  • A repost is a row of the account that reposted it: createdAt is the time of the repost (the order of the timeline), while text, the engagement and the media are those of the original post, with its id and author in retweetedPostId and retweetedUsername.
  • Engagement counts are the exact numbers X publishes (4473 likes, not "4.4K"), read at the time of the run.
  • images and videos are direct links to X's media servers, the best quality offered for each video. They stop working when the post is deleted, so download the files you want to keep.
  • viewCount is null on posts published before X started counting views at the end of 2022: 34 of the 100 posts elonmusk showed on our test run were that old. lang is null on a post with no words (a photo alone, a link alone).

Advanced usage

Monitor a list of accounts every morning

Schedule this input daily. Each run returns only the posts of the last 24 hours, and each account stops being read once its timeline is older, so a long watch list stays quick.

{
"usernames": ["NASA", "SpaceX", "OpenAI", "Google", "Microsoft", "nvidia"],
"onlyPostsNewerThan": "24 hours",
"maxItems": 100
}

Archive one month of an account from a post link

Paste the link of any post of the account and set both ends of the period. On our test run, September 2026 of OpenAI, started from one of its posts, returned 64 posts over 6 timeline pages in 13 seconds.

{
"startUrls": [
{ "url": "https://x.com/OpenAI/status/2113298833392496746" }
],
"onlyPostsNewerThan": "2026-09-01",
"onlyPostsOlderThan": "2026-10-01",
"maxItems": 200
}

Benchmark the engagement of competitors

Pull the last 100 original posts of each brand, without reposts or the pinned post, then sort by viewCount or by likes per view in the Engagement view of the dataset.

{
"usernames": ["Google", "Microsoft", "OpenAI"],
"excludeRetweets": true,
"excludePinned": true,
"maxItems": 100
}

Collect the videos and images an account posted

Run the account, then open the Media and links view: each row lists its images and its best-quality video file. On the default run, 18 of the 40 posts had images (23 images in all) and 8 had a video.

{
"startUrls": [
{ "url": "https://x.com/SpaceX" }
],
"maxItems": 200,
"excludeRetweets": true
}

Feed new posts to a spreadsheet or a model

Call the actor from Python, keep the posts with more than 100,000 views and send them to your sheet, your database or your AI pipeline.

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/x-timeline-scraper").call(run_input={
"usernames": ["NASA", "SpaceX"],
"onlyPostsNewerThan": "7 days",
"maxItems": 100,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
if (post["viewCount"] or 0) > 100_000:
print(post["createdAt"], post["authorUsername"], post["viewCount"], post["url"])

FAQ

What does this X timeline scraper return? One row per post of each account's timeline, newest first: the post itself (text, language, hashtags, mentions, links), its engagement (likes, reposts, replies, quotes, bookmarks, views), its context (reply, repost, quote, pinned), its images and videos, and the account's name, followers, following, post count, location and badges.

Do I need an X account, a developer account or an API key? No. The actor reads what X shows any visitor of a profile. You do not connect an account and you do not create anything on X's developer portal.

How many posts can I get per account? Up to 3,200 per account, the most X keeps on a timeline, set with maxItems. A few very large accounts show visitors a selection rather than their full timeline: on our test run, elonmusk returned 100 posts, chosen by X and spread from 2018 to 2026. The run tells you in the log when it reaches the end of what X shows.

Does it return replies to other people? It returns the timeline as the profile shows it: the account's posts, its reposts, its quotes and the threads it writes as replies to itself, each flagged with isReply and the post it answers. Replies the account sends to other people's posts are not on that timeline.

Can I scrape several accounts in one run? Yes, as many as you like. List handles in usernames, links in startUrls, or both. maxItems applies to each account, and the same account typed twice is read once.

Can I combine the filters? Yes, they stack. onlyPostsNewerThan: "30 days" with excludeRetweets: true and excludePinned: true returns only what the account wrote itself in the last 30 days, without the old pinned post. Add onlyPostsOlderThan to close the period.

How fresh is the data? Live. Every run reads X at the time of the run, so counts of likes and views are those of that moment. Schedule the actor to follow how a post's numbers grow.

What happens with a private, suspended or misspelled account? A protected account, a suspended account and a handle that does not exist return no row and a clear line in the log; the other accounts of the run are read normally. When no account returns a post, the run says why on its status line.

What is X? X is the social network formerly called Twitter. Posts are what used to be called tweets, reposts were retweets. Links on twitter.com and x.com both work in this actor.

Are the links in the output permanent? The post url is permanent while the post is online. Image and video links point to X's media servers and stop working if the post is deleted: download the files you need to keep.

More SilentFlow scrapers

๐Ÿ›’ E-commerce

๐Ÿ’ผ Jobs

๐Ÿ  Real estate

๐Ÿ“ฃ Social media

๐Ÿข Business data

โœˆ๏ธ Travel

๐ŸŽฏ Lead generation

๐Ÿ”Ž SEO

๐Ÿ“ˆ Marketing

๐ŸŽฌ Video

๐Ÿ“ฐ News

๐Ÿงฐ More tools

Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

This Actor extracts publicly available data from X (x.com). It does not bypass any login, paywall or CAPTCHA, and it reads only the posts X shows to any visitor: protected accounts are never read. Users are responsible for complying with X's terms of service and applicable data protection laws (GDPR, CCPA, and PIPL where relevant). The output contains personal data (account names, handles, avatars, locations and the content people post), which users must handle accordingly: collect only what they need, keep it secure and honour deletion requests. The data returned is informational; verify accuracy for regulated use cases.

X Timeline Scraper by SilentFlow: the posts of any X account, as clean rows, on demand or on a schedule.