# X.com (Twitter) Tweet Replies Scraper (`lurkapi/x-twitter-tweet-replies-scraper`) Actor

Paste any tweet URL. Get every reply back: nested depth, parent-link tree, engagement, author profile, media. Filters + sort + optional media/author add-ons.

- **URL**: https://apify.com/lurkapi/x-twitter-tweet-replies-scraper.md
- **Developed by:** [LurkAPI](https://apify.com/lurkapi) (community)
- **Categories:** Agents, Social media, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 reply scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## X.com (Twitter) Tweet Replies Scraper

Paste any tweet. Get every reply back, from every author, walked all the way down the conversation tree. Clean, structured data straight to your spreadsheet, CRM, or dashboard.

### 💬 What it does

Give it any tweet on X (formerly Twitter) and this tool returns every reply we can see:

- **From every author.** Not just the tweet owner, not just the first few. Every public reply.
- **Replies of replies.** Walks the whole conversation tree, up to 5 levels deep.
- **With a parent link on every row** so you can rebuild the full thread structure downstream.

For every reply you get:

- The full text (no 280-character truncation on long-form notes)
- Author handle, display name, avatar, verification badges
- Likes, retweets, replies, quotes, bookmarks, view count
- Attached photos and videos (turn on the download add-on to save the files)
- Hashtags, mentions, and expanded URLs
- `parentReplyId`, `depth`, and `position` so the reply tree is reconstructable
- Precise creation timestamp in ISO 8601

### 📋 How to use it

#### Step 1: Paste your tweets

- **Tweet URLs or IDs**: one per line. Full URLs, share links, or plain tweet ID numbers all work (x.com, twitter.com, mobile.twitter.com, fxtwitter.com, vxtwitter.com).
- Up to 500 tweets per run.

#### Step 2: Set the walk depth and cap

- **Max replies per tweet**: hard cap per input tweet. Default 100, raise up to 2000.
- **Max depth**: how deep down the reply tree we walk. 1 = direct replies only, 2 = replies plus reply-to-replies (default), up to 5 for full deep-dive.
- **Sort**: Top (engagement-weighted, default), Latest, Oldest, or Most Liked. Same options X gives you.

#### Step 3: (Optional) Filter your results

Every filter is off by default. Filters are free. Replies dropped by a filter are never billed.

- **Minimum likes / retweets / replies**: drop low-engagement noise.
- **Verified authors only**: skip non-verified handles.
- **Only replies with media**: keep photos and videos.
- **Exclude the OP's self-replies**: drop the original tweet author's own replies (use our [Thread Scraper](https://apify.com/lurkapi/x-twitter-thread-unroller) for those).
- **Keyword include / exclude regex**: case-insensitive regex match on reply text. Great for filtering out spam like `airdrop|crypto|giveaway`.

#### Step 4: (Optional) Add-ons

Every add-on is off by default. Each is billed only when it returns a real result. Failed lookups cost nothing.

- **Download photos and videos**: save every image and video into your run's key-value store. Each media item gets a signed download link (`kvUrl`). Billed once per reply that had at least one file saved.
- **Author enrichment**: for every unique reply author, fetch the full profile (followers, bio, join date, verified badge). Billed once per unique handle across the run, cached across every input tweet.

#### Step 5: Run

Click Start. Rows stream into the Output tab as each conversation level finishes, so you can start pulling data before the run is done.

### 📊 What you get

Every row is one reply. Four tabs group the fields by what you care about:

| Tab | What is in it |
|---|---|
| 📋 Overview | OP handle, position, depth, reply text, top engagement counts, posted date, reply URL |
| 💬 Replies | Full spread: reply ID, parent ID, in-reply-to fields, every engagement count, URL |
| 👤 Authors | Author profile columns (populated when the Author enrichment add-on is on) |
| 🖼️ Media | Replies that have media. Signed download link per file when the Download add-on is on |

Export from the Output tab as JSON, CSV, or Excel.

Every row has a `status` field. `Success` means the row is good. Anything else is a human-readable message explaining what happened (tweet deleted, account protected, rate limit). Rows that did not succeed are never billed.

### 💰 Pricing

You only pay for replies you actually keep. Every event is billed per result.

| Event | Rate | When it fires |
|---|---|---|
| Reply scraped | $0.50 / 1,000 | Once per surviving reply row |
| Media extracted | $2.00 / 1,000 | Once per reply with at least one file saved |
| Author enriched | $1.00 / 1,000 | Once per unique reply author successfully resolved |

Deleted tweets, private accounts, and rate-limit errors are always free. Replies dropped by a filter are always free.

### 💡 Good to know

- **Every reply, from everyone.** Not just the first few. Not just from the tweet author. Every public reply we can see.
- **Filters that save you money.** Drop low-quality replies before they cost you anything.
- **Sort like the app.** Top, Latest, Oldest, and Most Liked match the sort options in X's own UI.
- **Clean data ready for a spreadsheet.** Numbers as numbers, dates as dates, links as links. No cleanup needed.
- **Author enrichment is cached across the whole run.** The same handle across many input tweets bills once.
- **Long text is never truncated.** Long-form note tweets come back in full.
- **URL forms accepted**: `x.com/user/status/123`, `twitter.com/user/status/123`, `mobile.x.com/...`, share links, and bare numeric IDs all work.
- **Media files are stored in your Apify key-value store.** How long they are kept depends on your Apify plan.

### 💻 For developers

Call this actor through the Apify API:

```json
{
    "tweetUrls": ["https://x.com/karpathy/status/1615398117683388417"],
    "maxRepliesPerTweet": 500,
    "maxDepth": 3,
    "sort": "top",
    "minLikes": 5,
    "verifiedOnly": false,
    "hasMediaOnly": false,
    "excludeOpSelfReplies": true,
    "keywordExcludeRegex": "airdrop|crypto|giveaway",
    "outputMode": "flat",
    "enrichAuthors": true,
    "downloadMedia": false
}
```

Only `tweetUrls` is required. Every other field is optional.

### ❓ FAQ

**Do I need a Twitter or X account?**
No. Nothing to sign up for.

**Which links work?**
Anything you can copy from X or Twitter. Full URLs, share links, or plain tweet ID numbers. Works with x.com, twitter.com, mobile.twitter.com, fxtwitter.com, vxtwitter.com.

**How many replies will I actually get?**
Depends on the tweet. Popular tweets can hit the default cap of 100 per input. Raise the cap up to 2000. Some replies are hidden by X and cannot be seen without logging in, so you will not always get 100% of what the reply count on the tweet shows.

**Can I filter out spam and giveaway bots?**
Yes. Turn on "Verified authors only" or add a regex like `giveaway` to the exclude filter. Set a minimum like count too. Anything the filter drops does not bill.

**What if the tweet was deleted?**
You will see a clear status message in the results telling you what happened. That run is free.

**Can I get every reply's author profile?**
Yes. Turn on the Author enrichment add-on. You get followers, bio, join date, and the verified badge for every unique reply author. Cached across the whole run so you pay once per unique handle.

**Can I download the images and videos in replies?**
Yes. Turn on the Download media add-on. Files land in your Apify key-value store, ready to grab.

**What does `depth` mean?**
`0` is the original tweet. `1` is a direct reply. `2` is a reply-to-a-reply. And so on, up to your Max depth setting.

**How fast is it?**
About 100 replies per minute at the default memory tier. Bigger memory tiers run faster.

**Can I use my own X cookies?**
No. This actor does not accept user cookies.

### 🔗 Other tools you might like

- [X Thread Scraper](https://apify.com/lurkapi/x-twitter-thread-unroller): The tweet author's own reply chain, unrolled as a full thread with a free Markdown export.
- [X Tweet Scraper](https://apify.com/lurkapi/x-twitter-tweet-scraper): Search tweets by keyword, hashtag, or handle.
- [X Profile Scraper](https://apify.com/lurkapi/x-twitter-profile-scraper): Every tweet from any public profile.

### ⚖️ Disclaimer

This tool is intended for personal, research, and educational use. You are responsible for complying with X.com's Terms of Service and applicable laws in your jurisdiction. The developer is not liable for misuse. Data availability depends on what X shows publicly at the moment you run it.

**Keywords:** x replies scraper, twitter reply scraper, twitter comments scraper, x reply tree, twitter reply tree, x conversation scraper, tweet reply extractor, twitter reply analytics, twitter reply monitoring, x comment mining, apify twitter, twitter replies to csv, twitter reply download, tweet response scraper, twitter comment extractor

# Actor input Schema

## `tweetUrls` (type: `array`):

Paste the tweet you want replies for. Accepts x.com, twitter.com, mobile.twitter.com, fxtwitter.com, vxtwitter.com URLs, share links, or bare numeric IDs. One entry per tweet. Up to 500 entries per run.

## `maxRepliesPerTweet` (type: `integer`):

Hard cap on replies collected per input tweet. Root is always included when includeRootTweet is on. Default 100 covers most tweets.

## `maxDepth` (type: `integer`):

How many reply levels to walk. 1 = direct replies only. 2 = replies + replies-of-replies (recommended default). Up to 5. Deeper = more coverage, longer runtime.

## `sort` (type: `string`):

How replies are ordered in the output. Recommended: Top (best signal first, cheapest for downstream filtering). Latest / Oldest = by createdAt. Most liked = by likeCount desc.

## `minLikes` (type: `integer`):

Drop replies with fewer likes than this. 0 = no filter.

## `minRetweets` (type: `integer`):

Drop replies with fewer retweets than this. 0 = no filter.

## `minReplies` (type: `integer`):

Drop replies with fewer sub-replies than this. 0 = no filter.

## `verifiedOnly` (type: `boolean`):

Drop replies from non-verified accounts (no Blue check).

## `hasMediaOnly` (type: `boolean`):

Drop text-only replies. Keeps only replies with at least one photo or video attached.

## `excludeOpSelfReplies` (type: `boolean`):

Drop replies posted by the original tweet's author (their own follow-ups). Use the sibling Thread Scraper for OP self-reply chains.

## `keywordIncludeRegex` (type: `string`):

Only keep replies whose text matches this regular expression (case-insensitive). Leave empty for no filter. Example: AI|LLM|model

## `keywordExcludeRegex` (type: `string`):

Drop replies whose text matches this regular expression (case-insensitive). Leave empty for no filter. Example: crypto|airdrop|giveaway

## `downloadMedia` (type: `boolean`):

Download every photo and video attached to any reply into the run's key-value store. Charged once per reply with at least one file downloaded.

## `enrichAuthors` (type: `boolean`):

Hydrate the full profile for every unique reply author: verified flag, followers, bio, join date, profile image. Charged once per unique author enriched.

## `outputId` (type: `boolean`):

Numeric reply tweet ID.

## `outputUrl` (type: `boolean`):

Canonical reply URL.

## `outputFullText` (type: `boolean`):

Full reply text.

## `outputCreatedAt` (type: `boolean`):

ISO-8601 creation timestamp.

## `outputLang` (type: `boolean`):

Source language as returned by X.

## `outputReplyCount` (type: `boolean`):

Reply count on this reply.

## `outputRetweetCount` (type: `boolean`):

Retweet count.

## `outputLikeCount` (type: `boolean`):

Favorite / like count.

## `outputQuoteCount` (type: `boolean`):

Quote-tweet count.

## `outputBookmarkCount` (type: `boolean`):

Bookmark count.

## `outputViewCount` (type: `boolean`):

View count.

## `outputConversationId` (type: `boolean`):

Conversation root ID.

## `outputInReplyTo` (type: `boolean`):

inReplyToTweetId + inReplyToScreenName. Present on every reply for tree reconstruction.

## `outputDepth` (type: `boolean`):

Depth in the reply tree. 0 = original tweet, 1 = direct reply, 2 = reply-to-reply, etc.

## `outputIsReply` (type: `boolean`):

Boolean flag for reply tweets (always true on non-root rows).

## `outputIsRetweet` (type: `boolean`):

Boolean flag for retweets.

## `outputIsQuote` (type: `boolean`):

Boolean flag for quote tweets.

## `outputMentions` (type: `boolean`):

@-mentions array.

## `outputHashtags` (type: `boolean`):

Hashtags array.

## `outputUrls` (type: `boolean`):

Expanded URLs in reply.

## `outputMedia` (type: `boolean`):

Media array (photos + videos with URLs). Files are downloaded into the KV store only if the Download media add-on is on.

## `outputAuthor` (type: `boolean`):

Author block. Basic (handle, name, avatar) unless Author enrichment add-on is on (adds followers, bio, verified flags, join date).

## `outputQuotedTweet` (type: `boolean`):

Nested quoted-tweet object when the reply quote-tweets another post.

## Actor input object example

```json
{
  "tweetUrls": [
    "https://x.com/karpathy/status/1615398117683388417"
  ],
  "maxRepliesPerTweet": 100,
  "maxDepth": 2,
  "sort": "top",
  "minLikes": 0,
  "minRetweets": 0,
  "minReplies": 0,
  "verifiedOnly": false,
  "hasMediaOnly": false,
  "excludeOpSelfReplies": false,
  "keywordIncludeRegex": "",
  "keywordExcludeRegex": "",
  "downloadMedia": false,
  "enrichAuthors": false,
  "outputId": true,
  "outputUrl": true,
  "outputFullText": true,
  "outputCreatedAt": true,
  "outputLang": true,
  "outputReplyCount": true,
  "outputRetweetCount": true,
  "outputLikeCount": true,
  "outputQuoteCount": true,
  "outputBookmarkCount": true,
  "outputViewCount": true,
  "outputConversationId": true,
  "outputInReplyTo": true,
  "outputDepth": true,
  "outputIsReply": true,
  "outputIsRetweet": true,
  "outputIsQuote": true,
  "outputMentions": true,
  "outputHashtags": true,
  "outputUrls": true,
  "outputMedia": true,
  "outputAuthor": true,
  "outputQuotedTweet": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Every reply with the essentials.

## `replies` (type: `string`):

Per-reply detail with parent + root IDs for tree reconstruction.

## `authors` (type: `string`):

Unique reply authors with profile metadata.

## `media` (type: `string`):

Reply media attachments.

## `keyValueStore` (type: `string`):

Downloaded photos and videos (when Download media add-on is enabled).

# 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 = {
    "tweetUrls": [
        "https://x.com/karpathy/status/1615398117683388417"
    ],
    "maxRepliesPerTweet": 100,
    "maxDepth": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/x-twitter-tweet-replies-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 = {
    "tweetUrls": ["https://x.com/karpathy/status/1615398117683388417"],
    "maxRepliesPerTweet": 100,
    "maxDepth": 2,
}

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

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

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

```

## CLI example

```bash
echo '{
  "tweetUrls": [
    "https://x.com/karpathy/status/1615398117683388417"
  ],
  "maxRepliesPerTweet": 100,
  "maxDepth": 2
}' |
apify call lurkapi/x-twitter-tweet-replies-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lurkapi/x-twitter-tweet-replies-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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