# Instagram Reels Downloader – Video, Audio & Metadata (`lance_api/instagram-reels-downloader-api`) Actor

Download public Instagram Reels in bulk with direct video, audio, and cover URLs. Extract captions, creator details, duration, publish date, and engagement metadata. Fast batch API for developers, automation, AI agents, and data workflows.

- **URL**: https://apify.com/lance_api/instagram-reels-downloader-api.md
- **Developed by:** [LanceAPI](https://apify.com/lance_api) (community)
- **Categories:** Social media, Videos, Developer tools
- **Features:** Limited permissions
- **Stats:** 153 total users, 59 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 1,000 reels

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 Downloader API – Download Reels & Extract Metadata

**Paste one Reel, a full URL batch, an Instagram Profile, or a Music / Audio URL. Get download-ready media URLs and clean JSON in seconds.**

Instagram Reels Downloader is a **fast, batch-ready API for downloading public Instagram Reels and extracting Reel metadata**. Send individual Reel/Post URLs, public Instagram Profiles, or Instagram Music / Audio inputs and receive the best available **video, audio, image, and cover URLs**, plus captions, creator details, duration, publish date, and available engagement numbers. No browser automation to build. No page HTML to maintain. Just clean, structured results your app can use.

This Actor is purpose-built for Reel URLs and Reels workflows. Compatible public Instagram video and carousel posts are also supported, but Reels remain the product's primary focus.

This is an **unofficial Actor** and is not affiliated with, endorsed by, or sponsored by Instagram or Meta.

#### The quick version

- **You send:** individual public Reel/Post URLs, public Profile usernames or URLs, Instagram Reels Audio URLs, Music IDs, or a mix.
- **You get:** direct video, audio, and cover links with clean Reel metadata in JSON.
- **You pay for:** successful unique results only—never failed URLs or duplicates.
- **Price per 1,000 results:** **Free $2.50 · Starter $2.00 · Scale $1.80 · Business $1.50**.
- **Free vs. paid plans:** Both Free and paid runs use the same robust media-resolution flow and the same batch capacity for eligible public Reels. Paid plans provide lower per-result pricing.
- **Batch size:** up to 200 unique direct URLs or Music / Audio inputs per run on every plan; Profile and Music modes return up to the selected per-input limit.
- **Optional enhanced mode:** if regular resolution fails, one additional recovery method can be tried. It is a low-frequency event because regular mode handles most eligible public Reels. A successful enhanced recovery costs an extra **$0.005 per result**; an unsuccessful attempt is not charged.
- **Recovery-first results:** when regular recovery is needed, the Actor prioritizes returning a usable download. Some optional metadata may be unavailable when the source does not provide it.
- **One thing to know:** Instagram CDN links expire, so download or copy the files soon after the run.

### What you get

- **The best available Reel media links** for video, separate audio, and cover images.
- **The Reel context your workflow needs:** caption, creator, publish time, duration, and available engagement metrics.
- **Fast batch processing:** submit up to 200 unique URLs per run instead of downloading Reels one by one.
- **Profile Mode:** collect either all recent public media or only Reels from usernames, `@usernames`, or Profile URLs.
- **Music / Audio Mode:** discover public Reels that use a specific licensed music track or original audio.
- **Cleaner batch jobs:** tracking parameters are removed, duplicate posts run once, and one bad URL does not stop the rest.
- **Predictable JSON:** consistent result objects and fixed engagement keys make integrations easier to maintain.
- **Easy automation:** call it from the Apify Console, REST API, JavaScript, Python, schedules, webhooks, or an AI agent.

The Actor returns URLs, not hosted copies of the files. If you need permanent storage, download the media into your own bucket or asset library right after the run.

### Try it in under a minute

1. Click **Try for free** or **Start**.
2. Paste one public Instagram Reel URL or a batch of Reel URLs.
3. Click **Start**.
4. Open **Dataset** and use the link in `media.videoUrl`, `media.audioUrl`, `media.imageUrl`, or `media.items`.

Most public Reels need nothing else. The Actor works on public content only: it does not log in on your behalf and does not accept Instagram session cookies.

Example input:

```json
{
  "urls": [
    "https://www.instagram.com/reel/DaQu2LjPIKF/"
  ]
}
```

The example is ready to run as-is. Swap in your own public Reel whenever you are ready.

Existing `urls` integrations continue to work without changes.

Profile example:

```json
{
  "profiles": [
    "instagram",
    "@example_creator",
    "https://www.instagram.com/example/"
  ],
  "profileContentType": "all_posts",
  "profileResultsLimit": 12
}
```

Mixed example:

```json
{
  "urls": ["https://www.instagram.com/reel/SHORTCODE/"],
  "profiles": ["instagram"],
  "profileResultsLimit": 12
}
```

Music / Audio example:

```json
{
  "music": [
    "https://www.instagram.com/reels/audio/1005688403740006/"
  ],
  "musicResultsLimit": 20
}
```

You can also provide the numeric Music ID directly:

```json
{
  "music": ["1005688403740006"]
}
```

### Input reference

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `urls` | array of strings | 1 demo Reel (prefilled) | Public Instagram Reel URLs using `/reel/` or `/reels/`, and compatible `/p/` posts. Profile URLs, usernames, and `@usernames` entered here are detected automatically and use the Profile settings below. Up to 200 unique Post/Reel and Profile inputs combined per run. |
| `profiles` | array of strings | Optional | Instagram usernames, `@usernames`, or Profile URLs. Equivalent forms are normalized and processed once. |
| `profileContentType` | string | `all_posts` | Use `all_posts` for recent public posts, Reels, and carousels, or `reels` to collect only Reels from the Profile's Reel feed. |
| `profileResultsLimit` | integer | `12` | Maximum successful unique results returned per Profile. Minimum 1, maximum 100. |
| `music` | array of strings | Optional | Instagram Reels Audio URLs or numeric Music IDs. Each input can return multiple public Reels using that audio. Up to 200 inputs. |
| `musicResultsLimit` | integer | `20` | Maximum successful unique Reel/audio usage results returned per Music / Audio input. Minimum 1, maximum 100. |
| `enhancedMode` | boolean | `false` | Optional. When enabled, the Actor tries an additional recovery method only if regular resolution fails. A successful enhanced recovery adds a $0.005 charge; failed enhanced attempts are free. |

#### Supported URLs

The Actor accepts:

- `https://www.instagram.com/reel/SHORTCODE/`
- `https://www.instagram.com/USERNAME/reel/SHORTCODE/`
- `https://www.instagram.com/reels/SHORTCODE/`
- `https://www.instagram.com/p/SHORTCODE/`
- The same URLs with tracking query parameters such as `?utm_source=...`

Supported hosts are `instagram.com`, `www.instagram.com`, and `m.instagram.com`. A `/p/` post may contain a video, image, or carousel. Username-prefixed Reel links are normalized to the same canonical Reel URL.

Profile URLs, including `/username/reels/`, as well as bare usernames and `@usernames`, can be entered in either `urls` or `profiles`. They automatically use Profile mode and `profileResultsLimit`; a `/username/reels/` URL selects Reels only, while a standard Profile URL or username uses `profileContentType`. The same username is processed once across both fields; an explicit `profiles` entry takes precedence.

Stories, Explore/discovery feeds, login pages, shortened share redirects, and private posts are not supported here. For Explore, hashtag, or location pages, open an individual Post/Reel and copy its URL. Open a share redirect in your browser first and provide the final canonical post or Reel URL.

#### Supported Profile inputs

- `instagram`
- `@instagram`
- `https://www.instagram.com/instagram/`

Profile Mode defaults to `all_posts`, which preserves the existing behavior and returns recent public image posts, video posts/Reels, and carousels. Set `profileContentType` to `reels` when you need only Reels; this mode follows the Profile's dedicated Reel feed and continues through available pages until it reaches your result limit or the feed ends. Private, removed, or unavailable Profiles do not produce billable media results.

### Music / Audio Mode

Discover public Instagram Reels that use a specific Music track or Original Audio.

Provide an Instagram Reels Audio URL or numeric Music ID, and the Actor returns individual public Reel records that use that audio. Each Reel is saved as a separate Dataset item and may include:

- Reel URL and shortcode
- Video, separate Reel audio, and thumbnail URLs
- Caption and author information
- Available engagement metrics
- Music or original-audio metadata
- Audio asset ID, audio cluster ID, and music canonical ID when available
- Original sound metadata when applicable

Supported inputs include `https://www.instagram.com/reels/audio/MUSIC_ID/` and a numeric Music ID. Music Mode does not use Enhanced Mode. Music metadata belongs to `platformData.instagram.music`; `media.audioUrl` remains the audio stream of the individual Reel.

#### Music / Audio results and billing

A single Instagram Music or Audio URL can return multiple Reels. Billing is based on the number of successful unique results saved to the Dataset, not on the number of input URLs or upstream API requests.

For example:

- 1 Music / Audio URL is provided
- 50 unique public Reels using that audio are found
- 50 results are saved to the Dataset
- 50 result events are charged

Failed results, duplicate Reels, and records that are not saved to the Dataset are not charged.

With `musicResultsLimit: 100`, 100 unique saved Reels produce 100 Dataset results and 100 billable results. If only 37 public Reels are available, the run returns and charges 37. If no valid result is saved, there is no result charge. With three Music inputs and `musicResultsLimit: 50`, the theoretical maximum is 150 results before cross-input deduplication.

Example requesting up to 100 Reels for one audio:

```json
{
  "music": [
    "https://www.instagram.com/reels/audio/1005688403740006/"
  ],
  "musicResultsLimit": 100
}
```

#### Batch limits and duplicate handling

- Every plan accepts up to 200 unique URLs per run.
- Blank entries are ignored and surrounding whitespace is removed.
- Exact duplicates are removed.
- URLs that differ only by `/reel/` versus `/reels/`, host spelling, or tracking parameters are normalized and processed once.
- Each unique direct URL normally creates one Dataset item, including item-level errors. One Profile can create multiple Dataset items, up to `profileResultsLimit`.
- Items are processed concurrently, so Dataset order is not guaranteed. Match results using `inputUrl` rather than array position.
- Exceeding the applicable batch limit stops the run before item processing with `BATCH_LIMIT_EXCEEDED`.

The program also recognizes the legacy keys `videoUrls`, `bulkUrls`, and `videoUrl` for existing integrations. New integrations should use `urls` because it is the documented Input Schema field.

### Output reference

A successful Dataset item contains the original URL, canonical URL, content details, media links, author information, engagement metrics, and a null `error`.

```json
{
  "success": true,
  "status": "success",
  "inputUrl": "https://www.instagram.com/reel/DaQu2LjPIKF/",
  "normalizedUrl": "https://www.instagram.com/reel/DaQu2LjPIKF/",
  "content": {
    "id": "1234567890123456789_123456789",
    "pk": "1234567890123456789",
    "shortcode": "DaQu2LjPIKF",
    "type": "video",
    "caption": "Example Instagram caption",
    "publishedAt": "2026-01-15T10:30:00.000Z",
    "durationSeconds": 18.4
  },
  "media": {
    "videoUrl": "https://example-cdn.invalid/video.mp4",
    "smallVideoUrl": "https://example-cdn.invalid/video-small.mp4",
    "audioUrl": "https://example-cdn.invalid/audio.mp4",
    "thumbnailUrl": "https://example-cdn.invalid/thumbnail.jpg",
    "mediaUrlsTemporary": true
  },
  "author": {
    "id": "123456789",
    "username": "example_creator",
    "displayName": "Example Creator",
    "avatarUrl": "https://example-cdn.invalid/avatar.jpg",
    "verified": false
  },
  "engagement": {
    "viewCount": 1200,
    "playCount": 1320,
    "likeCount": 85,
    "commentCount": 7,
    "shareCount": null
  },
  "platformData": {
    "instagram": {
      "productType": "clips",
      "mediaType": 2
    }
  },
  "error": null
}
```

The example uses placeholder CDN URLs to show the response structure. Real runs return the available URLs supplied for the requested Instagram post.

#### Top-level fields

| Field | Meaning |
| --- | --- |
| `success` | `true` when usable media was resolved; otherwise `false`. |
| `status` | Stable result category such as `success`, `invalid_url`, `login_required`, `private_content`, `media_not_found`, or `error`. |
| `inputUrl` | The URL supplied by the user. |
| `normalizedUrl` | Canonical Instagram URL without tracking parameters, when normalization succeeds. |
| `content` | Post identity, type, caption, publication time, and duration when available. |
| `media` | Resolved media and thumbnail URLs. |
| `author` | Available creator identity and profile metadata. |
| `engagement` | Stable engagement counters. |
| `platformData` | Small Instagram-specific classification values when available. |
| `error` | `null` on success; otherwise a safe error object. |

#### Content fields

| Field | Meaning |
| --- | --- |
| `id` | Instagram media identifier when supplied. |
| `pk` | Instagram media primary key when supplied. |
| `shortcode` | Shortcode used in the canonical post URL. |
| `type` | Normalized media type: `video`, `image`, or `carousel`. |
| `caption` | Post caption or description when available. |
| `publishedAt` | Publication time as an ISO 8601 timestamp when available. |
| `durationSeconds` | Video duration in seconds, rounded to at most two decimal places. |

#### Media fields

| Field | Meaning |
| --- | --- |
| `videoUrl` | Preferred downloadable video URL. |
| `smallVideoUrl` | A smaller video alternative when a genuinely different variant is available. |
| `audioUrl` | Separate audio-track URL when available. |
| `thumbnailUrl` | Cover or preview image URL. |
| `imageUrl` | Downloadable image URL for an image item. |
| `videoVariants` | Additional video variants when the source exposes distinct alternatives. |
| `items` | Normalized child media for a carousel. Each item may contain its own type and media URLs. |
| `mediaUrlsTemporary` | Always `true`; download URLs are temporary and can expire. |

Optional fields are emitted only when the source provides a real value. Empty `videoVariants` or `items` arrays are not added merely as placeholders.

#### Engagement fields

The `engagement` object always contains the following five keys:

| Field | Meaning |
| --- | --- |
| `viewCount` | Independent view count supplied by Instagram, or `null`. |
| `playCount` | Independent play count supplied by Instagram, or `null`. |
| `likeCount` | Like count, or `null`. |
| `commentCount` | Comment count, or `null`. |
| `shareCount` | Share count, or `null`. There is no separate switch or charge for this field. |

Unavailable engagement values are returned as `null`, not copied from another metric, estimated, or replaced with zero. `viewCount` and `playCount` may be equal, different, or independently unavailable because they represent separate source fields.

### Carousel and image posts

For a carousel, `content.type` is `carousel` and the downloadable child media is returned in `media.items`. Each child is normalized independently and can be a video or image.

For a single image post, `content.type` is `image` and the preferred file is normally available in `media.imageUrl`. Because Instagram can expose different combinations of media fields, integrations should check the relevant URL fields instead of assuming every result contains `media.videoUrl`.

### Download the returned media

The Dataset stores URLs, not the media bytes. To save a returned file, read the appropriate URL from the result and download it promptly. For example:

```bash
curl -L 'RETURNED_MEDIA_URL' -o instagram-media.mp4
```

Use the correct file extension for the returned media type. Do not treat a CDN URL as a permanent identifier or publish it as a long-lived link.

### Status and error handling

| Status | Meaning |
| --- | --- |
| `success` | At least one usable media URL was resolved. |
| `invalid_url` | The input is malformed or is not a supported Instagram post/Reel URL. |
| `login_required` | Instagram placed the requested public page behind a login check. |
| `private_content` | The content is private or otherwise inaccessible. |
| `media_not_found` | No usable video, audio, or image source was found. |
| `error` | Another item-level or temporary error occurred. Inspect `error.code` and `error.retryable`. |

Failed result example:

```json
{
  "success": false,
  "status": "media_not_found",
  "inputUrl": "https://www.instagram.com/reel/EXAMPLE/",
  "normalizedUrl": "https://www.instagram.com/reel/EXAMPLE/",
  "content": {},
  "media": {},
  "author": {},
  "engagement": {
    "viewCount": null,
    "playCount": null,
    "likeCount": null,
    "commentCount": null,
    "shareCount": null
  },
  "platformData": {
    "instagram": {}
  },
  "error": {
    "code": "MEDIA_NOT_FOUND",
    "message": "Media was not found.",
    "retryable": false
  }
}
```

If `error.retryable` is `true`, retry the URL later. A valid public post can be temporarily unavailable because of rate limits, login gating, regional or age restrictions, CDN changes, or changes to the page response.

Item-level failures do not stop other URLs in the batch. Top-level input errors such as empty input or an exceeded batch limit stop the run before Dataset processing.

### Run with JavaScript

Install the Apify API client:

```bash
npm install apify-client
```

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

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

const input = {
  urls: ['https://www.instagram.com/reel/DaQu2LjPIKF/'],
};

const run = await client
  .actor('lance_api/instagram-reels-downloader-api')
  .call(input);

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

### Run with Python

Install the Apify API client:

```bash
pip install apify-client
```

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])

run_input = {
    'urls': ['https://www.instagram.com/reel/DaQu2LjPIKF/'],
}

run = client.actor('lance_api/instagram-reels-downloader-api').call(
    run_input=run_input
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Run with cURL

The synchronous endpoint starts the Actor, waits for completion, and returns Dataset items:

```bash
curl -X POST \
  'https://api.apify.com/v2/acts/lance_api~instagram-reels-downloader-api/run-sync-get-dataset-items' \
  -H 'Authorization: Bearer APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "urls": ["https://www.instagram.com/reel/DaQu2LjPIKF/"]
  }'
```

For long or large batches, use the asynchronous Run Actor endpoint and retrieve the Dataset after the run finishes. Keep API tokens out of source control, screenshots, prompts, and logs.

### Use with AI agents through MCP

After publication, MCP-compatible AI clients can discover and run this Actor through the hosted Apify MCP server.

1. Connect the client to `https://mcp.apify.com` using Streamable HTTP.
2. Authenticate with Apify using your client's supported OAuth or API-token method.
3. Ask the agent to find and run `lance_api/instagram-reels-downloader-api`.
4. Provide individual public Instagram post or Reel URLs and ask the agent to retrieve the Dataset output.

Common MCP tools are `search-actors`, `fetch-actor-details`, and `call-actor`. Running an Actor and reading its storage requires authentication.

Example agent request:

> Run lance_api/instagram-reels-downloader-api for this public Instagram Reel and return the downloadable video URL, caption, author, duration, and engagement metadata.

### Pricing

Pay only for successful, unique results. Your price automatically drops with your Apify plan:

| Apify plan | Price per 1,000 successful results | Price per result |
| --- | ---: | ---: |
| Free | **$2.50** | $0.0025 |
| Starter | **$2.00** | $0.0020 |
| Scale | **$1.80** | $0.0018 |
| Business | **$1.50** | $0.0015 |

One result can include a video, a separate audio track, a cover image, Music metadata, or multiple carousel items. You still pay for **one result**, not for every file inside it. Profile and Music provider requests are not billed as media results: charges are based on successful unique media saved to the Dataset. One Post, Reel, carousel, or Reel discovered through Music Mode equals one result.

Failed or unsupported inputs, duplicate Reels, and results that are not saved do **not** trigger a `media-result` charge. Apify may separately show its standard Actor-start event in the run pricing.

Enhanced mode is optional and off by default. Regular mode resolves the large majority of eligible public Reels. If enhanced mode is enabled, it runs only after regular resolution fails and adds **$0.005 for each result it successfully recovers**. If enhanced recovery also fails, there is no enhanced-result charge. A recovered result still receives the normal successful-result charge in addition to the enhanced-mode charge.

Free and paid runs use the same robust media-resolution flow and the same batch capacity for eligible public Reels. Paid plans provide lower per-result pricing. Invalid, private, and confirmed removed content remains unsupported on every plan.

For recovered Reels, downloadable media is prioritized. Optional metadata can be `null` when the available source does not return that field.

### Use cases

- Build a searchable collection of viral or high-performing Reels
- Monitor creators, competitors, campaigns, and short-form content trends
- Feed Reel videos and captions into AI analysis, moderation, or classification pipelines
- Collect Reel metadata for social media research and reporting
- Pull Reels into editing, clipping, localization, or repurposing workflows
- Power Reels-focused datasets, no-code automations, internal tools, and AI agents

### Built for Instagram Reels workflows

Use this Actor as an **Instagram Reels Downloader API**, an **Instagram Reel URL extractor**, or a lightweight **Instagram Reels scraper** for individual URLs and batches. The workflow stays simple: Reel URL → downloadable video or audio URL → caption, author, duration, and engagement metadata → your storage, analysis, or automation pipeline.

It provides the core of an **Instagram Reel Downloader**: submit URLs, download Instagram Reels through temporary direct media links, and collect structured **Instagram Reels metadata** in one request. It works well for developers building a Reel video downloader, creator-monitoring workflow, short-video dataset, competitive research tool, or AI content-analysis system. Results are structured for APIs and automation rather than manual browser downloads.

#### Reels-focused or general-purpose?

Choose this Actor when your workflow centers on **Instagram Reels**, Reel metadata, creator monitoring, or short-form video analysis. If you need a broader tool positioned around general Instagram videos and media-processing infrastructure, use **Instagram Video Downloader API** instead. Both Actors use the same proven media-resolution foundation but serve different search intent and workflow needs.

### Limits and practical notes

- Public Instagram posts, Reels, and recent public Profile media are supported.
- Private posts, removed posts, Stories, login pages, and unsupported redirect/share URLs cannot be downloaded.
- Public content only. The Actor does not log in, does not accept session cookies, and cannot reach private or login-walled media.
- Metadata is best effort. Instagram may omit captions, counters, author fields, audio tracks, or alternative media variants.
- A separate Reel audio track is returned only when available. Song information, when present, stays in `platformData.instagram.music`; it does not replace the Reel's own audio. Available audio/mute flags are recorded in `platformData.instagram.hasAudio` and `audioMuted`.
- Download URLs are temporary and may stop working after the run.
- Instagram can rate-limit requests, change page data, or temporarily withhold media URLs.
- Dataset item order is not guaranteed for batches.
- No permanent file hosting, comment-list scraping, follower/following collection, or historical engagement tracking is included.

### Responsible use

Use this Actor only for content you are legally permitted to access, download, and process. Respect privacy, copyright, contractual restrictions, Instagram's terms, and applicable laws. Do not use it to access private content, bypass access controls, or process another person's account without authorization.

Never publish, log, email, or include an Apify API token or any other credential in a support request. Rotate any credential immediately if it is exposed.

### Related Actors

Need more Reels to download, a way to analyze the ones you already have, or a closer look at their creators? The same Instagram family covers the whole workflow, in the same order as the Input page:

1. [Instagram Search Scraper](https://apify.com/lance_api/instagram-search-scraper-api) — discover Reels, creators, and topics when you do not have a Reel URL yet.
2. [Instagram Profile Posts & Reels Scraper](https://apify.com/lance_api/instagram-profile-posts-reels-scraper) — collect all Posts and Reels from a creator.
3. [Instagram Video Transcript Scraper](https://apify.com/lance_api/instagram-video-transcript-scraper) — turn Reels and video posts into text, timestamps, SRT, and WebVTT.
4. [Instagram Stories Scraper](https://apify.com/lance_api/instagram-stories-scraper-api) — see what the creator is posting right now.
5. [Instagram Music & Audio Scraper](https://apify.com/lance_api/instagram-music-audio-scraper) — find more Reels that use a specific sound.
6. [Instagram Likers Scraper](https://apify.com/lance_api/instagram-likers-scraper) — collect the available liker profiles of a Reel.
7. [Instagram Comments & Replies Scraper](https://apify.com/lance_api/instagram-comments-scraper-api) — collect comments and replies.

More Instagram tools: [Instagram Profile Scraper](https://apify.com/lance_api/instagram-profile-scraper) · [Instagram Followers & Following Scraper](https://apify.com/lance_api/instagram-followers-following-scraper) · [Instagram Profile Email Scraper](https://apify.com/lance_api/instagram-profile-email-scraper) · [Instagram Highlights Scraper](https://apify.com/lance_api/instagram-highlights-scraper-api)

### FAQ

#### Does this Actor save files to Apify storage?

No. It returns temporary downloadable URLs in the Dataset. Your application must download and store the files if permanent retention is required.

#### Why did a valid-looking URL fail?

The post may be private, removed, image-only with unavailable image data, region- or age-restricted, temporarily rate-limited, or placed behind a login check. Confirm that the final canonical URL opens publicly in a logged-out browser and retry later when `error.retryable` is `true`.

#### Why is the caption or another metadata field missing?

Instagram may not expose every field in every response. Optional `content`, `media`, and `author` fields are omitted when unavailable rather than populated with invented values.

#### Why are `viewCount` and `playCount` equal?

They are independent source values and are never copied from one another. Instagram can report the same number for both, different numbers, or omit either value.

#### Is `shareCount` charged separately?

No. It is returned whenever available and otherwise set to `null`. There is no share-count option or separate fee.

#### Are duplicate URLs returned or charged twice?

No. Canonical duplicates are processed once. Tracking parameters, equivalent Reel path variants, and supported host variants do not create additional results or charges.

#### Why are `videoVariants` or carousel `items` missing?

Those fields appear only when Instagram exposes genuine alternatives. Empty arrays are not returned as processing diagnostics.

#### Can I download every file from a carousel?

When carousel children are available, they are returned in `media.items`. Check each child object's `type`, `videoUrl`, and `imageUrl` fields.

#### Does the Actor scrape profiles, Stories, or comments?

It can collect recent public media from Profile usernames or URLs; Profile URLs, usernames, and `@usernames` entered in `urls` are recognized automatically. For a dedicated Profile workflow, use [Instagram Profile Posts & Reels Scraper](https://www.apify.com/lance_api/instagram-profile-posts-reels-scraper).

For currently active Stories, use [Instagram Stories Scraper](https://www.apify.com/lance_api/instagram-stories-scraper-api) with the profile username in its `usernames` field, not a Story URL. This Actor does not collect Stories, comment bodies, follower/following lists, or an unlimited historical archive.

#### How should I handle temporary download URLs?

Download the files immediately after the run and store them in storage you control. Do not rely on Instagram CDN URLs remaining valid.

### Support

For help, open an issue on the Actor page or email lanceapi2026@hotmail.com.

Include the Actor run ID, the input URL with unnecessary query parameters removed, the expected behavior, the actual `status` and `error.code`, and a short reproducible description. Never send Apify tokens, passwords, cookies, or other credentials.

# Actor input Schema

## `urls` (type: `array`):

Enter public Instagram Reel or Post URLs. Profile URLs, usernames, and @usernames entered here are also detected automatically and use the Profile content type and maximum-results settings below. Supports videos, photos, and carousels. Every plan accepts up to 200 unique Post/Reel and Profile inputs combined per run.

## `enhancedMode` (type: `boolean`):

If regular resolution fails, try an additional low-frequency recovery method. The extra $0.005 charge applies only when enhanced mode successfully returns a result; unsuccessful attempts are not charged.

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

Enter usernames, @usernames, or Instagram Profile URLs, including /username/reels/, to collect recent public media. These inputs are also accepted in Instagram URLs; this section keeps Profile collection settings easy to find. A /username/reels/ URL selects Reels only.

## `profileResultsLimit` (type: `integer`):

Maximum successful unique results returned for each Profile. In All posts mode this includes public posts, Reels, and carousels; in Reels mode it counts Reels only.

## `profileContentType` (type: `string`):

Choose whether Profile mode returns all recent public media or only Reels. All posts preserves the existing behavior; Reels uses dedicated Reel feeds and pagination.

## `music` (type: `array`):

Enter Instagram Reels audio URLs or Music IDs to collect public Reels using that audio.

## `musicResultsLimit` (type: `integer`):

Maximum successful unique Reel/audio usage results returned for each Music / Audio input.

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/reel/DaQu2LjPIKF/"
  ],
  "enhancedMode": false,
  "profileResultsLimit": 12,
  "profileContentType": "all_posts",
  "musicResultsLimit": 20
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "urls": [
        "https://www.instagram.com/reel/DaQu2LjPIKF/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lance_api/instagram-reels-downloader-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 = { "urls": ["https://www.instagram.com/reel/DaQu2LjPIKF/"] }

# Run the Actor and wait for it to finish
run = client.actor("lance_api/instagram-reels-downloader-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 '{
  "urls": [
    "https://www.instagram.com/reel/DaQu2LjPIKF/"
  ]
}' |
apify call lance_api/instagram-reels-downloader-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lance_api/instagram-reels-downloader-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/y3uzYAhSuIK2ad8hE/builds/5s1kkalz7bQjNnC8K/openapi.json
