# Instagram Reels Scraper - Plays, Views & Analytics (`scrapesage/instagram-reels-scraper`) Actor

Scrape Instagram Reels without login: exact play count, view count, likes, comments, engagement rate, duration, video URL, audio attribution, collaborators, tagged users and creator stats. Date and engagement filters run before billing. Monitor mode included.

- **URL**: https://apify.com/scrapesage/instagram-reels-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Social media, Videos, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 reel scrapeds

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/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 Reels Scraper - Plays, Views & Analytics

Scrape **Instagram Reels analytics without a login**: exact **play count**, **view count**, likes, comments, engagement rate, duration, direct video URL, audio/music attribution, collaborators, tagged users and full creator stats.

Point it at creator handles or specific Reel URLs and get an analytics-grade row per Reel. No cookies, no `sessionid`, no login - just usernames in, data out.

### Why this one

Most Reels scrapers hand you a caption and a like count. The headline metrics on a *Reels* product are **plays** and **views**, and they are usually the fields missing. This actor returns **both** - and they are genuinely different numbers (one National Geographic Reel measured **1,820,041 plays** but **423,569 views**), so getting only one of them gives you a distorted picture of reach.

| | This actor |
|---|---|
| **Play count** | ✅ exact |
| **View count** | ✅ exact |
| Likes / comments | ✅ exact (verified to 17,998,088 likes on a single Reel) |
| Engagement rate | ✅ computed against plays |
| Duration (seconds) | ✅ to 3 decimals |
| Direct video URL | ✅ |
| Audio title / artist / original-audio flag | ✅ |
| Collaborators (co-authors) | ✅ |
| Tagged users, location, hashtags, mentions | ✅ |
| Creator followers, verified, full name, bio links | ✅ |
| Date + engagement filters | ✅ applied before you are billed |
| Login required | ❌ never |

### What you get per Reel

`reelUrl` · `shortCode` · `mediaId` · **`playCount`** · **`viewCount`** · `likeCount` · `commentCount` · `engagementRate` · `countsHidden` · `duration` · `videoUrl` · `thumbnailUrl` · `width` · `height` · `qualityCount` · `hasAudio` · `caption` · `hashtags[]` · `mentions[]` · `audioTitle` · `audioArtist` · `isOriginalAudio` · `postedAt` · `takenAtTimestamp` · `productType` · `accessibilityCaption` · `locationName` · `locationId` · `coauthors[]` · `taggedUsers[]` · `ownerUsername` · `ownerFullName` · `ownerId` · `ownerIsVerified` · `ownerFollowersCount` · `ownerProfilePicUrl` · `ownerProfileUrl` · `scrapedAt`

### Input

```json
{
  "usernames": ["natgeo", "nasa"],
  "includeReelDetails": true,
  "minPlays": 500000,
  "postedAfter": "2026-06-01",
  "maxResults": 100,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

| Field | What it does |
|---|---|
| `usernames` | Creator handles or profile URLs whose Reels you want |
| `reelUrls` | Specific Reels (full URL or bare shortcode) - any number |
| `includeReelDetails` | Adds view count, duration, video URL, audio, collaborators, caption, exact date. On by default |
| `postedAfter` / `postedBefore` | Date window (`YYYY-MM-DD`) |
| `minPlays` / `minLikes` | Engagement floors, applied **before** any paid detail fetch |
| `maxResults` | Total cap. `0` = no limit (the run's time budget stops it safely) |
| `onlyNewReels` | Monitor mode - only Reels you have not seen before |
| `detailConcurrency` | Parallel detail fetches (default 4) |

#### Filters run inside the crawl, not after it

`minPlays` and `minLikes` are evaluated on the cheap listing data **before** any per-Reel detail request, so Reels you filtered out never cost you a `reelDetail` event. Set a floor and you pay only for Reels that clear it.

### Honest limits - read before you buy

- **Instagram's logged-out feed exposes the 12 most recent Reels per profile.** For more volume, pass more handles, or pass specific `reelUrls` (unlimited). This actor deliberately does **not** hardcode Instagram's internal pagination token, because that token rotates on every Instagram deploy and would silently break the actor.
- **Audio has no ID without a login.** Instagram's logged-out audio payload carries `song_name`, `artist_name` and an original-audio flag - but no audio ID and no "N Reels used this sound" count. Those two fields are always null and are documented as source-gated rather than quietly shipped as empty columns.
- **`location` and `coauthors` are genuinely optional** - present when the creator geotagged or co-posted the Reel, an honest empty otherwise.
- **Public profiles only.** Private accounts return nothing; this actor never attempts to access them.
- **RESIDENTIAL proxy is the tested default.** Instagram rate-limits datacenter ranges hard.

### Pricing (pay per event, no start fee)

| Event | Price | What it covers |
|---|---|---|
| `reel` | **$0.003** | One Reel with play count, likes, comments, engagement rate, thumbnail, creator |
| `reelDetail` | **$0.01** | Adds view count, duration, video URL, audio attribution, collaborators, tagged users, location, caption, exact post date |

You are never charged a start fee, and a Reel is billed **before** it is written - so if a run hits its cost limit it stops rather than handing you unbilled rows.

### Use with AI assistants (MCP)

This actor works as a tool for LLM agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) - ask an assistant for "the play counts on @natgeo's latest Reels" and it can call this actor directly.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Integrations

Push Reel analytics anywhere: [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://apify.com/integrations/slack), [Google Drive](https://apify.com/integrations/google-drive), [Airbyte](https://apify.com/integrations/airbyte), [GitHub](https://apify.com/integrations/github), the [Apify API](https://docs.apify.com/api/v2), [Schedules](https://docs.apify.com/platform/schedules) and [Webhooks](https://docs.apify.com/platform/integrations/webhooks).

### Monitor mode

Set `onlyNewReels: true` and the actor remembers which Reels it has already returned for that input set, emitting only new ones. Pair it with [Apify Schedules](https://docs.apify.com/platform/schedules) for a daily creator-tracking feed - the scheduler triggers the run, monitor mode keeps the output clean.

### FAQ

**Do I need an Instagram login or cookies?** No. This actor only reads Instagram's public logged-out pages.

**Why is `viewCount` null on some rows?** You ran with `includeReelDetails: false`, which is the cheap play-count-only mode. Turn it on for view count, duration, video URL and audio.

**Why did a run return 0 Reels?** Instagram rate-limits by IP. The run ends successfully with a status message and bills you nothing - just re-run, and make sure the proxy is set to RESIDENTIAL.

**Can it scrape private accounts?** No, and it does not try.

### Related scrapers by scrapesage

- [Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper) - Meta ad creatives and advertiser intelligence
- [Threads Scraper](https://apify.com/scrapesage/threads-scraper) - profiles, posts and replies from Meta's Threads
- [TikTok Scraper](https://apify.com/scrapesage/tiktok-scraper) - short-form video analytics on the other major platform
- [YouTube Scraper](https://apify.com/scrapesage/youtube-scraper) - video, channel and engagement data

# Actor input Schema

## `usernames` (type: `array`):

Creator handles (or profile URLs) whose Reels you want. Instagram's logged-out feed exposes the 12 most recent Reels per profile - pass several handles for volume, or use Reel URLs below for specific Reels.

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

Specific Reels to analyse, e.g. https://www.instagram.com/reel/DSI7LxnEbrb/ or just DSI7LxnEbrb. Any number of them.

## `includeReelDetails` (type: `boolean`):

Fetches each Reel's own page + embed to add view count, duration, video URL, music/audio attribution, collaborators, tagged users, location, caption, hashtags and the exact post date. Billed as the reelDetail event. Turn off for a fast, cheap play-count-only pull.

## `postedAfter` (type: `string`):

Only Reels posted on or after this date (YYYY-MM-DD). Requires Reel details, which carry the post date, so it switches them on automatically.

## `postedBefore` (type: `string`):

Only Reels posted on or before this date (YYYY-MM-DD).

## `minPlays` (type: `integer`):

Skip Reels with fewer plays than this. Applied to the listing before any detail fetch, so filtered-out Reels cost you nothing.

## `minLikes` (type: `integer`):

Skip Reels with fewer likes than this.

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

Total Reels to return across all inputs. 0 means no limit (the run's time budget stops it safely).

## `onlyNewReels` (type: `boolean`):

Remembers the Reels already returned for this input set and emits only ones you have not seen. Ideal on a schedule. Works alongside Apify Schedules.

## `detailConcurrency` (type: `integer`):

Parallel detail fetches. Keep at 4 or below to stay friendly with Instagram's per-IP rate limits.

## `proxyConfiguration` (type: `object`):

Instagram rate-limits datacenter IPs hard. RESIDENTIAL is the tested default and is strongly recommended.

## Actor input object example

```json
{
  "usernames": [
    "natgeo"
  ],
  "includeReelDetails": true,
  "minPlays": 0,
  "minLikes": 0,
  "maxResults": 100,
  "onlyNewReels": false,
  "detailConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every scraped Reel with plays, views, likes, comments, engagement rate, duration, video URL, audio/music attribution, collaborators, tagged users and owner details as JSON items in the default dataset.

# 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 = {
    "usernames": [
        "natgeo",
        "nasa"
    ],
    "includeReelDetails": true,
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/instagram-reels-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 = {
    "usernames": [
        "natgeo",
        "nasa",
    ],
    "includeReelDetails": True,
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/instagram-reels-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 '{
  "usernames": [
    "natgeo",
    "nasa"
  ],
  "includeReelDetails": true,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapesage/instagram-reels-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/kvbrbrbZsI5BFZaXq/builds/47ZdFXOECJSFMSmWg/openapi.json
