# Threads Scraper: 200 Posts per Profile, Search & Replies (`automly/threads-public-posts-scraper`) Actor

Scrape public Threads posts, profiles, keyword search and post replies without a login or cookies. Up to 200 posts per profile, exact likes, replies, reposts and follower counts. Batch runs or a real-time API.

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

## Pricing

from $7.50 / 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: 200 Posts per Profile, Search & Replies

**Threads Scraper** extracts **public posts, profiles and keyword search results from Meta Threads** (threads.com, formerly threads.net) without a Threads or Instagram login. Give it usernames, profile URLs, post URLs or search keywords and get clean JSON with **post text, timestamps, exact like, reply, repost, quote and share counts, images, videos, hashtags, mentions and links**, plus **profile bios, display names, exact follower counts and verification status**. It reads up to about **200 posts per profile** without a login, cookies or a paid proxy, going back years for accounts that post less often, and it can return the **replies under a post** too. Export to JSON, CSV or Excel, or pull the data through the Apify API.

It works as a lightweight **Threads API alternative** for social listening, brand monitoring, creator research and competitor tracking, with no developer app, access token or cookies to manage. Need data inside your own app? Call it as a **real-time HTTP API** (Standby mode) and get posts back in the response, without waiting for a run to start.

### Why this Threads scraper

- **Deep profile history without a login.** Up to about 200 posts per profile from Threads' logged-out feed. Some Threads scrapers stop at 4 to 5 posts per profile when logged out, or need your Threads cookies to page further.
- **No residential proxy needed.** Runs read Threads directly, so they are fast and cheap. Turn on Apify Proxy only if you get blocked.
- **Only relevant search results.** Posts that do not contain every keyword are dropped before they reach your dataset, so you do not pay for off-topic results.
- **Real-time API and batch runs from one Actor.** Use the Output tab for exports, or the Standby endpoints for live lookups.
- **Exact numbers.** Likes, replies, reposts, quotes, shares and follower counts are exact integers, not "1.6K" labels.
- **A run report every time.** Each run saves a summary of what was scraped and which inputs failed, so scheduled runs are easy to monitor.

### What data can you scrape from Threads?

- **Scrape Threads posts from any public profile**: text, post URL, post 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.
- **Scrape a single Threads post by URL**: fetch the exact posts you already have links for.
- **Scrape replies to a Threads post**: get the replies shown under a post, each as its own row linked back to the post with `replyToUrl`.
- **Filter Threads posts by date**: keep only posts published inside a UTC date range.
- **Export Threads data** to JSON, CSV, Excel, Google Sheets or any tool connected through Apify integrations.

### Use cases

- **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 to scrape Threads

1. Click **Try for free** to open the Actor in Apify Console.
2. Add usernames such as `zuck` to **Public profiles (posts)**, or keywords such as `coffee` to **Search keywords**.
3. Set **Max posts per source** (20 is a good default).
4. Click **Start**. A typical run finishes in 5 to 30 seconds.
5. Open the **Output** tab and download the data as JSON, CSV or Excel.

### Input parameters

| Parameter | Type | Description |
|---|---|---|
| `profiles` | string\[] | Usernames (`zuck`, `@zuck`) or profile URLs on threads.com or threads.net. Returns their latest public posts. |
| `profileOnly` | string\[] | Usernames or profile URLs. Returns profile details only, no posts. |
| `queries` | string\[] | Keywords to search public Threads posts. |
| `postUrls` | string\[] | Public Threads post URLs to fetch directly. |
| `includeReplies` | boolean | Also return the replies shown under each post URL. Default `false`. |
| `requireKeywordMatch` | boolean | Drop search results whose text does not contain every keyword. Default `true`. |
| `includeProfile` | boolean | Also output one profile record for each account in `profiles`. Default `false`. |
| `postedAfter` / `postedBefore` | ISO 8601 string | Date window in UTC. `postedAfter` is inclusive, `postedBefore` exclusive. |
| `maxPostsPerSource` | integer (1 to 300) | Maximum posts per profile, search or URL. Default 20. |
| `failOnSourceError` | boolean | Fail the whole run if any one source returns nothing. Default `false`. |
| `proxyConfiguration` | object | Optional proxy. Each source gets its own IP and is retried up to 3 times on a new IP if blocked. |

Example input:

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

### Output example

Each post is one dataset 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 `includeReplies`) have the same fields plus `replyToUrl`, the post they answer, and `source: "reply"`.

All counts are exact numbers from Threads' own data, not rounded labels such as "1.6K". `mediaUrls` holds one URL per image or video, including every slide of a carousel.

### How many posts can you get?

This Actor never logs in, so it gets what Threads serves to logged-out visitors. In our tests on 23 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 `includeReplies` | the post plus about 9 to 10 replies | about 3 s |
| Profile details only | 1 profile record | about 1 s |

Threads stops a logged-out profile feed at roughly 170 to 215 posts, so `maxPostsPerSource` above that returns the same. Search is limited to one page of results per keyword, and replies to the first page under a post: past that point Threads asks visitors to log in ("Log in for more threads about this topic", "Log in to see more replies"), and that applies to every scraper that does not log in. Threads also has no Recent search for logged-out visitors (it redirects to Top), so this Actor always reads Top results. Add more keywords, or related keywords and hashtags, for more coverage.

The numbers above were rechecked on 24 September 2026.

### Use it as a real-time Threads API (Standby mode)

The Actor also runs as an HTTP server. Send a request and get the rows back in the response, with the same fields as the dataset. Each returned row is charged like a result from a normal run. Open the **Endpoints** tab in Apify Console for the hostname and an interactive list of endpoints.

| Endpoint | 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 $APIFY_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. To send Standby requests through Apify Proxy, create a Task with the proxy turned on and use the Task's own Standby hostname.

### Run report

Every run saves a `report-summary` record in its key-value store: how many sources were requested, how many posts and profiles were saved, which inputs failed and why, 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 much does it cost to scrape Threads?

You pay only for the results you get. There is no monthly fee.

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| Post or profile record | $0.002 each ($2 per 1,000) |

Examples: 10 profiles at 20 posts each (200 posts) costs about **$0.41**. A daily brand search returning 10 posts costs about **$0.025 per day**. Apify's free plan includes $5 of monthly credit, which covers about 2,400 posts.

### FAQ

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

No. Threads Scraper reads the public pages that anyone can open in a browser without logging in. You do not provide cookies, passwords or API tokens.

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

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

#### Is it legal to scrape Threads?

Scraping publicly available data is generally legal in many jurisdictions, but you are responsible for how you collect and use it. Only collect public information, follow applicable privacy laws such as GDPR, and respect Threads' terms. Consult a lawyer if you are unsure about your use case.

#### 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 the logged-out feed 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 `queries` 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 normalized to threads.com.

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

The Actor only returns what Threads shows to logged-out visitors. Posts without text, and metrics 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 error is shown in the run log.

#### 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 `postUrls` and turn on `includeReplies`. You get the post followed by the replies Threads shows without a login, usually about 10, each with `replyToUrl`. Threads asks for a login to show more.

#### Does it support Recent search?

No. Threads only offers Recent search to logged-in users; logged-out visitors are redirected to Top results. This Actor never logs in, so it reads Top results. Older inputs that still set `searchSort` to `recent` get Top results and a note in the log.

#### Can I call it from my own app in real time?

Yes. Use the Standby endpoints described above: one HTTP request, rows in the response, no run to start or poll.

### Related scrapers

- [X / Twitter Profile Posts Scraper](https://apify.com/automly/x-twitter-list-replies-scraper): the same kind of profile post data from X.
- [X / Twitter Mentions & Keyword Monitor](https://apify.com/automly/x-twitter-mentions-keyword-monitor): keyword and brand monitoring on X.
- [Reddit Scraper](https://apify.com/automly/reddit-ultimate-scraper): posts, comments, users and subreddit search.
- [Meta (Facebook) Ad Library Scraper](https://apify.com/automly/facebook-ad-library-scraper): Facebook and Instagram ads from Meta's Ad Library.

### Disclaimer

Threads Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Meta Platforms or Threads. Threads is a trademark of Meta Platforms, Inc. Output fields and limits were last verified against live Threads pages on 24 September 2026.

# 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 ISO 8601 date/time with timezone; leave empty for no filter.

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

Exclusive ISO 8601 date/time with timezone; 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`):

Optional. Not needed in most runs. If Threads blocks a request, choose Apify Proxy: each profile, search or URL then gets its own IP and is retried up to 3 times on a new IP.

## 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/hdHbpJbj6FrsMF5H2/openapi.json
