# Instagram Reels Transcript - Video to Text and SRT/VTT (`tidytools/instagram-reels-transcript`) Actor

Public Instagram Reel speech to text. Private, login-only and speech-free reels are free. $0.006/min.

- **URL**: https://apify.com/tidytools/instagram-reels-transcript.md
- **Developed by:** [Yukai Lin](https://apify.com/tidytools) (community)
- **Categories:** AI, Videos, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.80 / 1,000 audio minutes

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 — video to text with timestamps

### What does Instagram Reels Transcript do?

Paste an individual **public Instagram Reel URL** with speech. Each video yields one row with `text`, timed `segments`, `language` and `billedMinutes`. Optional subtitle links are `srtUrl` and `vttUrl`. Private or login-only videos return free failure rows. A Reel with Instagram library music and no speech returns a free `no_text` row. Successful transcription is **$0.006 per started audio minute** on Free/Bronze; the deployed engine price applies on other tiers.

### How to use

1. Click **Start** with the single prefilled public example, or replace it with your own individual Instagram Reel URL. Public player access may change; the example still needs integration QA.
2. Set Apify's maximum cost per run before a large batch. Read `text`, `segments`, `language`, `billedMinutes`, and optional `srtUrl` or `vttUrl`.
3. Select SRT or VTT under **Output formats** if needed. Speaker labels, translated subtitles, and summaries are off by default; enabling them can add charges.

### Input example

```json
{
  "urls": [
    "https://www.instagram.com/reel/C-YpOOwvJME/"
  ]
}
```

### Output example

Illustrative output shape; the words below are not a verified transcript of the example:

```json
{
  "url": "https://www.instagram.com/reel/C-YpOOwvJME/",
  "success": true,
  "charged": true,
  "language": "en",
  "durationSeconds": 25,
  "billedMinutes": 1,
  "text": "Example spoken words.",
  "segments": [
    {
      "start": 0,
      "end": 2.5,
      "text": "Example spoken words."
    }
  ]
}
```

### Pricing

A successful transcript emits one `audio-minute` event per started minute of audio. The Free/Bronze price is $0.006 per minute. Private, login-only, removed, inaccessible, silent and invalid links return `success: false`, `charged: false`, `errorType` and `error` (and `billedMinutes: 0` when present) with **zero audio-minute events**. Other optional features may have separate charges.

### Limitations

Instagram can change public-player access. Profiles and all videos from an account are not supported. A Reel containing only licensed music and no speech returns a free no_text row. The shared audio engine may recognize other media URLs, but this specialist listing is for individual Instagram Reel links. No cookies or private content are used. A reachable page does not guarantee downloadable media. A public interview Reel was linked by a [2026 science communication paper](https://jcom.sissa.it/article/pubid/JCOM_2506_2026_A08/) and its embed page was anonymously reachable on 2026-10-26. This Actor has not yet transcribed it with the real backend.

### FAQ

#### Can I transcribe a private video or an entire Instagram profile?

No. Paste individual public video URLs; inaccessible videos return a free error row. Instagram profiles are not expanded into all their videos.

#### Are failures charged?

No. Failed rows have `charged: false` and zero `audio-minute` events.

#### Can I export subtitles?

Yes. Timed successful transcripts can include SRT and VTT files in `srtUrl` and `vttUrl`.

# Actor input Schema

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

Paste public Instagram Reels video links with speech, one per line. Private, removed, login-only or inaccessible videos return free failure rows. Individual videos only; no entire profiles.

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

ISO 639-1 code such as en, es, de, ja or zh (names such as English also work). Leave empty to detect automatically. YouTube links are always transcribed in the spoken language; when it differs from this, the row says so in languageNote.

## `saveSubtitles` (type: `boolean`):

Save subtitle files for every timed transcript (no extra charge). Use outputFormats to choose SRT, VTT, or both; turn this off to save neither.

## `outputFormats` (type: `array`):

Enter srt and/or vtt, one per line. Omit to keep the default of both; \["srt"] saves only SRT and \["vtt"] only VTT. An empty list or a list without either format saves no original-language subtitle file. The transcript row and its charges are unchanged. saveSubtitles:false turns both off.

## `saveTranscriptFiles` (type: `boolean`):

Also save a plain-text (.txt) and a Markdown (.md) transcript for every file, linked as txtUrl and mdUrl, plus one combined file for the whole run when there are 2 or more transcripts (no extra charge).

## `speakerLabels` (type: `boolean`):

Label each segment and paragraph with Speaker 1, Speaker 2… and count the speakers. Uses Deepgram nova-3 instead of Whisper and is billed as "audio minute with speaker labels" ($0.015/min) instead of the regular audio minute. Some languages (e.g. Chinese) are not available; those files fail with errorType "unsupported" and are not charged. Not available for YouTube links (free "unsupported" row).

## `subtitleLanguages` (type: `array`):

Also make SRT + VTT subtitles in these languages (up to 5), e.g. Spanish, German, Traditional Chinese, ja. Timings and speaker labels are kept. $0.002 per audio minute per language, charged only for languages that succeed.

## `summarize` (type: `boolean`):

Add a short summary and timestamped chapters to each transcript. Charged as a separate event per file (see Pricing). Recordings shorter than 2 minutes get a summary only.

## `downloadVia` (type: `string`):

Some file hosts refuse downloads from data centers or after many files in a row (HTTP 401/403/429 or a bot-check page). Auto then tries our backend (any size), our Oracle server (up to 15 MB) and our home line in Taiwan (up to 10 MB) before giving up. Each failed file is a free row that lists what was tried. No extra charge. We never use cookies or logins and never solve CAPTCHAs; when a host sends Retry-After we wait that long.

## `maxTotalMinutes` (type: `integer`):

Stop charging for new files once this many audio minutes were transcribed. Files that would go over it get a row with errorType "limit_reached" and are not charged. Empty or 0 = no limit (your Apify spending limit still applies).

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/reel/C-YpOOwvJME/"
  ],
  "saveSubtitles": true,
  "outputFormats": [
    "srt",
    "vtt"
  ],
  "saveTranscriptFiles": true,
  "speakerLabels": false,
  "subtitleLanguages": [],
  "summarize": false,
  "downloadVia": "auto"
}
```

# Actor output Schema

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

No description

## `full` (type: `string`):

No description

## `subtitles` (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/reel/C-YpOOwvJME/"
    ],
    "subtitleLanguages": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidytools/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/reel/C-YpOOwvJME/"],
    "subtitleLanguages": [],
}

# Run the Actor and wait for it to finish
run = client.actor("tidytools/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/reel/C-YpOOwvJME/"
  ],
  "subtitleLanguages": []
}' |
apify call tidytools/instagram-reels-transcript --silent --output-dataset

```

## MCP server setup

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