X (Twitter) Quotes & Reposts Scraper

Merci · @mercidev

Collect every quote tweet and every account that reposted any X post, over plain HTTP against X's own GraphQL endpoints.

About

X (Twitter) Quotes & Reposts Scraper — Retweeter & Quote-Tweet Data

For any X post, collect every quote tweet (with author profile, engagement counts, text and media) and every account that reposted it (handle, display name, bio, avatar, follower counts). Runs over plain HTTP against X's GraphQL endpoints — no browser, no proxy.

Main Use Cases

  • Engagement & amplification analysis — see exactly who quoted and who reposted a post, with follower counts and verification status.
  • Influencer & lead discovery — turn a viral post into a list of engaged accounts with bios and profile URLs.
  • PR / crisis monitoring — capture quote tweets (with full text) as they appear around a launch or announcement.
  • Competitive intelligence — measure how far a competitor's post actually spread, beyond the vanity counter.
  • Sentiment research — export quote-tweet text and author data for NLP on how a post was received.

How It Works

How the X Quotes & Reposts Scraper works: one post to every quote tweet and reposting account.

Both lists are login-only on X, so a session cookie is required — the actor reads it from secrets (X_AUTH_TOKEN / X_CT0), so it never appears in the input or run record. It mints X's public x-client-transaction-id header from the app shell (deterministic, not a secret), then calls TweetResultByRestId for the source post, SearchTimeline with quoted_tweet_id:<id> for quote tweets, and Retweeters for the accounts that reposted. Everything is ordinary HTTPS requests — no Chrome, no Playwright.

Give it one or more post URLs or IDs, choose quotes, reposts or both, and the actor returns structured rows with author profiles, engagement counts and source timestamps.

Collect Quote Tweets And Reposts Without The Official X API

X's official API does not expose the account list for reposts, and gates quote tweets behind expensive tiers. This actor returns both as structured JSON with author profiles and engagement counts, and does it over plain HTTP.

Input

FieldTypeRequiredDefaultNotes
tweetUrlsarrayyes—X post URLs (https://x.com/user/status/123…) or bare numeric post IDs. Multiple posts are fine.
collectselectnoquotesquotes, reposts or both. Every row is tagged kind.
maxQuotesPerPostintegerno0Quote tweets per post. 0 = keep going until X stops serving new ones.
maxRepostsPerPostintegerno0Reposting accounts per post. 0 = keep going until X stops serving new ones.

There is no proxy field — the actor makes ordinary HTTPS requests and does not need one. There is no cookie field either; the session is read from secrets. You state rows, and the actor derives pagination depth from that.

Output

Rows are split across two datasets, each with its own schema; both expose the same 24 columns so a merged export still parses (kind tells them apart). Views: overview and all.

collectdefault datasetreposts dataset
quotesquote rows(not created)
reposts(empty)repost rows
bothquote rowsrepost rows

Both datasets share these fields: source_tweet_id, kind, quote_tweet_id, quoted_tweet_id, url, created_at, text, screen_name, user_id, user_name, avatar_url, bio, followers_count, following_count, verified, is_blue_verified, replies_count, retweets_count, likes_count, views_count, media_count, media_urls, source, collected_at.

Notes: for repost rows the post-specific columns (created_at, text, engagement counts) are null — a native repost has no post of its own — and url points at the retweeter's profile. A run summary (collected counts vs X's reported counts, coverage %, stop condition, billed events, errors) is stored as the key-value store item OUTPUT.

Coverage

Coverage is not 100%, and the reason is on X's side: X hides quote tweets and reposts from deleted, suspended and protected accounts. The /quotes tab is backed by X's search index, which only exposes a slice of very large threads (a post reporting 1,582 quotes typically yields a few hundred rows, ~15–40%). The repost list is a direct query, not routed through search, so it lands much closer to the reported count — the reference run collected 1,584 of 1,744 reposts (~91%), ending on X's own last page rather than on a cap. OUTPUT.coverage_pct and OUTPUT.reposts_coverage_pct always report the real ratio; both go to null when a configured limit or a spending limit ended the list, and stopped_by / reposts_stopped_by say which case occurred.

Example Input

{ "tweetUrls": ["https://x.com/OpenAI/status/2065225362544726371"], "collect": "both" }

Quote tweets only, capped:

{ "tweetUrls": ["2065225362544726371"], "collect": "quotes", "maxQuotesPerPost": 200 }

Example Output

kind: "quote" (default dataset):

{
  "source_tweet_id": "2065225362544726371",
  "kind": "quote",
  "quote_tweet_id": "2065231677539176538",
  "quoted_tweet_id": "2065225362544726371",
  "url": "https://x.com/user/status/2065231677539176538",
  "created_at": "Fri Jun 12 00:36:16 +0000 2026",
  "text": "Brilliant move by @OpenAI",
  "screen_name": "example_user",
  "user_id": "1416365362505863169",
  "user_name": "Example User",
  "bio": "Building things on the internet.",
  "followers_count": 670,
  "following_count": 2206,
  "verified": false,
  "is_blue_verified": true,
  "replies_count": 0,
  "retweets_count": 2,
  "likes_count": 3,
  "views_count": 133,
  "media_count": 0,
  "media_urls": [],
  "source": "http",
  "collected_at": "2026-10-14T12:57:41.624Z"
}

kind: "repost" (reposts dataset):

{
  "source_tweet_id": "2065225362544726371",
  "kind": "repost",
  "quote_tweet_id": null,
  "quoted_tweet_id": null,
  "url": "https://x.com/example_user",
  "created_at": null,
  "text": null,
  "screen_name": "example_user",
  "user_id": "1358024651956498433",
  "user_name": "Example User",
  "followers_count": 52,
  "following_count": 733,
  "replies_count": null,
  "retweets_count": null,
  "likes_count": null,
  "views_count": null,
  "media_count": 0,
  "media_urls": [],
  "source": "http",
  "collected_at": "2026-10-14T12:57:49.648Z"
}

Integrations & Automation

  • Webhooks — act when a run finishes (e.g. push new quote tweets into a CRM or Slack).
  • Zapier / Make — pipe engaged accounts into Google Sheets, Airtable or an outreach tool.

Recommended schedule: run hourly/daily for launch, PR or crisis monitoring (new quotes appear fast); weekly for competitive amplification reports.

FAQ

Does this use the official X / Twitter API?

No. It calls X's own GraphQL endpoints over plain HTTPS — the same ones the x.com website uses — so there is no API key, no official tier limits and no per-call API fee.

Why is a session cookie required?

Both quote tweets and the repost list are login-only on X. The actor reads auth_token / ct0 from secrets, so the session never appears in the input or the run record.

Do I need a browser or a residential proxy?

No. It runs as pure HTTPS requests (no Chrome, no Playwright) and does not need a proxy.

Why is coverage below 100%?

X hides quote tweets and reposts from deleted, suspended and protected accounts, and its search index (which backs the quotes tab) only exposes a slice of very large threads. Quote tweets typically land ~15–40% of the reported count; the repost list is a direct query and reached ~91% in the reference run. OUTPUT always reports the real coverage.

For AI Agents & LLM Apps

Purpose: return the quote tweets and/or the reposting accounts for one or more X posts as flat JSON records with author profile, engagement counts and media.

Minimal working input:

{ "tweetUrls": ["https://x.com/OpenAI/status/2065225362544726371"] }

Variant inputs:

{ "tweetUrls": ["2065225362544726371"], "collect": "reposts", "maxRepostsPerPost": 500 }
{ "tweetUrls": ["https://x.com/OpenAI/status/2065225362544726371"], "collect": "both" }

Output fields (both datasets, 24 columns): source_tweet_id, kind, quote_tweet_id, quoted_tweet_id, url, created_at, text, screen_name, user_id, user_name, avatar_url, bio, followers_count, following_count, verified, is_blue_verified, replies_count, retweets_count, likes_count, views_count, media_count, media_urls, source, collected_at. Run summary is in the key-value store item OUTPUT.

Behaviors an agent should know:

  • tweetUrls is the only required field and accepts full URLs or bare numeric post IDs, including multiple posts per run.
  • There is no cookie field: the session must already exist as secrets X_AUTH_TOKEN and X_CT0, or the run will fail at the session step.
  • collect chooses which dataset fills — quotes → default dataset, reposts → the reposts dataset alias, both → both. Every row is tagged kind.
  • 0 on maxQuotesPerPost / maxRepostsPerPost means "until X stops serving new ones" — the default and the deepest collect; a non-zero value caps rows and nulls coverage_pct.
  • On repost rows, the post-specific columns (created_at, text, engagement counts) are null and url is the retweeter's profile, not a post permalink.

Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by X Corp. It reads publicly visible post data plus login-only lists through your own X session (the auth_token / ct0 cookies you supply) — it is not a login bypass and holds no credentials of its own. It does not scrape data behind a login the user does not already hold, and does not solve CAPTCHAs. Use a throwaway account, and note X's Terms of Service and automation rules apply to your session. The output includes personal data (handles, display names, bios, avatars, follower counts); users are responsible for their own compliance with applicable data-protection law (including GDPR/CCPA where the data concerns EU or California individuals) and should not use it for unsolicited commercial outreach in violation of applicable law.

SEO Keywords

x quotes scraper, twitter retweeters scraper, quote tweet scraper, retweeter list, who retweeted my tweet, twitter engagement data, x api alternative, twitter quote tweets data, repost scraper, x retweeter data, twitter influencer discovery, x post amplification, quote tweet export, twitter sentiment analysis data, x scraper no browser, retweeter dataset, twitter lead generation, x quote tweets scraper, twitter competitor analysis, x engagement scraper, twitter scraper without api

FAQ

Why is a session cookie required?
Both quote tweets and the repost list are login-only on X. The actor reads auth_token / ct0 from secrets, so the session never appears in the input or the run record.
Why is coverage below 100%?
X hides quote tweets and reposts from deleted, suspended and protected accounts, and its search index (which backs the quotes tab) only exposes a slice of very large threads. Quote tweets typically land ~15–40% of the reported count; the repost list is a direct query and reached ~91% in the reference run. OUTPUT always reports the real coverage.

More Actors from the same publisher.

View all from @mercidev