# Instagram Reel Transcript Scraper (`apimint/instagram-reel-transcript-scraper`) Actor

Get transcripts of all Reels on an Instagram profile, or any list of Reel URLs. Bulk Instagram Reel transcript API: Reels to text with timestamped segments, hook, call to action, language, caption, views, likes and comments. Music-only Reels and every miss get a free row that says why. No login.

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

## Pricing

from $10.00 / 1,000 transcripts

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 Scraper

Get transcripts of all Reels on an Instagram profile, or any list of Reel links, in one run. Instagram Reels to text with the **hook** (the opening line), the **call to action**, views and timestamps in the same row. It works as an Instagram Reel transcript API too: call it from code, n8n, Make or an AI agent and get JSON back.

- **Bulk Instagram Reel transcripts:** paste hundreds of Reel links and profiles, mixed in one list.
- **Instagram profile transcripts:** a profile's newest Reels, with a date range if you want only recent ones.
- **Hooks and calls to action:** what each Reel says first and what it asks viewers to do, next to views and likes.
- **Every row:** the full transcript and timestamped segments, the detected language, caption, hashtags, views, likes, comments, posting date, duration and audio. Optional SRT or WebVTT subtitle files.

Music-only Reels are detected before transcription and never charged. Every Reel without a transcript gets a row that says why. No Instagram account, no cookies, no API key.

| Reel | Status | Hook | Call to action | Views |
|---|---|---|---|---|
| [@nasa](https://www.instagram.com/reel/Dd1gQBsCWE8/) | `ok` | This asteroid, 2024 YR4, might get interesting. | Check our link in bio for details. (`link`) | 5,638,998 |
| [reel/Ddi3q68I1BQ](https://www.instagram.com/reel/Ddi3q68I1BQ/) | `ok` | Here are three really quick ways to make money in your business right now. | — | — (single links don't carry views) |
| [reel/DdO99ZaxLrt](https://www.instagram.com/reel/DdO99ZaxLrt/) | `no-speech`, free | — | — | — |

| What you pay | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| Per 1,000 transcripts (Reels up to 3 minutes) | $15 | $14 | $12.50 | $10 |
| Per extra minute of a longer Reel | $0.005 | $0.005 | $0.005 | $0.005 |

Proxy traffic and speech-to-text are included. Music-only Reels, Reels without sound, unavailable posts and anything blocked are free.

Works with: [TikTok Transcript Scraper](https://apify.com/apimint/tiktok-transcript-scraper) (the same rows for TikTok videos and profiles) and [YouTube Transcript Scraper](https://apify.com/apimint/youtube-transcript-scraper) (channels, playlists and Shorts).

### What you get

| Field | Example |
|---|---|
| `text`, `wordCount` | the whole transcript as one string |
| `segments` | `[{start: 0.03, end: 3.49, text: "This asteroid, 2024 YR4, might get interesting."}, …]` |
| `hook`, `hookEndSeconds` | "This asteroid, 2024 YR4, might get interesting.", 3.49 |
| `cta`, `ctaType` | "Check our link in bio for details.", `link` |
| `language`, `speechDetected`, `speechSeconds` | en, true, 33.5 |
| `caption`, `hashtags`, `mentions` | the post caption and what's tagged in it |
| `views`, `likes`, `comments`, `postedAt`, `durationSeconds` | 5638998, 115593, 968, 2026-09-28T15:27:08Z, 38.6 |
| `music` | `{title: "Original audio", artist: "nasa", isOriginalSound: true}` |
| `ownerUsername`, `ownerFullName`, `isCollab`, `coauthors` | nasa, NASA, false, \[] |
| `srt`, `vtt` (optional) | subtitle files as text |
| `status`, `errorMessage` | `ok`, or why there is no transcript |

`hook` and `cta` are derived: the hook is the first sentence spoken; the call to action is the closing "comment…", "link in bio", "follow…", "DM me", "shop…" line found in the speech, else in the caption.

### How to get Instagram Reel transcripts in bulk

#### Reel links in bulk

Paste Reel or post links into **Reels or profiles**, one per line: `instagram.com/reel/…`, `/p/…`, or just the shortcode. Hundreds at a time are fine; duplicates are fetched and charged once.

#### Instagram profile transcripts

Paste a profile link (`https://www.instagram.com/nasa/`) or `@handle`. You get its newest Reels first, up to **Max Reels per profile**, with view counts. Add **Posted after** ("30 days", "2026-09-01") to keep only recent ones. Instagram limits how fast profiles can be listed without a login; if it stops the listing early, the run summary says how far it got.

#### Hooks and calls to action for competitor research

Run a few competitors' profiles and sort by `views`: the `hook` and `cta` columns show what top-performing Reels say first and what they ask viewers to do. The **Transcripts** view in the dataset shows creator, hook, CTA and text side by side, ready for a swipe file.

#### Subtitle files (SRT and WebVTT)

Pick SRT and/or WebVTT under **Subtitle files**. Each row then carries the transcript as subtitle text in `srt` or `vtt`, ready to save as a file.

#### Monitor profiles

Turn on **Only new Reels** and run the Actor on a schedule (daily or weekly). Each run returns only Reels it hasn't returned before for that profile, so you pay once per Reel. Send the results to Google Sheets, n8n, Make, Zapier or a webhook with Apify's integrations, and new transcripts arrive there on their own.

### Instagram Reel transcript API

Call the Actor over HTTP and get the transcripts back as JSON in the same request. The request waits up to 5 minutes, which suits a handful of Reels; for whole profiles, start a run and read its dataset when it finishes.

```bash
curl -X POST "https://api.apify.com/v2/acts/apimint~instagram-reel-transcript-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.instagram.com/reel/Dd1gQBsCWE8/", "https://www.instagram.com/nasa/"], "maxReelsPerProfile": 5}'
```

Apify's JavaScript and Python clients, the n8n and Make integrations and Apify's MCP server for AI agents all take the same input.

### Input example

```json
{
  "urls": [
    "https://www.instagram.com/reel/Dd1gQBsCWE8/",
    "https://www.instagram.com/nasa/"
  ],
  "maxReelsPerProfile": 30,
  "postedAfter": "30 days",
  "extraFormats": ["srt"]
}
```

Switching from another Reel transcript Actor? Calls that use `startUrls`, `reelUrls`, `videoUrls`, `bulkUrls`, `handles`, `usernames`, `username`, `resultsLimit`, `maxReelsPerHandle` or `onlyPostsNewerThan` work as they are.

### Output example

```json
{
  "shortcode": "Dd1gQBsCWE8",
  "url": "https://www.instagram.com/reel/Dd1gQBsCWE8/",
  "status": "ok",
  "errorMessage": null,
  "wordCount": 94,
  "language": "en",
  "hook": "This asteroid, 2024 YR4, might get interesting.",
  "hookEndSeconds": 3.488,
  "cta": "Check our link in bio for details.",
  "ctaType": "link",
  "speechDetected": true,
  "speechSeconds": 33.54,
  "text": "This asteroid, 2024 YR4, might get interesting. There was a chance that it could impact Earth. The ATLAS survey operated by the University of Hawaii finds about 200 to 250 near-Earth objects per year. …",
  "segments": [
    { "start": 0.034, "end": 3.488, "text": "This asteroid, 2024 YR4, might get interesting." },
    { "start": 3.488, "end": 6.11, "text": "There was a chance that it could impact Earth." }
  ],
  "caption": "What happens when we detect an asteroid that could pose a threat to Earth? … Check our link in bio for details.",
  "hashtags": [],
  "mentions": [],
  "postedAt": "2026-09-28T15:27:08.000Z",
  "durationSeconds": 38.613,
  "views": 5638998,
  "likes": 115593,
  "comments": 968,
  "music": { "title": "Original audio", "artist": "nasa", "isOriginalSound": true },
  "ownerUsername": "nasa",
  "ownerFullName": "NASA",
  "ownerUrl": "https://www.instagram.com/nasa/",
  "isCollab": false,
  "coauthors": [],
  "transcriptEngine": "openai",
  "extraMinutes": 0,
  "source": { "type": "profile", "value": "https://www.instagram.com/nasa/" }
}
```

A music-only Reel:

```json
{ "shortcode": "DdO99ZaxLrt", "status": "no-speech", "errorMessage": "No speech: music or sound only", "speechDetected": false, "speechSeconds": 0, "caption": "Lets do a commercial with one product #ugc #skincare #tips" }
```

### How much does it cost to scrape Instagram Reel transcripts?

| Job | Free plan | Starter |
|---|---|---|
| 100 Reel links | $1.50 | $1.40 |
| 10 profiles × 30 Reels (300 transcripts) | $4.50 | $4.20 |
| A 5-minute Reel (1 transcript + 2 extra minutes) | $0.025 | $0.024 |

On profiles, a fifth to a third of Reels are usually music only; those come back as free rows, so a 30-Reel profile often costs less than 30 transcripts. Set **Max transcripts in total** or the run's maximum charge to cap any run.

### Status codes (none of them is charged)

| Status | Meaning |
|---|---|
| `no-speech` | Music or sound only, nothing spoken |
| `no-audio` | The Reel has no sound |
| `too-long` | Longer than **Skip Reels longer than (minutes)** |
| `not-a-video` | A photo or carousel post |
| `unavailable` | Deleted, private or restricted for logged-out viewers |
| `blocked` | Instagram kept refusing it on fresh IPs |
| `error` | Something else went wrong; `errorMessage` says what |

### What Instagram doesn't give without a login

- Saved, liked or bookmarked Reels, private accounts, Stories and DMs.
- Instagram's own auto-captions: they aren't public, so every transcript is made by speech recognition from the audio.
- View counts for single Reel links (profile listings include them).
- Text written on the video (on-screen captions), speaker names, word-by-word timing.
- Every Reel of a very large profile in one go: Instagram slows profile listing down.

### FAQ

**Is it legal to scrape Instagram Reel transcripts?** The Actor reads public Reels the way a logged-out visitor sees them and returns text for analysis. What a creator says is their work: use transcripts for research and analysis, not to republish.

**Why not the official Instagram API?** The Instagram Graph API only returns media of business or creator accounts you manage, after an app review, and it has no transcript or audio field for anyone's Reels. This Actor works on any public Reel and makes the transcript from the audio.

**How accurate is it?** On paid plans transcripts come from OpenAI's speech recognition, with the caption's names (brands, products, @handles) used as spelling hints. On the Free plan they come from an open-source Whisper model running on the run's own computer: free for everyone, a little less accurate, and slower (about half a minute per Reel at 4 GB; give the run 4 GB of memory for the best speed).

**Which languages?** Any language Whisper knows. The transcript is in the language spoken; it is never translated. Set **Language hint** if you know it.

**Why is there no transcript for some Reels?** Mostly music-only Reels (`no-speech`), which are free. Every Reel without a transcript has a `status` and an `errorMessage`.

**What if Instagram blocks the run?** A few refused requests are normal and retried on fresh IPs, residential ones if needed. If Instagram starts blocking most of them, the run stops early and tells you so, instead of grinding on. Blocked Reels are never charged; try again later.

**Can I use it from n8n, Make, Zapier, an API or an AI agent?** Yes. Use the Apify integration or API with the input above (see "Instagram Reel transcript API"), or connect it to an AI agent through Apify's MCP server.

**How often should I run it?** For profiles you follow, weekly with **Only new Reels** on is enough for most creators; daily for accounts that post every day. Results can go straight to Google Sheets or an n8n workflow.

**How is it different from other Reel transcript scrapers?**

| | This Actor | Typical |
|---|---|---|
| Reel links and whole profiles in one run | Yes | Often one link per run |
| Hook and call to action next to views | Yes | Rare, or an extra AI charge |
| Music-only Reels detected before transcription | Yes, free row | Often charged, or an empty transcript |
| Reason for every missing transcript | Yes, free row | Empty result or failed run |
| Timestamped segments and SRT/VTT | Yes | Often plain text only |
| Free-plan URL cap | None | 5 links per run is common |
| Only new Reels for schedules | Yes | Rare |

### Related Actors

- [TikTok Transcript Scraper](https://apify.com/apimint/tiktok-transcript-scraper): the same rows for TikTok videos and profiles, from TikTok's own captions when they exist.
- [YouTube Transcript Scraper](https://apify.com/apimint/youtube-transcript-scraper): transcripts of whole YouTube channels, playlists and Shorts.
- [Google Ads Transparency Scraper](https://apify.com/apimint/google-ads-transparency-scraper): every Google ad a competitor runs, with the ad copy.
- [Instagram Reel Scraper](https://apify.com/apify/instagram-reel-scraper): Reel details in bulk without transcripts.
- [Instagram Scraper](https://apify.com/apify/instagram-scraper): profiles, posts, hashtags and comments.

### Feedback

Found a Reel that should work but doesn't? Open an issue with the Reel URL and we'll look at it. Reviews help other people find the Actor. See the [changelog](./CHANGELOG.md) for updates.

# Changelog

This Actor's version history is a separate document: https://apify.com/apimint/instagram-reel-transcript-scraper/changelog.md

# Actor input Schema

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

One per line, mixed freely: Reel or post URLs (instagram.com/reel/…, /p/…), shortcodes, profile URLs or @handles. A profile gives its newest Reels.

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

Newest first. 0 = as many as Instagram lets us list (it limits how fast profiles can be paged; the run summary says where it stopped).

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

Profiles only. A date (2026-09-01) or a period back from today ("30 days"). Inclusive.

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

Profiles only. Same format as "Posted after". Inclusive.

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

Stop after this many charged transcripts across all sources. 0 = no limit (the run's maximum charge still applies).

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

Optional two-letter code of the spoken language ("en", "es", "hi"). Leave empty to detect it. The transcript is never translated.

## `maxDurationMinutes` (type: `integer`):

Longer Reels get a free "too-long" row instead of a transcript, so one long video can't surprise your bill. 0 = no limit.

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

The transcript in timed pieces (field segments), cut at pauses.

## `extraFormats` (type: `array`):

Add the transcript as SRT and/or WebVTT text in each row.

## `includeFailures` (type: `boolean`):

Add a free row with a status (no-speech, no-audio, too-long, not-a-video, unavailable, blocked) for every Reel without a transcript. Never charged.

## `onlyNewReels` (type: `boolean`):

For profiles: skip Reels this Actor already returned for the same profile in your earlier runs. Use with a schedule to get each new Reel once. Skipped Reels are not charged.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default; proxy traffic is included in the price. If Instagram blocks it, the Actor switches to residential by itself.

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/reel/Ddi3q68I1BQ/",
    "https://www.instagram.com/reel/DdcxNFkvybJ/",
    "https://www.instagram.com/nasa/"
  ],
  "maxReelsPerProfile": 3,
  "maxReels": 0,
  "maxDurationMinutes": 10,
  "includeSegments": true,
  "extraFormats": [],
  "includeFailures": true,
  "onlyNewReels": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per Reel: transcript, segments, hook, call to action and Reel details, or the reason there is none.

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

Per source: Reels listed, transcripts, rows without a transcript by status, blocks, timings, speech-to-text minutes, and why the run stopped.

# 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/Ddi3q68I1BQ/",
        "https://www.instagram.com/reel/DdcxNFkvybJ/",
        "https://www.instagram.com/nasa/"
    ],
    "maxReelsPerProfile": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("apimint/instagram-reel-transcript-scraper").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/Ddi3q68I1BQ/",
        "https://www.instagram.com/reel/DdcxNFkvybJ/",
        "https://www.instagram.com/nasa/",
    ],
    "maxReelsPerProfile": 3,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("apimint/instagram-reel-transcript-scraper").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/Ddi3q68I1BQ/",
    "https://www.instagram.com/reel/DdcxNFkvybJ/",
    "https://www.instagram.com/nasa/"
  ],
  "maxReelsPerProfile": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call apimint/instagram-reel-transcript-scraper --silent --output-dataset

```

## MCP server setup

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

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/Pg1xfVVAbAekW0QT5/builds/5mnavPT9HgriWRU3A/openapi.json
