# Instagram Reel Scraper: Reels, Plays & Music by Profile (`xmolodtsov/instagram-reel-scraper`) Actor

Export public Instagram data, no login: reels by profile with plays, likes, captions, music and media URLs. Separate views when available; no latest comments.

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

## Pricing

from $0.60 / 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

Export public Instagram reels by profile, with plays, likes, comment counts, captions, music and media URLs. Instagram Reel Scraper collects **public Instagram data, no login**, and saves one row per reel for CSV, Excel or JSON export.

Use it to compare brand content, build a reel archive, follow music usage, or send public engagement data into a reporting workflow. Plays and views are separate fields. For current clips, distinct views are usually unavailable and stay `null`.

![Reel scraper avatar](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/instagram-reel-scraper-avatar.png)

### Quick start

1. Enter profile usernames such as `nasa`, `@nike`, or profile URLs such as `https://www.instagram.com/nasa/reels/`.
2. Choose **Reels per profile** and the run-wide **Maximum reels per run**.
3. Keep the default Apify datacenter proxy, start the run, and export the dataset.

The prefill requests 10 NASA reels. No Instagram account or account cookies are required. Reel and post URLs are not accepted: use profile URLs or usernames.

```json
{
  "username": ["nasa"],
  "resultsLimit": 10,
  "maxItems": 1000,
  "skipPinnedPosts": false,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Call the actor from an Apify integration or over HTTP:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/xmolodtsov~instagram-reel-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username":["nasa"],"resultsLimit":10}'
```

For deeper jobs, start an asynchronous run, wait for completion and read its default dataset. Results remain available in Apify Console. You can connect the actor to n8n, Make, Zapier, webhooks or a scheduled Apify run. Keep your Apify token in the integration's credential store.

### Input

| Field | Default | Meaning |
|---|---|---|
| `username` | Required | Array of 1–100 handles or profile URLs, including `/reels/`. Trimmed, lower-cased and deduplicated. Invalid entries are skipped with a warning when valid entries remain. All-invalid input fails `invalid:`. |
| `resultsLimit` | 30 | Reels per profile, 1–10,000. Profiles run in input order. |
| `onlyPostsNewerThan` | Unset | UTC `YYYY-MM-DD` or relative `N days`. Stops at the first older non-pinned reel; older pinned reels are excluded without stopping the walk. |
| `skipPinnedPosts` | `false` | Exclude reels marked pinned by the source. |
| `maxItems` | 1000 | Run-wide cap, 1–100,000, across all profiles. Free-plan limits can reduce this. |
| `proxyConfiguration` | Apify DC | Default Apify datacenter; residential is an explicit option. Free runs use Apify Proxy only. |

### Output

The overview table highlights profile, caption, timestamp, independent plays/views, likes, comment count, duration and pin status. IDs remain exact strings. Missing scalar values are `null`; missing lists are empty arrays.

The example below comes from a real NASA proof run. Any personal attribution is replaced with a placeholder. Media URLs are omitted here for readability and are included in dataset rows.

```json
{
  "id": "4012178708962240288",
  "shortCode": "DeuH0dDFGcg",
  "url": "https://www.instagram.com/reel/DeuH0dDFGcg/",
  "type": "Video",
  "productType": "clips",
  "timestamp": "2026-10-20T15:10:43.000Z",
  "likesCount": 44413,
  "commentsCount": 377,
  "videoPlayCount": 3201406,
  "videoViewCount": null,
  "videoDuration": 45.82400131225586,
  "dimensionsHeight": 720,
  "dimensionsWidth": 405,
  "isPinned": false,
  "ownerUsername": "nasa",
  "ownerId": "528817151",
  "inputUrl": "nasa",
  "scrapedAt": "2026-10-21T21:41:10.839Z",
  "caption": "There's a lot of ground to cover when you're building a Moon Base.\n\nWe're sharing the latest details on the vehicles that will help pave the way for an enduring human presence near the lunar South Pole. Check @example_creator's link-in-bio for the full update.",
  "musicInfo": {
    "artistName": "example_creator",
    "songName": "Original audio",
    "audioId": "29906171498985608",
    "usesOriginalAudio": true,
    "shouldMuteAudio": false
  }
}
```

![Real reel dataset preview](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/instagram-reel-scraper-output-preview.png)

| Fields | Source meaning |
|---|---|
| `id`, `shortCode`, `url`, `type`, `productType` | Media identity; canonical `/reel/<code>/` URL; type `Video`; source product type, including legacy videos when returned. |
| `caption`, `hashtags`, `mentions`, `timestamp` | Caption, extracted tags/mentions and ISO publication time. |
| `likesCount`, `commentsCount` | Public counters; likes are null when the source marks them hidden. |
| `videoPlayCount` | `play_count` or `ig_play_count` only. |
| `videoViewCount` | `view_count` only; usually null for clips. Plays are never copied into views, or views into plays. |
| `videoDuration`, `videoUrl`, `displayUrl` | Duration in seconds (scalar or DASH), video playback URL and preview image URL. These signed URLs can expire. |
| `dimensionsHeight`, `dimensionsWidth` | Source media dimensions. |
| `musicInfo` | Artist, song, exact audio ID, original-audio flag and mute flag, when supplied. |
| `coauthorProducers`, `taggedUsers` | Source-supplied usernames, without profile enrichment. |
| `locationName`, `locationId` | Public tagged location when supplied. |
| `isPinned`, `isCommentsDisabled` | Source pin and comments settings; comments-disabled remains null when unavailable. |
| `ownerUsername`, `ownerId`, `ownerFullName` | Public media owner fields. |
| `inputUrl`, `scrapedAt` | First input as given and ISO collection time. |

### Pricing and free-plan limits

You pay per saved reel through the dataset-item event. No start or add-on fee is charged by this actor.

| Apify plan | USD per 1,000 reels |
|---|---:|
| Free | $0.78 |
| Bronze | $0.72 |
| Silver | $0.66 |
| Gold | $0.60 |
| Platinum / Diamond | $0.60 |

Examples: 10 reels cost $0.0078 on Free; 100 reels cost $0.072 on Bronze; 1,000 reels cost $0.60 on Gold. Apify compute, storage and proxy usage are additional platform costs. A profile with fewer reachable reels costs fewer result events.

#### Is it free?

The developer limit on the Apify free plan is **100 results per run and 20 runs per calendar month (UTC)**. Free-plan result events use the Free rate above and consume available Apify credits; the cap does not waive actor or platform fees. The monthly limit is atomic across concurrent runs and resets on the 1st. Once used, the actor succeeds with a clear quota message before making target requests. Paid plans use the requested limits. Free runs always use Apify Proxy.

### Coverage and failure handling

Pagination follows the source cursor until a clean end, a requested cap, a date boundary, or a bounded failure. Deduplication by media ID applies across the run, including reboots and migrations; saved rows seed both the run cap and per-profile cap after restart.

A profile that is unknown, private or unavailable to guests is counted separately. An input problem or a deep page failure ends that profile and allows later profiles to run. If any rows have been saved, later errors produce a successful partial run. Zero rows succeed only for confirmed empty results or filters; processing failures produce a classified failure (`blocked:`, `network:`, `timeout:`, `invalid:`, `quota:` or `outdated:`). A missing or repeated cursor while the source says more are available is reported as truncation, not a clean end.

The run stops starting requests before its platform deadline so it can flush rows and statistics. Reaching the result-event budget ends successfully with **run budget reached**. Check `STATISTICS` in the run's key-value store for profile outcomes, pages, saved rows, refusal codes, transport faults, truncations, residential retries/transfer and elapsed time.

The default proxy can make one residential attempt only after its DC attempts receive no HTTP answer. Instagram refusals never trigger that lane. Explicit proxy choices keep their selected class. Each attempt uses a fresh proxy session and public guest CSRF cookie. Some profiles stall when legacy feed videos are included: a transport retry excludes those videos for that profile, logs the change and counts it. That recovery preserves reels but may omit legacy feed videos.

Public guest visibility can differ from the app and can change. Pin flags and counters are returned only as supplied by Instagram. Relative dates are evaluated at run start. Source ordering and visible inventory determine what is reachable; the actor cannot promise every reel ever published.

### What's not included

No latest comments, first comment, transcripts, media downloads, shares, private profiles, account access or contact enrichment. `commentsCount` is a public scalar, not the comment text. Video URLs are exported; the actor does not download the videos. Distinct views are null unless Instagram supplies `view_count` separately.

### FAQ

#### Why are views null when plays are present?

Current clip responses expose plays. Legacy videos sometimes expose a separate view counter. The fields retain those meanings; a missing view counter is not zero.

#### Why did I receive fewer reels than requested?

The profile may have fewer guest-visible reels; duplicates, dates or pinned filters may remove rows. A source pagination problem, unavailable profile, deadline, run budget or free cap can also stop collection. Inspect each input outcome in `STATISTICS`.

#### Is it legal to scrape public Instagram data?

This actor accesses publicly available data without an Instagram account. Whether a particular collection or use is lawful depends on your jurisdiction, purpose and applicable terms. Public profile information can still be personal data: assess your GDPR/CCPA obligations, minimize collection, respect deletion requests and avoid using results for unwanted contact. The actor provides no legal advice or private-data access.

#### Where can I get help?

Use the actor's Apify Issues tab with the run ID, input shape and the affected public profile. Do not include credentials. The log and `STATISTICS` distinguish source refusals, transport timeouts and malformed pagination.

### More scrapers from this developer

**TikTok:** [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper): Videos and creators for any keyword, pay per result · [TikTok Profile Scraper (Pay Per Result)](https://apify.com/xmolodtsov/tiktok-profile-scraper): Profiles, followers and latest posts by username · [TikTok Comments Scraper](https://apify.com/xmolodtsov/tiktok-comments-scraper): Comments and full reply threads from any video · [TikTok Hashtag Scraper](https://apify.com/xmolodtsov/tiktok-hashtag-scraper): Videos for any hashtag, with views, likes and music · [TikTok Sound & Music Scraper](https://apify.com/xmolodtsov/tiktok-sound-scraper): Videos that use a sound or song · [TikTok Top Ads Scraper](https://apify.com/xmolodtsov/tiktok-top-ads-scraper): Public Creative Center ad rankings, engagement, media and landing pages

**Social & news:** [Reddit Search Scraper](https://apify.com/xmolodtsov/reddit-scraper): Posts by keyword, subreddit or author · [Google News Scraper](https://apify.com/xmolodtsov/google-news-scraper): Google News results as clean full-text articles · [Threads Replies Scraper](https://apify.com/xmolodtsov/threads-replies-scraper): Public post replies, likes, authors and inline nested replies

**E-commerce:** [Prom.ua Product Search Scraper](https://apify.com/xmolodtsov/prom-ua): Prom.ua product search results, no browser needed · [Amazon Product Search & Bestsellers Scraper](https://apify.com/xmolodtsov/amazon-search-scraper): Search results, Best Sellers and product details from Amazon · [AliExpress Search Scraper](https://apify.com/xmolodtsov/aliexpress-search-scraper): AliExpress products by keyword with prices, orders and shipping · [AliExpress Product Reviews Scraper](https://apify.com/xmolodtsov/aliexpress-reviews-scraper): Public product reviews, ratings, buyer photos and follow-up feedback

**Maps & leads:** [Google Maps Scraper](https://apify.com/xmolodtsov/google-maps-scraper): Places, leads and emails from Google Maps

**Ads:** [Facebook Ad Library Scraper (Meta Ads Library)](https://apify.com/xmolodtsov/facebook-ads-library-scraper): Ads from the Meta Ad Library, with EU reach and payers · [Google Ads Transparency Scraper](https://apify.com/xmolodtsov/google-ads-transparency-scraper): Google ad creatives by advertiser or domain, with regional details

**Video:** [YouTube Transcript Scraper](https://apify.com/xmolodtsov/youtube-transcript-scraper): Transcripts, subtitles and captions from YouTube videos · [YouTube Shorts Scraper](https://apify.com/xmolodtsov/youtube-shorts-scraper): Shorts of any channel with exact views, likes and duration · [YouTube Channel Scraper](https://apify.com/xmolodtsov/youtube-channel-scraper): Every video of a channel, with channel stats · [YouTube Search Scraper](https://apify.com/xmolodtsov/youtube-search-scraper): Search results and videos for any keyword · [YouTube Comments Scraper](https://apify.com/xmolodtsov/youtube-comments-scraper): Comments, replies and likes from any video · [Bilibili Comments Scraper](https://apify.com/xmolodtsov/bilibili-comments-scraper): Public hot comments and reply threads by video or keyword

**Jobs:** [SEEK Job Listings Scraper](https://apify.com/xmolodtsov/seek-jobs-scraper): Public AU/NZ job listings, salaries and redacted descriptions

# Changelog

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

# Actor input Schema

## `username` (type: `array`):

One to 100 usernames (optional @) or instagram.com/profile/ or /profile/reels/ URLs. Trimmed, lower-cased and deduplicated. Invalid entries are skipped with a warning if any valid profiles remain. Use profile URLs or usernames; reel and post URLs are not accepted.

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

Maximum reels saved per profile. Profiles are processed in input order, subject to the run-wide maxItems cap and guest-visible source inventory.

## `onlyPostsNewerThan` (type: `string`):

Optional UTC date YYYY-MM-DD or relative N days, for example 30 days. Stops at the first older non-pinned reel. Pinned reels are judged by their own date and never stop pagination.

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

Exclude reels pinned to the profile or reels tab when the source supplies the pin flag.

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

Run-wide saved result limit across all profiles. Apify free plan: 100 results per run and 20 runs per calendar month (UTC), a developer limit. Paid plans use the requested cap.

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

Apify datacenter by default. Default proxy may retry once on Apify RESIDENTIAL only after DC transport faults with no HTTP answer. Explicit proxy choices never change. Free runs use Apify Proxy only.

## Actor input object example

```json
{
  "username": [
    "nasa"
  ],
  "resultsLimit": 10,
  "skipPinnedPosts": false,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One reel per row. Exact string id, shortCode, url, type, productType, caption, hashtags, mentions, timestamp, likesCount, commentsCount, videoPlayCount (plays only), videoViewCount (views only or null), videoDuration, videoUrl, displayUrl, dimensionsHeight, dimensionsWidth, musicInfo, coauthorProducers, taggedUsers, locationName, locationId, isPinned, isCommentsDisabled, ownerUsername, ownerId, ownerFullName, inputUrl, scrapedAt. Missing scalars null; collections empty arrays.

# 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 = {
    "username": [
        "nasa"
    ],
    "resultsLimit": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("xmolodtsov/instagram-reel-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 = {
    "username": ["nasa"],
    "resultsLimit": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("xmolodtsov/instagram-reel-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 '{
  "username": [
    "nasa"
  ],
  "resultsLimit": 10
}' |
apify call xmolodtsov/instagram-reel-scraper --silent --output-dataset

```

## MCP server setup

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