# Instagram Reel Performance Tracker (`data-slayer/instagram-reel-performance-tracker`) Actor

Monitor public Instagram Reel views, likes, and comments over time. Compare real observations and export clear deltas without turning unavailable metrics into zeros.

- **URL**: https://apify.com/data-slayer/instagram-reel-performance-tracker.md
- **Developed by:** [Data Slayer](https://apify.com/data-slayer) (community)
- **Categories:** Social media, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 completed reel checks

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

## Instagram Reel Performance Tracker

Track how public Instagram Reels change over time, with real observation timestamps, metric availability, and deltas you can send to a spreadsheet, dashboard, or campaign workflow.

### Watch the demo

YouTube video coming soon.

### What you get

Each completed Reel check produces one structured observation containing:

- The submitted and canonical Reel URL
- Reel code and stable media identity when available
- Current and previous observation timestamps
- Time elapsed between observations
- Available views, likes, and comments
- Previous values and numeric deltas when both observations contain the metric
- Per-metric availability, so missing counts are never confused with zero
- First-observation and changed/unchanged indicators
- Clear status for unavailable, private, deleted, restricted, or temporarily failed content when the public response supports that distinction
- A stable observation ID for downstream deduplication

### How it works

1. Add one or more public Instagram Reel URLs.
2. Choose a monitor name such as `campaign-reels` or `competitor-watch`.
3. Run the Actor once to create the first real observation.
4. Save the input as an Apify Task and attach an Apify Schedule.
5. Reuse the same monitor name on later runs to receive prior/current comparisons and deltas.

The Actor performs one bounded pass and exits. Scheduling is handled by Apify, so there is no always-running process to manage.

### Input

| Field | Type | Required | Default | Limits | Purpose |
|---|---|---:|---|---|---|
| `reelUrls` | array of strings | Yes | None; the form shows one example | 1–100 full `https://instagram.com/reel/...` URLs; 28–500 characters each | Reels to check in this run |
| `monitorKey` | string | Yes | None; the form suggests `campaign-reels` | 3–64 lowercase letters, numbers, periods, underscores or hyphens; must start and end with a letter or number | Selects one isolated comparison history |

Example input:

```json
{
  "reelUrls": [
    "https://www.instagram.com/reel/DdRf9lktEb1/"
  ],
  "monitorKey": "campaign-reels"
}
```

URLs that differ only by tracking query parameters are normalized to the same Reel and checked once. Profile URLs, post `/p/` URLs, audio pages, raw shortcodes, fragments, and non-Instagram hosts are rejected before checks begin. Unknown input fields are rejected.

Reusing the same monitor name continues that monitor's history. A different name starts an independent history. You may add or remove Reel URLs between runs: matching Reels continue, newly added Reels begin with a first observation, and omitted Reels are not checked or deleted.

### Output

The proposed output is designed to remain useful in JSON, CSV, Excel, Google Sheets, Make, Zapier, and n8n. Each completed unique Reel check creates one flat Dataset row. The `OUTPUT` key-value record contains the run summary and neutral per-input failures that produced no Dataset row.

Illustrative output shape only—the values below are examples, not a live observation:

```json
{
  "schemaVersion": 1,
  "recordType": "reel_observation",
  "observationId": "obs_example_01",
  "inputPosition": 1,
  "monitorKey": "campaign-reels",
  "inputReelUrl": "https://www.instagram.com/reel/EXAMPLE123/",
  "reelUrl": "https://www.instagram.com/reel/EXAMPLE123/",
  "reelCode": "EXAMPLE123",
  "reelId": "1234567890123456789",
  "ownerUsername": "examplebrand",
  "status": "available",
  "availabilityReason": "partially_available",
  "firstObservation": false,
  "changed": true,
  "observedAt": "2026-09-20T12:00:00Z",
  "previousObservedAt": "2026-09-20T06:00:00Z",
  "elapsedSeconds": 21600,
  "views": 10000,
  "viewsAvailability": "available",
  "viewsBasis": "public_plays",
  "previousViews": 8500,
  "previousViewsAvailability": "available",
  "previousViewsBasis": "public_plays",
  "viewsDelta": 1500,
  "likes": null,
  "likesAvailability": "unavailable",
  "previousLikes": null,
  "previousLikesAvailability": "unavailable",
  "likesDelta": null,
  "comments": 42,
  "commentsAvailability": "available",
  "previousComments": 39,
  "previousCommentsAvailability": "available",
  "commentsDelta": 3
}
```

On the first observation, all previous values and deltas are null and prior availability is `not_observed`. A missing current or previous metric produces a null delta. A genuine observed zero remains numeric zero, and a genuine count decrease produces a negative delta.

`changed` is null when no comparison can be made. Otherwise it is true when a comparable metric or availability state changed, and false when all comparable values and availability states stayed the same.

#### Run summary and failures

The `OUTPUT` record reports submitted and unique URLs, duplicates, completed/available/unavailable/failed checks, first observations, changed/unchanged/indeterminate comparisons, charged checks, charge-limit skips, Dataset row count, and neutral errors.

```json
{
  "schemaVersion": 1,
  "runId": "run_example_01",
  "monitorKey": "campaign-reels",
  "status": "partial",
  "startedAt": "2026-09-20T12:00:00Z",
  "finishedAt": "2026-09-20T12:00:09Z",
  "submittedUrls": 2,
  "uniqueReels": 2,
  "duplicateInputs": 0,
  "completedChecks": 1,
  "availableChecks": 1,
  "unavailableChecks": 0,
  "failedChecks": 1,
  "firstObservations": 0,
  "changedChecks": 1,
  "unchangedChecks": 0,
  "indeterminateChangeChecks": 0,
  "chargedChecks": 1,
  "skippedByChargeLimit": 0,
  "datasetItemCount": 1,
  "errors": [
    {
      "inputPosition": 2,
      "inputReelUrl": "https://www.instagram.com/reel/EXAMPLE456/",
      "code": "REQUEST_TIMED_OUT",
      "message": "This Reel could not be checked before the request timed out. Try again later.",
      "retryable": true
    }
  ]
}
```

Available and definitive unavailable-content rows are completed checks. A temporary retrieval failure after bounded retries produces no Dataset row and no completed-check charge; it appears only as a neutral run-summary error.

### Billing

You pay for each completed unique Reel check, including checks where nothing changed. A definitive unavailable/private/deleted/restricted diagnostic row is also a completed check. Invalid form input, an overlap stopped before checking, or a transport failure with no result row does not create a completed-check charge.

| Tier | Completed Reel check | Actor start |
|---|---:|---:|
| Free | $0.00350 | $0.000050 |
| Bronze | $0.00300 | $0.000045 |
| Silver | $0.00250 | $0.000040 |
| Gold | $0.00200 | $0.000035 |
| Platinum | $0.00200 | $0.000035 |
| Diamond | $0.00200 | $0.000035 |

Platinum and Diamond use exactly the Gold price for every billable event. `apify-default-dataset-item` is disabled, so Dataset rows are not billed a second time. There are no add-ons.

You can set a maximum charge for every run, and the Actor stops before beginning work it cannot charge within that limit. The proposed minimum permitted maximum-charge setting is $0.01; it is not a mandatory per-run charge.

### Scheduling recommendations

- Active launch or campaign: every 1–3 hours
- Ongoing competitor monitoring: every 6–24 hours
- Long-tail content library: daily or weekly

Use intervals that match the decision you plan to make. This Actor reports observations made by your schedule; it cannot recreate performance from before the first run.

### Metric availability

Public Reel responses do not expose every metric for every Reel. Counts may be hidden, restricted, or temporarily missing. The Actor keeps the numeric value null and returns an availability label instead of silently converting missing data to zero.

Views may be represented by different public metrics. The Actor applies a documented precedence rule and reports a neutral availability and basis label. It does not claim access to private Instagram Insights.

### State and privacy

Monitor state is isolated by monitor name in storage associated with the Apify account running the Actor. State contains the observations needed for comparisons. No Instagram login or cookies are required. Customers can delete their Actor storage when they no longer need the history.

### Limitations

- Public Reels only
- No observations from before the first run
- No guarantee that every metric is available for every Reel
- Private, deleted, restricted, or unavailable content may share a general unavailable status when the public response cannot distinguish the exact cause
- Instagram can revise counts or remove content; negative deltas are preserved
- Scheduling must be configured with an Apify Task/Schedule
- This is a monitoring workflow, not Instagram's private creator Insights

### Common use cases

- Track campaign Reel momentum after launch
- Compare competitor creative performance over time
- Feed scheduled KPI updates into Sheets or a BI dashboard
- Detect when an older Reel starts gaining views again
- Preserve evidence of public metric changes for reporting

# Actor input Schema

## `reelUrls` (type: `array`):

Add 1–100 public Instagram Reel URLs. Tracking query parameters are ignored, and duplicate URLs for the same Reel are checked once.

## `monitorKey` (type: `string`):

Use the same stable name on later scheduled runs to compare with this monitor's saved observations. Use a different name for an independent history.

## Actor input object example

```json
{
  "reelUrls": [
    "https://www.instagram.com/reel/DdRf9lktEb1/"
  ],
  "monitorKey": "campaign-reels"
}
```

# Actor output Schema

## `observations` (type: `string`):

Current and prior available metrics, deltas and availability for each completed check.

## `runSummary` (type: `string`):

Completion, change, billing and neutral failure counts for this run.

# 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 = {
    "reelUrls": [
        "https://www.instagram.com/reel/DdRf9lktEb1/"
    ],
    "monitorKey": "campaign-reels"
};

// Run the Actor and wait for it to finish
const run = await client.actor("data-slayer/instagram-reel-performance-tracker").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 = {
    "reelUrls": ["https://www.instagram.com/reel/DdRf9lktEb1/"],
    "monitorKey": "campaign-reels",
}

# Run the Actor and wait for it to finish
run = client.actor("data-slayer/instagram-reel-performance-tracker").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 '{
  "reelUrls": [
    "https://www.instagram.com/reel/DdRf9lktEb1/"
  ],
  "monitorKey": "campaign-reels"
}' |
apify call data-slayer/instagram-reel-performance-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data-slayer/instagram-reel-performance-tracker"
        }
    }
}
```

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/e2lMVyEzT49ebVtzP/builds/8KhGbGGUfIzFRb2mw/openapi.json
