# Threads Replies Scraper (`maximedupre/scrape-threads-replies`) Actor

Collect public replies from Threads post or profile URLs. Set a reply limit, nested reply depth, and UTC time filter, then save reply text, authors, links, engagement, and conversation context in a dataset.

- **URL**: https://apify.com/maximedupre/scrape-threads-replies.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.05 / 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?

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

### 🧵 Find public Threads replies with conversation context

For social media researchers, community teams, and developers, Threads Replies Scraper collects public replies from submitted Threads post or profile URLs. It saves structured records with reply text, timestamps, authors, engagement, media, conversation links, root-post context, and the source URL, so you can review or export the data without copying replies by hand.

- Collect replies from a public Threads post with **[Threads Post Replies](https://apify.com/maximedupre/scrape-threads-replies/examples/threads-post-replies)**.
- Collect replies from public posts on a profile with **[Threads Profile Replies](https://apify.com/maximedupre/scrape-threads-replies/examples/threads-profile-replies)**.
- Turn a public Threads reply page into structured data with **[Threads Reply Scraper](https://apify.com/maximedupre/scrape-threads-replies/examples/threads-reply-scraper)**.
- Gather conversation replies for review with **[Threads Replies Scraper](https://apify.com/maximedupre/scrape-threads-replies/examples/threads-replies-scraper)**.
- Scrape public Threads replies for a dataset with **[Scrape Threads Replies](https://apify.com/maximedupre/scrape-threads-replies/examples/scrape-threads-replies)**.

#### 📦 Threads reply rows with source and context

Each saved row describes one public reply. It can include the reply author, text, time, engagement counts, media, mentions, hashtags, external links, reply state, and conversation context. The source URL and source type show whether the run used a post or profile target. Optional fields can be missing when Threads does not expose them.

#### ▶️ Run a Threads reply collection

1. Set `Target` to `posts` or `profiles`.
2. Add one or more matching public Threads URLs to `Source URLs`.
3. Optionally set the reply limit, nested reply depth, and UTC time filter.
4. Start the run and open the `dataset` link in the output.

**Successful default input**

This input comes from a successful current-beta run:

```json
{
  "target": "posts",
  "sourceUrls": [
    {
      "url": "https://www.threads.com/@instagram/post/DQNCKbZjq-v"
    }
  ],
  "maxRepliesPerTarget": 100,
  "nestedReplyDepth": 0
}
```

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Select `posts` for post URLs or `profiles` for profile URLs. |
| `sourceUrls` | array of objects | Lists one or more public Threads URLs that match `target`. |
| `sourceUrls[].url` | string | Gives one public post or profile URL that matches `target`. |
| `maxRepliesPerTarget` | integer | Sets an optional cap for each submitted target. Leave it empty to collect all available replies until the source is exhausted. |
| `nestedReplyDepth` | integer | Sets the number of nested reply levels. Use `0` for top-level replies only. A positive number includes that many levels. |
| `repliesAfter` | string (UTC date-time) | Keeps replies published at or after this UTC time. Use an ISO 8601 value such as `2026-01-15T12:00:00Z`. |

#### 🧾 Output

**Run output**

The `dataset` output is a string URL that opens the default dataset overview for the run.

**Dataset row fields**

Each dataset item has one reply-row shape. Fields can be missing when Threads does not expose the value.

| Field | Type | What it does |
| --- | --- | --- |
| `replyId` | string | The public ID of the reply. |
| `replyUrl` | string (URL) | The public URL of the reply. |
| `text` | string | The reply text. |
| `publishedAt` | string (date-time) | The time when the reply was published. |
| `author` | object | Public details about the reply author. |
| `author.username` | string | The author's public Threads username. |
| `author.displayName` | string | The author's public display name. |
| `author.profileUrl` | string (URL) | The author's public Threads profile URL. |
| `author.isVerified` | boolean | Whether Threads marks the author as verified. |
| `engagement` | object | Public activity counts for the reply. |
| `engagement.likes` | integer | The public like count for the reply. |
| `engagement.replies` | integer | The public reply count for the reply. |
| `engagement.reposts` | integer | The public repost count for the reply. |
| `engagement.quotes` | integer | The public quote count for the reply. |
| `media` | array of objects | Public media attached to the reply. |
| `media[].url` | string (URL) | The direct public URL of a media file. |
| `media[].type` | string | The public media type. |
| `media[].altText` | string | Accessibility text for the media. |
| `media[].width` | integer | The media width in pixels. |
| `media[].height` | integer | The media height in pixels. |
| `sharedPost` | object | Public quote, repost, or share context attached to the reply. |
| `sharedPost.type` | string | The share type: `quote`, `repost`, or `share`. |
| `sharedPost.id` | string | The public ID of the shared post. |
| `sharedPost.url` | string (URL) | The public URL of the shared post. |
| `sharedPost.text` | string | The text of the shared post. |
| `conversation` | object | The reply's place in the public conversation. |
| `conversation.depth` | integer | The reply's public nesting depth. |
| `conversation.parentReplyId` | string | The public ID of the parent reply. |
| `conversation.parentReplyUrl` | string (URL) | The public URL of the parent reply. |
| `conversation.rootReplyId` | string | The public ID of the first reply in the chain. |
| `rootPost` | object | Public context for the post that starts the conversation. |
| `rootPost.id` | string | The public ID of the root post. |
| `rootPost.url` | string (URL) | The public URL of the root post. |
| `rootPost.text` | string | The text of the root post. |
| `rootPost.author` | object | Public details about the root post author. |
| `rootPost.author.username` | string | The root post author's public Threads username. |
| `rootPost.author.displayName` | string | The root post author's public display name. |
| `rootPost.author.profileUrl` | string (URL) | The root post author's public Threads profile URL. |
| `rootPost.author.isVerified` | boolean | Whether Threads marks the root post author as verified. |
| `rootPost.engagement` | object | Public activity counts for the root post. |
| `rootPost.engagement.likes` | integer | The public like count for the root post. |
| `rootPost.engagement.replies` | integer | The public reply count for the root post. |
| `rootPost.engagement.reposts` | integer | The public repost count for the root post. |
| `rootPost.engagement.quotes` | integer | The public quote count for the root post. |
| `rootPost.publishedAt` | string (date-time) | The time when the root post was published. |
| `mentions` | array of strings | Public usernames mentioned in the reply. |
| `hashtags` | array of strings | Public hashtags found in the reply. |
| `externalLinks` | array of strings (URL) | Public external links found in the reply. |
| `replyState` | object | Public state details for the reply. |
| `replyState.isQuote` | boolean | Whether the reply is marked as a quote. |
| `replyState.isRepost` | boolean | Whether the reply is marked as a repost. |
| `replyState.isEdited` | boolean | Whether the reply is marked as edited. |
| `replyState.isPartnership` | boolean | Whether the reply is marked as a partnership. |
| `replyState.replyControl` | string | The public reply control shown by Threads. |
| `sourceUrl` | string (URL) | The submitted public Threads URL that led to the reply. |
| `sourceType` | string | Says whether `sourceUrl` points to a `post` or `profile`. |
| `isPublicSubset` | boolean | Says whether the row is part of the public subset exposed by Threads. |
| `collectedAt` | string (date-time) | The time when the reply was collected. |

**Genuine row from a current-beta run**

This unshortened row comes from a successful post-target run with nested reply depth set to `1`:

```json
{
  "replyId": "3750701025532684326_73499897891",
  "replyUrl": "https://www.threads.com/@n1n2t1t2/post/DQNKrXtkagm",
  "text": "I don’t know what to do with myself I don’t know how much",
  "publishedAt": "2025-10-24T20:40:26.000Z",
  "author": {
    "username": "n1n2t1t2",
    "displayName": "Mirella Hernandez",
    "profileUrl": "https://www.threads.com/@n1n2t1t2",
    "isVerified": false
  },
  "engagement": {
    "likes": 0,
    "replies": 0,
    "reposts": 0,
    "quotes": 0
  },
  "media": [],
  "conversation": {
    "depth": 1,
    "rootReplyId": "3750701025532684326_73499897891"
  },
  "rootPost": {
    "id": "3750663577377091503_63404918397",
    "url": "https://www.threads.com/@instagram/post/DQNCKbZjq-v",
    "text": "coffee dates with your bestie >>>\n\nkipotheshibainu",
    "author": {
      "username": "instagram",
      "displayName": "Instagram",
      "profileUrl": "https://www.threads.com/@instagram",
      "isVerified": true
    },
    "engagement": {
      "likes": 1227,
      "replies": 63,
      "reposts": 30,
      "quotes": 1
    },
    "publishedAt": "2025-10-24T19:27:20.000Z"
  },
  "mentions": [],
  "hashtags": [],
  "externalLinks": [],
  "replyState": {
    "isEdited": false,
    "replyControl": "everyone"
  },
  "sourceUrl": "https://www.threads.com/@instagram/post/DQNCKbZjq-v",
  "sourceType": "post",
  "isPublicSubset": true,
  "collectedAt": "2026-08-25T16:35:33.804Z"
}
```

#### 💳 Pricing

**How billing works**

The pricing event is charged for each public reply saved to the dataset. Check Apify Console for the current tier price.

#### 🔌 Integrations

Open the `dataset` output in Apify Console or read its rows through the Apify API.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens when I leave the reply limit empty?

The Actor collects all available replies until the source is exhausted. A value sets a separate cap for each submitted post or profile.

##### Can I choose how many nested replies to include?

Yes. Use `0` for top-level replies only. A positive value includes that many nested levels. If you leave the field empty, only top-level replies are included.

##### Can I filter replies by publication time?

Yes. Set `repliesAfter` to a UTC ISO 8601 timestamp. The Actor includes replies published at or after that time.

##### Can I submit both post and profile URLs in one run?

Choose one `target` value for the run. Add post URLs when `target` is `posts`, or profile URLs when it is `profiles`.

##### Does the Actor return private replies?

No. It reads public Threads data only. Optional fields can be missing when Threads does not expose them.

##### How can I trace a reply to its source?

Use `sourceUrl` and `sourceType` to identify the submitted target. `replyUrl`, `rootPost`, and available conversation links add more context.

##### What does one billed event cover?

One billed event covers one public reply saved to the dataset. The current tier price is shown in Apify Console.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~scrape-threads-replies/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Reddit Comments Search Scraper](https://apify.com/maximedupre/reddit-comments-search-scraper): Search public Reddit comments by keyword and export comment text, authors, scores, and post context.
- [Facebook User Posts Scraper](https://apify.com/maximedupre/facebook-user-posts-scraper): Collect public Facebook posts with author details, engagement, media, and links.
- [GitHub Discussions Scraper](https://apify.com/maximedupre/github-discussions): Save public GitHub discussions with authors, replies, reactions, and source links.
- [Twitch Chat Scraper](https://apify.com/maximedupre/twitch-chat): Collect public Twitch chat messages with sender and source context.
- [Social Media Stats Checker](https://apify.com/maximedupre/social-media-stats-checker): Check public Threads and other social profiles for normalized stats and source URLs.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose whether Source URLs contain post URLs or profile URLs.

## `sourceUrls` (type: `array`):

Add one or more public Threads post or profile URLs that match Target.

## `maxRepliesPerTarget` (type: `integer`):

Optional. Stop after this many replies for each submitted post or profile. Leave it empty to collect all available replies until the source is exhausted.

## `nestedReplyDepth` (type: `integer`):

Choose how many levels of nested replies to include. Use 0 for top-level replies only. A positive number includes that many nested levels. If omitted, only top-level replies are included.

## `repliesAfter` (type: `string`):

Optional. Include replies published at or after this UTC time. In JSON input, use an ISO 8601 UTC timestamp such as 2026-01-15T12:00:00Z. Leave it empty to include all available replies.

## Actor input object example

```json
{
  "target": "posts",
  "sourceUrls": [
    {
      "url": "https://www.threads.com/@instagram/post/DQNCKbZjq-v"
    }
  ],
  "maxRepliesPerTarget": 100,
  "nestedReplyDepth": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the dataset of public Threads replies found by this run.

# 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 = {
    "target": "posts",
    "sourceUrls": [
        {
            "url": "https://www.threads.com/@instagram/post/DQNCKbZjq-v"
        }
    ],
    "maxRepliesPerTarget": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/scrape-threads-replies").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 = {
    "target": "posts",
    "sourceUrls": [{ "url": "https://www.threads.com/@instagram/post/DQNCKbZjq-v" }],
    "maxRepliesPerTarget": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/scrape-threads-replies").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 '{
  "target": "posts",
  "sourceUrls": [
    {
      "url": "https://www.threads.com/@instagram/post/DQNCKbZjq-v"
    }
  ],
  "maxRepliesPerTarget": 100
}' |
apify call maximedupre/scrape-threads-replies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/scrape-threads-replies"
        }
    }
}

```

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/tY8Dm7Ujf122xrhhz/builds/biodUAybxo9rumdP6/openapi.json
