# Instagram Reel Transcript Generator & API: Reels to Text (`s_actors/instagram-reel-transcript`) Actor

Turn Instagram Reels and videos into text: links or whole profiles (every Reel, date range, only new since the last run). AI transcript in 99 languages, hook, timed segments, SRT and VTT subtitles, plays and likes. Music-only Reels free. No login.

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

## Pricing

from $11.99 / 1,000 transcript, per minute of videos

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 Reel Transcript Generator & API: Reels to Text

Turn **Instagram Reels and videos into text**: paste Reel links, or add **whole profiles** (every Reel, a date range, or only the new ones since your last run). For each Reel you get the **full transcript**, the **hook** (the words of the first 3 seconds), the language, **timed segments** and ready **SRT and VTT subtitles**, next to its caption, date, plays and likes. Speech is recognized by AI (Whisper) in **99 languages**, detected for every video. **Music-only Reels are free.**

```json
{ "postUrls": ["https://www.instagram.com/reel/DZ-dSUgSRiy/"], "profiles": ["garyvee"], "maxReelsPerProfile": 10 }
```

No Instagram login, no cookies, no sign-up on a transcript website. Use it as an **Instagram transcript API**: one call returns clean JSON for a list of Reels or a whole creator.

#### What you get

One row per Reel or video. Real example, October 2026:

| ownerUsername | hook | language | wordCount | durationSeconds | billedMinutes |
|---|---|---|---|---|---|
| zachking | This is a message to all artificial intelligence. | en | 50 | 27.9 | 1 |
| garyvee | How can I keep my daughter, nine years old, away from this danger from the internet? | en | 205 | 67.3 | 2 |
| natgeo (profile) | Hey Nat Geo, nightmare scenario. You get swallowed by a sperm whale, now what? | en | 432 | 136.2 | 3 |
| luisitocomunica (profile) | Traten de seguirme. | es | 98 | 48.6 | 1 |
| natgeo | *(music only: free row with the reason)* | | 0 | 58.3 | 0 |

| Field | Description |
|---|---|
| `transcript` | The spoken words as one text |
| `hook` | The words of the first 3 seconds: the opening line that keeps viewers watching |
| `segments` | `[{start, end, text}]` with seconds, for quotes, clips and search inside a video |
| `subtitlesSrt`, `subtitlesVtt` | Ready subtitles to upload to a video editor, YouTube or a player |
| `srtFileUrl`, `vttFileUrl`, `txtFileUrl` | Download links of the same as files (with **Save files**) |
| `language`, `languageName` | Detected (or chosen) spoken language: `en` / English |
| `wordCount`, `segmentCount`, `speechSeconds` | How much is said, and for how long |
| `durationSeconds`, `billedMinutes` | Video length and the minutes charged |
| `transcriptionModel` | The Whisper model that wrote the text |
| `postUrl`, `shortcode`, `type` | Link, shortcode, `reel` / `video` / `carousel` |
| `caption`, `hashtags`, `postedAt` | Caption, hashtags, exact posting time (UTC) |
| `plays`, `likes`, `comments` | Plays (Reels from profiles), likes and comments as Instagram shows them |
| `audioTitle` | The song or original audio of the Reel |
| `ownerUsername`, `ownerFullName`, `ownerVerified` | The account that posted it |
| `hasTranscript`, `noTranscriptReason` | `false` with the reason when a Reel has no speech, no sound or is a photo post (free) |
| `input`, `inputProfile`, `position`, `scrapedAt`, `error` | Which input the row came from; why a post was not read |

#### How it works

1. Add **links** (`instagram.com/reel/...`, `instagram.com/p/...`, `/tv/...`, shortcodes) and / or **profiles** (`garyvee`, `@garyvee`, `instagram.com/garyvee/`, user IDs)
2. Run: each video's sound is turned into text by AI
3. Open the **Transcripts** view, export to CSV / Excel / JSON, or download `.srt` / `.txt` files

| Input | What it does |
|---|---|
| **Instagram Reel or video links** | Reels, video posts, IGTV and the first video of a carousel |
| **Instagram profiles** | The Reels of each profile, newest first |
| **Reels per profile** | Latest N Reels of each profile (default 10, `0` = the whole Reels tab) |
| **Posted after / before** | Only Reels from a date range: `2026-09-01` or `7 days`, `2 weeks`, `1 month` |
| **Skip pinned Reels** | Leave out the old Reels pinned to the top |
| **Only new Reels since the previous run** | Skip what earlier runs already transcribed: schedule it to follow creators |
| **Spoken language** | Empty = detected per video. Set `en`, `es`, `hi`... only if detection picks the wrong one |
| **Max video length** | Longer videos are skipped for free (default 20 minutes) |
| **Timed segments / SRT and VTT / Save files** | What goes into each row, and `.srt` `.vtt` `.txt` files in your storage |

#### Why this Actor

| | |
|---|---|
| 🎯 **Only speech is charged** | A voice detector runs first: music-only Reels, silent videos and photo posts get a free row with the reason, and AI never invents words over a song |
| 👤 **Whole profiles** | Every Reel of a creator, a date range, or only the new ones since the last run, with plays and likes next to each transcript |
| 🪝 **Hook + segments + subtitles** | The opening line for content research, timestamps for quotes, SRT and VTT ready for editors |
| 🌍 **99 languages** | Whisper detects the language of each video: English, Spanish, Hindi, Portuguese, Arabic and more in one run |
| 💰 **Pay per minute, not per subscription** | $0.01499 per started minute of a Reel with speech; most Reels are under one minute |

#### Follow creators automatically

1. Add the profiles you watch (competitors, clients, your own account)
2. Turn on **Only new Reels since the previous run**
3. Save as a task with a daily schedule: each run transcribes only the Reels posted since, ready for a Google Sheet, Slack or an AI summary through an integration

The list of transcribed Reels is kept per profile and monitor name in your account (key-value store `instagram-transcript-state`).

#### Pricing

Pay per started minute of video with speech, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Transcript, per started minute of video (a 45-second Reel = 1 minute) | $0.01499 | $0.01349 | $0.01199 |
| New profile lookup (only when Instagram shows a new profile's page to a residential IP only) | $0.004 | $0.004 | $0.004 |

| Task | Cost |
|---|---|
| 10 Reels under a minute | ~$0.15 |
| 1,000 Reels under a minute | ~$14.99 |
| Following a creator who posts 2 Reels a day, for a month | ~$0.90 per month |

Reels without speech, photo posts, posts that are not found and videos over the length limit are not charged.

#### Ready-made tasks

Open it, change the link, and run:

| Task | What you get |
|---|---|
| [Instagram Video to Text Converter: Reel Link to Transcript](https://apify.com/s_actors/instagram-reel-transcript/examples/instagram-video-to-text-converter) | Transcripts, hooks and SRT files of the Reels you paste |

#### FAQ

**How accurate is the transcript?** It is written by OpenAI's Whisper speech recognition (large-v3-turbo; the smaller Whisper model at peak load). Clear speech comes out nearly word for word with punctuation; names, slang and heavy background music can be misheard. Check `transcriptionModel` in each row.

**Does it read the text on screen or song lyrics?** No: only spoken words. A Reel with just music gets `hasTranscript: false` and is free.

**Which languages are supported?** The 99 languages of Whisper; the language is detected for each video. If a video is mostly music with a few words, detection can pick the wrong language: set **Spoken language** to fix it.

**Can I transcribe all Reels of an Instagram profile?** Yes: add the username and set **Reels per profile** to `0`. Private accounts cannot be read.

**How are minutes counted?** By the video's length, rounded up: a 45-second Reel is 1 minute, a 70-second one is 2. Only videos with speech are charged.

**Do I need an Instagram account or cookies?** No. The Actor reads public posts the way Instagram shows them to a visitor.

**I need the video files, not the text.** Use Instagram Video Downloader for MP4 files in 1080p and one ZIP.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Transcribe the last 10 Reels of @garyvee and list their hooks".

#### Other social media tools

| Tool | What it does |
|---|---|
| [Instagram Post Scraper](https://apify.com/s_actors/instagram-post-scraper) | Any post, Reel or carousel by link with the exact posting time, likes, comments and plays |
| [Instagram Trending Audio](https://apify.com/s_actors/instagram-trending-audio) | Reels sounds trending right now in any country, with Reels counts and daily growth |
| [TikTok Transcript Scraper](https://apify.com/s_actors/tiktok-transcript-scraper) | TikTok subtitles and AI transcripts from links or profiles, SRT and VTT |
| [YouTube Transcript Scraper](https://apify.com/s_actors/youtube-transcript-scraper) | YouTube captions of videos, channels and playlists in any language |

#### Is it legal?

The Actor reads only public posts that Instagram shows to any visitor, without logging in. Transcripts are the creators' words: use them for research, accessibility, analysis or quotes in line with copyright law, and handle personal data such as usernames in line with GDPR and other privacy laws.

# Actor input Schema

## `postUrls` (type: `array`):

One per line: Reel links (instagram.com/reel/...), video post links (instagram.com/p/...), IGTV links (/tv/...), shortcodes (DZ-dSUgSRiy) or numeric media IDs. Public posts only. In a carousel the first video is transcribed.

## `profiles` (type: `array`):

Usernames (garyvee or @garyvee), profile links (https://www.instagram.com/garyvee/ or .../garyvee/reels/) or numeric user IDs, one per line: transcribes the Reels of each profile, newest first. Public profiles only.

## `maxReelsPerProfile` (type: `integer`):

How many of the newest Reels of each profile to transcribe (pinned Reels come first, as in the app). 0 = the whole Reels tab.

## `postedAfter` (type: `string`):

Only Reels posted after this: a date (2026-09-01) or a period (24 hours, 7 days, 2 weeks, 1 month). Profiles only. Reading stops at the first older Reel, so a short period is fast.

## `postedBefore` (type: `string`):

Only Reels posted before this: a date (2026-10-01) or a period (30 days). Profiles only.

## `skipPinned` (type: `boolean`):

Leave out the Reels pinned to the top of the profile (they are often old).

## `onlyNew` (type: `boolean`):

For profiles: skip the Reels that earlier runs with this option already transcribed (remembered per profile and monitor name in your key-value store instagram-transcript-state). Schedule the run daily to get every new Reel of a creator as text.

## `monitorName` (type: `string`):

Separate memory for separate schedules (for example 'competitors' and 'clients'). Empty = default.

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

Leave empty to detect the language of every video (recommended for mixed accounts). Set a two-letter code (en, es, pt, hi, de, fr...) only when all videos are in one language and detection picks the wrong one.

## `maxVideoMinutes` (type: `integer`):

Longer videos are skipped (free row with the reason), so one long video cannot eat your budget. Reels are at most 3 minutes; longer videos are video posts.

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

Add the transcript as segments with start and end seconds (segments column).

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

Add ready subtitles as SRT and WebVTT text (subtitlesSrt, subtitlesVtt columns).

## `saveFiles` (type: `boolean`):

Also save every transcript as .srt, .vtt and .txt files in the run's key-value store, with download links in the row (srtFileUrl, vttFileUrl, txtFileUrl).

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

How many Instagram requests run at the same time. Videos are transcribed at most 3 at a time.

## `debugLog` (type: `boolean`):

Log every retried request (for troubleshooting).

## Actor input object example

```json
{
  "postUrls": [
    "https://www.instagram.com/reel/DZ-dSUgSRiy/",
    "https://www.instagram.com/reel/CfY6jCIgH-P/"
  ],
  "maxReelsPerProfile": 10,
  "skipPinned": false,
  "onlyNew": false,
  "maxVideoMinutes": 20,
  "includeSegments": true,
  "includeSubtitles": true,
  "saveFiles": false,
  "maxConcurrency": 5,
  "debugLog": false
}
```

# Actor output Schema

## `transcripts` (type: `string`):

Transcript, hook, language and word count of every Reel.

## `details` (type: `string`):

Caption, date, plays, likes, comments and sound of every Reel with its transcript.

## `subtitles` (type: `string`):

SRT and VTT subtitles and file links of every transcript.

## `files` (type: `string`):

The .srt, .vtt and .txt files (with "Save files" on).

## `all` (type: `string`):

Every field of every row, segments included.

# 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 = {
    "postUrls": [
        "https://www.instagram.com/reel/DZ-dSUgSRiy/",
        "https://www.instagram.com/reel/CfY6jCIgH-P/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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 = { "postUrls": [
        "https://www.instagram.com/reel/DZ-dSUgSRiy/",
        "https://www.instagram.com/reel/CfY6jCIgH-P/",
    ] }

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

```

## MCP server setup

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