# Instagram Post & Reel Details Scraper (`automation-lab/instagram-post-reel-details-scraper`) Actor

Batch-enrich public Instagram post and Reel URLs with captions, authors, engagement, timestamps, media assets, locations, mentions, hashtags, and video metadata — no Instagram login required.

- **URL**: https://apify.com/automation-lab/instagram-post-reel-details-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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 Post & Reel Details Scraper

Turn a list of public Instagram post and Reel URLs into structured records for content analysis, campaign reporting, and recurring engagement snapshots.

The Actor accepts known `/p/` and `/reel/` URLs.
It returns one typed dataset item per successful URL.
No Instagram account or session cookie is required.

### What does this Instagram scraper do?

This Actor batch-enriches supplied public Instagram URLs.

For each accessible post or Reel it can return:

- shortcode and Instagram media ID;
- canonical URL and content type;
- caption, hashtags, and mentions;
- publication timestamp;
- creator name, username, profile URL, and verification status;
- visible likes, comments, views, and plays when Instagram exposes them;
- image, carousel, and video asset URLs;
- dimensions and video duration;
- tagged users and collaborators;
- tagged location;
- music or original-audio metadata when available.

It does not discover profile feeds, hashtags, comments, or private posts.
Use it when you already know the content URLs to enrich.

### Who is it for?

**Social media analysts** can normalize campaign URLs before analysis.

**Marketing teams** can schedule snapshots of visible engagement.

**Agencies** can process mixed client post and Reel lists in one run.

**Data engineers** can send typed JSON into warehouses or spreadsheets.

**Developers** can call the Actor through the Apify API or MCP.

### Why use this Actor?

- Process posts and Reels in the same input.
- Avoid managing Instagram login cookies.
- Receive one consistent schema across image, video, and carousel content.
- Preserve successful rows if one URL in a batch fails.
- See a failed run when an input is missing, private, deleted, or blocked.
- Pay only the item event for successfully emitted records.
- Export results through Apify in JSON, CSV, Excel, XML, or RSS formats.

### What Instagram data is extracted?

| Field | Meaning |
| --- | --- |
| `shortcode` | Stable shortcode from the supplied URL |
| `postId` | Instagram media identifier |
| `contentType` | `post`, `reel`, or `carousel` |
| `caption` | Public caption text |
| `timestamp` | Publication time in ISO 8601 format |
| `author` | Creator ID, username, name, profile URL, photo, and verification |
| `likesCount` | Visible like count, or `null` when hidden |
| `commentsCount` | Visible comment count, or `null` when hidden |
| `viewsCount` | Visible view count when exposed |
| `playsCount` | Visible Reel play count when exposed |
| `displayUrl` | Primary image or thumbnail URL |
| `videoUrl` | Primary video URL when exposed |
| `media` | Image/video assets, including carousel children |
| `location` | Public location ID, name, and coordinates when tagged |
| `hashtags` | Hashtags parsed from the caption |
| `mentions` | Usernames mentioned in the caption |
| `taggedUsers` | Usernames tagged on the media |
| `coauthors` | Collaborating creator usernames |
| `music` | Track or original-audio metadata |
| `scrapedAt` | Extraction time |

Instagram can hide individual engagement or media fields.
Such fields are returned as `null` instead of fabricated values.

### How to get started

1. Open the Actor input page.
2. Add one or more public Instagram post or Reel URLs.
3. Keep Apify Proxy enabled for the most stable access.
4. Optionally lower `maxItems` to test only part of a saved list.
5. Click **Start**.
6. Open the **Dataset** tab when the run finishes.
7. Export the rows or connect the dataset to another service.

A partial batch keeps useful rows but ends with a failed status.
Check the log for the exact shortcode and failure reason.
Failed URLs do not emit or charge an item event.

### Input parameters

#### `startUrls`

Required array of public Instagram content URLs.

Supported path formats:

- `https://www.instagram.com/p/SHORTCODE/`
- `https://www.instagram.com/reel/SHORTCODE/`
- legacy public `/tv/SHORTCODE/` links

Tracking query parameters are ignored.
Duplicate shortcodes are processed once.
Up to 2 unique URLs are accepted per run and processed concurrently.

#### `maxItems`

Optional integer from 1 to 2.

The Actor processes only the first `maxItems` unique URLs.
The default is 2.

#### `proxyConfiguration`

Apify Proxy is enabled by default.
The default route uses a datacenter proxy and does not require residential proxy traffic.

You can disable Apify Proxy for direct access.
Direct access may be less reliable from some environments.

### Example input

```json
{
  "startUrls": [
    { "url": "https://www.instagram.com/p/DbtErSrlB2J/" },
    { "url": "https://www.instagram.com/reel/Dbn-XJhk0_-/" }
  ],
  "maxItems": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

The example intentionally combines a carousel post and a Reel.

### Example output

```json
{
  "inputUrl": "https://www.instagram.com/reel/Dbn-XJhk0_-/",
  "canonicalUrl": "https://www.instagram.com/reel/Dbn-XJhk0_-/",
  "shortcode": "Dbn-XJhk0_-",
  "postId": "3956...",
  "contentType": "reel",
  "caption": "Public caption text...",
  "timestamp": "2026-08-04T16:18:15.000Z",
  "author": {
    "id": "528817151",
    "username": "nasa",
    "fullName": "NASA",
    "profileUrl": "https://www.instagram.com/nasa/",
    "verified": true
  },
  "likesCount": 201386,
  "commentsCount": 2091,
  "viewsCount": null,
  "playsCount": null,
  "videoDurationSeconds": 51.4,
  "videoUrl": "https://scontent.cdninstagram.com/...mp4",
  "hashtags": ["NASA"],
  "mentions": [],
  "taggedUsers": [],
  "coauthors": [],
  "scrapedAt": "2026-08-06T20:30:00.000Z"
}
```

Counts and signed media URLs change over time.
Treat the example as a shape demonstration, not a frozen result.

### How much does it cost to extract Instagram post and Reel details?

Pricing uses two pay-per-event charges:

- a **$0.005 start event** once per run;
- an **item event** for each successfully emitted content record.

The current BRONZE item price is **$0.001736 per record**.
Higher-volume Apify plan tiers receive lower item prices.

Example BRONZE totals:

| Successful records | Approximate charge |
| ---: | ---: |
| 1 | $0.006736 |
| 10 | $0.02236 |
| 2 | $0.008472 |

A failed URL has no item event.
Browser runtime and proxy usage are covered by the Actor price rather than billed as a separate result type.
Always check the live pricing panel for the tier attached to your Apify account.

### Recurring monitoring workflow

Create an Apify Task with the campaign's URL list.

Schedule it hourly, daily, or weekly.

Each run creates a new dataset snapshot.
Compare `likesCount`, `commentsCount`, `viewsCount`, and `playsCount` by shortcode.

This Actor does not send alerts or calculate deltas itself.
Use Make, Zapier, n8n, a webhook, or your data warehouse for comparisons and notifications.

Media URLs can expire.
Persist the fields you need when each run completes.

### Export and integrations

Dataset results can be exported as:

- JSON;
- JSONL;
- CSV;
- Excel;
- XML;
- RSS.

Common workflows include:

- append campaign metrics to Google Sheets;
- load snapshots into BigQuery or Snowflake;
- trigger a webhook after a scheduled Task;
- enrich a CRM content record by shortcode;
- join content performance to a campaign table;
- feed structured rows to an LLM for classification.

### Run through the API with cURL

Replace `YOUR_APIFY_TOKEN` with an Apify API token.

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~instagram-post-reel-details-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [
      {"url": "https://www.instagram.com/reel/Dbn-XJhk0_-/"}
    ],
    "maxItems": 1
  }'
```

The response contains the run and default dataset IDs.
Poll the run or use the synchronous dataset endpoint for small jobs.

### Run through the API with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client
  .actor('automation-lab/instagram-post-reel-details-scraper')
  .call({
    startUrls: [
      { url: 'https://www.instagram.com/p/DbtErSrlB2J/' },
    ],
    maxItems: 1,
  });

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run through the API with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])

run = client.actor(
    'automation-lab/instagram-post-reel-details-scraper'
).call(run_input={
    'startUrls': [
        {'url': 'https://www.instagram.com/reel/Dbn-XJhk0_-/'},
    ],
    'maxItems': 1,
})

items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/instagram-post-reel-details-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Claude Desktop, Cursor, VS Code, and other HTTP MCP clients can use:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/instagram-post-reel-details-scraper"
    }
  }
}
```

Example prompts:

- “Extract details for these public Instagram campaign URLs.”
- “Return caption, author, engagement, and media fields for this Reel.”
- “Compare the latest dataset with yesterday's snapshot by shortcode.”

### Limits and failure behavior

Only public post and Reel URLs are supported.

Private, deleted, age-restricted, region-restricted, or unavailable content fails explicitly.

Instagram may hide likes, views, plays, locations, audio, or downloadable media.
Hidden fields remain `null`.

Signed CDN media URLs expire and should not be treated as permanent storage.

A source layout or anti-bot change can temporarily affect extraction.
The Actor uses structured page data instead of visual CSS selectors to reduce this risk.

Up to two fresh browser pages process a batch concurrently, with one bounded retry for transient navigation failures.
The 2-URL cap keeps worst-case navigation and retry time within the 600-second run timeout.
Split larger lists into multiple Tasks or API calls.

### Responsible use and legality

Use this Actor only for data you are authorized to collect.

Respect Instagram's terms, applicable privacy laws, intellectual-property rights, and contractual obligations.

Public availability does not automatically authorize every reuse.
Avoid collecting sensitive data, profiling individuals, or republishing media without a lawful basis.

You are responsible for your input URLs, retention policy, and downstream use.
This documentation is not legal advice.

### Troubleshooting

#### Why did one URL fail while other rows were saved?

The URL may be private, deleted, restricted, malformed, or temporarily challenged.
The Actor preserves successful rows but fails the run so missing inputs are visible.
Inspect the log for the shortcode-specific reason.

#### Why is an engagement field `null`?

Instagram does not expose every metric for every content type or viewer context.
The Actor never substitutes zero for a hidden value.

#### Why does a media URL no longer work?

Instagram CDN URLs are signed and temporary.
Download authorized media promptly if long-term retention is required.

#### Should I disable Apify Proxy?

Keep it enabled unless direct access is known to work reliably in your environment.
Disabling it can reduce routing overhead but may increase challenge rates.

### Related Automation Lab Actors

- [Instagram Profile Posts Scraper](https://apify.com/automation-lab/instagram-profile-posts-scraper) discovers posts from public profile usernames.
- [Instagram Comments Scraper](https://apify.com/automation-lab/instagram-comments-scraper) collects comment records when comment-level analysis is needed.
- [Instagram Media Downloader](https://apify.com/automation-lab/instagram-media-downloader) focuses on downloading authorized Instagram media assets.

Choose this Actor when the input is a known post/Reel URL list and the output should be one rich content record per URL.

### FAQ

#### Does it require an Instagram login?

No.
The Actor handles supported public content without a session cookie.

#### Can it scrape private posts?

No.
Private and login-only content is outside the product scope.

#### Does it discover posts from a username or hashtag?

No.
Use a related discovery Actor first, then pass the resulting public URLs here.

#### Are likes and comments historical?

No.
They are a visible snapshot at extraction time.
Schedule repeated Tasks if you need a time series.

#### Does it download images and videos?

It returns exposed CDN asset URLs and metadata.
It does not persist media files in the dataset.

#### Can I process more than 2 URLs?

Split the list across multiple runs or Tasks.
The bounded batch size keeps retries within the run timeout and failure reporting manageable.

# Actor input Schema

## `startUrls` (type: `array`):

Public instagram.com/p/... or instagram.com/reel/... URLs to enrich. Up to 2 unique URLs are processed concurrently per run.

## `maxItems` (type: `integer`):

Stop after this many unique supplied URLs. Useful for testing a smaller prefix of a saved batch.

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

Use Apify Proxy for stable public Instagram page access. Disable it only when direct access is known to work from your environment.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.instagram.com/p/DbtErSrlB2J/"
    },
    {
      "url": "https://www.instagram.com/reel/Dbn-XJhk0_-/"
    }
  ],
  "maxItems": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Structured Instagram post and Reel detail records

# 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 = {
    "startUrls": [
        {
            "url": "https://www.instagram.com/p/DbtErSrlB2J/"
        },
        {
            "url": "https://www.instagram.com/reel/Dbn-XJhk0_-/"
        }
    ],
    "maxItems": 2,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/instagram-post-reel-details-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 = {
    "startUrls": [
        { "url": "https://www.instagram.com/p/DbtErSrlB2J/" },
        { "url": "https://www.instagram.com/reel/Dbn-XJhk0_-/" },
    ],
    "maxItems": 2,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/instagram-post-reel-details-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.instagram.com/p/DbtErSrlB2J/"
    },
    {
      "url": "https://www.instagram.com/reel/Dbn-XJhk0_-/"
    }
  ],
  "maxItems": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation-lab/instagram-post-reel-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/instagram-post-reel-details-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ExYX7e6HGNy2o2G6D/builds/58eRLH1gNXruYEcJQ/openapi.json
