# Threads Scraper | Profiles, Posts, Replies, Search | $1 / 1K (`hridayrungta/threads-scraper`) Actor

Threads data without a login or API key: profiles (followers, bio, links, verified), recent posts with likes, replies, reposts and quotes, single posts with their replies, and keyword search. $1 per 1,000 posts or replies, $1.50 per 1,000 profiles, $0.001 per run.

- **URL**: https://apify.com/hridayrungta/threads-scraper.md
- **Developed by:** [Hriday Rungta](https://apify.com/hridayrungta) (community)
- **Categories:** Social media, Lead generation, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 post or reply scrapeds

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 Scraper** gets **Threads data** without a login or an API key: public **Threads profiles** (follower count, bio, bio links, verified badge), each profile's most recent **Threads posts** with like, reply, repost and quote counts, any single post with its **replies**, and the posts Threads' own **search** shows for a keyword. It is a simple **Threads API alternative** for Meta Threads: paste usernames, post links or keywords, press Start, and download the result as JSON, CSV or Excel. Use it for social listening, influencer vetting, competitor tracking, brand monitoring or to feed AI agents with fresh Threads posts.

- **No login, no cookies, no API key.** It reads the same public pages any logged-out visitor sees on threads.com.
- **Profiles, posts, replies and search in one Actor.** Mix usernames, post URLs and keywords in one run.
- **Flat, clean rows.** One row per profile, post or reply, with a ready-made spreadsheet view.
- **Pay only for results.** $1 per 1,000 posts or replies and $1.50 per 1,000 profiles. Missing accounts and failed inputs are free.
- **Apify platform built in:** API access, scheduling, webhooks, integrations (Make, n8n, Zapier, Google Sheets), monitoring, and automatic proxy rotation with fresh sessions on retries.

### What data can you extract from Threads?

| Row type | Fields |
|---|---|
| **Profile** | username, full name, user ID, biography, bio links, follower count, verified, private flag, HD profile picture URL, profile URL, topic tags |
| **Post / reply** | post ID, short code, URL, text, created date, author username / name / verified / picture, like count, reply count, repost count, quote count, share count, media type (text, image, video, carousel), image URLs, video URLs, link preview URL and title, mentions, hashtags, topic tag, language, reply-to username, parent post, position inside a multi-post thread, quote and repost links, pinned flag, paid-partnership flag |
| **Status row (free)** | the input, why it could not be scraped (`not-found`, `invalid-input`, `no-results`, `failed`) |

The `type` column tells the rows apart (`profile`, `post`, `reply`, `error`) and `source` says where a row came from (`profile`, `post`, `reply`, `search`).

### How to use Threads Scraper

1. Open the Actor and go to the **Input** tab.
2. Add **Threads profiles** (usernames like `zuck` or URLs like `https://www.threads.com/@zuck`), **post URLs**, **search keywords**, or any mix.
3. Set the limits: posts per profile, replies per post, posts per keyword, and the overall row cap.
4. Click **Start**. A few profiles take a few seconds.
5. Download the results from the **Output** tab (JSON, CSV, Excel, HTML) or fetch them through the Apify API.

### Input

| Field | What it does | Default |
|---|---|---|
| `profiles` | Usernames or profile URLs (threads.net and threads.com both work) | `["zuck", "nasa"]` prefilled |
| `postUrls` | Post URLs: returns the post plus its replies | empty |
| `searchQueries` | Keywords: returns the posts Threads' search shows logged-out | empty |
| `includeProfileDetails` | One profile row per username | `true` |
| `maxPostsPerProfile` | 0 = profile row only, up to 50 | 10 |
| `maxRepliesPerPost` | 0 = only the post, up to 500 | 20 |
| `maxPostsPerSearch` | Posts per keyword, up to 50 (Threads shows about 20) | 20 |
| `searchSort` | `top` or `recent` | `top` |
| `maxItems` | Hard cap on billed rows per run | 1000 |
| `proxyConfiguration` | Apify proxy for retries (the free datacenter proxy is enough) | Apify proxy |

#### Input example

```json
{
  "profiles": ["mosseri", "https://www.threads.net/@natgeo"],
  "maxPostsPerProfile": 20,
  "postUrls": ["https://www.threads.com/@zuck/post/Dd1MqfcG0aH"],
  "maxRepliesPerPost": 50,
  "searchQueries": ["marathon training"],
  "searchSort": "recent"
}
```

### Output example

Real rows from a run on 2026-11-02 (a profile row and one of its posts):

```json
[
  {
    "type": "profile",
    "source": "profile",
    "sourceInput": "mosseri",
    "userId": "63482099442",
    "username": "mosseri",
    "fullName": "Adam Mosseri",
    "biography": "Father of three boys, married to an amazing woman, head of Instagram and supporter of Threads.",
    "bioLinks": [
      "http://mosseri.net/"
    ],
    "followerCount": 1055119,
    "isVerified": true,
    "isPrivate": false,
    "profilePicUrl": "https://scontent-iad3-2.cdninstagram.com/v/t51.82787-19/652081753_17949596661115443_3143547630500927369_n.jpg?stp=dst-jpg_s640x640_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=scontent-iad3-2.cdninstagram.com&_nc_cat=103&_nc_oc=Q6cZ2gGoPnWMnrEUFAFXd1sEnQ90MbeDUnHJBovhguGV2ANHsWmnqXb-74dPevstPOdhoAU&_nc_ohc=9il3gULxYX8Q7kNvwFh4fM4&_nc_gid=lGnYiWHOrr8mWeyBwPU_0w&edm=APs17CUBAAAA&ccb=7-5&oh=00_AQTy4ewg6O7TILMNLvue4cTJSjsCd35OF6o2-H9s38e-lQ&oe=6AEE55DE&_nc_sid=10d13b",
    "profileUrl": "https://www.threads.com/@mosseri",
    "topicTags": [
      "Arsenal Threads"
    ],
    "status": "ok",
    "error": null,
    "scrapedAt": "2026-11-02T10:50:24.915Z"
  },
  {
    "type": "post",
    "source": "profile",
    "sourceInput": "mosseri",
    "postId": "4017446202874265196",
    "code": "DfA1glCj_5s",
    "url": "https://www.threads.com/@mosseri/post/DfA1glCj_5s",
    "text": "I'm getting a lot of inbound about Instagram starting to work on longer-form video. A few things to clarify in case it's helpful:\n\n- This is going to take time to get right, but we're excited and committed\n- Features is not fully launched yet, we're testing and ramping up access slowly\n- We understand the economics matter a ton, and are exploring multiple options to help long-form creators get paid\n\nAs always, we'll communicate about progress as we go, and I'm happy to answer any questions.",
    "createdAt": "2026-10-27T21:35:29.000Z",
    "username": "mosseri",
    "userId": "63482099442",
    "userFullName": "Adam Mosseri",
    "userIsVerified": true,
    "userProfilePicUrl": "https://scontent-iad3-2.cdninstagram.com/v/t51.82787-19/652081753_17949596661115443_3143547630500927369_n.jpg?stp=dst-jpg_s206x206_tt6&_nc_cat=111&ccb=7-5&_nc_sid=30ff31&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLnd3dy42NzguQzMifQ%3D%3D&_nc_ohc=gP536brHm7oQ7kNvwFMu3xW&_nc_oc=Adpqc6yaCXZaElsxjzcX-zGE-UytrFWMYCKSx_0vCx327Kuf8h8HzGEClO60W4Wp-Ag&_nc_zt=24&_nc_ht=scontent-iad3-2.cdninstagram.com&_nc_gid=O2nR9JJpb__ZSrj5rQJiQQ&_nc_ss=70289&oh=00_AQTRNU1t79UCpSlpxFUZzKrMEx69MeTJpKEGoPlnddnEiw&oe=6AEE55DE",
    "likeCount": 1906,
    "replyCount": 636,
    "repostCount": 97,
    "quoteCount": 33,
    "shareCount": 96,
    "mediaType": "text",
    "imageUrls": [],
    "videoUrls": [],
    "linkUrl": null,
    "linkTitle": null,
    "mentions": [],
    "hashtags": [],
    "textLinks": [],
    "topicTag": null,
    "language": "en",
    "isReply": false,
    "replyToUsername": null,
    "parentPostCode": null,
    "threadPosition": 1,
    "isQuote": false,
    "quotedPostUrl": null,
    "isRepost": false,
    "repostedPostUrl": null,
    "isPinned": false,
    "isPaidPartnership": false,
    "status": "ok",
    "error": null,
    "scrapedAt": "2026-11-02T10:50:25.447Z"
  }
]
```

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

Pay-per-event pricing: you pay for the rows you get, nothing for failed or missing inputs.

| Event | Free plan | Bronze | Silver | Gold, Platinum, Diamond |
|---|---|---|---|---|
| Post or reply scraped, per 1,000 | $1.00 | $0.90 | $0.80 | $0.70 |
| Profile scraped, per 1,000 | $1.50 | $1.35 | $1.20 | $1.05 |
| Actor start, per run | $0.001 | $0.001 | $0.001 | $0.001 |

#### Worked examples (Free plan prices)

- **100 profiles with their 10 latest posts each:** $0.001 + 100 x $0.0015 + 1,000 x $0.001 = **$1.15**.
- **One viral post with 200 replies:** $0.001 + 201 x $0.001 = **$0.20**.
- **50 keywords, 20 posts each (1,000 posts):** **about $1.00**.
- **Profile rows only for 1,000 accounts** (`maxPostsPerProfile: 0`): **about $1.50**.

Apify's free plan includes $5 of monthly credit, which covers about **5,000 Threads posts** or **3,300 profiles** a month with this Actor.

### Integrations and scheduling

- **Apify API and clients** (JavaScript, Python): start runs and read the dataset from your own code.
- **Make, n8n, Zapier**: push new posts into a CRM, Slack, Airtable or email.
- **Google Sheets**: export the flat spreadsheet view in one click or on a schedule.
- **Webhooks**: get a call when a run finishes.
- **Apify Schedules**: run daily or hourly to track follower counts or new posts from a list of accounts.
- **MCP for AI agents**: Claude, ChatGPT or Cursor can call this Actor through the Apify MCP server to fetch live Threads posts.

### FAQ

#### Why not use the official Threads API?

Meta's official Threads API is built for managing your own account. Reading other accounts needs an approved Meta app, access tokens and app review, and it does not give you an open search across public posts. This Actor needs none of that: it returns the public data any logged-out visitor can see.

#### Is there a free Threads API for public data?

Not from Meta for other people's accounts. Threads Scraper is the closest thing: pay-per-result, no key, and Apify's free plan credit covers about 5,000 posts a month.

#### Can I search Threads by keyword?

Yes, with a limit. Threads shows a logged-out visitor about 10 to 20 posts per keyword (top or recent) and no further pages, so that is what this Actor returns. For deep keyword archives you would need a logged-in account, which this Actor never uses.

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

Threads shows logged-out visitors roughly the 15 latest threads of a profile. Multi-post threads count every post, so you usually get 15 to 40 posts. Older posts are not available without a login.

#### How do I get the replies or comments of a Threads post?

Put the post URL in `postUrls` and set `maxRepliesPerPost`. The Actor pages through the direct replies (top replies first) up to your limit, up to 500 per post.

#### Can I track Threads follower counts over time?

Yes. Schedule a run with `maxPostsPerProfile: 0` on your list of accounts; every run writes the current follower count with a timestamp, so you can chart growth in Google Sheets or your database.

#### Is it legal to scrape Threads?

This Actor only reads public pages that anyone can open without an account, and it never logs in. Public data can still be personal data: if you store or process it, follow the GDPR, CCPA and other laws that apply to you, and respect Threads' terms. If in doubt, ask a lawyer.

#### What are the alternatives?

Other Threads Actors on Apify Store, such as [Threads Profile API Scraper](https://apify.com/apify/threads-profile-api-scraper) and [Meta Threads Scraper](https://apify.com/futurizerush/meta-threads-scraper). This one combines profiles, posts, replies and search in one run at $1 per 1,000 posts.

#### Why did an input return a status row instead of data?

`not-found` means the account or post does not exist or is not public (Threads shows the login page). `invalid-input` means the line is not a username or Threads URL. `no-results` means the search returned nothing. `failed` means the page could not be loaded after several tries with fresh proxy sessions; run it again. Status rows are never charged.

### Limits

- **Logged-out view only.** About the 15 latest threads per profile, about 20 posts per keyword search, no follower or following lists, no likes lists.
- **Private profiles:** their posts are not public, so they are not returned (no private account was available to test the profile row).
- **Replies** are direct replies in Threads' default order; nested replies to replies are not followed.
- **Media URLs** are signed CDN links that expire after a while: download the files soon if you need them.
- A run stops early if many inputs in a row return nothing (for example a list of deleted accounts), so a dead list cannot burn your budget.

### Related Actors

- [Instagram Profile Scraper](https://apify.com/hridayrungta/instagram-profile-scraper): followers, bio and stats of Instagram accounts.
- [Instagram Content Scraper](https://apify.com/hridayrungta/instagram-content-scraper): posts and reels with engagement counts.
- [Bluesky Scraper](https://apify.com/hridayrungta/bluesky-scraper): Bluesky posts, reply threads and follower lists.
- [TikTok Profile Scraper](https://apify.com/hridayrungta/tiktok-profile-scraper): TikTok followers, likes and bio.
- [Threads Profile API Scraper](https://apify.com/apify/threads-profile-api-scraper) by Apify.

# Actor input Schema

## `profiles` (type: `array`):

One per line: a username ("zuck" or "@zuck") or a profile URL (https://www.threads.com/@zuck, threads.net works too). Each gives one profile row (followers, bio, links, verified) and the profile's most recent posts.

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

One per line: a Threads post URL such as https://www.threads.com/@zuck/post/Dd1MqfcG0aH. Gives the post with its counts plus its replies.

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

One keyword or phrase per line. Returns the posts Threads' own search shows a logged-out visitor: usually 10 to 20 posts per keyword, with no further pages.

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

Turn off to get only the posts of each profile.

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

0 = profile row only. Threads shows a logged-out visitor about the 15 latest threads of a profile, so the real maximum is usually 15 to 40 posts (multi-post threads count each post).

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

0 = only the post itself. Replies are the direct replies in Threads' default order (top replies first).

## `maxPostsPerSearch` (type: `integer`):

Threads returns at most about 20 posts per keyword to a logged-out visitor.

## `searchSort` (type: `string`):

Top: Threads' own ranking. Recent: newest first.

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

Hard cap on billed rows (profiles + posts + replies) for the whole run.

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

The first try goes out directly; retries use a fresh Apify datacenter proxy session. The free datacenter proxy is enough.

## Actor input object example

```json
{
  "profiles": [
    "zuck",
    "nasa"
  ],
  "postUrls": [],
  "searchQueries": [],
  "includeProfileDetails": true,
  "maxPostsPerProfile": 5,
  "maxRepliesPerPost": 20,
  "maxPostsPerSearch": 20,
  "searchSort": "top",
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "profiles": [
        "zuck",
        "nasa"
    ],
    "postUrls": [],
    "searchQueries": [],
    "maxPostsPerProfile": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("hridayrungta/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 = {
    "profiles": [
        "zuck",
        "nasa",
    ],
    "postUrls": [],
    "searchQueries": [],
    "maxPostsPerProfile": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("hridayrungta/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 '{
  "profiles": [
    "zuck",
    "nasa"
  ],
  "postUrls": [],
  "searchQueries": [],
  "maxPostsPerProfile": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call hridayrungta/threads-scraper --silent --output-dataset

```

## MCP server setup

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