# Threads Replies Scraper - Comments, Likes, Authors (`om_kh/threads-replies-scraper`) Actor

Scrape every reply under any public Threads post: text, author, verified badge, likes, reply and repost counts, date, links, mentions, images and videos. Top, most recent or all, up to 10,000 per post, optional sub-replies. No login, no cookies. $2 per 1,000 replies.

- **URL**: https://apify.com/om_kh/threads-replies-scraper.md
- **Developed by:** [Khandji Omar](https://apify.com/om_kh) (community)
- **Categories:** Social media, Lead generation, AI
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 replies

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

## Threads Replies Scraper — Comments, Likes, Authors

> **Paste a Threads post link. Get every reply as a clean row.**
> Text, author, verified badge, likes, reply and repost counts, date, links,
> mentions, images and videos — top replies first or most recent first.
> No login, no cookies, no browser. **20 replies free on every run.**

### Free tier — 20 results free on every run

**The first 20 results of every run are free**, on every run you ever make — not a one-off trial. One guard: the free allowance never covers more than half of a run, so the offer stays sustainable.

### What does this Threads replies scraper do?

It reads the replies (comments) under any public Threads post. You give post
links; it returns one row per reply. It pages through long conversations on
its own: 150 replies take about 10 seconds.

It reads the public post page and the same reply query the Threads website
uses when you scroll. Nothing is posted, liked or followed, and no account is
involved.

### Why use it

- **No login, no cookies.** Nothing to paste from your browser, nothing that expires.
- **Up to 10,000 replies per post, 200 posts per run.** Measured on a post with 2,514 replies: 899 in *top* order, 1,822 in *recent* order, 1,848 with *all*.
- **Top, most recent, or all.** Most recent first is what you want for daily monitoring; *all* is for full exports.
- **The post itself comes free**, as one extra row with its own likes, reply count and media.
- **Sub-replies in the same run**, when you ask for them.
- **One bad link never kills the run.** A deleted or private post is reported in `RUN_SUMMARY.json` and costs nothing.
- **You pay per reply delivered**, not per run and not per page.

### How to use it in 3 steps

1. Click **Try for free** and paste one or more post links in **Threads post links**.
2. Set **Max replies per post** and choose **Top replies first** or **Most recent first**.
3. Click **Start**. Download the replies as JSON, CSV or Excel, or read them by API.

### Input

| Field | What it does |
| --- | --- |
| `postUrls` | Public Threads post links. `threads.com` and `threads.net` links and bare post codes all work. Max 200 per run. |
| `maxRepliesPerPost` | 1 to 10,000. Default 100. |
| `sortOrder` | `top` (as Threads shows them), `recent` (newest first) or `all` (both orders merged: the most replies Threads shows without an account). |
| `includeNestedReplies` | Also return the replies-to-replies Threads shows inline under a reply. Each one counts as a reply. |
| `includePost` | Adds one row for the post itself before its replies (on by default). **Never billed.** |
| `postedAfter` | Keep only replies on or after this date. Filtered **before** billing. |
| `maxTotalChargeUsd` | Optional hard cost cap for the run. |

```json
{
  "postUrls": ["https://www.threads.com/@zuck/post/Dd1MqfcG0aH"],
  "maxRepliesPerPost": 200,
  "sortOrder": "recent"
}
```

### Output

One row per reply (`type: "reply"`), plus one free row per post (`type: "post"`).

A real row from this Actor's latest run on Apify (2026-10-23; long texts are cut and people's names hidden here, your dataset has them in full):

```json
{
  "status": "ok",
  "type": "reply",
  "postUrl": "https://www.threads.com/@zuck/post/Dd1MqfcG0aH",
  "postAuthorUsername": "(hidden here)",
  "postReplyCount": 2661,
  "postLikeCount": 2754,
  "rank": 6,
  "replyId": "3996164469004254295",
  "code": "Dd1Oml3CTxX",
  "url": "https://www.threads.com/@pie_3.1415926._/post/Dd1Oml3CTxX",
  "text": "他頭貼變黑白我還以為他掛了",
  "language": "zh_TW",
  "createdAt": "2026-09-28T12:52:29Z",
  "createdAtTimestamp": 1790599949,
  "authorUsername": "(hidden here)",
  "authorFullName": "(hidden here)",
  "authorId": "(hidden here)",
  "authorIsVerified": "(hidden here)",
  "authorProfileUrl": "(hidden here)",
  "authorProfilePicUrl": "(hidden here)",
  "likeCount": 61,
  "replyCount": 1,
  "repostCount": 2,
  "quoteCount": 0,
  "shareCount": 1,
  "engagement": 65,
  "replyToUsername": "(hidden here)",
  "isLikedByPostAuthor": "(hidden here)",
  "isEdited": false,
  "isPaidPartnership": false,
  "replyControl": "everyone",
  "mediaType": "text",
  "hasMedia": false,
  "isQuotePost": false,
  "isRepost": false,
  "isDirectReply": true,
  "isByPostAuthor": "(hidden here)",
  "repliedAfterSeconds": 1017
}
```

Fields that save you work:

- `rank` — position in the order you chose; `engagement` — likes + replies + reposts + quotes + shares, ready to sort on.
- `isLikedByPostAuthor` and `isByPostAuthor` — the replies the author liked, and the author answering in their own thread.
- `repliedAfterSeconds` — how long after the post the reply came. Early repliers are the real fans.
- `mediaType` — `text`, `photo`, `video`, `carousel` or `gif`; `hashtags`, `emails`, `links` and `mentions` are already extracted.
- With **Include sub-replies**, `isDirectReply` is `false` and `parentReplyId` points to the reply above.
- `language` is filled only when Threads labels the reply, which is not often.

The `post` row has the same fields for the post itself, plus `repliesCollected`.

### How much does it cost?

**$2 per 1,000 replies** ($0.002 per reply) on the free plan, less on paid
Apify plans — the exact price for your plan is on the **Pricing** tab. No
start fee. **The first 20 replies of every run are free.**

| Replies | You pay |
| --- | --- |
| 20 | $0 |
| 500 | about $0.96 |
| 5,000 | about $9.96 |

A post that cannot be read costs nothing. Replies removed by your date filter
cost nothing.

### Use cases

- **Brand and community teams** — read what people answer under your posts and your competitors' posts, every day, most recent first.
- **Sentiment and AI analysis** — feed reply text to a model; each row carries likes and the author.
- **Lead generation** — find the people who engage with a topic or a creator.
- **Giveaways and research** — export every reply of a post to a spreadsheet.

### Use it from code (API)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/threads-replies-scraper").call(run_input={
    "postUrls": ["https://www.threads.com/@zuck/post/Dd1MqfcG0aH"],
    "maxRepliesPerPost": 200,
    "sortOrder": "recent",
})
for reply in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(reply["authorUsername"], reply["likeCount"], reply["text"])
```

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~threads-replies-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"postUrls": ["https://www.threads.com/@zuck/post/Dd1MqfcG0aH"], "maxRepliesPerPost": 100}'
```

### Integrations and MCP

- **Make / n8n / Zapier** — *Apify › Run an Actor*, then *Get Dataset Items*, then Google Sheets or Slack.
- **Schedules** — run it every hour or day with `sortOrder: recent` to follow a post.
- **AI agents (MCP)** — connect your client to `https://mcp.apify.com` and add `om_kh/threads-replies-scraper` as a tool.

### Tips and limits

- Only **public** posts. Private profiles and deleted posts are reported as not found.
- Threads decides how many replies it serves without an account. On very large posts the run stops when Threads stops returning new replies — use `sortOrder: all` to get the most — and you pay only for what was delivered.
- **Include sub-replies** returns the sub-replies Threads shows inline, not every level of a long conversation. To get all replies of one reply, pass that reply's own link as a post.
- Image and video links are signed by Threads and expire after some time; download them soon after the run.

### FAQ

**Do I need a Threads or Instagram account?**
No. The Actor never logs in.

**Can I scrape the replies of a reply?**
Yes. Every reply has its own `url`; pass it in `postUrls`.

**Is it legal?**
It reads public replies that anyone can see without an account. Replies contain personal data (usernames, text), so use them in line with GDPR and your local law.

**Can I export to CSV, Excel or Google Sheets?**
Yes: download any run as CSV, Excel or JSON, or add the Google Sheets integration.

### Support

Found a bug or need a field? Use the **Issues** tab of this Actor. Every report gets a reply.

### Your feedback

Did this Actor save you time? A short review on the **Reviews** tab helps other people find it, and every review is read. Something missing or broken? Open an issue on the **Issues** tab: it is answered and fixed fast.

# Actor input Schema

## `postUrls` (type: `array`):

Links of public Threads posts, e.g. https://www.threads.com/@zuck/post/Dd1MqfcG0aH (threads.net links and bare post codes work too). Max 200 per run.

## `maxRepliesPerPost` (type: `integer`):

1 to 10,000. Default 100.

## `sortOrder` (type: `string`):

Top replies first (as Threads shows them), the most recent first, or all: both orders merged, for the most replies Threads shows without an account (slower).

## `includeNestedReplies` (type: `boolean`):

Also return the replies-to-replies that Threads shows inline under a reply (not every sub-reply of long conversations). Each one counts as a reply.

## `includePost` (type: `boolean`):

Add one row for the post (text, author, likes, reply count, media) before its replies. This row is never billed.

## `postedAfter` (type: `string`):

Only replies on or after this date (YYYY-MM-DD). Filtered before billing.

## `maxTotalChargeUsd` (type: `number`):

Optional hard cost cap for this run.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.threads.com/@zuck/post/Dd1MqfcG0aH"
  ],
  "maxRepliesPerPost": 50,
  "sortOrder": "top",
  "includeNestedReplies": false,
  "includePost": true
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, and source issues.

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

Replies in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

# 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 = {
    "postUrls": [
        "https://www.threads.com/@zuck/post/Dd1MqfcG0aH"
    ],
    "maxRepliesPerPost": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/threads-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 = {
    "postUrls": ["https://www.threads.com/@zuck/post/Dd1MqfcG0aH"],
    "maxRepliesPerPost": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("om_kh/threads-replies-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 '{
  "postUrls": [
    "https://www.threads.com/@zuck/post/Dd1MqfcG0aH"
  ],
  "maxRepliesPerPost": 50
}' |
apify call om_kh/threads-replies-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,om_kh/threads-replies-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/AphK8mPAQv5hVKcYj/builds/MLXsJfFHkSZtXXl7U/openapi.json
