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

\[$3.00 / 1K] Scrape public Meta Threads posts, profiles, keyword search results, engagement metrics, media, hashtags, mentions, and timestamps without a Threads login.

- **URL**: https://apify.com/webdata\_labs/threads-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.56 / 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/platform/actors/running/actors-in-store#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

## Threads Scraper - Posts, Profiles & Search

**Extract public Meta Threads posts, profiles, and keyword search results without a Threads login.** Get clean structured rows for content monitoring, creator research, PR analysis, and data pipelines.

Use the Actor from Apify Console, schedule recurring runs, download JSON/CSV/Excel, or call it through the Apify API and MCP.

### ✅ What you get

- Public profile metadata with exact follower counts when Threads exposes them
- Public posts with full text, publication timestamps, and canonical URLs
- Likes, direct replies, reposts, and quote counts
- Images, videos, carousel items, dimensions, and video thumbnails
- Parsed hashtags, mentions, and absolute URLs
- Keyword search results with the source query attached to every row
- Consistent `profile` and `post` result types in one dataset

### 🔎 Why use this Threads scraper

Threads returns deeply nested, frequently changing web payloads. This Actor uses a browser to load the public page, then normalizes the structured data into stable fields. A recursive extractor tolerates changes in wrapper paths while keeping the buyer-facing schema consistent.

The result is ready for:

- Brand mention monitoring
- Competitor and executive account tracking
- Creator and influencer discovery
- Campaign and content research
- Academic NLP datasets built from public content
- Scheduled exports to Sheets, data warehouses, or webhooks

### 📊 What data you get

| Field | Type | Description |
|---|---|---|
| `type` | string | `profile` or `post` |
| `username` | string | Threads account username |
| `fullName` | string | Public display name |
| `followerCount` | number | Exact public follower count when available |
| `text` | string | Full public post text |
| `date` | string | ISO 8601 publication time |
| `likeCount` | number | Visible likes |
| `replyCount` | number | Visible direct replies |
| `repostCount` | number | Visible reposts |
| `quoteCount` | number | Visible quote posts |
| `media` | array | Normalized image/video attachments |
| `hashtags` | array | Hashtags parsed from the post text |
| `mentions` | array | Mentioned usernames |
| `url` | string | Canonical Threads profile or post URL |
| `sourceUsername` | string | Input username that produced the row |
| `searchQuery` | string | Input keyword that produced a search row |
| `scrapedAt` | string | ISO 8601 collection time |

### 👥 Who it's for

- Social media and brand teams monitoring public conversations
- PR agencies tracking spokespeople, journalists, and campaign mentions
- Researchers collecting public Threads data for analysis
- Data teams feeding dashboards, warehouses, and AI workflows
- Developers who need a simple Threads scraper API instead of maintaining browser extraction

### ⚙️ How to scrape Threads

1. Open the Actor in Apify Console.
2. Choose `Profiles`, `Profile posts`, or `Keyword search`.
3. Enter up to 20 usernames/profile URLs or up to 20 search queries.
4. Start with `maxPosts: 5` to check the output shape cheaply.
5. Run the Actor and inspect the dataset. Network routing is managed automatically.
6. Download results or connect a schedule, webhook, Make, Zapier, or API client.

### 📥 Input

Profile posts example:

```json
{
    "mode": "posts",
    "usernames": ["zuck", "mosseri"],
    "maxPosts": 20,
    "includeProfile": true,
    "maxScrolls": 4
}
```

Keyword search example:

```json
{
    "mode": "search",
    "searchQueries": ["artificial intelligence", "product launch"],
    "maxPosts": 20,
    "postedAfter": "2026-08-01T00:00:00Z"
}
```

| Input | Type | Default | Description |
|---|---|---:|---|
| `mode` | string | `posts` | `profile`, `posts`, or `search` |
| `usernames` | string\[] | `["zuck"]` | Usernames or profile URLs for profile/posts mode |
| `searchQueries` | string\[] | `["artificial intelligence"]` | Keywords for search mode |
| `maxPosts` | integer | `20` | Maximum post rows per username/query, 1 to 200 |
| `postedAfter` | string | - | Inclusive ISO 8601 lower date bound |
| `postedBefore` | string | - | Exclusive ISO 8601 upper date bound |
| `includeProfile` | boolean | `true` | Add one profile row in posts mode |
| `maxScrolls` | integer | `4` | Browser scroll attempts, 0 to 30 |

### 📤 Output

```json
{
    "type": "post",
    "postId": "3912345678901234567",
    "code": "ExampleCode1",
    "username": "exampleuser",
    "fullName": "Example Creator",
    "isVerified": true,
    "text": "A sample public post about a product launch.",
    "likeCount": 420,
    "replyCount": 35,
    "repostCount": 18,
    "quoteCount": 7,
    "mediaType": "image",
    "media": [
        {
            "type": "image",
            "url": "https://example.com/media.jpg",
            "thumbnailUrl": null,
            "width": 1080,
            "height": 1350
        }
    ],
    "hashtags": ["launch"],
    "mentions": [],
    "date": "2025-01-15T12:00:00.000Z",
    "url": "https://www.threads.com/@exampleuser/post/ExampleCode1",
    "sourceUsername": "exampleuser",
    "searchQuery": null,
    "scrapedAt": "2025-01-15T12:05:00.000Z"
}
```

Download the dataset as JSON, CSV, Excel, XML, RSS, or HTML, or read it through the Dataset API.

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

The Actor uses pay-per-result pricing with no separate Actor-start charge:

- Post result: **$3.00 per 1,000** on the Free tier
- Profile result: **$5.00 per 1,000** on the Free tier

A run with 20 posts and one profile costs about **$0.065** in event charges on the Free tier. Higher Apify plans can receive lower per-result prices. Set a maximum charge per run in Apify to enforce your own spending cap.

### 🔁 Run it on the Apify platform

Schedule daily competitor checks, send datasets to Google Sheets, trigger Slack/webhook alerts, or call the Actor from Node.js, Python, cURL, and MCP. Every row includes its input source so multi-seed runs remain easy to split downstream.

### ⚠️ Limits and caveats

- Threads controls how many results are visible to logged-out visitors. `maxPosts` is a ceiling, not a completeness guarantee.
- Search results are ranked by Threads and may not be exhaustive or chronological.
- Media CDN URLs can expire. Persist permitted assets promptly if your workflow needs long-term copies.
- Large jobs take longer because browser concurrency and request pacing are intentionally conservative.
- Meta can change its public web payloads without notice. Report a failed public URL in the Issues tab so the extractor can be updated.
- Only collect and use public data in accordance with applicable law, privacy rules, and Meta's terms.

### 🧩 Related Actors

- [Reddit Signal Scraper](https://apify.com/webdata_labs/reddit-signal-scraper) for community monitoring and public discussion signals
- [Bluesky Data API](https://apify.com/webdata_labs/bluesky-data-api) for public Bluesky posts and profiles
- [Website Change Intelligence API](https://apify.com/webdata_labs/website-change-intelligence-api) for monitoring competitor pages and announcements

Combine these sources into a broader brand-monitoring pipeline covering social posts, communities, and owned websites.

### ❓ FAQ

#### Does this Threads scraper require login?

No. It reads only data exposed on public Threads web pages without a Threads or Instagram account.

#### Can it scrape private accounts?

No. The Actor does not bypass privacy controls or login walls.

#### Why did I get fewer posts than `maxPosts`?

Threads may expose only a bounded set of public logged-out results. Date filters can reduce the set further. Try another public username, remove date filters, or rerun later if the site temporarily rate-limited the request.

#### Is this an official Threads API?

No. It is an independent public-web scraper running on Apify. It is not affiliated with or endorsed by Meta.

#### Can I monitor accounts automatically?

Yes. Create an Apify Task with your input, schedule it daily or weekly, and deliver each dataset through an integration or webhook. Deduplicate downstream by `postId`.

### 🛠️ Support

Open the Actor's Issues tab and include the run URL, sanitized input, public Threads URL, expected behavior, and actual behavior. Do not include account credentials or private personal data.

# Actor input Schema

## `mode` (type: `string`):

Choose profile metadata, public profile posts, or public keyword search results.

## `usernames` (type: `array`):

Threads usernames or profile URLs for profile and posts modes. Up to 20 per run.

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

Keywords to search across public Threads posts in search mode. Up to 20 per run.

## `maxPosts` (type: `integer`):

Maximum number of post rows returned for each username or search query. Public logged-out availability can be lower.

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

Optional ISO 8601 date or timestamp. Includes posts published at or after this value.

## `postedBefore` (type: `string`):

Optional ISO 8601 date or timestamp. Excludes posts published at or after this value.

## `includeProfile` (type: `boolean`):

Include one profile metadata row for each username when using posts mode.

## `maxScrolls` (type: `integer`):

Number of browser scroll attempts per page. Higher values may expose more public results but increase runtime.

## Actor input object example

```json
{
  "mode": "posts",
  "usernames": [
    "zuck"
  ],
  "searchQueries": [
    "artificial intelligence"
  ],
  "maxPosts": 5,
  "includeProfile": true,
  "maxScrolls": 2
}
```

# Actor output Schema

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

Dataset containing all extracted public Threads profiles and posts.

# 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 = {
    "mode": "posts",
    "usernames": [
        "zuck"
    ],
    "maxPosts": 5,
    "includeProfile": true,
    "maxScrolls": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/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 = {
    "mode": "posts",
    "usernames": ["zuck"],
    "maxPosts": 5,
    "includeProfile": True,
    "maxScrolls": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/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 '{
  "mode": "posts",
  "usernames": [
    "zuck"
  ],
  "maxPosts": 5,
  "includeProfile": true,
  "maxScrolls": 2
}' |
apify call webdata_labs/threads-scraper --silent --output-dataset

```

## MCP server setup

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