Instagram Reels Transcript — Reel to Text + Stats
Pricing
from $7.00 / 1,000 reel transcript (fast)s
Instagram Reels Transcript — Reel to Text + Stats
Transcribe Instagram Reels from their URLs with Whisper: spoken text, timestamps, SRT, 99 languages, plus caption, views, likes, comments and creator. One flat row per reel, never null. Only reels with speech are billed.
Pricing
from $7.00 / 1,000 reel transcript (fast)s
Rating
0.0
(0)
Developer
Sumitr Mardy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Give it Instagram reel links, get back what is said in each reel as text, with timestamps, optional SRT/VTT subtitles and the spoken language, plus the reel's caption, views, likes, comments, audio track and creator. One flat row per reel, every field always present, never null. Built for content research, repurposing and AI agents.
$10 per 1,000 reels (fast) or $20 (accurate), less on higher Apify plans. Photo posts, music-only reels, reels without speech and failures are free.
Why this one
- Pay only for reels with speech. Reels set to a licensed song are detected from Instagram's own audio attribution and skipped before any download (free, and you can turn the skip off). Reels where Whisper hears no speech are free too.
- Transcript and stats in one row. Views, likes, comments, caption, creator, follower count and the audio track come with every transcript, no second actor needed.
- One row for every URL. A deleted post, a photo post or a profile link instead of a reel still comes back as a row with a machine-readable
subStatus. - Two quality tiers.
fast(Whisper base) for clear talking-head reels,accurate(Whisper small) for names, slang, accents and speech over music. - Measured on Apify: a 9-second reel in 2.6 s, a 71-second NASA reel in under 8 s; a Nike reel detected as Spanish automatically. No proxy is needed to read public reels, so there is no proxy cost hidden in the price.
Input
| Field | Default | What it does |
|---|---|---|
urls | — | Reel or post links (instagram.com/reel/…, /p/…, /tv/…) or bare shortcodes. Required. Profile links are not supported yet. |
quality | fast | fast = Whisper base. accurate = Whisper small. |
language | auto | ISO code (en, es, pt, hi…). Helps on very short reels. |
skipMusicOnly | true | Skip reels whose audio is a licensed song (free). Turn off for lyrics or voice-over on music. |
includeSegments | true | segments[] with start/end seconds per phrase. |
includeSubtitles | false | srt and vtt subtitle text. |
maxMinutesPerVideo | 10 | Caps long video posts (max 30). |
{"urls": ["https://www.instagram.com/p/DS46KJNjva9/", "https://www.instagram.com/reel/Da_ZgEaPvCN/"],"quality": "fast"}
Output
One row per URL, in completion order. A real row (shortened):
{"inputIndex": 0,"url": "https://www.instagram.com/p/DS46KJNjva9/","shortcode": "DS46KJNjva9","status": "ok","subStatus": "complete","error": "","text": "One of my favorite quotes from Zig Ziglar is, you don't have to be great to start, but you have to start to be great.","charCount": 117, "wordCount": 25,"language": "en", "languageProbability": 0.984,"segments": [{ "start": 0, "end": 2.8, "text": "One of my favorite quotes from Zig Ziglar is," }],"srt": "", "vtt": "","videoDurationSeconds": 8.81, "transcribedSeconds": 8.8, "billedUnits": 1,"quality": "fast", "model": "base","caption": "2026 mindset ✨ It’s simple really. You’ll never become great at something you don’t try…","ownerUsername": "jayshetty", "ownerVerified": true, "ownerFollowers": 18908765,"viewCount": 440217, "likeCount": 50879, "commentCount": 342,"productType": "clips", "isVideo": true,"musicArtist": "jayshetty", "musicSong": "Original audio", "usesOriginalAudio": true,"thumbnailUrl": "https://scontent…cdninstagram.com/…jpg","videoUrl": "https://scontent…cdninstagram.com/…mp4","notes": [],"processingMs": 2631}
Strings are "" when absent, numbers 0, arrays []. No field is ever null or missing. Stats are as Instagram shows them at scrape time; videoUrl and thumbnailUrl are signed CDN links that expire within hours.
Status
status | subStatus | Charged |
|---|---|---|
ok | complete, or truncated (video longer than maxMinutesPerVideo) | billedUnits |
no_speech | music_only_skipped (licensed song), no_speech_detected | free |
no_video | not_a_video: a photo or carousel post; metadata is still returned | free |
failed | invalid_url (e.g. a profile link), not_found (deleted/private), no_post_data, blocked, network_error, download_error, download_timeout, too_large, corrupt_media, no_audio_track, empty_audio, cost_limit_reached, free_work_limit, transcription_error | free |
Pricing
| Event | Price | When |
|---|---|---|
reel-transcript | $0.010 (free plan), $0.009 Bronze, $0.008 Silver, $0.007 Gold | quality: "fast", a reel with speech |
reel-transcript-accurate | $0.020 (free plan), $0.018 Bronze, $0.016 Silver, $0.014 Gold | quality: "accurate" |
One event per reel, or per started 3 minutes for longer video posts (billedUnits). The only other charge is a start fee of $0.0005 per GB per run ($0.002 at the default 4 GB). No platform usage on top.
Fair use
Free rows cost compute, so a run that spends its budget on reels that fail or have no speech stops starting new ones; the rest come back free_work_limit, uncharged. Up to 5,000 URLs per run.
What it does not do (yet)
- No profile scraping. Give reel links, not
@handles; listing a profile's reels needs a logged-in session, which this actor does not use. - Public posts only. Private, age-restricted and deleted posts fail as
not_found. - Speech over loud music can trip the fast tier (repeated or misheard phrases). Use
accuratefor music-heavy reels. - No on-screen text (OCR) and no speaker labels.
Use it from AI agents (MCP)
This Actor is a tool on the Apify MCP server, so Claude, Cursor, VS Code or any MCP client can call it to read what a reel says. Load only this tool: a short tool list keeps the agent from picking the wrong one.
Recommended: hosted server, OAuth sign-in (nothing secret on disk).
{"mcpServers": {"instagram-reels-transcript": {"url": "https://mcp.apify.com?tools=sumitr_mardy/instagram-reels-transcript"}}}
With an API token instead:
{"mcpServers": {"instagram-reels-transcript": {"url": "https://mcp.apify.com?tools=sumitr_mardy/instagram-reels-transcript","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
Local server (stdio):
{"mcpServers": {"instagram-reels-transcript": {"command": "npx","args": ["-y", "@apify/actors-mcp-server@latest", "--tools", "sumitr_mardy/instagram-reels-transcript"],"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }}}}
The hosted server also gives the agent this Actor's output schema. Get a token at Apify Console → API & Integrations, and never commit it.
Tips for agents:
- "What is this reel about?": pass the link, read
textandcaptiontogether. - "Which hooks work?": compare the first
segmentsof reels againstviewCount. - Check
statusfirst:no_speechwithmusic_only_skippedmeans the reel is set to a song. - A few reels finish well inside the MCP
call-actor45-second wait.
Use it from code
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("sumitr_mardy/instagram-reels-transcript").call(run_input={"urls": ["https://www.instagram.com/p/DS46KJNjva9/"],})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["ownerUsername"], row["viewCount"], row["status"], row["text"][:100])
curl -X POST "https://api.apify.com/v2/acts/sumitr_mardy~instagram-reels-transcript/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"urls": ["https://www.instagram.com/p/DS46KJNjva9/"]}'
This actor is not affiliated with or endorsed by Instagram or Meta.