# Threads Scraper (`automly/threads-public-posts-scraper`) Actor

Scrape public Threads posts, profiles, keyword search and post replies: text, media, likes, replies, reposts, dates and follower counts. Up to 200 posts per profile. No login. Export to CSV, JSON or Excel, schedule runs or use the API.

- **URL**: https://apify.com/automly/threads-public-posts-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Categories:** Social media, Lead generation
- **Features:** Limited permissions, Single-tenant, Server interface
- **Stats:** 40 total users, 9 monthly users, 98.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.90 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 - Posts, Profiles, Search & Replies

### What is Threads Scraper?

**Threads Scraper** is a tool that lets you **scrape public posts, profiles, keyword search results and replies from Meta Threads** (threads.com, formerly threads.net): post text, publish time, exact like, reply, repost, quote and share counts, images, videos, hashtags, mentions and links, plus profile bios, display names, exact follower counts and verified badges. Add usernames, post links or keywords, click **Start**, and download the data as Excel, CSV or JSON.

- 📚 **Deep profile history:** up to about 200 posts per profile, going back years for accounts that post less often (Mark Zuckerberg's reach back to July 2023)
- ⚡ **Fast:** about 10 seconds per 100 profile posts, a search or a single post in about 3 seconds (our tests)
- 🔢 **Exact numbers:** likes, replies, reposts, quotes, shares and followers as exact integers, not "1.6K" labels
- 🔓 **No login:** no Threads or Instagram account, cookies or developer app needed
- 💸 **Free to try:** the $5 of free usage every Apify account gets each month covers about 500 posts, replies or profiles

### What can Threads Scraper do?

- **Scrape Threads posts from any public profile**: text, post URL and ID, author and display name, publish time (UTC), likes, replies, reposts, quotes, shares, image and video URLs, hashtags, mentions and full link URLs. Pinned posts and replies are flagged
- **Scrape Threads profiles**: username, display name, bio, exact follower count, verified badge and HD profile picture URL
- **Search Threads posts by keyword**: Threads' Top results for a brand, product, hashtag or topic, filtered so every post actually contains your keywords (you don't pay for off-topic posts)
- **Scrape a single Threads post by URL**: fetch the exact posts you already have links for
- **Scrape replies to a Threads post**: each reply is its own row, linked back to the post with `replyToUrl`
- **Filter Threads posts by date**: keep only posts published inside a UTC date range
- **Use it as a Threads API alternative**: get posts back in the response of one HTTP request, without starting a run
- Export to Excel, CSV, JSON, HTML or XML, or send the data to Google Sheets, Make, Zapier and more

### What data can you extract from Threads?

| | | |
|---|---|---|
| 📝 Post text | 📅 Publish time (UTC) | 🔗 Post URL and ID |
| ❤️ Likes | 💬 Replies | 🔁 Reposts |
| 🗨️ Quotes | 📤 Shares | 🖼️ Image and video URLs |
| #️⃣ Hashtags | @ Mentions | 🌐 Links in the post |
| 📌 Pinned and reply flags | ↩️ Post a reply answers | 👤 Author and display name |
| 🧾 Profile bio | 👥 Exact follower count | ✅ Verified badge |

### How to scrape Threads

1. [Create a free Apify account](https://console.apify.com/sign-up) (no credit card needed).
2. Open **Threads Scraper**.
3. Add usernames such as `zuck` to **Public profiles (posts)**, keywords such as `coffee` to **Search keywords**, or post links to **Individual post URLs**.
4. Set **Max posts per source** (20 is a good default), then click **Start**. A typical run finishes in 5 to 30 seconds.
5. When the run finishes, download the data as Excel, CSV, JSON, HTML or XML.

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

You pay only for the rows you get: each post, reply or profile is one row. The price per 1,000 depends on your Apify plan:

| Apify plan | Posts, replies or profiles per 1,000 |
|---|---|
| Free, Starter (Bronze) and Scale (Silver) | **$10.00** |
| Business (Gold) and higher | **$7.50** |

Each run also has a start fee of $0.001 per run at the default settings ($0.00075 on Business and higher). Platform usage is included in these prices, so you pay nothing extra for it.

**From 16 October 2026:** $2.50 per 1,000 on Free, Starter (Bronze) and Scale (Silver), and $1.90 per 1,000 on Business (Gold) and higher. The start fee stays the same.

Example: 1,000 posts cost $10.00 on the Free plan and $7.50 on Business, plus the start fee. From 16 October 2026 the same 1,000 posts cost $2.50 on Free and $1.90 on Business.

Every Apify account gets **$5 of free usage each month**, enough for about 500 posts at today's prices. **Max posts per source** keeps the cost of a run under control, and you can also set a maximum cost per run. See the **Pricing** tab for details.

### ⬇️ Input

| Setting | What it does |
|---|---|
| **Public profiles (posts)** | Usernames (`zuck`, `@zuck`) or profile URLs on threads.com or threads.net. Returns their latest public posts |
| **Profile metadata only** | Usernames or profile URLs. Returns profile details only, no posts |
| **Search keywords** | Keywords to search public Threads posts |
| **Individual post URLs** | Public Threads post URLs to fetch directly |
| **Include replies to post URLs** | Also return the replies shown under each post URL (off by default) |
| **Require keyword text match** | Drop search results whose text does not contain every keyword (on by default) |
| **Include profile metadata** | Also output one profile row for each account in **Public profiles (posts)** (off by default) |
| **Posted at or after (UTC)** / **Posted before (UTC)** | Date window in UTC. The first is inclusive, the second exclusive. A plain date such as `2026-09-01` means midnight UTC |
| **Max posts per source** | Maximum posts per profile, search or URL, 1 to 300 (default 20) |
| **Fail the run when a source fails** | Fail the whole run if any one source returns nothing (off by default) |

Example: two profiles with their profile rows, plus a keyword search, posts since 1 September 2026:

```json
{
  "profiles": ["zuck", "https://www.threads.net/@nasa"],
  "queries": ["coffee"],
  "includeProfile": true,
  "maxPostsPerSource": 20,
  "postedAfter": "2026-09-01T00:00:00Z"
}
```

Example: one post and the replies under it:

```json
{
  "postUrls": ["https://www.threads.com/@zuck/post/DdZ7sQvkTFn"],
  "includeReplies": true
}
```

### ⬆️ Output

Each post is one row with `type: "post"`:

```json
{
  "url": "https://www.threads.com/@zuck/post/DdZ7sQvkTFn",
  "id": "DdZ7sQvkTFn",
  "author": "zuck",
  "fullName": "Mark Zuckerberg",
  "isVerified": true,
  "postedAt": "2026-09-17T22:27:44Z",
  "text": "Muse for Mac is out today! It works across apps, files, calendar, notes, and messages on your computer. You control what it can access. The team is shipping fast. Download at ai.meta.com/muse/download",
  "hashtags": [],
  "mentions": [],
  "urls": ["http://ai.meta.com/muse/download"],
  "likes": 1776,
  "replies": 306,
  "reposts": 147,
  "quotes": 32,
  "shares": 88,
  "isReply": false,
  "isPinned": true,
  "mediaUrls": [],
  "source": "profile",
  "platform": "threads",
  "type": "post"
}
```

Profile rows use `type: "profile"`:

```json
{
  "type": "profile",
  "username": "nasa",
  "fullName": "NASA",
  "biography": "Making the seemingly impossible, possible. ✨",
  "followerCount": 12739278,
  "isVerified": true,
  "profilePicUrl": "https://scontent.cdninstagram.com/...",
  "url": "https://www.threads.com/@nasa",
  "source": "profileOnly",
  "platform": "threads"
}
```

Reply rows (from **Include replies to post URLs**) have the same fields as posts plus `replyToUrl`, the post they answer, and `source: "reply"`. `mediaUrls` holds one URL per image or video, including every slide of a carousel.

Each run also saves a short report: how many sources were requested, how many posts and profiles were saved, which inputs failed and why, which keywords had no posts, and whether the run stopped at its cost limit. It is written even when a run fails, which makes scheduled monitoring runs easy to check.

### How can I use Threads data?

- **Brand monitoring on Threads:** search your brand or product name on a schedule and collect the posts that mention it
- **Influencer and creator research:** compare follower counts, posting frequency and engagement across Threads accounts
- **Competitor tracking:** pull the latest posts from competitor accounts and see which topics get the most likes and replies
- **Social listening and sentiment analysis:** feed post text into a spreadsheet, BI tool or language model
- **Academic and market research:** build small, timestamped datasets of public Threads conversations

### How many posts can you get?

Threads Scraper never logs in, so it gets what Threads shows to visitors without an account. In our tests (rechecked on 24 September 2026):

| Source | Posts returned per source | Run time |
|---|---|---|
| Public profile (`zuck`, `nasa`) | up to 170 to 215 of the most recent posts (Mark Zuckerberg's go back to July 2023) | about 10 s per 100 posts |
| Keyword search (`coffee`) | 10 to 19 keyword-matching posts out of about 25 shown | about 3 s |
| Single post URL | 1 | about 3 s |
| Single post URL with replies | the post plus about 9 to 10 replies | about 3 s |
| Profile details only | 1 profile row | about 1 s |

Threads stops showing a profile's posts to visitors at roughly 170 to 215 posts, so **Max posts per source** above that returns the same. For a search, Threads shows visitors about 25 Top posts per keyword, and about 10 replies under a post; past that point it asks visitors to log in. That applies to every scraper that does not log in. Add more keywords, or related keywords and hashtags, for more coverage.

### Real-time Threads API

Need posts right away inside your app? Send one HTTP request and get the rows back in the response, with the same fields as the dataset. Each returned row is charged like a row from a normal run.

| Request | What it returns |
|---|---|
| `GET /profile?username=zuck&limit=20&includeProfile=true` | Latest posts of a profile, optionally with its profile row |
| `GET /post?url=<post URL>&includeReplies=true` | One post, optionally with the replies under it |
| `GET /search?q=coffee&limit=20` | Posts for a keyword |

```bash
curl -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  "https://automly--threads-public-posts-scraper.apify.actor/profile?username=nasa&limit=5"
```

The response is `{"count": 5, "items": [...]}`. Errors use normal HTTP codes: 400 for an invalid username or URL, 404 when nothing was found, 502 when Threads could not be reached.

### Scrape more social media posts

| Actor | What it gets |
|---|---|
| [X (Twitter) Scraper - Profile Tweets & Posts](https://apify.com/automly/x-twitter-profile-tweets-scraper) | Tweets from any public X profile: text, views, likes, reposts, replies, quotes, media and dates |
| [X (Twitter) Profile Scraper - Users & Followers](https://apify.com/automly/x-twitter-user-profile-scraper) | X user profiles in bulk: followers, following, tweet count, bio, location and website |
| [Instagram Posts & Reels Scraper](https://apify.com/automly/instagram-profile-posts-scraper) | Posts and reels from any public Instagram profile: captions, likes, comment counts, hashtags, images and videos |
| [Reddit Scraper - Posts, Comments, Users, Subreddits & Search](https://apify.com/automly/reddit-ultimate-scraper) | Reddit posts, comments, subreddits, user profiles and keyword search results |
| [LinkedIn Post Search Scraper (No Login)](https://apify.com/automly/linkedin-post-search-scraper) | Public LinkedIn posts by keyword: text, author, date, likes and comment count |

### ❓FAQ

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

$10.00 per 1,000 posts, replies or profiles on the Free plan today, and $2.50 per 1,000 from 16 October 2026. See the cost section above for every plan.

#### Do I need a Threads or Instagram account to scrape Threads?

No. Threads Scraper reads the public posts and profiles anyone can see without logging in. You don't provide cookies, passwords or a developer app.

#### Is there an official Threads API for scraping posts?

Meta's Threads API is designed for managing your own account and needs an approved developer app. Threads Scraper collects public posts and profiles from any account or keyword search without that setup.

#### Can I scrape all posts from a Threads profile?

Up to roughly the 170 to 215 most recent posts. That is the full history for many accounts (Mark Zuckerberg's reaches back to July 2023), but Threads stops there for very active accounts. Schedule the actor weekly to keep a longer archive.

#### Can I monitor Threads for keywords or brand mentions?

Yes. Add your keywords to **Search keywords** and run the actor on an Apify schedule. Each run returns the posts currently shown for that search; compare runs by post `id` to find new ones. The run report tells you if a keyword returned nothing.

#### Does it work with threads.net links?

Yes. threads.net and threads.com URLs are both accepted and saved as threads.com.

#### Why are some posts or numbers missing?

You get what Threads shows to visitors without an account. Posts without text, and numbers Threads hides, are left out rather than guessed. If one source fails (for example a username that does not exist), the other sources still return their results and the run report names the failed one.

#### Can I get videos, carousels and quote counts?

Yes. `mediaUrls` holds a direct URL for every image and video, including each carousel slide, and `quotes` holds the quote-post count.

#### Can I scrape replies to a Threads post?

Yes. Add the post URL to **Individual post URLs** and turn on **Include replies to post URLs**. You get the post followed by the replies Threads shows without a login, usually about 10, each with `replyToUrl`.

#### Does it support Recent search?

No. Threads offers Recent search only to logged-in users and shows everyone else Top results, so Threads Scraper reads Top results.

#### Can I connect Threads Scraper to other tools or AI agents?

Yes. Start runs and download results with the Apify API or the Python and JavaScript clients, send results to Make, Zapier, n8n, Google Sheets or Slack with Apify integrations and webhooks, or let AI assistants and agents run it through the Apify MCP server at [mcp.apify.com](https://mcp.apify.com).

#### Is it legal to scrape Threads?

This scraper collects only public posts and profiles. Posts and profiles can contain personal data, which may be protected by laws such as the GDPR, so only collect it for a legitimate reason and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Threads Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Threads or Meta Platforms. Threads is a trademark of Meta Platforms, Inc.

#### Something isn't working?

Open the **Issues** tab with your input and what you expected. We read every one and usually reply within a day.

### ⭐ Your feedback

Have an idea or found a problem? Open the **Issues** tab and tell us. If Threads Scraper saved you time, a short review on the **Reviews** tab helps other people find it.

# Actor input Schema

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

Enter Threads usernames (zuck, @zuck) or profile URLs (threads.com/@zuck or threads.net/@zuck) to get their latest public posts.

## `profileOnly` (type: `array`):

Enter usernames or profile URLs to get bio, display name, follower count, verification and avatar only, without posts.

## `queries` (type: `array`):

Enter keywords to search public Threads posts, for example a brand, product or topic.

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

Paste public Threads post URLs to fetch those exact posts.

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

Enable to also get the replies shown under each post URL, each as its own row with replyToUrl pointing to the post. Threads shows about 10 replies without a login.

## `requireKeywordMatch` (type: `boolean`):

Discard search results whose visible text lacks every query word; prevents irrelevant results from being charged as useful posts.

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

Emit one additional profile record alongside posts for each supplied profile.

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

Inclusive. A date such as 2026-09-01 (midnight UTC) or a date and time such as 2026-09-01T12:00:00Z; a time without a timezone is read as UTC. Leave empty for no filter.

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

Exclusive. A date such as 2026-10-01 (midnight UTC) or a date and time such as 2026-10-01T12:00:00Z; a time without a timezone is read as UTC. Leave empty for no filter.

## `maxPostsPerSource` (type: `integer`):

Maximum posts returned per profile, search or URL. Profiles go back up to about 170 to 210 posts; a search page holds about 20.

## `failOnSourceError` (type: `boolean`):

Enable to fail the whole run if any single profile, search or URL returns no posts. Disabled by default, so the other sources still return their results.

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

Proxy settings. The default works for most runs. If results come back empty, try a different proxy option.

## Actor input object example

```json
{
  "profiles": [
    "zuck"
  ],
  "queries": [
    "coffee"
  ],
  "includeReplies": false,
  "requireKeywordMatch": true,
  "includeProfile": false,
  "maxPostsPerSource": 10,
  "failOnSourceError": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `posts` (type: `string`):

No description

## `profiles` (type: `string`):

No description

## `replies` (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"
    ],
    "queries": [
        "coffee"
    ],
    "maxPostsPerSource": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/threads-public-posts-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"],
    "queries": ["coffee"],
    "maxPostsPerSource": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/threads-public-posts-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"
  ],
  "queries": [
    "coffee"
  ],
  "maxPostsPerSource": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call automly/threads-public-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automly/threads-public-posts-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/JDxF3tsRLHZnVztnJ/builds/B2w3dj6pITXWpOMHr/openapi.json
