Instagram will read a Reel's audio and put captions on screen. It will not let you take that text anywhere. There is no export, no copy button, and no transcript panel. If you want the words in a document, a database, or a prompt, you have to pull them yourself.
This guide covers GET /v1/instagram/posts/transcript: the response shape, the carousel case that trips people up, and how to run it across a whole account.
You'll need an API key and curl or the TypeScript SDK. New to the API? Start with the Quickstart.
Just need one Reel right now?
Use the free Instagram Reel transcript tool. Paste a public Reel URL, copy the text, no account. Come back here when you need more than a handful.
Instagram gives you no way to export this
Worth being precise about what exists, because the situation differs from the other platforms.
YouTube has a transcript panel with a copy option built into the web player. TikTok shows captions during playback but hides the caption file. Instagram sits closest to TikTok: auto-captions are generated for most Reels with speech, creators can edit them, and viewers see them burned into the playback UI. None of that is reachable as text.
The official Instagram Graph API does not help either. It is built for accounts you own or manage through a business connection, it covers publishing, insights, and comment management, and it has no transcript field at any tier. Requesting captions for an arbitrary creator's Reel is outside what the platform's own API is for.
So the practical options are a browser tool for one URL, or an endpoint for everything else.
Get one transcript
One required parameter, the post URL:
A real response, trimmed for length:
/reel/, /p/, and /tv/ URLs all resolve. Share links with tracking parameters are fine, the extra query string is ignored.
Why transcripts is an array
One Instagram URL does not always mean one video. A carousel post can mix images with several video slides under a single shortcode. Each video carrying speech comes back as its own entry, with its own id and shortcode, so you can tell the slides apart.
A plain Reel returns an array of one. That is the case people write their code against, and then a carousel arrives and transcripts[0] quietly drops the other four slides.
Iterating costs nothing on a single Reel and saves you a silent data-loss bug on carousels.
Plain text here, WebVTT on TikTok
If you are building one pipeline across platforms, this difference matters more than it sounds.
| TikTok | YouTube | ||
|---|---|---|---|
| Route | /v1/instagram/posts/transcript | /v1/tiktok/videos/transcript | /v1/youtube/videos/transcript |
| Returned shape | transcripts[], one row per video | WebVTT string in transcript.content | segments[] plus plainText |
| Timestamps | None | In the VTT cues | Millisecond offsets per segment |
| Speech-to-text fallback | None | useAiFallback=true, +10 credits | None |
Instagram hands back text that is already flattened, which is convenient if prose is what you wanted and a dead end if you needed timings. There is no parameter that returns cues.
Note that the three are genuinely different shapes, not one shape with cosmetic differences. YouTube gives you timed segments and a ready-made plainText. TikTok gives you a raw WebVTT string you have to strip yourself. Instagram gives you rows of prose. YouTube and TikTok transcripts with one API covers normalising all three into one table.
The missing fallback is the sharper limitation. TikTok's route accepts useAiFallback=true and will transcribe the audio when no caption track exists. Instagram has no equivalent, so a Reel Instagram never captioned returns nothing here. In practice this is rarer than on TikTok, because Instagram auto-captions most speech, but it does mean coverage is whatever Instagram decided to generate.
Two more platforms have transcript routes if your pipeline needs them: Facebook post transcript and LinkedIn post transcript. Both take a post URL and share the same auth header and envelope.
Do not average across platforms
Storing Instagram prose and TikTok WebVTT in the same text column will corrupt anything downstream that assumes one format. Either strip TikTok's cues on write, or keep a format column and branch on it.
When a Reel comes back empty
An empty result is a normal outcome, not a failure. You will see it for:
Music-only Reels, where the audio is a licensed track and nobody speaks. Silent b-roll and text-on-screen posts, which are common in design and fashion accounts. Videos in a language Instagram did not caption. And posts that resolved fine but simply have no speech.
In every one of those cases lookupStatus is found and transcripts is empty or absent. The credit still charges, because the lookup completed and the answer is genuinely "there is no speech here".
Branch on the array length, not on the status alone:
Separate outcomes are not_found for deleted or mistyped URLs, and private for accounts that are not public. Those are distinct from "public but silent", and it is worth keeping the distinction in your own table so you know whether a retry could ever succeed.
Transcribing a whole account
The pattern is two endpoints: list the Reels, then transcribe each URL.
Both routes are 1 credit per completed call, so an account with 200 Reels costs roughly 200 credits plus the paging calls. Store the shortcode as your primary key and you can re-run the job later without paying for text you already hold.
The Reels list paginates with page.nextCursor and page.hasMore, the same cursor convention every list route on the API uses.
The owner field will bite you
Listing an account's Reels does not return only that account's Reels.
Pull /v1/instagram/profiles/natgeo/reels and the response includes posts owned by natgeotv, guywithamoviecamera, and maya_higa. These are collaborator posts and tagged content that Instagram surfaces on the profile grid. They are legitimately there, they are just not authored by the account you asked for.
If you are building a per-creator content archive, filter on owner.handle before you spend credits transcribing:
Skip that check and a brand's "content library" quietly fills with its collaborators' videos, which is the kind of error nobody notices until someone reads the report.
What people build with this
Search over spoken content, so a creator or brand can find the Reel where someone said a specific phrase. Captions are not enough for this, because the caption is marketing copy and the speech is the actual content.
Repurposing pipelines that turn a Reel into a blog draft, a newsletter section, or a set of quote cards.
Brand-safety and compliance review, where the on-screen text is thin but the audio carries the claim. Regulated categories care about what was said, not what was typed into the caption box.
Retrieval for LLM applications, where transcripts get chunked and embedded so an assistant can answer questions about a video library. Prose output helps here, since you would be stripping WebVTT cues anyway.
Competitor messaging analysis across a category, pairing transcripts with Reel metrics to see which spoken hooks correlate with plays.
For the same job on other platforms, see TikTok transcripts and YouTube and TikTok transcripts together. For the wider set of Instagram routes, see how to scrape Instagram data.
FAQ
Can I get an Instagram Reel transcript without an API key?
Yes, for one-off checks. The free Instagram Reel transcript tool takes a public Reel URL and returns the spoken text in your browser, no signup. It is rate limited on purpose. Move to the API when you need volume, scheduling, or the text in a database.
Does Instagram have a built-in transcript feature?
Not one you can export. Instagram generates auto-captions for accessibility and creators can edit them in the app, but there is no copy-all, no download, and no transcript panel the way YouTube has one.
Why is transcripts an array instead of a single object?
Because one URL can hold more than one video. A carousel can mix images and several video slides, and each video with speech becomes its own entry. A single Reel returns an array of one, so write your code to iterate rather than reading transcripts[0]. See why transcripts is an array.
What format is the text in?
Plain prose, already flattened, with no timestamps. The TikTok route returns WebVTT with timing cues instead. If you need per-sentence timings on Instagram, this endpoint will not give them to you.
What happens on a Reel with no speech?
You get lookupStatus found with an empty or absent transcripts array. Music-only Reels, silent b-roll, and text-on-screen posts all land here. Treat empty as a normal outcome and check the array length before indexing.
How much does a transcript cost?
One credit per completed lookup, and a completed lookup includes outcomes like not_found and private. A bad URL still bills. Reconcile against meta.creditsCharged.
Can I transcribe a private account?
No. The endpoint reads public posts. Private accounts, deleted posts, and region-blocked media return a status describing what happened instead of text.
Is transcribing public Instagram videos legal?
Reading publicly visible video for analysis and research is a common pattern, and courts have generally treated public web data as fair game in several jurisdictions. You stay responsible for Instagram's terms, copyright and privacy law, and your own contracts. A transcript is someone's spoken words, so republishing raises questions that analysis does not. This is a technical guide, not legal advice.
How does this compare to other providers?
See the side-by-side comparisons: vs Apify, vs ScrapeCreators, and the full compare hub.
Next steps: Transcript endpoint reference · Free Instagram Reel transcript tool · Scrape Instagram data · Quickstart · Pricing