# Instagram Profile Reels Scraper – Reel Export (`scrapingmonkey/instagram-profile-reels`) Actor

Scrape public Reels from Instagram profiles with pagination. Export one row per Reel with URLs, IDs, engagement, dimensions, author data, and thumbnails.

- **URL**: https://apify.com/scrapingmonkey/instagram-profile-reels.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Collect public Reels from Instagram profiles with pagination. **Instagram Profile Reels Scraper** accepts plain usernames and returns one structured dataset row per Reel, including its URL, identifiers, engagement, dimensions, author details, and available thumbnail variants.

Choose how many profile Reel pages to request and process multiple accounts in one run. No Instagram login, cookies, or profile URLs are required.

| At a glance | Details |
|---|---|
| 📥 Input | Plain Instagram usernames and pages per profile |
| 📤 Output | One row per Reel with URL, IDs, counts, dimensions, author, and thumbnails |
| 📄 Pagination | Up to 12 Reels per requested page when Instagram supplies them |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 profile-page requests concurrently with automatic retries |
| 💾 Delivery | Apify dataset exportable as JSON, CSV, Excel, XML, and more |

### What the Instagram profile Reels scraper collects 🎬

The Actor uses the profile's public Reels feed instead of scraping mixed profile posts and filtering them afterward. This produces a compact Reel-focused dataset for analytics and integrations.

Every success row can include:

- Canonical Reel URL, media ID, PK, and shortcode
- Instagram result type, product type, and numeric media type
- Like, comment, view, and play counts when public
- Reel thumbnail, width, height, and all available image versions
- Hidden-count and pinned-Reel flags
- Author ID, username, name, profile URL, pictures, privacy, and verification

### How to scrape Reels from an Instagram profile 🚀

1. Add one or more usernames without `@`.
2. Set `pagesPerProfile` to the number of Reel pages to attempt.
3. Start the Actor.
4. Review success and failed rows in the dataset.
5. Export the results or consume them through the API.

```json
{
  "inputList": [
    "nike",
    "nasa"
  ],
  "pagesPerProfile": 2
}
```

Do not submit profile links. `nike` is valid; `@nike` and `https://www.instagram.com/nike/` are not.

### Profile Reel output fields 📦

| Field | Type | Meaning |
|---|---|---|
| `input` | string | Source username submitted to the Actor |
| `status` | string | `success` or `failed` |
| `image_url` | string or null | Primary Reel thumbnail |
| `url` | string or null | Canonical Reel URL |
| `id`, `pk`, `code` | string or null | Reel identifiers and shortcode |
| `type`, `product_type` | string or null | Normalized and Instagram product types |
| `media_type` | integer or null | Instagram numeric media type |
| `like_count`, `comment_count` | integer or null | Public engagement counts |
| `view_count`, `play_count` | integer or null | Public viewing metrics |
| `width`, `height` | integer or null | Media dimensions |
| `counts_hidden` | boolean or null | Whether counts are hidden |
| `is_pinned` | boolean or null | Whether the Reel is pinned in the profile tab |
| `author` | object or null | Full source-profile identity |
| `image_versions` | array or null | Available thumbnail sizes |

Complete successful dataset item:

```json
{
  "input": "nike",
  "status": "success",
  "image_url": "https://instagram.example/reel-cover.jpg",
  "url": "https://www.instagram.com/reel/DctPchKOVcw/",
  "id": "1234567890123456789_13460080",
  "pk": "1234567890123456789",
  "code": "DctPchKOVcw",
  "type": "reel",
  "product_type": "clips",
  "media_type": 2,
  "like_count": 24500,
  "comment_count": 410,
  "view_count": 340000,
  "play_count": 352000,
  "width": 1080,
  "height": 1920,
  "counts_hidden": false,
  "is_pinned": false,
  "author": {
    "profile_picture_url": "https://instagram.example/nike.jpg",
    "profile_picture_url_hd": "https://instagram.example/nike-hd.jpg",
    "username": "nike",
    "name": "Nike",
    "id": "13460080",
    "pk": "13460080",
    "profile_url": "https://www.instagram.com/nike/",
    "is_verified": true,
    "is_private": false
  },
  "image_versions": [
    {
      "url": "https://instagram.example/reel-cover-1080.jpg",
      "width": 1080,
      "height": 1920
    }
  ]
}
```

Complete failed dataset item:

```json
{
  "input": "unavailable_profile",
  "status": "failed",
  "image_url": null,
  "url": null,
  "id": null,
  "pk": null,
  "code": null,
  "type": null,
  "product_type": null,
  "media_type": null,
  "like_count": null,
  "comment_count": null,
  "view_count": null,
  "play_count": null,
  "width": null,
  "height": null,
  "counts_hidden": null,
  "is_pinned": null,
  "author": null,
  "image_versions": null
}
```

Instagram CDN thumbnail URLs can expire. Download authorized assets promptly if you need permanent copies.

### Input and pagination settings ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | array of strings | Yes | None | At least one plain Instagram username |
| `pagesPerProfile` | integer | No | `1` | Minimum `1` |

One requested page can expose up to 12 Reels. The actual total may be lower because a profile has fewer Reels, Instagram ends pagination, items overlap, or duplicates are removed. The setting controls pages to attempt, not a guaranteed result count.

Rows are saved after each processed page, so earlier successful pages remain available even if a later page cannot be retrieved.

### Profile Reels use cases 🎯

#### Creator and brand monitoring

Build repeatable datasets of public Reels from selected accounts and compare visible engagement over time.

#### Short-form video research

Collect Reel links, thumbnails, dimensions, plays, and author context for content analysis.

#### Campaign discovery

Review pinned videos and recent Reels from brands, athletes, publishers, or public creators.

#### Content pipelines

Send profile Reel rows to spreadsheets, databases, dashboards, moderation systems, or enrichment jobs.

#### URL collection

Create clean lists of canonical Reel URLs before running deeper per-Reel extraction only on selected items.

### Pricing and billable results 💰

Check the Actor's **Pricing** tab for the current model and rate. Pricing can change independently of the code and documentation.

Under dataset-item pricing:

- Each unique Reel saved as `success` is one result.
- An invalid or unavailable profile, or a page that repeatedly fails, can save a `failed` result.
- Retry attempts do not create extra rows on their own.
- Requesting more pages can create more billable Reel rows.

For example, two pages can yield up to roughly 24 unique Reels for one profile, although real feeds may return fewer.

### Instagram profile Reels API 🔌

Replace `$ACTOR_ID` with the value from the Actor API tab and `$APIFY_TOKEN` with your token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["nike","nasa"],"pagesPerProfile":2}'
```

Use schedules for recurring monitoring, webhooks for completed runs, and Apify integrations for Google Sheets, Make, Zapier, cloud storage, or your own API pipeline.

### Reliability, retries, and public-data limits ⚠️

The Actor runs up to five profile requests concurrently. Temporary timeouts, transport errors, throttling, selected HTTP errors, and blocked redirects are automatically retried. Confirmed invalid usernames and unavailable feeds become failed rows instead of crashing the batch.

Instagram controls feed availability. Private, deleted, renamed, suspended, region-restricted, age-restricted, or login-gated profiles may return no usable Reels. Counts and thumbnail variants are optional public fields and can be null or empty.

A whole run can still fail because of infrastructure-level problems such as Actor startup failure, unavailable dataset storage, or an unrecoverable error while saving results.

### Frequently asked questions ❓

#### Does it return only Reels?

Yes. It targets the public profile Reels feed and emits Reel rows, not ordinary image posts or carousel containers.

#### Can I enter an Instagram profile URL?

No. Enter the plain username only.

#### Is a page always 12 results?

No. Twelve is the source request size, not a guaranteed number of unique returned Reels.

#### Does it return the direct video URL?

This feed-focused Actor returns Reel identity, thumbnails, counts, and author data. Use Reel Details for richer direct video and audio fields.

#### Does it require a login?

No Instagram account, cookies, or session input is required.

#### Why did a profile return `failed`?

It may be invalid, unavailable, private, restricted, empty, or repeatedly blocked. The original username remains in the dataset.

### Support, responsible use, and related actors 🛟

For a reproducible issue, share the run ID, approximate time, page count, and a safe public username in the support channel. Never disclose access tokens or proxy credentials.

Use public data lawfully and responsibly. Follow privacy, copyright, data-protection, contractual, and platform requirements.

# Actor input Schema

## `inputList` (type: `array`):

Add one Instagram username such as nike per item. Enter only the username without @ or a profile link. Private, unavailable and invalid profiles are saved with failed status.

## `pagesPerProfile` (type: `integer`):

Every page asks Instagram for up to 12 Reels. Choose 1 for up to 12 Reels, 5 for up to 60, or 10 for up to 120. Collection stops automatically when no more Reels are available.

## Actor input object example

```json
{
  "inputList": [
    "nike"
  ],
  "pagesPerProfile": 1
}
```

# Actor output Schema

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

One Dataset row for every unique Reel returned directly by the Instagram profile Reels feed. Failed input or page rows keep the original input and use failed status.

# 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 = {
    "inputList": [
        "nike"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/instagram-profile-reels").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 = { "inputList": ["nike"] }

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

```

## MCP server setup

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

```

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/l3lBFajzab5Fk3OJt/builds/woxKMMLwegLVP1TsP/openapi.json
