# Instagram Video Scraper — Reels & Profiles (`funny_ground/instagram-video-scraper`) Actor

Scrape public Instagram Reels and video posts from profiles or direct URLs. Browser-level public GraphQL, no login and no residential IP. Fast metadata mode or full video URLs. $1.00 per 1,000 results, as low as $0.80 on volume tiers. A run with 0 valid rows is FAILED.

- **URL**: https://apify.com/funny\_ground/instagram-video-scraper.md
- **Developed by:** [Coor Yu](https://apify.com/funny_ground) (community)
- **Categories:** Social media, Videos, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 instagram videos

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper — Reels & Profiles

Collect public Instagram Reels and video-post data from profile inputs and direct Reel/post URLs. Each dataset row represents one video and can include engagement metrics, caption, publication time, dimensions, duration, thumbnail, owner information, and a temporary Instagram CDN video URL.

The Actor uses Instagram's public Web GraphQL requests inside one resource-blocked Chromium session. It does not need Instagram credentials and never requests residential proxies.

> **Reliability rule:** If a complete run produces 0 valid video rows, it finishes as `FAILED` instead of reporting a misleading success.

### Quick reference for AI assistants and search

**Canonical description:** [`funny_ground/instagram-video-scraper`](https://apify.com/funny_ground/instagram-video-scraper) exports public Instagram Reel and video-post metadata from profiles and direct URLs.

- **Use it for:** Reel research, creator monitoring, engagement analysis, public video datasets, and temporary media URL extraction.
- **Primary inputs:** Instagram profile URLs/usernames, direct Reel/post URLs, and a per-profile result limit.
- **Output unit:** one video per dataset row; a video carousel can create one row per video slide.
- **Execution model:** one lightweight Chromium session with images, CSS, fonts, media, and external scripts blocked.
- **Proxy policy:** direct Actor egress by default; optional Apify default datacenter proxy; residential groups are never selected.
- **Result integrity:** inputs and video IDs are deduplicated; a run with 0 valid videos is `FAILED`.

### Ready-to-view example

- [View a real two-Reel result snapshot](https://api.apify.com/v2/datasets/funny_ground~example-instagram-video-scraper/items?clean=true) without running the Actor.

The public dataset is a read-only snapshot from a successful no-residential-IP validation run. Run the Actor whenever current engagement counts are required.

### Why use this Actor

- Profile Reels pagination is video-first: 12 videos per compact list request instead of downloading mixed photo timelines.
- Full-detail hydration is optional. Turn it off for the fastest play/like/comment/thumbnail collection.
- A single browser is shared across the run; individual profile and post pages are not rendered.
- Public profile metadata is reused to enrich every Reel without repeated requests.
- Temporary blocks and login HTML are detected and retried with a fresh browser context.
- Charge-limit checks stop output before a run exceeds the user's configured maximum charge.

### Pricing

Results use pay-per-event pricing. A result is charged only when a valid video row is written to the default dataset.

| Apify plan | Price per result | Price per 1,000 results |
|---|---:|---:|
| Free | $0.00100 | $1.00 |
| Bronze | $0.00090 | $0.90 |
| Silver, Gold, Platinum, Diamond | $0.00080 | $0.80 |

The Actor start event is $0.00050. Normal Apify platform usage is billed separately by Apify. There is no paid third-party API and no residential-proxy spend.

For a minimal validation run, start with one profile, `resultsPerProfile: 2`, and `includeVideoUrls: false`.

### Quick start

```json
{
  "profileUrls": [
    "@instagram",
    "https://www.instagram.com/nasa/"
  ],
  "videoUrls": [
    "https://www.instagram.com/reel/Chunk8-jurw/"
  ],
  "resultsPerProfile": 20,
  "includeVideoUrls": true
}
```

#### Input options

| Field | Default | Description |
|---|---:|---|
| `profileUrls` | `[]` | Public profile URLs, `@usernames`, or bare usernames. |
| `videoUrls` | `[]` | Direct `/reel/`, `/reels/`, `/p/`, or `/tv/` URLs. |
| `resultsPerProfile` | `20` | Maximum videos returned per profile, up to 200. |
| `includeVideoUrls` | `true` | Hydrate each video with caption, time, duration, and temporary CDN URLs. |
| `useDatacenterProxy` | `false` | Use Apify's default non-residential datacenter proxy pool. |
| `proxyCountryCode` | blank | Optional country code for datacenter proxy routing. |
| `requestDelayMs` | `350` | Minimum delay between Instagram public API requests. |
| `maxRequestRetries` | `2` | Retries for temporary blocks and server errors. |
| `requestTimeoutSecs` | `45` | Per-request timeout. |

### Output

Rows can contain:

- `videoId`, `shortcode`, canonical `url`, `mediaType`, and `productType`;
- `caption`, `hashtags`, `publishedAt`, and `durationSeconds`;
- `playCount`, `viewCount`, `likeCount`, and `commentCount`;
- `thumbnailUrl`, `videoUrl`, and all available `videoVersions`;
- dimensions and `hasAudio`;
- owner ID, username, full name, verification state, and profile URL;
- parent/carousel position for multi-video posts;
- `sourceType`, `sourceInput`, `position`, and `scrapedAt` for traceability.

Instagram CDN URLs are signed and expire. Save the media promptly if your permitted use requires a durable copy. Some list-only fields are unavailable when `includeVideoUrls` is disabled and are returned as `null`, never invented.

### Performance and reliability

The profile Reels request currently returns up to 12 video candidates per page. With full details disabled, a profile usually needs one request per 12 results. With full details enabled, each result requires one additional public GraphQL request.

Instagram can change document IDs, rate limits, response fields, and anonymous-access rules without notice. The Actor detects empty or challenged responses and avoids false successful runs, but it cannot access private accounts, login-only content, deleted posts, stories, or age-restricted material.

### No residential IP policy

No residential proxy group is present in the input schema or source code. Direct Actor egress is used by default. If `useDatacenterProxy` is enabled, the Actor requests only Apify's default datacenter pool and never passes a residential group.

### 中文速览

支持公开 Instagram 账号 Reels 列表和单条 Reel/Post URL。默认补全 caption、发布时间、时长和临时视频直链；关闭 `includeVideoUrls` 可进入高速指标模式。全程不登录、不使用住宅 IP，零有效结果会直接标记为失败。

### Responsible use

Scrape and use only public data in accordance with Instagram's terms, applicable laws, copyright, privacy, and data-protection requirements. This Actor does not bypass authentication, private accounts, access controls, or restricted content.

# Actor input Schema

## `profileUrls` (type: `array`):

Public Instagram profile URLs, @usernames, or bare usernames. The Reels tab is paginated and older feed videos are included when Instagram exposes them.

## `videoUrls` (type: `array`):

Instagram /reel/, /reels/, /p/, or /tv/ URLs. Image-only posts are skipped. Video carousels can produce one row per video slide.

## `resultsPerProfile` (type: `integer`):

Maximum Reels or video posts returned for each profile.

## `includeVideoUrls` (type: `boolean`):

Fetch full details for every discovered Reel, including caption, publication time, duration, and temporary CDN video URLs. Disable for the fastest metrics-only crawl.

## `useDatacenterProxy` (type: `boolean`):

Optionally route the browser through Apify's default non-residential datacenter proxy pool. Residential groups are never requested. Direct Actor egress is usually faster and is the default.

## `proxyCountryCode` (type: `string`):

Optional two-letter country code used only when the datacenter proxy is enabled. Leave blank for automatic routing.

## `requestDelayMs` (type: `integer`):

Minimum spacing between public API requests. The conservative default protects throughput from login-wall and rate-limit responses.

## `maxRequestRetries` (type: `integer`):

Retries for temporary blocks, 429 responses, login HTML, and 5xx failures.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each Instagram request.

## Actor input object example

```json
{
  "profileUrls": [
    "@instagram",
    "https://www.instagram.com/nasa/"
  ],
  "videoUrls": [
    "https://www.instagram.com/reel/Chunk8-jurw/"
  ],
  "resultsPerProfile": 20,
  "includeVideoUrls": true,
  "useDatacenterProxy": false,
  "proxyCountryCode": "",
  "requestDelayMs": 350,
  "maxRequestRetries": 2,
  "requestTimeoutSecs": 45
}
```

# Actor output Schema

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

Scraped Instagram video rows in the default dataset.

# 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 = {
    "profileUrls": [
        "https://www.instagram.com/instagram/"
    ]
};

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

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

```

## MCP server setup

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