Can I get an Instagram transcript from a link?
Not from this site, and the reason is structural rather than a feature somebody forgot to add: a link is not a file. The entire program is 22,349 bytes of app.js, and in those bytes the word instagram appears 0 times and type="url" appears 0 times — there is no code path that could accept a link even if a box existed. A link route needs a machine somewhere that fetches the post on your behalf, and that machine meets a wall this page measured today: 5 Instagram URLs — including one that cannot be a post and one that is not a post at all — returned the identical 302 to the login page, with 0 bytes of body and 0 access-control headers on every one. What a server then has to hold is the other half of the answer: 76,894,612 bytes of q8 weights plus the 230,515,200-byte decode buffer of the ten-minute file measured here, which is 307,409,812 bytes before a single word comes back — and the browser route you are on now holds 0 of that on anybody else’s disk.
The rest of this page takes that answer apart in pieces you can check rather than reassurances you have to trust: the 5 requests this machine made to instagram.com today and the 0 bytes each one returned, the 0 access-control headers that stop a browser tab from reading any of them, the 4 steps a server has to perform before a link becomes audio, the 307,409,812 bytes of weights and decode buffer that server has to hold at once, the 8,823 bytes a second visit to this page actually transfers against 82,350,361 on the first, the 5 occurrences of the string url in 22,349 bytes that are all program-generated, and the 0 mentions of CORS, cross-origin or fetch( in the 226,638 characters of the three sites that do take links.
A link is not a file, and the difference is 0 bytes
A file is bytes sitting on your disk, and a browser can open it without asking anyone. A link is a name for bytes that live on somebody else’s HTTP server, and reading it means making a request that server is free to refuse. That is the whole gap, and it is not philosophical — it shows up as a status code. The five URLs below were requested from this Windows machine on 2 November 2026 with a desktop Chrome user agent and an Origin header of https://getigtranscript.com, and every single one came back as a redirect with an empty body.
- 5 URLs, 5 identical 302s, 0 bytes of body each.
https://www.instagram.com/,/reel/C8QxYzZJ8Zk/,/p/C8QxYzZJ8Zk/,/reel/zzzzzzzzzzz/and/robots.txtall answered302withLocation: https://www.instagram.com/accounts/login/?next=…&is_from_rleandContent-Length: 0. Not one of them returned a byte of HTML to parse, so there is nothing for a parser to parse. - The wall fires before the shortcode is even looked at.
/reel/1/cannot be a real post and/reel/zzzzzzzzzzz/is not a plausible shortcode, yet both produced the same redirect as a well-formed one — thenext=parameter differed, the status and the destination did not. A link-only tool therefore cannot tell you whether your link is valid without logging in first, which is the first thing that breaks when such a tool meets a deleted or private post. robots.txtis behind the same wall, and that is the part a server operator has to think about. Even the file that is supposed to tell a crawler what it may fetch returned 302 with 0 bytes. A server that wants to fetch a post politely has to decide what to do when the politeness file itself is not served — and 0 of the 5 responses offered any instruction about that.- Following the redirect made it worse, not better. One request followed to the login URL came back
429with 0 bytes. So from this machine the sequence was 302, 302, 302, 302, 302, then 429 — 6 responses and 0 bytes of usable content. The rate limit is the second wall: a service that fetches on behalf of strangers is doing this thousands of times from the same address block.
Why a browser tab cannot fix this on its own
Suppose the post page had answered with HTML instead of a redirect. A tab at getigtranscript.com still could not read it, because of one header that 0 of the 5 responses carried: access-control-allow-origin. Under the Fetch standard, a cross-origin fetch whose response lacks that header resolves to an opaque response — status 0, body unreadable, length unreadable — so the JavaScript gets a promise that fulfils with nothing in it. The wall and the header are two independent refusals, and a browser-only tool would have to get past both.
- 0
access-controlheaders across all 5 requests. That count includes the preflight-relevant ones: noallow-origin, noallow-methods, noexpose-headers. Nothing in the response invites a cross-origin read, so the 22,349 bytes of app.js could add a link box and afetchcall tomorrow and still receive an opaque response from every one of them. - The page is not where the video is, so one fetch would not be enough anyway. A post page holds a signed media URL pointing at a different host; the bytes are behind that second URL, and its signature carries an expiry. Getting from a pasted link to audio therefore needs 2 cross-origin reads, not 1, and the second one lands on a host this page has not measured — that part is read off how signed media URLs work, not off a test performed here.
- And the request would carry no session. The 302 above exists because the request had no logged-in cookie. A tab on this domain has no Instagram cookie to send and could not read one if it did, so even a server-side fetch starts from the same anonymous position this machine was in.
What a server has to do instead, in four steps
Every site that turns a pasted link into text is running a program you cannot see, and that program does four things in order. The reason the three competitors can offer the box and this page cannot is not skill — it is that they pay for a machine that stays running and this page deliberately does not have one. The four steps are also four places to fail, which is why the same link works on one of them and not the next.
- Step 1: fetch the post page, which is exactly what failed here. A server is not bound by CORS, so this is legal for it in a way it is not for a tab — but the 302 to
/accounts/login/is not a CORS artefact, it is the server answering a request with no session. The five 302s above were made bycurl, which has no same-origin policy at all, so the redirect is the site’s decision rather than the browser’s. - Step 2: pull the media URL out of the HTML. The link you paste contains a shortcode, not an address for the video; the address exists only inside the page that step 1 returns. Since step 1 returned
Content-Length: 0on 5 of 5 attempts from this machine, there was nothing to pull the address out of — which is the honest explanation for a link tool that works from one network and not another. - Step 3: fetch the media bytes, and now somebody else’s disk is involved. For the ten-minute file measured here that is 9,147,662 bytes leaving a server and arriving at a second server. The number is small; the change of custody is not. On the file route those same 9,147,662 bytes never leave the machine they are already on, which is why the browser build can promise what it promises.
- Step 4: either transcribe there or hand the bytes back. Transcribing on the server means holding the model and the decode buffer at once — 307,409,812 bytes for a ten-minute file, computed below. Handing the bytes back to the tab means the audio crosses the network anyway, and a page that says the file “is never part of any request” would be lying. Those are the only two exits, and both of them spend something the file route does not.
What that server has to hold, in bytes
The model is the fixed cost and the audio is the variable one, and on a server both are resident at the same moment for every request in flight. The numbers below are the ones this site already uses for its own browser build — the q8 checkpoint sizes are read from Hugging Face, the decode and render figures come from the one full-length run recorded on this machine — rearranged to describe the machine that a link route would need.
- 76,894,612 bytes of weights per request in flight. That is the
whisper-baseq8 pair,encoder_model_quantized.onnxplusdecoder_model_merged_quantized.onnx, measured from the repository. Two requests at once is 153,789,224 bytes, four is 307,578,448, and ten is 768,946,120 — the last figure is larger than the 230,515,200-byte decode buffer of a ten-minute file, so on a busy server the models, not the audio, are what you size the machine for. - The smaller checkpoint saves 36,050,381 bytes per request.
whisper-tinyis 40,844,231 bytes against the 76,894,612 of base, so ten concurrent requests on tiny would hold 408,442,310 bytes instead of 768,946,120. A link service that advertises a free tier is almost certainly making this trade on your behalf, and the accuracy cost is real: on the same clip, the smaller model produced “The process of the of Wales theatre” where the larger one produced a proper place name. - Weights plus decode is 307,409,812 bytes for ten minutes. The 230,515,200-byte buffer is 2.998 times the weights, so the two are the same order of magnitude rather than one dominating: add the 38,419,200-byte 16 kHz render and the total is 345,829,012, and adding the 9,147,662-byte file itself gives 354,976,674 bytes held at the peak of one ten-minute request.
- The weights alone are 1,201.48 seconds of the audio the model reads. 76,894,612 divided by the 64,000 bytes a second of 16 kHz mono is 1,201.48 s, or 20.02 minutes. A ten-minute file is 38,400,000 bytes at that rate, so the model is 2 times the size of the audio it is about to read — which is why a server that keeps the model warm for the next visitor is doing something a browser tab cannot, and why it is also paying for it between visitors.
What the browser route costs instead
This page’s route has no wall to cross because it makes no request to the site the link points at. What it has instead is a one-off download and a bill paid in the visitor’s own CPU. Both were measured on this machine, and the second visit figure is the interesting one: the model is not re-fetched, because the browser’s HTTP cache is the only thing that makes the route affordable at all.
- First visit: 82,350,361 bytes across 22 requests. Second visit: 8,823 bytes across 10 requests, of which the model is 0. That is a ratio of 9,333.6 to 1, and the 8,823 bytes are the HTML plus cache revalidation —
style.css,app.jsand both ad images came backfromDiskCache. A link service has no equivalent: its 76,894,612 bytes are loaded by the server, not by you, and loaded again on every cold start. - 79,700,000 bytes is 1,245.3125 seconds of 16 kHz mono, or 20.76 minutes. Divided by the 384,000 bytes a second of 48 kHz stereo source it is 207.55 seconds instead. Either way the download is larger than most of the clips people bring to it, which is why it happens once and why the second-visit figure above is the number that decides whether the route is usable on mobile data.
- The recognition is 0.419 seconds per second of audio, on this machine. A 60-second Reel is therefore 25.14 seconds of work and the 600.3-second run took 251.5. On the file route that time is spent on your CPU while you wait; on a link route it would be spent on the server’s, and the request would have to stay open for all 251.5 seconds — a difference in who waits, not in how long the work takes.
- The two network destinations are huggingface.co and cdn.jsdelivr.net, and neither is Instagram. That is 1
fetchand 1importin the whole program. A link route would add the post page and the media host to that list, taking the count from 2 destinations to 4 — and the fourth is the one that would be receiving your video.
The 22,349 bytes, counted
Everything above is about what a link route would need. This section is about what the file route actually contains, because the claim “there is no link box” is checkable in the source rather than a matter of trust. These counts were taken on this machine from the deployed files, not from a description of them.
instagramappears 0 times in 22,349 bytes of app.js. The program has no concept of the platform at all — it knows a file, an audio track and a model. The same word appears 20 times in index.html, and all 20 are copy written for a human reader; 0 of them are in code that could act on it.type="url"appears 0 times in either file, and the page has 4 form controls with 0 text fields. Those 4 are 1 file input at line 40 of index.html, 2<select>elements for language and model, and 1 checkbox for timestamps. There is no input whose value could be a string you typed, which is a stronger statement than saying the box was left out.- The string
urlappears 5 times, and all 5 are generated by the program. Lines 77 and 78 build and pass the model’sgeneration_config.jsonaddress; lines 537, 539 and 546 create, assign and revoke a blob URL for the download. 0 of the 5 is a string that came from a visitor, so there is nothing for a pasted link to become. - 1
fetch(, 1import(, and 0 ofFormData,XMLHttpRequest,WebSocketandiframe. A file cannot be smuggled out through a channel that does not exist in the file: with 0FormDataand 0XMLHttpRequestthere is no upload path, and with 0iframethere is no hidden frame to load a third-party page in. The 12 tokens in the file input’sacceptlist are all extensions or wildcards, and none of them describes a URL. - The site says the same thing in prose, at line 152 of index.html. The FAQ entry reads: “No, and this page does not pretend otherwise — there is no link box. Fetching a post from a URL needs a machine somewhere running a fetcher, and this version was deliberately built without one so that nothing has to stay running and nothing of yours leaves the device.” That sentence is the summary of this entire page, and it was written before the measurements above were taken.
What the three sites that do take links say
The box is not imaginary — two of the three sites this page is measured against accept a pasted link, and they describe the box constantly. What none of them describes is the machine behind it. Across 33 pages and 226,638 characters of their visible text, the word paste appears 107 times and link 107 times, while CORS appears 0 times, cross-origin 0 times and fetch( 0 times.
- 107 mentions of pasting, 0 of the wall that makes pasting hard. The instruction is repeated in the same shape on all three sites — open the post, copy the link, paste it here — and in 226,638 characters not one of them says what happens between the paste and the text. That is the gap this page is answering, and it is why “why does this link tool fail on my Reel” has no answer anywhere on their pages.
- speakapp states a limit of 2 minutes, which is the only concrete number any of them gives. Their own instructions read: “Paste the Instagram Reel link into the input field above. We support all public Reels up to 2 minutes long.” A 2-minute ceiling is a server cost decision rather than a property of Instagram, and it is the kind of number that a file route does not need: this page’s measured run was 600.3 seconds, 5 times that limit, and it went through because the buffers were on the visitor’s machine.
- The word
serverappears 4 times in 226,638 characters, all 4 in speakapp privacy copy. Every one of them is a denial — “we never store the original video”, “nothing is saved on our servers after processing” — and 0 of the 4 explains what the server does while processing. Not storing is a different promise from not receiving, and the distinction matters when the bytes had to arrive somewhere before they could be transcribed. - getthescript and wayin describe the same 3-step flow without the mechanism. getthescript: “Copy the link from the Reel’s share menu and paste it above.” wayin: “Simply paste the IG link to extract the transcript.” Both sentences are accurate about what you do and silent about what has to exist for it to work, which is fair marketing and useless troubleshooting — when the paste fails, neither page has told you which of the 4 steps broke.
If all you have is a link, three routes that work
The honest answer is not “find a better link tool” but “turn the link into a file”, because a file is the one input this page can accept and the one input that needs no server on either side. All three routes below produce a file, and all three cost less than the 307,409,812 bytes a server would have to hold to do it for you.
- Screen-record it while it plays, then transcribe the recording. That gives you a file whose audio the browser decodes at its own rate: 384,000 bytes a second if the recording is 48 kHz stereo, so a 60-second capture is 26,880,000 bytes of buffer plus the 3,840,000-byte 16 kHz render. The recording is larger than the original file would have been, and it is still smaller than the 79.7 MB model download you only pay once.
- Save your own post from your own account. For a post you published, the file is yours to download, and it arrives as the same MP4 or MOV the accept list already names. 0 requests to Instagram are needed after that, which is the property that makes this route different from every link tool: the 9,147,662-byte file never leaves the machine.
- Ask the person who posted it for the file. It sounds like a non-answer and it is the only route that works on a private post — the 302 above is what a link tool meets on a public one, and a private post is worse, because there is no anonymous request that can reach it at all. What a private link needs is a session, and 0 of the three sites can borrow yours.
Why can’t I just paste the link?
Because a paste is a request, and the request is refused. This page’s program is 22,349 bytes with 0 occurrences of type="url" and 0 of the word instagram, so it has nothing to paste into — and even with a box, the 5 URLs tested on 2 November 2026 came back 302 with 0 bytes and 0 access-control headers, which a browser tab cannot read. Both halves have to be fixed before a box would do anything, and the first half is a server.
Does this tool ever contact Instagram?
No. The program makes 1 fetch and 1 import, and their destinations are huggingface.co for the model and its 3,832-byte configuration file, and cdn.jsdelivr.net for the recognition library. The string instagram appears 0 times in those 22,349 bytes, so there is no address in the code that could be contacted even by accident. That is why the first visit transfers 82,350,361 bytes and the second 8,823 bytes: everything it downloads is a public model file, and none of it is about your post.
Is a link-based tool less private than this one?
It is a different custody arrangement rather than a different opinion. On a link route your video arrives at somebody’s server — 9,147,662 bytes in the case measured here — and whether it is stored afterwards is a policy you cannot verify from outside. On this route the bytes stay where they are and the only thing that crosses the network is the 79,700,000-byte model, in the other direction. “We do not store it” and “it never arrived” are both privacy claims, and only the second one is checkable by counting requests.
Why do link tools fail on some Reels and not others?
Because there are 4 steps and each one can fail independently: the post page can answer 302 as it did for 5 of 5 requests here, the signed media URL can have expired, the media host can rate-limit the way the login page answered 429, and the server can run out of room holding 307,409,812 bytes of weights and buffer for a ten-minute file. A tool that works on one Reel and not the next is usually meeting a different one of those 4 walls, and 0 of the three sites tells you which.
Can a link tool transcribe a private Reel?
Not without your session. The 302 that a public post returns sends an anonymous request to a login page, and a private post has no anonymous view at all — there is no version of the page that a server can fetch without credentials it does not have. This page’s route sidesteps the question entirely: if you can see the post, you can screen-record it or save it, and the resulting file needs 0 requests to anywhere. The private Reel page covers what that route looks like step by step.
Last checked: 2 November 2026. The 5 URLs and their 302s, 0-byte bodies, 0 access-control headers and the single 429 were measured on this Windows machine on this date with a desktop Chrome user agent and an Origin header, and are a property of this machine’s network position rather than of Instagram in general — a residential connection may be answered differently, which is exactly the failure mode described above. The source counts were read from the deployed files: app.js is 22,349 bytes and index.html 17,965, with instagram, type="url", FormData, XMLHttpRequest, WebSocket and iframe each 0 times, fetch( and import( 1 time each, and url 5 times at lines 77, 78, 537, 539 and 546. The 76,894,612 and 40,844,231 weight sizes are the q8 files read from Hugging Face; 36,050,381, 153,789,224, 307,578,448, 768,946,120 and 408,442,310 are those figures multiplied out and printed here, as are 307,409,812, 345,829,012, 354,976,674, 2.998, 1,201.48, 38,400,000, 1,245.3125, 207.55, 25.14 and 9,333.6. The 230,515,200-byte decode, 38,419,200-byte render and 9,147,662-byte file come from the 600.3-second run recorded on this machine on 27 October 2026; the 82,350,361 and 8,823-byte visit totals were measured on 1 November 2026 on the same machine. The 226,638 characters and the counts of paste, link, server, CORS and fetch( were counted from the 33 competitor pages after stripping their crawler headers; the three quoted sentences are reproduced verbatim with the site named beside each. Nothing on this page was measured on a phone, and the media host behind a signed URL was not fetched at all — where this page describes it, it says so.
If you have a file and want to know whether the tool will take it, the no-login page covers what the browser needs in order to read one at all. If the wait is the problem rather than the source, the long Reel page has the measured ten-minute run in full, and the length limit page covers the ceiling. The timestamps page covers the 12 characters put in front of every line, the SRT and VTT page covers what the exports contain, and the five failures page sorts out which refusal you are looking at when a file will not go through.