# Social Media Post Scraper - 5 Platforms (`nooesc/social-media-post-metrics`) Actor

Refresh Instagram, TikTok, Facebook, YouTube and X post metrics in one run. Browserless scraping runs on our infrastructure—no social login or proxy setup. From $1 per 1,000 successful snapshots, with Actor platform usage included. JSON/CSV exports.

- **URL**: https://apify.com/nooesc/social-media-post-metrics.md
- **Developed by:** [NooEsc](https://apify.com/nooesc) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 successful tiktok posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### Five platforms. One integration. We handle the infrastructure.

Refresh public Instagram, TikTok, Facebook, YouTube and X post metrics through our independently hosted SIN backend.

Our purpose-built, browserless HTTP collectors do the scraping on our infrastructure. The lightweight Apify Actor submits your requests and delivers the results—no customer-managed scraping browsers, proxies, or social accounts.

**Predictable pricing:** $1 per 1,000 successful Instagram, TikTok or X snapshots, and $2 per 1,000 Facebook or YouTube snapshots. Actor platform usage is included. Invalid, failed and unavailable posts have no successful-result charge.

Built for recurring campaign monitoring, with consistent fields, observation timestamps and explicit availability states. Refresh on demand or through scheduled workflows, subject to run limits, available capacity and upstream platform restrictions.

#### Operational visibility—not just promises

The dashboard below shows SIN processing **410,143 account and post snapshots during the displayed seven-day window**, with a **98.2% provider-outcome success rate** and **5-second worker p95 latency**.

These are internal, aggregate operating measurements—not an uptime SLA, a guarantee for every platform, or the completion time of a full Apify run.

![SIN internal dashboard: 410,143 account and post snapshots over the displayed seven-day window, 98.2% provider-outcome success and 5-second worker p95.](https://api.apify.com/v2/key-value-stores/J45j8OksAaZYIULYn/records/sin-dashboard-2026-09-10.png?v=1)

*Dashboard supplied September 10, 2026. This is a historical operating snapshot, not a live status feed or a comparative speed benchmark.*

#### What this Actor does

This is a **known-post metrics refresher**, powered by SIN. It does not search for posts, crawl profiles, collect comments, download video, or access private content. Platform changes and access restrictions can affect individual results; unsupported metrics are `null`, never made-up zeros.

Use it to update an influencer campaign spreadsheet, feed a social analytics dashboard, or compare available engagement metrics across a list of public posts. One dataset uses the same field names across platforms, so your application does not need five different output parsers.

### Quick start

1. Click **Try for free** or open the Actor in Apify Console. Result charges still follow the Pricing tab.
2. Paste a few public **post URLs**, set a small result limit and your run spending limit, then click **Start**.
3. Open the run's dataset to inspect results. Export JSON, CSV or Excel; inspect `status` and `observedAt` before using the metrics.

```json
{
  "urls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw"
  ],
  "maxResults": 1
}
```

Add your Instagram `/p/`, `/reel/` or `/tv/` URLs; TikTok `/video/` or `/photo/` URLs; Facebook post/reel/video URLs; YouTube video/Shorts URLs; and X/Twitter `/status/` URLs to the same list. Use expanded post URLs, not profile pages or opaque share links such as `vm.tiktok.com` or `fb.watch`.

The Actor accepts up to **1,000 input URLs per run**. Duplicate canonical posts within that run are removed before processing and charged only once. `maxResults` caps unique input outcomes, including invalid/unavailable outcomes. Inputs beyond that limit are not processed. Run order is retained in the final summary; the dataset streams completed results as they arrive.

| Input platform | Accepted post URL shapes |
| --- | --- |
| Instagram | `instagram.com/p/CODE/`, `/reel/CODE/`, `/tv/CODE/` |
| TikTok | `tiktok.com/@handle/video/ID`, `/photo/ID` |
| Facebook | Expanded post, reel or video URLs |
| YouTube | `youtube.com/watch?v=ID`, `/shorts/ID` |
| X / Twitter | `x.com/handle/status/ID`, `twitter.com/handle/status/ID` |

### Pricing

Only successfully delivered, newly observed post results with at least one usable metric generate a platform result event:

| Platform | Per successful post | Per 1,000 successful posts |
| --- | ---: | ---: |
| Instagram | $0.001 | $1.00 |
| TikTok | $0.001 | $1.00 |
| Facebook | $0.002 | $2.00 |
| YouTube | $0.002 | $2.00 |
| X / Twitter | $0.001 | $1.00 |

Invalid URLs, failures, unavailable/deleted/private posts, and timed-out outcomes have **no successful-result charge**. A fresh result may have some `null` metrics and is still chargeable when at least one metric is present; the Actor does not promise every metric for every post. No separate SIN account or subscription is needed. The pricing tab and the prices attached to your run are authoritative.

The Actor checks your Apify run spending limit before admitting more work and before charging. If the remaining budget cannot cover the next post, remaining inputs receive `budget_exceeded`. A repeated request in a **new run** is a new refresh and can be charged again; resuming the same interrupted run preserves billing identities.

For example, 200 successful posts from each platform (1,000 total) generate **$1.40 in result charges**. This is a cost example, not a promise that every input succeeds. Actor platform usage is included in this Actor's pricing; your Apify subscription and account limits still apply.

### Output

Results appear in the default dataset, available as JSON, CSV, or Excel using Apify's export controls. The default key-value store's `OUTPUT` record contains the run summary and canonical deduplicated result list.

Illustrative output (not a claim about a particular live post):

```json
{
  "resultId": "stable-identity-within-this-run",
  "inputIndex": 0,
  "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "platform": "youtube",
  "status": "succeeded",
  "availability": "available",
  "fresh": true,
  "observedAt": "2026-09-09T12:00:00.000Z",
  "postedAt": null,
  "creator": { "username": "example", "platformId": null },
  "caption": null,
  "imageUrl": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
  "metrics": { "views": 123456, "likes": 100, "comments": 5, "shares": null, "bookmarks": null },
  "precision": { "views": null, "likes": null, "comments": null, "shares": null, "bookmarks": null },
  "errorCode": null
}
```

- `observedAt` is when SIN observed the data, not the Actor start time. Fresh successful results must have an observation timestamp at or after their refresh was requested.
- `precision` carries the scraper's explicit evidence when available, such as `exact`, `exact_embedded_counts`, or `display_rounded`. `null` means precision was not explicitly established; it is **not** an exactness guarantee.
- Missing, hidden, unsupported, negative, and unsafe-integer metrics become `null`. A genuine reported zero stays zero.
- `imageUrl` is the post image or video thumbnail when available, otherwise `null`. The matching cached image is preferred; the current source URL is used while caching is pending and may expire. Images never delay metric delivery. Older runs may omit this additive field; failures and unavailable results do not return old images.
- `status` is `succeeded`, `unavailable`, `failed`, `invalid`, `timed_out`, `budget_exceeded`, or `canceled`. `availability` separately distinguishes `available`, `deleted`, `not_found`, `private`, and `unavailable` when confirmed.
- Unavailable results do not substitute old metrics and pretend they are current. A failed scrape is not automatically called deleted.
- Malformed inputs retain their `inputIndex`, but their URL is `null` to avoid accidentally echoing credentials or arbitrary private strings.
- `resultId` is stable within one run. If a network interruption leaves an ambiguous dataset append, deduplicate exports by this ID or use the `OUTPUT` record.

### Timing and limitations

SIN processes small batches with modest read concurrency. The Actor waits up to ten minutes total before returning `timed_out` outcomes; set an Apify run timeout of at least 12 minutes to leave time for final delivery. Provider throttling, inaccessible content, and incomplete platform responses can still occur. No fixed speed or success-rate guarantee is implied.

Aborting a run stops new submissions and polling. Work already admitted to SIN may finish there: SIN currently has no public operation-cancellation endpoint. This Actor does not schedule recurring refreshes.

Use this Actor only for content you are authorized to collect, and comply with applicable law and platform requirements. Results can contain public creator identifiers and captions; handle exported data responsibly. Use the Actor's Issues tab for support and include the Apify run URL, not credentials or private data.

### Use the API or connect your workflow

Open this Actor's **API** tab for ready-made API requests and SDK examples. Use the same `urls` and `maxResults` JSON shown above; the authentication there is your **Apify** token, not a social account or SIN key. Keep tokens out of shared code and support messages.

For a spreadsheet workflow: collect campaign post links, run the Actor, export CSV, and join results to your sheet by `url`. Preserve the observation time when comparing repeated runs. This Actor returns snapshots, not a built-in campaign history or engagement-growth calculation.

### Which Actor should I use?

- Already have post URLs? You are in the right place for post metrics.
- Need bios and follower counts? Use [Social Media Profile Scraper](https://apify.com/nooesc/social-media-account-profiles).
- Need the actual comment text, not just a count? Use [Social Media Comments Scraper](https://apify.com/nooesc/social-media-public-comments).
- Have account URLs and need recent posts? Use [Recent Posts Scraper](https://apify.com/nooesc/social-media-recent-account-posts) for Instagram, TikTok and X.

### Support

Built by **NooEsc**, powered by SIN. Open the [Issues tab](https://apify.com/nooesc/social-media-post-metrics/issues) with your run URL, platform, and expected versus actual result. Never post tokens, cookies or private data. Start with a small sample to confirm the fields you need before scaling up.

# Actor input Schema

## `urls` (type: `array`):

1–1000 Instagram posts/reels, TikTok video/photo URLs, Facebook posts/reels, YouTube videos/Shorts, or X status URLs. Duplicate posts are charged only once within the run. Use expanded URLs, not vm.tiktok.com, fb.watch or other opaque share links.

## `maxResults` (type: `integer`):

Stop after this many unique input outcomes. Invalid/unavailable outcomes are included in this limit but incur no successful-result charge. The run's Apify spending limit is also respected.

## Actor input object example

```json
{
  "urls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw"
  ],
  "maxResults": 1000
}
```

# Actor output Schema

## `dataset` (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 = {
    "urls": [
        "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nooesc/social-media-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 = { "urls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"] }

# Run the Actor and wait for it to finish
run = client.actor("nooesc/social-media-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 '{
  "urls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw"
  ]
}' |
apify call nooesc/social-media-post-metrics --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nooesc/social-media-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/sHCadk1wBE1J4lT8V/builds/2uyJZ1LCYO4NngJ22/openapi.json
