# Instagram Profile Reels Scraper - Feed by Username (`khadinakbar/instagram-profile-reels-scraper`) Actor

Scrape public Instagram Reels from a profile Reels tab by username or profile URL, returning plays, likes, comments, duration, video URL, and audio. Cookieless and MCP-ready at $0.003 per Reel.

- **URL**: https://apify.com/khadinakbar/instagram-profile-reels-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Automation, MCP servers
- **Stats:** 4 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 instagram reel scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Profile Reels Scraper

Turn a public Instagram username, @handle, profile URL, or profile `/reels` tab URL into one dataset row per Reel. Each record includes play count, likes, comments, duration, video URL, audio metadata, caption, and provenance so agencies and AI agents can monitor a creator's public Reels tab without login or cookies.

This Actor is designed as a focused standalone workflow for a creator's public Reels tab. Instagram is a trademark of its owner. This independent Actor is not affiliated with, associated with, or endorsed by Instagram or Meta.

### Best fit for this Actor

- Choose this Actor when the starting point is a public profile handle and the deliverable is the Reels tab feed: plays, likes, comments, duration, and media URLs.
- Start with the default cap of 12 Reels per profile (one provider page), then raise `maxReelsPerProfile` only for the accounts that need a longer window.
- Pair it with the [Instagram Profile Scraper](https://apify.com/khadinakbar/instagram-profile-scraper) when you also need follower counts and bio context for the same handles, then pass selected Reel URLs to the [Instagram Reels Scraper](https://apify.com/khadinakbar/instagram-reels-scraper) for mixed-mode jobs that include direct Reel URLs or hashtags.

### Creator Reels tab monitoring

A social team tracks a handful of public creator handles. They run this Actor with `usernames: ["natgeo"]` and `maxReelsPerProfile: 12`, export play counts and captions, then schedule the same input weekly with `onlyReelsNewerThan: "7 days"` so each run stays a cheap, comparable snapshot. The dataset feeds a spreadsheet; `RUN_SUMMARY` records how many Reels were saved, filtered, or empty so the next schedule can stay aligned with budget.

### Quick start input

```json
{
  "usernames": ["natgeo"],
  "maxReelsPerProfile": 12,
  "maxTotalReels": 100,
  "providerOrder": "scrapecreators-first"
}
```

The quality-test sample is one public creator handle and one Reels-tab page. Profile URLs and `/reels` tab URLs are accepted as well.

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `usernames` | `string[]` | Handles, @handles, profile URLs, or profile `/reels` URLs. Direct Reel URLs belong on the sibling Reels Actor. |
| `maxReelsPerProfile` | `integer` | Newest-first cap per profile, default 12 (1–200). Extra pages are fetched after the first 12 items. |
| `maxTotalReels` | `integer` | Run-wide spend guard, default 100 (1–10000). |
| `onlyReelsNewerThan` | `string` | Optional ISO date or relative window such as `7 days`. Filtered Reels are unbilled. |
| `skipPinnedPosts` | `boolean` | Best-effort drop of items flagged as pinned. Public Reels-tab APIs usually omit pinned slots already. |
| `providerOrder` | `string` | `scrapecreators-first` (default), `sociavault-first`, or a `-only` pin. Keys are owner secrets. |
| `includeRawData` | `boolean` | Attach the unmodified provider item under `raw`. Default false. |

### What data you receive

One dataset item is one public Reel from the requested Reels tab.

| Field | Description |
| --- | --- |
| `reelId` / `shortcode` / `reelUrl` | Identity and canonical URL |
| `username` / `ownerId` / `ownerVerified` | Owner identity |
| `caption` / `hashtags` / `mentions` | Caption text and parsed tags |
| `playCount` / `likeCount` / `commentCount` | Public engagement (Instagram-only plays) |
| `durationSeconds` / `hasAudio` / `videoUrl` / `thumbnailUrl` | Media |
| `audioTitle` / `audioArtist` / `audioType` | Original or licensed audio when present |
| `postedAt` / `position` / `provider` / `sourceUrl` | Freshness and provenance |

```json
{
  "reelId": "3986021415458593743",
  "shortcode": "DdRMVvHglvP",
  "reelUrl": "https://www.instagram.com/reel/DdRMVvHglvP/",
  "inputUsername": "natgeo",
  "username": "natgeo",
  "ownerId": "787132",
  "ownerVerified": true,
  "caption": "Hello #Nature",
  "likeCount": 12,
  "commentCount": 3,
  "playCount": 100,
  "durationSeconds": 30.5,
  "hasAudio": true,
  "postedAt": "2026-09-14T13:00:42.000Z",
  "position": 1,
  "provider": "scrapecreators",
  "sourceUrl": "https://www.instagram.com/natgeo/reels/"
}
```

You can download the dataset as JSON, CSV, Excel, or HTML from the run's Export tab.

### Use through the API

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('khadinakbar/instagram-profile-reels-scraper').call({
  usernames: ['natgeo'],
  maxReelsPerProfile: 12,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Inspect `OUTPUT` and `RUN_SUMMARY` for outcome, item counts, and charged events.

### Use with AI agents through Apify MCP

> Scrape the public Instagram Reels tab for one or more usernames. Return play count, likes, comments, duration, video URL, caption, and source URL. Cap at 12 Reels per profile. Read the dataset plus OUTPUT/RUN\_SUMMARY for outcome and cost. Route direct Reel URLs to khadinakbar/instagram-reels-scraper and profile bios to khadinakbar/instagram-profile-scraper.

Connect the current client at <https://mcp.apify.com>. Preserve source URLs and respect `maxTotalReels` as the spend control.

### Connect the workflow

After you have Reel URLs from this feed, use the [Instagram Reels Scraper](https://apify.com/khadinakbar/instagram-reels-scraper) when the next job is mixed-mode (profile plus direct Reel URLs or hashtags). For the same creator's grid posts rather than Reels, continue with the [Instagram Posts Scraper](https://apify.com/khadinakbar/instagram-posts-scraper). Hashtag discovery belongs on the [Instagram Hashtag Scraper](https://apify.com/khadinakbar/instagram-hashtag-scraper) before you choose which profiles to monitor here.

### Pricing

This Actor uses Pay per event plus Apify platform usage. Open the live Pricing tab for current event details, and use Apify's run cost controls to keep the workflow aligned with your budget.

| Event | Price |
| --- | ---: |
| Actor start | `$0.00005` |
| Reel saved (`reel-scraped`) | `$0.003` |

Empty Reels tabs, unknown handles, and filtered items receive no Reel charge. Platform usage (compute) is billed in addition to event charges. The opening status message shows the approximate maximum event cost from your input caps.

A 12-Reel quality sample is about `$0.036` in named events plus platform usage.

### Best results

- Provide exact public handles, or paste the profile `/reels` URL.
- Start with `maxReelsPerProfile: 12`, then raise the cap only for accounts that need a longer public window.
- Use `onlyReelsNewerThan: "7 days"` for recurring monitors so each schedule stays comparable.
- Confirm `RUN_SUMMARY.outcome` and `itemsPushed` before retrying an empty tab; a public profile with no Reels is a valid empty dataset.
- Download video CDN URLs promptly when you need the files; Instagram media links expire.

### Builder's note

I built this Actor because Store search for "Instagram profile Reels" often lands on mixed-mode tools that also accept hashtags and direct Reel URLs. I found the public Reels-tab providers return about 12 items per page, and a compact `trim` flag drops duration, video URL, audio, and the pagination cursor. The runtime therefore keeps the full page payload so agents get play counts and media URLs on the first page without a second lookup. In my testing, captions were present on the public creator sample even when older docs said they were missing.

### Responsible use

Use this Actor for public Instagram Reels you are authorized to access and process. You are responsible for complying with Instagram's Terms of Service, privacy rules, and applicable laws. The Actor collects public Reels-tab fields only.

# Changelog

This Actor's version history is a separate document: https://apify.com/khadinakbar/instagram-profile-reels-scraper/changelog.md

# Actor input Schema

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

Public Instagram handles whose Reels tab should be scraped. Accepts plain handles (for example natgeo), @handles, full profile URLs, or profile /reels tab URLs. Direct Reel, post, or hashtag URLs belong on sibling Actors. Default quality sample is one public creator handle.

## `maxReelsPerProfile` (type: `integer`):

Upper bound on Reels saved per username, newest-first from the public Reels tab. Accepts 1-200; defaults to 12 (one provider page). Raising this adds extra provider pages after the first 12 items. Pair with maxTotalReels as the run-wide spend guard.

## `maxTotalReels` (type: `integer`):

Hard global cap on saved Reel rows across all profiles. The run stops when the cap is reached. Accepts 1-10000; defaults to 100. Use this as the spend guard together with the $0.003 per-Reel event. It does not raise the per-profile cap.

## `onlyReelsNewerThan` (type: `string`):

Keep Reels posted on or after this cutoff. Accepts an ISO date such as 2026-09-01 or a relative window such as 7 days. Leave empty to keep the full public tab up to the caps. Filtered Reels are unbilled and counted in RUN\_SUMMARY.

## `skipPinnedPosts` (type: `boolean`):

When true, drop items whose public payload includes a pin flag for the profile owner. Public Reels-tab APIs usually omit pinned slots already, so this is a best-effort extra filter. Defaults to false so every returned public Reel is kept.

## `providerOrder` (type: `string`):

Order in which the backing public-data providers are tried for every Reels-tab page. Defaults to scrapecreators-first; SociaVault is used when the primary is empty or transport-failed. Use sociavault-first to invert the order or a -only value to pin one provider. Provider keys are owner secrets; callers never paste an API key.

## `includeRawData` (type: `boolean`):

When true, each row also carries the unmodified provider item under a raw key for field-level analysis. Defaults to false because raw payloads roughly triple row size. Leave off for normal scraping; every normalized field is already extracted.

## Actor input object example

```json
{
  "usernames": [
    "natgeo",
    "@nasa"
  ],
  "maxReelsPerProfile": 12,
  "maxTotalReels": 100,
  "onlyReelsNewerThan": "7 days",
  "skipPinnedPosts": false,
  "providerOrder": "scrapecreators-first",
  "includeRawData": false
}
```

# Actor output Schema

## `reels` (type: `string`):

One row per public Reel from the requested profile Reels tabs, with plays, likes, comments, duration, video URL, audio, and provenance.

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

Run diagnostics, provider telemetry, counts, stop reason, and estimated PPE cost.

## `output` (type: `string`):

Same summary under the OUTPUT key for stable agent and readback evidence.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/instagram-profile-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"] }

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

```

## MCP server setup

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

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/ccs3TbDIXQ7REBgB0/builds/xWiKxguPSeI3CGZuz/openapi.json
