Quarra
Guide · Instagram

Instagram reel transcripts: what Meta's API gives, and the traps of doing it with Whisper

Instagram has no transcript API, so every reel has to go through speech-to-text. What Meta's API returns, what plain Whisper wrote on reels without speech and on a reel in Hindi, and how to get clean transcripts.

Checked against Meta's Instagram Platform reference and measured on October 10, 2026.

The short answer

Instagram has no transcript API. Meta's Instagram API returns a reel's caption, counts and video file for professional accounts, never the words spoken in it, and Instagram does not show its automatic captions to visitors. To get a reel's text, you download its audio and run it through speech-to-text. Done naively, that has a cost: on reels without speech, Whisper writes “Thank you.” or “I love you.”, and on a reel in Hindi it wrote an English text that nobody said. A transcript scraper that checks for both is the shortcut.

What Meta's API gives you

We read the IG Media reference of the Instagram Platform (API v25.0) on October 10, 2026. None of a media object's fields holds speech. The closest ones:

FieldWhat it is
captionThe text the author typed under the post, not what is said in the video.
media_audio_typeMUSIC or ORIGINAL_SOUND: a category, no text.
alt_textDescriptive text for images, for accessibility.
media_urlThe video file, “omitted from responses if the media contains copyrighted material”, such as licensed music in a reel.

The API also “returns only data for media owned by Instagram professional accounts”, with a token of an account that authorised your app. It fits a brand reading its own reels. For other people's reels, or a personal account's, it has nothing, and for nobody's reels does it have the words.

Doing it yourself: yt-dlp and Whisper

The open-source downloader yt-dlp reads a public reel without signing in and can save its audio. On October 10, 2026, with version 2026.08.19, it reported “has no subtitles” for every reel we tried: there are no captions to download, so the audio has to be transcribed.

yt-dlp -x --audio-format m4a -o "%(id)s.%(ext)s" https://www.instagram.com/reel/DeLouxeNKfy/

Then send the file to a speech-to-text model. We used OpenAI's Whisper large-v3 turbo, run by Groq, with its default settings, as most tutorials do. On a French reel it was right:

La jeunesse allemande, on a besoin de vous. Aujourd'hui, le monde entier se révolte…

On other reels from the same sample, it was not.

Two traps, measured

Text on reels without speech

Whisper always returns something. On reels where our scraper found no clear speech, only music or sounds, it returned:

ReelLengthWhat Whisper wrote
CyHo1Nqsdcu17 sThank you.
DdxbAA0z-nv21 sI love you.
Dc2GOXYBoDJ25 sThe The The
DeFWW8RxCb940 sIt's me Thank you.
DeM5rh7NjxY95 sguitar solo Thank you. guitar solo We'll be right back.

These phrases most likely come from the subtitles Whisper was trained on, which often end with a thank-you or a channel's sign-off. Researchers have documented the effect (Koenecke et al., Careless Whisper, ACM FAccT 2024). In a pipeline, each one is a short, wrong transcript, and an LLM downstream will read it as speech.

An English text for a reel in Hindi

Reel DdRBIwFypHx is 170 seconds of Hindi. Without a language set, Whisper decided it was English and wrote: “I will be here. Where are you? I will be here. You are a little bit of a picture.” None of this is said in the reel. Whisper can only translate into English, and when it mistakes a language for English it produces a translation, or an invention, instead of a transcript. With language set to Hindi it wrote Devanagari, which means knowing each reel's language before you send it.

Filtering those out by hand takes rules: a list of known phantom phrases, Whisper's confidence per segment, how much of the reel the speech covers, and a second opinion on the language when the author's caption suggests another one.

Getting transcripts with our Actor

The Instagram Transcript Scraper takes reel, video post and carousel links, or accounts, and returns one record per video. It applies those checks: a reel without clear speech comes back as a free no_speech record instead of a phantom phrase, and a reel whose language cannot be settled comes back as a free uncertain_language record, never as a translation.

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/instagram-transcript-scraper").call(run_input={
    "urls": [
        "https://www.instagram.com/reel/DeHzCJwtTZQ/",
        "https://www.instagram.com/reel/DeLouxeNKfy/",
        "https://www.instagram.com/reel/CyHo1Nqsdcu/",
    ],
})
for reel in client.dataset(run.default_dataset_id).iterate_items():
    if reel["status"] == "ok":
        print(reel["videoId"], reel["language"], reel["billedMinutes"], "min:", reel["transcript"][:50])
    else:
        print(reel["videoId"], reel["status"], reel.get("missingReason") or reel.get("errorCode"))

Tested with apify-client 3.3 on October 10, 2026, in an 18-second call. It printed:

DeHzCJwtTZQ en 1 min: I'm here with the legend, Dawn Saley. I gotta have
CyHo1Nqsdcu missing no_speech
DeLouxeNKfy fr 1 min: La jeunesse allemande, on a besoin de vous. Aujour

The third reel is the one Whisper heard as “Thank you.”: free, with its reason. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

What comes back

Each record has the transcript as plain text and as timestamped segments, the language spoken, the minutes billed, and the post's account, date, likes, comment count, caption, hashtags and sound. SRT and VTT files are one option away. A carousel gives one record per video. Records without a transcript say why: no_speech, uncertain_language, a photo post, a deleted or age-restricted reel.

Limits

  • An account gives its 12 latest posts, which is what Instagram shows without signing in. For older reels, paste their links.
  • The no-speech check keeps a margin: a short exclamation, distant speech or a narration over loud music can come back as no_speech. They are free, and a link to such a reel is welcome in the Actor's issues.
  • Private accounts and age-restricted reels need a signed-in account; we do not use one, so they come back as free error records.
  • Speech-to-text, not captions: punctuation and names are the model's, and speakers are not named.

What it costs

$0.001 per transcript plus $0.0045 per started minute of video on Apify's free plan ($0.0034 a minute on Gold and above), and a start fee of $0.004 per run at the default memory. Reels without speech, errors and duplicates are free. The three reels above cost $0.015: two transcripts of one minute each and the start fee.

Run it on the Apify Store

Transcripts cost $0.001 each plus $0.0045 per started minute of video on the Free plan (less on paid plans), plus $0.004 per run; reels without speech are free. Errors and empty results are not charged, and you can set a maximum cost per run.