# X Post Metrics Scraper (`chronometrica/x-post-metrics`) Actor

Track public X post views, likes, reposts, quotes, replies, bookmarks, text, authors, and profile counts from known post URLs.

- **URL**: https://apify.com/chronometrica/x-post-metrics.md
- **Developed by:** [Chronometrica](https://apify.com/chronometrica) (community)
- **Categories:** Social media, Automation, Agents
- **Features:** Limited permissions
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 1,000 x 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?

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

## X Post Metrics Scraper

### 📊 What does X Post Metrics Scraper do?

X Post Metrics Scraper turns known public X or Twitter post URLs into clean
metric snapshots. Use it for campaign reports, creator tracking, alerts, and
scheduled history.

Each input URL creates one stable row. It can include views, likes, replies,
reposts, quotes, bookmarks, post text, author identity, and public profile
counts.

This Actor reads public logged-out X data. It does not use cookies, log in to
X, open private posts, or run keyword searches.

With X Post Metrics Scraper, you can:

- 📈 Track post engagement over time.
- 🧑‍💻 Compare creators, brands, and campaigns.
- 🔔 Send metric snapshots to alerts and dashboards.
- 🆔 Keep stable post and profile IDs for matching.
- 📦 Export clean rows to JSON, CSV, Excel, XML, RSS, or an API.

### 📦 What X post data can I extract?

One dataset row represents one attempted public X post URL.

| Data group         | Example fields                                                |
| ------------------ | ------------------------------------------------------------- |
| 🔗 Post identity   | `inputUrl`, `postUrl`, `postId`, `postType`                   |
| 🧾 Post details    | `text`, `publishedAt`                                         |
| 👤 Author          | `profileId`, `profileUrl`, `profileUsername`, `profileName`   |
| 📊 Post metrics    | `views`, `likes`, `replies`, `reposts`, `quotes`, `bookmarks` |
| 👥 Profile metrics | `profileFollowers`                                            |
| 🎯 Quality         | `postMetricStatus`, `status`, `statusReason`                  |
| 🕒 Observation     | `observedAt`                                                  |

Missing public values stay `null`. They are never changed to a made-up zero.
Metric status records show whether each value was present, unavailable, or not
attempted.

### ⚙️ Can I use X Post Metrics Scraper through an API?

Yes. Run it in Apify Console or connect it through:

- Apify API
- Python SDK
- JavaScript SDK
- Webhooks
- Scheduled Tasks
- Apify integrations

### 🎯 Why collect X post metrics?

| Use case            | How the data helps                               |
| ------------------- | ------------------------------------------------ |
| 📣 Campaign reports | Compare public results across campaign posts.    |
| 🧑‍🎨 Creator tracking | Follow post and profile growth over time.        |
| 🏷️ Brand monitoring | Watch known brand posts without manual checks.   |
| 🧱 Data pipelines   | Load stable snapshots into a sheet or warehouse. |

### 💵 Pricing event

The product is designed for pay-per-result pricing. One paid result means one
successful public post metric row. Invalid inputs and missing posts are not
billable result events.

The price ranges from $2.20 to $4.50 per 1,000 results, based on your Apify
plan. Platform usage is included. Use Apify's maximum charge setting to cap
paid results.

### 🚀 How do I use X Post Metrics Scraper?

1. Open **X Post Metrics Scraper** in Apify Console.
2. Paste one or more public X post URLs into **Post URLs**.
3. Click **Start**.
4. Open the **Output** tab.
5. Download the dataset or connect it to your workflow.

### ⬇️ Input

Paste up to 1,000 full public post URLs into `startUrls`.

```json
{
  "startUrls": ["https://x.com/OpenAI/status/2077446718728425686"]
}
```

Supported URLs contain `/status/{post ID}` and use `x.com` or `twitter.com`.
Raw post IDs, profile URLs, searches, lists, and private posts are not
supported. Duplicate URLs are checked once.

When an input URL is a repost, the row describes the original post shown by X.
`inputUrl` keeps the URL you supplied. `postUrl`, post identity, author, text,
and metrics describe the visible original post.

### ⬆️ Output sample

```json
{
  "platform": "x",
  "inputUrl": "https://x.com/OpenAI/status/2077446718728425686",
  "postUrl": "https://x.com/OpenAI/status/2077446718728425686",
  "postId": "2077446718728425686",
  "postType": "post",
  "publishedAt": "2026-07-01T12:00:00.000Z",
  "text": "Example post",
  "profileUrl": "https://x.com/OpenAI",
  "profileId": "4398626122",
  "profileUsername": "@OpenAI",
  "profileName": "OpenAI",
  "views": 1200000,
  "likes": 14000,
  "replies": 900,
  "reposts": 2100,
  "quotes": 300,
  "bookmarks": 1800,
  "postMetricStatus": [
    {
      "metric": "views",
      "status": "present",
      "precision": "exact",
      "source": "public_post"
    }
  ],
  "profileFollowers": 4200000,
  "status": "ok",
  "statusReason": null,
  "observedAt": "2026-07-17T12:00:00.000Z"
}
```

X shows plain reposts and quotes as one repost total. Add `reposts` and
`quotes` to match the displayed total.

#### 📌 Run summary

The `OUTPUT` record reports input count, unique inputs, saved rows, billable
rows, status counts, start time, finish time, and runtime.

### 🚦 Status and quality fields

- `ok`: the public post identity was proven and its snapshot was saved.
- `not_found`: the post was missing or no longer public.
- `blocked`: X did not allow the public request at that time.
- `rate_limited`: X asked the run to slow down.
- `parser_miss`: X returned data without a stable post identity.
- `invalid_input` or `unsupported_url`: the input was not a supported URL.
- `source_error`: X could not be read for another safe, known reason.

Good and failed rows use the same ordered fields. Unknown values stay `null`,
which keeps CSV imports and scheduled checks stable.

### 🔒 Source boundary

This Actor reads only data X shows without signing in. It does not use your X
account, cookies, passwords, or private tokens. It does not bypass login or
challenge screens.

### ⚠️ Limits

- Deleted, private, age-gated, region-limited, or hidden posts may fail.
- X may not show every metric on every post.
- Results are snapshots. Use a schedule to build history.
- X can change its public pages, so a later run may need an Actor update.

### ❓ FAQ

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

No. It reads logged-out public X data.

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

X did not show that value publicly for the post at run time. Check the matching
metric status record.

#### How are duplicate URLs handled?

The same normalized post URL is checked once per run.

### 🏠 Related Actors

Continue the same workflow on this platform or compare public data across
platforms.

#### Continue on X

- [X Profile Metrics Scraper](https://apify.com/chronometrica/x-profile-metrics)
  — collect public profile details, audience counts, and activity stats.
- [X Search & Discovery Scraper](https://apify.com/chronometrica/x-search-scraper)
  — find public posts and profiles by keyword.

#### Compare metrics across platforms

- [Facebook Metrics Scraper](https://apify.com/chronometrica/facebook-metrics-scraper)
  — collect public post, Reel, video, photo, and profile metrics.
- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)
  — collect public post, Reel, carousel, profile, and collaboration metrics.
- [TikTok Metrics Scraper](https://apify.com/chronometrica/tiktok-metrics-scraper)
  — collect public video, profile, engagement, hashtag, and music data.
- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)
  — collect public video, Short, channel, and engagement metrics.
- [Snapchat Spotlight Metrics Scraper](https://apify.com/chronometrica/snapchat-metrics-scraper)
  — collect public Spotlight post views, engagement, creator, and media data.

### 🛟 Support

For help, share the public post URL, run ID, expected result, and actual result.
Never share passwords, cookies, or private tokens.

Use public data in line with the law, X rules, and Apify rules. Do not use it
to harass people or build sensitive personal profiles.

# Changelog

This Actor's version history is a separate document: https://apify.com/chronometrica/x-post-metrics/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Paste up to 1,000 public X post URLs. Each URL creates one attempted metric snapshot row.

## Actor input object example

```json
{
  "startUrls": [
    "https://x.com/OpenAI/status/2077446718728425686"
  ]
}
```

# Actor output Schema

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

No description

## `output` (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 = {
    "startUrls": [
        "https://x.com/OpenAI/status/2077446718728425686"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/x-post-metrics").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 = { "startUrls": ["https://x.com/OpenAI/status/2077446718728425686"] }

# Run the Actor and wait for it to finish
run = client.actor("chronometrica/x-post-metrics").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 '{
  "startUrls": [
    "https://x.com/OpenAI/status/2077446718728425686"
  ]
}' |
apify call chronometrica/x-post-metrics --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chronometrica/x-post-metrics"
        }
    }
}
```

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/KPyLgLf82aAPfpZTX/builds/V5Fj4mAeck8IyY4z5/openapi.json
