# Instagram Reels Scraper API - Play Counts, MP4 URLs (`vonsensey/instagram-reels-scraper-api`) Actor

Scrape the reels from any public Instagram profile: exact play, like and comment counts, duration, sound, caption and the direct MP4 URL with dimensions. Posts are skipped and never billed. No login.

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

## Pricing

from $1.50 / 1,000 post (image or carousel)s

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?

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 API - Play Counts, MP4 URLs

#### The Instagram suite

- [Instagram Posts Scraper API](https://apify.com/vonsensey/instagram-posts-scraper-api) — posts, reels and carousels from any public profile
- [Instagram Profile Posts Scraper API](https://apify.com/vonsensey/instagram-profile-posts-scraper-api) — a username in, its newest posts out, as many pages as you ask for
- [Instagram New Posts Monitor API](https://apify.com/vonsensey/instagram-new-posts-monitor-api) — put profiles on a schedule and pay only for new or changed posts

Paste Instagram usernames and get their reels: exact play, like and comment counts, duration, sound, caption and the direct MP4 URL. Image posts are skipped and never billed. No login, no cookies, no proxy to configure — it reads the public feed Instagram shows to anyone. **Failures are free**: a profile that is private, missing or empty costs nothing and returns a row saying which.

**Exact numbers, not display numbers.** Instagram's page says "1.4M likes" and "46M plays"; the rows carry 1,487,695 and 46,522,596.

### Quick start

1. Press **Start** — the defaults are a working run.
2. Replace them with your own usernames or profile URLs (`nasa`, `@nasa` and `https://www.instagram.com/nasa/` all work), one per line.
3. Take the dataset as JSON, CSV or Excel, or via the API. Every row has a `type`; the free `coverage` row says what was asked for and what arrived.

### What people use it for

- **Short-video research.** Which reels a creator or brand posts, how each performs, and the file itself for analysis or transcription.
- **Influencer vetting.** Engagement per post over the newest posts, paid-partnership flags, co-authored posts, verified status.
- **Archiving and datasets.** Captions, hashtags, mentions, dates, locations and media URLs for a list of profiles, newest first, as far back as you ask.
- **Feeding an AI agent or workflow.** One flat schema, a `type` on every row, and a free coverage row that says what was asked for and what arrived.

### What the rows look like

#### A reel row

```json
{
  "type": "reel",
  "profile": "cristiano",
  "shortcode": "Dcgs4DvIr3u",
  "url": "https://www.instagram.com/reel/Dcgs4DvIr3u/",
  "mediaType": "video",
  "productType": "clips",
  "likeCount": 1487695,
  "commentCount": 18722,
  "playCount": 46522596,
  "videoDurationSec": 21.68,
  "hasAudio": true,
  "media": [{ "kind": "video", "url": "https://instagram.f...fbcdn.net/o1/v/t2/f2/m86/....mp4", "width": 720, "height": 1280, "id": null }],
  "music": { "title": "Original audio", "artist": "cristiano", "isOriginal": true }
}
```

`playCount` is Instagram's exact play count for the reel. Media URLs are signed by Instagram and expire after a few hours — download during the run, or turn them off.

### What it costs

| You pay for | Price |
|---|---|
| Each reel or video post delivered (play count, duration, sound and the MP4 URL included) | **$2.00 per 1,000 reels** |
| Each profile feed read (only when at least one post from it was delivered; never counted against your result cap) | **$2.00 per 1,000 profiles** |
| Optional monthly pass: 30 days with no per-row charges, charged once, no automatic renewal | **$19.00** |

**Free, always:** a profile that does not exist, is private or has no posts, every post that is not a reel, a post skipped by your content or date filter, a post you already received on a monitoring run whose numbers did not move, a malformed input, every error row, the coverage row and the run summary. A run that reads nothing costs nothing.

**The monthly pass** is for heavy use: turn it on and the run charges it once after it has read at least one profile, then every run you start with it on for the next 30 days delivers posts, reels and feed checks without per-row charges. It pays for itself above roughly 5,000 posts or 3,000 profile checks a month. It is never charged silently — only when you run with it on and no pass is active.

Set **Cost ceiling (USD)** to stop any run before it passes a number you choose; the free summary row reports what the run actually spent.

### FAQ

#### Do I need an Instagram login, cookies or a proxy?

No. This Actor reads the public feed Instagram serves to anyone, and it never signs in, never sends a cookie and never uses a session. Everything is handled for you and there is nothing to buy on top.

#### Can I get follower counts, the bio, stories or comments?

Not from this Actor, and it says so rather than pretending. Instagram only shows those to signed-in accounts; every row does carry the poster's username, full name, verified and private flags. What you get is the feed itself: every post and reel with exact like, comment and play counts, captions, media and dates.

#### How far back can I go?

As far as the profile's public feed goes, 12 posts per page. Set **Newest posts per profile** for a depth, or **Only posts from the last N days** to stop at a date. Pinned posts sit first regardless of date and do not end the walk.

#### What happens to a profile that is private, missing or has no posts?

It costs nothing. You get a free error row that says which (`private`, `not-found`, `no-posts`), and the run keeps going.

#### Does a run fail if everything I asked for is gone?

No. "All of these are private or deleted" is a correct answer, not a failure, so the run succeeds and returns free rows explaining each one. Only Instagram actually refusing us fails a run.

#### Can I put this on a schedule without paying twice for the same posts?

Yes. Turn **Monitor** on. Delivered posts and the counts seen are remembered per profile in a named store; a post whose numbers have not moved comes back as a free row marked `unchanged`, and each profile read is billed as one feed check.

#### How does the monthly pass work?

Turn **Monthly pass** on. The run charges it once, after it has read at least one profile, and for 30 days every run you start with it on delivers rows and feed checks without per-row charges. It is never renewed automatically — it is charged again only when you run with it on after it expired.

#### Will I be charged twice if the same post appears twice?

No. A collaboration post that appears in two co-authors' feeds, or a profile you listed twice under two spellings, is one row and one charge.

### Limits, stated plainly

Instagram shows follower and following counts, the bio, stories, highlights, the comments under a post, hashtag and location pages, and search only to signed-in accounts (measured 2026-09-02 from two independent networks). This Actor reads public feeds only and never signs in, so it sells none of those — and says so here rather than on your invoice.

Media URLs are signed by Instagram and expire after a few hours. A private account's posts are not readable at all; the row says `private`.

Like counts an author has hidden come back as null, never as zero.

### Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is `vonsensey/instagram-reels-scraper-api`; every snippet below sends `{}`, which runs the defaults shown on the form — replace it with your own input.

#### n8n

Install the **Apify** community node (`@apify/n8n-nodes-apify` under *Settings → Community Nodes*, or search "Apify" on n8n Cloud). Add **Apify → Run Actor** with Actor `vonsensey/instagram-reels-scraper-api` and your input JSON, then **Apify → Get Dataset Items** on the run's `defaultDatasetId` and pipe the rows anywhere. For scheduled runs, the **On new Apify Event** trigger fires when a run of this Actor finishes.

#### MCP (Claude, Cursor, VS Code, any MCP client)

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=vonsensey/instagram-reels-scraper-api",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

Your agent then calls `vonsensey/instagram-reels-scraper-api` as a tool with the same input the form takes and reads the dataset back.

#### REST API (one call, rows in the response)

```bash
curl -X POST "https://api.apify.com/v2/acts/vonsensey~instagram-reels-scraper-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" -d '{}'
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/instagram-reels-scraper-api").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

#### JavaScript

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/instagram-reels-scraper-api').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Make, Zapier, LangChain, CrewAI

The Apify app in **Make** and **Zapier** has a *Run an Actor* module: pick `vonsensey/instagram-reels-scraper-api`. In **LangChain** and **CrewAI** the Apify tool wrappers take the same Actor id. A daily **schedule** needs nothing but the Console: *Schedules → Create → this Actor → cron*, and the dataset fills on its own.

# Actor input Schema

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

Usernames or profile URLs — 'nasa', '@nasa' and 'https://www.instagram.com/nasa/' all work, one per line. Each profile's public feed is read newest first: posts, reels and carousels with exact like, comment and play counts. A profile that does not exist, is private or has no posts returns a free row saying which, never a charge.

## `contentType` (type: `string`):

Everything in the feed, only image and carousel posts, or only reels and videos. Skipped items are never billed.

## `maxPostsPerProfile` (type: `integer`):

How many of each profile's newest posts to deliver. Instagram serves the feed 12 at a time; 24 means two pages per profile.

## `sinceDays` (type: `integer`):

Stop reading a profile once its posts are older than this many days. Combine with a schedule and Monitor to receive only what is new. Leave empty for no date limit.

## `since` (type: `string`):

An ISO date such as 2026-08-01. Ignored when 'last N days' is set.

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

Hard cap on billable rows for this run, across all profiles. Feed checks never count against it.

## `includeMediaUrls` (type: `boolean`):

Direct CDN URLs for every image, carousel child and reel MP4, with dimensions. They are signed by Instagram and expire after a few hours, so download what you need from the run rather than storing the links.

## `monitorChangesOnly` (type: `boolean`):

For scheduled runs. The Actor remembers every post it has delivered and the counts it saw; a post whose numbers did not move is delivered as a free row marked 'unchanged', and only new or changed posts are billed. Each profile read is billed as one feed check.

## `monthlyPass` (type: `boolean`):

Charge one monthly pass instead of paying per post. Charged once, after the run has read at least one profile, and only again after 30 days if you run with this on. While it is active every run you start with this on delivers rows and feed checks without per-row charges. Worth it above roughly 5,000 posts or 3,000 profile checks a month.

## `maxCostUsd` (type: `integer`):

Stop the run before it spends more than this. Leave empty for no ceiling. The free summary row always reports what the run actually spent.

## `useProxy` (type: `boolean`):

Not normally needed — everything is handled for you and the Actor escalates automatically if Instagram refuses a request. Turn it on only if you have been asked to.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "cristiano"
  ],
  "contentType": "reels",
  "maxPostsPerProfile": 24,
  "maxItems": 24,
  "includeMediaUrls": true,
  "monitorChangesOnly": false,
  "monthlyPass": false,
  "useProxy": false
}
```

# Actor output Schema

## `dataset` (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 = {
    "usernames": [
        "nasa",
        "cristiano"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vonsensey/instagram-reels-scraper-api").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": [
        "nasa",
        "cristiano",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vonsensey/instagram-reels-scraper-api").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 '{
  "usernames": [
    "nasa",
    "cristiano"
  ]
}' |
apify call vonsensey/instagram-reels-scraper-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vonsensey/instagram-reels-scraper-api"
        }
    }
}

```

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/QZKW69oqalJx3xUSo/builds/P9AcTNbdze3YJkHHh/openapi.json
