# Threads Profile Scraper: Posts by Username (`themineworks/threads-profile-scraper`) Actor

Scrape every public post from any Threads profile by username. Text, timestamps, likes, replies, reposts, media URLs and permalinks. Optional monitor mode returns only new posts on a schedule. No login, no API key. Works in Claude, ChatGPT and any MCP compatible AI agent.

- **URL**: https://apify.com/themineworks/threads-profile-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Social media, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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 Profile Scraper: Posts by Username

> 🏆 Part of The Mine Works' 149-actor portfolio · 40,000+ runs · 200,000+ results delivered across our full distribution stack · 99.9%+ success rate

> 💰 From $1.20 / 1,000 results.

> ⚡ Public posts for one or more usernames in a single run, plus a monitor mode that returns only what is new since the last run. No login, no API key.

> 💸 An empty result or a blocked run is never charged. You pay per post delivered.

Point it at one or more usernames and get their public Threads posts. Text, author, timestamps, likes, replies, reposts, media URLs and permalinks. No login, no API key.

### Input

- **profileUsernames** (required)
- **maxPosts** caps how many posts come back.
- **Include replies** and **Include reposts** are both off by default.
- **Monitor mode** returns only posts not delivered in an earlier run, so a schedule bills for new posts instead of the same feed every time.

### Turn it into a standing watch

Set **Monitor mode** to true, save the run as a task, then add that task to an Apify Schedule. Every run after the first returns only what is new. You are never charged twice for the same post, and a run that finds nothing new says so in the log rather than looking like a failure.

### Part of the Threads suite

[Threads Scraper](https://apify.com/themineworks/threads-scraper) is the
general-purpose one: 25 fields, 4 modes, no login. These three are focused cuts of it,
each with its own input and its own monitor mode.

- [Threads Profile Scraper](https://apify.com/themineworks/threads-profile-scraper), posts by username (this actor)
- [Threads Hashtag Scraper](https://apify.com/themineworks/threads-hashtag-scraper), a tag feed
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper), keyword search

### Pricing

| Event | Price (Free plan) | You pay when |
| --- | --- | --- |
| Post | $0.002 | A Threads post is delivered to your dataset |

Tiered by Apify plan: Free $0.002, Bronze $0.0018, Silver $0.0016, Gold, Platinum and
Diamond $0.0012. Your plan is shown on your Apify billing page. From 14 September 2026
a one-time Actor Start event of $0.005 is added per run.

An empty search or a blocked run is never charged. You pay only for posts actually
delivered, and with monitor mode on you are never charged twice for the same post.

### Run it on a schedule

Monitor mode is what makes this cheap to run repeatedly: each run after the first returns only posts that were not delivered before.

1. Run it once with the input you want repeated, then click **Save as a task**
   so that exact input is attached to every future run.
2. In the Apify Console go to **Schedules** and create a new one, either a
   preset (hourly / daily / weekly) or a cron expression.
3. Save. It then runs unattended, billed the same pay-per-result way. Nothing
   is charged for the schedule existing.

### Use from Claude, ChatGPT & any MCP agent

Hosted MCP endpoint, no install, OAuth on first connect:

```
https://mcp.apify.com/?tools=themineworks/threads-profile-scraper
```

Claude Desktop / Cursor config (token auth):

```json
{
  "mcpServers": {
    "threads-profile-scraper": {
      "url": "https://mcp.apify.com/?tools=themineworks/threads-profile-scraper",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Ask your agent: *"Get the last 20 Threads posts from \[username]."*

### FAQ

**Do I need to log in or supply an API key?**
No. It reads public profile timelines directly.

**Can I pull more than one profile per run?**
Yes, up to 20 usernames in one run.

**How many posts do I get per username?**
Roughly 4 to 5. That is Threads' own limit on a logged-out profile timeline, not a cap
set here. To reach a higher `maxPosts`, add more usernames rather than raising the
number on its own: the run draws from each in turn until the total is met.

**Are replies and reposts included?**
Not by default. `includeReplies` and `includeReposts` are both off unless you turn them
on.

**What does monitor mode change?**
With it on, each run returns only posts not delivered in an earlier run, so a recurring
schedule does not re-bill you for the same post.

**Is a private or nonexistent username billed?**
No. It returns nothing, is skipped rather than failing the run, and no post event
fires.

Keywords: Threads profile scraper, Threads posts by username, scrape Threads profile, Threads monitor mode, Threads feed monitoring, Threads content aggregation, no login Threads scraper, Threads MCP server

# Actor input Schema

## `profileUsernames` (type: `array`):

Threads usernames (without @) to scrape, used when mode=profile. Example: \["zuck", "mosseri"]. Expect roughly 4 to 5 recent posts PER USERNAME: that is Threads' own logged-out limit, not a cap we set, and one profile's timeline stops returning new posts beyond it. To reach a higher maxPosts, add MORE usernames rather than raising maxPosts alone — the run pulls from each in turn and keeps going until the total is met or the list runs out. A username that returns nothing (blocked, private, wrong handle) is skipped, not fatal to the run. Verified live: 6 usernames, maxPosts=20, returned exactly 20, spread 5/4/4/4/2/1 across 5 of the 6 (one returned nothing).

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

Maximum posts to return across the whole run. This is a ceiling, not a target: the actor stops as soon as it has enough or every target is exhausted. In search and hashtag mode a high value is usually reached from one query. In profile mode, ONE username caps around 4 to 5 posts (Threads' own logged-out limit) — to actually reach a high maxPosts here, list several usernames in Profile usernames above; the run draws from each until the total is met. You are never charged for posts that do not exist.

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

If true, include reply posts in the output.

## `includeReposts` (type: `boolean`):

If true, include reposts in the output.

## `monitorMode` (type: `boolean`):

Run on a schedule and get ONLY posts not delivered in a previous run, so you pay per new post instead of re-buying the whole profile feed. Keep the usernames the same across runs.

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

Apify proxy. Defaults to datacenter with a fresh rotating session per request, which clears Threads' IP throttling. Switch to residential only if you see persistent blocks.

## Actor input object example

```json
{
  "profileUsernames": [
    "zuck"
  ],
  "maxPosts": 25,
  "includeReplies": false,
  "includeReposts": false,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "profileUsernames": [
        "zuck"
    ],
    "maxPosts": 25,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/threads-profile-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 = {
    "profileUsernames": ["zuck"],
    "maxPosts": 25,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/threads-profile-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 '{
  "profileUsernames": [
    "zuck"
  ],
  "maxPosts": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call themineworks/threads-profile-scraper --silent --output-dataset

```

## MCP server setup

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