# Instagram AI Transcript Scraper (`hgservices/instagram-ai-transcript-scraper`) Actor

Transcribe audio and video from Instagram into accurate, speaker-labeled text. Uses world's best AI Models with automatic language detection, multilingual support, and smart formatting.

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

## Pricing

from $0.60 / 1,000 video seconds

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

### What does Instagram AI Transcript Scraper do?

Instagram AI Transcript Scraper turns any **public Instagram Reel, video post, or carousel with a video slide** into accurate, formatted text. Paste one or more [Instagram](https://www.instagram.com) post URLs, and the Actor resolves each video, extracts the audio, and returns a full transcript with **speaker labels** (who said what) and smart formatting for dates, numbers, and punctuation. It **auto-detects the spoken language** across dozens of languages, so Hindi, Spanish, Portuguese, or Arabic reels work out of the box — no settings to change.

Alongside the transcript you get the post's **caption, creator, upload date, view count, thumbnail, and duration**, so each run is a complete, ready-to-use record of the reel.

Powered by the Apify platform, you get API access, scheduling, webhook integrations, and data export in JSON, CSV, or Excel — with no infrastructure to manage and no AI API key of your own.

### Why use Instagram AI Transcript Scraper?

- **Content repurposing** — Turn reels into blog posts, newsletters, LinkedIn posts, or scripts for other platforms
- **Creator and competitor research** — Read what creators actually *say*, not just their captions and hashtags, across hundreds of reels
- **Ad and brand monitoring** — Capture the spoken claims in branded reels for compliance, legal review, or competitive tracking
- **Accessibility** — Generate transcripts and caption source text for hearing-impaired audiences and translation workflows
- **SEO and search** — Make your own Instagram video content searchable and indexable as text
- **Social listening at scale** — Feed reel transcripts into an LLM or analytics pipeline to extract topics, sentiment, products, and claims
- **Pipeline transcription step** — Already scraping Instagram with another Actor? Chain this one downstream and hand it the post URLs you already collected (see [Use it in your Instagram scraping pipeline](#use-it-in-your-instagram-scraping-pipeline))

### What Instagram content can it transcribe?

| Instagram content | Works? | Notes |
|-------------------|--------|-------|
| **Reels** (`/reel/...`) | ✅ | The main use case. Caption, creator, views, thumbnail, and duration are returned with the transcript. |
| **Video posts** (`/p/...`) | ✅ | Any feed post with a video track. |
| **Carousels with a video slide** | ✅ | The first video slide in the carousel is transcribed. |
| **Share and short links** (`instagram.com/share/...`, `instagr.am/...`, `ig.me/...`) | ✅ | Paste the link as-is; it is resolved to the underlying post. |
| **Photo posts and image-only carousels** | ❌ | No audio track exists, so there is nothing to transcribe. The run reports `no_media`. |
| **Private, deleted, or audience-restricted posts** | ❌ | The Actor downloads without logging in, so it can only see public posts. |
| **Stories** | ❌ | Stories require an authenticated session. |
| **Non-Instagram links** (YouTube, TikTok, Facebook, a raw `cdninstagram.com` file link) | ❌ | Rejected up front with a clear message. This Actor accepts `instagram.com` URLs only — the Actor resolves the video file itself, so you never need the CDN link. |

### How to transcribe an Instagram Reel

1. **Open the Actor** — Click "Try for free" on the Actor's page
2. **Paste the Instagram URLs** — Put one or more reel or post links in the **Instagram Post URLs** field
3. **Configure options** (optional) — Turn speaker labels on or off, or lower the maximum audio length
4. **Run the Actor** — Click "Start" and wait; a typical reel finishes in well under a minute
5. **Get your results** — Read each post's transcript in the **Output** tab. For a single-post run you can also download `transcript.txt` / `transcript.json` from the **Storage** tab

No external API keys are required. AI transcription is included in the per-second price.

#### Run it via API or on a schedule

Most production usage drives this Actor through the **Apify API**, not the Console. Start a run with a single POST:

```bash
curl -X POST "https://api.apify.com/v2/acts/hgservices~instagram-ai-transcript-scraper/runs?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.instagram.com/reel/DAbc123XyZ/"]}'
```

Or from the Apify client (the Actor slug is `hgservices/instagram-ai-transcript-scraper`):

```python
run = client.actor("hgservices/instagram-ai-transcript-scraper").call(
    run_input={"urls": ["https://www.instagram.com/reel/DAbc123XyZ/"]}
)
```

Pass several links in `urls` to transcribe a batch in one run — every post gets its own dataset item. For very large batches you can also start one run per URL and let them execute in parallel. To run it unattended, point a [Schedule](https://docs.apify.com/platform/schedules) at it, or fire it from your Instagram scraper's success event with [webhooks](https://docs.apify.com/platform/integrations/webhooks).

### Input

Paste your links into **`urls`** — every entry must be an **`instagram.com` URL**. Any other link — YouTube, TikTok, Facebook, or a raw CDN file URL — is rejected with a message telling you what the Actor accepts. Everything else is optional.

| Field | Type | Description |
|-------|------|-------------|
| `urls` | array | **Required.** One or more Instagram post, reel, or share URLs. `instagr.am` and `ig.me` short links are accepted too |
| `maxAudioMinutes` | integer | Maximum source length in minutes. Longer posts fail before any cost is incurred. Default: `600` (10 h). Max: `600` |
| `diarize` | boolean | Label different speakers in the transcript (default: `true`) |
| `smartFormat` | boolean | Format dates, times, numbers, and punctuation (default: `true`) |

There is no proxy setting to configure — the Actor manages all network routing automatically, and that bandwidth is included in the per-second price.

Example input:

```json
{
    "urls": ["https://www.instagram.com/reel/DAbc123XyZ/"],
    "diarize": true,
    "smartFormat": true
}
```

### Output

Every post — one or many — pushes its own record to the Dataset, visible in the **Output** tab and via the dataset API. A single-post run also stores two files in the Key-Value Store:

- **`transcript.txt`** — Formatted transcript with speaker labels and paragraphs
- **`transcript.json`** — Raw transcription response with word-level timings and full metadata

Dataset record example:

```json
{
    "sourceType": "platform",
    "videoUrl": "https://www.instagram.com/reel/DAbc123XyZ/",
    "videoId": "3512345678901234567",
    "title": "3 things I wish I knew before starting a coffee business ☕️",
    "channel": "Maya Chen",
    "channelUrl": "https://www.instagram.com/mayabrews",
    "uploadDate": "2026-03-04",
    "viewCount": 812443,
    "thumbnail": "https://scontent.cdninstagram.com/v/.../display.jpg",
    "model": "nova-3",
    "language": "en",
    "diarize": true,
    "durationSeconds": 58.4,
    "transcript": "[Speaker 0] Three things I wish I knew before I opened my first coffee shop...",
    "transcriptLength": 1180,
    "speakerCount": 1,
    "transcriptStatus": "ok",
    "statusMessage": null
}
```

Example transcript output for a two-person reel:

```
[Speaker 0] Welcome back. Today we are testing five espresso machines under 500 dollars.

[Speaker 1] And I am the one who has to drink all of them.

[Speaker 0] Let's start with the one everybody keeps asking about.
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Output data fields

| Field | Type | Description |
|-------|------|-------------|
| `sourceType` | string | Always `"platform"` |
| `videoUrl` | string | The Instagram URL you submitted |
| `videoId` | string | Instagram post ID |
| `title` | string | The post caption |
| `channel` | string | Creator's display name, or username when no display name is set |
| `channelUrl` | string | URL of the creator's Instagram profile |
| `uploadDate` | string | Date the post was published |
| `viewCount` | integer | Video view count at the time of transcription |
| `thumbnail` | string | URL of the post's display image |
| `model` | string | AI model used for transcription |
| `language` | string | Auto-detected spoken-language code |
| `diarize` | boolean | Whether speaker labelling was applied |
| `durationSeconds` | number | Audio duration in seconds |
| `transcript` | string | Full formatted transcript with speaker labels |
| `transcriptLength` | integer | Character count of the transcript |
| `speakerCount` | integer | Number of distinct speakers detected (1 if diarization is off) |
| `transcriptStatus` | string | `"ok"`, or a short reason code when no transcript could be produced |
| `statusMessage` | string | Plain-English explanation when `transcriptStatus` is not `"ok"` |

### Use it in your Instagram scraping pipeline

If you already scrape Instagram — with [apify/instagram-scraper](https://apify.com/apify/instagram-scraper), another Store Actor, or your own tool — you do not need this Actor to *find* the reels. It becomes the transcription stage at the end of your pipeline.

Feed the post `url`s your scraper collected into `urls`:

```jsonc
// POST https://api.apify.com/v2/acts/hgservices~instagram-ai-transcript-scraper/runs?token=<APIFY_TOKEN>
{
    "urls": ["https://www.instagram.com/reel/DAbc123XyZ/"]
}
```

**Pass the post URL, not the video file URL.** Even when your scraper already returned a `cdninstagram.com` link, hand over the post URL. Instagram's media links are signed and expire within hours, so a saved file link has usually failed by transcription time — the post URL always works.

You can wire this together without code using Apify [webhooks](https://docs.apify.com/platform/integrations/webhooks) — fire this Actor on your scraper's `SUCCEEDED` event and map each scraped URL into `urls`.

### Languages

The spoken language is **detected automatically on every run** — useful on Instagram, where a creator's audio language often differs from their profile or caption language. There is nothing to set: a wrong language code can never silently empty your transcripts.

**Difficult audio is retried automatically.** If a first pass returns an empty transcript, the Actor retries once on a broader multilingual model before giving up — recovering non-English or low-quality audio without any setting change. If a transcript is still empty after that retry, the reel almost certainly has no transcribable speech — it is music, singing, or ambient sound.

### Pricing / cost estimation

**Two events: a flat per-video fee, then per-second transcription.** Every post that enters processing bills a small flat fee; when the transcript is delivered, you also pay for the length of the video. There is no per-run fee, and no Apify compute units, proxy bandwidth, or AI API charges to track separately.

| Event | Price (USD) | When charged |
|-------|------------|--------------|
| Video processed | $0.005 | Once per video, when its processing starts — before the download. Billed even if the post later cannot be downloaded or exceeds your `maxAudioMinutes` cap |
| Second of video transcribed | $0.00025 | Per second of the video's length, rounded up, with a **30-second minimum** per post. Charged only after the transcript is delivered |

That works out to **$0.015 per minute** plus the flat fee, and **$0.0125** all-in for anything up to 30 seconds. Because most reels run well under a minute, per-second billing costs less than the per-minute rounding it replaces.

**What is free.** A missing or non-Instagram URL is rejected before any charge — it costs nothing. A post that cannot be downloaded, a private or deleted post, and a video that exceeds your `maxAudioMinutes` cap pay **only the $0.005 flat fee**, with no per-second charge. A photo or image-only carousel bills the flat fee plus the 30-second minimum, because the Actor still had to fetch and inspect the post to discover there was no video.

**No third-party charges.** The two events above are the entire bill — downloads, network routing, and AI transcription are all included, and nothing is billed by any other Actor or service.

**Example costs** (flat fee + per-second charge):

| Reel length | Billed as | Total cost |
|------------:|----------:|-------------------:|
| 0–30 s | 30 s (minimum) | $0.0125 |
| 45 s | 45 s | $0.016 |
| 1 min | 60 s | $0.02 |
| 3 min | 180 s | $0.05 |
| 10 min | 600 s | $0.155 |
| 60 min (long video) | 3,600 s | $0.905 |

At **$0.0125 per short reel**, $1 transcribes roughly 80 of them.

The default `maxAudioMinutes` cap of 600 minutes (10 h) is also the transcription engine's per-request ceiling, so it is the longest video one run can handle. Lower it if you want tighter cost control. Videos over the cap stop **before** the per-second charge — only the flat per-video fee is billed.

**Trying it for free** — New Apify accounts include free monthly platform credits, enough to transcribe several hundred reels before any out-of-pocket cost.

### Tips

- **Paste the post URL** — the Actor resolves the video file itself, so a CDN link is never needed (and is rejected)
- **Batch with `urls`** — one run can transcribe many posts, each with its own dataset row
- **Turn off `diarize`** for single-creator talking-head reels to shave a little processing time
- **Lower `maxAudioMinutes`** when running on a schedule to cap worst-case cost per run
- **Check `transcriptStatus` in the dataset**, not just the run status — a run that could not deliver a transcript still finishes as *Succeeded* and explains why in `statusMessage`

### Troubleshooting: common errors and what to do

**First, where to look.** A run that cannot produce a transcript still finishes as **Succeeded**, so it never counts as a platform failure. The reason is written to the run's **status message** and to the `statusMessage` / `transcriptStatus` fields of the dataset record, with an empty `transcript`. If you got no text, open the run and read the status message — it names the cause and the fix.

| Message you'll see | What it means | What to do |
|--------------------|---------------|------------|
| **"This post contains no video or audio to transcribe…"** | The post is a photo or an image-only carousel. There is no audio track. | Submit a reel or a post that contains a video. The run bills the 30-second minimum, because the Actor still fetched and inspected the post. |
| **"Instagram couldn't return this post — it may be private, removed, or age/region restricted"** | Instagram refused the post. | Use a public post. The Actor downloads without logging in and cannot see private, deleted, or restricted content. |
| **"This content requires a logged-in account…"** | A login or audience wall — including "close friends" and audience-restricted posts, which look public to some accounts only. | Use a fully public post. |
| **"This Actor transcribes Instagram posts only — … is not an Instagram address"** | You submitted a link that is not on `instagram.com`. | Submit an Instagram post URL. For YouTube, TikTok, Facebook, podcasts, or a direct media file, use the general [Speech-to-Text Transcription](https://apify.com/hgservices/speech-to-text) Actor. |
| **"Instagram returned HTTP 403 for this CDN link"** | The video link the Actor resolved from the post expired or was rejected mid-download. | Retry the run. A fresh link is minted each time. |
| **"Couldn't extract audio from this Instagram CDN file"** | Instagram returned a fragmented (DASH) stream carrying only part of the media. | Retry the run; if it persists on one specific post, report it via the Issues tab. |
| **"Transcription returned no text…"** | No speech was recognized. The multilingual retry already ran. | The audio is almost certainly music, singing, or ambient sound. |
| **"Source duration … exceeds the configured maxAudioMinutes cap"** | The video is longer than your cap. Only the flat per-video fee is billed — no per-second charge. | Raise `maxAudioMinutes` (up to 600). |
| **"Missing input"** | No URL was provided. | Paste one or more Instagram post URLs into `urls`. |

**Still stuck?** If this guide does not resolve your problem, contact the creator directly at **<harish@harishgarg.com>**. Include the Instagram link you tried and the status message you saw.

### FAQ, disclaimers, and support

**Does it work on private Instagram accounts?** No. The Actor downloads anonymously and cannot log in, so it sees only public posts. Posts limited to "close friends" or specific audiences also fail, even though they look public to some viewers.

**Can it transcribe Instagram Stories?** No. Stories require an authenticated session.

**What about photo posts and carousels?** A carousel is transcribed if any slide contains a video. Photo-only posts and image carousels have no audio track, so the run reports `no_media` with a clear message.

**Can I transcribe many reels at once?** Yes — pass them all in the `urls` array of a single run and each post writes its own dataset item. For very large batches, start one run per URL through the API or a Schedule; runs execute in parallel.

**How accurate is it?** Transcription uses a top-tier commercial speech model with speaker diarization and smart formatting. Clear talking-head reels transcribe near-verbatim. Heavy background music, crosstalk, and strong audio effects reduce accuracy, as they do for any speech model.

**Why is my transcript empty?** No speech was recognized. The Actor already retries on a broader multilingual model before reporting empty, so a persistently empty result almost always means music, singing, or silence.

**Is this Actor legal to use?** You are responsible for complying with Instagram's Terms of Service and with applicable copyright and privacy law. Only transcribe content that is publicly available and that you have the right to use. Transcripts of public content are generally used for research, accessibility, and analysis — how you use them is your responsibility.

For issues, feature requests, or feedback, use the **Issues** tab on this Actor's page. For custom solutions or enterprise needs, contact the creator at **<harish@harishgarg.com>**.

# Actor input Schema

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

One or more public Instagram Reel, video post, or carousel URLs to transcribe — for example https://www.instagram.com/reel/ABC123/ or https://www.instagram.com/p/ABC123/. Share and short links (instagr.am, ig.me) work too. Each URL produces its own dataset row with its transcript. Only Instagram links are accepted; photo-only posts, Stories, and private posts cannot be transcribed.

## `maxAudioMinutes` (type: `integer`):

Maximum length (in minutes) of audio to transcribe. Longer posts fail before any cost is incurred. Default is 600 (10 hours), which is also the transcription engine's per-request ceiling. Lower it to cap the worst-case cost of a run.

## `diarize` (type: `boolean`):

Identify and label different speakers in the audio. Useful for interview, duet, and podcast-clip reels; you can turn it off for single-creator talking-head reels.

## `smartFormat` (type: `boolean`):

Apply formatting to dates, times, numbers, and punctuation

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/p/DBtoUg9OoYX/"
  ],
  "maxAudioMinutes": 600,
  "diarize": true,
  "smartFormat": true
}
```

# Actor output Schema

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

No description

## `transcriptFiles` (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/p/DBtoUg9OoYX/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/instagram-ai-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/p/DBtoUg9OoYX/"] }

# Run the Actor and wait for it to finish
run = client.actor("hgservices/instagram-ai-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/p/DBtoUg9OoYX/"
  ]
}' |
apify call hgservices/instagram-ai-transcript-scraper --silent --output-dataset

```

## MCP server setup

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