# Threads Scraper (`axlymxp/threads-scraper`) Actor

Scrape public Threads (threads.net) without login: profiles, posts, replies, reposts, media, keyword post & user search, and single-post threads. Full text, engagement counts, media URLs and bio links in clean JSON. Deep pagination, no proxy. Pay only for results.

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

## Pricing

from $3.00 / 1,000 dataset items

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?

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

Extract public data from **Threads** (threads.net / threads.com), Meta's text
social network — **no login, no cookies, no proxy**. Pull a user's posts, their
replies / reposts / media tabs, keyword post search, user search, and a single
post's thread, all as clean structured rows ready for analysis.

**Who it's for**

- **Analysts & researchers** — track a person or brand's posts and engagement,
  monitor keywords and topics over time.
- **Agencies & lead-gen** — find and qualify profiles by keyword: usernames, bio
  links, follower counts, verified status.
- **AI / dataset builders** — bulk public post text + engagement metrics for
  trend analysis and model training.

***

### What you get (output fields)

Every row is tagged `rowType` = `post` or `user`.

#### `post` rows

| Field | Description |
|---|---|
| `pk` / `code` | Numeric post id / shortcode |
| `url` | Canonical post URL |
| `takenAt` | Post time (epoch seconds) |
| `caption` | Full post text |
| `username` / `userId` / `userFullName` | Author handle, id, display name |
| `userIsVerified` / `userProfilePicUrl` | Author verified flag, avatar |
| `replyCount` / `repostCount` / `quoteCount` / `reshareCount` / `likeCount` | Engagement metrics |
| `isReply` / `replyControl` | Reply flag, who can reply |
| `imageUrl` / `videoUrl` / `hasAudio` | Media URLs / audio flag |
| `sourceQuery` | Which input produced the row |

#### `user` rows

| Field | Description |
|---|---|
| `pk` / `username` / `fullName` | Id, handle, display name |
| `biography` | Profile bio |
| `followerCount` | Follower count (profile-info mode) |
| `isVerified` / `isPrivate` | Status flags |
| `profilePicUrl` / `bioLinks` | Avatar, external links |
| `url` | Profile URL |

***

### Modes & use cases

| Mode | Input | Returns | Use case |
|---|---|---|---|
| **Profile posts** | `usernames`, `tab` | posts | Track a creator's output; competitor monitoring |
| **Profile info** | `usernames` | 1 user row/user | Enrich a list of handles with bio/followers/links |
| **Search posts** | `searchQueries`, `recent` | posts | Keyword & topic monitoring, trend capture |
| **Search users** | `searchQueries` | users | Discover creators/leads by keyword |
| **Post detail** | `postUrls`, `includeReplies` | post + replies | Pull a specific thread and its replies |

- **Profile posts** support all four tabs — **threads, replies, reposts, media** —
  with **deep pagination** (set `resultsPerProfile: 0` for everything available).
- **Lead generation**: run *Search users* on your niche keywords, then *Profile
  info* on the handles to get follower counts and bio links.
- **Brand monitoring**: run *Search posts* with `recent: true` on a schedule to
  capture every new mention chronologically.

***

### Input

```json
{
  "mode": "profile_posts",
  "usernames": ["zuck", "https://www.threads.com/@mosseri"],
  "tab": "threads",
  "resultsPerProfile": 0,
  "maxItems": 500
}
```

| Field | Type | Default | Notes |
|---|---|---|---|
| `mode` | string | `profile_posts` | `profile_posts`, `profile_info`, `search_posts`, `search_users`, `post_detail` |
| `usernames` | array | `[]` | @handles, usernames, or profile URLs |
| `tab` | string | `threads` | `threads`, `replies`, `reposts`, `media` |
| `searchQueries` | array | `[]` | keywords/phrases |
| `recent` | boolean | `false` | search posts chronologically |
| `postUrls` | array | `[]` | post URLs or shortcodes |
| `includeReplies` | boolean | `true` | include a post's first page of replies |
| `resultsPerProfile` | integer | `0` | per-profile cap (0 = all) |
| `maxItems` | integer | `200` | global row cap |

#### Example output (`post`)

```json
{
  "rowType": "post",
  "pk": "3977518562965884838",
  "code": "Dcy_A8pGo-m",
  "url": "https://www.threads.com/@zuck/post/Dcy_A8pGo-m",
  "takenAt": 1788377183,
  "caption": "Muse Spark 1.3 is rolling out today ...",
  "username": "zuck",
  "userFullName": "Mark Zuckerberg",
  "userIsVerified": true,
  "replyCount": 208,
  "repostCount": 151,
  "quoteCount": 28,
  "likeCount": 1478,
  "imageUrl": "https://scontent.cdninstagram.com/...",
  "sourceQuery": "profile:zuck"
}
```

***

### Scheduling & webhooks

Run it on a **schedule** (e.g. hourly keyword monitoring) from the Apify Console,
and attach a **webhook** to push new rows straight into your database, Google
Sheet, or Slack when a run finishes. Results export to **JSON, CSV, Excel, or via
the API**.

### Use with AI assistants (MCP)

This actor works as a tool for AI assistants through Apify's MCP server — an LLM
agent can call it to pull live Threads data (e.g. "get the latest posts from
@zuck" or "find Threads users posting about AI") as part of a larger workflow.

***

### FAQ

**Do I need a Threads or Instagram account?** No. The actor reads only public data
and requires no login, cookies, or tokens.

**How fresh is the data?** Live — every run hits Threads directly, so you get the
current state at run time.

**How deep can profile pagination go?** Profile feeds paginate without an
imposed limit — set `resultsPerProfile: 0` to fetch everything available for a
user.

**Are there limits on search?** Threads caps anonymous keyword *post* search at
roughly 20 results per query, and results vary between calls, so schedule
repeated runs to capture more. *User* search returns up to ~85 per query. Profile
feeds are not capped.

**Can I get replies to a post?** Yes, via *Post detail* — note that anonymous
access reaches the first page of replies for a given post.

**Is scraping Threads legal?** This actor collects only publicly available data.
You are responsible for using the output in line with Threads' terms and
applicable laws (e.g. GDPR/CCPA) in your jurisdiction.

**Something broke or a field is missing?** Threads changes its site periodically.
Open an issue on the actor and it will be fixed.

# Actor input Schema

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

Choose the scrape mode. Each mode uses the matching input fields below.

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

For 'Profile posts' / 'Profile info'. Accepts @handles, plain usernames, or full profile URLs.

## `tab` (type: `string`):

For 'Profile posts': which tab of the profile to scrape.

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

For 'Search posts' / 'Search users'. One or more keywords or phrases.

## `recent` (type: `boolean`):

For 'Search posts': rank chronologically (newest first) instead of by relevance.

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

For 'Post detail'. Accepts full post URLs or bare shortcodes (e.g. Dcy\_A8pGo-m).

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

For 'Post detail': also emit the first page of replies to the post. Note: anonymous access reaches only the first page of replies.

## `resultsPerProfile` (type: `integer`):

For 'Profile posts': cap posts per user. 0 = all available (deep pagination).

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

Global cap on the number of rows pushed to the dataset across all inputs.

## Actor input object example

```json
{
  "mode": "profile_posts",
  "usernames": [
    "zuck",
    "https://www.threads.com/@mosseri"
  ],
  "tab": "threads",
  "searchQueries": [
    "openai",
    "machine learning"
  ],
  "recent": false,
  "postUrls": [
    "https://www.threads.com/@zuck/post/Dcy_A8pGo-m"
  ],
  "includeReplies": true,
  "resultsPerProfile": 0,
  "maxItems": 200
}
```

# Actor output Schema

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

Posts and profiles scraped from Threads, one row each.

# 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 = {
    "usernames": [
        "zuck"
    ],
    "searchQueries": [
        "openai"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/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 = {
    "usernames": ["zuck"],
    "searchQueries": ["openai"],
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/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 '{
  "usernames": [
    "zuck"
  ],
  "searchQueries": [
    "openai"
  ]
}' |
apify call axlymxp/threads-scraper --silent --output-dataset

```

## MCP server setup

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