Instagram Reels Transcript - Reel to Text & SRT avatar

Instagram Reels Transcript - Reel to Text & SRT

Pricing

from $34.00 / 1,000 transcript from whisper speech-to-texts

Go to Apify Store
Instagram Reels Transcript - Reel to Text & SRT

Instagram Reels Transcript - Reel to Text & SRT

Transcribe public Instagram Reels to text, timestamped segments, SRT and VTT. Instagram publishes no caption track, so every Reel is transcribed with Whisper speech-to-text — which is exactly why Reels without captions still come back as text. Public content only: no login, no cookies.

Pricing

from $34.00 / 1,000 transcript from whisper speech-to-texts

Rating

0.0

(0)

Developer

Saulius Saulenas

Saulius Saulenas

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

4 days ago

Last modified

Share

Instagram Reels Transcript — Reel to text & SRT

Turn public Instagram Reels into transcripts, timestamps, SRT and VTT.

Paste Reel links, get the words back. Every Reel returns plain text, timestamped segments, a ready-to-use .srt subtitle file, a .vtt file, and the metadata Instagram makes public: account, caption, hashtags, duration, detected language.

Instagram does not publish a caption track to anyone who is not signed in — not through the embed player, not through its web API, not on the Reel page itself. Tools that read caption tracks therefore return nothing for Reels. This Actor transcribes the audio instead, with Whisper speech-to-text, which is why it returns a transcript for Reels that have no captions at all.

  • No API key, no login, no cookies. Public Reels only.
  • 90+ languages, detected automatically. Measured across a 50-Reel test set: English, Spanish, Arabic and French all came back correctly labelled.
  • Bulk-safe. One dead link never breaks the rest of the run.
  • You only pay for delivered transcripts. Failures, private Reels, music-only Reels and over-length Reels are free.

What it handles

InputSupported
instagram.com/reel/SHORTCODE/
instagram.com/reels/SHORTCODE/
instagram.com/USERNAME/reel/SHORTCODE/
instagram.com/p/SHORTCODE/ and /tv/SHORTCODE/✅ when the post is a video
Profile, explore or hashtag URLs❌ — not single Reels; returned as INVALID_URL
Private accounts, deleted Reels, login-gated content❌ — returned as an error row, uncharged
Photo posts and photo carousels❌ — MEDIA_UNAVAILABLE, uncharged

Other platforms return a clear error pointing you at Short Video Transcriber for TikTok and YouTube Shorts.


Honest limits

This section is here rather than buried at the bottom, because Instagram is stricter than the other short-form platforms and you should know what you are buying.

  • There is no cheap caption path. Every successful Reel is charged asr_transcript ($0.040). Sister Actors for TikTok and YouTube Shorts can often use a platform caption track at $0.002; Instagram offers none, so that discount does not exist here.
  • Public, logged-out content only. The Actor holds no Instagram account and accepts no cookies or session tokens. A Reel from a private account cannot be transcribed by it, and no setting will change that.
  • Some Reels are music, not speech. Those return NO_SPEECH_DETECTED and are not charged. On a 50-Reel test set spanning 14 public accounts, 62 % produced a transcript and most of the rest were genuinely music-only — for talking-head, news and explainer accounts the rate was far higher (Al Jazeera English: 8 of 8).
  • Instagram refuses some datacenter IPs. The Actor retries those requests through Apify's residential proxy automatically. Leave useResidentialFallback on.
  • Instagram does not tell an anonymous viewer how long a Reel is. The length caps are therefore enforced from the downloaded audio's own header — after the download, before transcription, and before anything is charged.

What you get

One dataset row per input URL:

{
"url": "https://www.instagram.com/reel/Dcj6uM5CWIE/",
"platform": "instagram_reels",
"videoId": "Dcj6uM5CWIE",
"author": "aljazeeraenglish",
"authorName": "Al Jazeera English",
"title": "The story behind the images that defined the week",
"hashtags": ["news", "aljazeera"],
"durationSeconds": 129.9,
"language": "en",
"source": "whisper_asr",
"sourceDetail": null,
"whisperModel": "base",
"text": "This week began with a moment few expected…",
"segments": [
{ "start": 0.0, "end": 3.28, "text": "This week began with a moment few expected" },
{ "start": 3.28, "end": 6.94, "text": "and ended with one nobody could ignore." }
],
"srt": "1\n00:00:00,000 --> 00:00:03,280\nThis week began with a moment few expected\n\n2\n…",
"vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:03.280\nThis week began with a moment few expected\n\n…",
"wordCount": 311,
"segmentCount": 46,
"publishedAt": "2026-08-24T09:12:04+00:00",
"status": "ok",
"error": null
}

source is always whisper_asr on this Actor — Instagram offers nothing else. The field exists because the whole Actor family shares one row shape, so a dataset from this Actor drops straight into a pipeline built for the TikTok or Shorts Actor.

The srt and vtt fields are complete, valid subtitle files.


Pricing

EventPriceWhen it fires
asr_transcript$0.040A Reel was transcribed. This is the event that fires on this Actor.
caption_transcript$0.002Reserved for a native caption track. Instagram publishes none, so in practice this never fires here.
apify-actor-start$0.00005Apify's standard start event, charged once per gigabyte of the run's memory. This Actor runs at 2 GB, so $0.0001 per run.

Those are the Free-plan prices. Apify's paid plans get the standard Store discount off every event — Bronze 5 %, Silver 10 %, Gold and above 15 % — so asr_transcript costs $0.038, $0.036 or $0.034 on those plans.

Reels transcribedCost
100$4.00
1,000$40.00
10,000$400.00

(Free-plan prices; a Gold plan pays 15 % less. Music-only and failed Reels are not in these counts, because they are not charged.)

Nothing else is charged. In particular you are not charged for:

  • Reels that are deleted, private or login-gated;
  • Reels longer than your maxDurationSeconds or maxAsrDurationSeconds caps;
  • Reels where Whisper finds no speech at all (music-only clips);
  • photo posts, profile URLs, malformed URLs or links from other platforms;
  • any run that fails.

Input

FieldTypeDefaultWhat it does
videoUrlsarrayRequired. Public Instagram Reel URLs, one per line.
languagestring(blank)Two-letter code (en, es, pt, ar…). Blank lets Whisper detect it, which is usually right. Worth setting on short or noisy Reels.
allowWhisperFallbackbooleantrueLeave on. Off makes every Reel return a free CAPTIONS_UNAVAILABLE error, since Instagram has no caption track to fall back to.
maxDurationSecondsinteger600Reels longer than this are skipped, free. Max 1200.
maxAsrDurationSecondsinteger180Length limit for transcription. Longer Reels return ASR_DURATION_EXCEEDED, free. Raise it if you want long Reels anyway.
maxVideosinteger1000Safety cap on the number of URLs processed.
whisperModelstringbasetiny, base or small. small is better on accents and noise.
beamSizeinteger1Whisper decoding beam width.
concurrencyinteger5Reels resolved in parallel. Whisper always runs one at a time.
includeFailedItemsbooleantrueKeep a row (with an error code) for every failure, so inputs reconcile to outputs.
useResidentialFallbackbooleantrueRetries through a residential IP when Instagram refuses the normal proxy. Leave this on.
proxyConfigurationobjectApify ProxyRecommended. The run pins one proxy session, which Instagram's media CDN requires.

Minimal input

{
"videoUrls": [
"https://www.instagram.com/reel/Dcj6uM5CWIE/",
"https://www.instagram.com/nasa/reel/DcCH2ZygIiP/"
]
}

Run it

In the Apify Console

Open the Actor, paste your links into Instagram Reel URLs, one per line, and click Start. Results appear in the dataset and export as JSON, CSV, XLSX or Excel — or download the srt column straight into subtitle files.

API

curl -X POST "https://api.apify.com/v2/acts/sauliusautomatesit~instagram-reels-transcript/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"videoUrls": [
"https://www.instagram.com/reel/Dcj6uM5CWIE/"
]
}'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("sauliusautomatesit/instagram-reels-transcript").call(input={
"videoUrls": [
"https://www.instagram.com/reel/Dcj6uM5CWIE/",
"https://www.instagram.com/reel/DcCH2ZygIiP/",
],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["status"] != "ok":
print(f"{item['inputUrl']}: {item['error']}{item['errorMessage']}")
continue
print(item["author"], item["language"], item["wordCount"], "words")
with open(f"{item['videoId']}.srt", "w", encoding="utf-8") as handle:
handle.write(item["srt"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('sauliusautomatesit/instagram-reels-transcript').call({
videoUrls: ['https://www.instagram.com/reel/Dcj6uM5CWIE/'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
if (item.status !== 'ok') {
console.warn(`${item.inputUrl}: ${item.error}`);
continue;
}
console.log(`@${item.author}: ${item.text}`);
// await fs.writeFile(`${item.videoId}.srt`, item.srt);
}

n8n, Make and Zapier

Works with the standard Apify → Run Actor node in n8n and the Apify → Run an Actor module in Make. Point the node at this Actor, pass videoUrls as the input JSON, then read the dataset items in the next step — text for the transcript, srt for a subtitle file, error to branch on failures.

A common shape: a sheet or webhook supplies Reel links → this Actor returns transcripts → an LLM node summarises, tags or repurposes them → the result is written back. Because failures come back as rows with an error field rather than as a broken run, a filter on status == "ok" is all the error handling most workflows need.


Errors

Failed Reels get a dataset row with status: "error", an error code and a plain-English errorMessage. They are never charged.

CodeMeaning
VIDEO_UNAVAILABLEDeleted, never existed, or not reachable without signing in.
VIDEO_PRIVATEThe account is private.
LOGIN_REQUIREDInstagram demanded a signed-in session for this Reel.
DURATION_EXCEEDEDLonger than maxDurationSeconds.
ASR_DURATION_EXCEEDEDLonger than maxAsrDurationSeconds. Raise that limit to transcribe it anyway.
NO_SPEECH_DETECTEDWhisper found no speech — a music-only or silent Reel.
CAPTIONS_UNAVAILABLEWhisper was turned off, and Instagram has no caption track.
MEDIA_UNAVAILABLENot a video (a photo post), or the audio could not be downloaded.
INVALID_URLNot a link to a single Reel — a profile or explore URL, for example.
PLATFORM_NOT_ENABLEDA TikTok, YouTube or other non-Instagram URL.
BLOCKED / RATE_LIMITEDInstagram refused the request. Try again, and keep the residential retry on.
MEMORY_LIMITThe Reel does not fit in the run's memory for the chosen model. Raise the memory or pick a smaller model.

Good to know

  • Memory. Run with at least 2 GB. That covers the whole duration range with the base model; the Actor refuses an impossible combination up front instead of being killed mid-run.
  • Accuracy. base is a good default. For accented speech, background music or poor recording, small is a clear improvement at roughly double the transcription time.
  • One URL per Reel. This Actor does not crawl accounts or hashtags to find Reels for you.

What this Actor does not do

It transcribes Reels. It does not scrape comments, followers or account analytics, does not monitor accounts, does not touch private content, and does not summarise, translate or score sentiment — pipe the transcript into an LLM step for that.


Instagram Reels transcript · Reel to text · transcribe Instagram Reel · Instagram subtitles · Reels SRT · Instagram video to text · Reel captions to text · Instagram speech to text · bulk Reels transcripts · Instagram Reels VTT · Reels transcript API