Instagram Reels Transcript - Reel to Text & SRT
Pricing
from $34.00 / 1,000 transcript from whisper speech-to-texts
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
4 days ago
Last modified
Categories
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
| Input | Supported |
|---|---|
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_DETECTEDand 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
useResidentialFallbackon. - 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
| Event | Price | When it fires |
|---|---|---|
asr_transcript | $0.040 | A Reel was transcribed. This is the event that fires on this Actor. |
caption_transcript | $0.002 | Reserved for a native caption track. Instagram publishes none, so in practice this never fires here. |
apify-actor-start | $0.00005 | Apify'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 transcribed | Cost |
|---|---|
| 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
maxDurationSecondsormaxAsrDurationSecondscaps; - 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
| Field | Type | Default | What it does |
|---|---|---|---|
videoUrls | array | — | Required. Public Instagram Reel URLs, one per line. |
language | string | (blank) | Two-letter code (en, es, pt, ar…). Blank lets Whisper detect it, which is usually right. Worth setting on short or noisy Reels. |
allowWhisperFallback | boolean | true | Leave on. Off makes every Reel return a free CAPTIONS_UNAVAILABLE error, since Instagram has no caption track to fall back to. |
maxDurationSeconds | integer | 600 | Reels longer than this are skipped, free. Max 1200. |
maxAsrDurationSeconds | integer | 180 | Length limit for transcription. Longer Reels return ASR_DURATION_EXCEEDED, free. Raise it if you want long Reels anyway. |
maxVideos | integer | 1000 | Safety cap on the number of URLs processed. |
whisperModel | string | base | tiny, base or small. small is better on accents and noise. |
beamSize | integer | 1 | Whisper decoding beam width. |
concurrency | integer | 5 | Reels resolved in parallel. Whisper always runs one at a time. |
includeFailedItems | boolean | true | Keep a row (with an error code) for every failure, so inputs reconcile to outputs. |
useResidentialFallback | boolean | true | Retries through a residential IP when Instagram refuses the normal proxy. Leave this on. |
proxyConfiguration | object | Apify Proxy | Recommended. 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 ApifyClientclient = 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']}")continueprint(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.
| Code | Meaning |
|---|---|
VIDEO_UNAVAILABLE | Deleted, never existed, or not reachable without signing in. |
VIDEO_PRIVATE | The account is private. |
LOGIN_REQUIRED | Instagram demanded a signed-in session for this Reel. |
DURATION_EXCEEDED | Longer than maxDurationSeconds. |
ASR_DURATION_EXCEEDED | Longer than maxAsrDurationSeconds. Raise that limit to transcribe it anyway. |
NO_SPEECH_DETECTED | Whisper found no speech — a music-only or silent Reel. |
CAPTIONS_UNAVAILABLE | Whisper was turned off, and Instagram has no caption track. |
MEDIA_UNAVAILABLE | Not a video (a photo post), or the audio could not be downloaded. |
INVALID_URL | Not a link to a single Reel — a profile or explore URL, for example. |
PLATFORM_NOT_ENABLED | A TikTok, YouTube or other non-Instagram URL. |
BLOCKED / RATE_LIMITED | Instagram refused the request. Try again, and keep the residential retry on. |
MEMORY_LIMIT | The 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
basemodel; the Actor refuses an impossible combination up front instead of being killed mid-run. - Accuracy.
baseis a good default. For accented speech, background music or poor recording,smallis 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.
Related searches
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