# Instagram Transcript Scraper (`automation-lab/instagram-reel-video-transcripts`) Actor

Turn public Instagram Reels and video posts into transcript text, detected language, timestamped segments, and source metadata.

- **URL**: https://apify.com/automation-lab/instagram-reel-video-transcripts.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Instagram Transcript Scraper

Turn supplied public Instagram Reels and video posts into structured **Instagram transcript** records.
Each successful record includes clean transcript text, detected language, timestamped segments, duration,
author, caption, media provenance, and the original source URL.

The Actor is designed for recurring content monitoring, hook research, editorial review, accessibility work,
and data pipelines that need speech as text rather than only post metadata.
It does not require an Instagram login and does not scrape private content.

### What does Instagram Transcript Scraper do?

The Actor accepts known public Instagram video URLs and:

1. validates and normalizes each Reel or video-post URL;
2. resolves public media metadata from Instagram's embed surface;
3. checks duration before downloading the video;
4. runs local AI speech recognition;
5. returns one typed dataset record per successful video;
6. charges the transcript event only when non-empty transcript text is produced.

It supports these public URL shapes:

- `https://www.instagram.com/reel/SHORTCODE/`
- `https://www.instagram.com/p/SHORTCODE/` when the post is a video
- `https://www.instagram.com/tv/SHORTCODE/`

### Who is it for?

#### Social media analysts

Archive the spoken claims, hooks, and calls to action in a saved list of public videos.
Schedule the same input to compare content records over time.

#### Marketing and creative teams

Turn competitor or campaign Reels into searchable text for qualitative review.
Use timestamps to jump from a quote back to the relevant point in a video.

#### Newsrooms and researchers

Create source-linked transcript datasets from known public posts.
Retain the author, caption, shortcode, duration, and extraction time with the transcript.

#### Developers and data teams

Feed normalized records into spreadsheets, warehouses, vector databases, LLM workflows, or alerting systems.
Use the stable shortcode and canonical URL as join keys.

### Why use this Actor?

- **Timestamped output:** ordered segments include start time, end time, and spoken text.
- **Source provenance:** every result keeps the supplied URL, canonical URL, shortcode, media ID, author, and caption when available.
- **Language control:** detect speech automatically or provide a language code.
- **No external transcription API:** speech recognition runs inside the Actor container.
- **Bounded processing:** a duration limit is checked before transcription and videos run sequentially for predictable memory use.
- **Success-based item charging:** failed, private, image-only, silent, or unavailable URLs do not emit a transcript charge.

### What data can I extract?

| Field | Meaning |
| --- | --- |
| `sourceUrl` | URL supplied in the Actor input |
| `canonicalUrl` | Normalized Instagram content URL |
| `shortcode` | Stable Instagram content shortcode |
| `mediaId` | Public media identifier when exposed |
| `authorUsername` | Public author username when exposed |
| `authorId` | Public author identifier when exposed |
| `caption` | Author-published caption when exposed |
| `durationSeconds` | Video duration reported by Instagram |
| `thumbnailUrl` | Temporary public thumbnail URL |
| `transcript` | Normalized spoken transcript text |
| `language` | Detected or requested language code |
| `languageProbability` | Detection confidence from zero to one |
| `segments` | Ordered `{ startSeconds, endSeconds, text }` entries |
| `segmentCount` | Number of timestamped segments |
| `wordCount` | Approximate whitespace-delimited word count |
| `extractionMethod` | Media resolution and transcription method |
| `transcriptionModel` | Speech recognition model identifier |
| `transcribedAt` | ISO 8601 completion timestamp |

Temporary Instagram CDN links can expire.
Use `canonicalUrl` and `shortcode` as durable provenance instead of treating `thumbnailUrl` as permanent storage.

### How to get started

1. Open the Actor input page.
2. Add one or more public Instagram Reel or video-post URLs.
3. Keep `language` set to `auto`, or enter a language such as `en` or `es`.
4. Set `maxVideoDurationSeconds` to the longest video you want to accept.
5. Start the run.
6. Open the default dataset and use the **Instagram transcripts** view.
7. Export results as JSON, CSV, Excel, XML, or RSS, or consume them through the API.

Start with one known public video.
After confirming the output fits your workflow, add up to five URLs per run or schedule the saved Actor task.

### Input parameters

#### `startUrls`

Required array of public Instagram Reel, video post, or Instagram TV URLs.
Duplicate shortcodes are processed once.
Private profiles, Stories, profile pages, image-only posts, and login-only URLs are outside the product scope.

#### `maxItems`

Maximum number of unique supplied URLs to process.
The accepted range is 1–5 and the default is 3.
This is a bounded batch control, not search or profile discovery.

#### `language`

Use `auto` for language detection.
Alternatively, provide a two- or three-letter language code such as `en`, `es`, `fr`, or `deu`.
A correct language hint can improve recognition for short clips.

#### `maxVideoDurationSeconds`

Reject videos longer than this limit before transcription.
The accepted range is 10–1800 seconds and the default is 600 seconds.
Lower it for fast monitoring jobs with short-form videos.

### Example input

```json
{
  "startUrls": [
    { "url": "https://www.instagram.com/reel/DV29mBcMQwp/" }
  ],
  "maxItems": 1,
  "language": "auto",
  "maxVideoDurationSeconds": 120
}
```

For recurring monitoring, save the same URL list as an Apify task and attach a schedule.
Each run produces a new dataset with current source metadata and a fresh transcription timestamp.

### Example output

The following shortened example reflects the current output shape:

```json
{
  "sourceUrl": "https://www.instagram.com/reel/DV29mBcMQwp/",
  "canonicalUrl": "https://www.instagram.com/reel/DV29mBcMQwp/",
  "shortcode": "DV29mBcMQwp",
  "mediaId": "3852537424986049577",
  "authorUsername": "bbcnews",
  "durationSeconds": 68.22,
  "language": "en",
  "languageProbability": 0.992381,
  "transcript": "On Friday, US President Donald Trump claimed...",
  "segments": [
    {
      "startSeconds": 0,
      "endSeconds": 4.48,
      "text": "On Friday, US President Donald Trump claimed..."
    }
  ],
  "segmentCount": 22,
  "wordCount": 226,
  "extractionMethod": "instagram-embed-ai-speech-to-text",
  "transcriptionModel": "faster-whisper-tiny",
  "transcribedAt": "2026-08-14T20:00:00.000Z"
}
```

Transcript accuracy varies with music, overlapping speakers, background noise, accents, compression, and recording quality.
Always review quotations before publishing them.

### How much does it cost to transcribe Instagram videos?

Pricing has two events:

- **Run started:** $0.005 once per run.
- **Instagram transcript extracted:** tiered per successful non-empty transcript.

At the Bronze tier, the current transcript event is **$0.016 per successful video**.
A run with one successful video is approximately $0.021.
A run with five successful videos is approximately $0.085.
Failed URLs do not receive the transcript event, although the one-time start event still applies.

Higher Apify subscription tiers receive lower per-transcript event prices.
The Console shows the active tier before a run starts.
Runtime and platform usage are covered by the Actor's pay-per-event price rather than billed as a separate transcript field.

### Monitoring and automation patterns

#### Recurring creator or campaign review

Save a stable list of known public URLs as an Apify task.
Schedule it daily or weekly, export each dataset, and compare records by `shortcode`.

#### Editorial quote review

Search `transcript` for a phrase, then use `segments` to identify its approximate video time.
Keep `canonicalUrl` beside downstream notes so reviewers can inspect the source.

#### Spreadsheet pipeline

Use an Apify integration to send `authorUsername`, `canonicalUrl`, `language`, `durationSeconds`, and `transcript` to Google Sheets.
Long `segments` arrays are usually easier to keep as JSON.

#### LLM and semantic search

Chunk transcript segments, retain the shortcode and timestamps as metadata, and load them into a vector database.
The Actor performs transcription only; summarization, translation, classification, and embeddings belong in downstream steps.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.
The examples start a run and wait for its default dataset response.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~instagram-reel-video-transcripts/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url":"https://www.instagram.com/reel/DV29mBcMQwp/"}],
    "maxItems": 1,
    "language": "auto",
    "maxVideoDurationSeconds": 120
  }'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/instagram-reel-video-transcripts').call({
  startUrls: [{ url: 'https://www.instagram.com/reel/DV29mBcMQwp/' }],
  maxItems: 1,
  language: 'auto',
  maxVideoDurationSeconds: 120,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].transcript);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/instagram-reel-video-transcripts").call(run_input={
    "startUrls": [{"url": "https://www.instagram.com/reel/DV29mBcMQwp/"}],
    "maxItems": 1,
    "language": "auto",
    "maxVideoDurationSeconds": 120,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[0]["transcript"])
```

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/instagram-reel-video-transcripts"
```

#### Claude Desktop

Add this JSON under `mcpServers` in Claude Desktop's MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/instagram-reel-video-transcripts"
    }
  }
}
```

#### Cursor

Add the same `apify` HTTP server to Cursor's MCP settings, then enable the Actor tool for the workspace.

#### VS Code

Add the same endpoint to the MCP server configuration used by your VS Code AI extension.
The endpoint is Actor-specific, so it exposes this transcript workflow rather than the full Apify catalog.

Example prompts showing the intended MCP tool usage include:

- "Transcribe this public Instagram Reel and return the timestamps for every mention of the product name."
- "Run my saved Instagram transcript task and summarize only the new dataset records."
- "Export the author, source URL, language, duration, and transcript to a table."

### Limits and expected behavior

- Only supplied public video URLs are supported; the Actor does not search profiles, hashtags, or keywords.
- A run accepts up to five unique videos and processes them sequentially.
- Videos longer than the configured duration limit fail before transcription.
- Private, deleted, login-only, age-restricted, image-only, and silent videos do not produce transcript records.
- Instagram can change its public embed or temporary media delivery at any time.
- Temporary thumbnail and media URLs can expire.
- Automatic speech recognition is probabilistic and should not be treated as a certified verbatim record.
- The Actor does not provide speaker diarization, word-level timestamps, translation, summaries, or sentiment analysis.

If one URL in a batch fails, successful records already written remain in the dataset and are charged.
The run ends as failed so automation does not silently treat a partial batch as complete.

### Troubleshooting

#### The run says no public video data was returned

Confirm the URL opens publicly in a logged-out browser and points to a Reel or video post, not an image carousel or profile.
Remove tracking parameters if the copied link is unusual, then retry the canonical post URL.

#### No speech was detected

The clip may contain only music, ambient sound, or speech too quiet for the model.
No transcript event is charged when no non-empty transcript is produced.

#### The language is wrong

Set `language` to the expected code instead of `auto`.
Short clips with few spoken words provide less evidence for automatic language detection.

#### The video exceeds the duration limit

Increase `maxVideoDurationSeconds` up to 1800 only when the extra processing time is intentional.
For monitoring, keeping the limit close to the expected Reel length prevents accidental long jobs.

#### A scheduled task started failing

Test one current public URL, inspect the Actor log, and verify the source is still public.
Instagram media availability and temporary CDN URLs can change independently of your task schedule.

### Responsible use and legality

Use the Actor only for public content you are permitted to process.
Follow Instagram's terms, applicable copyright rules, privacy and data-protection laws, and your organization's retention policy.
Do not use transcript output to bypass access controls, profile individuals unlawfully, or misrepresent machine-generated text as a certified quotation.

Public availability does not remove copyright or personality rights.
Minimize collected personal data, retain source provenance, secure exported datasets, and delete records when they are no longer needed.

### Related Automation Lab Actors

- [Instagram Post & Reel Details Scraper](https://apify.com/automation-lab/instagram-post-reel-details-scraper) — enrich known URLs with public post, creator, engagement, media, and audio metadata when transcription is not required.
- [Instagram Reels Audio Scraper](https://apify.com/automation-lab/instagram-reels-audio-scraper) — inspect public audio pages and representative Reels by audio ID.
- [Instagram Profile Posts Scraper](https://apify.com/automation-lab/instagram-profile-posts-scraper) — discover public posts from supplied profiles before choosing videos to transcribe.

Use this Actor when the buyer job is speech-to-text from known URLs.
Use the related Actors when the job is discovery or metadata enrichment.

### FAQ

#### Does it require an Instagram account?

No. It processes public Reel and video-post surfaces without user credentials.
Private or permissioned content is not supported.

#### Can it transcribe an entire profile?

No. Supply known video URLs.
Use a related profile-post Actor for discovery, then pass selected public video URLs to this Actor.

#### Are timestamps word-level?

No. `segments` contains phrase-level start and end timestamps.
The Actor intentionally avoids claiming word-level precision.

#### Does it translate transcripts?

No. The Actor returns speech in the detected or requested source language.
Connect the dataset to a translation step if your workflow needs another language.

#### Are failed URLs charged?

The one-time start event applies when processing begins.
The per-transcript event applies only after a non-empty transcript is produced.

#### Can I export CSV or Excel?

Yes. Use the dataset export controls or API.
Nested `segments` are most faithfully represented in JSON; spreadsheet exports may serialize the array.

#### How accurate is the transcript?

Accuracy depends on audio quality, language, speakers, music, and background noise.
The output is useful for monitoring and analysis, but important quotations require human review.

# Actor input Schema

## `startUrls` (type: `array`):

Public instagram.com/reel/..., /p/..., or /tv/... video URLs. Private, deleted, login-only, age-restricted, and image-only posts are not supported.

## `maxItems` (type: `integer`):

Stop after this many unique supplied video URLs. Videos are processed sequentially to keep memory predictable.

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

Use auto to detect the spoken language, or provide a two- or three-letter language code such as en, es, or deu.

## `maxVideoDurationSeconds` (type: `integer`):

Reject longer videos before download and transcription. Accepted range: 10 to 1800 seconds.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.instagram.com/reel/DV29mBcMQwp/"
    }
  ],
  "maxItems": 3,
  "language": "auto",
  "maxVideoDurationSeconds": 600
}
```

# Actor output Schema

## `dataset` (type: `string`):

Timestamped transcript records in the default dataset.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.instagram.com/reel/DV29mBcMQwp/"
        }
    ],
    "maxItems": 3,
    "language": "auto",
    "maxVideoDurationSeconds": 600
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/instagram-reel-video-transcripts").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 = {
    "startUrls": [{ "url": "https://www.instagram.com/reel/DV29mBcMQwp/" }],
    "maxItems": 3,
    "language": "auto",
    "maxVideoDurationSeconds": 600,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/instagram-reel-video-transcripts").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 '{
  "startUrls": [
    {
      "url": "https://www.instagram.com/reel/DV29mBcMQwp/"
    }
  ],
  "maxItems": 3,
  "language": "auto",
  "maxVideoDurationSeconds": 600
}' |
apify call automation-lab/instagram-reel-video-transcripts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/instagram-reel-video-transcripts"
        }
    }
}

```

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/ZyTIgmeBb9PK2aAvH/builds/XZS3v3v7I3dnzrgzv/openapi.json
