# Instagram Reels Transcript — Reel to Text + Stats (`sumitr_mardy/instagram-reels-transcript`) Actor

Transcribe Instagram Reels from their URLs with Whisper: spoken text, timestamps, SRT, 99 languages, plus caption, views, likes, comments and creator. One flat row per reel, never null. Only reels with speech are billed.

- **URL**: https://apify.com/sumitr_mardy/instagram-reels-transcript.md
- **Developed by:** [Sumitr Mardy](https://apify.com/sumitr_mardy) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 reel transcript (fast)s

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/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 Reels Transcript — Reel to Text + Stats

Give it Instagram reel links, get back what is said in each reel as text, with timestamps, optional SRT/VTT subtitles and the spoken language, plus the reel's caption, views, likes, comments, audio track and creator. One flat row per reel, every field always present, never `null`. Built for content research, repurposing and AI agents.

**$10 per 1,000 reels (fast) or $20 (accurate), less on higher Apify plans. Photo posts, music-only reels, reels without speech and failures are free.**

### Why this one

- **Pay only for reels with speech.** Reels set to a licensed song are detected from Instagram's own audio attribution and skipped before any download (free, and you can turn the skip off). Reels where Whisper hears no speech are free too.
- **Transcript and stats in one row.** Views, likes, comments, caption, creator, follower count and the audio track come with every transcript, no second actor needed.
- **One row for every URL.** A deleted post, a photo post or a profile link instead of a reel still comes back as a row with a machine-readable `subStatus`.
- **Two quality tiers.** `fast` (Whisper base) for clear talking-head reels, `accurate` (Whisper small) for names, slang, accents and speech over music.
- **Measured on Apify:** a 9-second reel in 2.6 s, a 71-second NASA reel in under 8 s; a Nike reel detected as Spanish automatically. No proxy is needed to read public reels, so there is no proxy cost hidden in the price.

### Input

| Field | Default | What it does |
|---|---|---|
| `urls` | — | Reel or post links (`instagram.com/reel/…`, `/p/…`, `/tv/…`) or bare shortcodes. Required. Profile links are not supported yet. |
| `quality` | `fast` | `fast` = Whisper base. `accurate` = Whisper small. |
| `language` | auto | ISO code (`en`, `es`, `pt`, `hi`…). Helps on very short reels. |
| `skipMusicOnly` | `true` | Skip reels whose audio is a licensed song (free). Turn off for lyrics or voice-over on music. |
| `includeSegments` | `true` | `segments[]` with start/end seconds per phrase. |
| `includeSubtitles` | `false` | `srt` and `vtt` subtitle text. |
| `maxMinutesPerVideo` | `10` | Caps long video posts (max 30). |

```json
{
  "urls": ["https://www.instagram.com/p/DS46KJNjva9/", "https://www.instagram.com/reel/Da_ZgEaPvCN/"],
  "quality": "fast"
}
```

### Output

One row per URL, in completion order. A real row (shortened):

```json
{
  "inputIndex": 0,
  "url": "https://www.instagram.com/p/DS46KJNjva9/",
  "shortcode": "DS46KJNjva9",
  "status": "ok",
  "subStatus": "complete",
  "error": "",
  "text": "One of my favorite quotes from Zig Ziglar is, you don't have to be great to start, but you have to start to be great.",
  "charCount": 117, "wordCount": 25,
  "language": "en", "languageProbability": 0.984,
  "segments": [{ "start": 0, "end": 2.8, "text": "One of my favorite quotes from Zig Ziglar is," }],
  "srt": "", "vtt": "",
  "videoDurationSeconds": 8.81, "transcribedSeconds": 8.8, "billedUnits": 1,
  "quality": "fast", "model": "base",
  "caption": "2026 mindset ✨ It’s simple really. You’ll never become great at something you don’t try…",
  "ownerUsername": "jayshetty", "ownerVerified": true, "ownerFollowers": 18908765,
  "viewCount": 440217, "likeCount": 50879, "commentCount": 342,
  "productType": "clips", "isVideo": true,
  "musicArtist": "jayshetty", "musicSong": "Original audio", "usesOriginalAudio": true,
  "thumbnailUrl": "https://scontent…cdninstagram.com/…jpg",
  "videoUrl": "https://scontent…cdninstagram.com/…mp4",
  "notes": [],
  "processingMs": 2631
}
```

Strings are `""` when absent, numbers `0`, arrays `[]`. No field is ever `null` or missing. Stats are as Instagram shows them at scrape time; `videoUrl` and `thumbnailUrl` are signed CDN links that expire within hours.

#### Status

| `status` | `subStatus` | Charged |
|---|---|---|
| `ok` | `complete`, or `truncated` (video longer than `maxMinutesPerVideo`) | `billedUnits` |
| `no_speech` | `music_only_skipped` (licensed song), `no_speech_detected` | free |
| `no_video` | `not_a_video`: a photo or carousel post; metadata is still returned | free |
| `failed` | `invalid_url` (e.g. a profile link), `not_found` (deleted/private), `no_post_data`, `blocked`, `network_error`, `download_error`, `download_timeout`, `too_large`, `corrupt_media`, `no_audio_track`, `empty_audio`, `cost_limit_reached`, `free_work_limit`, `transcription_error` | free |

### Pricing

| Event | Price | When |
|---|---|---|
| `reel-transcript` | $0.010 (free plan), $0.009 Bronze, $0.008 Silver, $0.007 Gold | `quality: "fast"`, a reel with speech |
| `reel-transcript-accurate` | $0.020 (free plan), $0.018 Bronze, $0.016 Silver, $0.014 Gold | `quality: "accurate"` |

One event per reel, or per started 3 minutes for longer video posts (`billedUnits`). The only other charge is a start fee of $0.0005 per GB per run ($0.002 at the default 4 GB). No platform usage on top.

### Fair use

Free rows cost compute, so a run that spends its budget on reels that fail or have no speech stops starting new ones; the rest come back `free_work_limit`, uncharged. Up to 5,000 URLs per run.

### What it does not do (yet)

- **No profile scraping.** Give reel links, not `@handles`; listing a profile's reels needs a logged-in session, which this actor does not use.
- **Public posts only.** Private, age-restricted and deleted posts fail as `not_found`.
- **Speech over loud music** can trip the fast tier (repeated or misheard phrases). Use `accurate` for music-heavy reels.
- **No on-screen text (OCR)** and no speaker labels.

### Use it from AI agents (MCP)

This Actor is a tool on the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), so Claude, Cursor, VS Code or any MCP client can call it to read what a reel says. Load only this tool: a short tool list keeps the agent from picking the wrong one.

**Recommended: hosted server, OAuth sign-in (nothing secret on disk).**

```json
{
  "mcpServers": {
    "instagram-reels-transcript": {
      "url": "https://mcp.apify.com?tools=sumitr_mardy/instagram-reels-transcript"
    }
  }
}
```

**With an API token instead:**

```json
{
  "mcpServers": {
    "instagram-reels-transcript": {
      "url": "https://mcp.apify.com?tools=sumitr_mardy/instagram-reels-transcript",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

**Local server (stdio):**

```json
{
  "mcpServers": {
    "instagram-reels-transcript": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server@latest", "--tools", "sumitr_mardy/instagram-reels-transcript"],
      "env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }
    }
  }
}
```

The hosted server also gives the agent this Actor's output schema. Get a token at [Apify Console → API & Integrations](https://console.apify.com/settings/integrations), and never commit it.

**Tips for agents:**

- *"What is this reel about?"*: pass the link, read `text` and `caption` together.
- *"Which hooks work?"*: compare the first `segments` of reels against `viewCount`.
- Check `status` first: `no_speech` with `music_only_skipped` means the reel is set to a song.
- A few reels finish well inside the MCP `call-actor` 45-second wait.

### Use it from code

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("sumitr_mardy/instagram-reels-transcript").call(run_input={
    "urls": ["https://www.instagram.com/p/DS46KJNjva9/"],
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["ownerUsername"], row["viewCount"], row["status"], row["text"][:100])
```

```bash
curl -X POST "https://api.apify.com/v2/acts/sumitr_mardy~instagram-reels-transcript/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.instagram.com/p/DS46KJNjva9/"]}'
```

This actor is not affiliated with or endorsed by Instagram or Meta.

# Actor input Schema

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

Public Instagram reel/post links (instagram.com/reel/…, /p/…, /tv/…) or bare shortcodes, one per item. Profile links are not supported yet: give the reel links.

## `quality` (type: `string`):

fast = Whisper base, good for clear speech. accurate = Whisper small: better with names, slang, accents and background music.

## `language` (type: `string`):

ISO 639-1 code of the spoken language ("en", "es", "pt", "hi"…). Empty = detect per reel. Setting it helps on very short reels.

## `skipMusicOnly` (type: `boolean`):

Reels whose audio is a licensed song (not the creator's original audio) usually have no speech to transcribe. Skipped reels come back with status no_speech and are free. Turn off to transcribe them anyway (lyrics, voice-over on music).

## `includeSegments` (type: `boolean`):

Add segments\[]: each phrase with start and end time in seconds.

## `includeSubtitles` (type: `boolean`):

Add srt and vtt fields with ready-to-use subtitles.

## `maxMinutesPerVideo` (type: `integer`):

Transcribe at most this many minutes of each video. Reels are under 3 minutes; this caps long video posts.

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/p/DS46KJNjva9/"
  ],
  "quality": "fast",
  "language": "",
  "skipMusicOnly": true,
  "includeSegments": true,
  "includeSubtitles": false,
  "maxMinutesPerVideo": 10
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("sumitr_mardy/instagram-reels-transcript").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/p/DS46KJNjva9/"] }

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

```

## MCP server setup

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

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/RpdjQiYz6FPXOng7T/builds/UWAFqDRNxYNSXzheP/openapi.json
