# Threads Posts Scraper - Posts & Replies (`parsebird/threads-posts-scraper`) Actor

Scrape Threads posts and their replies from post URLs. Get post text, likes, reply counts, images, videos, GIFs, text attachments, author info, and timestamps. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/threads-posts-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.69 / 1,000 threads posts

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 Posts Scraper - Posts & Replies

Threads Posts Scraper extracts public [Threads](https://www.threads.com) posts and their replies from post URLs, with post text, likes, reply counts, images, videos, GIFs, text attachments, author details, and publish time.

<table><tr>
<td style="border-left:4px solid #000000;padding:12px 16px;font-weight:600">
Paste threads.com or threads.net post links and get one clean record per post with up to 5,000 replies (including replies to replies shown in the conversation), 25 fields per post and reply, and no Threads login or API key.
</td>
</tr></table>

<br>

<table>
<tr>
<td colspan="3" style="padding:10px 14px;background:#000000;border:none;border-radius:4px 4px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">ParseBird Threads Suite</span>
<span style="color:#D6D3D1;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Posts, replies, profiles &amp; search</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-right:none;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/threads-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Threads Scraper</a><br>
<span style="color:#78716C;font-size:11px">Profiles, user posts &amp; search</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/threads-search-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Threads Search Scraper</a><br>
<span style="color:#78716C;font-size:11px">Search posts by keyword or hashtag</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:33%;background:#F5F5F4">
<a href="https://apify.com/parsebird/threads-posts-scraper" style="color:#000000;text-decoration:none;font-weight:700;font-size:13px">Threads Posts Scraper</a><br>
<span style="color:#000000;font-size:11px;font-weight:600">You are here</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 0 4px;border-right:none;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/threads-user-posts-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Threads User Posts Scraper</a><br>
<span style="color:#78716C;font-size:11px">Full profile post history</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 4px 0;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
</td>
</tr>
</table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Use Apify Actor parsebird/threads-posts-scraper to scrape public Threads posts and their replies. Example with ApifyClient (Python): client.actor("parsebird/threads-posts-scraper").call(run_input={"startUrls":[{"url":"https://www.threads.com/@openai/post/DW7RXR7EnRC"}],"includeReplies":True,"maxReplies":12}). Inputs: startUrls array of {url} required (threads.com or threads.net post links like https://www.threads.com/@user/post/CODE, or short https://www.threads.com/t/CODE links; duplicates processed once); includeReplies boolean default true; maxReplies integer default 12 (0-5000, per post URL, includes replies to replies); proxyConfiguration object default {"useApifyProxy": false} (optional; failed posts are retried once through Apify Proxy automatically). Output: one dataset item per post URL with {thread, replies[]}. Every post and reply has: text, attachment_text, published_on (Unix seconds), id, pk, code, username, user_full_name, user_pic, user_verified, user_pk, user_id, has_audio, reply_count, like_count, repost_count, quote_count, images[], image_count, videos[], has_gif, gif_description, link_url, url. Pricing: pay per result, the post and each reply count as one result each. API docs: https://docs.apify.com/api/client/python/ and https://docs.apify.com/api/client/js/. Token: https://console.apify.com/account/integrations.
```

### What is Threads Posts Scraper?

**Threads Posts Scraper** is a **Threads post scraper and API alternative** that turns links to public [Threads](https://www.threads.com) posts into structured data. For every post you get the **full post text**, **like, reply, repost, and quote counts**, **image and video URLs**, **GIF descriptions**, **text attachments**, the **author's username, profile picture, and verified badge**, and the **publish timestamp**, plus the **replies** to that post with the same fields.

You don't need a Threads or Instagram account, cookies, or a Meta API key. The easiest way to try it is to open the actor, keep the prefilled OpenAI post, and click **Start**. A post with 12 replies takes a few seconds.

### What can Threads Posts Scraper do?

- 🧵 **Scrape any public Threads post** from its URL: threads.com, threads.net, and short `/t/` links all work.
- 💬 **Scrape Threads replies**: collect up to 5,000 replies per post, including replies to replies shown in the conversation, in the order Threads ranks them.
- 🖼️ **Get media links**: image URLs (including every carousel item), video URLs with an audio flag, and GIF descriptions.
- 📝 **Read text attachments**: posts with a long-form text attachment return that text in `attachment_text`.
- 🔗 **Get shared links**: the destination URL of a link preview, unwrapped from Threads' redirect.
- 👤 **Know who posted**: username, display name, profile picture, verified badge, and numeric user ID for the author of every post and reply.
- ⏱️ **Automate** with [Apify schedules](https://docs.apify.com/platform/schedules), the [Apify API](https://docs.apify.com/api/v2), webhooks, and [integrations](https://apify.com/integrations) such as Google Sheets, Make, Zapier, and Slack.
- 📁 **Export** results as JSON, CSV, Excel, HTML, or XML.

### What data can you extract from Threads?

Each dataset item holds a `thread` object for the post and a `replies` array. Every post and reply has these fields:

| Field | Description |
|-------|-------------|
| `text` | The post text. Posts whose whole body is a text attachment return that text here |
| `attachment_text` | Text of an attachment Threads shows as a collapsed snippet, or `null` |
| `published_on` | Publish time as a Unix timestamp in seconds |
| `id`, `pk`, `code` | Full post ID, numeric post ID, and the shortcode used in the post URL |
| `username`, `user_full_name`, `user_pic`, `user_verified` | Author username, display name, profile picture URL, and verified badge |
| `user_pk`, `user_id` | Author's numeric user ID |
| `like_count`, `reply_count`, `repost_count`, `quote_count` | Likes, direct replies, reposts, and quotes |
| `images`, `image_count` | Image URLs attached to the post, including carousel items |
| `videos`, `has_audio` | Video URLs, and whether the video has audio |
| `has_gif`, `gif_description` | Whether the post is a GIF, and the GIF's description such as "Warning I Told You GIF by Holly Logan" |
| `link_url` | Destination URL of a shared link, or `null` |
| `url` | Link to the post on threads.com |

### How to scrape Threads posts and replies

1. Open [Threads Posts Scraper](https://apify.com/parsebird/threads-posts-scraper) and click **Try for free** or **Start**.
2. In **Threads post URLs**, add one or more post links. Copy a link on Threads with **Share → Copy link**, or copy it from the browser address bar.
3. Keep **Include replies** on to get replies, or turn it off to get only the posts.
4. Set **Max replies per post**. The default of 12 keeps the first run cheap.
5. Click **Start**.
6. Open the **Output** tab, or export the results as JSON, CSV, or Excel.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | array | **Yes** | — | Threads post URLs, for example `https://www.threads.com/@openai/post/DW7RXR7EnRC`. threads.net and `/t/CODE` links also work. One dataset item is produced per URL |
| `includeReplies` | boolean | No | `true` | Return the replies to each post. Set to `false` to get only the post |
| `maxReplies` | integer | No | `12` | Most replies to return per post URL (0–5,000), including replies to replies. Each reply is billed as one result |
| `proxyConfiguration` | object | No | `{"useApifyProxy": false}` | Optional proxy. Runs work without one, and a post that fails to load is retried once through Apify Proxy automatically |

Example input:

```json
{
  "startUrls": [
    { "url": "https://www.threads.com/@openai/post/DW7RXR7EnRC" }
  ],
  "includeReplies": true,
  "maxReplies": 12
}
```

### Output example

A real item from a run on the example input, with URL query strings removed and the replies list shortened to one entry:

```json
{
  "thread": {
    "text": "There’s a new Pro tier in town. \n\nTo celebrate the launch, we’re increasing Codex usage for a limited time through May 31st so that Pro $100 subscribers get up to 10x usage of ChatGPT Plus on Codex to build your most ambitious ideas.\n\nOur existing $200 Pro tier still remains our highest usage option. And as a thank you to our existing Pro users on the $200 tier, we’re extending our 2x Codex usage promo (until May 31st) and we’ve reset your Codex rate limits (yes, again).",
    "attachment_text": null,
    "published_on": 1775770338,
    "id": "3871764671238403138_63299409527",
    "pk": "3871764671238403138",
    "code": "DW7RXR7EnRC",
    "username": "openai",
    "user_full_name": "OpenAI",
    "user_pic": "https://scontent.cdninstagram.com/v/t51.82787-19/788716177_18115256264517701_8401817653356104064_n.jpg",
    "user_verified": true,
    "user_pk": "63299409527",
    "user_id": "63299409527",
    "has_audio": null,
    "reply_count": 28,
    "like_count": 217,
    "repost_count": 23,
    "quote_count": 8,
    "images": [
      "https://scontent.cdninstagram.com/v/t51.82787-15/661617063_18096549797517701_8389667311012176678_n.jpg"
    ],
    "image_count": 1,
    "videos": [],
    "has_gif": false,
    "gif_description": null,
    "link_url": null,
    "url": "https://www.threads.com/@openai/post/DW7RXR7EnRC"
  },
  "replies": [
    {
      "text": "Aw shit MIGHT have to downgrade Claude for that 10x plus. @openai help convince me haha. Make it irrefutable",
      "attachment_text": null,
      "published_on": 1775770627,
      "id": "3871767105461481006_76614717151",
      "pk": "3871767105461481006",
      "code": "DW7R6s-Eu4u",
      "username": "griffinlong.dev",
      "user_full_name": "Griffin Long",
      "user_pic": "https://scontent.cdninstagram.com/v/t51.82787-19/790319655_17943256095321890_5618796657983618003_n.jpg",
      "user_verified": true,
      "user_pk": "76614717151",
      "user_id": "76614717151",
      "has_audio": null,
      "reply_count": 0,
      "like_count": 5,
      "repost_count": 0,
      "quote_count": 0,
      "images": [],
      "image_count": 0,
      "videos": [],
      "has_gif": false,
      "gif_description": null,
      "link_url": null,
      "url": "https://www.threads.com/@griffinlong.dev/post/DW7R6s-Eu4u"
    }
  ]
}
```

Download the dataset in JSON, CSV, Excel, HTML, or XML from the **Output** tab or through the API.

### Use cases

- **Social listening**: track what people say under brand, competitor, or creator posts.
- **Customer feedback**: collect replies to product launch and announcement posts for sentiment analysis.
- **Campaign reporting**: record likes, replies, reposts, and quotes for a list of campaign posts on a schedule.
- **Influencer research**: check engagement and audience reactions on creator posts before a partnership.
- **AI and research datasets**: build conversation datasets of posts and replies for NLP or LLM work.
- **Content archiving**: keep a copy of post text, media links, and replies for compliance or moderation reviews.

### How it works

1. The actor reads each Threads post URL and pulls out the post shortcode, so threads.com, threads.net, and `/t/` links all resolve to the same post. Duplicate URLs are processed once.
2. It loads the public post page the same way a logged-out visitor sees it and reads the post and the first replies.
3. If you asked for more replies, it pages through the remaining public replies until it reaches `maxReplies` or the end of the conversation.
4. Each post and reply is converted into the same flat set of fields and saved as one dataset item per URL.
5. Failed requests are retried with a fresh connection, and the last retry goes through Apify Proxy. Posts that don't exist, were deleted, or aren't public are logged and skipped, and you are not charged for them.

### How much does it cost to scrape Threads posts?

Threads Posts Scraper uses pay-per-event pricing. You pay for each result: the post counts as one result and each reply counts as one result.

| Event | Apify plan | Price per result | Price per 1,000 results |
|-------|-----------|------------------|-------------------------|
| post-scraped | Free | $0.00199 | **$1.99** |
| post-scraped | Bronze | $0.00189 | **$1.89** |
| post-scraped | Silver | $0.00179 | **$1.79** |
| post-scraped | Gold | $0.00169 | **$1.69** |

For example, on the Free plan, 100 posts with 12 replies each is 1,300 results, which costs about $2.59. A run that returns only posts (`includeReplies` off) costs $1.99 per 1,000 posts. Apify's free monthly platform credits can be used for these runs, and you can set a maximum cost per run in the run options; the actor stops when it reaches that limit.

### FAQ

**Can I scrape Threads without logging in?**
Yes. Threads Posts Scraper only reads what Threads shows to logged-out visitors, so you don't need a Threads or Instagram account, cookies, or a Meta API key.

**Why is `reply_count` higher than the number of replies I get?**
`reply_count` is the total Threads reports for the post. Some of those replies are hidden, restricted, or removed and are not shown to logged-out visitors, so the actor can only return the replies Threads makes public. For example, the OpenAI post in the example reports 28 replies, and 21 replies are public.

**Does it include replies to replies?**
Yes. When Threads shows a reply's own replies inline in the conversation, they are included in `replies` and count toward `maxReplies`.

**Can I get the GIF file?**
No. Threads does not serve the GIF file to logged-out visitors, so `has_gif` and `gif_description` tell you a GIF is there and what it shows, but no GIF URL is returned.

**What happens with deleted or private posts?**
They are skipped and logged as unavailable, and they are not charged. If none of the URLs can be scraped, the run ends as failed with a message explaining why.

**How long do image and video links work?**
Media URLs come from Meta's CDN and include signed query parameters that expire after some time. Download the files soon after the run if you need to keep them.

**Can I scrape a Threads profile or search Threads by keyword?**
Use [Threads Scraper](https://apify.com/parsebird/threads-scraper) for profiles and user posts, or [Threads Search Scraper](https://apify.com/parsebird/threads-search-scraper) to search posts by keyword or hashtag. Then pass the post URLs you want into this actor to get their replies.

**How do I call it from Python?**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/threads-posts-scraper").call(run_input={
    "startUrls": [{"url": "https://www.threads.com/@openai/post/DW7RXR7EnRC"}],
    "includeReplies": True,
    "maxReplies": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["thread"]["like_count"], len(item["replies"]))
```

**How do I call it from JavaScript?**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/threads-posts-scraper').call({
    startUrls: [{ url: 'https://www.threads.com/@openai/post/DW7RXR7EnRC' }],
    includeReplies: true,
    maxReplies: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => console.log(item.thread.like_count, item.replies.length));
```

See the [Python client docs](https://docs.apify.com/api/client/python/), the [JavaScript client docs](https://docs.apify.com/api/client/js/), or the actor's **API** tab for HTTP endpoints.

**Can I run it on a schedule or send results to other tools?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules) to re-scrape posts daily or weekly, and [integrations](https://apify.com/integrations) or webhooks to send results to Google Sheets, Slack, Make, Zapier, or your own API.

**Something isn't working. What should I do?**
Open an issue in the **Issues** tab with the post URL and run link, and we'll look into it.

### Is it legal to scrape Threads?

Threads Posts Scraper only collects data that Threads shows publicly to logged-out visitors. It does not access private accounts or data behind a login. Results can still include personal data such as usernames and profile pictures, which may be protected by the GDPR in the EU and by other regulations elsewhere. Don't scrape personal data unless you have a legitimate reason, and check the [Threads Terms of Use](https://help.instagram.com/769983657850450) for your use case. If you're unsure, consult a lawyer. Read more in Apify's post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other Threads and social media scrapers

| Actor | What it does |
|-------|--------------|
| [Threads Scraper](https://apify.com/parsebird/threads-scraper) | Scrape Threads profiles, user posts, and keyword search results |
| [Threads Search Scraper](https://apify.com/parsebird/threads-search-scraper) | Search public Threads posts by keyword or hashtag |
| [Instagram Reels Search & Trend Discovery](https://apify.com/parsebird/instagram-reels-search-scraper) | Find Instagram Reels by keyword with engagement data |
| [Twitter (X) Video Downloader](https://apify.com/parsebird/twitter-video-downloader) | Get MP4 download links and tweet details from X posts |

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/threads-posts-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Add links to public Threads posts, such as https://www.threads.com/@openai/post/DW7RXR7EnRC. threads.net links and short /t/ links also work. Each URL produces one dataset item.

## `includeReplies` (type: `boolean`):

Return the replies to each post. Turn off to get only the post itself.

## `maxReplies` (type: `integer`):

Maximum replies to return for each post URL, including replies to replies shown in the conversation. Each reply is billed as one result.

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

Optional proxy for reaching Threads. Runs work without a proxy; if a post fails to load, the actor retries it once through Apify Proxy automatically. Enable a proxy here only if many posts keep failing.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.threads.com/@openai/post/DW7RXR7EnRC"
    }
  ],
  "includeReplies": true,
  "maxReplies": 12,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.threads.com/@openai/post/DW7RXR7EnRC"
        }
    ],
    "includeReplies": true,
    "maxReplies": 12,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/threads-posts-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 = {
    "startUrls": [{ "url": "https://www.threads.com/@openai/post/DW7RXR7EnRC" }],
    "includeReplies": True,
    "maxReplies": 12,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/threads-posts-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 '{
  "startUrls": [
    {
      "url": "https://www.threads.com/@openai/post/DW7RXR7EnRC"
    }
  ],
  "includeReplies": true,
  "maxReplies": 12,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/threads-posts-scraper --silent --output-dataset

```

## MCP server setup

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