# Instagram Video Downloader (`khadinakbar/instagram-video-downloader`) Actor

Download public Instagram videos and reels by URL — direct mp4 links, thumbnails, captions, owner, view/like counts. Carousels return one record per video child. MCP-ready, cookieless, HTTP-only.

- **URL**: https://apify.com/khadinakbar/instagram-video-downloader.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Automation, MCP servers
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 video downloadeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Instagram Video Downloader

**Download public Instagram videos and reels by URL** — get direct `.mp4` download links, thumbnails, captions, owner data, view counts, and full metadata in seconds. Carousels are unwrapped into one record per video child. **MCP-ready**, cookieless, HTTP-only, agent-friendly.

### What does Instagram Video Downloader do?

This actor turns any public **[Instagram](https://www.instagram.com/) Reel, video post, IGTV, or carousel URL** into a structured record with a direct `.mp4` download URL plus rich metadata — thumbnail, caption, owner handle, view/like/comment counts, audio track, dimensions, and post timestamp. It does the same thing as right-click → save, but for hundreds of URLs at a time, with clean JSON output.

Built for content repurposing, archival, social listening, ad creative analysis, and AI agent workflows. The actor calls a redundant pair of provider APIs (ScrapeCreators primary, SociaVault fallback), so when one rate-limits or returns 404 the other takes over automatically — that's how you get reliable video extraction without managing your own Instagram cookies.

Apify platform advantages: API access, scheduling, integrations with 5000+ apps, automatic retries, and a permanent dataset URL for every run.

### Why use Instagram Video Downloader?

- **Repurpose content at scale** — feed brand-owned Reels to your podcast/YouTube workflow without manual saves.
- **Archive public posts** — keep mp4 + caption + metadata snapshot before an account goes private or a post is deleted.
- **Train AI models** — pull video assets + captions for fine-tuning, vector indexing, or RAG.
- **Power AI agents** — Claude / GPT / Gemini agents call this through Apify MCP to fetch a video by URL as part of larger tasks.
- **Competitor & ad analysis** — pull rival brand Reels (caption, view count, posted-at, audio track) for benchmarking.
- **Carousel-aware** — multi-video posts return one record per child, with carousel index and total.
- **No cookies, no login, no proxy headaches** — provider APIs do the dirty work.

### How to use Instagram Video Downloader

1. Open the actor's **Input** tab.
2. Paste one or more Instagram URLs into `urls` — Reels (`/reel/<code>/`), posts (`/p/<code>/`), or IGTV (`/tv/<code>/`). Bare 11-character shortcodes also work.
3. Set `maxVideos` to cap PPE cost (default 100 → ~$0.70 max).
4. Click **Start**.
5. When the run finishes, open the **Dataset** tab to download videos and metadata as **JSON, CSV, Excel, or HTML**. Each row has a `videoUrl` field you can `wget` / `curl` directly.

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `urls` | array of strings | yes | — | Instagram Reel/post/IGTV URLs or 11-char shortcodes. |
| `maxVideos` | integer | no | 100 | Hard cap on billable video records (1–10000). |
| `proxyConfiguration` | object | no | `{ useApifyProxy: true }` | Apify proxy config; datacenter is fine. |

Example input:

```json
{
  "urls": [
    "https://www.instagram.com/reel/DLDXI0fylTC/",
    "https://www.instagram.com/p/C8Q1xyz9abc/",
    "DMA4eb1RC0D"
  ],
  "maxVideos": 50
}
```

### Output

You can download the dataset in **JSON, HTML, CSV, or Excel**. Example record:

```json
{
  "videoUrl": "https://scontent-iad3-2.cdninstagram.com/o1/v/t16/.../video.mp4?...",
  "thumbnailUrl": "https://scontent-iad3-1.cdninstagram.com/v/t51.../thumb.jpg?...",
  "displayUrl": "https://scontent-iad3-1.cdninstagram.com/v/t51.../display.jpg?...",
  "caption": "When the algorithm finally hits 🚀 #marketing #reels",
  "durationSeconds": 84.666,
  "width": 1080,
  "height": 1920,
  "hasAudio": true,
  "viewCount": null,
  "playCount": 425901,
  "likeCount": 18234,
  "commentCount": 412,
  "postedAt": "2026-06-21T14:32:01.000Z",
  "ownerUsername": "examplebrand",
  "ownerFullName": "Example Brand",
  "ownerVerified": true,
  "ownerProfilePicUrl": "https://scontent-iad3-1.cdninstagram.com/v/t51.../pp.jpg?...",
  "audioArtistName": "jane",
  "audioSongName": "Original audio",
  "usesOriginalAudio": true,
  "shortcode": "DLDXI0fylTC",
  "sourceUrl": "https://www.instagram.com/reel/DLDXI0fylTC/",
  "mediaType": "reel",
  "isCarousel": false,
  "carouselIndex": null,
  "carouselTotal": null,
  "provider": "scrapecreators"
}
```

### Data table

| Field | Type | Notes |
|---|---|---|
| `videoUrl` | string | Direct `.mp4`. **Expires after a few hours** — download promptly. |
| `thumbnailUrl` | string | Square thumb. |
| `displayUrl` | string | Full-size poster image. |
| `caption` | string|null | Raw caption (hashtags + emojis intact). |
| `durationSeconds` | number|null | Video length. |
| `width`, `height` | int|null | Pixels. |
| `hasAudio` | bool|null | |
| `viewCount`, `playCount` | int|null | Instagram-only counts. |
| `likeCount`, `commentCount` | int|null | |
| `postedAt` | ISO string|null | UTC. |
| `ownerUsername`, `ownerFullName`, `ownerVerified`, `ownerProfilePicUrl` | mixed | Owner public info. |
| `audioArtistName`, `audioSongName`, `usesOriginalAudio` | mixed | Reels only. |
| `shortcode` | string | 11-char IG code. |
| `sourceUrl` | string | Normalized IG URL. |
| `mediaType` | string | `reel`, `post`, or `igtv`. |
| `isCarousel`, `carouselIndex`, `carouselTotal` | mixed | Sidecar metadata. |
| `provider` | string | `scrapecreators` or `sociavault`. |

### How much does it cost to download Instagram videos?

This actor uses **Pay-Per-Event** pricing:

- **$0.007 per video** pushed to the dataset (one per Reel / video post / IGTV; one per video child for carousels).
- **$0.00005 per actor start** (covers init + provider routing).

Cost examples:

| Input | Videos returned | Approx cost |
|---|---|---|
| 1 single Reel URL | 1 | $0.007 |
| 10 mixed URLs (no carousels) | 10 | $0.07 |
| 100 Reels | 100 | $0.70 |
| 100 URLs (5 carousels avg 3 videos each → 110 records) | 110 | $0.77 |

Use the `maxVideos` input to set a hard ceiling on spend.

### Tips & advanced options

- **Download videos fast.** Instagram CDN URLs are time-signed and expire — pipe `videoUrl` to `wget`/`curl` within minutes, or store the bytes in your own object store.
- **Bulk archival** — pair this actor with [`instagram-reels-scraper`](https://apify.com/khadinakbar/instagram-reels-scraper) or [`instagram-hashtag-scraper`](https://apify.com/khadinakbar/instagram-hashtag-scraper) to discover Reel URLs first, then feed them here.
- **Transcripts** — pair with [`instagram-transcript-scraper`](https://apify.com/khadinakbar/instagram-transcript-scraper) when you also need spoken-audio text.
- **Cost cap** — `maxVideos` stops processing as soon as the cap is reached (cheaper than scheduling many tiny runs).
- **Carousels** — the actor returns one dataset record per video child; photo children are skipped silently. If a carousel has only photos, the URL soft-fails with reason `no_video_in_post`.

### FAQ

**Does this work on private accounts?**
No. Only public Reels / posts / IGTV. Private posts soft-fail with reason `not_found`.

**Does this work for deleted posts?**
No. Deleted posts return `not_found` from both providers and soft-fail.

**Does this work for photo posts?**
The actor accepts any IG post URL but only emits records for posts containing at least one video. Photo-only posts soft-fail with reason `no_video_in_post`.

**How long do `videoUrl` links stay valid?**
Hours, not days. Download or store the bytes promptly.

**Will Instagram block me?**
You never hit Instagram directly — the actor calls provider APIs that handle Instagram-side blocking on their end. No cookies, no login, no IP burn for you.

**Can I use this from an AI agent?**
Yes. The actor is published on Apify MCP and works with Claude, GPT, Gemini, and any MCP client. The tool description includes pricing and return shape so the agent can budget the call.

### Legal disclaimer

This actor scrapes only public Instagram data through publicly accessible URLs. You are responsible for complying with Instagram's Terms of Service, applicable copyright law, and any applicable data-protection regulations (GDPR, CCPA, etc.) when using the data this actor returns. Do not redistribute or commercially exploit content without the rights holder's permission. The actor does not bypass authentication, scrape private accounts, or store user credentials.

### Support

Found a bug or have a feature request? Open an issue on the actor's Issues tab.

# Actor input Schema

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

List of public Instagram Reel, post, or IGTV URLs to extract video download links from. Accepts full URLs (e.g. 'https://www.instagram.com/reel/DLDXI0fylTC/' or 'https://www.instagram.com/p/DLDXI0fylTC/') or bare 11-character shortcodes ('DLDXI0fylTC'). Carousel posts return one dataset record per video child. NOT for private accounts, deleted posts, or photo-only posts — those soft-fail per URL.

## `maxVideos` (type: `integer`):

Hard cap on the number of billable video records pushed to the dataset across all input URLs. Stops processing as soon as the cap is reached. Default 100; range 1-10000. At $0.007 per video, maxVideos=100 = ~$0.70 max PPE spend.

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

Proxy for the few outbound provider HTTP calls. Default datacenter is fine — providers handle Instagram-side blocking themselves. Override only if your account requires provider-IP whitelisting.

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/reel/DLDXI0fylTC/",
    "https://www.instagram.com/p/C8Q1ABC123x/"
  ],
  "maxVideos": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `videos` (type: `string`):

Direct .mp4 URLs + metadata, one record per video.

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

Aggregate counts, provider breakdown, and per-URL skip reasons.

# 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/reel/DLDXI0fylTC/"
    ],
    "maxVideos": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "urls": ["https://www.instagram.com/reel/DLDXI0fylTC/"],
    "maxVideos": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/instagram-video-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/reel/DLDXI0fylTC/"
  ],
  "maxVideos": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call khadinakbar/instagram-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/instagram-video-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/PJl75c5gYobHfBLGY/builds/Rdufx2Zpa3nAXBYZu/openapi.json
