# Instagram Scraper & Reels Downloader (`socialbeast/instagram-scraper-reels-downloader`) Actor

Scrape Instagram posts, Reels, profiles, hashtags, places and comments without login. Get captions, likes, plays, transcripts and video, audio and photo links, or download Reels in 1080p. Track accounts and pay only for new posts. Export to JSON, CSV, Excel or the API. From $0.72 per 1,000 results.

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

## Pricing

from $0.72 / 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?

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

#### What can Instagram Scraper & Reels Downloader do?

Instagram Scraper & Reels Downloader **gets public Instagram data without an Instagram login**:
posts and Reels from a profile or hashtag, comments on a post, profile, hashtag and place details,
and Reel downloads with transcripts. Add a link, an `@username` or a `#hashtag`, pick what to
scrape, and you can get:

<table>
<tr>
<th>📦 What you can extract</th>
<th>⚙️ Features & integrations</th>
</tr>
<tr>
<td valign="top">

📷 **Posts and carousels** from profiles and hashtags <br>
🎞️ **Reels** with plays, video and audio links <br>
💬 **Comments** from posts or Reels, up to 10,000 each <br>
👤 **Profiles**: bio, followers, related accounts <br>
\#️⃣ **Hashtags**: Instagram's summary, related searches, top posts <br>
📍 **Places**: coordinates, address, category <br>
💾 **Downloads**: Reels in up to 1080p, and photos, saved to your storage <br>
📝 **Transcripts** of what's said in Reels

</td>
<td valign="top">

🔓 **No Instagram login**, so no account to get banned <br>
🔎 **Keyword search** on Google for profiles and hashtags <br>
🔁 **Only new posts** since the last run, for monitoring <br>
📅 **Date filters and scheduling** for recent content <br>
⬇️ **Export data** to JSON, CSV, Excel or HTML <br>
🦾 **API access, webhooks**, Node.js & Python clients <br>
📈 **Spot viral content and creators** by plays, likes and comments

</td>
</tr>
</table>

Use it for influencer vetting, competitor monitoring, trend tracking, brand monitoring, local
business discovery, content analysis or downloading Reels, all from one tool.

#### What data can I scrape from Instagram?

You get the **content, engagement and context** of any public post, Reel, profile, hashtag or
place:

- **Instagram posts and Reels:** *what was posted and how it did*. Captions, hashtags, mentions, video,
  audio and image links, every carousel slide, likes, comments, plays, views, length, music, tagged
  people, co-authors and location.

- **Instagram comments:** *what people are saying*. Text, author, likes, time, and links to the comment and
  its post.

- **Instagram profiles:** *who's behind the account*. Bio, name, links, follower and following counts,
  verified and business status, highlights, latest posts, and about 50 related accounts.

- **Instagram hashtags:** *what's around a topic*. Instagram's own summary of the hashtag, related searches
  and its top posts.

- **Instagram places:** *where it happened*. Name, category, address, coordinates, phone, website and post
  count.

- **Downloads and transcripts:** *keep the files and the words*. Each post's video or photos saved
  to your Apify storage, and each Reel's words with timestamps.

Start from a **list of links** (posts, Reels, profiles, hashtags or places), or from **@usernames
and #hashtags**.

#### How much will scraping Instagram cost?

You pay per **result**: one post, Reel or comment is one result. On the Free plan it costs **$1.08
per 1,000 results**. Paid plans are cheaper: **$0.96 on Starter, $0.84 on Scale and $0.72 on
Business**. A Basic post or a comment costs less than half of what the most used Instagram scraper
charges; a post with its newest comments, or a details row, about a sixth less. Failed links and
duplicates are free.

A few things count as more than one result:

| You get | Results | Starter price |
|---|---|---|
| A post with its newest comments (Detail level Full) | 2 | $1.92 per 1,000 |
| A profile, hashtag or place details row | 2 | $1.92 per 1,000 |
| A check that found nothing new (Only new posts) | 2 | $1.92 per 1,000 |
| A post downloaded with its files, per started 50 MB (up to 300 MB) | 6 | $0.0058 each |
| A video saved in 1080p, on top | 6 | $0.0058 each |
| A transcript minute | 4 | $0.0038 a minute |
| A Google results page read for a keyword search | 5 | $0.0048 a page |

Each run start costs $0.003 per GB of memory the run gets: $0.003 for most runs (256 MB to 1 GB),
and $0.006 to $0.012 for big runs that get 2 to 4 GB to go faster. The Free plan gets up to 3,000
results, 120 transcript minutes and 300 MB of downloads a month; any paid Apify plan removes these
limits. Check the **Pricing** tab for every plan.

#### How do I use Instagram Scraper & Reels Downloader?

It's easy to start, even if you've never scraped a website before:

1. [Create](https://console.apify.com/sign-up) a free Apify account.
2. Open **Instagram Scraper & Reels Downloader** in Apify Console.
3. Pick **What to scrape**: posts, Reels, comments, details or downloads.
4. Paste one or more **Instagram links, @usernames or #hashtags**.
5. Set how many results you want per input under **Results per input**.
6. Optional: open **More options** for the Detail level (Full adds newest comments) or 1080p downloads.
7. Click **Save & Start** and wait for the data.
8. Download your dataset in **JSON, CSV, Excel or HTML**, or get it through the Apify API.

#### ⬇️ Input

The form has four main fields. Everything else is folded under **More options**, **Only new posts**
and **Paid add-on**.

- **What to scrape** — posts, Reels, comments, details or downloads
- **Instagram URLs, @usernames or #hashtags** — one per line; share links and links without `https://` work too
- **Results per input** — how many posts or comments per input
- **Only posts newer than** (optional) — a date or a period like `7 days` (UTC)

<a href="https://console.apify.com/actors/m4eSuGgq1WfGUhlx6/input"><img src="https://raw.githubusercontent.com/beastops/instagram-scraper-images/main/input-form.png" alt="Instagram Scraper input: Instagram links, @usernames or #hashtags, what to scrape and results per input" style="width:100%;"></a>

The input type drives what's returned:

| Paste this | And you can get |
|---|---|
| Post or Reel link | That post, its comments, or its download |
| Profile link or `@username` | Its posts, Reels, details, or Reel downloads |
| Hashtag link or `#hashtag` | Its top posts or Reels, or hashtag details |
| Place link | Place details |
| A keyword (Search by keyword) | Profiles or hashtags Google finds for it, then their posts or details |

#### ⬆️ Output

<a href="https://console.apify.com/actors/m4eSuGgq1WfGUhlx6/input"><img src="https://raw.githubusercontent.com/beastops/instagram-scraper-images/main/output-table.png" alt="Instagram Scraper output table: posts and Reels with captions, likes, comments, plays and video links" style="width:100%;"></a>

Results land in a dataset in the **Storage** tab. View them as a table, download them in **JSON,
CSV, Excel or HTML**, or get them through the API. Each kind of data has its own fields; samples
below are from real runs.

##### 📸 Instagram post scraper: posts and carousels

Posts and carousels from a profile, hashtag or post link.

**Supported inputs:**

- `https://www.instagram.com/natgeo/` or `@natgeo` (profile)
- `https://www.instagram.com/p/DeSx5enlwm_/` (post)
- `https://www.instagram.com/explore/tags/travel/` or `#travel` (hashtag)

**Posts data sample**

```json
{
    "inputUrl": "@natgeo",
    "id": "4004482472851474879",
    "type": "Sidecar",
    "shortCode": "DeSx5enlwm_",
    "caption": "Presented by @Rolex. Vultures are part of nature’s cleanup crew, devouring dead animals and preventing the spread of diseases. But now these flying janitors ...",
    "hashtags": ["Rolex", "AfricaEarthsWildHome", "PerpetualPlanet"],
    "mentions": ["Rolex", "hammond_robin"],
    "url": "https://www.instagram.com/p/DeSx5enlwm_/",
    "commentsCount": 84,
    "likesCount": 42162,
    "displayUrl": "https://scontent-iad6-1.cdninstagram.com/.../6567256986_n.jpg",
    "images": [
        "https://scontent-iad6-1.cdninstagram.com/.../6567256986_n.jpg",
        "https://scontent-iad6-1.cdninstagram.com/.../4739047956_n.jpg"
    ],
    "childPosts": [
        {
            "id": "4004482402856268460",
            "type": "Image",
            "displayUrl": "https://scontent-iad6-1.cdninstagram.com/.../6567256986_n.jpg",
            "dimensionsWidth": 1440,
            "dimensionsHeight": 1920
        }
    ],
    "timestamp": "2026-10-10T19:00:00.000Z",
    "ownerFullName": "National Geographic",
    "ownerUsername": "natgeo",
    "ownerId": "787132",
    "isPinned": false
}
```

##### 🎞️ Instagram Reels scraper

Reels from a profile, its Reels tab, a hashtag or a Reel link.

**Supported inputs:**

- `https://www.instagram.com/natgeo/` (profile)
- `https://www.instagram.com/natgeo/reels/` (Reels tab)
- `https://www.instagram.com/reel/DeUKkHjgMNR/` (single Reel)
- `https://www.instagram.com/explore/tags/travel/` (hashtag)

**Reels data sample** (Detail level Full, view counts on)

```json
{
    "inputUrl": "@natgeo",
    "id": "4004872431117321041",
    "type": "Video",
    "productType": "clips",
    "shortCode": "DeUKkHjgMNR",
    "caption": "Presented by @Rolex. Pangolins are notoriously difficult to rehabilitate and rewild because they need to learn where to forage for food. During their daily w...",
    "url": "https://www.instagram.com/p/DeUKkHjgMNR/",
    "commentsCount": 353,
    "latestComments": [
        {
            "id": "17887833801622715",
            "text": "Pangolin",
            "ownerUsername": "example_user",
            "timestamp": "2026-10-10T22:03:18.000Z",
            "likesCount": 0
        }
    ],
    "likesCount": 126199,
    "videoPlayCount": 2439975,
    "videoViewCount": 917201,
    "videoDuration": 14.933333,
    "videoUrl": "https://scontent-iad3-1.cdninstagram.com/.../Zux6SPv1T_20.mp4",
    "audioUrl": "https://scontent-iad3-1.cdninstagram.com/.../LZ8EMhj18eu0.mp4",
    "displayUrl": "https://scontent-iad3-1.cdninstagram.com/.../1460288787_n.jpg",
    "musicInfo": {
        "artist_name": "natgeo",
        "song_name": "Original audio",
        "uses_original_audio": true
    },
    "topics": ["wildlife encounter", "nature photography", "forest floor"],
    "timestamp": "2026-10-10T13:14:44.000Z",
    "ownerUsername": "natgeo",
    "linksExpireAt": "2026-10-12T08:23:29.000Z"
}
```

##### 💬 Instagram comments scraper

Comments from a post or Reel, or from the latest posts of a profile or hashtag.

**Supported inputs:**

- `https://www.instagram.com/p/DeSNiSGgoI-/` (post)
- `https://www.instagram.com/reel/DeUKkHjgMNR/` (Reel)
- `@natgeo` (the comments on its latest posts)

**Comments data sample**

```json
{
    "postUrl": "https://www.instagram.com/p/DeSNiSGgoI-/",
    "commentUrl": "https://www.instagram.com/p/DeSNiSGgoI-/c/18096108170555915/",
    "id": "18096108170555915",
    "text": "😍🌳",
    "ownerUsername": "example_user",
    "timestamp": "2026-10-10T22:09:20.000Z",
    "likesCount": 0,
    "repliesCount": null
}
```

##### 👤 Instagram profile scraper

Profile metadata: bio, followers, post count, verified status and related accounts.

**Supported inputs:**

- `https://www.instagram.com/natgeo/` or `@natgeo` (profile)

**Profile data sample** (Detail level Full)

```json
{
    "inputUrl": "@natgeo",
    "id": "787132",
    "username": "natgeo",
    "url": "https://www.instagram.com/natgeo/",
    "fullName": "National Geographic",
    "biography": "Step into wonder and find your inner explorer with National Geographic 🌎",
    "externalUrl": "http://visitstore.bio/natgeo",
    "followersCount": 268415564,
    "followsCount": 194,
    "postsCount": 32063,
    "isBusinessAccount": true,
    "private": false,
    "verified": true,
    "profilePicUrlHD": "https://scontent-iad3-1.cdninstagram.com/.../0972105113_n.jpg",
    "relatedProfiles": [
        { "username": "animalplanet", "full_name": "Animal Planet", "is_verified": true },
        { "username": "pbsnature", "full_name": "Nature", "is_verified": true }
    ],
    "latestPosts": [
        {
            "shortCode": "DdG4RIxIPyf",
            "type": "Video",
            "timestamp": "2026-09-10T13:00:14.000Z",
            "likesCount": 79371,
            "commentsCount": 570
        }
    ]
}
```

##### #️⃣ Instagram hashtag scraper

Hashtag metadata: Instagram's summary, related searches and top posts.

**Supported inputs:**

- `https://www.instagram.com/explore/tags/travel/` or `#travel` (hashtag)

**Hashtag details sample**

```json
{
    "inputUrl": "#travel",
    "name": "travel",
    "url": "https://www.instagram.com/explore/tags/travel/",
    "description": "The UK Foreign Office currently advises against all but essential travel to parts of Saudi Arabia including Riyadh, while the UAE and Qatar have no...",
    "relatedSearches": ["transfer travel", "time travel real", "november travel destinations"],
    "topPosts": [
        {
            "shortCode": "DTfS7SMEk8B",
            "type": "Video",
            "videoPlayCount": 30210139,
            "timestamp": "2026-01-14T11:13:01.000Z"
        }
    ]
}
```

##### 📍 Instagram location scraper: place details

Place metadata: name, category, coordinates and post count.

**Supported inputs:**

- `https://www.instagram.com/explore/locations/213385402/london-united-kingdom/` (place)

**Place details sample**

```json
{
    "inputUrl": "https://www.instagram.com/explore/locations/213385402/london-united-kingdom/",
    "id": "213385402",
    "name": "London, United Kingdom",
    "category": "City",
    "lat": 51.5141,
    "lng": -0.1094,
    "postsCount": 106858921
}
```

##### 💾 Instagram Reels downloader

Each post's video or photos saved to your Apify storage, with links that keep working. One download
covers up to 50 MB of a post's files (almost every Reel); each further started 50 MB is one more, up
to 300 MB a post. Videos come in **720p** (one MP4 with sound that plays everywhere), or in **1080p**
with *Download quality: 1080p* (Instagram's best: the full-quality VP9 video joined with its sound)
for one download more, or **Audio only** (just the sound, an .m4a file). Each video keeps its cover
picture too, free. You pay only for what is saved: a 1080p file that can't be made comes in 720p,
without the 1080p charge.

**Supported inputs:**

- `https://www.instagram.com/reel/DdG4RIxIPyf/` (Reel or post, with or without `?igsh=...`)
- `https://www.instagram.com/share/reel/_69O6RoGd` (a link from the app's Share button)
- `https://www.instagram.com/natgeo/reels/` (a profile's Reels)

**Downloads data sample**

```json
{
    "addOn": "savedFiles",
    "addOnFor": "https://www.instagram.com/p/Dd7b11dxi5Z/",
    "shortCode": "Dd7b11dxi5Z",
    "downloadedVideo": "https://api.apify.com/v2/key-value-stores/.../records/media-kOEAhsXb1rkmAXm-0-video.mp4?signature=...",
    "downloadedCover": "https://api.apify.com/v2/key-value-stores/.../records/media-kOEAhsXb1rkmAXm-0-cover.jpg?signature=...",
    "downloadCharges": 1,
    "savedFiles": [
        {
            "index": 0,
            "role": "video",
            "bytes": 6475431,
            "contentType": "video/mp4",
            "url": "https://api.apify.com/v2/key-value-stores/.../records/media-kOEAhsXb1rkmAXm-0-video.mp4?signature=..."
        },
        {
            "index": 0,
            "role": "cover",
            "bytes": 128228,
            "contentType": "image/jpeg",
            "url": "https://api.apify.com/v2/key-value-stores/.../records/media-kOEAhsXb1rkmAXm-0-cover.jpg?signature=..."
        }
    ]
}
```

##### 🔌 Use it as a Reel downloader API

One HTTP call downloads a list of Reels and answers with every link's result: [`run-sync`](https://docs.apify.com/api/v2/act-run-sync-post) waits for
the run (up to 5 minutes) and returns its `OUTPUT`, whose `downloads` has one entry per link (match
them by `inputUrl`): the saved file, its cover, size, quality and charges, or why it failed. Failed
links are free.

```bash
curl -X POST "https://api.apify.com/v2/acts/socialbeast~instagram-scraper-reels-downloader/run-sync?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.instagram.com/reel/Dd7b11dxi5Z/?igsh=abc123", "https://www.instagram.com/reel/DzzzzzzzzzZ/"], "resultsType": "downloads"}'
```

```json
{
    "downloads": [
        {
            "inputUrl": "https://www.instagram.com/reel/Dd7b11dxi5Z/?igsh=abc123",
            "shortCode": "Dd7b11dxi5Z",
            "url": "https://api.apify.com/v2/key-value-stores/.../records/media-kOEAhsXb1rkmAXm-0-video.mp4?signature=...",
            "quality": "720p",
            "megabytes": 6.18,
            "files": [{ "role": "video", "url": "https://api.apify.com/v2/key-value-stores/.../records/media-kOEAhsXb1rkmAXm-0-video.mp4?signature=..." }],
            "cover": "https://api.apify.com/v2/key-value-stores/.../records/media-kOEAhsXb1rkmAXm-0-cover.jpg?signature=...",
            "charges": 1,
            "error": null
        },
        {
            "inputUrl": "https://www.instagram.com/reel/DzzzzzzzzzZ/",
            "error": "NOT_FOUND",
            "message": "The post does not exist, was deleted, or is hidden from logged-out visitors."
        }
    ]
}
```

- **Many links in one call** cost one start fee: send your queue in batches rather than one link per call.
- **Bigger batches** (more than fit in 5 minutes): [start the run](https://docs.apify.com/api/v2/act-runs-post) and get a
  [webhook](https://docs.apify.com/platform/integrations/webhooks) when it ends.
- **The links keep working** as long as Apify keeps the run's storage (your plan's data retention); copy
  the files if you need them longer.
- **Serve files from your own storage**: Apify bills your account for every GB sent out of its storage, so
  sending your visitors to these links costs you per download. Copy each file once to your own storage or
  CDN. If a link that expires in about a day is enough, *Posts* mode gives Instagram's own video link
  (`videoUrl`) at a normal result's price.
- **Speed**: a Reel is saved a few seconds after the run starts (a 92 MB Reel in ~7 s, a 141 MB 1080p one
  in ~6 s on Apify). 159 Reels from 3 accounts took 46 s in one run (1.8 GB saved, no slowdown from Instagram).
  Stories and highlights need a login and aren't supported.

##### 📝 Instagram Reels transcripts

What's said in each Reel or video, with its language and timed parts. Turn on **$ Include
transcript**.

**Transcripts data sample**

```json
{
    "addOn": "transcript",
    "addOnFor": "https://www.instagram.com/reel/Dd7b11dxi5Z/",
    "transcript": "When asked why taxpayers …",
    "transcriptLanguage": "en",
    "transcriptSegments": [{ "start": 0, "end": 3.4, "text": "When asked why taxpayers …" }],
    "transcriptMinutes": 1
}
```

#### Notes and exceptions

- **No login, no private data.** Stories, comment replies, tagged posts, share counts and a
  business's address only show to logged-in users, so they're not included.
- **Private accounts** return their details, but not their posts.
- **Places**: Instagram mostly shows a place's posts only to logged-in users right now; its details
  row still works.
- **Failed links, duplicates and filtered posts are free**, and each gets a row saying why.
- **`inputUrl` is exactly what you entered**, so you can match every row to your input.
- **The date filter skips old pinned posts too**, and in Comments mode it skips older comments.
- **File links from Instagram expire** after a day or two (`linksExpireAt`); pick **Downloads** to
  keep the files.
- **A download over 300 MB** (a 1080p one tries 720p first) is charged as a normal post and keeps its direct links.
- **Play counts** cover a profile's latest ~190 Reels.
- Dates use **UTC**.

#### What can you do with data after scraping Instagram?

Here are a few of the most common ways people use public Instagram data:

##### 🎯 Influencer vetting and partnership research

**Recipe:**

1. **Find creators in your niche.** Run `posts` on a hashtag like `#fitness` to get recent posts
   with creator usernames and engagement.
2. **Profile each candidate.** Run `details` on their profiles for followers, bio, post count and
   related accounts.
3. **Score real engagement.** Run `posts` on their profiles and compare likes, comments and plays
   with their follower counts.

##### 🔥 Spot viral content and creators

**Recipe:**

1. **See what's posted under a tag.** Run `posts` or `reels` on a hashtag like `#cleanbeauty`.
2. **Find related tags.** Run `details` on the hashtag for Instagram's summary and related
   searches.
3. **Keep only recent posts** with *Only posts newer than*, e.g. `14 days`.

##### 💯 Track competitors and online conversations

**Recipe:**

1. **Track their accounts.** Run `posts` on competitor profiles with **Only new posts since the
   last run** on.
2. **Schedule it** every hour or every morning; you pay only for new posts.
3. **Read reactions.** Run `comments` on their best posts.

##### 🎬 Download and transcribe Reels

**Recipe:**

1. **Paste a profile's Reels tab** like `instagram.com/natgeo/reels/`.
2. **Pick Downloads** and turn on **Include transcript**.
3. **Open the Add-ons view** for each Reel's saved file and transcript.

##### 🏙️ Local business discovery

**Recipe:**

1. **Collect place links** from posts' `locationId`
   (`instagram.com/explore/locations/<locationId>/`).
2. **Run `details`** on the places for their name, category, address and coordinates.

Send results to Google Sheets, Slack, a CRM or a webhook from the **Integrations** tab.

#### ❓ Frequently Asked Questions

##### Do I need an Instagram account?

No. You never connect an account or paste cookies, so none of your accounts can be banned.

##### Is this an Instagram API?

It works like one for public data: call it through the Apify API from any language and get JSON
back, with no Instagram account, Business account or Meta app approval.

##### Can I scrape multiple content types in a single run?

No. Each run returns one kind, set by **What to scrape**. To get posts with their newest comments,
use Detail level Full.

##### How many results can I scrape?

Up to 10,000 posts per profile, hashtag or place, 10,000 comments per post and 50,000 inputs per
run. The Free plan gets 50 comments a post.

##### Why don't I get all of a post's comments?

`commentsCount` includes replies and comments Instagram hides from logged-out visitors, so it can be
higher than what you get. Comments mode itself has no 15-comment cap.

##### Can I scrape private Instagram profiles?

No. A private account returns its details, but not its posts.

##### Why don't the numbers match what I see on Instagram?

Counts change all the time, the app rounds them, and a logged-in view can include private metrics.
Open the post in a private window to see what the Actor sees.

##### How do I exclude pinned posts?

Turn on **Skip pinned posts**. In **Reels** mode pinned Reels are left out already, unless you set it
to off. Every post from a profile has `isPinned` either way.

##### How do I scrape only recent posts?

Set **Only posts newer than** to a date like `2026-09-01` or a period like `7 days`. Older posts,
pinned ones too, are skipped and cost nothing. In Comments mode, older comments are skipped too.

##### Can I get comment replies, stories or followers lists?

No. Instagram shows those only to logged-in users.

##### Why is `likesCount` sometimes `-1`?

The owner hid the like count. `-1` keeps it apart from a post with no likes.

##### How do I download Instagram Reels in bulk?

Paste the Reel links (up to 50,000) or a profile's Reels tab and pick **Downloads**. Each Reel is
saved to your storage: one download per started 50 MB, and almost every Reel is one.

##### Can I search Instagram by keyword?

Yes. Open **Search by keyword (Google)**, enter keywords (e.g. `nike, adidas`) and pick
**Profiles** or **Hashtags**. Instagram's own search needs a login, so the keywords are searched on
Google, and the profiles or hashtags it finds are scraped as **What to scrape** says: their posts,
Reels or details. Each row has the keyword in `searchTerm`.

Each Google results page read is 5 results ($0.0048 on Starter); a page Google couldn't give is free.
Names and brands work best (`nike` finds @nike, @nikerunning, @nikewomen, @nikefootball). Generic
phrases find fewer, less related accounts, because Google matches any Instagram page with the
words. A search starts with the keyword itself, at no extra cost: as a hashtag, or for a one-word profile
search, the account of that name. Places can't
be searched by name: Google no longer shows Instagram place links, so use place links instead.

##### Can I keep monitoring accounts without paying twice?

Yes. Turn on **Only new posts since the last run** and [schedule](https://docs.apify.com/platform/schedules) the run. Each run returns only new
posts; an account with nothing new costs 2 results.

##### What happens when a link fails?

It gets a free row with `errorCode` and `errorDescription`. Rows with `retryable: true` usually
work when run again later.

##### Can I switch from another Instagram scraper without changing my code?

Yes. It accepts the same input fields (`directUrls`, `username`, `hashtags`, `search`,
`resultsType`, `resultsLimit`, `onlyPostsNewerThan`) and returns the same field names.

##### Can I download Reels in 1080p?

Yes. Set **Download quality** to **1080p**: each Reel's full-quality video is joined with its sound
into one MP4, at the same price. It's VP9 video, so pick 720p if you edit in QuickTime or iMovie.

##### Why aren't the rows in date order?

Each post is written as soon as it's ready, so rows come roughly newest first. Sort by `timestamp`
for exact order.

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

The Actor only reads public data anyone can see without an account. Respect creators' copyright,
Instagram's terms and the privacy laws that apply to you.

##### Can I use it with the Apify API?

Yes. The **API** tab has ready-to-copy examples for Node.js, Python, the CLI and HTTP.

##### Can I track online conversations about a brand or topic?

Yes. Run **comments** on the posts or Reels you care about, or on a hashtag's latest posts, and
schedule it to keep up with new comments.

##### Instagram Scraper not working?

Open an issue on the **Issues** tab with your run's link, and we'll fix it.

# Changelog

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

# Actor input Schema

## `resultsType` (type: `string`):

<b>Posts</b> → posts and Reels. <b>Reels</b> → only Reels. <b>Comments</b> → one row per comment, newest first. <b>Details</b> → one row per profile, hashtag or place. <b>Downloads</b> → each post with its video or photos saved to your storage: one download per started 50 MB of its files, up to 300 MB a post (a bigger post costs a normal post).

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

One per line:<ul><li>a post or Reel link → that post</li><li>a profile link or <code>@natgeo</code> → its latest posts</li><li>a hashtag link or <code>#travel</code> → its top posts</li><li>a place link (<code>/explore/locations/…</code>) → its details and top posts</li></ul>Or leave this empty and use <b>Search by keyword</b> below.

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

Posts per profile, hashtag or place, or comments per post in <b>Comments</b>. You pay per result.

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

A date like <code>2026-09-01</code> or a period like <code>7 days</code> (UTC). Older posts, pinned ones too, are skipped for free. In <b>Comments</b>, older comments are skipped too.

## `search` (type: `string`):

One or more keywords, comma-separated, e.g. <code>nike, adidas</code>. Each is searched on Google for matching Instagram profiles or hashtags, which are then scraped as <b>What to scrape</b> says. Works best with names and brands. Each Google results page read is 5 results.

## `searchType` (type: `string`):

<b>Profiles</b> → accounts Google finds for the keyword. <b>Hashtags</b> → the keyword as a hashtag, then related hashtags Google finds. Places can't be searched by name (Google no longer shows Instagram place links): use place links.

## `searchLimit` (type: `integer`):

How many profiles or hashtags to find for each keyword (1 to 250). For posts per profile or hashtag found, use <b>Results per input</b>.

## `dataDetailLevel` (type: `string`):

<b>Basic</b> (1 result a post) → every post field: video, audio and image links, caption, likes, comment count, plays, music, tags. <b>Full</b> (2 results a post) → adds each post's newest comments and Instagram's topic labels.<br><br>For <b>Details</b>: Full adds a profile's exact post count, related accounts and its latest posts' likes. A details row is 2 results either way (a place 6).

## `downloadQuality` (type: `string`):

For <b>Downloads</b>. <b>720p</b> → one MP4 with sound (H.264) that plays everywhere. <b>1080p</b> → the full-quality video joined with its sound into one MP4 (VP9 video): plays in browsers, Android, VLC and CapCut, not in QuickTime or iMovie. One download more, charged only once the 1080p file is saved; one that can't be made, or would pass 300 MB, is saved in 720p without it. <b>Audio only</b> → just the sound (AAC, an .m4a file); a photo has none and is charged as a normal post. Each video also keeps its cover picture, free.

## `commentsLimit` (type: `integer`):

In <b>Comments</b> mode, to set comments per post apart from <i>Results per input</i>, e.g. 5 posts from a profile with 200 comments each. Up to 10,000 (50 on the Free plan).

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

Stops the run after this many results in all. A Full post counts 2, a details row 2 (a place 6), a transcript minute 3, a download 4. Inputs not reached get free rows. Leave empty for no limit.

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

Leave out the posts a profile has pinned to the top. In <b>Reels</b> mode pinned Reels are left out unless you set this to off. Posts from a profile carry <code>isPinned</code> either way.

## `includeAltText` (type: `boolean`):

Instagram's image descriptions (<code>alt</code>) for posts from profiles. Free, but makes profiles about a third slower. Left unset: on for Full, off for Basic.

## `includeOwnerRecentPosts` (type: `boolean`):

Adds the account's 12 latest posts (link, type, caption, thumbnail) to every post as <code>ownerRecentPosts</code>. Free; one more page per account.

## `includeViewCounts` (type: `boolean`):

Adds <code>videoViewCount</code> to videos and Reels. Play counts (<code>videoPlayCount</code>) are always included. Free; on unless you turn it off (one more small page per video).

## `onlyNewPosts` (type: `boolean`):

For schedules: each run returns only posts earlier runs didn't, so you pay only for new ones. A profile, hashtag or place with nothing new costs 2 results. The memory is kept in your account (<code>socialbeast-instagram-memory</code>) and holds only hashes. Posts and Reels modes.

## `memoryName` (type: `string`):

Runs with the same name share one memory; a new name starts a new one. Without a name, each saved task has its own.

## `resetMemory` (type: `boolean`):

Forget what the memory has returned and start over. Turn it off again after one run.

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

What's said in each Reel or video (up to 5 minutes), with its language and timed parts, in a row after the post. $0.0043 a minute on the Free plan, down to $0.0029 on Business (4 results a minute), charged before each minute. Videos with no speech are free. Needs 1 GB of memory. Free plan: 120 minutes a month.

## `saveMedia` (type: `boolean`):

Accepted so inputs written for earlier versions keep working: saves each post's video or photos to your storage, in the mode and detail level asked, at the <b>Downloads</b> price (one download per started 50 MB of a post's files, up to 300 MB). Pick <b>Downloads</b> in <b>What to scrape</b> instead.

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

Accepted so inputs written for other post and Reel scrapers work unchanged: usernames or profile links return their posts.

## `directUrls` (type: `array`):

Accepted so inputs written for the most used Instagram scraper work unchanged.

## `links` (type: `array`):

Accepted so inputs written for other Instagram Reels downloaders (a <code>links</code> list of Reel links) work unchanged.

## `includeDownloadedVideo` (type: `boolean`):

Same as saveMedia. Accepted so inputs written for other Reel scrapers work unchanged: saves each post's files at the Downloads price.

## `hashtags` (type: `array`):

Accepted so inputs written for other hashtag scrapers work unchanged.

## `keywordSearch` (type: `boolean`):

Accepted so inputs written for other hashtag scrapers work: treats 'hashtags' entries as search phrases.

## `addParentData` (type: `boolean`):

Accepted so inputs written for the most used Instagram scraper work: adds dataSource (profile, hashtag or place) to posts found through one.

## Actor input object example

```json
{
  "resultsType": "posts",
  "urls": [
    "https://www.instagram.com/p/DWr6HGjkvoi/",
    "https://www.instagram.com/reel/DdXP7pggA87/"
  ],
  "resultsLimit": 12,
  "searchType": "hashtag",
  "searchLimit": 10,
  "dataDetailLevel": "basicData",
  "downloadQuality": "720p",
  "includeOwnerRecentPosts": false,
  "includeViewCounts": true,
  "onlyNewPosts": false,
  "resetMemory": false,
  "includeTranscript": false,
  "saveMedia": false
}
```

# Actor output Schema

## `posts` (type: `string`):

Posts with direct video, audio and image links, caption, counts, owner, newest comments and carousel slides. Comment rows in Comments mode, summary rows in Details mode, and a free row for each input that failed.

## `summary` (type: `string`):

The OUTPUT record: results returned, failures by error code, duplicates, what was charged, files saved and how long the run took.

## `files` (type: `string`):

Video, photo and audio files copied into the run's storage when Save files to storage is on. Empty otherwise.

# 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/p/DWr6HGjkvoi/",
        "https://www.instagram.com/reel/DdXP7pggA87/"
    ],
    "dataDetailLevel": "basicData"
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialbeast/instagram-scraper-reels-downloader").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/p/DWr6HGjkvoi/",
        "https://www.instagram.com/reel/DdXP7pggA87/",
    ],
    "dataDetailLevel": "basicData",
}

# Run the Actor and wait for it to finish
run = client.actor("socialbeast/instagram-scraper-reels-downloader").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/p/DWr6HGjkvoi/",
    "https://www.instagram.com/reel/DdXP7pggA87/"
  ],
  "dataDetailLevel": "basicData"
}' |
apify call socialbeast/instagram-scraper-reels-downloader --silent --output-dataset

```

## MCP server setup

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

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/m4eSuGgq1WfGUhlx6/builds/yapDfnnSMIyG4TlrX/openapi.json
