# Threads Scraper – Profiles, Posts, Replies & Search (`pardoning_vacation/threads-scraper`) Actor

Scrape Meta Threads: profile info (followers, bio, links), posts with likes, replies, reposts and quotes, media, replies under any post, and keyword search. No login, no cookies.

- **URL**: https://apify.com/pardoning_vacation/threads-scraper.md
- **Developed by:** [Павел Тищенко](https://apify.com/pardoning_vacation) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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

### What does Threads Scraper do?

**Threads Scraper** extracts public data from Meta's **Threads** (threads.com):

- **Profiles** — username, full name, bio, **follower count**, verification, profile picture, bio links.
- **Posts** of any public profile — text, date, **likes, replies, reposts, quotes, shares**, images, videos and carousels, link previews, mentions, quoted and reposted posts. Goes back as far as you need.
- **Replies** under any post — with the same metrics, paginated.
- **Keyword search** — the top or most recent posts for any keyword or hashtag.

No login, no cookies, no Instagram account needed.

### Why use it?

- **Social listening & brand monitoring**: track what people say about your brand, product or competitors on Threads.
- **Influencer research**: compare creators by followers and engagement per post.
- **Content research**: find the best-performing posts in your niche and what drives replies and reposts.
- **Customer feedback & sentiment**: collect replies under announcements and analyse them with AI.
- **Datasets for AI**: clean post text with engagement metrics for LLMs, RAG and classifiers.

### How to use it

1. Add **profiles** (`zuck`, `@mosseri`, `https://www.threads.com/@natgeo`) and/or **post URLs** (`https://www.threads.com/@zuck/post/Ddt7cL5EfUG`) to **Profiles and posts**.
2. Optionally add **Search keywords** and pick Top or Recent.
3. Set **Max posts per profile** / **Max replies per post** and click **Start**.
4. Export JSON, CSV or Excel, or use the API, webhooks and integrations.

#### Input example

```json
{
  "startUrls": ["zuck", "https://www.threads.com/@natgeo", "https://www.threads.com/@zuck/post/Ddt7cL5EfUG"],
  "maxPostsPerProfile": 100,
  "includeReplies": true,
  "maxRepliesPerPost": 200,
  "searchQueries": ["apify"],
  "searchMode": "recent"
}
```

#### Output examples

Profile:

```json
{
  "type": "profile",
  "userId": "63055343223",
  "username": "zuck",
  "fullName": "Mark Zuckerberg",
  "url": "https://www.threads.com/@zuck",
  "biography": "Mostly superintelligence and MMA takes",
  "followerCount": 5745093,
  "isVerified": true,
  "isPrivate": false,
  "profilePicUrl": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-19/8253...",
  "bioLinks": []
}
```

Post:

```json
{
  "type": "post",
  "id": "3994109866205639942",
  "code": "Ddt7cL5EfUG",
  "url": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG",
  "username": "zuck",
  "userId": "63055343223",
  "userFullName": "Mark Zuckerberg",
  "userVerified": true,
  "userProfilePic": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-19/8253...",
  "text": "Agrippa said it's time to get back to work 😎",
  "createdAt": "2026-09-25T16:50:21.000Z",
  "likeCount": 5077,
  "replyCount": 524,
  "repostCount": 266,
  "quoteCount": 48,
  "shareCount": 142,
  "isReply": false,
  "replyToUsername": null,
  "mediaType": "carousel",
  "media": [
    {
      "type": "image",
      "url": "https://scontent-iad3-1.cdninstagram.com/v/t51.82787-15/8239..."
    }
  ],
  "linkPreview": null,
  "mentions": [],
  "links": [],
  "hashtags": [],
  "quotedPost": null,
  "repostedPost": null,
  "language": null,
  "isPaidPartnership": false,
  "source": "@zuck"
}
```

Reply (posts collected from a post URL carry `replyToCode`):

```json
{
  "type": "post",
  "id": "3994110101808162970",
  "code": "Ddt7fnUEyia",
  "url": "https://www.threads.com/@i_am_omerj/post/Ddt7fnUEyia",
  "username": "i_am_omerj",
  "userId": "63600513195",
  "userFullName": "Omar Faruk Jafree",
  "userVerified": true,
  "userProfilePic": "https://scontent-iad3-1.cdninstagram.com/v/t51.82787-19/7908...",
  "text": "💖💖💖",
  "createdAt": "2026-09-25T16:50:49.000Z",
  "likeCount": 4,
  "replyCount": 0,
  "repostCount": 0,
  "quoteCount": 0,
  "shareCount": null,
  "isReply": true,
  "replyToUsername": null,
  "mediaType": "text",
  "media": [],
  "linkPreview": null,
  "mentions": [],
  "links": [],
  "hashtags": [],
  "quotedPost": null,
  "repostedPost": null,
  "language": null,
  "isPaidPartnership": false,
  "source": "Ddt7cL5EfUG",
  "replyToCode": "Ddt7cL5EfUG"
}
```

### How much does it cost?

**Pay-per-event pricing**: a small fixed price per post (including replies) and per profile delivered — see the Pricing tab. Errors are free and platform usage is included.

### Limitations

- Only **public** profiles and posts are available. Private profiles return an error item.
- Search returns the posts Threads shows to logged-out visitors for the query (typically the top 20–25 per query and mode).
- Like counts can be hidden by the author.

### FAQ

**Do I need a Threads or Instagram account?** No.

**Is it legal?** The Actor only collects data that Threads shows publicly to anyone without logging in. You are responsible for using the data in line with applicable laws (e.g. GDPR) and platform terms.

**Need something else?** Open an issue in the Issues tab.

# Actor input Schema

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

Threads usernames (zuck, @zuck), profile URLs (https://www.threads.com/@zuck) or post URLs (https://www.threads.com/@zuck/post/Dd1MqfcG0aH). Profiles return the profile record and recent posts; post URLs return the post and its replies.

## `maxPostsPerProfile` (type: `integer`):

How many of the newest posts to collect from each profile.

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

For post URLs, also return the replies shown under the post.

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

Upper limit of replies per post URL.

## `searchQueries` (type: `array`):

Keywords or hashtags to search on Threads. Returns the posts Threads shows for each query.

## `searchMode` (type: `string`):

Top (most relevant) or most recent posts for search keywords.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.threads.com/@zuck"
  ],
  "maxPostsPerProfile": 20,
  "includeReplies": true,
  "maxRepliesPerPost": 20,
  "searchMode": "top"
}
```

# Actor output Schema

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

Main results table.

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

Every field of every result item.

# 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": [
        "https://www.threads.com/@zuck"
    ]
};

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

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

```

## MCP server setup

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