Extract Instagram reel and video transcripts — the spoken words plus the on-screen text audio-only tools miss, with hook, call to action, beats, hashtags and view counts. Transcribes silent music-only reels too. No login. Reel links or a creator handle; CSV, JSON, Excel or API.
Long videos now explain a failed analysis in plain words. Reels above roughly 14 MB take a
separate upload path, and if the analysis service refused a video on that path the run log
showed the service's own raw technical response instead of a readable explanation. It now says
what happened in the same wording every other failure already used. Videos below that size were
never affected, and nothing else changes.
[0.0.31] - 2026-08-18
Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.30. Saved tasks continue to work identically.
[0.0.30] - 2026-08-17
Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.29. Saved tasks continue to work identically.
[0.0.29] - 2026-08-17
Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.28. Saved tasks continue to work identically.
[0.0.28] - 2026-08-17
Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.27. Saved tasks continue to work identically.
[0.0.27] - 2026-08-10
Changed
The rules that keep a supplier's name out of run output are now identical across all our actors. No
user-visible change here — this build only brings this actor in line with the shared copy.
[0.0.26] - 2026-08-10
Fixed
A run that fails because a service we depend on is unavailable no longer prints our internal
technical detail of that failure. The run log used to carry the raw text of the failure, which
included internal addressing details from the service this actor depends on. None of it was ever
useful to you, and none of it belongs in a run log. A
failed run now says that the failure was on our side, and nothing more.
A creator whose posts could not be read mid-scan is no longer reported as a bad handle. If the
source stopped answering while the actor was reading a creator's catalogue, the run finished with
"no results" and the note suggested checking the spelling of a handle that was perfectly fine. That
case now ends with the same "this was on our side, nothing was charged, try again shortly" message
the actor already showed when a run failed outright.
Changed
The API_USAGE storage record is now a coarse summary instead of a per-endpoint breakdown. It
keeps totalRequests and failedRequests and replaces the old per-endpoint map with
byCategory (fetch / search). The old shape described the internal request pattern of a
service this actor depends on, and our own cost per request; neither belongs in a record that
anyone integrating this actor can read. If you were reading totalRequests, nothing changes.
[0.0.25] - 2026-08-10
Changed
The free-plan limit ids listed in the run's FREE_LIMITS_APPLIED storage record now use one
shared vocabulary across all our actors, so the same limit reads the same wherever you meet it.
The human-readable message on each entry is unchanged.
[0.0.24] - 2026-08-10
Fixed
The "the problem is on our side" message from 0.0.23 now also covers a demo run, which is checked first and was still being told to try again.
[0.0.23] - 2026-08-10
Fixed
A run that fails on our side now says so, instead of telling you to change your input. When the analysis service itself is unavailable, nothing can be analyzed no matter what you submit — but the run used to close with "try a different creator handle", so the natural next step was to go and try more links that could not have worked either. It now says plainly that the problem is on our side, that there is nothing to fix in your input, and that nothing was charged. The same is true of a demo run, which used to say that running it again usually clears it.
A free run that analyzed everything you asked for no longer ends with a note about a limit it never hit. If you pasted three reel links on the free plan, you got all three — and were then told the free plan analyzes three reels per run. Nothing had been held back. The notice keyed on the setting for the maximum number of reels, which is 50 unless you change it, rather than on whether any reel was actually left out. Measured over the actor's first twelve days: it appeared on 83 free runs and only 25 of those had a single reel withheld. It now appears only when reels really were left out, and it still names how many.
The progress line no longer counts past its own total. A run on a creator with twelve carousels and five reels to analyze reported "analyzing 12 / 5" before the first reel had finished, because the two halves of that line were counting different things.
Added
The reels the free plan holds back now arrive in your results, as free rows. Paste ten reel links on the free plan and you get three analyzed reels — and, from now on, seven more rows carrying the link you submitted, not_analyzed in the status column, and the reason spelled out in error. Until now that fact lived only in the run log, on the Hook Board and in the run's storage, so anyone reading the results through the API or an AI agent had no way to tell "the free plan stopped at three" from "seven of your links were wrong".
They are never charged, exactly like the rows for carousels, photos and posts over three minutes.
On a creator run they carry the reel's real view count and how it compares with that creator's median, so you can see what was worth having before you decide anything.
Up to 25 of them per run. The complete ranked list is still in the run's NOT_ANALYZED record and the true total is still in the run summary — both uncapped.
Paid runs are unaffected. If you set your own reel limit, you asked for exactly what you got, and nothing extra is added.
Changed
Results now open with the reels that were analyzed. Posts that cannot be analyzed at all — carousels, photos, anything over three minutes, expired links — used to be written first, because they resolve instantly. On a creator who posts a lot of carousels that meant a screenful of rows with no transcript in them before the first real result, and anything that reads only the first few rows saw nothing but blanks. They are still all delivered, still free, still carrying the reason in the error column; they simply come last now.
If you read results by row position, that position has changed. Anything that reads by column name is unaffected.
An interrupted run still delivers them.
[0.0.22] - 2026-08-10
Changed
The actor is now called Instagram Reel & Video Transcript — On-Screen Text & Hooks. Nothing about what it does has changed, and no input, column or price is affected. The old name led with "Script", which is not the word people search for when they are looking for exactly this, so the actor was hard to find for the job it does best. The description now also says plainly that it works on Instagram videos as well as reels, that it transcribes silent music-only posts, and that it needs no login, no cookies and no Instagram account.
The README answers five more questions — how to transcribe a reel or a video, whether a login is needed, how to transcribe a creator's whole catalog at once, how to get transcripts programmatically, and how the cost compares with per-minute transcription billing. A new section explains what an audio-only transcript misses and what comes back instead.
The beats column now names the creator's actual numbers instead of saying that numbers were mentioned. A reel about picking an index fund used to come back with a section reading "explains the expense ratio, its impact on long-term returns, and gives a target range" — while the creator had said 0.03%, $100,000, 250k and the difference between 15.03% and 15.07% out loud. None of those reached your row. A reel unboxing a laptop said the price, the memory and the storage were "discussed", and named none of $1,000, 16 GB or 512 GB. Sections now carry the figure, price, percentage, date or product name itself, written the way the creator said it.
Measured on 18 reels in six languages, run three separate times with each version run twice over: the share of the spoken numbers and product names that survive into beats went from 36–47% to 71–75%. It held in all three rounds.
Sections stay short and there are still 3 to 8 of them per reel — the line gets more specific, not longer. On the same measurements the length of a section barely moved, and a reel costs the same to analyze as before.
If a value is unclear in the audio it is left out rather than guessed at, so a number that appears in beats is one the creator actually said.
Reels in every language keep coming back in their own language, unchanged from 0.0.21.
Rows from earlier runs are still correct — their sections are simply vaguer than the ones you will get from now on. Analyze a reel again if you want the numbers in it.
[0.0.21] - 2026-07-31
Fixed
Reels that are not in English now come back in their own language. The transcript, the on-screen text and the call to action were always kept word for word — but the parts the actor writes for you were quietly being written in English instead. A Russian reel got an English summary, English topics, English takeaways and English section labels. Spanish, Portuguese, German and Italian reels did the same. They now come back in the language the creator is actually speaking, which means you can search your results using the words you heard. Checked on reels in five languages.
If you have analyzed reels in a language other than English, the summary, topics, takeaways and beats columns on those older rows are in English. Analyze them again to get them in the original language. Everything else on those rows was correct.
Product and brand names are unchanged — they keep their usual spelling, so entities still reads "MacBook Air" and not a translation of it.
Changed
The reel's structure is now visible in the Scripts view. The beats column — the reel broken into sections, each with the second it starts and the second it ends — was only reachable by switching the table to "All fields". It now sits next to the transcript, where you are already reading.
The structure column now documents its own end times. Each section has carried both a start and an end second since 0.0.18, but the published description of the column only listed the start, so some tools reading the schema did not know the end was there.
[0.0.20] - 2026-07-31
Added
The video file itself.videoUrl is a direct link to the reel's video, at the best quality Instagram offers — ready to hand to an editor, an archive or anything else that takes an MP4. videoWidth and videoHeight say what size it is.
And the moment that link stops working. Instagram signs these links and they expire. Most last about a day and a half, some several days, and there is no rule you can rely on — so videoUrlExpiresAt gives you the exact time instead. Save the file before then, or analyze the reel again for a fresh link. (The same is true of thumbnailUrl, which lasts roughly four days — the note in the field description used to say two, and it was wrong.)
Carousel slides.slideImageUrls links every image of a carousel post. A carousel has no soundtrack to read, so it is never analyzed and never charged for — but the row is no longer close to empty.
The columns you join on.mediaId is Instagram's own identifier for the post and never changes, unlike the URL. ownerId is the same for the account and survives a change of username, which the handle does not. ownerFullName and ownerIsVerified come along with it.
hashtags and mentions, pulled out of the caption as clean lists — no #, no @, in the order written, with repeats dropped.
audioId, the same value on every reel that used a given sound, so you can group a set of reels by the track they rode.
Fixed
A creator who hides their like and view counts no longer gets guessed at. Instagram keeps sending numbers for those accounts, and they are placeholders rather than the real figures. Until now those placeholders went straight into viewCount and likeCount — and, worse, into viewsVsCreatorMedian and isOutlier, which are built from them. Now the new metricsHidden column says true, the two counts are left empty, and the reel is not scored against a number that was never real. If you have earlier rows from an account with hidden counts, treat their views, likes and outlier flag as unreliable. Everyone else's rows are unchanged.
[0.0.18] - 2026-07-30
Fixed
Beat timestamps were wrong on reels longer than about a minute, and they are right now. Every segment in beats carries the second it starts, and past the one-minute mark those numbers were landing far beyond the end of the video — a 2m36s reel reporting a beat at 224 seconds. Checked against every row this actor has produced: 70 of the 76 reels longer than 63 seconds were affected, and none of the 131 shorter ones. Shorter reels were always correct, which is why it took a while to see. If you have rows from an earlier run, the wrong values are readable rather than lost: 120 meant 1:20, so 80 seconds — but the reels under a minute need no correction at all.
Added
Every beat now carries the second it ends as well as the second it starts. A beat is a [start, end] pair you can scrub straight to in an editor, without reading the next row to find out where this one stops. Where a reel has a pause between two segments, that pause is now visible instead of being absorbed into the beat before it.
Four audio columns.audioSource says whether the creator recorded the sound themselves (own_original), used another account's original sound (borrowed_original), or used a track from Instagram's library (licensed_music) — a distinction worth making, since riding a trending sound and making your own are opposite decisions. audioTitle and audioArtist name a licensed track; audioOwnerUsername names the account a sound belongs to. Measured across 66 reels before it was built: 21% licensed, 73% own sound, 6% someone else's. They cost nothing extra to read and appear on every row, including reels that were skipped.
Every timestamp is now checked against the reel's real length before it reaches you. One that cannot be true is left empty rather than quietly rounded to the nearest plausible number, and the row's quality note says how many.
Changed
Column order. The four audio columns sit with the rest of the post's metadata, after thumbnailUrl and before analysisStatus. No column was renamed or removed, so anything reading by column name is unaffected; a spreadsheet reading by position will see the analysis columns shift right by four.
The Hook Board's timeline is drawn from the new end times, so on a long reel it no longer stretches its last segments from numbers that ran past the end of the video.
[0.0.17] - 2026-07-30
Added
Pinned comments, in two new columns.creatorPinnedComment is what the creator pinned under their own reel — often the link, the full recipe or the next step, and none of it visible in the video. pinnedComments carries every pin, up to Instagram's limit of three, each marked with whose it is: creators pin followers' comments too, and those promote the follower's ask, not theirs.
Changed
cta and ctaType still describe the video and nothing else. A pinned comment never rewrites them: across 92 reels measured before this was built, a creator pinned a call to action on 5% of them, and putting a one-in-twenty guess into a column people sort by is worse than leaving it honest. Both sources now sit side by side in the Scripts view.
Fixed
Reels reached through a creator handle could return the wrong post's data for anything that needed the post's internal id. Instagram's feed endpoints send that id as a 19-digit number, which loses its last digits in transit, and a request built from the damaged id comes back empty rather than failing. Reel links were never affected. Nothing in the output used that id before this release, so no earlier run was wrong — the pinned columns are its first consumer, and they would have been silently empty for every creator-handle run.
The model prompt and the response schema are untouched in this release, so the schema fidelity gate in scripts/schema-gate/ does not apply.
[0.0.16] - 2026-07-30
Added
Four more answers about what this actor is and is not — whether it is speech-to-text or reads the frames (both, in one pass), whether the transcript can be exported as an SRT or VTT subtitle file (no, and what is timed instead), and whether it reads the caption under the post or Instagram's own closed captions (the caption comes back as a column; the auto-captions are not used).
Four more entries in "When to use it" — transcribing reels in bulk, researching UGC and ad creative, vetting an influencer before paying them, and reporting to a client.
Related actors now lists the Instagram Profile MCP Server, the one family member the table was missing.
Changed
The Store description now leads with what the actor extracts and names the transcript explicitly, instead of opening with "Get what an Instagram reel actually contains". Same actor, same output — it is the sentence people and agents search against.
The input form now carries a short summary of what the actor does and how the two modes differ, which is what an AI agent reads when it inspects this actor as a tool. It had been blank.
Fixed
The Hook Board quoted a run's total to three decimals — "Charged $0.225" — where the run log and the run message said $0.23 for the same charge. Totals now round the way a bill does everywhere. The per-reel price is still shown to three decimals, because that is how it is priced.
[0.0.14] - 2026-07-30
Fixed
The demo run's cost was quoted a cent low in the run log and the run message — $0.22, where the actual charge is $0.225.
[0.0.13] - 2026-07-30
Changed
The demo run is now charged for the reels it analyzes — about $0.23 for the three it delivers. It is a real analysis of three real reels, and it was the only run in this actor that produced full results for nothing. What keeps it cheap is the three-reel cap, not a waiver: Apify's Free plan includes $5 of monthly credit, so trying the actor still costs nothing out of pocket. There is still no limit on how often you can run it.
The run log, the run message, the Hook Board and the README now say what the demo costs instead of calling it free.
[0.0.12] - 2026-07-30
Changed
The demo run says it is a demo run. Leaving the input empty has always started a free run on a sample creator, but nothing after the Start button said so: the log never mentioned it, and the closing message was the free-plan one — it told you to raise a limit you could not raise, about a creator you never picked. A demo now announces itself in the run log, closes with a message that says the run was free and how to point the actor at your own account, and keeps its Demo run badge on the finished Hook Board instead of showing an upgrade box for someone else's catalog.
The demo run has no monthly limit. It was two a month; it is now unlimited, on every plan.
A run's projected cost in the log is now the amount you could be charged, instead of an internal figure that was not your bill.
Fixed
A demo run no longer uses up one of the free plan's 15 monthly runs. It never should have — 0.0.9 said as much — but it did.
Setting a date range or a minimum view count without a creator handle starts the demo, which cannot use them. The run now says so instead of dropping them silently.
Added
RUN_SUMMARY and the live status endpoint now carry testRunMode, so a script or an agent reading a run can tell a demo apart from a real one.
[0.0.11] - 2026-07-30
Changed
The FAQ answer about trying the actor for free now states the monthly run allowance as well as the per-run reel limit, so the free plan's limits are all in one place.
[0.0.10] - 2026-07-30
Changed
The Output sample in the README is now a silent English reel with 3.8 million views — the whole tip is written on screen, and the row shows an empty transcript beside four lines of on-screen text.
[0.0.9] - 2026-07-30
Changed
The free plan now pays the same price per reel as the entry paid plan — $0.075 instead of $0.45. Upgrading no longer changes what a reel costs; it lifts the limits on how much one run can do.
The free plan runs 15 times a calendar month, and the allowance resets on the 1st. A run over the limit fetches nothing, charges nothing, and says so. Demo runs on empty input are not counted and keep their own twice-a-month allowance.
The Hook Board and the run message now explain the free plan in terms of what is still in the catalog, not in terms of a price difference that no longer exists.
Added
Live view. A running analysis now serves its Hook Board directly, so progress is visible in the run's Live view tab as it happens, alongside /api/status for anyone polling a run from a script.
The Hook Board leads with a progress bar and a six-cell count — analyzed, charged, silent reels, skipped, failed, and what is left over — and matches the look of the other actors from this author.
[0.0.8] - 2026-07-29
Fixed
The free demo run is limited to two per month again, as the Store page and the run message both say. The counter behind it was unreachable and failed open, so the limit never applied.
[0.0.7] - 2026-07-29
Fixed
Maintenance build. No change to input, output or pricing.
[0.0.6] - 2026-07-29
Added
Example tasks section in the README: twelve ready-to-run examples covering both modes — pulling the script out of a single reel, reading the text burned into a silent one, and breaking down a whole creator's reels. Each opens pre-filled and runs in one click.
[0.0.5] - 2026-07-29
Added
New Reel scripts & hooks output view, showing the spoken transcript, the on-screen text and how far the reel beat the creator's median side by side. The existing Overview and Scripts views are unchanged, and Overview is still the one you land on.
[0.0.4] - 2026-07-29
Added
Four more FAQ entries, including how to read the Hook Board to find a competitor's working hooks, and what happens to posts longer than 3 minutes.
The Support section now links straight to the actor's Issues tab.
[0.0.3] - 2026-07-29
Fixed
The Hook Board is written again. The run was sending a content type that did not byte-for-byte match the one the actor declares for that record, so the page silently never appeared — and the failure was being swallowed instead of logged.
[0.0.2] - 2026-07-29
Fixed
The free demo run on empty input is no longer charged. It was capped at three reels and then billed for all three — a reel cap is not a billing rule, and the two are now separate.
A run that could not read its own tier price no longer prints a price comparison against itself ("$17.32 instead of $17.32"). Both the Hook Board and the run message now leave the comparison out rather than show a broken one.
Counting reads as a sentence: "1 reel analyzed", "One post came back as a free row".
[0.0.1] - 2026-07-29
First release.
Added
Mode 1 — Break down specific reels. Paste reel links or shortcodes and get one row per reel.
Mode 2 — Break down a creator's reels. Give a public handle; the run reads the creator's recent catalog, computes their median view count, then analyzes the reels you asked for. Every row is scored against that creator's own median.
Spoken transcript, word for word, never translated. A backing music track is not treated as speech, so a music-only reel returns an empty transcript rather than song lyrics.
On-screen text burned into the video frames, one entry per distinct card. Word-by-word caption animations are collapsed to their final form instead of being reported a dozen times as growing fragments.
Hook, spoken and on-screen, with the second it ends and a closed hookType value.
Structure as timestamped beats — hook, context, point, proof, demo, objection, cta, outro.
Call to action, verbatim and typed, plus content format, topics, summary, takeaways, named entities and language.
Performance columns — viewsVsCreatorMedian and isOutlier, measured from real view counts.
Quality flag. Output the built-in check does not trust is delivered with qualityFlag: "suspect" and a note saying what was collapsed or dropped — and is never charged for.
🔥 Hook Board — a live page for the run that becomes, at the end, a board of which hooks, formats and calls to action outperform for this creator, every reel ranked by its multiple of the median, and a visual timeline of each reel's structure.
NOT_ANALYZED — every reel in the catalog the run did not analyze, ranked by views, written on every run.
Free demo run. An empty input analyzes a few real reels and is not charged, twice a month per user.
Reels up to 3 minutes are analyzed, which is Instagram's own maximum Reel length. Longer posts return as free rows with their metadata intact.
Runs survive migration and abort without re-analyzing or double-charging a reel.