# Instagram Reel Transcript & Frame Analyzer for AI (`yely/instagram-reel-analyzer`) Actor

Get the transcript and 12 key frames of any Instagram reel in one JSON row, ready for Claude, GPT or Gemini vision. Plus caption, likes, comments, duration and music-only detection. Built for n8n, Make and AI agents via MCP. Pay only for reels analyzed successfully.

- **URL**: https://apify.com/yely/instagram-reel-analyzer.md
- **Developed by:** [Yely Shepetko](https://apify.com/yely) (community)
- **Categories:** Social media, AI, Videos
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 reel analyzeds

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 Transcript & Frame Analyzer for AI

Get the transcript of any Instagram reel plus 12 key frames in one image, ready for Claude, GPT or Gemini vision. Each row has the **speech transcript**, a **music-only flag**, the **caption**, **likes and comments**, the **exact duration**, the **username** and a **12-frame contact sheet** image of the video.

It's built for **automations and AI agents** in **n8n, Make, Zapier, the Apify API and Apify MCP**. It's a good fit when an LLM needs to understand what a reel says *and* shows, without downloading videos or running Whisper yourself.

- **No invented transcripts.** A voice-activity detector checks the audio before transcription. Music-only reels return `speech: false` and an empty transcript, never phantom text like "Thanks for watching".
- **Vision-ready.** One JPEG with 12 frames sampled evenly from the first to the last second. Pass it straight to GPT-4o, Claude or Gemini.
- **Pay only for results.** You are charged once per successfully analyzed reel. Invalid links, private or deleted reels and failures are returned as free rows with a reason.
- **No login, no cookies, no proxies to configure.**

### Who it's for

- **Automation builders** (n8n, Make, Zapier) who build content research, competitor monitoring or repurposing workflows.
- **AI agent developers** who need a reliable "watch this reel" tool via Apify MCP or the API.
- **SMM agencies and creators** who break down reference reels: hooks, scripts and shot sequences.
- **RAG and LLM pipelines** that need structured text plus images from short-form video.

### Input

| Field | Type | Description |
|---|---|---|
| `reelUrls` | array of strings | Public Instagram Reel or video post links. **Up to 50 per run.** |

Accepted links: `instagram.com/reel/…`, `/reels/…`, `/p/…` (video posts), `/tv/…` and `instagram.com/username/reel/…`. Tracking parameters like `?igsh=` are removed automatically and duplicates are merged. Anything else (TikTok, YouTube, profiles, stories, other domains) is rejected and not charged.

```json
{
    "reelUrls": [
        "https://www.instagram.com/reel/Cp5514CB-s3/",
        "https://www.instagram.com/reel/ABC123xyz45/?igsh=abc"
    ]
}
```

### Output

One dataset row per input link. This example is from a real run; names, IDs and links are anonymized and the long text is shortened.

**A reel with speech:**

```json
{
    "inputUrl": "https://www.instagram.com/reel/ABC123xyz45/",
    "url": "https://www.instagram.com/reel/ABC123xyz45/",
    "shortcode": "ABC123xyz45",
    "status": "success",
    "username": "example_creator",
    "accountId": "1234567890",
    "displayName": "Example Creator",
    "postedAt": "2023-03-17",
    "durationSec": 88.56,
    "views": null,
    "likes": 75256,
    "comments": 1314,
    "caption": "The most spectacular butcher shop in the world. I dreamed about that steak last night… #butcher #butchershop #meatmarket",
    "speech": true,
    "audio": "speech",
    "transcript": "This is the fanciest butcher shop in the world. It is actually just a butcher shop, even though it looks more like a luxury boutique. They have a dry aging program…",
    "language": "English",
    "contactSheetUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/contact-sheet-ABC123xyz45?signature=<signature>",
    "contactSheetLayout": { "cols": 4, "rows": 3, "order": "left-to-right, top-to-bottom" },
    "missing": { "views": "Instagram does not expose play counts to logged-out requests" },
    "charged": true,
    "analyzedAt": "2026-11-07T08:02:30.877Z"
}
```

**A music-only reel** (no invented text):

```json
{
    "url": "https://www.instagram.com/reel/DEF456uvw78/",
    "status": "success",
    "username": "example_studio",
    "durationSec": 22.69,
    "likes": 21,
    "comments": 4,
    "caption": "POV: life starts to feel like stop motion…",
    "speech": false,
    "audio": "music_only",
    "transcript": "",
    "language": null,
    "contactSheetUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/contact-sheet-DEF456uvw78?signature=<signature>",
    "missing": { "views": "Instagram does not expose play counts to logged-out requests" },
    "charged": true
}
```

**A reel that could not be analyzed** (free):

```json
{
    "url": "https://www.instagram.com/reel/XXXXXXXXXXX/",
    "status": "failed",
    "error": "download_failed",
    "errorMessage": "Could not fetch this reel from Instagram. Try again later.",
    "charged": false
}
```

#### Fields

| Field | Description |
|---|---|
| `status` | `success`, `partial` (incomplete, free), `failed` (free) or `rejected` (invalid link, free) |
| `username`, `displayName`, `accountId` | The account that posted the reel |
| `postedAt` | Posting date, `YYYY-MM-DD` |
| `durationSec` | Exact length read from the video file |
| `likes`, `comments` | Engagement counts |
| `views` | Play count. Usually `null`; see FAQ |
| `caption` | Full caption with hashtags |
| `speech` | `true` if real human speech was detected, otherwise `false` |
| `audio` | `speech`, `music_only` or `no_audio` |
| `transcript` | Full speech-to-text in the original language. Empty when `speech` is `false` |
| `language` | Detected speech language |
| `contactSheetUrl` | Signed link to a JPEG with 12 frames (4×3 grid) covering the whole video |
| `missing` | For each empty field, the reason it could not be fetched |
| `charged` | `true` only for rows you paid for |
| `error`, `errorMessage` | Error code and a plain-English reason, on free rows |

### How to get Instagram reel transcripts (API, n8n, Make, MCP)

#### Apify API (any language)

For small batches (about 10 reels or fewer), run the Actor synchronously and get results in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/yely~instagram-reel-analyzer/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"reelUrls": ["https://www.instagram.com/reel/Cp5514CB-s3/"]}'
```

Synchronous calls wait up to 5 minutes. For bigger lists, start the run with `POST /v2/acts/yely~instagram-reel-analyzer/runs`, wait for it to finish (or use a webhook), then read `GET /v2/datasets/{defaultDatasetId}/items`.

#### n8n

1. Add the **Apify** node and connect your Apify account.
2. Choose **Run an Actor and get dataset items** (or **Run an Actor**, then **Get dataset items**).
3. Actor: `yely/instagram-reel-analyzer`. Input JSON: `{"reelUrls": ["{{ $json.reelUrl }}"]}`.
4. Each output item is one reel. Map `transcript`, `caption` and `contactSheetUrl` into your LLM node (for example OpenAI or Anthropic with an image input).

#### Make (Integromat)

1. Add the **Apify → Run an Actor** module and pick `yely/instagram-reel-analyzer`.
2. Set **Run synchronously** to *Yes* and the input to `{"reelUrls": ["<reel url>"]}`.
3. Add **Apify → Get Dataset Items** with the run's `defaultDatasetId` and iterate over the rows.

#### Zapier

Use the **Apify** app's **Run Actor** action with the same Actor and input. Then use **Fetch Dataset Items** to get the rows.

#### AI agents via Apify MCP

Add the Apify MCP server to Claude, Cursor or any MCP client and allow this Actor:

```
https://mcp.apify.com?tools=yely/instagram-reel-analyzer
```

The agent can then call the Actor with a list of reel URLs. It gets back the transcript plus the contact sheet link, which it can open as an image to "watch" the reel.

### Analyze Instagram reels with AI

Send the `transcript`, the `caption` and the `contactSheetUrl` to a vision model such as Claude, GPT or Gemini, with the contact sheet passed as an image. The model then sees what the reel says and what it shows, frame by frame, without you downloading the video. A prompt like this works well:

```
Look at the frames and the transcript. Tell me the hook in the first 3 seconds, the format, the CTA and why this reel worked.
```

### Pricing

**$0.02 per successfully analyzed reel.** No monthly fee.

100 reels cost $2, 1,000 reels cost $20.

- A reel is charged once, when its row is delivered with `status: "success"`.
- Rejected links, private, deleted or unavailable reels, failed downloads and incomplete analyses are **free**.
- Set **Max cost per run** in run options to cap spending. The Actor processes only as many reels as your budget allows and then stops.

### Limits

- **Up to 50 reels per run.** Split bigger lists into several runs.
- **Rate limits per Apify account:** 60 reels per hour and 200 per day on paid Apify plans, 30 per hour and 100 per day on the free plan. There is also an overall capacity limit shared by all users.
- **If a limit is reached, the run waits and continues** (up to 15 minutes in total, never past your run timeout). The log tells you when a reel is delayed. Reels that still can't get through come back as free `failed` rows with `error: "rate_limited"` and the time to try again.
- Only **public** reels and video posts. Stories, highlights, profiles and carousels of photos are not supported.
- Reels are processed two at a time. Typical speed is 5–30 seconds per reel.
- Very long videos may not get a transcript; the row then returns `status: "partial"` and is free.

### FAQ

**What happens with music-only reels?**
You get the caption, stats, duration and the 12-frame contact sheet, with `speech: false`, `audio: "music_only"` and an empty `transcript`. A voice-activity detector checks the audio before transcription. Filters then remove known Whisper hallucinations ("Thanks for watching", "Subtitles by…") and repeated lines. Reels without any audio track return `audio: "no_audio"`.

**Why is `views` often empty?**
Instagram does not show play counts to visitors who are not logged in, and this Actor never logs in to Instagram. That protects you and avoids account bans. When a value can't be fetched, the field is `null` and `missing.views` gives the reason. Likes, comments, duration and username are filled.

**Do I need an Instagram account, cookies or a proxy?**
No. Just paste public reel links.

**Which languages are transcribed?**
Speech is transcribed in its original language: English, Spanish, Portuguese, Russian, Ukrainian, German, French and many more. `language` tells you which one was detected.

**How do I feed the frames to an LLM?**
`contactSheetUrl` is a signed, direct JPEG link. Pass it as an image URL to any vision model. Frames read left to right, top to bottom, sampled evenly across the whole video.

**How do I get reel links from a profile?**
Use Apify's [Instagram Reel Scraper](https://apify.com/apify/instagram-reel-scraper) to collect reel URLs from a username, then pass them to this Actor.

**Is this legal?**
The Actor only reads publicly available content and does not log in. You are responsible for how you use the data, including copyright and personal-data rules where you operate.

# Actor input Schema

## `reelUrls` (type: `array`):

Public Instagram Reel or video post links, one per line, up to 50 per run. Accepted: instagram.com/reel/…, /reels/…, /p/…, /tv/… and instagram.com/username/reel/…. Tracking parameters such as ?igsh= are removed and duplicates are merged. Other links (TikTok, YouTube, profiles, stories) are rejected and never charged.

## Actor input object example

```json
{
  "reelUrls": [
    "https://www.instagram.com/reel/Cp5514CB-s3/"
  ]
}
```

# Actor output Schema

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

One row per input link: transcript, music-only flag, caption, stats, duration, username and contact sheet link.

## `contactSheets` (type: `string`):

12-frame JPEG per analyzed reel.

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

// Run the Actor and wait for it to finish
const run = await client.actor("yely/instagram-reel-analyzer").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 = { "reelUrls": ["https://www.instagram.com/reel/Cp5514CB-s3/"] }

# Run the Actor and wait for it to finish
run = client.actor("yely/instagram-reel-analyzer").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 '{
  "reelUrls": [
    "https://www.instagram.com/reel/Cp5514CB-s3/"
  ]
}' |
apify call yely/instagram-reel-analyzer --silent --output-dataset

```

## MCP server setup

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

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/JWp8xqKMT38lEshWT/builds/XDyH5i7roQMAo1blL/openapi.json
