One URL in. Clean JSON out.
Pass a public Instagram reel URL and get the spoken words back as JSON. Read this part before you write any code: the transcription pipeline is running in subtitles-only mode right now, and Instagram does not publish caption tracks we can read, so in practice this endpoint returns 404 not_found for reels rather than a transcript. It is documented here because the route is live and because speech-to-text is a configuration flip away, but today it will not give you text.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<article class="_aagv _ab8w x1n2onr6" role="presentation"><div class="x9f619 xjbqb8w x78zum5"><div class="_aagu"><img alt="Photo by @creator" class="x5yr21d xu96u03" src="https://scontent.cdninstagram.com/v/t51...blob"/></div><section class="x6s0dn4 x78zum5 xdt5ytf"><span class="x1lliihq _aacl _aaco">55,210 likes</span><div class="_a9zs"><span dir="auto">Three settings you should change today</span></div><span class="_aacl _aaco x1i10hfl">View all 981 comments</span></section><time class="_aaqe" datetime="2026-07-03T12:00:00.000Z">18h</time></div><script type="application/json" data-sjs>{"require":[["ScheduledServerJS","handle",null,[{"__bbox"... {"data": {"platform": "instagram","entity_id": "C8xQvZ2sVAb","language": "en","source": "audio","text": "Today I want to show you the three settings everyone ignores when they set this up for the first time...","segments": [{"start": 0,"end": 3.2,"text": "Today I want to show you the three settings"},{"start": 3.2,"end": 5.9,"text": "everyone ignores when they set this up"}]},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
On success the response is one object holding the transcript: the full text as a single string, an optional array of timestamped segments, the detected language, a marker saying where the text came from. Whether it came from our stored corpus or was produced on this call is reported by the x-cache response header, not in the body. There are no engagement counters and no author block here. Transcripts are a separate concern from metrics, and the endpoint keeps them separate.
The important caveat is that today there is usually nothing to return. Our pipeline gets a transcript one of two ways: it reads a caption or subtitle track the platform already publishes, or it runs speech-to-text on the video audio. The speech-to-text leg is switched off, and Instagram reels do not carry a machine-readable caption track we can pick up. That combination means a reel URL resolves, the pipeline finds no usable source, and you get a 404 with the message "no transcript is available for this content".
Failed calls cost nothing. Credits are charged on a 200 only, so pointing this endpoint at 500 reels today would burn 500 requests and zero credits. That is not a workaround suggestion; it is so you know a broken integration will not quietly drain a balance.
How the text was produced: "upstream" for a platform caption track, "whisper" for our own speech-to-text. Always present, including on a corpus hit — a stored transcript is served back with the source it was originally produced from.
Pricing
One reel is 40 credits — about 20¢ on the monthly plan, 18¢ on annual — but in practice you pay nothing today, because the 404 this endpoint returns for new reels is never charged.
Estimate only, on a full-year basis. 40 credits per returned reel. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
The pipeline has two legs. Leg one reads a caption or subtitle file the platform already serves; leg two downloads the video and runs speech-to-text. Leg two is disabled, so only leg one runs.
TikTok generally ships a subtitle track inside its public video data, which is why the TikTok Transcript API works and costs 8 credits. Instagram does not, and neither do Facebook or X. The honest summary for Instagram is: no caption track, no speech-to-text, no transcript.
You get HTTP 404 with an error body, not an empty 200 with a blank text field. Handle 404 as "no transcript exists", not as "reel not found" — the reel itself may be perfectly public and reachable through the stats endpoint.
No credits are deducted on a 404. Nothing is written to the transcript corpus either, so a retry tomorrow re-attempts the pipeline cleanly rather than replaying a cached failure.
This endpoint is in the immutable cache class. Spoken words in a published reel do not change, so once a transcript exists for a reel it is stored permanently and every later call for that reel is served from storage in milliseconds.
A stored hit still costs 40 credits. Persistence buys latency and reliability, not a discount. fresh=true skips the corpus lookup and re-runs the pipeline at the same price, which is rarely useful here given the pipeline currently has nothing to fall back on.
40 credits per reel, which is $0.20 on the monthly plan and $0.18 on annual. That price reflects the media-acquisition work the full pipeline does on Instagram, which is heavier than TikTok's free-subtitle path. It is high, it is honest, and it is the reason we would rather tell you the endpoint does not work than let you discover it after a bill.
Private accounts, deleted posts and anything behind a login are unreachable. We read the same public pages you can open in a browser with no session. There is no credential store, no bypass, and no access to content Instagram does not serve anonymously.
Questions
No, not for new reels. Transcription runs in subtitles-only mode, meaning we can only return text that the platform already publishes as a caption track. Instagram does not publish one in a form we can read, and speech-to-text is switched off. A call on a fresh reel URL returns 404 with "no transcript is available for this content". Reels already in our transcript corpus are still served normally.
If the creator posts the same content to TikTok, use the TikTok Transcript API — TikTok ships subtitle tracks publicly and that endpoint works today at 8 credits per video. If you only need the written caption under the reel rather than the spoken audio, the Instagram Stats API returns it along with hashtags and engagement counts for 1 credit. Neither is a substitute for real audio transcription, but one of them usually covers the actual job.
No. Credits are metered on successful responses only. A 404 from this endpoint costs zero credits, and so do timeouts and upstream failures. You can safely leave a call in a pipeline while you wait for speech-to-text to be enabled, though you should still handle the 404 branch rather than assuming a transcript will arrive.
Segments are timestamped chunks, each with a start second, an end second and its text, useful for jumping to a moment in the video or aligning a transcript with a scrubber. They only exist when text came from speech-to-text, because that step reports timings directly. Text pulled from a platform caption file is flattened to a plain string and segments is null.
There is no date. The speech-to-text leg is built and sitting behind a configuration switch, so enabling it is a deployment decision rather than an engineering project, but we will not promise a week. When it turns on, this page changes and the endpoint starts returning text at the same 40 credits per reel. Nothing about the request shape or the response fields changes.
No. We read public content only, logged out, with no stored credentials. Private accounts, close-friends posts, stories and anything requiring a session are out of reach by design. If a reel is public but the account later goes private, an existing transcript in the corpus stays available while new lookups on that account will fail.
Not for reels whose value is in the audio. Summarisation reads the transcript, so where there is no transcript there is nothing substantial to summarise. If your goal is a short description of a reel today, the more reliable route is the caption from the Instagram Stats API fed into your own model.
Next
100 trial credits on signup — no card, key on screen immediately.