# Instagram Metrics Scraper - Posts, Reels & Profiles (`chronometrica/instagram-metrics-scraper`) Actor

Collect clean metric rows for public Instagram posts, reels, carousels, and recent profile content. Get views, plays, likes, comments, collaborators, captions, IDs, media links, and status fields without fake zeroes.

- **URL**: https://apify.com/chronometrica/instagram-metrics-scraper.md
- **Developed by:** [Chronometrica](https://apify.com/chronometrica) (community)
- **Categories:** Social media
- **Stats:** 36 total users, 24 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 instagram post metrics

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Instagram Metrics Scraper

### 📊 What does Instagram Metrics Scraper do?

Instagram Metrics Scraper collects public metrics from Instagram post URLs,
reel URLs, carousel URLs, shortcodes, profile URLs, and `@handles`.

Use it when you need clean Instagram rows for creator research, influencer
reporting, campaign tracking, competitor monitoring, social analytics,
dashboards, warehouse loads, and scheduled metric snapshots.

The Actor returns flat CSV/API-friendly rows with Instagram views, plays, likes,
comments, public owner/collaborator context, IDs, captions, media links,
duration, status fields, and count availability details.

This Actor does not log in, use cookies, scrape private Instagram content,
collect comment text, scrape stories, scrape follower lists, or bypass
Instagram access controls. It only returns data available from public Instagram
content at run time.

With Instagram Metrics Scraper, you can:

- 📈 Track public Instagram post, reel, carousel, and image performance.
- 👤 Discover recent public content from Instagram profile URLs and `@handles`.
- 👀 Collect public views, plays, Instagram plays, likes, and comments when
  available.
- 🤝 Capture public owner and collaborator profiles in one clean collaboration
  field.
- 🆔 Extract useful IDs such as `postId`, `shortCode`, `profileId`, `fbPostId`,
  `fbOwnerId`, and `carouselIds`.
- 🎬 Save captions, publish time, media type, media links, video duration, and
  audio presence when available.
- 🎯 Check metric availability instead of treating every blank count as zero.
- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

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

Each dataset row represents one public Instagram content item with at least one
public post metric.

| Data group       | Example fields                                                                                 |
| ---------------- | ---------------------------------------------------------------------------------------------- |
| 🔗 Source        | `platform`, `inputUrl`, `postUrl`, `status`, `statusReason`, `scrapedAt`                       |
| 🆔 Post identity | `postId`, `fbPostId`, `shortCode`, `mediaType`, `publishedAt`                                  |
| 🧾 Post content  | `title`, `caption`, `downloadUrl`, `carouselIds`, `videoDurationSeconds`, `hasAudio`           |
| 👤 Creator       | `profileId`, `fbOwnerId`, `profileHandle`, `profileUrl`, `profileVerified`, `profileAvatarUrl` |
| 📊 Metrics       | `views`, `plays`, `playsInstagram`, `likes`, `comments`                                        |
| 🎯 Count quality | `postMetricStatus`, `profileMetricStatus`                                                      |
| 🤝 Collaboration | `collaborationCount`, `collaborationProfiles`                                                  |

Metric availability depends on what Instagram exposes publicly for each URL or
profile. If a public count is unavailable, the Actor keeps it unavailable
instead of filling it with a fake zero.

For reels and video posts, `views`, `plays`, and `playsInstagram` are kept as
separate public counters. Some URLs expose one count but not the others, so
missing values stay missing instead of being guessed or mixed.

`collaborationProfiles` contains the public owner and confirmed collaborators
when available. Tagged accounts are not treated as collaborators by default.

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

Yes. You can run Instagram Metrics Scraper manually in Apify Console or use it
through:

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

This makes it useful for social media dashboards, influencer lists, competitive
intelligence, creator databases, campaign reporting, data warehouses, and
automated market research workflows.

### 🎯 Why scrape Instagram post and reel metrics?

Instagram public metrics help you understand which creators, posts, reels,
campaigns, products, and competitors are gaining traction.

| Use case                     | How Instagram metric data helps                                                      |
| ---------------------------- | ------------------------------------------------------------------------------------ |
| 📈 Track creator performance | Monitor public engagement across known creator post and reel URLs.                   |
| 🧑‍🎤 Research influencers      | Compare recent content performance, captions, collaborators, and profile context.    |
| 📣 Measure campaigns         | Collect repeatable snapshots for campaign posts, reels, and creator deliverables.    |
| 🕵️ Monitor competitors       | Track public metrics for competing brands, products, and creator accounts.           |
| 🤝 Audit collaborations      | See public owner and collaborator profiles in a single normalized field.             |
| 📊 Build reporting workflows | Feed normalized Instagram metrics into dashboards, spreadsheets, APIs, and BI tools. |
| 🔎 Audit availability        | Separate available, unavailable, blocked, invalid, and failed rows cleanly.          |

### 💵 How much does scraping Instagram metrics cost?

Instagram Metrics Scraper uses Pay Per Event pricing. One billable event is one
Instagram metric row written to the default dataset.

Every direct content input is processed by default. Use the optional `maxItems`
setting only when you want a total row cap. Use `maxItemsPerProfile` to control
profile discovery. Start with a small batch of 3 to 10 URLs when testing a new
URL list or profile set.

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

1. Create or log in to your Apify account.
2. Open **Instagram Metrics Scraper**.
3. Choose **Auto-detect URLs, handles, and shortcodes**, **Post and reel URLs
   only**, or **Profile discovery only**.
4. Paste Instagram post URLs, reel URLs, profile URLs, `@handles`, shortcodes,
   or a mix of them.
5. Set an optional total row cap, or leave it blank to process every direct input.
6. Leave the default settings for your first run.
7. Click **Start**.
8. Open the **Output** tab to inspect the dataset and run summary.
9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

### ⬇️ Input

The main input is `startUrls`. Paste at least one Instagram content URL, profile
URL, `@handle`, or shortcode. `https://` is optional for normal Instagram URLs.

In **Auto-detect URLs, handles, and shortcodes** mode, you can paste direct
content URLs and profile inputs into the same list. Every direct content input
is processed unless you set an optional total row cap.

```json
{
  "mode": "contentUrls",
  "startUrls": ["https://www.instagram.com/reel/DIwcCZgxVZP/"]
}
```

#### 🔗 Instagram URLs and handles

Supported input shapes include:

```text
https://www.instagram.com/reel/CODE1234567/
https://www.instagram.com/p/CODE7654321/
https://www.instagram.com/tv/CODE2222222/
www.instagram.com/reel/CODE1234567/
CODE1234567
https://www.instagram.com/mrbeast/
@mrbeast
```

Use direct URLs when you need exact known media. Use profile discovery when you
want recent public content from a creator, brand, or competitor profile.

#### 👤 Profile discovery

Use profile discovery when you want the Actor to find recent public posts and
reels from an Instagram profile before collecting metrics.

```json
{
  "mode": "profileUrls",
  "startUrls": ["@mrbeast"],
  "maxItemsPerProfile": 10
}
```

Use `maxItemsPerProfile` to control how many public content URLs are discovered
from each profile input. Set `maxItems` only when you also want an optional cap
across the whole run.

#### 🎛️ Settings

| Option               | What it does                                                                                       |
| -------------------- | -------------------------------------------------------------------------------------------------- |
| `mode`               | `auto` to detect mixed inputs, `contentUrls` for content URLs only, or `profileUrls` for profiles. |
| `startUrls`          | Instagram content URLs, shortcodes, profile URLs, or `@handles`.                                   |
| `maxItems`           | Optional total row cap. Leave blank to process every direct content input.                         |
| `maxItemsPerProfile` | Maximum public content URLs to discover from each profile input.                                   |

### ⬆️ Output sample

The results are stored in the default dataset. Each result is one Instagram
metric row.

```json
{
  "platform": "instagram",
  "inputUrl": "https://www.instagram.com/reel/CODE1234567/",
  "postUrl": "https://www.instagram.com/reel/CODE1234567/",
  "postId": "3922329444068919711",
  "fbPostId": "18066137273686492",
  "shortCode": "CODE1234567",
  "mediaType": "reel",
  "title": null,
  "caption": "Example campaign reel #launch",
  "publishedAt": "2026-06-23T13:00:00.000Z",
  "profileId": "123456789",
  "fbOwnerId": "17841400000000000",
  "profileHandle": "examplebrand",
  "profileUrl": "https://www.instagram.com/examplebrand/",
  "profileVerified": true,
  "profileAvatarUrl": "https://scontent.cdninstagram.com/avatar.jpg",
  "downloadUrl": "https://scontent.cdninstagram.com/example.mp4",
  "carouselIds": null,
  "videoDurationSeconds": 42.1,
  "hasAudio": true,
  "views": 1234567,
  "plays": 1234999,
  "playsInstagram": 1234888,
  "likes": 23456,
  "comments": 345,
  "postMetricStatus": [
    {
      "metric": "views",
      "value": 1234567,
      "status": "present",
      "precision": "exact",
      "rawValue": 1234567
    }
  ],
  "collaborationCount": 1,
  "collaborationProfiles": [
    {
      "id": "123456789",
      "handle": "examplebrand",
      "url": "https://www.instagram.com/examplebrand/",
      "role": "owner"
    }
  ],
  "profileMetricStatus": [
    {
      "metric": "profileFollowersCount",
      "value": null,
      "status": "unavailable",
      "precision": "unavailable",
      "rawValue": null
    }
  ],
  "status": "ok",
  "statusReason": null,
  "scrapedAt": "2026-06-24T15:00:00.000Z"
}
```

`inputUrl` preserves the input that produced the row. `postUrl` is the resolved
public Instagram content URL.

When a saved row has a missing public metric, that metric is returned as `null`,
not `0`. Inputs with no public `views`, `plays`, `playsInstagram`, `likes`, or
`comments` are reported in `OUTPUT` and are not saved as dataset rows.

### 🎯 Metric status

Instagram can expose exact, rounded, delayed, hidden, or unavailable counters
depending on content type and public visibility. The status fields make that
visible:

- `present`: the metric was found.
- `unavailable`: Instagram did not expose the metric publicly for that row.
- `not_attempted`: the metric was not attempted for that row.
- `exact`: the public value appeared as a full integer.
- `display_rounded` or `likely_rounded`: the public value was rounded.

This lets you filter rows without guessing whether a blank value means zero.

### 👀 Views and plays

For reels and video posts, the Actor keeps video count families separate:

- `views`
- `plays`
- `playsInstagram`

These fields may differ or appear independently. Keeping them separate makes the
dataset safer for analytics and prevents one public count from silently filling
another.

### 🤝 Collaborations

`collaborationProfiles` contains the public owner and confirmed collaborators
for a post when available. Each profile includes:

- `id`
- `handle`
- `url`
- `role`, either `owner` or `collaborator`

Tagged accounts are not treated as collaborators by default.

### 🚦 Status values

Saved rows use explicit statuses, and no-metric or failed inputs are summarized
in `OUTPUT`:

| Status                       | Meaning                                                                                            |
| ---------------------------- | -------------------------------------------------------------------------------------------------- |
| `ok`                         | Public content was resolved and at least one useful public metric or metadata field was collected. |
| `resolved_no_public_metrics` | The input resolved, but public metric fields were not exposed for that item.                       |
| `invalid_input`              | The input was not a valid Instagram URL, shortcode, or handle.                                     |
| `unsupported_url`            | The URL is an Instagram surface this Actor does not support.                                       |
| `blocked_or_challenged`      | Instagram returned a login, challenge, unavailable, or blocked response.                           |
| `failed`                     | The input could not be resolved after retry.                                                       |

Runs with setup issues, zero discovered profile content, blocked responses, or
no exposed public post metrics finish with a clear `OUTPUT` summary instead of
ending as failed runs. Check `OUTPUT.stopReason`, `OUTPUT.statusMessage`,
`OUTPUT.skippedNoPostMetricRows`, and `OUTPUT.validationErrors` when no metric
rows are saved.

### ⚠️ Notes and limitations

- Public metrics can be hidden, rounded, delayed, or unavailable.
- Reels and video posts may expose different view and play counters.
- Image posts and carousels do not always have video-specific metrics.
- Profile discovery returns recent public content and may return fewer rows than
  requested.
- Private, deleted, login-only, age-gated, or restricted content returns status
  rows instead of private data.
- Media links can expire or become unavailable after collection.
- This Actor is not affiliated with Instagram or Meta.

### 🔗 Related social media scrapers

Combine this Actor with our other social media scrapers for discovery,
performance tracking, comment research, and transcript collection.

#### Instagram

- [Instagram Comments Scraper](https://apify.com/chronometrica/instagram-comments-scraper)
  — collect public comments, authors, dates, likes, and reply counts from posts
  and Reels.

#### Facebook

- [Facebook Metrics Scraper](https://apify.com/chronometrica/facebook-metrics-scraper)
  — collect public post, Reel, video, and profile/page metrics.
- [Facebook Comments Scraper](https://apify.com/chronometrica/facebook-comments-scraper)
  — collect public comments, replies, authors, dates, and reactions from known
  Facebook content.

#### TikTok

- [TikTok Search Scraper](https://apify.com/chronometrica/tiktok-search-scraper)
  — find public TikTok videos, creators, and metrics by keyword.
- [TikTok Metrics Scraper](https://apify.com/chronometrica/tiktok-metrics-scraper)
  — collect public video, profile, engagement, hashtag, and music data.
- [TikTok Comments Scraper](https://apify.com/chronometrica/tiktok-comments-scraper)
  — collect public comments, replies, authors, likes, and thread links.
- [TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper)
  — extract public caption text and timestamped segments from TikTok videos.

#### YouTube

- [YouTube Search Scraper](https://apify.com/chronometrica/youtube-search-scraper)
  — find public videos, Shorts, channels, and metrics by keyword.
- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)
  — collect public video, Short, channel, and engagement metrics.
- [YouTube Comments Scraper](https://apify.com/chronometrica/youtube-comments-scraper)
  — collect public comments, replies, authors, likes, pins, and creator hearts.
- [YouTube Transcript Scraper](https://apify.com/chronometrica/youtube-transcript-scraper)
  — extract public captions as clean text, timestamps, SRT, VTT, or LLM-ready
  output.

# Actor input Schema

## `mode` (type: `string`):

Choose how to use the inputs below. Auto-detect accepts post URLs, reel URLs, profile URLs, @handles, and shortcodes in the same list.

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

Paste public Instagram post URLs, reel URLs, carousel URLs, profile URLs, @handles, or shortcodes. Every direct content input is processed unless you set an optional total row cap.

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

Backward-compatible hidden field for API users that send Instagram content URLs as urls.

## `shortcodes` (type: `array`):

Backward-compatible hidden field for API users that send Instagram shortcodes directly.

## `profileUrls` (type: `array`):

Backward-compatible hidden field for API users that send Instagram profile URLs or @handles as profileUrls.

## `maxItems` (type: `integer`):

Optional maximum metric rows across direct content and profile discovery. Leave blank to process every public item the Actor can find. Large values such as 999999 are accepted.

## `includeProfileSnapshot` (type: `boolean`):

Backward-compatible hidden field for older API users.

## Actor input object example

```json
{
  "mode": "auto",
  "startUrls": [
    "https://www.instagram.com/reel/DIwcCZgxVZP/"
  ],
  "urls": [],
  "shortcodes": [],
  "profileUrls": [],
  "includeProfileSnapshot": true
}
```

# 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://www.instagram.com/reel/DIwcCZgxVZP/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/instagram-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 = { "startUrls": ["https://www.instagram.com/reel/DIwcCZgxVZP/"] }

# Run the Actor and wait for it to finish
run = client.actor("chronometrica/instagram-metrics-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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://www.instagram.com/reel/DIwcCZgxVZP/"
  ]
}' |
apify call chronometrica/instagram-metrics-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=chronometrica/instagram-metrics-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Y7Ib4ARpUHw5Ue8op/builds/4xgigD10DLVPfpkOg/openapi.json
