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

Instagram reels scraper: export reels from public profiles or reel URLs with plays, likes, comments, caption, date, video, music, location and tags. No login or cookies needed.

- **URL**: https://apify.com/keklik/instagram-reels-scraper.md
- **Developed by:** [Keklik Technologies](https://apify.com/keklik) (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.90 / 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 Scraper

**Instagram Reels Scraper** lets you **scrape Instagram reels** from any public profile, or single reels by URL, and **export reel data** to JSON, CSV or Excel: **play count, likes, comment count, caption, date, video and cover links, duration, music, location, tagged accounts and collab co-authors**. Paste a few usernames, press Start and get one row per reel in a minute or two. **No Instagram account, no login and no cookies** are needed.

### What data can you extract from Instagram Reels?

Each reel becomes one row with 31 fields:

| Group | Fields |
|---|---|
| Reel | Reel URL, reel ID, shortcode, product type, caption, publication date (Unix and ISO 8601 in UTC), pinned flag, paid partnership flag |
| Author | Username, display name, user ID |
| Engagement | Plays (`views_count`), likes, comment count |
| Media | Video URL, cover image, duration in seconds, dimensions |
| Music | Audio ID, song name, artist, original audio or licensed track, trending and explicit flags |
| Location | Tagged place ID and name |
| People | Collab co-authors, tagged accounts, @mentions in the caption |
| Hashtags | Every hashtag in the caption |
| Settings | Whether comments are turned off, whether like and view counts are hidden |
| Comments (optional) | The reel's newest comments in a `latest_comments` list: text, date, likes, edited flag, GIF, and each commenter's ID, username, verified badge and profile picture |

### Use cases

- **Influencer marketing**: compare creators by plays, likes and comments per reel before you sign a deal, and check that sponsored reels carry the paid partnership label.
- **Competitor and brand monitoring**: track what rival brands post on Reels, how often, and which formats and sounds win.
- **Trend research**: find the audio, hashtags and lengths behind the best-performing reels in a niche.
- **Campaign reporting**: export the reels of a campaign with their play counts on a schedule and feed them to a dashboard.
- **Academic and social research**: build datasets of public short-form video with captions, dates and engagement.
- **Audience research**: with comments on, read what people say under a creator's latest reels.

### How to scrape Instagram reels

1. Open **Instagram Reels Scraper** in Apify Console and go to the Input tab.
2. In **Profiles or reels**, paste one Instagram profile URL, username or reel URL per line.
3. Set **Max reels per profile** (for example 50) and, if you only want recent reels, **Newer than** (for example `30d`).
4. Optionally set **Comments per post** to add each reel's newest comments.
5. Press **Start** and watch the reels appear in the Output tab.
6. Download the results as JSON, CSV, Excel, XML or HTML, or fetch them with the Apify API.

### Input

| Field | What it does |
|---|---|
| **Profiles or reels** | One per line. A profile URL or username (`https://www.instagram.com/natgeo/`, `https://www.instagram.com/natgeo/reels/`, `@natgeo`, `natgeo`) scrapes the profile's reels, newest first. A reel URL (`https://www.instagram.com/reel/DeTUk4sDSp-/`) scrapes that one reel. |
| **Max reels per profile** | Stops each profile after this many reels. Leave empty for every reel. |
| **Newer than** | Only reels published after a date (`2026-01-31` or `2026-01-31 18:00`, UTC) or within a duration back from now (`24h`, `7d`, `2w`). |
| **Skip pinned reels** | Leaves out the reels pinned to the top of a profile. |
| **Comments per post** | Off (0) by default. Adds up to this many of each reel's newest comments in a `latest_comments` list. |
| **Max results** | Stops the whole run after this many reels. |

```json
{
    "urls": ["https://www.instagram.com/natgeo/", "https://www.instagram.com/reel/DeTUk4sDSp-/"],
    "maxReelsPerProfile": 50,
    "newerThan": "30d",
    "commentsPerPost": 0
}
```

### Output

A shortened row from a real run (the full row has 31 fields):

```json
{
    "reel_url": "https://www.instagram.com/reel/DehZj9wggt0/",
    "reel_id": "4008597565992995700",
    "shortcode": "DehZj9wggt0",
    "product_type": "clips",
    "owner_username": "natgeo",
    "owner_full_name": "National Geographic",
    "owner_id": "787132",
    "views_count": 820288,
    "likes_count": 36646,
    "comments_count": 261,
    "caption": "Keeping up with a pack of hunting wolves is just another day at the office for @bertiegreg …",
    "hashtags": ["#WolvesUpClose"],
    "mentions": ["bertiegregory", "DisneyPlus", "hulu"],
    "timestamp": 1792090802,
    "timestamp_datetime": "2026-10-15T19:00:02+00:00",
    "video_duration_seconds": 30.037,
    "media_dimensions": "1080x1920",
    "music_info": {
        "audio_id": "28762088093432459",
        "song_name": "Original audio",
        "artist_name": "natgeo",
        "uses_original_audio": true,
        "is_trending": false,
        "is_explicit": false
    },
    "co_authors": [
        {
            "id": "1284886006",
            "username": "bertiegregory",
            "full_name": "Bertie Gregory",
            "is_verified": true
        }
    ],
    "is_sponsored": false,
    "is_pinned": true,
    "source_url": "https://www.instagram.com/reel/DehZj9wggt0/",
    "scraping_time": "2026-10-16T11:15:06+00:00"
}
```

You can export the dataset to **JSON, CSV, Excel, XML and HTML** from the Output tab or through the API. The Output tab's Overview table shows each reel's link, author, date, plays, likes, comments, length, caption, pinned flag and cover.

#### What to know about the data

- **Play counts**: reels scraped from a profile come with their play count. A single reel URL gets its play count when the reel is among its author's 60 latest reels; an older reel URL comes back with every other field but an empty `views_count`. To get play counts for older reels, scrape the author's profile instead.
- **Collab reels**: a profile's reels include the reels it co-authored, as on Instagram. On those rows `owner_username` is the main author, which can be another account.
- **Pinned reels** come first on a profile whatever their date. With **Newer than**, older pinned reels are left out but do not stop the profile.
- **Media links expire**: Instagram video and image URLs stop working after a while. Download the media soon after the run if you need it.
- **No duplicates**: a reel appears only once per run, even if it is on two of your profiles (collabs) or entered twice.

#### Comments

Set **Comments per post** to add each reel's newest comments to its row, in a `latest_comments` list. Comments come newest first and are top-level only: replies and Instagram's "most relevant" order are not available. Reels with no comments, or with comments turned off, have no list. Comments make a run slower. If Instagram refuses a reel's comments, the reel is still saved without them and the run's status message says how many reels are missing comments. For many comments per reel, or one row per comment, use the [Instagram Comments Scraper](https://apify.com/kekliktech/instagram-comments-scraper) on the reel URLs.

### How much does it cost to scrape Instagram reels?

Instagram Reels Scraper uses pay-per-event pricing: you pay per reel in the dataset and nothing for the platform usage behind it.

- **$1.50 per 1,000 reels** on the Apify Free plan.&#x20;
- Bronze, Silver and Gold Apify plans pay less: $1.30, $1.10 and $0.90 per 1,000 reels.&#x20;
- Comments are optional and charged per comment: **$1.00 per 1,000 comments** on the Free plan, and $0.90, $0.80 and $0.70 on Bronze, Silver and Gold. With **Comments per post** at 0 (the default) you pay for reels only.&#x20;

For example, 50 reels from each of 10 profiles is 500 reels, about $0.75 on the Free plan.  Failed inputs add no rows, so they cost nothing. Use **Max results** to cap what a run can spend.

### Integrations and API

Run Instagram Reels Scraper from your own code with the [Apify API](https://docs.apify.com/api/v2). The Actor ID is `kekliktech/instagram-reels-scraper`.

Python, with `apify-client`:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kekliktech/instagram-reels-scraper").call(
    run_input={"urls": ["natgeo"], "maxReelsPerProfile": 20}
)
for reel in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(reel["reel_url"], reel["views_count"])
```

Node.js, with `apify-client`:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('kekliktech/instagram-reels-scraper').call({
    urls: ['natgeo'],
    maxReelsPerProfile: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

You can also:

- **Schedule** runs (daily, weekly) to track a creator's reels and play counts over time.
- Use **webhooks** to get notified, or trigger your own pipeline, when a run finishes.
- Connect the results to **Make, Zapier, Google Sheets**, Slack, Airbyte and other tools through Apify integrations.
- Let **AI agents** run the scraper through the [Apify MCP server](https://mcp.apify.com), for example from Claude or Cursor.

### FAQ

#### Is it legal to scrape Instagram reels?

This scraper collects only public data that Instagram shows to visitors who are not logged in. Reels can still contain personal data, such as the usernames of tagged accounts and commenters. Personal data is protected by laws such as the GDPR in the EU, so make sure you have a lawful reason to collect and use it. If in doubt, ask a lawyer.

#### Do I need an Instagram account?

No. You don't need an Instagram account, a login or cookies. Your own account is never used, so it cannot be blocked.

#### Can I scrape private profiles?

No. Instagram shows a private profile's reels only to approved followers, so private profiles are skipped.

#### Can I scrape photo posts and carousels?

No. A post URL that is not a video is skipped. Use the [Instagram Post Scraper](https://apify.com/kekliktech/instagram-post-scraper) for photos and carousels.

#### Why did some inputs fail?

Inputs that fail are listed, with the reason, in the `FAILED` record of the run's key-value store (Storage tab), not in the dataset:

- `invalid_input`: not a profile, username or reel URL (for example an explore or stories URL).
- `not_found`: the profile or reel does not exist or was removed.
- `private`, or `private_or_no_posts`: the profile is private (or, for the second, has no posts at all).
- `no_reels`: the profile has no reels.
- `not_a_reel`: the URL is a photo or carousel post.
- `blocked`: Instagram refused every attempt. Run it again later.
- `instagram_error`: Instagram answered with an error the scraper does not recognise. Please report it.

#### Why is the play count empty on some reels?

This happens only for reel URLs older than their author's 60 latest reels. Scrape the author's profile to get those play counts. Likes are also empty when the author hides like counts (`like_and_view_counts_disabled`).

#### Can I get comment replies?

No. Instagram doesn't show replies to visitors who are not logged in, so only top-level comments are available.

### Related scrapers

- [Instagram Profile Scraper](https://apify.com/kekliktech/instagram-profile-scraper): followers, bio, links and contact details of the accounts behind the reels.
- [Instagram Post Scraper](https://apify.com/kekliktech/instagram-post-scraper): every post on a profile, photos and carousels included.
- [Instagram Comments Scraper](https://apify.com/kekliktech/instagram-comments-scraper): many comments per reel or post, one row per comment.

### Support

Found a bug or need a field that isn't there? Open an issue on the Issues tab and we'll look into it. Need a scraper for another site or a custom version of this one? Get in touch through the Issues tab too.

# Actor input Schema

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

One per line. A profile URL or username (https://www.instagram.com/natgeo/, https://www.instagram.com/natgeo/reels/, @natgeo or natgeo) scrapes the profile's reels, newest first. A reel URL (https://www.instagram.com/reel/DeTUk4sDSp-/) scrapes that one reel. Private profiles are skipped.

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

Stop each profile after this many reels. Leave empty to scrape every reel the profile has. Does not apply to reel URLs.

## `newerThan` (type: `string`):

Only reels published after this point: a date in UTC (2026-01-31 or 2026-01-31 18:00) or a duration back from now (24h, 7d, 2w). Leave empty for reels of any date. Older pinned reels are left out too.

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

Leave out the reels pinned to the top of a profile.

## `commentsPerPost` (type: `integer`):

Add up to this many of each reel's newest comments, in a latest_comments list. 0 adds none. Each comment is charged on its own (see Pricing) and comments make a run slower. For many comments per reel, or one row per comment, use the Instagram Comments Scraper.

## `maxResults` (type: `integer`):

Stop the whole run after this many reels. Leave empty for no limit. Useful to cap what a run costs.

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/natgeo/"
  ],
  "maxReelsPerProfile": 50,
  "skipPinnedReels": false,
  "commentsPerPost": 0
}
```

# Actor output Schema

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

One row per reel, with play count, likes, comments, caption, media links and music.

# 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/natgeo/"
    ],
    "maxReelsPerProfile": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("keklik/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 = {
    "urls": ["https://www.instagram.com/natgeo/"],
    "maxReelsPerProfile": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("keklik/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 '{
  "urls": [
    "https://www.instagram.com/natgeo/"
  ],
  "maxReelsPerProfile": 50
}' |
apify call keklik/instagram-reels-scraper --silent --output-dataset

```

## MCP server setup

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