# Threads Scraper & Profile Monitor — New Posts Only, No Login (`ntriqpro/threads-profile-monitor`) Actor

Scrape public Threads profiles and get only what changed: new posts since your last run, likes, replies, reposts and follower movement. No login, no cookies, no browser. Runs that find nothing new cost nothing.

- **URL**: https://apify.com/ntriqpro/threads-profile-monitor.md
- **Developed by:** [daehwan kim](https://apify.com/ntriqpro) (community)
- **Categories:** Social media, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 & Profile Monitor — New Posts Only, No Login

Scrape public Threads (threads.net / threads.com) profiles and get back **only what changed**: posts that appeared since your last run, their likes, replies, reposts and quotes, and how the follower count moved.

No login. No cookies. No browser automation — just fast HTTP requests, which is why runs finish in seconds.

Built for brand monitoring, competitor tracking and creator research — anywhere you need to know *when something new happens* rather than re-downloading the same posts every day.

### Nothing new, nothing to pay

Most scrapers hand you the same posts on every run and bill you for all of them. This one remembers what it already gave you.

- A profile is charged **only when it returns at least one new post**
- Posts you received in a previous run are **never charged again**
- Private profiles, unreachable profiles and runs that find nothing new cost **nothing**

Your first run has nothing to compare against, so it returns the current posts as a baseline. From the second run onward you get only the difference.

### What you get per profile

| Field | Contents |
|---|---|
| `profile` | Username, user id, follower count, verified and private flags, profile picture |
| `followerDelta` | Follower change since your previous run |
| `newPosts` | How many new posts this run found |
| `posts[]` | Each new post: text, URL, publish time, likes, replies, reposts, quotes, media |
| `posts[].engagementDelta` | How much each post's numbers moved since last time |
| `firstRun` | Whether this was the baseline run for that profile |
| `charged` | Whether this row was billed |

### Input

```json
{
  "usernames": ["@zuck", "mosseri", "https://www.threads.net/@nasa"],
  "onlyNewPosts": true,
  "includeEngagementDelta": true,
  "skipReplies": false,
  "maxPostsPerProfile": 25
}
```

Handles, plain usernames and full profile URLs all work. Duplicates and malformed entries are dropped before any work starts, so you are never billed for them.

### Output

```json
{
  "username": "zuck",
  "profile": {
    "username": "zuck",
    "userId": "63055343223",
    "followers": 5709931,
    "isVerified": true,
    "isPrivate": false
  },
  "followerDelta": 6,
  "newPosts": 1,
  "posts": [
    {
      "code": "Db2wI-DilLt",
      "url": "https://www.threads.com/@zuck/post/Db2wI-DilLt",
      "text": "Today we're also opening the weights for...",
      "publishedAt": "2026-08-10T09:21:59.000Z",
      "likes": 1654,
      "replies": 208,
      "reposts": 81,
      "quotes": 43,
      "isNew": true,
      "engagementDelta": { "likes": 12, "replies": 3, "reposts": 0, "quotes": 1 }
    }
  ],
  "firstRun": false,
  "charged": true
}
```

### Pricing

| Event | Price | When |
|---|---|---|
| `profile-checked` | $0.005 | A profile returned at least one new post |
| `post-delivered` | $0.002 | Per new post delivered |

Checking a profile that has nothing new triggers neither event.

### Scheduling

This actor is designed to run on a schedule. Point it at your profiles, run it hourly or daily, and each run hands you just the new material. Combine it with Apify's integrations to push new posts straight to Slack, a webhook or a spreadsheet.

### Data sources

Public Threads profile pages only. No login, no cookies, no browser automation — the actor reads the same page any visitor can open. Public profile pages expose a limited window of recent posts, which is what this actor returns.

### Legality and ethics

**Is it legal to scrape Threads?** Scraping publicly available data is generally legal — see [Apify's guide on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/). This actor only reads what users have chosen to publish openly. It never logs in, never sends cookies, never touches private accounts, and never bypasses any access control.

**Where this actor goes beyond the usual baseline:**

- **It says who it is.** Requests carry an honest, identifiable User-Agent instead of impersonating a browser — the transparency [Apify recommends for ethical scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/).
- **It asks for less.** Posts already delivered are never re-requested, so repeat runs put a fraction of the load on Threads that a full re-scrape would.
- **It skips what it doesn't need.** Only public profile fields and public post metrics are collected.

**Your responsibility.** Results can still contain personal data such as usernames and public bios, which is protected under GDPR and comparable laws worldwide. Do not collect or process personal data without a legitimate basis for doing so, and make sure your intended use complies with the law in your jurisdiction and with Threads' own terms. If you are unsure whether your use case qualifies, consult your lawyer.

### Disclaimer

This is an **unofficial** actor. It is an independent tool and is **not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc., Instagram, or Threads**. All trademarks are the property of their respective owners.

# Actor input Schema

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

Profiles to watch. Accepts @handles, plain usernames or full profile URLs.

## `onlyNewPosts` (type: `boolean`):

Return only posts that appeared since your last run. Turn off to get the latest posts every time. Your first run always returns everything, because there is nothing to compare against yet.

## `includeEngagementDelta` (type: `boolean`):

Include how much each post's likes, replies, reposts and quotes moved since the previous run.

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

Upper limit of posts read per profile. Public profile pages expose a limited window of recent posts.

## `skipReplies` (type: `boolean`):

Exclude posts that are replies to someone else, keeping only original posts.

## `maxConcurrency` (type: `integer`):

How many profiles to check at the same time.

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

Proxy used to reach Threads. The default works for most cases.

## Actor input object example

```json
{
  "usernames": [
    "@zuck"
  ],
  "onlyNewPosts": true,
  "includeEngagementDelta": true,
  "maxPostsPerProfile": 25,
  "skipReplies": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "usernames": [
        "@zuck",
        "@mosseri"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ntriqpro/threads-profile-monitor").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",
        "@mosseri",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ntriqpro/threads-profile-monitor").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",
    "@mosseri"
  ]
}' |
apify call ntriqpro/threads-profile-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ntriqpro/threads-profile-monitor"
        }
    }
}

```

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/PsXs8vvq4r6zNSPu1/builds/uh3eyScrPsy1foXiK/openapi.json
