# Instagram Reel Details (`lumenforge/instagram-reel-details`) Actor

Collect details for public Instagram Reels, including captions, creator information, audio/video details and sanitized media data. No Instagram login required. $0.80 per 1,000 successful Reels; failed results aren’t billed.

- **URL**: https://apify.com/lumenforge/instagram-reel-details.md
- **Developed by:** [LumenForge](https://apify.com/lumenforge) (community)
- **Categories:** Social media
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 reels

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/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 Reel Details

Collect details for public Instagram Reels, including captions, creator information, and video/audio metadata. The output contains normalized fields and a sanitized nested media object; field availability varies by Reel. This is not the full HTTP response or unrelated feed data.

**Published on the Apify Store.** Cloud collection has been tested. Pay-per-event
billing is active for successful default-dataset items; failed observations go
to the run summary and do not trigger the result event.

### Input

```json
{"urls": ["https://www.instagram.com/reel/SHORTCODE/"]}
```

Replace `SHORTCODE` with a real public Reel identifier. Supply 1–1,000 URLs;
duplicates and tracking-query variants are collected once. `/reel/SHORTCODE/` and `/USERNAME/reel/SHORTCODE/` URLs
are supported; any other URL is skipped, listed under `invalidUrls` in `SUMMARY`,
and not billed. No customer Instagram credentials are required.

### Output

| Field | Meaning / source |
|---|---|
| `schemaVersion` | `2`; full-media response contract |
| `url`, `shortcode`, `mediaId` | Canonical Reel URL and identifiers; IDs are strings |
| `collectedAt` | Actual capture timestamp, ISO 8601 UTC |
| `playCount` | Instagram `play_count`; not unique viewers |
| `instagramPlayCount` | Separate `ig_play_count`; never substituted for `play_count` |
| `likeCount`, `commentCount` | Reported likes and comment counts |
| `reshareCount`, `saveCount` | Reported `reshare_count` and `save_count`; conditional availability |
| `caption`, `hashtags` | Caption text and hashtags extracted from it |
| `takenAt` | Source publication timestamp in Unix seconds |
| `author` | ID, username, display name, verified flag and profile picture URL |
| `video` | Duration in seconds, original width/height, video versions, image candidates, audio flag |
| `location`, `coauthors` | Source location and coauthor data when present |
| `audio` | Music info or original-sound info from clips metadata |
| `raw` | Captured media object, including additional fields and nested structures |
| `removedFields` | Paths removed from `raw`; values are never included |

Missing normalized scalar fields are `null`. A real zero stays zero. An empty
source array is preserved as an empty array. Missing raw keys remain absent.
Do not assume different count fields have identical definitions or that a
reported zero proves the underlying metric is available. Instagram may hide or
restrict metrics; related visibility flags remain in `raw`.

Observed source fields include video versions, thumbnails, subtitles, DASH
manifest, clips/audio metadata, collaboration and sponsorship metadata, location,
preview comments and product tags. Preview comments are **not** a complete comment
export. The local `FIELD_INVENTORY.md` records all 544 observed nested paths from
two public Reels; that sample is not an exhaustive Instagram schema.

Media and profile image URLs can expire. Downloading the media itself, historical
snapshots, account discovery, follower exports and private-content access are not
included. An author must explicitly be marked public in the response; otherwise
no media content is returned.

### Failure handling and exports

Successful results go to the default dataset, available as JSON, CSV or Excel.
JSON is recommended for nested `raw` details. Failures go to the key-value store's
`SUMMARY`, leaving successful rows accessible and marking the run failed:

- `capture_timeout`: no matching fresh full-media response within the capture window.
- `privacy_not_verified`: public visibility could not be established.
- `unsupported_media`: the response is not a Reel video.

A timeout does not establish deletion, private visibility or zero plays. Internal
errors stop the run without turning them into fake media records. Repeated runs
make new observations; resuming the same run avoids re-pushing known results.

Requests from overlapping Actor runs enter a durable FIFO queue on the collector.
The collector processes one Reel at a time because it uses one simulator. It
accepts up to 100 queued or running requests; when full, the Actor retries the
same request ID. The Actor submits each Reel once and polls that request until it
finishes. A service restart preserves queued requests. If a restart interrupts
an active capture, its outcome is marked unknown and is not collected again, so
an ambiguous capture cannot create a duplicate result or charge.

### Privacy and pricing

Only the requested media object is captured. Authentication/session fields,
tracking tokens and viewer-specific relationship or interaction state are removed
recursively. Unknown media fields are retained subject to these rules; the output
is sanitized data, not a byte-for-byte raw response.

Pricing is $0.0008 per successfully returned Reel ($0.80 per 1,000 dataset
items), through Apify's automatic default-dataset event. There is no per-run
start event, and failed observations stay outside the billable dataset. The
Actor is configured not to pass Apify platform usage costs through as a separate
charge to Actor users.

After publication, use the Actor's issue tab with a run ID for support. Never include credentials or cookies.

# Actor input Schema

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

1–1,000 public Reel URLs. Duplicate Reels are collected once.

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/reel/De2t82PPyx9/"
  ]
}
```

# Actor output Schema

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

No description

# 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/De2t82PPyx9/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lumenforge/instagram-reel-details").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/De2t82PPyx9/"] }

# Run the Actor and wait for it to finish
run = client.actor("lumenforge/instagram-reel-details").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/reel/De2t82PPyx9/"
  ]
}' |
apify call lumenforge/instagram-reel-details --silent --output-dataset

```

## MCP server setup

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

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/DJAPIbOtbfS7yIbe3/builds/dbBseUtn019uT6cLa/openapi.json
