# Threads Metrics Scraper (`chronometrica/threads-metrics-scraper`) Actor

Track public Threads post views, likes, replies, reposts, quotes, and shares from known post URLs. Get one clean snapshot row per attempted URL. No login required.

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

## Pricing

from $1.75 / 1,000 threads post metric snapshots

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 Metrics Scraper

### 📊 What does Threads Metrics Scraper do?

Threads Metrics Scraper collects current public engagement counts from known Threads post URLs. It returns clean snapshot rows for monitoring, reporting, research, and scheduled data work.

Each dataset row is one attempted public Threads post URL. Successful rows include stable post identity, public reply and quote links when available, text, author, date, media facts, views, likes, replies, reposts, quotes, shares, and precision labels. Failed inputs return a clear status row.

The Actor reads logged-out public Threads pages. It does not log in, use account details, access private posts, or bypass access controls.

With Threads Metrics Scraper, you can:

- 📈 Track public post engagement over time.
- 🆔 Resolve stable post IDs and canonical URLs.
- 📊 Collect views, likes, replies, reposts, quotes, and shares.
- 🎯 Tell exact counts from unavailable counts.
- 📦 Send snapshot rows to spreadsheets, databases, and automation tools.

### 📦 What Threads metric data can I extract?

| Data group            | Example fields                                             |
| --------------------- | ---------------------------------------------------------- |
| 🆔 Input and identity | `inputUrl`, `postId`, `postCode`, `postUrl`                |
| 🔗 Relationships      | `rootPostId`, `parentPostId`, `quotedPostId`, `replyDepth` |
| 🧾 Content and author | `publishedAt`, `text`, `authorUsername`, `authorProfileId` |
| 🎞️ Media              | `mediaType`, `mediaCount`, `mediaWidth`, `hasAudio`        |
| 📊 Metrics            | `views`, `likes`, `replies`, `reposts`, `quotes`, `shares` |
| 🎯 Precision          | `viewsPrecision`, `likesPrecision`, `repliesPrecision`     |
| 🚦 Status             | `status`, `statusReason`, `observedAt`                     |

Missing public counts stay `null` with `unavailable` precision. The Actor uses zero only when Threads returns zero.

### ⚙️ Can I use this Actor through an API?

Yes. Run the Actor in Apify Console or use it through:

- Apify API
- Python SDK
- Node.js SDK
- Webhooks
- Scheduled runs
- Apify integrations

This makes the Actor useful for metric monitors, campaign reports, dashboards,
warehouse loads, and scheduled snapshots.

### 🎯 Why collect Threads post metrics?

| Use case              | How the data helps                       |
| --------------------- | ---------------------------------------- |
| 📈 Post monitoring    | Save dated engagement snapshots.         |
| 📣 Campaign reporting | Compare public post response over time.  |
| 🕵️ Competitor review  | Review public engagement on known posts. |
| 🧱 Data products      | Load one stable snapshot row per URL.    |

### 💵 Pricing Event

Check the **Pricing** tab for the current price. Under pay-per-event pricing,
one `threads-post-metric` event means one successful metric row. Invalid,
unavailable, and failed rows do not use this event.

### 🚀 How do I use Threads Metrics Scraper?

1. Create or log in to your Apify account.
2. Open **Threads Metrics Scraper**.
3. Enter one or more public Threads post URLs.
4. Click **Start**.
5. Open the **Output** tab to inspect the dataset and run summary.
6. Download the data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

### ⬇️ Input

The main input is `postUrls`.

#### 🔗 Threads post URLs

```json
{
  "postUrls": ["https://www.threads.com/@threads/post/DcBlkTQESOw"]
}
```

#### 🎛️ Settings

| Setting    | What it controls                                                                                                                          |
| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `postUrls` | One to 100 public Threads post URLs. Each URL creates one attempted row and can add run time and cost. Tracking query values are removed. |

### ⬆️ Output sample

Results are stored in the default dataset. Each result is one attempted public
Threads post metric snapshot.

```json
{
  "platform": "threads",
  "inputUrl": "https://www.threads.com/@threads/post/DcBlkTQESOw",
  "postId": "3963614369355473840",
  "postCode": "DcBlkTQESOw",
  "postUrl": "https://www.threads.com/@threads/post/DcBlkTQESOw",
  "isReply": false,
  "rootPostId": null,
  "rootPostCode": null,
  "rootPostUrl": null,
  "rootAuthorProfileId": null,
  "parentPostId": null,
  "parentPostCode": null,
  "parentPostUrl": null,
  "parentAuthorProfileId": null,
  "replyDepth": null,
  "isQuotePost": false,
  "quotedPostId": null,
  "quotedPostCode": null,
  "quotedPostUrl": null,
  "quotedAuthorProfileId": null,
  "authorProfileId": "63082166531",
  "authorProfileUrl": "https://www.threads.com/@threads",
  "authorUsername": "threads",
  "authorDisplayName": "Threads",
  "authorVerified": true,
  "publishedAt": "2026-08-14T13:41:14.000Z",
  "text": "Example public post text",
  "mediaType": "text",
  "mediaCount": 0,
  "mediaWidth": null,
  "mediaHeight": null,
  "hasAudio": null,
  "videoDurationSeconds": null,
  "views": 213000,
  "likes": 1167,
  "replies": 135,
  "reposts": 48,
  "quotes": 7,
  "shares": 11,
  "viewsPrecision": "rounded_display",
  "likesPrecision": "exact",
  "repliesPrecision": "exact",
  "repostsPrecision": "exact",
  "quotesPrecision": "exact",
  "sharesPrecision": "exact",
  "status": "ok",
  "statusReason": null,
  "observedAt": "2026-08-16T12:00:00.000Z"
}
```

#### 📌 Run summary

The `OUTPUT` record reports:

- inputs received;
- dataset, useful, and billable row counts;
- duplicates skipped;
- target status counts; and
- the stop reason.

### 🎯 Status and quality fields

Each count has a matching precision field. `exact` means Threads exposed a
typed full number. `exact_display` means Threads showed a full number.
`rounded_display` means Threads showed a compact value such as `213K`.
`unavailable` means Threads did not expose the count.

`status` shows the outcome for each attempted URL. `statusReason` explains a
non-`ok` result. Missing public counts stay `null`. They do not become zero.

### 🔒 Source boundary

The Actor reads public logged-out Threads post pages. It stops when Threads asks for login or an access check.

### ⚠️ Limits and interpretation

- Public counts can change after collection.
- Threads can hide a count or page at any time.
- Missing counts are not zero.
- Repeated runs create separate dated snapshots.
- Reply and quote fields stay `null` when the public post page does not expose a proven relationship.
- `replyDepth` is `1` for a direct reply. It increases for each proven parent level.
- Media width and height describe the primary attached media.
- Video duration stays `null` for non-video posts and when Threads does not expose it.
- Repost relationships are not included because a public repost URL resolves to the original post.
- A failed public page is not proof that the post does not exist.

### ❓ FAQ

#### Does this Actor need login details or an API key?

No. It reads public logged-out Threads pages.

#### Why is a metric `null`?

Threads did not expose that count on the public page during the run. Check its precision field and row status.

#### Can I use this Actor on a schedule?

Yes. Each row has `observedAt`, so repeated runs form a time series.

### ⚖️ Is it legal to scrape public Threads data?

This Actor collects data available on logged-out public Threads pages. You are
responsible for making sure your use follows applicable laws, platform terms,
and privacy rules.

Threads is a trademark of its owner. This Actor is independent and is not
affiliated with, endorsed by, or sponsored by Threads or Meta.

### 🛟 Support

Send the run ID, input URL, expected metric, observed output, and the time of
the run. Include one affected dataset row when possible.

# Actor input Schema

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

Enter 1 to 100 public Threads post URLs. Each URL creates one attempted row and can add run time and cost.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.threads.com/@threads/post/DcBlkTQESOw"
  ]
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "postUrls": [
        "https://www.threads.com/@threads/post/DcBlkTQESOw"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/threads-metrics-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 = { "postUrls": ["https://www.threads.com/@threads/post/DcBlkTQESOw"] }

# Run the Actor and wait for it to finish
run = client.actor("chronometrica/threads-metrics-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 '{
  "postUrls": [
    "https://www.threads.com/@threads/post/DcBlkTQESOw"
  ]
}' |
apify call chronometrica/threads-metrics-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chronometrica/threads-metrics-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/0rGv5cpts0tIydM8d/builds/yMHn3HRlg4DebtpEV/openapi.json
