# Threads Replies Scraper (`parseforge/threads-replies-scraper`) Actor

Scrape every public reply to Threads posts, nested replies included, with author id, verified badge, likes, reposts and media. No login. Export to CSV, Excel, JSON or XML.

- **URL**: https://apify.com/parseforge/threads-replies-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 result items

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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)

## 🧵 Threads Replies Scraper

> 🚀 **Export every public reply to a Threads post in seconds.** Paste post links, get one row per reply with 43 fields: text, date, likes, replies, reposts, quotes, author id, username, verified badge, media, and the full conversation tree with depth and parent links. 700 replies in about a minute, no login.

Threads Replies Scraper reads the public conversation under any Threads post, the same replies a logged-out visitor can open on threads.com. It pages through the whole list instead of stopping at the first screen, follows replies to replies as deep as you ask, and tells you for every row where it sits in the conversation.

Each row carries 43 fields. In our tests one post returned 355 top-level replies plus their sub-threads, and a two-post run delivered 700 replies in 61 seconds. There is no cap on the number of post links per run and no cap on replies per post other than the ones you set.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Social media managers, brand and community teams, PR agencies, market researchers, journalists, data scientists | Comment analysis, sentiment and topic research, brand monitoring, audience research, crisis tracking, conversation datasets |

### 📋 What the Threads Replies Scraper does

- 💬 **Every public reply, not a first screen.** Pages through the whole reply list, 50 replies per request.
- 🌳 **Nested replies with the full tree.** Optional: replies to replies up to 10 levels deep, each row with `depth`, `parentPostId`, `parentPostUrl` and `replyToUsername`.
- 👤 **Author details on every row.** Username, numeric account id (a stable join key), display name, verified badge, avatar and profile link.
- 📈 **Engagement.** Likes, replies, reposts and quotes on each reply, plus shares when Threads publishes them.
- 👑 **Post author signals.** Whether the post author wrote the reply, liked it or pinned it.
- 🖼 **Media.** Media type (text, image, video, carousel, GIF), every image and video URL, mentions, links, topic tag and detected language.
- ↕️ **Top or most recent.** Threads' own ranking, or newest first with a date cutoff for daily monitoring.
- 🧹 **No duplicates, no surprises.** A reply is delivered once per run, and a post that cannot be read gets a clear error row that is never charged.

> 💡 **Why it matters:** the replies are where the audience actually reacts. Likes tell you how many people cared; the replies tell you what they think, who they are and which answer the conversation rallied behind.

### 🎬 Full Demo (🚧 Coming soon)

### 📊 Output

One row per reply. Values Threads does not publish read `Not Disclosed`, fields that do not apply read `N/A`, and empty lists are `[]`. Error rows carry only `source`, `scrapedAt` and `error`.

| Field | Description |
|---|---|
| 🖼 imageUrl | First image or video cover in the reply, N/A for text replies |
| 🔗 postUrl | Link to the reply (valid input for this Actor) |
| 🔤 postCode | Threads short code of the reply |
| 🆔 postId | Numeric id of the reply |
| 💬 text | Reply text |
| 📅 postedAt | Posting time, ISO 8601 UTC |
| ❤️ likeCount | Likes |
| 💬 replyCount | Direct replies to this reply |
| 🔁 repostCount | Reposts |
| 🗨️ quoteCount | Quote posts |
| 📤 reshareCount | Shares, when Threads publishes the number |
| 🌳 depth | 1 = reply to the post, 2 = reply to a reply, and so on |
| ↩️ replyToUsername | Account this reply answers |
| 🆔 parentPostId | Id of the post or reply this row answers |
| 🔤 parentPostCode | Short code of the parent |
| 🔗 parentPostUrl | Link to the parent |
| 🆔 rootPostId | Id of the post you asked for |
| 🔤 rootPostCode | Short code of the post you asked for |
| 🔗 rootPostUrl | Link to the post you asked for |
| 👑 rootPostAuthor | Username of the post author |
| 👤 username | Reply author |
| 🆔 authorId | Numeric account id of the reply author |
| 🪪 authorFullName | Display name |
| ✅ authorIsVerified | Verified badge (Yes/No) |
| 🖼 authorProfilePicUrl | Avatar |
| 🔗 profileUrl | Author profile |
| 👑 isByPostAuthor | The post author wrote this reply |
| 💖 isLikedByPostAuthor | The post author liked this reply |
| 📌 isPinnedByPostAuthor | The post author pinned this reply |
| 🎞 mediaType | Text, Image, Video, Carousel or GIF |
| 📎 hasMedia | Yes when the reply carries media |
| 🖼 imageUrls | Every image in the reply |
| 🎬 videoUrls | Every video in the reply |
| 🏷 mentions | Accounts tagged in the text |
| 🔗 links | Links in the text and link cards |
| #️⃣ topic | Threads topic tag |
| 🌐 language | Language Threads detected |
| 🔗 quotedPostUrl | Post quoted inside the reply |
| ✏️ isEdited | The text was edited |
| ↕️ sortOrder | TOP or RECENT |
| 📥 source | The input line the row came from |
| 🕒 scrapedAt | Collection time |
| ❌ error | null on success |

Three real rows from a cloud run (post authors' replies and audience replies to posts by @zuck and @mosseri):

```json
[
  {
    "imageUrl": "N/A",
    "postUrl": "https://www.threads.com/@zuck/post/DTa39_1EWf5",
    "postCode": "DTa39_1EWf5",
    "postId": "3808602587877435385",
    "text": "Santosh will continue to lead our technical architecture, software stack, silicon program, developer productivity, and building and operating our global datacenter fleet and network. \n\nDaniel will lead a new group responsible for long-term capacity strategy, supplier partnerships, industry analysis, planning, and business modeling.",
    "postedAt": "2026-01-12T18:00:30.000Z",
    "likeCount": 1068,
    "replyCount": 113,
    "repostCount": 56,
    "quoteCount": 4,
    "reshareCount": 48,
    "depth": 1,
    "replyToUsername": "zuck",
    "parentPostId": "3808602590024938729",
    "parentPostCode": "DTa3-B1EbTp",
    "parentPostUrl": "https://www.threads.com/@zuck/post/DTa3-B1EbTp",
    "rootPostId": "3808602590024938729",
    "rootPostCode": "DTa3-B1EbTp",
    "rootPostUrl": "https://www.threads.com/@zuck/post/DTa3-B1EbTp",
    "rootPostAuthor": "zuck",
    "username": "zuck",
    "authorId": "63055343223",
    "authorFullName": "Mark Zuckerberg",
    "authorIsVerified": "Yes",
    "authorProfilePicUrl": "https://scontent-fra5-1.cdninstagram.com/v/t51.82787-19/825322135_17989325280103224_1252773933700107438_n.jpg?stp=dst-jpg_s206x206_tt6&_nc_cat=1&ccb=7-5&_nc_sid=30ff31&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy4xMDgwLkMzIn0%3D&_nc_ohc=hn9Fqadlj3YQ7kNvwGmu2y-&_nc_oc=Ado_-G7J1bMPt3GtgO67stCVlN54YUoUUoOKta9xmoeUUGv7Ul5ufYjokWf9KRECIRg&_nc_zt=24&_nc_ht=scontent-fra5-1.cdninstagram.com&_nc_gid=TXRm1S5RvvbU-f9v40BoZw&_nc_ss=70289&oh=00_AQNkHdsb1lRZFivIaee7l8ofn3DNaPw9xXCS6lqTTAxVvw&oe=6AC0F8AB",
    "profileUrl": "https://www.threads.com/@zuck",
    "isByPostAuthor": "Yes",
    "isLikedByPostAuthor": "No",
    "isPinnedByPostAuthor": "No",
    "mediaType": "Text",
    "hasMedia": "No",
    "imageUrls": [],
    "videoUrls": [],
    "mentions": [],
    "links": [],
    "topic": "N/A",
    "language": "Not Disclosed",
    "quotedPostUrl": "N/A",
    "isEdited": "No",
    "sortOrder": "TOP",
    "source": "https://www.threads.com/@zuck/post/DTa3-B1EbTp",
    "scrapedAt": "2026-09-29T01:10:15.999Z",
    "error": null
  },
  {
    "imageUrl": "N/A",
    "postUrl": "https://www.threads.com/@cristi.baluta/post/DZ7oMqfCHKV",
    "postCode": "DZ7oMqfCHKV",
    "postId": "3925908292295488149",
    "text": "Like a true tv channel, you don’t control what you see",
    "postedAt": "2026-06-23T14:26:00.000Z",
    "likeCount": 2,
    "replyCount": 0,
    "repostCount": 0,
    "quoteCount": 0,
    "reshareCount": "Not Disclosed",
    "depth": 2,
    "replyToUsername": "felixrussellsaw",
    "parentPostId": "3925262670353820991",
    "parentPostCode": "DZ5VZoMim0_",
    "parentPostUrl": "https://www.threads.com/@felixrussellsaw/post/DZ5VZoMim0_",
    "rootPostId": "3925258114057363671",
    "rootPostCode": "DZ5UXU0G-DX",
    "rootPostUrl": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX",
    "rootPostAuthor": "mosseri",
    "username": "cristi.baluta",
    "authorId": "62975343842",
    "authorFullName": "Cristian Băluță",
    "authorIsVerified": "No",
    "authorProfilePicUrl": "https://scontent-fra5-1.cdninstagram.com/v/t51.2885-19/459425776_1936223956897713_7098825868278646217_n.jpg?stp=dst-jpg_s206x206_tt6&_nc_cat=100&ccb=7-5&_nc_sid=30ff31&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy4xMDgwLkMzIn0%3D&_nc_ohc=0EZ-YASXuAgQ7kNvwE30Lfh&_nc_oc=Adp4ayqxKkWXujnAbj1AvjMfYDMUqfe_xSpZU9OsDm7zLk-Uf5sFgWe1aZ8jgUqczgA&_nc_zt=24&_nc_ht=scontent-fra5-1.cdninstagram.com&_nc_ss=70289&oh=00_AQOmlSi3iLcVEAZwtz3AL4HylpZtXrccQUly2LIMrYigzg&oe=6AC0C6ED",
    "profileUrl": "https://www.threads.com/@cristi.baluta",
    "isByPostAuthor": "No",
    "isLikedByPostAuthor": "No",
    "isPinnedByPostAuthor": "No",
    "mediaType": "Text",
    "hasMedia": "No",
    "imageUrls": [],
    "videoUrls": [],
    "mentions": [],
    "links": [],
    "topic": "N/A",
    "language": "Not Disclosed",
    "quotedPostUrl": "N/A",
    "isEdited": "No",
    "sortOrder": "TOP",
    "source": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX",
    "scrapedAt": "2026-09-29T01:10:19.921Z",
    "error": null
  },
  {
    "imageUrl": "https://scontent-fra5-1.cdninstagram.com/v/t51.82787-15/728772483_17976946917106359_4419315912946230678_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=110&ig_cache_key=MzkyNTI3MjM2MTc2Mzk3OTQwMA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNDQ3LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=3vP3jYdJbOsQ7kNvwGM5iFT&_nc_oc=Adr39Huefs8yQmOzUmLmQ5eNH7bJ98vWMHEH8dJG7CZ-VdlfqCZIcC9x2IZ5d8llYYA&_nc_zt=23&_nc_ht=scontent-fra5-1.cdninstagram.com&_nc_gid=xbtXlbWzbz8khNR5ZfPfcw&_nc_ss=70289&oh=00_AQNWhHWoms-lgCRnmYZ3yM_TYMBlCv1eRki88YSckED9rQ&oe=6AC0EED1",
    "postUrl": "https://www.threads.com/@kkareraisu/post/DZ5XmqBmcCI",
    "postCode": "DZ5XmqBmcCI",
    "postId": "3925272361763979400",
    "text": "icon ready youre welcome",
    "postedAt": "2026-06-22T17:22:31.000Z",
    "likeCount": 0,
    "replyCount": 0,
    "repostCount": 0,
    "quoteCount": 0,
    "reshareCount": "Not Disclosed",
    "depth": 1,
    "replyToUsername": "mosseri",
    "parentPostId": "3925258114057363671",
    "parentPostCode": "DZ5UXU0G-DX",
    "parentPostUrl": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX",
    "rootPostId": "3925258114057363671",
    "rootPostCode": "DZ5UXU0G-DX",
    "rootPostUrl": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX",
    "rootPostAuthor": "mosseri",
    "username": "kkareraisu",
    "authorId": "63245826358",
    "authorFullName": "成恩",
    "authorIsVerified": "No",
    "authorProfilePicUrl": "https://scontent-fra3-1.cdninstagram.com/v/t51.2885-19/358074380_1323672554896573_3174209065845170378_n.jpg?stp=dst-jpg_s206x206_tt6&_nc_cat=109&ccb=7-5&_nc_sid=30ff31&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy40NDcuQzMifQ%3D%3D&_nc_ohc=dpu8loDA0ZUQ7kNvwEK09Se&_nc_oc=Adp68dMARgfxfoiMA-KM7Wh55vD68exnm2lPbews4TQCMsWgD6ONmqyb4zcQIvGBkus&_nc_zt=24&_nc_ht=scontent-fra3-1.cdninstagram.com&_nc_ss=70289&oh=00_AQOs8d_FrXFAjdQYGFar4tHfMAep8cWQzcySZS5LW3cG7w&oe=6AC0EEAF",
    "profileUrl": "https://www.threads.com/@kkareraisu",
    "isByPostAuthor": "No",
    "isLikedByPostAuthor": "No",
    "isPinnedByPostAuthor": "No",
    "mediaType": "Image",
    "hasMedia": "Yes",
    "imageUrls": [
      "https://scontent-fra5-1.cdninstagram.com/v/t51.82787-15/728772483_17976946917106359_4419315912946230678_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=110&ig_cache_key=MzkyNTI3MjM2MTc2Mzk3OTQwMA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNDQ3LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=3vP3jYdJbOsQ7kNvwGM5iFT&_nc_oc=Adr39Huefs8yQmOzUmLmQ5eNH7bJ98vWMHEH8dJG7CZ-VdlfqCZIcC9x2IZ5d8llYYA&_nc_zt=23&_nc_ht=scontent-fra5-1.cdninstagram.com&_nc_gid=xbtXlbWzbz8khNR5ZfPfcw&_nc_ss=70289&oh=00_AQNWhHWoms-lgCRnmYZ3yM_TYMBlCv1eRki88YSckED9rQ&oe=6AC0EED1"
    ],
    "videoUrls": [],
    "mentions": [],
    "links": [],
    "topic": "N/A",
    "language": "Not Disclosed",
    "quotedPostUrl": "N/A",
    "isEdited": "No",
    "sortOrder": "TOP",
    "source": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX",
    "scrapedAt": "2026-09-29T01:10:22.315Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

- 🧾 **The whole conversation.** No 20-link or 300-reply ceiling: page through everything Threads shows, or cap it per post with **Max replies per post**.
- 🌳 **A real tree.** Depth, parent id, parent URL and the post you asked for on every row, so you can rebuild each sub-thread.
- 🆔 **Account ids included.** The numeric author id is on every row, so replies join cleanly with profile data and survive username changes.
- 🔗 **Chains with our other Threads Actor.** The `postUrl` column of Threads Search Scraper is valid input here, and the `username` of any replier can go into its **Threads usernames** input to read that account's latest posts.
- 🛑 **Fails loudly.** A run where nothing could be read ends as FAILED with the reason, never as a green run with an empty table. Error rows are never charged.
- ⚡ **Light and fast.** Plain HTTP, no browser, no login: about 700 replies a minute.

### 📈 How it compares to alternatives

| | This Actor | Typical Threads reply tools |
|---|---|---|
| Replies per post | ✅ Every public reply, optional per-post cap | Often capped (for example 300) |
| Post links per run | ✅ No limit, paste or link a list | Often capped (for example 20) |
| Nested replies with depth and parent | ✅ Up to 10 levels | Sometimes, without the tree |
| Numeric author id | ✅ | Often missing |
| Top or most recent order, date cutoff | ✅ | Rarely |
| Post author liked or pinned the reply | ✅ | Rarely |
| Replies hidden from logged-out visitors | ❌ Threads does not show them without an account | ❌ |
| View counts on replies | ❌ Threads does not publish them for replies | ❌ |

Honest ceilings: Threads hides some replies from logged-out visitors (restricted accounts, removed or limited replies). On one post that shows 455 replies, 355 top-level replies were public, and the log says when a post has hidden replies. Nested replies are collected as Threads exposes them: in our tests 52 of 54 announced sub-replies were returned.

### 🚀 How to use

1. Create a free Apify account with $5 of credit: [sign up here](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open Threads Replies Scraper and paste one or more post links into **Post URLs** (or upload a text file of links, or paste the `postUrl` column of a Threads Search Scraper export).
3. Set **Max Items**, and optionally **Max replies per post**, **Reply order**, **Include nested replies** and **Only replies posted after**.
4. Click **Start** and download the dataset as CSV, Excel, JSON or XML.

Example:

```json
{ "postUrls": [{ "url": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX" }], "maxItems": 1000, "includeNestedReplies": true, "maxReplyDepth": 4, "sortOrder": "TOP" }
```

### 💼 Business use cases

#### 📣 Campaign and launch feedback

Collect every reply under your launch post and your competitors' launch posts, then run sentiment and topic analysis on the text.

#### 🛡 Brand monitoring and crisis tracking

Schedule the Actor daily with **Most recent first** and **Only replies posted after** to capture only new replies under the posts you watch.

#### 👥 Audience research

See who answers a creator or a brand: verified accounts, repeat repliers and the replies the author liked or pinned.

#### 🧠 Conversation datasets

Export complete reply trees with depth and parent links for research on discussion structure, moderation or AI training data curation.

### 🔌 Automating Threads Replies Scraper

- **Make** and **Zapier**: run it on a schedule and push new replies into Google Sheets, Airtable or your CRM.
- **Slack**: post new replies to the posts you watch into a team channel.
- **Airbyte**: sync the dataset into BigQuery, Snowflake or Postgres.
- **GitHub Actions**: trigger runs from your data pipeline through the Apify API.
- **Google Drive**: save each run's CSV or Excel export to a shared folder.

### 🌟 Beyond business use cases

- 🎓 **Research:** study how conversations branch and which replies draw the most engagement.
- 🙋 **Personal:** archive the replies to your own posts.
- 🤝 **Non-profit:** understand how people respond to public health or civic posts.
- 🧪 **Experimentation:** build labelled comment datasets for classification experiments.

### 🤖 Ask an AI assistant about this scraper

Paste this page into ChatGPT, Claude or Gemini and ask things like "How do I get only the replies from the last 7 days under these 20 posts?" or "Which fields let me rebuild the reply tree?".

### ❓ Frequently Asked Questions

#### 🔑 Do I need a Threads or Instagram account?

No. The Actor reads only publicly available replies, the ones a logged-out visitor can open, and needs no login or cookie.

#### 🔗 Which links work?

Post links on threads.com or threads.net, in the forms `https://www.threads.com/@user/post/CODE` and `https://www.threads.com/t/CODE`, with or without extra parameters. A reply's own link works too and returns the replies to that reply.

#### 📚 How many replies can one post return?

Every reply Threads shows logged-out visitors. There is no built-in ceiling: set **Max replies per post** if you want one.

#### 🙈 Why do I get fewer replies than the post shows?

Threads counts replies it does not show logged-out visitors (restricted accounts, removed or limited replies). The log says when a post has hidden replies. In our tests about 78% of the announced top-level replies were public on a busy post.

#### 🌳 How do nested replies work?

Switch on **Include nested replies**. The Actor collects the direct replies first, then the replies under each of them, level by level up to **Max reply depth**. Every row has `depth`, `parentPostId`, `parentPostUrl` and `rootPostUrl`.

#### ↕️ What is the difference between Top and Most recent?

Top follows Threads' own ranking, the order a visitor sees. Most recent returns the newest replies first and, with **Only replies posted after**, stops as soon as it reaches older replies.

#### 👑 Are the post author's own follow-ups included?

Yes. When the author continues the thread or answers in the replies, those rows read `isByPostAuthor: Yes` so you can keep or drop them.

#### 🔄 Can I use the output of Threads Search Scraper?

Yes. Its `postUrl` column is valid input: paste the links here. In the other direction, Threads Search Scraper only takes usernames (without the @), so send it the `username` column from this Actor to read those accounts' latest posts.

#### 🧹 Are error rows or duplicates charged?

No. A reply is delivered once per run even if it appears under two of your posts, and error rows are never charged.

#### 🛑 What happens if a post is deleted or private?

That link gets an error row explaining why and the other links keep going. If no link could be read at all, the run ends as FAILED with the reason.

#### 🛡 Do I need a proxy?

No. Threads answers Apify's servers directly. You can switch the Apify proxy on for very large runs.

#### 🆓 What does a free account get?

Free accounts get a 10-reply preview per run. Paid accounts can collect up to 1,000,000 replies per run.

### 🔌 Integrate with any app

Use the Apify API, the JavaScript and Python clients, webhooks or the Make, Zapier and n8n integrations to send reply data wherever you work.

### ➡️ Next step

- [Threads Search Scraper](https://apify.com/parseforge/threads-search-scraper): give it usernames to get their latest posts, then feed the `postUrl` column here. Send it the `username` of any replier to read that account's posts.
- [Instagram Posts & Comments Scraper](https://apify.com/parseforge/instagram-scraper): the same conversation on Instagram.
- [X / Twitter Scraper](https://apify.com/parseforge/x-com-scraper): posts and replies on X.

### 🔗 Recommended Actors

- [Threads Search Scraper](https://apify.com/parseforge/threads-search-scraper)
- [Instagram Posts & Comments Scraper](https://apify.com/parseforge/instagram-scraper)
- [X / Twitter Scraper](https://apify.com/parseforge/x-com-scraper)
- [Bluesky Profile & Posts Scraper](https://apify.com/parseforge/bluesky-profile-posts-scraper)
- [Facebook Comments Scraper](https://apify.com/parseforge/facebook-comments-scraper)

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** this is an independent tool, not affiliated with Threads, Instagram or Meta. It collects only publicly available data.

# Actor input Schema

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

Threads post links. Accepts threads.com and threads.net in the forms https://www.threads.com/@user/post/CODE and https://www.threads.com/t/CODE. Paste them, upload a text file, or link a list: the postUrl column of Threads Search Scraper works as-is. No limit on the number of posts. A reply link works too and returns the replies to that reply.

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

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

Stop each post after this many replies, so one viral post does not use up the whole run. Leave empty or 0 for no per-post limit.

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

Top follows Threads' own ranking (what a visitor sees first). Most recent returns the newest replies first, which suits daily monitoring together with 'Only replies posted after'.

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

Also collect replies to replies (the whole conversation tree), each with its depth and parent post. Off = direct replies to the post only.

## `maxReplyDepth` (type: `integer`):

With nested replies on: how deep to follow a conversation. 2 = replies and the replies to them. Default 5, max 10.

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

Skip replies older than this date (YYYY-MM-DD). With 'Most recent first' the scraper stops paging once it reaches older replies.

## `proxyConfiguration` (type: `object`):

Apify Proxy. Threads answers logged-out requests without a proxy; switch it on for large runs or if you see repeated session errors.

## Actor input object example

```json
{
  "postUrls": [
    {
      "url": "https://www.threads.com/@zuck/post/DTa3-B1EbTp"
    },
    {
      "url": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX"
    }
  ],
  "maxItems": 10,
  "sortOrder": "TOP",
  "includeNestedReplies": false,
  "maxReplyDepth": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Replies with author, engagement and conversation links

## `fullData` (type: `string`):

Complete dataset with all 43 fields

# 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": [
        {
            "url": "https://www.threads.com/@zuck/post/DTa3-B1EbTp"
        },
        {
            "url": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX"
        }
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/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": [
        { "url": "https://www.threads.com/@zuck/post/DTa3-B1EbTp" },
        { "url": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX" },
    ],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/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": [
    {
      "url": "https://www.threads.com/@zuck/post/DTa3-B1EbTp"
    },
    {
      "url": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX"
    }
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parseforge/threads-replies-scraper --silent --output-dataset

```

## MCP server setup

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