# Instagram Video Downloader & API: Reels in 1080p & Bulk ZIP (`s_actors/instagram-video-downloader`) Actor

Download Instagram Reels, videos and carousels as MP4 files: from links or whole profiles (every Reel, date range, only new since the last run). 1080p or H.264, photos, covers, M4A sound, one ZIP with metadata.csv. Permanent links, no login.

- **URL**: https://apify.com/s_actors/instagram-video-downloader.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Social media, Videos, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.03 / 1,000 downloaded post or 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 Video Downloader & API: Reels in 1080p & Bulk ZIP

Download **Instagram Reels, videos and carousels** as MP4 files in bulk: paste post and Reel links, or **whole profiles** (every Reel of the Reels tab, a date range, or only the new ones since your last run). Get each file with a **permanent download link** plus **one ZIP** of everything. **Pick the quality**: the H.264 MP4 that plays everywhere, or **1080p HD**, sharper than the 720p file other downloaders give you. Carousel slides, photos, **covers (JPG)** and **sounds (M4A)** included.

```json
{ "postUrls": ["https://www.instagram.com/reel/DeTUk4sDSp-/"], "profiles": ["nasa"], "quality": "highest" }
```

No Instagram login, no cookies, no browser extension. Use it as an **Instagram downloader API**: one call returns the files and clean JSON.

#### What you get

One row per post or Reel, and all files in `instagram-videos.zip` (a folder per account + `metadata.csv`). Real example, October 2026:

| ownerUsername | type | quality | width × height | codec | fileSizeMb | durationSeconds | files |
|---|---|---|---|---|---|---|---|
| nasa | reel | highest | 1074 × 1908 | vp9 | 8.05 | 43.8 | MP4, cover JPG, M4A |
| nasa | reel | compatible | 718 × 1276 | h264 | 3.19 | 43.8 | MP4 |
| natgeo | reel (from the profile) | highest | 1080 × 1920 | av1 | 3.13 | 32.8 | MP4, 2,594,982 plays |
| natgeo | carousel | highest | 1080 × 1350 | vp9 | 5.42 | 10.0 | 7 MP4 slides |
| natgeo | photo | | | | 0.55 | | 1 JPG |

| Field | Description |
|---|---|
| `videoFileUrl` | Permanent download link of the MP4 (the first video of a carousel) |
| `videoFileUrls`, `imageFileUrls` | Every video and every photo of a carousel or photo post |
| `coverFileUrl`, `audioFileUrl` | Cover JPG and sound M4A with **Download covers** / **Download sounds** |
| `zipFile` | Which ZIP part holds the post's files (`instagram-videos.zip`, `instagram-videos-2.zip`...) |
| `quality`, `codec`, `width`, `height`, `fileSizeMb` | The version saved: `h264`, `av1` or `vp9`, resolution and size |
| `postUrl`, `shortcode`, `postId`, `type` | Link, shortcode, media ID, `reel` / `video` / `carousel` / `photo` |
| `caption`, `hashtags`, `postedAt`, `durationSeconds` | Caption, hashtags, exact posting time (UTC), length |
| `plays`, `likes`, `comments` | Plays (Reels from profiles), likes and comments as Instagram shows them |
| `audioTitle` | The song or original audio of the Reel |
| `ownerUsername`, `ownerFullName`, `ownerId`, `ownerVerified` | The account that posted it |
| `videoCdnUrl` | Instagram's own link (expires within a day or two, the copy in your storage does not) |
| `input`, `inputProfile`, `position`, `downloadedAt`, `error` | Which input the row came from; why a post was not downloaded |

#### How it works

1. Add **links** (`instagram.com/reel/...`, `instagram.com/p/...`, `/tv/...`, shortcodes) and / or **profiles** (`nasa`, `@nasa`, `instagram.com/nasa/`, user IDs)
2. Choose the **Quality**; optionally turn on covers and sounds
3. Run, then open the **ZIP** link in the status message (or the Output tab), or download single files from the dataset

| Input | What it does |
|---|---|
| **Instagram Reel, video or post links** | Reels, video posts, carousels (every slide) and photo posts |
| **Instagram profiles** | The Reels of each profile, newest first |
| **Quality** | `compatible` (default): Instagram's ready MP4, H.264 ~720p with sound, plays on every device and editor. `highest`: 1080p when Instagram has it: the sharpest video track joined with its sound (no re-encoding) |
| **Reels per profile** | Latest N Reels of each profile (default 20, `0` = the whole Reels tab) |
| **Posted after / before** | Only Reels from a date range: `2026-09-01` or `7 days`, `2 weeks`, `1 month` |
| **Skip pinned Reels** | Leave out the old Reels pinned to the top |
| **Only new Reels since the previous run** | Skip what earlier runs already downloaded: schedule it to back up an account |
| **ZIP archive** | On by default: everything in one download, split every ~200 MB |
| **Photos / covers / sounds** | Carousel and photo post images (on by default), cover JPG and sound M4A of every video |

A post that is deleted, private or not found gives a row with `error` and is not charged.

#### Why this Actor

| | |
|---|---|
| 🎞️ **Real 1080p** | Instagram's ready MP4 is ~720p. Instagram also keeps sharper video tracks without sound: `highest` joins the 1080p track with the sound, the same picture you see in the app |
| 👤 **Whole profiles** | Every Reel of a creator, a date range, or only the new ones since the last run. Most downloaders take single links only |
| 🗜️ **One ZIP for everything** | A folder per account and `metadata.csv` with caption, date, stats and file name of every post |
| 🖼️ **Carousels, photos, covers, sounds** | Every slide of a carousel (videos and photos), covers as JPG, sounds as M4A |
| 🔗 **Links that do not expire** | Instagram's own file links stop working within a day or two; the files saved here stay in your Apify storage |
| 💰 **$3.79 per 1,000 posts** | No subscription; a carousel with all its slides is one charge; covers, sounds and the ZIP are free; failed posts are free |

#### Back up an Instagram account automatically

1. Add the profile (`yourbrand`), set **Reels per profile** to `0` and turn on **Only new Reels since the previous run**
2. Run once: every Reel is downloaded
3. Save as a task with a daily schedule: each run downloads only the Reels posted since, and the ZIP holds just those

The list of downloaded Reels is kept per profile in your account (key-value store `instagram-downloader-state`). Add an integration to send the files to Google Drive, Dropbox or S3.

#### Pricing

Pay per downloaded post or Reel, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Downloaded post or Reel (all its files: every carousel slide, cover, sound) | $0.00379 | $0.003411 | $0.003032 |
| New profile lookup (only when Instagram shows a new profile's page to a residential IP only) | $0.004 | $0.004 | $0.004 |

| Task | Cost |
|---|---|
| 10 Reels | ~$0.039 |
| 1,000 Reels | ~$3.79 |
| Daily backup of an account posting 2 Reels a day, for a month | ~$0.26 per month |

Covers, sounds and the ZIP are free. Posts that are not found or fail are not charged. Downloaded files use your Apify storage.

#### Ready-made tasks

Open it, change the profile, and run:

| Task | What you get |
|---|---|
| [Download All Instagram Reels From a Profile in HD](https://apify.com/s_actors/instagram-video-downloader/examples/download-all-instagram-reels-from-profile) | Every Reel of an Instagram account as MP4 files and one ZIP |

#### FAQ

**What is the difference between the qualities?** For every video Instagram keeps one ready MP4 with sound (H.264, usually 720 × 1280) and separate video tracks without sound up to 1080p (AV1 or VP9). `compatible` saves the ready MP4: it plays everywhere, including old phones and video editors. `highest` joins the sharpest track with the sound into one MP4 without re-encoding, so the picture is exactly Instagram's. AV1 and VP9 play in Chrome, Edge, Firefox, VLC, Android, recent iPhones and Macs; if Instagram has no sharper track, you get the ready MP4.

**Can I download all Reels of an Instagram profile?** Yes: add the username and set **Reels per profile** to `0`. Private accounts cannot be downloaded. Profiles give their Reels tab; feed videos, carousels and photos are downloaded from their links.

**How long do the download links work?** `videoFileUrl`, `videoFileUrls`, `imageFileUrls`, `coverFileUrl`, `audioFileUrl` and the ZIP point to your Apify storage and work as long as the run's storage is kept (unnamed storages are removed after your plan's data retention period). Instagram's own links (`videoCdnUrl`) expire within a day or two.

**Is a carousel charged per slide?** No: one post is one charge, with every slide, the cover and the sound.

**Does the video have a watermark?** No. Instagram adds no watermark to the files it plays; you get the same file.

**Do I need an Instagram account or cookies?** No. The Actor reads public posts the way Instagram shows them to a visitor.

**I only need the stats, not the files.** Use Instagram Reels Scraper for every Reel of a profile with plays, likes and comments, or [Instagram Post Scraper](https://apify.com/s_actors/instagram-post-scraper) for any post by link.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client: the dataset gives each file's link, and the ZIP is at `https://api.apify.com/v2/key-value-stores/<storeId>/records/instagram-videos.zip`. Or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Download the last 10 Reels of @nasa in 1080p".

#### Other social media tools

| Tool | What it does |
|---|---|
| [Instagram Post Scraper](https://apify.com/s_actors/instagram-post-scraper) | Any post, Reel or carousel by link with the exact posting time, likes, comments and plays |
| [Instagram Trending Audio](https://apify.com/s_actors/instagram-trending-audio) | Reels sounds trending right now in any country, with Reels counts and daily growth |
| [TikTok Video Downloader](https://apify.com/s_actors/tiktok-video-downloader) | TikTok videos without watermark from links or profiles, 1080p, photo posts, one ZIP |
| [Bulk Image Downloader](https://apify.com/s_actors/bulk-image-downloader) | Full-size images from Google Images, URL lists or datasets, in one ZIP |

#### Is it legal?

The Actor downloads only public posts that Instagram shows to any visitor, without logging in. Videos, photos, sounds and captions are the creators' content: download your own posts, ones you have permission to use, or use them in line with copyright law (for example research or commentary), and handle personal data such as usernames in line with GDPR and other privacy laws.

# Actor input Schema

## `postUrls` (type: `array`):

One per line: Reel links (instagram.com/reel/...), post links (instagram.com/p/...: videos, carousels, photos), IGTV links (/tv/...), shortcodes (DeTUk4sDSp-) or numeric media IDs. Public posts only.

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

Usernames (nasa or @nasa), profile links (https://www.instagram.com/nasa/ or .../nasa/reels/) or numeric user IDs, one per line: downloads the Reels of each profile, newest first. Public profiles only.

## `quality` (type: `string`):

Instagram keeps one ready MP4 (H.264, usually 720p) and, separately, sharper video tracks up to 1080p without sound. Highest joins the sharpest track with the sound into one MP4 (no re-encoding, same picture as in the app). AV1 / VP9 play in Chrome, Edge, Firefox, VLC, Android and recent iPhones; pick the default for old devices and video editors.

## `maxVideosPerProfile` (type: `integer`):

How many of the newest Reels of each profile to download (pinned Reels come first, as in the app). 0 = the whole Reels tab.

## `postedAfter` (type: `string`):

Only Reels posted after this: a date (2026-09-01) or a period (24 hours, 7 days, 2 weeks, 1 month). Profiles only. Reading stops at the first older Reel, so a short period is fast.

## `postedBefore` (type: `string`):

Only Reels posted before this: a date (2026-10-01) or a period (30 days). Profiles only.

## `skipPinned` (type: `boolean`):

Leave out the Reels pinned to the top of the profile (they are often old).

## `onlyNew` (type: `boolean`):

For profiles: skip the Reels that earlier runs with this option already downloaded (remembered per profile and monitor name in your key-value store instagram-downloader-state). Schedule the run daily to back up an account or collect a creator's new Reels automatically.

## `monitorName` (type: `string`):

Separate memory for separate schedules (for example 'competitors' and 'clients'). Empty = default.

## `createZip` (type: `boolean`):

Also pack all downloaded files into instagram-videos.zip (a folder per account, plus metadata.csv with the caption, date, stats and file name of each post). Parts of ~200 MB: instagram-videos-2.zip, ...

## `includePhotos` (type: `boolean`):

Also save the photos of carousel and photo posts (JPG, full resolution). Off = videos only: a photo-only post is skipped (free).

## `downloadCovers` (type: `boolean`):

Also save each video's cover image as JPG (coverFileUrl). Free.

## `downloadAudio` (type: `boolean`):

Also save each video's sound (music or original audio) as M4A / AAC (audioFileUrl). Free.

## `maxConcurrency` (type: `integer`):

How many Instagram requests run at the same time. Downloads run at most 4 at a time.

## `debugLog` (type: `boolean`):

Log every retried request (for troubleshooting).

## Actor input object example

```json
{
  "postUrls": [
    "https://www.instagram.com/reel/DeTUk4sDSp-/",
    "https://www.instagram.com/p/DekS-u4GltE/"
  ],
  "quality": "compatible",
  "maxVideosPerProfile": 20,
  "skipPinned": false,
  "onlyNew": false,
  "createZip": true,
  "includePhotos": true,
  "downloadCovers": false,
  "downloadAudio": false,
  "maxConcurrency": 5,
  "debugLog": false
}
```

# Actor output Schema

## `zip` (type: `string`):

All downloaded files in one ZIP (a folder per account + metadata.csv). Large runs add instagram-videos-2.zip and on (see Files).

## `downloads` (type: `string`):

MP4 link, resolution, codec and size of every post, plus photo, cover and sound links.

## `details` (type: `string`):

Caption, date, duration, plays, likes, comments, hashtags and sound of every post.

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

Every MP4, photo, cover, M4A and ZIP saved by the run.

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "postUrls": [
        "https://www.instagram.com/reel/DeTUk4sDSp-/",
        "https://www.instagram.com/p/DekS-u4GltE/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/instagram-video-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 = { "postUrls": [
        "https://www.instagram.com/reel/DeTUk4sDSp-/",
        "https://www.instagram.com/p/DekS-u4GltE/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/instagram-video-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 '{
  "postUrls": [
    "https://www.instagram.com/reel/DeTUk4sDSp-/",
    "https://www.instagram.com/p/DekS-u4GltE/"
  ]
}' |
apify call s_actors/instagram-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/instagram-video-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/MX69iKHFPmGibBUas/builds/0hV6XPeXF8Uw26IrR/openapi.json
