# Instagram Reels Scraper (`coregent/instagram-reels-scraper`) Actor

Scrape public Instagram Reels from profiles or direct Reel URLs. Extract captions, hashtags, likes, comments, shares, views, play counts, duration, creators, tagged users, collaborators, music, transcripts, thumbnails and video URLs. Export clean JSON, CSV or Excel.

- **URL**: https://apify.com/coregent/instagram-reels-scraper.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Stats:** 5 total users, 2 monthly users, 98.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reel results

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

![Instagram Reels Scraper](https://raw.githubusercontent.com/coregentdevspace/instagram-reels-scraper-assets/main/thumbnail-instagram-reels-scraper.png)

Scrape public Instagram Reels from profiles or direct Reel URLs. Extract captions, hashtags, likes, comment counts, play counts, duration, creators, tagged users, collaborators, music, thumbnails and video URLs. Export clean JSON, CSV or Excel.

### What this actor does

**Instagram Reels Scraper** takes Instagram usernames, profile URLs, Reels-tab URLs, Reel URLs or shortcodes and returns **one clean row per Reel**:

- 🎬 **Reels only**: you never pay for photo posts or carousels
- ▶️ **Play counts on every Reel**: `videoPlayCount`, plus `videoViewCount` where Instagram reports it separately. Never estimated
- 📊 **Engagement**: likes and the exact total comment count
- 🙈 **Hidden likes done right**: `likesCount: null` with `likesHidden: true`. Never a fake zero
- 🎵 **Music / audio** for Reels collected from profiles: song title, artist, audio ID, original-audio flag and audio URL where public
- 👥 **People**: creator (name, verified, followers), collaborators/co-authors and tagged users
- 🎞️ **Video**: duration, width, height, thumbnail and direct video URL
- 📌 **Pinned** flag, plus 📍 **location** and 💬 **comments-disabled** where Instagram includes them
- 🤝 **Sponsorship**: paid-partnership flag and sponsor name, taken from Instagram's own label (never guessed from `#ad`)
- 🗓️ **Date filtering** that stays correct around old pinned Reels

For profile metadata (bio, follower counts, business contact) use [Instagram Profile Scraper](https://apify.com/coregent/instagram-profile-scraper). For photos, carousels and Reels together use [Instagram Posts Scraper](https://apify.com/coregent/instagram-posts-scraper).

### How it works

1. **Detect inputs.** Each entry is classified on its own: profile (`natgeo`, `@natgeo`, `instagram.com/natgeo`), Reels tab (`instagram.com/natgeo/reels/`), Reel URL (`/reel/…`, `/reels/…`, share links) or bare shortcode. Tracking parameters are stripped and duplicates are removed. You never pick a mode.
2. **Profiles.** The profile is resolved first, so private and nonexistent accounts are reported straight away. Its Reels tab is then paged newest-first until your limit, your date cutoff or the last Reel.
3. **Direct Reels.** Each Reel URL is looked up directly and returns at most one row.
4. **Retry safely.** Rate limits, login walls and temporary errors are retried on a fresh session/IP with backoff, and a profile resumes from where it stopped. If Instagram keeps refusing, the Reels come from an alternative source instead of waiting out the throttle.
5. **Export.** One row per Reel. Inputs that can't be served get a free **status row**, so every input can be matched to an output.

### FAQ

**Which inputs are supported?** Usernames, @handles, profile URLs, profile Reels-tab URLs (`/natgeo/reels/`), direct Reel URLs (`/reel/…`, `/reels/…`, and `/p/…` links that point to a Reel), Instagram share links (`/share/reel/…`), and bare shortcodes in the URL field. Mix them freely in one run.

**Do I need an Instagram login or cookies?** No. You don't provide any login, password, cookies, session IDs or Meta token. The actor only reads public content.

**Can I scrape all Reels from a profile?** Yes. Set `resultsLimit` at or above the number of Reels the profile has. Instagram serves a Reels tab 12 at a time, so very large exports take longer.

**Can I scrape direct Reel URLs?** Yes. Put them in **Instagram URLs**. Each one returns at most one row. A URL that turns out to be a photo or carousel post gets a free status row and is not charged.

**Are views and play counts included?** Play counts, yes: `videoPlayCount` is filled on every Reel. Instagram reports a separate view count (`videoViewCount`) only for direct Reel URLs, and there it currently equals the play count. For Reels collected from a profile, `videoViewCount` is `null`. The actor never copies one metric into the other or estimates a missing one.

**Are shares included?** Not at the moment. Instagram doesn't expose share counts through the sources this actor uses, so `sharesCount` is `null`. The field stays in the output so your columns don't change if that changes.

**Is music/audio included?** Yes, for Reels collected from a profile or Reels tab: `music` holds the audio ID, title, artist, whether it's the creator's original audio, and the audio file URL when Instagram provides one. For direct Reel URLs Instagram doesn't send audio details, so `music` is `null` there. No audio fingerprinting is done. Turn it off with `includeMusic: false`.

**Are transcripts included?** Not at the moment. The actor only reads Instagram's own captions and never transcribes audio itself, and Instagram currently doesn't expose those captions through the sources this actor uses. Every Reel therefore comes back with `transcript.available: false`. The `transcript` field and the `includeTranscript` switch stay in place so captions appear automatically if Instagram exposes them again.

**Are collaborators included?** Yes. `coauthors` lists collab accounts (ID, username, full name, profile URL, verified flag), and `taggedUsers` lists people tagged in the Reel.

**Are trial Reels included?** Trial Reels that appear on a profile are returned like any other Reel. Instagram doesn't currently say which Reels are trials, so `isTrialReel` is `null` rather than a guess.

**Are video URLs included?** Yes, as `videoUrl`, plus `thumbnailUrl`. Turn video URLs off with `includeVideoUrls: false`. The actor doesn't download video files into storage.

**Do video URLs expire?** Yes. Instagram CDN links are signed and stop working after a while. Download the files soon after the run if you need them.

**Can I filter by date?** Yes. `reelsNewerThan` accepts `2026-09-01` or a period like `7 days`, `30 days` or `24 hours`. Paging stops as soon as older Reels are reached. `reelsOlderThan` returns only Reels before a date. Filtered-out Reels are not charged.

**What happens with pinned Reels?** They are returned with `isPinned: true`, and an old pinned Reel at the top of a profile never stops date-based paging early. Set `skipPinnedReels: true` to leave them out entirely.

**What happens with private profiles?** You get a free `PRIVATE_PROFILE` status row and no Reels. The actor never tries to access private content. For the public metadata of a private account, use [Instagram Profile Scraper](https://apify.com/coregent/instagram-profile-scraper).

**Are comments included?** The total, yes: `commentsCount` is on every Reel. Comment text isn't: Instagram doesn't currently send any comments with the Reel data this actor reads, so `latestComments` stays empty even with `includeLatestComments: true`. For comment text, see the next question.

**How do I get full comment threads?** Use a dedicated comments scraper such as [Instagram Comment Leads Extractor](https://apify.com/coregent/instagram-comment-leads-commenter-extractor), feeding it the `url` values from this actor.

**How is pricing calculated?** Per returned Reel. See [Pricing](#pricing).

**Are creator follower counts included?** Yes for Reels collected from a profile (with `includeOwnerDetails: true`). For direct Reel URLs, and for collab Reels authored by another account, `owner.followersCount` is `null`; use [Instagram Profile Scraper](https://apify.com/coregent/instagram-profile-scraper) for follower counts.

**How does `resultsLimit` work?** It's the maximum number of Reels **per profile input**. Two profiles with `resultsLimit: 100` return up to 200 Reels. Direct Reel URLs always return at most one Reel each.

**Can I use it through the API or MCP?** Yes. Like every Apify actor it can be run from the [Apify API](https://docs.apify.com/api/v2), the Apify client libraries, scheduled tasks, integrations (Make, Zapier, n8n) and the [Apify MCP server](https://mcp.apify.com) for AI agents.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | — | Profile, Reels-tab, Reel or share URLs, or bare shortcodes |
| `profiles` | array | — | Usernames or @handles |
| `resultsLimit` | integer | `100` | Max Reels per profile (1–10,000) |
| `reelsNewerThan` | string | `""` | Only Reels after this date / period |
| `reelsOlderThan` | string | `""` | Only Reels before this date / period |
| `skipPinnedReels` | boolean | `false` | Leave out pinned Reels |
| `includeVideoUrls` | boolean | `true` | Return direct video URLs |
| `includeMusic` | boolean | `true` | Return music/audio metadata (Reels from profiles) |
| `includeTranscript` | boolean | `true` | Instagram's own caption text; currently always unavailable (see FAQ) |
| `includeLatestComments` | boolean | `false` | Comments already included with the Reel; currently none are (see FAQ) |
| `includeOwnerDetails` | boolean | `true` | Creator name, verified flag and followers |
| `proxyConfiguration` | object | Apify Proxy | See [Proxy policy](#-proxy-policy) |
| `maxConcurrency` | integer | `5` | Inputs processed in parallel |
| `maxRetries` | integer | `4` | Retries per input on rate limits and temporary errors |
| `debugMode` | boolean | `false` | Verbose logging |

Use `startUrls`, `profiles` or both. Up to 1,000 inputs per run.

#### Example 1: The latest Reels of a profile (used for the screenshot and samples below)

```json
{
  "profiles": ["natgeo"],
  "resultsLimit": 100
}
```

#### Example 2: Direct Reel URLs

```json
{
  "startUrls": [
    { "url": "https://www.instagram.com/reel/DdotQALCHZz/" },
    { "url": "https://www.instagram.com/reels/DdDCBCwArSO/" }
  ]
}
```

#### Example 3: Monitor competitors' last 30 days (schedule it)

```json
{
  "profiles": ["natgeo", "nasa"],
  "resultsLimit": 100,
  "reelsNewerThan": "30 days",
  "skipPinnedReels": true,
  "includeMusic": true,
  "includeVideoUrls": true
}
```

#### Example 4: Lightweight metrics only

```json
{
  "startUrls": [{ "url": "https://www.instagram.com/natgeo/reels/" }],
  "resultsLimit": 50,
  "includeVideoUrls": false,
  "includeMusic": false,
  "includeTranscript": false,
  "includeOwnerDetails": false
}
```

### Output

One row per Reel. Every row (Reel or status) has the same set of keys, so CSV and Excel exports keep stable columns. Values Instagram doesn't expose are `null`, never guessed. The dataset has four tabs: **Reels**, **Music & transcripts**, **Creators & collaborations** and **Status & errors**.

The screenshot and records below come from [Example 1](#example-1-the-latest-reels-of-a-profile-used-for-the-screenshot-and-samples-below): 100 Reels from `natgeo`, all returned as `SUCCESS`. CDN URLs are shortened.

![Reels table view](https://raw.githubusercontent.com/coregentdevspace/instagram-reels-scraper-assets/main/instagram-reels-scraper-output-reels-table-view.png)

#### Reels tab: sample record

```json
{
  "thumbnailUrl": "https://instagram.fblr24-3.fna.fbcdn.net/…",
  "url": "https://www.instagram.com/reel/DdotQALCHZz/",
  "ownerUsername": "natgeo",
  "caption": "Phenomenal life lessons from our friend @paige_tingey, part of the Creator Cohort campaign 👏 \n\nCatch the full #NatGeo9 interview with Paige on the Nat Geo YouTube Channel at the link in bio.",
  "timestamp": "2026-09-23T16:10:34.000Z",
  "videoPlayCount": 1946246,
  "videoViewCount": null,
  "likesCount": 13814,
  "commentsCount": 119,
  "sharesCount": null,
  "durationSeconds": 22.314,
  "hashtags": [
    "NatGeo9"
  ],
  "isPinned": false,
  "isPaidPartnership": false,
  "status": "SUCCESS"
}
```

#### Music & transcripts tab: sample record

A Reel set to a licensed track. Most `natgeo` Reels use their own original audio (`isOriginalAudio: true`, with the creator as artist).

```json
{
  "url": "https://www.instagram.com/reel/DdDCBCwArSO/",
  "ownerUsername": "natgeo",
  "music": {
    "audioId": "1274609001207296",
    "title": "Uncharted Waters",
    "artist": "Igor Dvorkin",
    "isOriginalAudio": false,
    "audioUrl": "https://scontent-prg1-1.cdninstagram.com/…"
  },
  "transcript": {
    "text": null,
    "language": null,
    "source": "unavailable",
    "available": false
  },
  "caption": "Until 2025, only two adult Tyrannosaurus rex footprints had been found in the entire world—but high school teacher Kent Hups made history when he discovered the first adult T. rex trackway. Working with his close friend and National Geographic Explorer Tyler Lyson, the pair excavated a total of five footprints in North Dakota, each preserved as a 3D shape in the ancient rocks. \n\nLearn more about the unusual discovery at the link in bio. \n\nVideo by Alex Wenchel",
  "durationSeconds": 16.192,
  "videoUrl": "https://scontent-prg1-1.cdninstagram.com/…"
}
```

#### Creators & collaborations tab: sample record

A collab Reel authored by another creator, with `natgeo` as co-author and paid-partnership sponsor. `owner.followersCount` is `null` because the author isn't the profile that was scraped.

```json
{
  "url": "https://www.instagram.com/reel/DccKylvPcwC/",
  "owner": {
    "id": "321198681",
    "username": "maya_higa",
    "fullName": "maya",
    "profileUrl": "https://www.instagram.com/maya_higa/",
    "isVerified": true,
    "followersCount": null
  },
  "coauthors": [
    {
      "id": "787132",
      "username": "natgeo",
      "fullName": "National Geographic",
      "profileUrl": "https://www.instagram.com/natgeo/",
      "isVerified": true
    }
  ],
  "taggedUsers": [
    {
      "id": "787132",
      "username": "natgeo",
      "fullName": "National Geographic",
      "profileUrl": "https://www.instagram.com/natgeo/"
    }
  ],
  "mentions": [
    "natgeo"
  ],
  "isSponsored": true,
  "isPaidPartnership": true,
  "sponsorName": "natgeo",
  "location": null
}
```

#### Status & errors tab: sample record

The sample run had no failed inputs, so this example shows the row a private profile produces. All other keys are present with `null` values.

```json
{
  "input": "private_account",
  "inputType": "PROFILE",
  "type": "error",
  "status": "PRIVATE_PROFILE",
  "errorMessage": "Public Reels are not accessible for this profile (private account). Use coregent/instagram-profile-scraper for its public profile metadata.",
  "shortCode": null,
  "ownerUsername": "private_account",
  "url": null,
  "scrapedAt": "2026-10-09T12:00:00.000Z"
}
```

#### Full record (all fields)

```json
{
  "type": "reel",
  "status": "SUCCESS",
  "errorMessage": null,
  "id": "3992640081453676147",
  "shortCode": "DdotQALCHZz",
  "url": "https://www.instagram.com/reel/DdotQALCHZz/",
  "caption": "Phenomenal life lessons from our friend @paige_tingey, part of the Creator Cohort campaign 👏 \n\nCatch the full #NatGeo9 interview with Paige on the Nat Geo YouTube Channel at the link in bio.",
  "hashtags": [
    "NatGeo9"
  ],
  "mentions": [
    "paige_tingey"
  ],
  "timestamp": "2026-09-23T16:10:34.000Z",
  "likesCount": 13814,
  "likesHidden": false,
  "commentsCount": 119,
  "sharesCount": null,
  "videoViewCount": null,
  "videoPlayCount": 1946246,
  "durationSeconds": 22.314,
  "width": 1080,
  "height": 1920,
  "thumbnailUrl": "https://instagram.fblr24-3.fna.fbcdn.net/…",
  "videoUrl": "https://instagram.fblr1-5.fna.fbcdn.net/…",
  "ownerUsername": "natgeo",
  "owner": {
    "id": "787132",
    "username": "natgeo",
    "fullName": "National Geographic",
    "profileUrl": "https://www.instagram.com/natgeo/",
    "isVerified": true,
    "followersCount": 268408426
  },
  "taggedUsers": [
    {
      "id": "213902813",
      "username": "paige_tingey",
      "fullName": "Paige Phelps Tingey",
      "profileUrl": "https://www.instagram.com/paige_tingey/"
    }
  ],
  "coauthors": [
    {
      "id": "213902813",
      "username": "paige_tingey",
      "fullName": "Paige Phelps Tingey",
      "profileUrl": "https://www.instagram.com/paige_tingey/",
      "isVerified": true
    }
  ],
  "music": {
    "audioId": "29034967032793376",
    "title": "Original audio",
    "artist": "natgeo",
    "isOriginalAudio": true,
    "audioUrl": "https://instagram.fblr24-1.fna.fbcdn.net/…"
  },
  "transcript": {
    "text": null,
    "language": null,
    "source": "unavailable",
    "available": false
  },
  "location": null,
  "isPinned": false,
  "isTrialReel": null,
  "isSponsored": false,
  "isPaidPartnership": false,
  "sponsorName": null,
  "commentsDisabled": null,
  "latestComments": [],
  "input": "natgeo",
  "inputType": "PROFILE",
  "scrapedAt": "2026-10-08T19:07:20.805Z"
}
```

The same Reel requested by its URL comes back with `videoViewCount` and `videoPlayCount` both filled (Instagram reports the same number for both there) and `commentsDisabled: false`, but with `music` and `owner.followersCount` as `null`.

#### Status values

| Status | Meaning | Charged |
|---|---|---|
| `SUCCESS` | Reel returned | ✅ |
| `PARTIAL_RESULT` | A Reel missing core fields, or a profile whose Reels feed stopped early (the Reels already returned are kept) | — |
| `INVALID_INPUT` | Not a recognizable Instagram username, URL or shortcode | — |
| `PROFILE_NOT_FOUND` | The profile doesn't exist | — |
| `REEL_NOT_FOUND` | The Reel doesn't exist or was removed | — |
| `PRIVATE_PROFILE` | The profile is private | — |
| `CONTENT_UNAVAILABLE` | Instagram refused this content, or the URL is a photo/carousel post rather than a Reel | — |
| `AGE_RESTRICTED` | The content needs a logged-in, age-verified viewer | — |
| `LOGIN_WALL` / `RATE_LIMITED` / `BLOCKED` | Instagram kept refusing after all retries and the fallback | — |
| `TEMPORARY_INSTAGRAM_ERROR` / `PROVIDER_ERROR` | Upstream failure after all retries | — |

A missing transcript or video URL doesn't fail the row: the Reel is still returned, with `transcript.available: false` or `videoUrl: null`.

#### Run summary and retry input

Each run writes `RUN_SUMMARY` to the key-value store: inputs, successful and failed inputs, Reels saved, pinned and trial Reels, transcripts and music available, duplicates skipped, Reels filtered by date, and availability rates for views, plays, shares, video URLs, music and transcripts. If any input failed for a temporary reason, `RETRY_INPUT` holds a ready-to-run input containing just those inputs.

### Pricing

Pay per event, **per returned Reel**. You are not charged for profile lookups, pagination, retries, music data, transcripts, the comments preview, media URLs, tagged users, collaborators, invalid inputs, duplicates, filtered-out Reels, partial results or error rows. A Reel reached both through a profile and a direct URL is charged once. There is no start fee. The per-Reel rate can differ by Apify plan, so see the **Pricing** tab for the current rate on yours. This README deliberately doesn't quote figures.

The actor respects the spending limit you set for a run: when it's reached, the run stops cleanly and no further Reels are fetched.

#### 🚦 Proxy policy

Use **Apify Datacenter** proxy (the default) or **no proxy** for normal runs. Both work for Instagram Reels tabs and Reel lookups at this actor's conservative concurrency.

**Apify Residential proxy is not supported.** The actor fails at startup if `apifyProxyGroups` includes `RESIDENTIAL`. In pay-per-event actors, residential bandwidth is billed per GB to the developer, not the run user, so a single bandwidth-heavy run could cost more than the per-result revenue.

If you need residential routing, supply your own residential provider in the proxy editor's **Custom proxy URLs** field. That traffic goes through your provider, not Apify, and is unaffected:

```
http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777
```

### Limitations

- **Public Reels only.** Private accounts, Stories, Highlights and close-friends content are out of scope.
- **Instagram decides what's public.** Share counts, trial-Reel state, transcripts and comment text aren't currently exposed, so those fields come back `null`, empty or unavailable. Views are reported only for direct Reel URLs, and music and follower counts only for Reels collected from profiles. Likes on hidden-like Reels are `null`.
- **No AI transcription.** The actor never transcribes audio itself.
- **Media URLs expire.** Instagram's CDN links are temporary, and files are not stored by the actor.
- **Large exports take time.** Instagram serves a Reels tab 12 at a time, and the actor pages one profile sequentially to stay under rate limits.
- **Not included:** full comment threads, likers, follower lists, hashtag or keyword search, media downloads into storage, and AI analysis. These belong to separate actors.
- Public data availability on Instagram can change at any time.

### Related actors

- [Instagram Profile Scraper](https://apify.com/coregent/instagram-profile-scraper): profile metadata, follower counts, bio links and public business contact
- [Instagram Posts Scraper](https://apify.com/coregent/instagram-posts-scraper): photos, carousels, videos and Reels from profiles
- [Instagram Reel Hooks & Competitor Analyzer](https://apify.com/coregent/instagram-reel-hooks-competitor-analyzer): what makes competitors' Reels work
- [Instagram Comment Leads Extractor](https://apify.com/coregent/instagram-comment-leads-commenter-extractor): commenters on posts and Reels as leads

### Legal and privacy

This is an unofficial tool. It is not affiliated with, endorsed by or sponsored by Instagram or Meta. It processes only publicly accessible content and never accesses private accounts. Public Reels and creator profiles can contain personal data (names, faces, voices, tagged people, locations). You are responsible for having a lawful basis for collecting and processing it (for example under GDPR or CCPA), for collecting only the data relevant to your use case, and for complying with Instagram's terms in your use of the data.

### Local development

```bash
cd actor
npm install
npm test     # unit tests
npm start    # runs with INPUT.json
```

# Actor input Schema

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

Profile URLs (https://www.instagram.com/natgeo/), Reels-tab URLs (/natgeo/reels/), direct Reel URLs (/reel/{shortcode}/, /reels/{shortcode}/), share links (/share/reel/…) or bare shortcodes. The input type is detected automatically; tracking parameters are ignored. Each direct Reel URL returns at most one result.

## `profiles` (type: `array`):

Instagram usernames or @handles (natgeo, @nasa). Merged with the URLs above; duplicates are removed. Up to 1,000 inputs per run in total.

## `resultsLimit` (type: `integer`):

Maximum number of Reels returned for each profile input (newest first). Direct Reel URLs always return at most one result. Common values: 20, 100, 500, 1,000, 5,000.

## `reelsNewerThan` (type: `string`):

Return only Reels published after this point. An ISO date (2026-09-01, 2026-09-01T00:00:00Z) or a relative period (24 hours, 7 days, 30 days, 3 months). Pagination stops as soon as older Reels are reached; old pinned Reels at the top of a profile never stop it early. Leave empty for no limit.

## `reelsOlderThan` (type: `string`):

Return only Reels published before this point (same formats as above). Newer Reels are paged through and skipped without charge, so a far-back date makes a run slower. Leave empty for no limit.

## `skipPinnedReels` (type: `boolean`):

Leave out the Reels a creator has pinned to the top of their Reels tab. When off, pinned Reels are returned (flagged isPinned) and still never break date-based stopping.

## `includeVideoUrls` (type: `boolean`):

Return the direct video file URL of each Reel. Instagram CDN URLs are signed and expire after a while — download the files soon after the run if you need them. Files are never downloaded into the Actor's storage.

## `includeMusic` (type: `boolean`):

Return the Reel's audio: song title, artist, audio ID, whether it's original audio, and the audio file URL where Instagram exposes it. Available for Reels collected from profiles; direct Reel URLs don't include audio details.

## `includeTranscript` (type: `boolean`):

Return the Reel's spoken text from Instagram's own captions. No AI speech-to-text is ever run. Instagram currently doesn't expose those captions, so every Reel reports the transcript as unavailable; leave this on to receive them automatically if that changes.

## `includeLatestComments` (type: `boolean`):

Return comments Instagram already includes with the Reel (up to 10), with no extra requests. Instagram currently sends none with the Reel data this actor reads, so the list stays empty; commentsCount (the total) is always returned. Use a dedicated comments scraper for comment text.

## `includeOwnerDetails` (type: `boolean`):

Add the creator's full name, verified flag and follower count to each Reel. When off, owner keeps only ID, username and profile URL.

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

Apify Proxy configuration. Defaults to Apify Proxy (datacenter) enabled, which rotates IPs between sessions to avoid Instagram's per-IP limits. Apify Residential is not supported — use Custom proxy URLs for your own residential provider.

## `maxConcurrency` (type: `integer`):

Maximum number of inputs processed in parallel. Pages of one profile are always fetched one after another.

## `maxRetries` (type: `integer`):

How many times an input is retried on a fresh session/IP after rate limits, login walls or temporary Instagram errors. A profile resumes where it stopped. Content Instagram still throttles after the first retry is fetched from an alternative source instead. Not-found and private inputs are never retried.

## `debugMode` (type: `boolean`):

Enable verbose logging.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.instagram.com/natgeo/reels/"
    }
  ],
  "profiles": [
    "nasa"
  ],
  "resultsLimit": 20,
  "reelsNewerThan": "",
  "reelsOlderThan": "",
  "skipPinnedReels": false,
  "includeVideoUrls": true,
  "includeMusic": true,
  "includeTranscript": true,
  "includeLatestComments": false,
  "includeOwnerDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 5,
  "maxRetries": 4,
  "debugMode": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `musicTranscripts` (type: `string`):

No description

## `creators` (type: `string`):

No description

## `errors` (type: `string`):

No description

## `runSummary` (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": [
        {
            "url": "https://www.instagram.com/natgeo/reels/"
        }
    ],
    "profiles": [
        "nasa"
    ],
    "resultsLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/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 = {
    "startUrls": [{ "url": "https://www.instagram.com/natgeo/reels/" }],
    "profiles": ["nasa"],
    "resultsLimit": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/instagram-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 '{
  "startUrls": [
    {
      "url": "https://www.instagram.com/natgeo/reels/"
    }
  ],
  "profiles": [
    "nasa"
  ],
  "resultsLimit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/instagram-reels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,coregent/instagram-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/lDjhGEQnuTkdd6Jnm/builds/UtQhJmT9hVBsLXHeJ/openapi.json
