Instagram Reels Transcript Scraper - Speech to Text, No Login
Pricing
from $11.99 / 1,000 transcript (speech recognition)s
Instagram Reels Transcript Scraper - Speech to Text, No Login
Public Instagram Reels turned into text: full spoken transcript, timed segments and the Reel's own metadata. No login, no cookies.
Pricing
from $11.99 / 1,000 transcript (speech recognition)s
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Security
Limited permissionsShare
Instagram Reels Transcript Scraper
A Lantern Lab Actor. Give it public Instagram Reel links — or a public account name — and get the spoken words back as text: the full transcript in one field, the same words with timestamps in another, and the Reel's own metadata next to them (shortcode, caption, author handle, publish time, duration, likes, comments). No Instagram login, no cookies, no account of your own.
Pay per transcribed Reel: USD 11.99 per 1,000 Reels heard by the speech model, or USD 1.99 per 1,000 for one that Instagram does publish a caption track for. No run-start fee — you pay for transcripts, not for starting the Actor, and one Actor replaces the scrape-then-transcribe pair this normally takes. Reels with no speech, no audio, a dead link, or skipped for being too long are returned marked and cost nothing. Status rows and the run summary are free.
What you get
{"recordType": "transcript","platform": "instagram","videoId": "4014598211346836605","shortcode": "De2t82PPyx9","url": "https://www.instagram.com/reel/De2t82PPyx9/","title": "We are not slowing down. 🚀","caption": "We are not slowing down. 🚀\n\nOur #Artemis III mission will send four astronauts to low Earth orbit next year to test critical systems needed for future lunar landings…","authorName": "NASA","ownerUsername": "nasa","publishedAt": "2026-10-23T23:20:57.000Z","collectedAt": "2026-10-24T10:41:22.629Z","durationSec": 59.883,"likeCount": 36257,"commentCount": 280,"playCount": null,"language": "en","transcriptSource": "asr","asrModel": "faster-whisper-base-int8","text": "The standard that we should continuously aspire to exceed, which is why we are bringing that intensity, that discipline, that engineering ownership back to NASA because great nations do not remain great by being caretakers of history, but by continuously making history. …","wordCount": 176,"segments": [{ "start": 0, "end": 6.16, "text": "The standard that we should continuously aspire to exceed, which is why we are bringing that intensity," },{ "start": 6.16, "end": 11.36, "text": "that discipline, that engineering ownership back to NASA because great nations do not remain great" }],"sourceInput": "https://www.instagram.com/reel/De2t82PPyx9/","partial": false,"partialReason": null}
That row is a real one, trimmed with … only where the text is long: it is from the run that this Actor's current build was accepted on.
text is plain text with no timestamps in it, so it can be handed to an LLM as-is. segments is the same transcript with start and end in seconds, for subtitles or for jumping to a moment in the video.
Input
| Field | Default | Meaning |
|---|---|---|
reelUrls | required | One entry per line: a Reel link in any shape Instagram serves it (/reel/, /reels/, /p/, /tv/), or a public account name (natgeo, @natgeo, https://www.instagram.com/natgeo/) for that account's most recent Reels. |
allowAsr | true | Listen to the Reel when Instagram has no caption track for it — which, for a logged-out visitor, is almost always. With it off you get metadata and no transcript. |
language | empty | Two-letter code of the spoken language (pt, es, id, vi, zh, en…). Leave it empty unless every Reel in the run really is in that language. The model otherwise detects the language per Reel, and forcing the wrong one garbles the transcript and makes the run much slower — a Brazilian account's Reel that is narrated in English took 8.7 s detected against 47.6 s with pt set, for an unusable result. |
includeSegments | true | Include the timed transcript. Turn it off for the plain text only. |
maxDurationSec | 60 | Reels longer than this are returned with their metadata, marked duration_exceeded, not transcribed and not charged. Most Reels are under a minute; raise it for longer ones. |
maxItems | 10 | For account entries only: how many of the account's newest Reels to read. A Reel link always produces exactly one row. |
maxUpstreamRequests | derived | Hard ceiling on requests to Instagram for the whole run. Leave empty and the Actor works one out from your input. |
proxyConfiguration | Apify Proxy | The proxy the Reel pages go through. Profile pages always use a residential IP; the audio is downloaded from Instagram's CDN without a proxy. |
{"reelUrls": ["https://www.instagram.com/reel/De2t82PPyx9/","@natgeo"],"language": "pt","maxItems": 10,"maxDurationSec": 60}
Output
Three kinds of row, and the row kind is on every one of them as recordType.
transcript— one per Reel, deduplicated across the whole run. The fields above. Charged only when it carries a transcript.input_status— one per entry of your input: how many Reels it pointed at, how many were written, how many were already collected earlier in the run, and whether it was cut short. Never charged.RUN_SUMMARY— the last row of the dataset, and the same object under theRUN_SUMMARYkey of the run's key-value store: totals, where the transcripts came from, which Reels have none and why, requests sent to Instagram, audio seconds transcribed, and why collection stopped.
When there is no transcript
A row with partial: true still carries the Reel's metadata and says in partialReason why the words are missing. These rows are never charged, and none of them means "this Reel has nothing to say":
partialReason | What happened |
|---|---|
no_speech | The audio was transcribed and holds no speech — music or ambient sound only. An empty transcript, not a failed one. |
no_audio | The Reel has no audio track at all. |
duration_exceeded | Longer than your maxDurationSec (60 s by default). Raise it to include the Reel: a long Reel costs the same per Reel but takes proportionally longer to transcribe. |
asr_disabled | allowAsr is off and Instagram published no caption track. |
not_found | The Reel or the account is deleted, went private, or the name was never a public one. Instagram serves its error page with HTTP 200 for these, and this Actor reads that as "gone", never as "empty". |
not_a_video | The link points at a photo or a carousel. |
audio_unavailable | The audio could not be downloaded. |
asr_failed | The speech model failed on this Reel. |
blocked | Instagram refused our requests for it. Not an empty result. |
upstream_request_cap | The run reached its own request ceiling first. |
not_collected | The run stopped before reaching this entry. |
How the transcript is produced
Instagram serves no caption track to a logged-out visitor, so for virtually every Reel the words have to be heard. That is done by faster-whisper, an open-source speech model, running on the CPU of this Actor's own container, with the weights baked into the image. The audio never leaves the container, no third-party transcription service is called, and no model is downloaded at run time. Only the Reel's audio track is fetched — not the video — which is about a fifth of the bytes.
If Instagram ever does publish a caption track for a Reel, it is used instead of the model and transcriptSource says platform_caption.
How long a run takes
The speech model is the slow part: on Apify's default 4 GB (one CPU core) this Actor transcribes roughly five to six seconds of audio per second of container time, so a Reel costs about as many seconds of run time as a fifth of its length, plus a second or two to fetch it. A hundred 40-second Reels is therefore around fifteen minutes. Raise the run's timeout before sending more Reels than that - the Actor's default is one hour, which is not enough for a thousand of them.
Limits
- Public Reels only. No login, no cookies (not even yours), no private, age-restricted or follower-only content. A private account returns
not_found. - No play count. Instagram does not show view or play counts to a logged-out visitor, so
playCountis alwaysnullrather than a guess.likeCountandcommentCountare the public ones from the page. - Account entries read the public profile page, which offers roughly a dozen recent posts.
maxItemsabove that returns what is there and says so; there is no paging past it for a logged-out visitor. - A Reel has no title field.
titleis the first line of its caption, trimmed to 120 characters, andnullwhen there is no caption. - Speech, not sound. Lyrics over a music track transcribe poorly, and a Reel with only on-screen text and no voice-over comes back as
no_speech. - Accuracy is the model's.
faster-whisper-baseis a small multilingual model: good on clear speech in the major languages, weaker on heavy accents, crosstalk, background music and rare languages. On a Reel that is mostly music with a few spoken words, expect a short and partly wrong transcript rather than nothing. - Personal data is kept to the minimum: the public display name and handle the Reel page shows, and nothing else about the account.
- No comments, no followers, no hashtag or location search, no other platform, no scheduling — use Apify schedules for that.