Instagram Reel Transcript Scraper — Instagram Video Transcript
Pricing
from $66.00 / 1,000 reels
Instagram Reel Transcript Scraper — Instagram Video Transcript
Instagram reels scraper with transcripts — the spoken words plus the on-screen text (OCR) audio-only tools miss, and each reel's hook, beats and call to action. Transcribes silent music-only reels too. Paste reel links, a profile handle to rank its reels by views, or a keyword or hashtag to search.
Pricing
from $66.00 / 1,000 reels
Rating
0.0
(0)
Developer
Andrey Afanasenko
Maintained by CommunityActor stats
2
Bookmarked
1.3K
Total users
555
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
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, a creator handle, or a keyword or hashtag; CSV, JSON, Excel or API. For content strategists, agencies and creators who need the script, not the caption. Works on silent music-only reels, where audio-only transcript tools return an empty string.
🆓 Free to start: no card beyond your Apify account — leave the input empty, press Start, and the actor analyzes 3 real reels of a sample creator, capped so the trial stays cheap · Apify's Free plan includes $5 of monthly platform credit, around 66 reels here · every run also lists, ranked by views, the reels it did not analyze, so you always know what is still there.
🎯 What it does
Most Instagram tools read the caption. The caption is what the creator wrote afterwards. This actor reads the video: the audio track and the frames, in one pass.
| You get | Why it matters |
|---|---|
| Spoken transcript, word for word, never translated | The actual script, not a paraphrase |
| On-screen text, one entry per distinct card | Recipe quantities, prices, step numbers, code, URLs — usually the most valuable text in the reel, and invisible to audio-only tools |
| Hook, spoken and on-screen, plus the second it ends | The first three seconds decide the reel |
| Hook type as a closed value | question, bold_claim, listicle, contrarian, … — sortable, groupable, countable |
| Structure — beats with start and end times | hook → context → proof → cta, each with the second it starts and the second it ends, checked against the reel's real length |
| Call to action, verbatim and typed | What the creator actually asks for |
| Pinned comments, and whose they are | Where the link, the full recipe or the next step usually ends up. A creator can pin a follower's comment, so every entry says who wrote it |
| Audio — own recording, borrowed sound, or a licensed track | Whether the creator made the sound or rode someone else's. Licensed tracks come with title and artist; a borrowed sound comes with the account it belongs to |
| Format, topics, summary, takeaways, named entities, language | The row a swipe file is built from — written in the creator's own language, not translated into English |
| Views vs this creator's median, and an outlier flag | Measured, from real view counts — never an invented "virality score" |
| The video file itself, plus the moment its link expires | Hand it straight to an editor or an archive. Instagram signs these links and they do expire, so the row tells you when instead of leaving you a 403 to discover |
| The post's own facts — id, hashtags, mentions, creator name and id, carousel slides | The columns you join on. A creator can change their handle; their id does not |
The one thing nothing else on the Store does: a reel with no speech at all still returns a full row. Music-only recipes, text-on-screen listicles, silent tutorials — the whole category where the information lives in the frame rather than the audio.
🎙 Instagram video transcript — and the half of it audio-only tools miss
Paste a reel link and you get an Instagram video transcript: every word spoken, in the original language, never translated. That much you can get anywhere. What happens in the same pass is what you cannot — the frames are read too, so the text burned into the video comes back as onScreenText, one entry per distinct card.
That matters because a large share of Instagram reels have no speech at all. A music-only recipe, a silent listicle, a price card, a step-by-step tutorial under a trending sound — an audio-only transcription returns an empty string for every one of them, and bills you for it anyway. Here the same reel returns hasSpeech: false and the complete on-screen text, the hook, the beat structure and the call to action.
- Transcribe one Instagram reel or video → paste the
/reel/link into Reel links. - Transcribe a creator's whole catalog → put the handle into Creator handles.
- Find and transcribe reels on a topic → type a word into Search words or phrases, or a hashtag into Hashtags — from any creator, the most viewed first.
- No login, no cookies, no Instagram account, no password. Nothing is connected to your account and nothing is posted on your behalf, so there is nothing to get banned.
- You always see what was left out. Reels the free plan held back come back as free rows of their own, with the reason in
error— so a script or an AI agent reading only the results knows a limit was hit, not that the links were bad. - One reel, one row: transcript, on-screen text, hook, call to action, beats, hashtags, view counts and the video file's own link.
📦 Output sample
One real row, exactly as the actor produced it. A reel with 3.8 million views in which nobody says a single word — the whole tip is written on screen:
{"url": "https://www.instagram.com/reel/DXuciRbjX2O/","shortcode": "DXuciRbjX2O","username": "buzzfeedtasty","postedAt": "2026-04-29T19:30:07.000Z","durationSeconds": 8.2,"postType": "reel","caption": "Pre-shredded cheese is super convenient—but for the best results, it’s actually worth giving it a quick rinse first! 🧀","viewCount": 3842876,"likeCount": 15028,"commentCount": 800,"metricsHidden": false,"thumbnailUrl": "https://scontent-lga3-2.cdninstagram.com/v/t51.82787-15/685629627_18566435230066699_8839999739252291674_n.jpg?…","videoUrl": "https://scontent-lga3-1.cdninstagram.com/o1/v/t2/f2/m86/AQMg6vrL6AavVVUBtSBru_blLDMuD58_-jP-3H9ytoVyhD4M-xN0UkG2Ab8Jgr_JXERpSwN9J9altWkDK1eQSyrEldkP1tqG3uE1imQ.mp4?…","videoUrlExpiresAt": "2026-08-01T21:33:28.000Z","videoWidth": 720,"videoHeight": 1280,"slideImageUrls": [],"mediaId": "3886169028947705230","ownerId": "2125506698","ownerFullName": "Tasty","ownerIsVerified": true,"hashtags": [],"mentions": [],"audioSource": "own_original","audioTitle": null,"audioArtist": null,"audioOwnerUsername": "buzzfeedtasty","audioId": "18589307398030479","analysisStatus": "analyzed","error": null,"hookSpoken": null,"hookOnScreen": "wash your pre-shredded cheese","hookType": "how_to","hookEndSeconds": 3,"spokenTranscript": null,"hasSpeech": false,"wordsPerMinute": null,"onScreenText": ["wash your pre-shredded cheese","to remove anti-caking agents","washed","unwashed"],"onScreenTextCount": 4,"onScreenTextIsCaptionsOnly": false,"beats": [{"startSeconds": 0,"endSeconds": 3,"label": "hook","text": "Washing pre-shredded cheese to remove anti-caking agents."},{"startSeconds": 3,"endSeconds": 6,"label": "proof","text": "Comparing grilled cheese made with washed vs. unwashed cheese, showing better melt."},{"startSeconds": 6,"endSeconds": 8,"label": "demo","text": "Reiterating the process of washing pre-shredded cheese."}],"cta": null,"ctaType": "none","pinnedComments": [],"creatorPinnedComment": null,"contentFormat": "how_to_demo","topics": ["shredded cheese","cooking tips","food hacks","grilled cheese","cheese melting"],"summary": "This video provides a cooking tip on how to improve the melt of pre-shredded cheese. It demonstrates washing the cheese to remove anti-caking agents, which are often added to prevent clumping. A visual comparison shows that washed cheese melts more smoothly and stretches better in a grilled cheese sandwich than unwashed cheese.","takeaways": ["Wash pre-shredded cheese to remove anti-caking agents for a better melt.","Removing anti-caking agents from shredded cheese can improve its stretch and texture in cooked dishes."],"entities": [],"language": "en","visualNotes": "A person washes pre-shredded cheese in a colander. The video then shows a side-by-side comparison of two grilled cheese sandwiches, one made with washed cheese and the other with unwashed cheese, demonstrating the superior melt and stretch of the washed cheese.","viewsVsCreatorMedian": 4.19,"isOutlier": true,"qualityFlag": "ok","qualityNote": null,"processedAt": "2026-07-31T10:44:49.182Z"}
Only the two long link signatures are shortened above; every other value is verbatim.
An audio-only transcript tool returns {"transcript": ""} for this reel. The instruction, the reason behind it and the before-and-after labels only ever existed in the frame — and this one reel beat its creator's median by 4.2×.
videoUrl is the video file itself, at Instagram's best quality, ready to hand to an editor or an archive. Instagram signs both that link and thumbnailUrl, and they expire — the video sooner than the picture, and not always after the same number of hours. So rather than asking you to remember a rule, the row tells you: videoUrlExpiresAt is the moment that link stops working. Save the file before then, or analyze the reel again for a fresh one.
Two more columns worth knowing about before you need them. metricsHidden is true when the creator has switched off their public like and view counts; the row then leaves viewCount and likeCount empty instead of repeating the placeholder Instagram sends in their place, and isOutlier stays empty too rather than scoring a reel against a number that was never real. And slideImageUrls carries a link to every image of a carousel post — carousels have no soundtrack to read, so on those rows it is the whole of the content.
In Mode 2 each row also carries shareCount — how many times the reel was shared — and, for a reel the creator also published on Facebook, facebookPlayCount. Those Facebook plays are already part of viewCount, so viewCount − facebookPlayCount is the Instagram-only figure. Both stay empty in Mode 1: a single reel looked up by its link does not report them. In Mode 3 a reel found by a word carries both, a reel found by a hashtag carries neither — and every Mode 3 row says which search found it in foundBySearch.
Nobody pinned a comment under that one, so both pin columns are empty. When a creator does pin one, it arrives verbatim:
"creatorPinnedComment": "Comment \"NEXUS\" For More Information On How We Scale Businesses With Content","pinnedComments": [{ "username": "…", "text": "Comment \"NEXUS\" For More Information On How We Scale Businesses With Content", "isCreator": true, "likeCount": 29 }]
cta and ctaType stay the reel's own — they describe what happens in the video, and a pinned comment never rewrites them.
That creator recorded their own sound, so the audio columns name them and stop there. The other two cases fill in more — a licensed track brings its title and artist, and a borrowed sound names the account it actually belongs to, which is how you spot a creator riding someone else's trend:
"audioSource": "licensed_music","audioTitle": "Don't Dream It's Over","audioArtist": "Crowded House","audioOwnerUsername": "crowdedhousehq"
"audioSource": "borrowed_original","audioTitle": "Small habits","audioArtist": null,"audioOwnerUsername": "annierose.nelson"
The second one is the interesting case: the reel is by celin.ee_, but the sound belongs to annierose.nelson. Both say original_sounds in Instagram's own data, which is why this is a three-value column and not a yes-or-no flag.
⚡ Quick start
- Open the actor and leave the input empty.
- Press Start. The demo run analyzes 3 real reels of a sample creator — capped at 3 to keep it cheap, about $0.23, which your free monthly credit covers.
- Look at the 🔥 Hook Board link in the run's Output tab.
Then run it for real:
- One reel or a handful → paste links into Reel links.
- A whole creator → put their handle into Creator handles.
- A topic, from any creator → type a word or phrase into Search words or phrases, or a hashtag into Hashtags.
Fill in one mode's fields and leave the others empty.
⭐ Choose your mode
The actor has three modes. Which one a run uses is decided by the field you fill in.
🎯 Mode 1: Break down specific reels
Paste reel links or shortcodes. One row per reel. Use this when a client sends you five links, when you want to check a single competitor post, or when you are calling the actor from a script.
🎯 Mode 2: Break down a creator's reels
Give a public handle. Before spending anything on analysis, the run reads that creator's recent catalog, works out their median view count, and only then analyzes the reels you asked for — sorted by top-performing unless you say otherwise. That is where viewsVsCreatorMedian and the outlier flag come from, and it is why the Hook Board can tell you which openings actually beat this creator's own average.
🎯 Mode 3: Find reels by keyword or hashtag
Type a word or a short phrase — meal prep, morning routine, рецепты — or a hashtag, and the run analyzes the reels Instagram's search returns for it, from any creator, the most viewed first. Use this when you know the topic but not the accounts: researching a niche, collecting hooks for a trend, or building a swipe file on a subject.
How deep each search goes is Instagram's, not a setting: a word returns about 20 to 30 reels in all, a hashtag goes much deeper — hundreds of reels under the tag, mostly from the last couple of weeks. Set how many to analyze per search and in total; every reel found beyond that is still listed, with its view count, in NOT_ANALYZED. A reel that two of your searches both find is analyzed and charged once, and foundBySearch on each row says which search found it. Searching itself is free — you pay the usual price per analyzed reel and nothing else. There is no creator median here (the reels come from many creators), so viewsVsCreatorMedian stays empty; sort by viewCount instead.
🧭 When to use it
- Building a swipe file. Forty reels from three competitors, grouped by hook type, sorted by how far they beat the creator's median.
- Reverse-engineering a format. The beat timeline shows how long the hook runs, where proof lands, and when the ask arrives.
- Writing scripts. Export the transcripts of everything that outperformed and paste them into your writing tool: "Here are 40 hooks from @handle that beat their median. Write 10 more in the same voice."
- Auditing your own account. Which of your openings work, in your own numbers, not a scoring model's.
- Cataloguing recipe, checklist and price content, where the substance is burned into the frame and no audio tool can reach it.
- Transcribing reels in bulk. Speech-to-text on the audio and text read straight off the frames, in the same pass — a list of links comes back as text, including the burned-in subtitles a creator added by hand.
- Researching UGC and ad creative. What a brand's paid creators actually open with, how they phrase the ask, and which of those reels beat that creator's own median.
- Vetting an influencer before you pay them. What they say on camera, how they close, and whether their best reel is an outlier or their normal.
- Researching a topic before you film it. Search the word or the hashtag, then read how the most viewed reels on it open, what they show on screen and what they ask for.
- Reporting to a client. One row per reel — transcript, hook, call to action and the multiple of the median in the same table, instead of a folder of screenshots.
🎯 Example tasks
Ready-to-run examples — each opens a pre-configured task you can run in one click (no setup):
- Extract the script from an Instagram reel — Paste a reel link and get the spoken script word for word, plus the text on screen, the hook it opens with and the call to action.
- Transcribe an Instagram reel to text — Turn a reel into readable text. Every word said out loud, plus anything written on screen that the audio never says.
- Get the on-screen text from an Instagram video — Read the text burned into the frame — steps, captions, prices, lists — in the order it appears. Audio-only tools cannot see any of it.
- Find the hooks that work for any Instagram creator — Give a handle. Get their reels ranked by how far each one beat their own median views, with the exact opening line of every one.
- Find the call to action in top reels — What a creator actually asks for at the end of their best reels — save, follow, comment, link — and how far each reel beat their median.
- Build a swipe file from a competitor's reels — One row per reel: script, on-screen text, hook, structure and result. Paste a handle and get a working swipe file in minutes.
- Compare reel formats for any Instagram account — Talking head, voiceover, silent how-to, skit — see which format an account uses for its best reels, and how each one performed.
🛠 Input
| Field | Mode | Type | Default | Notes |
|---|---|---|---|---|
reelUrls | 1 | array | — | Reel links or bare shortcodes. Share links do not carry a post id — copy the /reel/ URL from a browser. |
maxItemsMode1 | 1 | integer | 50 | Stops after this many reels. |
analyzeCarousels | 1 | boolean | false | Hand carousel links to the Instagram Carousel Analyzer, which reads the slides as a second run in your account and charges $0.25 per analyzed carousel ($0.20 from Gold). This run charges nothing for carousels. Off: a carousel link comes back as a free row. |
usernames | 2 | array | — | Public handles, without the @. |
sortBy | 2 | select | Top performing | Or Newest. |
postedWithinDays | 2 | integer | — | Leave empty for the whole catalog. |
postedAfter | 2 | date | — | Only reels posted on or after this date (UTC): 2026-03-01, or a span back from today like 3 weeks. If postedWithinDays is also set, the later of the two start dates is used. |
postedBefore | 2 | date | — | Only reels posted on or before this date (UTC), the whole day included: 2026-03-31 or 1 week. The run pages past the creator's newer posts first, about 480 per feed at most. |
minViews | 2 | integer | — | Leave empty to include everything. |
maxItemsMode2 | 2 | integer | 50 | Per handle. Reels beyond the limit are still listed, ranked by views. |
searchQueries | 3 | array | — | Words or short phrases, one per row. Instagram returns about 20 to 30 reels per phrase. A #tag typed here is searched as a hashtag. |
searchHashtags | 3 | array | — | Hashtags, with or without the #. Hundreds of reels deep, mostly from the last couple of weeks. |
maxItemsPerSearch | 3 | integer | 10 | Per word or hashtag. Reels found beyond it are listed in NOT_ANALYZED. |
maxItemsMode3 | 3 | integer | 50 | Across every search in the run. The searches take turns, so a small total still covers each one. |
sortByMode3 | 3 | select | Most viewed | Or Newest, or Instagram's order (the order the search returned them in). |
postedAfterMode3 | 3 | date | — | Only found reels posted on or after this date (UTC), or a span like 2 weeks. |
postedBeforeMode3 | 3 | date | — | Only found reels posted on or before this date (UTC). A hashtag mostly returns recent reels, so a window far back finds little. |
minViewsMode3 | 3 | integer | — | Only found reels with at least this many views. |
analyzeLongVideos | all | boolean | false | From 13 November 2026: analyze videos longer than 3 minutes, up to 20, charged as one reel plus an Extra minute for each started minute beyond the first 3 (see the Pricing tab). Off, or before that date: they come back as free too_long rows. |
Pick your mode first. The run's mode is the first of these that is filled in: reelUrls (Mode 1), usernames (Mode 2), searchQueries or searchHashtags (Mode 3). The fields of the other modes are skipped — and if you set one, the run log and USER_MESSAGE name it, and point at this mode's own field when there is one.
💰 How much will analyzing Instagram reels cost?
$0.075 per reel on every plan, including the free one, dropping to $0.06 at the highest volume tiers. From 13 November 2026 the lowest price is $0.066, on Gold, Platinum and Diamond. Any length up to 3 minutes — there is no per-minute surcharge, so a 3-minute tutorial costs the same as a 15-second hook.
| Plan | Per reel | 50 reels | Per reel from 13 Nov 2026 | Extra minute from 13 Nov 2026 |
|---|---|---|---|---|
| Free | $0.075 | — | $0.075 | $0.045 |
| Bronze | $0.075 | $3.75 | $0.075 | $0.045 |
| Silver | $0.070 | $3.50 | $0.070 | $0.042 |
| Gold | $0.066 | $3.30 | $0.066 | $0.040 |
| Platinum | $0.063 | $3.15 | $0.066 | $0.040 |
| Diamond | $0.060 | $3.00 | $0.066 | $0.040 |
Videos longer than 3 minutes. Until 13 November 2026 they are not analyzed: they come back as free too_long rows, even with Analyze videos longer than 3 minutes (analyzeLongVideos) on, and nothing is charged for them. From 13 November 2026, with that option on, videos up to 20 minutes are analyzed and charged as one reel plus an Extra minute for each started minute past the first 3. Example: a 5m10s video is 2m10s past 3 minutes, so 3 started minutes — on Bronze $0.075 + 3 × $0.045 = $0.21, on Gold $0.066 + 3 × $0.040 = $0.186. With the option off, nothing changes: longer videos stay free rows.
Plans differ in how much you can run, not in what a reel costs. The demo run on empty input is capped at 3 reels — about $0.23 — so trying the actor stays cheap, and there is no limit on how often you run it.
You are only charged for reels that were actually analyzed. Reading a creator's catalog (Mode 2) or running a search (Mode 3) costs nothing. Private, deleted, photo, carousel, expired-link and failed reels are delivered as free rows with the reason in the error column, and so are videos longer than 3 minutes unless they are analyzed with the option above. Results the built-in quality check flags as low-quality are delivered too — and also not charged.
🆓 Free vs paid plan
| Free | Paid | |
|---|---|---|
| Price per reel | $0.075 | $0.075 → $0.060 ($0.066 from 13 Nov 2026) |
| Reels per run | 5 (Mode 1: 3) | your maxItems |
| Creators per run (Mode 2) | 1 | unlimited |
| Searches per run (Mode 3) | 1 | unlimited |
| Runs per month | 15 | unlimited |
| Which reels Mode 2 and Mode 3 pick | the top 5 by views | your sortBy / sortByMode3 |
| Every field, full transcript, full on-screen text | ✅ | ✅ |
| Hook Board and the pattern tables | ✅ | ✅ |
| Ranked list of what was not analyzed | ✅ | ✅ |
| Demo run on empty input | 3 reels (~$0.23), unlimited | 3 reels, unlimited |
Free rows are not trimmed — they are the same complete rows a paid run produces, at the same price per reel. What the free plan limits is how much you can do at once: five reels from one creator or one search per run, fifteen runs a month, and the allowance resets on the 1st. A free Mode 2 or Mode 3 run deliberately analyzes the five most viewed reels rather than the five most recent, because five great hooks is the most useful five rows we can hand over.
Each free run counts as one of the fifteen when it starts; a free run that analyzes nothing, or fails, gives its run back, and a run you stop yourself after it started still counts. If the count of your month's runs cannot be read, the free run stops before any work and charges nothing — run it again in a minute. While an unusually large number of new free accounts run this Actor at once, free runs from new accounts may be reduced to one reel for a short while. Paid plans are never affected.
🧪 Filter recipes
- What works for this creator right now → handle +
postedWithinDays: 90+sortBy: Top performing+maxItemsMode2: 30. - Their greatest hits, ever → handle +
minViews: 100000. - A fair read of their recent baseline → handle +
sortBy: Newest+postedWithinDays: 30. - One past month or campaign → handle +
postedAfter: 2026-03-01+postedBefore: 2026-03-31+sortBy: Top performing. - What works on a topic right now →
searchHashtags: ["mealprep"]+postedAfterMode3: 2 weeks+maxItemsPerSearch: 20. - One subject, several angles →
searchQueries: ["meal prep", "high protein lunch"]+searchHashtags: ["mealprep"]+maxItemsMode3: 30. A reel found twice is analyzed once. - A competitor set → three handles +
maxItemsMode2: 20. Every reel is scored against its own creator's median, so the comparison holds across accounts of different sizes.
🔁 Resume / checkpoint
Runs survive interruption. A migrating or aborted run records which reels it already finished, so resuming never re-analyzes a reel or charges for it twice. Everything finished before the interruption is already in the dataset — rows are pushed as each reel completes, not held to the end.
📡 Live status & storage records
| Record | What is in it |
|---|---|
🔥 Hook Board (status.html) | Live progress while the run works, then: which hooks, formats and calls to action outperform for this creator; every analyzed reel as a card ranked by its multiple of the creator's median; and a CSS timeline of each reel's structure |
RUN_SUMMARY | Status, counts, the creator's median views, duration, notes |
NOT_ANALYZED | Every reel in the catalog (Mode 2) or found by the search (Mode 3) that this run did not analyze, ranked, with URL, views, length, date, and the multiple of the median (Mode 2) or the search that found it (Mode 3) |
USER_MESSAGE | Plain-language account of what happened and what to do next — always written when a run returns no reels |
API_USAGE | Request count for this run and how many failed, split into data fetches vs searches |
FREE_LIMITS_APPLIED | Which free-plan caps applied, with the message shown |
🤖 Programmatic / API use
Your API token is in Apify Console → Settings → API & Integrations.
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("afanasenko/instagram-reel-script-extractor").call(run_input={"usernames": ["mattmurphyai"],"sortBy": "Top performing","maxItemsMode2": 20,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row["analysisStatus"] == "analyzed":print(row["url"], row["hookType"], row["spokenTranscript"])
JavaScript / Node.js (npm i apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('afanasenko/instagram-reel-script-extractor').call({reelUrls: ['https://www.instagram.com/reel/DXuciRbjX2O/'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();const reels = items.filter((row) => row.analysisStatus === 'analyzed');
Use the field names from the input schema. Mode 1 takes reelUrls and maxItemsMode1; Mode 2 takes usernames, sortBy, postedWithinDays, postedAfter, postedBefore, minViews and maxItemsMode2; Mode 3 takes searchQueries, searchHashtags, maxItemsPerSearch, maxItemsMode3, sortByMode3, postedAfterMode3, postedBeforeMode3 and minViewsMode3. A Mode 3 call is just {"searchHashtags": ["mealprep"], "maxItemsPerSearch": 10}. Only rows with analysisStatus "analyzed" are charged; the others say why a reel was not analyzed. A run you start in Console or through an AI agent ends its log with this same call, filled in with that run's own input — copy it to repeat the job from code.
REST:
curl -X POST "https://api.apify.com/v2/acts/afanasenko~instagram-reel-script-extractor/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"usernames":["mattmurphyai"],"maxItemsMode2":20,"sortBy":"Top performing"}'
Read the results:
curl "https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items"curl "https://api.apify.com/v2/actor-runs/$RUN_ID/key-value-store/records/NOT_ANALYZED"curl "https://api.apify.com/v2/actor-runs/$RUN_ID/key-value-store/records/USER_MESSAGE"
Every classification field is a closed set of values, so downstream code can switch on them without string matching. Every run writes USER_MESSAGE, so a script never has to guess why a run returned nothing.
💡 Tips & Best Practices
- Sort by
viewsVsCreatorMedian, then group byhookType. That single move is what turns 40 rows into a content strategy. onScreenTextIsCaptionsOnlytells you whether the burned-in text is worth reading. When it istrue, the creator only subtitled themselves; when it isfalse, the frame carries something the audio does not.- Scan wide, analyze narrow. Reading a creator's catalog metadata is roughly 400× cheaper than analyzing a reel, so a large
postedWithinDayswindow with a smallmaxItemsMode2costs almost nothing extra and gives a far better median. - Watch
qualityFlag. Asuspectrow means the built-in check caught the model repeating itself. Those rows are free, andqualityNotesays exactly what was collapsed or dropped. - Reels only. Carousels and photos come back as
not_videorows with full metadata, free. If a creator posts mostly carousels, you will see that immediately rather than getting an empty run.
❓ FAQ
Q: How do I transcribe an Instagram reel or video?
A: Paste the reel's /reel/ link into Reel links and press Start. Each reel comes back as one row with spokenTranscript for what is said and onScreenText for what is written on the frames. Use a browser link rather than a share link — share links do not carry a post id.
Q: Do I need to log in, or give an Instagram password? A: No. No login, no cookies, no session, no password, no Instagram account. The actor reads public posts only, nothing is connected to an account of yours, and nothing is posted on your behalf.
Q: Can I transcribe a creator's whole catalog at once? A: Yes — put the handle into Creator handles instead of pasting links. The run reads the creator's recent catalog first, so every reel is also scored against that creator's own median views, and you can filter by date or view count before anything is analyzed.
Q: Can I find reels by keyword or hashtag and transcribe them? A: Yes — that is Mode 3. Type a word into Search words or phrases or a hashtag into Hashtags, and the run analyzes the most viewed reels Instagram's search returns for it, from any creator. A word returns about 20 to 30 reels in all; a hashtag goes hundreds deep, mostly into the last couple of weeks. The search is free; each analyzed reel costs the usual price, and a reel two searches both find is charged once.
Q: Can I get Instagram transcripts programmatically?
A: Yes. This actor is the API — one POST returns the same rows the Console shows, as JSON, and there is a matching MCP tool for AI agents. The full call is in 🤖 Programmatic / API use below.
Q: How does the cost of transcribing reels compare?
A: One flat charge per analyzed reel at any length up to Instagram's 3-minute maximum — no per-minute or per-second surcharge, which is how most transcription tools bill. Only videos past 3 minutes, analyzed from 13 November 2026 when you switch them on, add an Extra minute per started minute beyond the first 3. Reels that could not be analyzed arrive as free rows with the reason in error. The numbers are in 💰 How much will analyzing Instagram reels cost?
Q: Does it work on reels with no talking?
A: Yes — that is the main reason to use it. A silent, music-only reel returns hasSpeech: false, an empty spokenTranscript, and the complete on-screen text, hook, beats and call to action. Audio-only transcript tools return an empty string for these.
Q: How do I get the text that is burned into an Instagram video?
A: Run this actor on the reel link. onScreenText gives one entry per distinct card or slide. Word-by-word caption animations are collapsed to their final form, so you get the sentence once rather than twelve growing fragments of it.
Q: Is there a free way to try it? A: Yes. Leave the input empty and press Start — the demo run analyzes 3 real reels of a sample creator, capped at 3 so it costs about $0.23, and there is no limit on how often you run it. Apify's Free plan includes $5 of monthly credit, so the trial costs you nothing out of pocket. When you switch to your own accounts, the free plan analyzes 5 reels per run, from one creator or one search, up to 15 runs a calendar month, with every field included and at the same price per reel as a paid plan. The allowance resets on the 1st.
Q: Can I use the Instagram API instead? A: Instagram's own API returns your own media and its caption. It does not transcribe audio, it does not read text burned into video frames, and it gives you nothing about accounts you do not own. This actor works on any public account.
Q: What are the alternatives to an Instagram transcript tool? A: Plain transcript actors give you the spoken words and stop there. If your content is talking-head with no on-screen text, they are cheaper. If you care about hooks, structure, on-screen text, or anything silent, they return either nothing or only half the reel.
Q: Is this speech-to-text, or OCR, or both?
A: Both, in one pass. The audio track becomes spokenTranscript. The frames are read separately for text drawn on them — prices, quantities, step numbers, lists, URLs, code — and that lands in onScreenText. A video-to-text tool that only listens returns an empty string for a silent reel; this one still returns the whole frame.
Q: Can I export the transcript as an SRT or VTT subtitle file?
A: No. The transcript arrives as text in spokenTranscript, without word-level timings, so it is not a subtitle track you can burn in. What is timed is the shape of the reel: every entry in beats carries the second it starts and the second it ends, and hookEndSeconds marks where the opening ends — enough to scrub straight to a section in an editor, not enough to build captions from.
Q: Does it read the caption under the post, or Instagram's auto-captions?
A: The written caption comes back in caption, because it is useful context — but nothing in the analysis depends on it, and Instagram's own auto-generated closed captions are not used at all. spokenTranscript is read from the audio and onScreenText from the frames, so a reel whose caption says nothing still returns a full row.
Q: Does it translate?
A: Never, and that now covers the whole row. The transcript and the on-screen text stay in the original language, mixed languages included, exactly as spoken and written. So do the parts written for you: a Spanish reel comes back with a Spanish summary, Spanish topics, Spanish takeaways and Spanish section labels, so you can search the results in the language you heard. language reports what was detected. Product and brand names keep their usual spelling.
Q: Are song lyrics transcribed?
A: No. A backing music track is not speech, so a reel whose only audio is a song returns an empty spokenTranscript and hasSpeech: false.
Q: Why is there a 3-minute limit?
A: 3 minutes is Instagram's own maximum length for a Reel, and the reel price covers exactly that. Longer posts come back as free too_long rows with their metadata intact. From 13 November 2026 you can switch on Analyze videos longer than 3 minutes (analyzeLongVideos), below.
Q: What if a reel errors out mid-run?
A: It becomes a free row with analysisStatus naming the cause and error explaining it in plain words. Everything else in the run continues. Expired video links are re-resolved and retried once automatically.
Q: Why do some rows have no viewsVsCreatorMedian?
A: That column only exists in Mode 2, where the run has read the creator's catalog and can compute a real median. In Mode 1 and Mode 3 there is nothing to compare against — Mode 3's reels come from many creators — and an invented baseline would be worse than an empty column.
Q: How do I find which hooks work for a competitor?
A: Run Mode 2 on their handle with sortBy: Top performing, then open the 🔥 Hook Board in the run's Output tab. It groups every analyzed reel by hook type, format and call to action, and shows the average multiple of that creator's median each group achieved. On a recipe account we tested, how_to_demo reels averaged 5.8× the creator's median; on a software account, four of the top five reels opened with a warning rather than a question.
Q: Can I analyze a reel that is longer than 3 minutes?
A: From 13 November 2026, yes, with Analyze videos longer than 3 minutes (analyzeLongVideos) switched on: videos up to 20 minutes are analyzed in full, charged as one reel plus an Extra minute for each started minute beyond the first 3 — a 4m40s video is the reel plus 2 extra minutes, a 5m10s video the reel plus 3. The row's extraMinutes column says how many. A video whose extra minutes do not fit in the run's maximum charge, and anything over 20 minutes, stays a free too_long row. Until 13 November 2026 there is no Extra minute charge and longer videos are not analyzed: they come back as free rows even with the option on, and the run log says so. Left off, nothing changes.
Q: I pasted a carousel link. Why did a second run appear in my account?
A: Because Analyze carousel links too (analyzeCarousels) was on. A carousel has no video to transcribe, so this actor hands carousel links to our Instagram Carousel Analyzer, started as its own run in your account; it reads the slides — text, hook, structure — and charges its own price, $0.25 per analyzed carousel ($0.20 from Gold). This run charges nothing for them. Its rows are copied into this dataset with source: "carouselAnalyzer", the shortcode as inputId and a link to that run in chargedByRunUrl; this actor's own row for the carousel stays free and says where the analysis went. The run message and RUN_SUMMARY.carouselAnalyzer say what that run charged. Leave the option off and a carousel link simply comes back as a free row, as before. It applies to reel links (Mode 1) only.
Q: Does it download or store the videos? A: No. Each video is fetched, analyzed and discarded within the run. Nothing is kept, and you are not charged for bandwidth by the megabyte.
🔗 Other related actors (same author)
This actor is part of a family of focused tools — pick the one that matches your discovery model:
| You start with… | You want to find… | Use this actor |
|---|---|---|
| A reel link, a creator handle, or a keyword or hashtag | What the reels actually say, show and ask for | This actor |
| A handle, keyword or location | Profiles with bio, contacts and engagement | Instagram Profile Scraper |
| A handle | Who follows that account | Instagram Followers Scraper |
| A handle | Similar accounts to it | Instagram Related Profiles Scraper |
| A handle you want to watch | Who joined and who left, over time | Instagram Follower Tracker & Monitor |
| An AI agent (Claude, Cursor, ChatGPT) | The same Instagram profile data from inside your agent — MCP tools it picks by intent | Instagram Profile MCP Server |
| A post or reel link | Export what the comments say — every comment and reply as a row, @mentions split out | Instagram Comments Scraper |
| A list of usernames you already have | The contact details each one publishes — email, phone, website | Instagram Email Scraper |
Start from a profile scraper when you are looking for accounts; start here when you already know the accounts and want to know what their content does.
🛟 Support & feedback
- Open an issue on the actor's Issues tab in Apify Console — fastest way to get a fix shipped.
- Feature requests in the same tab; we read every one.
- Ratings & reviews on the Apify Store page help other users find the actor.
⚖️ Is it legal to scrape Instagram?
Yes — the actor reads publicly available posts from public Instagram accounts and does not log in, bypass authentication, access private content, or interact with anything on your behalf. Videos are downloaded, analyzed and discarded; nothing is stored. Use it in compliance with Instagram's Terms of Service and applicable privacy laws (GDPR, CCPA).