Instagram Reel Transcript Scraper · Handle or URL · From $3/1k avatar

Instagram Reel Transcript Scraper · Handle or URL · From $3/1k

Pricing

from $3.00 / 1,000 transcript minutes

Go to Apify Store
Instagram Reel Transcript Scraper · Handle or URL · From $3/1k

Instagram Reel Transcript Scraper · Handle or URL · From $3/1k

Instagram Reel transcript scraper: give creator handles, Reel URLs or another scraper's dataset and get the spoken text, timestamped segments, SRT and VTT files, the first-3-second hook, creator and caption. On-device Whisper, so uncaptioned Reels work. No login. From $3 per 1,000 Reels.

Pricing

from $3.00 / 1,000 transcript minutes

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

87

Total users

61

Monthly active users

9 days ago

Last modified

Share

Instagram Reel Transcript Scraper — Reels to Text, SRT & VTT

Get an accurate Instagram reel transcript from any public Reel URL, or from a creator's handle. Paste one link, a whole batch, or a list of handles and this Instagram reel transcript extractor returns one row per Reel: the full spoken text, subtitle-style timestamped segments, ready-made SRT & VTT caption files, and creator metadata such as username, caption, likes and comments. On-device Whisper speech-to-text means you get text even when the creator never added captions. No login, 30+ languages, JSON or CSV out. From $0.003 per Reel: billed per started minute of video at $0.003, minimum 1 minute, capped at 5 minutes ($0.015) per Reel, plus a $0.01 start per run at the default 2 GB. A Reel that fails, is skipped, or holds no speech (music, silence) is never charged.

Why use this Instagram Reel Transcript Scraper?

  • Works on Reels with no captions — Instagram exposes no caption track to the public, so the actor downloads each Reel's audio and transcribes the actual speech with Whisper. Captioned or not, you get the text.
  • Transcribe a creator from their handle — put nasa or @nasa in handles and the actor lists that creator's latest Reels (12 by default, set by maxReelsPerProfile) and transcribes them. No need to collect Reel URLs first.
  • Batch runs are native — paste 5 or 500 Reel URLs into a single run and get one clean dataset back, instead of starting a separate run per link.
  • Subtitle files with every row — full srt and vtt text plus direct .srt / .vtt download links, ready for any editor.
  • Timestamped segments — a segments array (start, end, text) for hook analysis, jump-to-moment links or custom captions.
  • No Instagram login or cookies — works on any public Reel URL, nothing to configure.
  • 30+ languages — set the spoken language or let Whisper detect it per Reel.
  • Per-minute pricing with a hard cap — $0.003 per started minute, minimum 1, and never more than 5 minutes ($0.015) per video. A typical 30-second Reel is one minute. Nothing is charged for a Reel that fails, is private, or is skipped by your duration limit.
  • Music-only Reels are not charged — speech models invent filler over music ("Thank you.", "♪", "Subtitles by the Amara.org community"). A transcript made only of that, in any language, comes back as a status: "no_speech" row with an empty transcript and charged: false.
  • The hook on every row — hook3s is the first 3 seconds of speech and hookStartSeconds says when the talking starts, so a creator's openers compare side by side without reading transcripts.
  • Chain any Instagram scraper — pass a finished run's datasetId (or paste rows in datasetItems) and every Reel URL in those rows is transcribed; the row shape does not matter.
  • Scheduled runs bill only what is new — name a watchlistId and switch on newReelsOnly; a Reel transcribed on an earlier run is left out and never charged twice.
  • Every miss on the record — asked = delivered + reported. What was not delivered is in the run's ERRORS record with a reason and what to change, and the status line reconciles the count.

What does it do?

Give it a list of Instagram Reel URLs, creator handles, or both. A handle is first expanded into that creator's latest Reels. For each Reel the actor:

  1. Resolves the public Reel and its metadata (cookieless).
  2. Downloads the audio.
  3. Runs on-device Whisper speech-to-text.
  4. Pushes one row: metadata + full transcript + timestamped segments + SRT/VTT files.

Supported input

InputExample
Reel URLhttps://www.instagram.com/reel/Dabg9j1xNHM/
Reels URLhttps://www.instagram.com/reels/Dabg9j1xNHM/
Creator handlehandles: ["nasa", "@natgeo", "https://www.instagram.com/nasa/"]: the latest maxReelsPerProfile Reels of each
Chained datasetdatasetId: "nGkT…" — the default dataset of a finished Instagram Reel Scraper, Reels Search or Hashtag Scraper run
Pasted rowsdatasetItems: [ { "url": "https://www.instagram.com/reel/…" } ]

Only /reel/ and /reels/ links are transcribed from startUrls; a profile link there is not expanded (put it in handles), and a post (/p/) or IGTV (/tv/) link is reported as not_a_reel and lives in Instagram Transcript Scraper. Chained rows are deep-scanned, so it does not matter which field holds the link.

Scheduled runs: a Reel is never billed twice

Give the run a watchlistId (letters, numbers, hyphens, underscores; for example nasa-daily) and switch on newReelsOnly. The actor keeps the shortcodes it has transcribed in a named key-value store under that id; every later run with the same id leaves those Reels out of the work and the dataset, so a schedule that re-feeds the same profile or hashtag pays only for what is new. The watchlist uses the same record as Instagram Transcript Scraper, so one id can serve both actors. A run whose input is entirely on the watchlist finishes with "Nothing new" and charges nothing but the run start.

What was not delivered, and why

Every Reel the input asked for ends as a dataset row or as an entry in the run's ERRORS record (key-value store), never neither. A Reel that was not delivered also gets an uncharged row in the dataset with its status set to the reason and an error saying what to change, so an integration that reads only the dataset (the API, Make, n8n) sees it too. The record is written on every run, with an empty items list when everything was delivered, so an integration can read it unconditionally. Each entry carries a reason, a plain-language detail saying what happened and what to change, and a retryable flag:

reasonWhat happenedRe-run as-is?
not_a_reelA post, IGTV, profile or other non-Reel linkNo — use the Instagram Transcript Scraper for posts
private_or_goneInstagram would not serve the Reel to a logged-out client: private, deleted, region-locked. Also a handle whose profile is private or does not existNo
bad_handleAn entry in handles that is not a username or profile URLNo — fix the handle
no_reelsA handle whose profile has no public ReelsNo
no_audioAn image post; nothing to transcribeNo
no_speechThe audio holds no speech: music, silence or noise. Its row is in the dataset with status: "no_speech" and is not chargedNo
too_longOver your maxDurationSec (a value from 1 to 9 would skip every Reel, so the run uses the default 300 instead and says so)Raise the limit, or set 0 to turn it off
transportThe fetch failed on the network after retries on fresh proxy exitsYes, in a few minutes
transcription_failedWhisper or the audio download failedYes
budget_capmaxItems was reached before this Reel's turnRaise maxItems
deadlineNot started, or stopped mid-transcription, because the run was about to hit its timeout. The run ends with its report instead of being killedRaise the run timeout or split the list

The run's status line carries the same arithmetic, for example "Delivered 9 of 10 reels. 1 not delivered and not charged: 1 private, removed or not found — see the ERRORS record." A run that delivers nothing because every fetch failed on the network is marked FAILED so it stands out in your run list; a run whose misses describe the Reels themselves finishes SUCCEEDED.

Use cases

  • Hook analysis — read the first two seconds of speech across dozens of Reels and see exactly which openers stop the scroll.
  • Creator & competitor research at scale — batch-transcribe a creator's whole grid and search the talking points, CTAs and product mentions as text.
  • Caption files for editing — drop the ready .srt / .vtt files straight into CapCut, Premiere, DaVinci Resolve or Instagram's own caption upload.
  • Translation & repurposing — turn winning Reels into blog posts, newsletters, scripts for other platforms, or translated re-records.
  • LLM content pipelines — clean, timestamped text for RAG indexes, fine-tuning datasets and agent workflows.

How it works

The actor uses yt-dlp to resolve each public Reel and pull its audio without any login, then transcribes the audio locally with faster-whisper (a fast CTranslate2 build of OpenAI Whisper). Transcription runs inside the actor itself: there is no external transcript API in the loop, so nothing can run out of credits or throttle your batch mid-run, and your audio never leaves the container. Instagram traffic is routed through residential proxies by default.

Input configuration

FieldTypeDefaultDescription
startUrlsarray—Instagram Reel URLs (/reel/ or /reels/) to transcribe.
handlesarray—Creator usernames (nasa, @nasa) or profile URLs. Each creator's latest Reels are listed and transcribed.
maxReelsPerProfileinteger12How many of each creator's most recent Reels to transcribe (1–200). Instagram may list pinned Reels first. maxItems still caps the run.
datasetIdstring—Default dataset of a finished Instagram scraper run; every Reel URL in its rows is transcribed.
datasetItemsarray—Rows pasted from a scraper instead of chaining by id.
watchlistIdstring—Named memory for scheduled runs; see above.
newReelsOnlybooleanfalseLeave out Reels already on the watchlist. Needs watchlistId.
whisperModelselecttinytiny (fast, reliable), base or small (more accurate, slower).
languagestringautoISO code (en, es, ar, …) or auto to detect per Reel.
includeSegmentsbooleantrueInclude the segments array of timestamped chunks.
maxItemsinteger25Maximum Reels to transcribe this run, URLs and handle Reels together.
maxDurationSecinteger300Skip videos longer than this (compute guard). 0 disables.
maxConcurrencyinteger2Reels transcribed in parallel (1–4).
proxyobjectResidentialProxy configuration.

Example input

{
"startUrls": [
{ "url": "https://www.instagram.com/reel/Dabg9j1xNHM/" }
],
"whisperModel": "tiny",
"language": "auto",
"includeSegments": true,
"maxItems": 25
}

By handle, the latest 5 Reels of two creators:

{
"handles": ["nasa", "@natgeo"],
"maxReelsPerProfile": 5,
"maxItems": 10
}

What a run costs

Each delivered transcript is billed at $0.003 per started minute of video, minimum 1 minute, capped at 5 minutes. The only other charge is the run start: $0.0001 per GB of run memory, so $0.0002 per run at the default 2 GB, charged once however many Reels the run holds. Batch your Reels into one run and the start fee spreads over all of them. Whisper runs on the run's own compute, so Apify platform usage applies as on any actor; there is no third-party transcription API to pay for.

Reel lengthBilled minutesTranscript charge
12 s1$0.003
58 s1$0.003
2:303$0.009
4:10 or longer5 (cap)$0.015
100 Reels averaging 45 s100$0.30 (+ one $0.0002 run start)

A Reel that cannot be fetched, is private, has no audio, or exceeds maxDurationSec produces no transcript and no charge; its row carries the reason in status and what to change in error.

Output

One row per Reel. Example (abridged):

{
"id": "Dabg9j1xNHM",
"shortcode": "Dabg9j1xNHM",
"url": "https://www.instagram.com/reel/Dabg9j1xNHM/",
"username": "nasaadmin",
"userId": "79712351002",
"fullName": "NASA Administrator Jared Isaacman",
"caption": "For 250 years, America has inspired generations to dream bigger…",
"durationSec": 58,
"thumbnailUrl": "https://instagram.f…/735552979_….jpg",
"timestamp": 1783294802,
"uploadDate": "20260705",
"likeCount": 56053,
"commentCount": 1923,
"viewCount": null,
"isVideo": true,
"transcript": "For 250 years, the United States of America has been the hope, the promise, the light and the glory of all the nations of the world…",
"language": "en",
"hook3s": "For 250 years, the United States of America has been the hope",
"hookStartSeconds": 0.46,
"segments": [
{ "start": 0.46, "end": 5.46, "text": "For 250 years, the United States of America has been the hope" }
],
"srt": "1\n00:00:00,460 --> 00:00:05,460\nFor 250 years, the United States of America has been the hope\n",
"vtt": "WEBVTT\n\n00:00:00.460 --> 00:00:05.460\nFor 250 years, the United States of America has been the hope\n",
"srtFileUrl": "https://api.apify.com/v2/key-value-stores/…/records/Dabg9j1xNHM.srt",
"vttFileUrl": "https://api.apify.com/v2/key-value-stores/…/records/Dabg9j1xNHM.vtt",
"billedMinutes": 1,
"status": "ok",
"charged": true,
"transcriptSource": "whisper",
"whisperModel": "tiny",
"transcribedAt": "2026-07-15T09:49:00.990Z"
}

Key output fields

FieldDescription
transcriptFull spoken text of the Reel.
hook3s / hookStartSecondsThe first 3 seconds of speech, and when speech starts; empty when the Reel opens silent.
segmentsArray of {start, end, text} timestamped chunks (subtitle-ready).
srt / vttThe transcript as ready-made SubRip and WebVTT subtitle text.
srtFileUrl / vttFileUrlDirect download links to the .srt / .vtt files.
billedMinutesMinutes billed for this Reel (per started minute, min 1, max 5); 0 on a no_speech row.
status / chargedok and true for a billed transcript. Anything else is an uncharged row with charged: false: no_speech for music, silence or noise, or the reason a Reel was not delivered (too_long, private_or_gone, no_audio, deadline, transport, transcription_failed, not_a_reel, budget_cap) with error saying what to change.
languageDetected (or specified) spoken language.
username / fullNameCreator handle and display name.
captionThe Reel's written caption.
likeCount / commentCountEngagement metrics when available.
durationSecVideo length in seconds.
transcribedAtUTC timestamp of transcription.

FAQ

How is it billed? $0.003 per started minute of video, minimum 1 minute per Reel, plus one $0.0002 run start (2 GB) per run. A 20-second Reel bills 1 minute; a 3:10 Reel bills 4. Billing is capped at 5 minutes per video, so even a very long video never bills more than 5 minutes. Skipped items (private, image-only, over your duration limit) are never charged.

Can I feed it the output of another scraper? Yes. Put the finished run's default dataset id in datasetId (or paste rows into datasetItems); every field is scanned for Reel links. On a schedule, add a watchlistId with newReelsOnly so the same Reels are not transcribed and billed again.

Can I transcribe many Reels in one run? Yes, batching is native. Paste any number of Reel URLs and the run returns one combined dataset. Competing actors take one URL per run, which turns a 50-Reel job into 50 runs.

Can I give a creator's handle instead of Reel URLs? Yes. Put usernames in handles and set maxReelsPerProfile (default 12). The actor lists each creator's most recent Reels and transcribes them; billing is the same per-minute rate. Instagram floats pinned Reels to the top of a profile, so a pinned older Reel can be among them. A private or missing profile is reported and costs nothing.

Do I need an Instagram account or cookies? No. The actor works on public Reels without any login.

Can I get subtitle files? Yes. Every row carries the full srt and vtt text plus srtFileUrl / vttFileUrl download links you can drop straight into CapCut, Premiere, DaVinci Resolve or Instagram's caption upload.

Why not just read Instagram's captions? Instagram does not expose a caption track to logged-out clients. This actor transcribes the actual audio, so you get text even for Reels the creator never captioned.

Does it depend on an external transcription service? No. Whisper runs inside the actor on Apify's own compute, so there is no third-party transcript API that can run out of credits, change pricing or throttle your batch mid-run.

What about regular posts or IGTV? This actor is Reels-only by design. For /p/ posts and /tv/ IGTV use Instagram Transcript Scraper, which covers all three formats.

Which languages are supported? 30+ via Whisper. Set language for best speed and accuracy, or use auto.

Why is tiny the default model? It is the fastest and reliable on Apify's CPU. base takes about twice as long and small about four times as long. A Reel that runs out of time on base or small is transcribed again on tiny instead of failing. When the same account's Reels run out of time twice, that account's other Reels in the run go straight to tiny, so the run doesn't spend the full time limit on each of them first. The row's whisperModel says which model produced the transcript, and whisperModelRequested is set when it differs from what you picked. More memory gives the slower models more CPU, so fewer Reels fall back.

Support

Additional Services

Need something beyond the standard output? I build and maintain custom scrapers and data pipelines. Happy to help with:

  • Transcripts from other platforms (TikTok, YouTube, Douyin) in the same output shape
  • Scheduled, incremental transcript feeds wired into your CMS, data warehouse, or vector store
  • Custom fields, summaries, translations, or export formats tailored to your workflow
  • Private or dedicated actors for high-volume or compliance-sensitive use

Reach out via the Issues tab or email and describe what you need.

Explore More Scrapers

More of my actors in the same space:

Browse the full catalog of job boards, business directories, review sites and social platforms on my profile: memo23 on Apify.

🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/instagram-reel-transcript-scraper).

Purpose: Transcribe public Instagram Reels to text with on-device Whisper AI, returning one row per Reel with metadata plus a full transcript, timestamped segments and SRT/VTT subtitle files.

Minimal input:

{
"startUrls": [
{ "url": "https://www.instagram.com/reel/Dabg9j1xNHM/" }
],
"maxItems": 5
}

Output: one row per Reel — id, shortcode, url, username, userId, fullName, caption, durationSec, thumbnailUrl, timestamp, uploadDate, likeCount, commentCount, viewCount, isVideo, transcript, language, segments [{ start, end, text }], hook3s, hookStartSeconds, srt, vtt, srtFileUrl, vttFileUrl, billedMinutes, status, charged, transcriptSource, whisperModel (the model that produced the transcript), whisperModelRequested (only when tiny took over from a slower model that ran out of time on this Reel or on two earlier Reels from the same account), transcribedAt.

Behaviors an agent should know:

  • Only public /reel/ and /reels/ URLs work; posts (/p/) and IGTV (/tv/) are skipped with a pointer to memo23/instagram-transcript-scraper.
  • Always set maxItems; transcription is the slow, billed step, so start small.
  • Billing is per started minute of video (billedMinutes in each row): minimum 1, hard cap 5 per video. Skipped items are not charged.
  • Batch URLs freely; one run handles the whole list.
  • To transcribe a creator, pass handles: ["nasa"] with maxReelsPerProfile (default 12) instead of Reel URLs; maxItems still caps the run.
  • whisperModel is tiny (default, fastest) / base / small; base/small are more accurate but slower. A Reel that runs out of time on them falls back to tiny and the row says so.
  • language accepts an ISO code (en, es, ar) or auto; setting it is faster and more accurate than auto-detect.
  • maxDurationSec (default 300) skips videos longer than the limit; includeSegments toggles the timestamped segments array.

⚠️ Disclaimer

This actor collects only publicly available data from Instagram and is intended for lawful uses such as research, accessibility and content analysis. You are responsible for how you use the output, including compliance with Instagram's Terms of Service, applicable copyright, and data-protection laws (e.g. GDPR/CCPA) where relevant. Do not use transcripts to infringe copyright or process personal data unlawfully.

SEO Keywords

Instagram reel transcript, reel to text, Instagram reel transcript extractor, reel transcript API, transcribe Instagram reels, Instagram reels to text converter, reel speech to text, Instagram reel captions extractor, reel subtitles generator, reel SRT file, reel VTT subtitles, Whisper Instagram transcription, Instagram reel audio to text, bulk reel transcription, Instagram reel hook analysis, extract text from Instagram reels, Instagram video transcription API, Instagram content analysis, reel transcription for LLMs, Instagram NLP dataset, influencer content research, no-code Instagram reel scraper.