# Instagram Reel Transcript - Speech to Text, Pay Per Reel (`megalodomnin/instagram-reel-transcript`) Actor

Give it a list of Instagram reels, get the spoken words out of each one. Punctuated, paragraphed, 30+ languages detected automatically. You pay only for reels that actually contain speech.

- **URL**: https://apify.com/megalodomnin/instagram-reel-transcript.md
- **Developed by:** [Evgeny Domnin](https://apify.com/megalodomnin) (community)
- **Categories:** Developer tools, Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 reel processeds

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

Give it a list of Instagram reels. Get back the spoken words out of each one: punctuated, split into paragraphs, with the language detected automatically.

**You are never charged for a reel we could not fetch.** On an ordinary list that is about one reel in four: private posts, deleted posts, and posts Instagram shows as a still image only. Those rows are written to your dataset so your list stays complete, and they cost you nothing.

### What you get

- **The transcript**, as one block of text and again as readable paragraphs.
- **Languages heard in each reel**, comma separated. A reel that switches between two languages reports both, because the model labels the switch rather than picking a winner.
- **Audio length and word count** on the same row, so you can spot a 3-second clip and a 3-minute monologue without opening either.
- **Confidence** from the model, so you can filter out the noisy ones.
- **A record of how the audio was reached**, which is the first thing you want when a row comes back empty.

### What it is for

- Content research: read a competitor's hooks instead of watching 200 reels.
- Repurposing: turn your own reels into captions, blog drafts or newsletter copy.
- Ad research: pull the script out of creatives that are working.
- Search: make a library of reels actually searchable by what is said in them.

### Input

Paste reel links, one per line. A `/reel/`, `/p/` or `/tv/` link all work, and so does a bare shortcode.

```json
{ "reels": ["https://www.instagram.com/reel/C8CaBfWs1mr/", "DKw2J6TMZd7"] }
```

The same reel shared in two different forms counts as one, so you are never charged twice for the same video.

**Upload a file** instead: `.txt` or `.csv`, one link per line. In a CSV the first column that looks like a reel is taken.

A link to a remote list works too: `{"reels": [{"requestsFromUrl": "https://example.com/reels.txt"}]}`.

The field can also be called `urls`, `startUrls`, `videos`, `links` or `url`.

#### Options

| Option | What it does |
|---|---|
| `language` | Leave as `multi` to detect and switch languages automatically, which is what reels need. Set a code (`en`, `es`, `de`, `fr`, `pt`, `hi`) only when the whole list is in one language. |
| `maxConcurrency` | Leave empty. The Actor takes 4 per CPU core, and Apify gives one core per 4 GB of run memory. |

### Output

One row per reel.

```json
{
  "input": "https://www.instagram.com/reel/C8CaBfWs1mr/",
  "url": "https://www.instagram.com/reel/C8CaBfWs1mr/",
  "shortcode": "C8CaBfWs1mr",
  "status": "ok",
  "transcript": "When the game you love loves you back, that is priceless.",
  "transcriptFormatted": "When the game you love loves you back,\n\nthat is priceless.",
  "wordCount": 11,
  "durationSeconds": 41.3,
  "language": "es, en",
  "confidence": 0.98,
  "meta": { "fetchedAt": "2026-09-20T09:12:03.114Z", "source": "deepgram-nova-3", "method": "url", "durationMs": 4820 }
}
```

`status` is `ok`, `no-speech` or `unavailable`.

| Status | What it means | Charged |
|---|---|---|
| `ok` | Speech was found and transcribed. | yes |
| `no-speech` | The audio was fetched and processed, and there are no words in it. A music-only reel is the usual case. | yes |
| `unavailable` | The reel could not be reached at all: private, deleted, or Instagram shows only a still image for it. | **no** |

**Why `no-speech` is charged.** You cannot know in advance whether a reel has anyone speaking in it - that is part of what you are asking. "Nobody speaks in this one" is an answer, and it costs exactly as much to produce as a transcript: ninety seconds of music is ninety seconds of audio. What you are never charged for is a reel we could not get, because then we have no answer for you at all.

### Notes

- **Not every reel can be reached, and you are not charged for the ones that cannot.** Measured on 29 reels across two samples: the 14 most-viewed reels on Instagram, and 15 ordinary ones taken from recipe, fitness and tutorial posts. **23 of 29 returned video.** The rest show a still image only, which is what Instagram does for private posts, deleted posts and some music posts. On the ordinary sample, of 15 reels submitted: 10 came back with a transcript, 1 was music with no speech, 4 could not be reached. **You paid for 11 of the 15.**
- **A reel with no speech is not a failure.** Plenty of reels are music and captions. You get a row saying so, with the audio length on it, so you can tell a silent reel from one we never reached.
- **Length varies a lot, and it does not change your price.** Across the ordinary sample the median reel ran 60 seconds and the longest 125. You pay per reel, not per minute.
- **Transcripts are a model's best guess.** Slang, names and crosstalk are where they go wrong. `confidence` is on every row for exactly that reason.

# Actor input Schema

## `reels` (type: `array`):

Instagram reel links, one per line. A /reel/, /p/ or /tv/ link works, and so does a bare shortcode.

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

Leave as multi to detect and switch languages automatically, which is what reels need. Set a specific code (en, es, de, fr, pt, hi) only when the whole list is in one language.

## `maxConcurrency` (type: `integer`):

Leave empty. The Actor takes 4 per CPU core, and Apify gives one core per 4 GB of run memory.

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

Same as Reels. Accepted so you do not have to guess the field name.

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

Same as Reels. Accepted so you do not have to guess the field name.

## `videos` (type: `array`):

Same as Reels. Accepted so you do not have to guess the field name.

## `links` (type: `array`):

Same as Reels. Accepted so you do not have to guess the field name.

## `url` (type: `string`):

A single reel, for a quick one-off check.

## `reelsFile` (type: `array`):

Upload a .txt or .csv with one reel link per line, or point at a file already in a key-value store. In a CSV the first column that looks like a reel is taken.

## Actor input object example

```json
{
  "reels": [
    "https://www.instagram.com/reel/C8CaBfWs1mr/"
  ],
  "language": "multi"
}
```

# Actor output Schema

## `table` (type: `string`):

One row per reel, ready to open in Excel or Google Sheets.

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

Every field, including the paragraphed transcript and how the audio was reached.

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

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,megalodomnin/instagram-reel-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/a4QqNGc5yvMammAEb/builds/64v02TymfVjawwXXQ/openapi.json
