# X (Twitter) Retweeters & Quote Tweets Scraper (`arjun_code/x-twitter-retweeters-scraper`) Actor

Find who retweeted or quoted a public X (Twitter) post. Export account profiles, follower counts, verification, and quote-tweet text for campaign and audience research. Paste Tweet URLs or IDs and download JSON, CSV, or Excel. No X login or X API key required.

- **URL**: https://apify.com/arjun_code/x-twitter-retweeters-scraper.md
- **Developed by:** [ArjunAI Data](https://apify.com/arjun_code) (community)
- **Categories:** Social media, Lead generation
- **Features:** Limited permissions
- **Stats:** 43 total users, 21 monthly users, 96.5% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.25 / 1,000 retweeter profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Find the public accounts that retweeted or quoted an X (Twitter) post. Export their profiles and the available quote-tweet text to research campaign reach and the people sharing a post. Paste Tweet URLs or IDs, choose retweeters, quote authors, or both, and download JSON, CSV, or Excel.

### 🚀 Quick start

1. Paste up to 50 unique Tweet URLs or IDs.
2. Choose retweeters, quote-tweet authors, or both.
3. Set the per-Tweet limits and click **Start**.
4. Review account profiles and quote context, then export the Dataset.

```json
{
  "tweets": [
    "https://x.com/SpaceX/status/2099211149476569207"
  ],
  "resultType": "retweeters",
  "maxRetweetersPerTweet": 20
}
```

### 🔗 Ready-to-run examples

Open an example, review its input and spending limit, then run it in your Apify account.

- [Export X Post Retweeters](https://apify.com/arjun_code/x-twitter-retweeters-scraper/examples/export-x-post-retweeters)
- [Export X Quote-Tweet Authors](https://apify.com/arjun_code/x-twitter-retweeters-scraper/examples/export-x-quote-tweet-authors)
- [Export Retweeters from Multiple Campaign Posts](https://apify.com/arjun_code/x-twitter-retweeters-scraper/examples/export-retweeters-from-multiple-campaign-posts)

### 📊 Results

Each row represents one account for one source Tweet and engagement type. Quote-author results include the first matching quote Tweet found for that author; they are not an archive of every quote Tweet.

Each successful Dataset item represents one visible engagement user:

- `engagement_type: "retweet"` — the user appeared in X's Retweeters timeline.
- `engagement_type: "quote"` — the user authored a visible post quoting the source post.

Quote results also contain the quote-post ID, URL, text, timestamp, language,
engagement counts, view count, entities, sensitivity flag, and available media
metadata. Core values are flat for straightforward filtering and CSV/Excel
exports; `quote_media` is an array because one quote post can contain multiple
media items.

All `quote_*_count` values describe engagement on the quote post itself, not on
the original source post. For example, `quote_retweet_count` is how many times
that quote post was retweeted.

Normalized account and quote timestamps use ISO 8601 in UTC. When
`includeRawUser` is enabled, `raw_user` keeps X's original native timestamp.

The **Overview** Dataset view emphasizes identity, audience metrics, quote context, and clickable links. Use **Detailed** for the complete normalized schema and Apify's built-in **All fields** view for the raw Dataset record.

Diagnostic rows use one of these statuses:

- `invalid_input` — an input needs correction. A malformed post URL or ID is reported separately while other valid posts continue. An empty input, more than 50 unique posts, or an invalid collection option returns a clear message and ends the run without collecting results.
- `not_found` — the source post was deleted, unavailable, or does not exist.
- `no_results` — the source post exists, but X returned no visible users for that engagement type.
- `partial` — earlier pages were stored before a later request failed.
- `request_failed` — the request failed before a user result was stored.
- `charge_limit_reached` — the run stopped at the user's maximum cost setting.

Diagnostic rows are not charged as user results.

### Input

| Field | Description | Default |
| --- | --- | --- |
| `tweets` | Up to 50 unique numeric post IDs or full `x.com` / `twitter.com` status URLs. Duplicate post IDs are requested once; invalid values are reported without blocking valid posts. | Required |
| `resultType` | `retweeters`, `quote_users`, or `both`. | `retweeters` |
| `maxRetweetersPerTweet` | Maximum unique retweeters per source post. Use `0` for all available profiles. | `100` |
| `maxQuoteUsersPerTweet` | Maximum unique quote users per source post. Use `0` for all available profiles. | `100` |
| `includeRawUser` | Adds the complete native X user object as `raw_user`. | `false` |

Posts are processed sequentially. Each run accepts up to 50 unique post IDs after equivalent URLs and duplicate IDs are normalized. If you exceed this limit, the run finishes with an `invalid_input` message showing the unique post count and asking you to split the input into batches of 50 or fewer. No posts are processed and no result events are charged; the standard start fee still applies. More posts and larger per-post limits increase runtime and cost.

### Choose retweeters, quote authors, or both

Use `resultType: "retweeters"` for the people who retweeted a post, `"quote_users"` for the people who quoted it, or `"both"` for both groups. In both mode, the same person can appear once in each group.

For a quote-author example, use the same Tweet from Quick start with:

```json
{
  "tweets": [
    "https://x.com/SpaceX/status/2099211149476569207"
  ],
  "resultType": "quote_users",
  "maxQuoteUsersPerTweet": 10
}
```

### 💰 Pricing

This Actor uses pay-per-event pricing. A successfully stored retweeter produces
one `retweeter-result` event. A successfully stored quote-tweet author, including
the visible quote-post context, produces one `quote-user-result` event.

| Apify plan | Retweeter / result | Retweeters / 1,000 | Quote author / result | Quote authors / 1,000 |
| --- | ---: | ---: | ---: | ---: |
| Free | $0.00050 | $0.50 | $0.00100 | $1.00 |
| Bronze | $0.00040 | $0.40 | $0.00080 | $0.80 |
| Silver | $0.00030 | $0.30 | $0.00070 | $0.70 |
| Gold, Platinum, and Diamond | $0.00025 | $0.25 | $0.00060 | $0.60 |

An `apify-actor-start` event costs $0.00005 per run. On the Free tier, 100
retweeters cost approximately $0.05005, 100 quote-tweet authors cost
approximately $0.10005, and 100 of each cost approximately $0.15005, including
the single start event. No result event is charged for `no_results`, failure,
partial-status, or charge-limit status rows. Platform usage is included in the
configured event prices.

Use Apify's **Maximum cost per run** setting to control spending. Once that limit is reached, the Actor stores only the affordable result prefix and stops before requesting another page or processing another source post.

### Availability and partial results

X may return fewer accounts than the retweet or quote count shown on the post. Deleted, protected, suspended, or otherwise unavailable accounts may be missing. Quote-search coverage is not guaranteed to include every quote Tweet.

Saved results remain available if a later request fails. Status rows explain missing posts, empty results, partial collection, request failures, and spending limits. A complete technical failure can cause the run to fail; it does not erase already saved data.

### FAQ

#### Why is the result count lower than the number shown on X?

X does not always expose every engager through its timelines. Deleted, private, suspended, withheld, and otherwise unavailable accounts can also reduce the visible count.

#### Are quote-tweet results exhaustive?

No. Quote-author results depend on what X makes available through search. The Actor cannot guarantee every quote Tweet shown in X counters.

#### Can one person appear more than once?

Within one source post and engagement type, no. In `both` mode, the same person may appear once as a retweeter and once as a quote-tweet author because those are different actions.

#### Do I need my own X account or proxy?

No. Users do not provide X credentials, cookies, API keys, or proxy settings.

#### What happens when a request fails during pagination?

Already stored pages remain available. The Dataset receives a clear partial or failure status row. A complete technical failure causes the run itself to fail.

### Result examples

The examples below were captured from successful runs on November 10, 2026. Counts and availability can change. They correspond to the Quick start or separately labeled input above.

#### Retweeter profile

```json
{
  "status": "success",
  "engagement_type": "retweet",
  "requested_input": "https://x.com/SpaceX/status/2099211149476569207",
  "tweet_id": "2099211149476569207",
  "tweet_url": "https://x.com/SpaceX/status/2099211149476569207",
  "user_id": "28850283",
  "screen_name": "KatarinaVidovic",
  "profile_url": "https://x.com/KatarinaVidovic",
  "name": "Katarina Vidovic",
  "description": "I'm A Concerned American 🇺🇸 A Momma & Grandmother. $SPCX & $TSLA shareholder ⚡️| Online security advocate🛡️ | 🚫Scams.",
  "description_entities": {
    "description": {}
  },
  "profile_description_language": "en",
  "location": "SpaceX",
  "created_at": "2009-04-04T19:08:21Z",
  "followers_count": 1086,
  "friends_count": 1755,
  "tweets_count": 12483,
  "media_count": 303,
  "favourites_count": 262655,
  "verified": false,
  "is_blue_verified": false,
  "protected": false,
  "possibly_sensitive": false,
  "profile_interstitial_type": "",
  "can_media_tag": false,
  "professional_type": "",
  "professional_categories": [],
  "affiliation_name": "",
  "affiliation_url": "",
  "affiliation_badge_url": "",
  "pinned_tweet_ids": [
    "1211373530635476992"
  ],
  "account_label": null,
  "profile_image_shape": "Circle",
  "subscription_eligible": false,
  "bio_urls": [],
  "bio_mentions": [],
  "bio_hashtags": [],
  "website_url": "",
  "profile_image_url": "https://pbs.twimg.com/profile_images/1371160517075685376/gq5YFrSS_normal.jpg",
  "profile_banner_url": "https://pbs.twimg.com/profile_banners/28850283/1615745118"
}
```

#### Quote author and quote Tweet

```json
{
  "status": "success",
  "engagement_type": "quote",
  "requested_input": "https://x.com/SpaceX/status/2099211149476569207",
  "tweet_id": "2099211149476569207",
  "tweet_url": "https://x.com/SpaceX/status/2099211149476569207",
  "user_id": "832218563964444672",
  "screen_name": "spcxGOD",
  "profile_url": "https://x.com/spcxGOD",
  "name": "Panke",
  "description": "SpaceX Maxi Grok Maxi\nSharing my Thoughts. Human Not a SI.\n$SPCX alpha you won't find anywhere else → https://t.co/EmOEd5Em7W · TikTok/IG/YT @spcxGOD",
  "description_entities": {
    "description": {
      "urls": [
        {
          "display_url": "panke.app",
          "expanded_url": "http://panke.app",
          "indices": [
            102,
            125
          ],
          "url": "https://t.co/EmOEd5Em7W"
        }
      ]
    },
    "url": {
      "urls": [
        {
          "display_url": "panke.app",
          "expanded_url": "http://panke.app",
          "indices": [
            0,
            23
          ],
          "url": "https://t.co/EmOEd5Em7W"
        }
      ]
    }
  },
  "profile_description_language": "en",
  "location": "Space",
  "created_at": "2017-02-16T13:22:22Z",
  "followers_count": 18428,
  "friends_count": 3685,
  "tweets_count": 42942,
  "media_count": 5384,
  "favourites_count": 19067,
  "verified": false,
  "is_blue_verified": true,
  "protected": false,
  "possibly_sensitive": false,
  "profile_interstitial_type": "",
  "can_media_tag": true,
  "professional_type": "",
  "professional_categories": [],
  "affiliation_name": "",
  "affiliation_url": "",
  "affiliation_badge_url": "",
  "pinned_tweet_ids": [
    "2119819831734051216"
  ],
  "account_label": null,
  "profile_image_shape": "Circle",
  "subscription_eligible": true,
  "bio_urls": [
    "http://panke.app"
  ],
  "bio_mentions": [],
  "bio_hashtags": [],
  "website_url": "http://panke.app",
  "profile_image_url": "https://pbs.twimg.com/profile_images/2096657055306416128/5fAtJb5j_normal.jpg",
  "profile_banner_url": "https://pbs.twimg.com/profile_banners/832218563964444672/1793267716",
  "quote_tweet_id": "2099214419964174508",
  "quote_tweet_url": "https://x.com/spcxGOD/status/2099214419964174508",
  "quote_text": "Good livestream.\n\nTesla holders if you want to be excited about SpaceX livestreams as well that happen every other day.\n\nJust rotate 50% of your tesla holding to $SPCX \n\nIt will be good for you",
  "quote_created_at": "2026-09-13T19:11:33Z",
  "quote_language": "en",
  "quote_reply_count": 1,
  "quote_retweet_count": 0,
  "quote_like_count": 8,
  "quote_quote_count": 0,
  "quote_bookmark_count": 0,
  "quote_view_count": 1065,
  "quote_possibly_sensitive": false,
  "quote_hashtags": [],
  "quote_mentions": [],
  "quote_urls": [],
  "quote_media": []
}
```

### API and integrations

Use your Apify API token in the request header.

```bash
curl -X POST \
  "https://api.apify.com/v2/actors/arjun_code~x-twitter-retweeters-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tweets":["https://x.com/SpaceX/status/2099211149476569207"],"resultType":"retweeters","maxRetweetersPerTweet":20}'
```

This starts a run and returns its ID. After the run finishes, use its `defaultDatasetId` to download the results. You can also save the input as a Task, schedule it, or use Apify integrations.

### Continue your research

- [Collect comments and reply authors with Replies Scraper](https://apify.com/arjun_code/x-twitter-replies-scraper)
- [Get post details, media, and Articles with Media Downloader](https://apify.com/arjun_code/x-twitter-media-downloader)
- [Export audience profiles with Followers & Following](https://apify.com/arjun_code/x-twitter-followers-followings-scraper)

### Privacy and support

The Actor processes information exposed by X for public posts and profiles. Internal cookies, proxy details, and authentication data are never written to the result Dataset.

This independent Actor is not affiliated with, endorsed by, or sponsored by X Corp. Use the data lawfully and follow X, Apify, and applicable privacy requirements.

If a run fails or X changes its response format, open an issue on the Actor page and include the Apify run ID, input, and expected behavior. Never include passwords, cookies, tokens, or other secrets.

# Actor input Schema

## `tweets` (type: `array`):

Enter up to 50 unique X posts per run, one per line. Use a numeric post ID or a full x.com/twitter.com status URL. Equivalent URLs and duplicate IDs count as one post. If you enter more than 50 unique posts, the Actor returns a message asking you to split the batch; no posts are processed. Within this limit, invalid values are reported separately and valid posts continue normally.

## `resultType` (type: `string`):

Choose whether to collect users who reposted the post, authors of visible quote tweets, or both groups.

## `maxRetweetersPerTweet` (type: `integer`):

Maximum number of visible retweeter profiles returned for each post. Enter 0 to follow all cursor pages exposed by X.

## `maxQuoteUsersPerTweet` (type: `integer`):

Maximum number of unique authors returned from posts that quote the source post. Enter 0 to follow all cursor pages exposed by X.

## `includeRawUser` (type: `boolean`):

Adds the original native X user object as raw_user. Leave disabled for smaller, flat records.

## Actor input object example

```json
{
  "tweets": [
    "https://x.com/SpaceX/status/2099220930589327483"
  ],
  "resultType": "retweeters",
  "maxRetweetersPerTweet": 100,
  "maxQuoteUsersPerTweet": 100,
  "includeRawUser": false
}
```

# Actor output Schema

## `results` (type: `string`):

Public account details for users returned by X's Retweeters timeline or quoted-post search.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tweets": [
        "https://x.com/SpaceX/status/2099220930589327483"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arjun_code/x-twitter-retweeters-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "tweets": ["https://x.com/SpaceX/status/2099220930589327483"] }

# Run the Actor and wait for it to finish
run = client.actor("arjun_code/x-twitter-retweeters-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tweets": [
    "https://x.com/SpaceX/status/2099220930589327483"
  ]
}' |
apify call arjun_code/x-twitter-retweeters-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,arjun_code/x-twitter-retweeters-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sgy3K7Ax1S7LCOLPY/builds/Gx2Pn7j0RhqStNxGb/openapi.json
