# Instagram Reels Transcript & On-Screen Text (`iturrilabs/reels-transcript`) Actor

Turn public Instagram reels into transcripts, timestamped segments and on-screen text in one pass. Works with reel links, usernames or a scraper dataset, and with music-only reels. Failed reels are never charged.

- **URL**: https://apify.com/iturrilabs/reels-transcript.md
- **Developed by:** [IturriLabs](https://apify.com/iturrilabs) (community)
- **Categories:** Social media, AI
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 reel transcribeds

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 Reels Transcript & On-Screen Text

Turn public Instagram reels into text you can search, quote, and reuse. Each reel comes back with its exact transcript, timestamped sentences, the text shown on screen, and the opening hook, from one pass over the video.

### What you get

- **Transcript:** every spoken word in the reel's original language, never translated.
- **Timestamped segments:** the transcript split into sentences with start and end times.
- **On-screen text:** titles, lists, and labels shown in the video, with the second each one appears. Captions that only repeat the speech are left out.
- **Music-only reels work too:** when nobody speaks, you still get the on-screen text, and `hasSpeech` is `false`.
- **Hook and summary:** the opening line of the first 3 seconds and a one-sentence description.
- **Reel data:** account, date, duration, views, likes, comments, caption, hashtags, and music.

### Who it is for

Content creators, social media managers, agencies, and researchers who study what reels say, plus AI agents that need reels as text.

### How to use it

1. Add reel links, usernames, or both. Each username gives you its newest reels.
2. Set **Maximum reels to transcribe** to control spending.
3. Run it and export the results to JSON, CSV, or Excel, or use them through the API.

Already scraped reels? Pass the dataset ID from `apify/instagram-reel-scraper` or `apify/instagram-scraper` in **Dataset ID** and nothing is scraped again. Instagram video links expire after a few days, so use recent datasets.

### Input example

```json
{
  "reelUrls": ["https://www.instagram.com/reel/DfP5dwQgFh7/"],
  "usernames": ["natgeo"],
  "reelsPerProfile": 5,
  "maxReels": 20
}
```

### Output example

Shortened result from a real run:

```json
{
  "status": "transcribed",
  "reelUrl": "https://www.instagram.com/reel/DfP5dwQgFh7/",
  "ownerUsername": "iturrilabs",
  "postedAt": "2026-11-02T17:59:06.000Z",
  "durationSeconds": 33.1,
  "music": "Original audio",
  "language": "en",
  "hasSpeech": true,
  "hook": "This 49-second ad just became a creative brief.",
  "transcript": "This 49-second ad just became a creative brief. Usually you'd pause, rewind, and type it out. So I ran it through Meta Ad Creative Analyzer...",
  "onScreenText": ["THIS 49-SECOND AD", "META AD CREATIVE ANALYZER", "HOOK", "Cutting with a SWEET TOOTH?"],
  "summary": "This video demonstrates how the Meta Ad Creative Analyzer tool extracts hooks, angles, offers, and CTAs from competitor ads.",
  "segments": [
    {"start_seconds": 0, "end_seconds": 3, "text": "This 49-second ad just became a creative brief."},
    {"start_seconds": 3, "end_seconds": 6, "text": "Usually you'd pause, rewind, and type it out."}
  ],
  "onScreenTimeline": [
    {"start_seconds": 0, "text": "THIS 49-SECOND AD"},
    {"start_seconds": 7, "text": "META AD CREATIVE ANALYZER"}
  ],
  "error": null
}
```

Each record has a `status`: `transcribed`, `not_found`, `video_unavailable`, `too_long`, `too_large`, `invalid_input`, or `failed`. Only `transcribed` reels are charged. A `SUMMARY` record in the run's key-value store counts the results.

### Pricing

You pay $0.01 per transcribed reel. Reels that are missing, private, too long, or fail are not charged.

When you add reel links or usernames, the reels are fetched with `apify/instagram-reel-scraper`, which is billed separately at its own price (on the free plan, $0.0026 per reel plus $0.001 per run when this page was written). Passing a dataset ID skips that step and its cost.

Set a maximum cost per run to control spending.

### Limits

- Only public reels are processed. Private accounts, stories, and photos are skipped.
- Reels longer than 3 minutes or larger than 18 MB are skipped and not charged.
- Transcripts are AI-generated and can contain mistakes, especially with strong background music, overlapping voices, or very small text.
- Timestamps are approximate, to about a second.

# Actor input Schema

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

Links to public Instagram reels or video posts.

## `usernames` (type: `array`):

Transcribe the newest reels of these public accounts.

## `reelsPerProfile` (type: `integer`):

How many of the newest reels to take from each account.

## `inputDatasetId` (type: `string`):

Transcribe reels you already scraped. Works with datasets from apify/instagram-reel-scraper and apify/instagram-scraper. Video links expire after a few days.

## `maxReels` (type: `integer`):

Maximum number of reels to transcribe and charge for in this run.

## `concurrency` (type: `integer`):

How many reels to transcribe at the same time.

## Actor input object example

```json
{
  "reelUrls": [
    "https://www.instagram.com/reel/DfP5dwQgFh7/"
  ],
  "reelsPerProfile": 10,
  "maxReels": 1,
  "concurrency": 4
}
```

# Actor output Schema

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

Transcript, timestamped segments, on-screen text, hook and reel metadata.

## `summary` (type: `string`):

Totals by result.

# 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/DfP5dwQgFh7/"
    ],
    "maxReels": 1
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,iturrilabs/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/ZgbJpZAwGPP7CPUN1/builds/9mdN7Y4ggkuMziBP0/openapi.json
