# Instagram Reels Transcript Scraper - Video to Text, No Login (`headply/instagram-reels-transcript-scraper`) Actor

Turn Instagram Reels into text: the spoken words with timestamps and the opening hook, plus caption, owner, likes and comments. Paste reel links or profiles. No login. Export to JSON, CSV or Excel.

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

## Pricing

from $8.00 / 1,000 reel 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 Reels Transcript Scraper - Video to Text, No Login

**Turn any public Instagram Reel into text.** Paste reel links (or just a creator's username) and get back what is
**said** in each reel: the full transcript, every line with its timestamp, the opening **hook**, and the spoken
language, together with the reel's caption, owner, posting date, likes and comments.

No Instagram account, no login, no cookies, no API key.

**In short**

| | |
|---|---|
| **You give it** | Reel links (`instagram.com/reel/...`, share links work too) and/or usernames |
| **You get** | One row per reel: transcript, timed lines, hook, language, caption, owner, date, likes, comments, views (for profile reels), sound/music, thumbnail |
| **Languages** | Detected automatically per reel (English, Spanish, Portuguese, French, German, Hindi and many more), or set one yourself |
| **How often** | Once, or on a schedule that picks up each creator's **new reels only** |
| **What you need** | A free Apify account. No Instagram login |
| **What it costs** | **$0.010 per reel** (down to $0.008 on higher plans), $0.003 for a reel with no speech ([pricing](#pricing)) |

### Who it's for

- **Content creators and social media managers** who study what top creators *say* in their reels: hooks, scripts,
  calls to action, and how long they take to get to the point.
- **Marketing and brand teams** who track what competitors and partner creators say about a product.
- **Agencies** that repurpose clients' reels into blog posts, newsletters, captions, quotes and subtitles.
- **Researchers and journalists** who need reels as searchable text.
- **AI and automation builders** who feed reel content into an LLM, a search index or a database (n8n, Make, Zapier,
  LangChain, your own code).

### How to use it (step by step)

#### 1. Open the Actor

Click **Try for free** (or **Start**) at the top of this page. You land on the input form. A sample reel is already
filled in, so you can press **Start** right away to see what the output looks like.

#### 2. Add the reels you want

In **Reel URLs**, add one link per line. Use **Bulk edit** to paste a whole list at once, then click **Set**.

![Paste reel links, one per line](https://api.apify.com/v2/key-value-stores/IQ2Afx4n4jiqjVvuD/records/instagram-reels-transcript-scraper-1-paste-reel-links.png)

All of these work:

| You paste | What it is |
|---|---|
| `https://www.instagram.com/reel/Der63knvT6D/` | A reel |
| `https://www.instagram.com/reels/Der63knvT6D/` | The same reel from the Reels tab |
| `https://www.instagram.com/p/Der63knvT6D/` | A video post |
| `https://www.instagram.com/reel/Der63knvT6D/?igsh=...` | A link copied from the app's **Share** button |

The same reel pasted twice is transcribed (and charged) once.

#### 3. Or add creators instead

In **Profiles (latest reels)**, add usernames (`hubermanlab`, `@nasa`) or profile links
(`https://www.instagram.com/nasa/`). The Actor transcribes each profile's **latest reels**, up to 12 per profile. Set
how many with **Latest reels per profile**. You can mix profiles and reel links in the same run.

#### 4. Optional: set the language

Leave **Spoken language** empty and the language is detected for each reel. If you know all your reels are in one
language, type its two-letter code (`en`, `es`, `pt`, `fr`, `de`, `hi`...). That helps on short or noisy clips.

#### 5. Press Start

Each reel takes a few seconds. In our tests, the **4 reels below took 18 seconds**, and **56 reels took about 9
minutes**. Rows appear in the **Output** tab while the run is going. The table shows the reel, owner, date, length,
transcript, hook, language, likes, comments and caption:

![The results: one row per reel with its transcript and hook](https://api.apify.com/v2/key-value-stores/IQ2Afx4n4jiqjVvuD/records/instagram-reels-transcript-scraper-2-results-table.png)

Click **JSON** (or **All fields**) to see every field, including the timed lines:

![The same results as JSON](https://api.apify.com/v2/key-value-stores/IQ2Afx4n4jiqjVvuD/records/instagram-reels-transcript-scraper-4-json-output.png)

#### 6. Download or connect

Use **Export** to download JSON, CSV, Excel, XML or HTML, or read the results through the API, n8n, Make or Zapier
([below](#connect-it-to-your-tools)).

#### 7. Put creators on a schedule: only new reels

Want every new reel from a list of creators, transcribed automatically?

1. Add the creators in **Profiles (latest reels)**.

2. Open **Scheduling** and switch on **Only new reels since the last run**.

   ![Switch on "Only new reels since the last run"](https://api.apify.com/v2/key-value-stores/IQ2Afx4n4jiqjVvuD/records/instagram-reels-transcript-scraper-3-only-new-reels.png)

3. Click **Save as a new task** at the top, then open the task's **⋯** menu → **Schedule** and pick **Daily** (or
   hourly, or your own timing).

The first run brings the latest reels. Every run after that brings **only reels you haven't received yet**, so you
never pay twice for the same reel. Use a different **Monitor name** for each schedule to keep separate lists.

### What you get for each reel

A real row from our test run (one profile reel):

```json
{
  "url": "https://www.instagram.com/reel/Der63knvT6D/",
  "shortcode": "Der63knvT6D",
  "type": "reel",
  "ownerUsername": "hubermanlab",
  "ownerFullName": "Andrew Huberman, Ph.D.",
  "ownerIsVerified": true,
  "caption": "Comment LIFE and I'll DM you a link to the full episode: What Makes Great Leaders & How to Live an Extraordinary Life | with Dr. Jared Diamond ...",
  "postedAt": "2026-10-19T18:44:37Z",
  "durationSecs": 12.21,
  "viewCount": 372981,
  "likeCount": 3929,
  "commentCount": 265,
  "hasAudio": true,
  "music": null,
  "originalSound": { "title": "Original audio", "owner": "hubermanlab" },
  "thumbnailUrl": "https://scontent-....cdninstagram.com/...jpg",
  "width": 720,
  "height": 1280,
  "sourceProfile": "hubermanlab",
  "transcript": {
    "source": "speech-recognition",
    "language": "en",
    "text": "Make sure that you do something that you enjoy and if people tell you know you got to do this this this tell them to go to hell Am I doing something that I enjoy? Am I doing something that I'm good at? Am I doing something that's that's good for the world?",
    "wordCount": 53,
    "hook": "Make sure that you do something that you enjoy and if people tell you know you got to do this this this tell them to go to hell",
    "segments": [
      { "start": 0, "end": 5.76, "text": "Make sure that you do something that you enjoy and if people tell you know you got to do this this this tell them to go to hell" },
      { "start": 5.76, "end": 9.44, "text": "Am I doing something that I enjoy? Am I doing something that I'm good at?" },
      { "start": 9.44, "end": 11.92, "text": "Am I doing something that's that's good for the world?" }
    ]
  }
}
```

| Field | What it is |
|---|---|
| `transcript.text` | Everything said in the reel, as one block of text |
| `transcript.segments` | Each spoken line with `start` and `end` in seconds: ready for subtitles, quotes or jumping to a moment |
| `transcript.hook` | The words spoken in the first 5 seconds (change it with **Hook length**) |
| `transcript.language` | The spoken language (two-letter code) |
| `transcript.wordCount` | Number of words spoken |
| `caption` | The text the creator wrote under the reel |
| `ownerUsername`, `ownerFullName`, `ownerIsVerified`, `coauthors` | Who posted it (and any collab partners) |
| `postedAt` | When it was posted (UTC) |
| `durationSecs` | Length of the reel in seconds |
| `viewCount` | Plays, for reels found through **Profiles** (empty for reels pasted as links) |
| `likeCount`, `commentCount` | Engagement at the time of the run (`likeCount` is empty if the creator hides likes) |
| `music`, `originalSound` | The licensed track (title, artist) or the original sound used in the reel |
| `thumbnailUrl`, `width`, `height` | The cover image and video size |
| `sourceProfile` | The profile the reel came from, when you used **Profiles** |
| `note` | `no_speech_detected` (music only or silent), `no_audio_track`, or `skipped_longer_than_maxDurationSecs` |
| `error` | Why a reel or profile could not be delivered (see [FAQ](#faq)); these rows are never charged |

A run summary (reels done, transcribed, without speech, not found, and so on) is saved as **SUMMARY** in the run's
key-value store.

### Settings explained

| Setting | What it does | Tip |
|---|---|---|
| **Reel URLs** | The reels to transcribe, one per line | Share links from the app work as they are |
| **Profiles (latest reels)** | Usernames or profile links; transcribes each one's newest reels | Up to 12 per profile |
| **Latest reels per profile** | How many of each profile's newest reels to take (1–12, default 12) | Lower it to test cheaply |
| **Only new reels since the last run** | For profiles: skips reels an earlier run with the same monitor name already delivered | Turn on for anything scheduled |
| **Monitor name** | Keeps a separate "already delivered" list per name | One name per schedule, e.g. `competitors`, `my-clients`. Change it to start over |
| **Spoken language** | Two-letter language code, or empty to detect it per reel | Set it when every reel is in the same language |
| **Skip reels longer than (seconds)** | Longer reels come back with their details but no transcript, and are not charged (default 600 = 10 minutes) | Lower it to cap your cost per reel |
| **Maximum reels per run** | Stops after this many reels (0 = no limit) | Handy for a first test |
| **Include timed segments** | Each spoken line with its start and end time | Turn off if you only need the text |
| **Hook length (seconds)** | How many opening seconds go into `hook` (default 5) | 3 for very fast-paced reels |

### Pricing

You pay only for reels you get. Prices drop on higher Apify plans.

| What | Price (Free plan → Gold and above) |
|---|---|
| Reel transcript (includes up to 2 minutes of audio) | **$0.010** → $0.008 |
| Reel with no speech (music only or silent): you still get its details | $0.003 |
| Each extra started minute of audio beyond the first 2 minutes | $0.005 |
| Each run | $0.005 at the default memory (Apify's start fee: $0.00125 per GB of memory) |

Never charged: reels that are not found, private, removed or age-restricted, reels longer than your limit, reels that
fail, and the same reel pasted twice.

What that looks like:

- **1,000 reels** (most reels are under 2 minutes): about **$10** on the Free plan, $8 on Gold.
- **A 4-minute reel:** $0.010 + 2 extra minutes × $0.005 = **$0.020**.
- **20 creators on a daily schedule**, about one new reel each per day: 600 reels a month ≈ **$6**, plus 30 runs ≈
  $0.15.

Apify's free monthly credit covers a good first batch. On the Free Apify plan each run returns up to 10 reels; any
paid Apify plan removes that limit.

### Connect it to your tools

- **n8n:** add the **Apify** node → *Run an Actor and get dataset*, pick this Actor, paste your input, and send each
  transcript to Google Sheets, Notion, Airtable, Slack or an AI step (summaries, hooks, blog drafts).
- **Make / Zapier:** use the Apify app's *Run Actor* action, then map `transcript.text`, `caption` and `url` to your
  next step.
- **API:** start a run with one HTTP call and read the results as JSON. The *API* tab on this page has ready-made
  examples for cURL, Python and JavaScript. For example, in Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("headply/instagram-reels-transcript-scraper").call(
    run_input={"reelUrls": ["https://www.instagram.com/reel/Der63knvT6D/"]}
)
for reel in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(reel["url"], (reel.get("transcript") or {}).get("text"))
```

- **AI agents:** the output is plain JSON with stable field names, so it drops straight into an LLM prompt or a vector
  database.

### FAQ

**Do I need an Instagram account?**
No. You only need a free Apify account. There's no Instagram login, no cookies and no API key.

**Which reels work?**
Any reel or video post from a **public** account. Private accounts, removed reels and age-restricted reels can't be
read; they come back as a row with `error` and are not charged.

**How accurate is the transcript?**
Clear speech in English, Spanish and Portuguese comes out very well in our tests. Other languages work too, with
somewhat lower accuracy, especially on short clips with background noise. Setting **Spoken language** helps. Names,
brands and slang can be misspelled, as with any automatic transcript.

**What happens with reels that only have music?**
They come back with their caption, owner and engagement, `transcript: null` and the note `no_speech_detected`, for
$0.003 instead of the full price. Song lyrics are usually not transcribed.

**Does it read the text written on screen?**
No, only what is spoken. The caption the creator wrote is included as `caption`.

**How many reels can I get from a profile?**
The latest 12 per profile. For older reels, paste their links in **Reel URLs** (no limit there).

**A profile came back with `profile_unavailable` or `no_reels_found`. Why?**
Some profiles don't show their reels to visitors who aren't logged in, and Instagram sometimes refuses a request
for a moment. Try again later, or paste the reel links directly. These rows are never charged.

**How long can a reel be?**
Up to 10 minutes by default (change it with **Skip reels longer than**). Up to 2 minutes is included in the reel
price; each extra started minute is $0.005.

**Can I get only new reels every day?**
Yes: add the creators in **Profiles**, switch on **Only new reels since the last run**, and schedule the task
([step 7](#7-put-creators-on-a-schedule-only-new-reels)).

**Does it download the videos?**
No. You get the text and the details. The `thumbnailUrl` links to the cover image.

**What data is collected?**
Only public information that anyone can see on Instagram without logging in. You are responsible for using the
transcripts in line with Instagram's terms and copyright law; quoting with credit to the creator is the safe default.

### More tools for creators and marketers

- [Instagram Highlights Scraper](https://apify.com/headply/instagram-highlights-scraper): every story highlight of a
  profile, with links, stickers and sponsor tags.
- [TikTok Transcript Scraper](https://apify.com/headply/tiktok-transcript-scraper): the same idea for TikTok videos.
- [YouTube Transcript Scraper](https://apify.com/headply/youtube-transcript-scraper): transcripts for YouTube videos
  and Shorts.

Questions, or a reel that doesn't work? Open the **Issues** tab and we'll take a look.

# Changelog

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

# Actor input Schema

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

Links to Instagram Reels or video posts, e.g. https://www.instagram.com/reel/DeTUk4sDSp-/ (share links work too).

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

Usernames or profile URLs. The Actor transcribes each profile's latest reels (up to 12 per profile).

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

How many of each profile's newest reels to transcribe (Instagram shows up to 12 without logging in).

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

For profiles: skip reels already delivered by an earlier run with the same monitor name. Use with a schedule to get each new reel once.

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

Keeps separate 'already delivered' lists for different schedules.

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

Two-letter code such as en, es, pt, fr, de, hi. Leave empty to detect it per reel. Setting it helps on short or noisy clips.

## `maxDurationSecs` (type: `integer`):

Longer reels are returned without a transcript and are not charged.

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

0 = no limit.

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

Each spoken line with start and end time (for subtitles or quoting). Turn off for text only.

## `hookSeconds` (type: `integer`):

The 'hook' field holds the words spoken in the first N seconds.

## `selfTest` (type: `boolean`):

Internal switch for our own test runs.

## `_simulateFreePlan` (type: `boolean`):

Internal switch for our own test runs.

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

Internal switch for our own test runs.

## `_concurrency` (type: `integer`):

Internal switch for our own test runs.

## `_asrWorkers` (type: `integer`):

Internal switch for our own test runs.

## Actor input object example

```json
{
  "reelUrls": [
    "https://www.instagram.com/reel/DeTUk4sDSp-/"
  ],
  "maxReelsPerProfile": 12,
  "onlyNew": false,
  "monitorName": "default",
  "maxDurationSecs": 600,
  "maxReels": 0,
  "includeSegments": true,
  "hookSeconds": 5,
  "selfTest": false,
  "_simulateFreePlan": false,
  "debugLog": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "reelUrls": [
        "https://www.instagram.com/reel/DeTUk4sDSp-/"
    ]
};

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

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

```

## MCP server setup

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