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

Posts, replies, reposts, profiles, keyword and hashtag search, whole threads with replies and account discovery on Meta Threads. Every post with text, media, links, mentions and engagement. No login.

- **URL**: https://apify.com/lergassy/threads-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Social media, Agents, MCP servers
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.40 / 1,000 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?

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** turns Meta's Threads into rows: an account's posts as far back as you want, its replies and reposts, its profile with follower count, bio links and contacts, public posts for any keyword or hashtag, a whole thread with its replies, and people or brands that match a keyword. Every post comes with text, time, author, likes, replies, reposts, quotes and shares, image and video URLs, links, mentions and hashtags, the quoted or reposted post, the reply context and the link preview. No login, no cookies, no browser: an account's last 100 posts take about four requests and a few seconds.

![One run of Threads Scraper: an account’s posts with text, engagement and dates, no login.](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/threads-scraper/threads-scraper-output-table.png)

Pick what you need, paste usernames, keywords or URLs, and click Start. Export as JSON, CSV or Excel, run it on a schedule, or call it from the API and AI agents.

### What is Threads Scraper?

It is a **Threads API** for people who need the network as data rather than as a feed: social listening and brand monitoring, creator and influencer research, lead generation from bios, content archiving, academic research, and AI agents asked "what is this account posting about" or "what are people saying about X". Threads has an official API only for your own account; this Actor reads the public pages Threads serves to any visitor, so it works for any public account and any public post.

Seven modes in one Actor, all with the same row shape:

| Mode | You give | You get |
|---|---|---|
| **Posts** | usernames | the account's own posts, paged through the whole profile (hundreds or thousands) |
| **Replies** | usernames | replies the account wrote, each with the post it answered |
| **Reposts** | usernames | posts the account reposted |
| **Profile** | usernames | followers, full name, bio, bio links, emails and phones in the bio, verification, latest post |
| **Search** | keywords, #hashtags | public posts from the top, recent and tag result pages, deduplicated |
| **Thread** | post URLs | the post (with its self-thread) and its replies |
| **Accounts** | keywords | people and brands matching the keyword, optionally with full profile details |

### What data does it return?

#### Post rows

| Field | Example |
|---|---|
| `id`, `code`, `url` | 3977518562965884838 · Dcy\_A8pGo-m · https://www.threads.net/@zuck/post/Dcy\_A8pGo-m |
| `text`, `language` | "Muse Spark 1.3 is rolling out today…" · en |
| `createdAt`, `timestamp` | 2026-09-02T19:26:23.000Z · 1788377183 |
| `username`, `userId`, `fullName`, `isVerified`, `profilePicUrl`, `profileUrl` | zuck · 63055343223 · Mark Zuckerberg · true · … |
| `likeCount`, `replyCount`, `repostCount`, `quoteCount`, `shareCount`, `viewCount` | 1453 · 196 · 148 · 28 · 78 · null |
| `mediaType`, `imageUrl`, `videoUrl`, `images[]`, `videos[]`, `hasAudio`, `accessibilityCaption` | carousel · … · \[{url,width,height,alt}] · \[{url,thumbnail,hasAudio}] |
| `hashtags`, `mentions`, `urls`, `linkPreview` | \["ai"] · \["natgeo"] · \["https://…"] · {url, displayUrl, title, imageUrl, faviconUrl} |
| `isReply`, `replyToUsername`, `replyToUserId`, `rootPostUsername`, `replyControl` | true · zuck · … · everyone |
| `isQuote`, `quotedPost`, `isRepost`, `repostedPost`, `repostedBy` | {code, username, url, text, likeCount} |
| `isPinned`, `isEdited`, `isPaidPartnership`, `isSpoiler`, `likesHidden`, `location` | booleans, place name |
| `threadId`, `positionInThread`, `threadLength` | a multi-post thread keeps its order |
| `source`, `query`, `sourceUsername`, `parentPostId`, `parentPostUrl` | posts · search-top · search-recent · search-tag · thread · reply · replies · reply-context · reposts |

#### Profile and account rows

`username`, `userId`, `fullName`, `biography`, `bioLinks`, `websiteUrl`, `emails`, `phones` (extracted from the bio), `followerCount`, `isVerified`, `isPrivate`, `profilePicUrl` (HD), `profileUrl`, `instagramUrl`, `latestPostAt`, `latestPostUrl`, `latestPostText` (Profile mode), `query` (Accounts mode).

### How much does it cost?

Pricing is **pay per row**. There is no browser in this Actor, so platform usage is close to zero; error rows are free.

| Row | Price |
|---|---|
| Post (any mode, replies included) | $0.002 — 1,000 posts for $2 |
| Profile (Profile mode, `includeProfile`, Accounts with details) | $0.004 |
| Account match without details | $0.002 |

An account's last 1,000 posts cost $2 and about 40 requests. Larger monthly plans get 10–30 % off.

### How to scrape Threads

1. Choose **What to get**.
2. Paste **Usernames** (posts, replies, reposts, profile), **Keywords** (search, accounts) or **Post URLs** (thread). Any Threads URL pasted into **Any Threads URLs** is routed by itself.
3. Set **Posts per account or keyword**, and optionally **Only posts after** a date or **Keep only posts containing** words.
4. Click **Start**; export, or read the dataset through the API.

### ⬇️ Input

```json
{
  "mode": "posts",
  "usernames": ["zuck", "natgeo"],
  "maxPosts": 200,
  "includeProfile": true
}
```

#### Monitor keywords and hashtags

```json
{ "mode": "search", "keywords": ["AI agents", "#nba", "apify"], "maxPosts": 100, "searchTypes": ["top", "recent", "tags"] }
```

#### A post with its replies

```json
{ "mode": "thread", "postUrls": ["https://www.threads.net/@zuck/post/Dcy_A8pGo-m"], "maxRepliesPerPost": 100 }
```

#### Find accounts and their contacts

```json
{ "mode": "users", "keywords": ["coffee roaster brooklyn", "specialty coffee"], "maxUsersPerKeyword": 20, "includeProfileDetails": true }
```

#### Posts since a date, about a topic

```json
{ "mode": "posts", "usernames": ["nasa"], "maxPosts": 500, "postedAfter": "2026-06-01", "filterKeywords": ["artemis", "moon"] }
```

### ⬆️ Output

```json
{
  "type": "post",
  "id": "3977518562965884838",
  "code": "Dcy_A8pGo-m",
  "url": "https://www.threads.net/@zuck/post/Dcy_A8pGo-m",
  "text": "Muse Spark 1.3 is rolling out today with frontier performance almost too cheap to meter…",
  "createdAt": "2026-09-02T19:26:23.000Z",
  "timestamp": 1788377183,
  "username": "zuck",
  "userId": "63055343223",
  "fullName": "Mark Zuckerberg",
  "isVerified": true,
  "likeCount": 1453,
  "replyCount": 196,
  "repostCount": 148,
  "quoteCount": 28,
  "shareCount": 78,
  "mediaType": "image",
  "imageUrl": "https://instagram.fdps8-1.fna.fbcdn.net/v/t51.82787-15/….webp",
  "images": [{ "url": "…", "width": 1080, "height": 970, "alt": null }],
  "videos": [],
  "hashtags": [],
  "mentions": [],
  "urls": [],
  "linkPreview": null,
  "isReply": false,
  "isQuote": false,
  "isRepost": false,
  "isPinned": false,
  "threadId": "3977518562965884838",
  "positionInThread": 0,
  "threadLength": 1,
  "source": "posts",
  "sourceUsername": "zuck",
  "scrapedAt": "2026-09-06T10:05:12.000Z"
}
```

Profile rows have `type: "profile"`. An account or post that cannot be read arrives as a `type: "error"` row with the reason (`profile not found`, `post not found or unavailable`, rate limit), never as a silently missing item.

### Use cases

#### Social listening

Search keywords and hashtags on a schedule, keep the rows, and watch `likeCount`, `replyCount` and new authors over time.

#### Creator and competitor research

Pull an account's whole history with Posts mode and its profile; compare posting cadence, media mix (`mediaType`), best-performing posts and who they reply to.

#### Lead generation

Accounts mode with a niche keyword returns matching profiles with `emails`, `phones` and `websiteUrl` taken from public bios.

#### Archiving and research

Posts mode with `postedAfter` builds a dated corpus with `language`, media and links for every post.

#### AI agents

An agent asked "what did @nasa post this week" or "what are people saying about X on Threads" gets typed rows it can summarise.

### Integrations and Threads API

Run it from the [Apify API](https://docs.apify.com/api/v2), the JavaScript and Python clients, a schedule, or a webhook, and push results to Google Sheets, Slack, Discord, Notion or a database through **n8n**, **Make** or **Zapier**. The [Apify MCP server](https://mcp.apify.com) exposes it to Claude, ChatGPT and other agents as a tool.

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the Apify MCP server or the Apify API (`lergassy/threads-scraper`).

**Purpose:** read public Threads content — an account's posts, replies or reposts, its profile, posts matching a keyword or hashtag, a post with its replies, or accounts matching a keyword.

**Minimal inputs:**

```json
{ "mode": "posts", "usernames": ["zuck"], "maxPosts": 50 }
{ "mode": "search", "keywords": ["#nba"], "maxPosts": 50 }
{ "mode": "thread", "postUrls": ["https://www.threads.net/@zuck/post/Dcy_A8pGo-m"] }
{ "mode": "profile", "usernames": ["natgeo"] }
{ "mode": "users", "keywords": ["coffee roaster"] }
```

**Output:** rows with `type` = `post`, `profile` or `error`. Post rows: `url`, `text`, `createdAt`, `username`, `fullName`, `likeCount`, `replyCount`, `repostCount`, `quoteCount`, `shareCount`, `mediaType`, `imageUrl`, `videoUrl`, `hashtags`, `mentions`, `urls`, `linkPreview`, `isReply`, `replyToUsername`, `isQuote`, `quotedPost`, `isRepost`, `repostedPost`, `threadId`, `positionInThread`, `source`, `query`. Profile rows: `username`, `fullName`, `biography`, `bioLinks`, `emails`, `phones`, `followerCount`, `isVerified`, `profileUrl`.

**Behaviors an agent should know:**

- Posts mode pages through the profile until `maxPosts` or `postedAfter`; a multi-post thread yields one row per post with `positionInThread`.
- Search, Replies, Reposts and Thread read what Threads shows a logged-out visitor: roughly 20 posts per result page (top, recent, tag), the first ~25 replies of a post and the latest replies/reposts of an account. `maxPosts` is a cap, not a promise.
- Search matches keywords the way Threads does (not exact phrase); use `filterKeywords` for a strict filter.
- `source` says where a row came from; in Replies mode `reply-context` rows are the posts being answered, `replies` rows are the account's own replies.
- Counts are numbers; missing counts (hidden likes, no view count) are null. `timestamp` is Unix seconds, `createdAt` ISO 8601 UTC.
- Usernames are accepted bare, with @ or as URLs. Private accounts and deleted posts return an `error` row.
- A datacenter proxy is on by default and is enough; switch to Residential only if rate-limit errors appear.

### ❓ FAQ

#### Do I need a Threads account or cookies?

No. The Actor reads public pages only and never logs in, so there is no account to get banned.

#### How many posts can I get from one account?

All of them, subject to `maxPosts` — Posts mode uses the same pagination the site uses when you scroll.

#### Why does Search return fewer posts than I asked for?

Threads shows a logged-out visitor one page of results per keyword. The Actor combines the top, recent and tag pages and removes duplicates, which usually gives 20–60 posts per keyword. Use several related keywords for more.

#### Can I get followers or following lists?

Not without a login; Threads does not expose them publicly. Follower counts are included in profile rows.

#### Is it legal?

The Actor reads publicly available content that Threads serves to anyone and does not bypass logins. Whether you may store or reuse it depends on your purpose and jurisdiction; respect people's privacy and Meta's terms. This is not legal advice.

#### Can I use it with the Apify API or an MCP server?

Yes. The Actor is pay-per-event with limited permissions, so agents can run it through the Apify MCP server without extra setup.

### Your feedback

Missing a field or a mode? Open an issue in the **Issues** tab and it will be looked at within a day.

### You might also like

- [Sports Scores & Schedules API](https://apify.com/lergassy/sports-scores-api) — scores, schedules and standings for 33 leagues.
- [Booking.com Hotels Scraper](https://apify.com/lergassy/booking-hotels-scraper) — hotels, rooms, rates, reviews and price calendars.
- [Website Contacts API](https://apify.com/lergassy/website-contacts-api) — emails, phones and social links from any website.

# Actor input Schema

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

<b>Posts</b> — an account's own posts, as many as you ask for. <b>Replies</b> / <b>Reposts</b> — what an account answered or boosted. <b>Profile</b> — followers, bio, links and contacts. <b>Search</b> — public posts for keywords and hashtags. <b>Thread</b> — one post with its replies. <b>Accounts</b> — people and brands matching a keyword.

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

For Posts, Replies, Reposts and Profile. Bare name, with @, or the profile URL: <code>zuck</code>, <code>@natgeo</code>, <code>https://www.threads.net/@nasa</code>.

## `keywords` (type: `array`):

For Search and Accounts. <code>AI agents</code>, <code>#nba</code>, <code>coffee roaster brooklyn</code>. The # is optional.

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

For Thread mode: <code>https://www.threads.net/@zuck/post/Dcy\_A8pGo-m</code>. In Posts mode these are fetched too.

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

Profile, post, search or tag URLs — each is routed to the matching job automatically.

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

Cap per username or keyword, not per run. Posts mode pages through the whole profile; Search returns what Threads shows a logged-out visitor (usually 20–60 posts per keyword across the top, recent and tag pages).

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

Threads shows a logged-out visitor the first ~25 replies of a post.

## `searchTypes` (type: `array`):

Search mode: which result pages to combine. Duplicates are removed.

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

<code>YYYY-MM-DD</code>. Older posts are dropped and Posts mode stops paging once it reaches them.

## `filterKeywords` (type: `array`):

Case-insensitive words or phrases; a post is kept when it contains any of them. Empty = keep everything.

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

Posts, Replies and Reposts modes: also save the account's profile (followers, bio, links, contacts).

## `includeProfileDetails` (type: `boolean`):

Accounts mode: open each account's page for follower count, bio links and contacts (one extra request per account).

## `maxUsersPerKeyword` (type: `integer`):

Accounts mode.

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

Stop after this many rows in the run.

## `concurrency` (type: `integer`):

How many accounts or keywords are processed at once.

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

Apify datacenter proxies work for Threads. If runs end with rate-limit error rows, switch to Residential.

## Actor input object example

```json
{
  "mode": "posts",
  "usernames": [
    "zuck"
  ],
  "maxPosts": 100,
  "maxRepliesPerPost": 100,
  "searchTypes": [
    "top",
    "recent",
    "tags"
  ],
  "includeProfile": false,
  "includeProfileDetails": true,
  "maxUsersPerKeyword": 20,
  "maxItems": 10000,
  "concurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per post (text, author, time, likes, replies, reposts, quotes, shares, media URLs, links, mentions, hashtags, quoted or reposted post, reply context) or per profile / account (followers, bio, links, emails, phones).

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/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"] }

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

```

## MCP server setup

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