YouTube Shorts, TikTok & Reels Transcript Scraper
Pricing
from $1.40 / 1,000 videos
YouTube Shorts, TikTok & Reels Transcript Scraper
One run for all three platforms: YouTube Shorts, TikTok and Instagram Reels turned into text β transcript with timestamps, on-screen captions and the first-3-second hook. Shorts use YouTube's own captions, so they cost less. Links or whole profiles, no login.
Pricing
from $1.40 / 1,000 videos
Rating
5.0
(1)
Developer
Matvey
Maintained by CommunityActor stats
0
Bookmarked
52
Total users
27
Monthly active users
10 days ago
Last modified
Categories
Share
YouTube Shorts, TikTok & Reels Transcript Scraper covers all three short-video platforms in one run β without a login, cookies or an official API. Paste links, or a TikTok handle and a YouTube channel, and get one clean row per video: transcript with timestamps, the text burned into the picture, and the first-3-second hook.
$2 per 1,000 videos on the Apify free plan β you pay for delivered rows, nothing else. Higher Apify plans pay less, down to $1.4.
YouTube Shorts use the caption track YouTube has already made, so they come back in seconds and are billed at the video price alone, with no charge for audio.
If you only ever work with one platform, we keep narrower Actors for TikTok and Instagram Reels β same engine, same price, a simpler form.
Tested head-to-head β 26 September 2026

Two public TikTok clips, run through the five most-used TikTok transcript Actors on the Apify Store from an ordinary account, with every Actor on its default settings.
| This Actor | The five others | |
|---|---|---|
| Clip that has no TikTok captions (Duolingo, 9 s) | Spoken words returned | 0 of 5: an empty transcript, an error message or the post description instead |
| Clip with TikTok captions, one line said five times | All 5 lines | 3 of 5 returned all 5 lines |
| Time per run | 12β21 s | 2β13 s |
| Cost of both clips | $0.005 | $0.00β$0.048 (two charged for an empty row) |
How it works: when TikTok already has captions for a video, they become the transcript β they keep every repeated line and there is no audio charge. When a video has none, speech recognition fills the gap, which is why this Actor returned text on both clips.
What is YouTube Shorts, TikTok & Reels Transcript Scraper?
YouTube Shorts, TikTok & Reels Transcript Scraper turns a short vertical video into structured text: the spoken transcript, the text written on screen, and the first three seconds of both β the hook. It works on Instagram Reels, TikTok videos and YouTube Shorts, with no login, no cookies and no official API needed.
Most transcript scrapers stop at the audio. In short-form video the audio is often not where the message is: in our test set of 26 real videos, only 69% carried a narrated script, 19% had no usable speech at all, and 12% ran on someone else's trending sound. 81% had text on screen. An actor that reads only the audio returns noise or nothing on roughly a third of a real feed.
This one reads both, tells them apart, and says which kind of video you gave it.
What data can YouTube Shorts, TikTok & Reels Transcript Scraper extract?
| Field | Example |
|---|---|
transcriptText | Today, I wanted to do a quick tips and tricks or best practices for posting reels⦠|
firstThreeSecondsSpeech | Today, I wanted to do a quick tips and tricks or best practices for |
onScreenText | Reels Tips & Tricks, No Watermarks, Under 3 Minutes, Add Music/Audio |
firstThreeSecondsOnScreen | Reels Tips & Tricks |
contentClass | narrated Β· borrowed_audio Β· silent Β· empty |
hookText, hookType | So what brought you here?, question |
ctaText, ctaType | π Link in bio to book, link_in_bio |
wordsPerMinute, beats | 150, [{startSeconds, endSeconds, label: hook/body/cta, text}] |
speechDetected, speechCoverage | true, 0.89 |
burnedInCaptionCount | 41 |
screenRecording | false |
language, durationSeconds, platform, videoId | en, 61.3, instagram, DFIWSVoy1UQ |
Why on-screen text is separated from subtitles
Half the videos we measured carry burned-in subtitles that simply repeat the speech. Dumping every recognised string into one field means the same sentence appears twice and the actual title cards drown in it.
This actor separates them by two signals: how closely a line matches what is being said at that exact moment, and which horizontal band of the frame it lives in. On a labelled video with 54 text tracks the split came out with no errors. onScreenText therefore contains what the author wrote for the viewer; burnedInCaptionCount tells you how many subtitle tracks were removed.
Why the content class matters
Speech recognition models do not stay silent over music β they invent. On a wordless branded clip the model returned "We'll be right back.", and its own confidence score for that invention was 0.00 false positive β the metric that is supposed to catch this says nothing. So the class is decided from word density and how much of the clip speech actually covers.
| Class | What it means | What you get |
|---|---|---|
narrated | The voice carries the script | Transcript + on-screen text |
borrowed_audio | A trending sound or a clip from someone else β not the author's words | On-screen text; the audio is labelled, not passed off as a script |
silent | No speech; the meaning is in the captions | On-screen text only |
empty | Neither speech nor on-screen text | An explicit refusal instead of blank fields |
A looping trending sound is caught by its own repetition: when one line comes back word for word three times or more, it is a sound, not a script.
Hook, call to action and beats: rules, not AI
Every video row also carries a short script breakdown. It is built by fixed rules from data the row already has (the timestamped transcript, the on-screen text and the caption). There is no language model and no extra charge, and the same video always gives the same answer.
| Field | What it holds |
|---|---|
hookText, hookSource | The opening line. Text written on screen in the first three seconds comes first, because it is a deliberate hook; the first spoken sentence wins only when the speech is the author's subtitled voice-over, or when there is no early on-screen text. Last resort: the caption's first sentence. hookSource says which one: speech, on-screen or caption. |
hookType | how_to, question, number, warning, curiosity, callout, story, or statement when no pattern matches |
hookEndSeconds | Where the hook ends on the timeline |
ctaText, ctaType, ctaSource | The line that asks the viewer to act. Types: link_in_bio, dm, book, shop, download, comment, subscribe, follow, save, share, like, visit, watch_more, or none |
wordsPerMinute | Speaking pace of the author's speech; empty when there is no own speech |
beats | The timeline split into hook, body and cta parts with start and end seconds. The text is the real words, not a summary |
The patterns cover English and basic Russian, Spanish, Portuguese, Indonesian, French and German. Being rules, they miss what they do not know. A hook phrased in an unusual way comes out as statement, and a call to action without a known phrase comes out as none. They never invent text that is not in the video or the caption. Real output for a silent Reel with an on-screen question:
{"hookText": "\"So what brought you here?\"","hookSource": "on-screen","hookType": "question","hookEndSeconds": 1.3,"ctaText": null,"ctaType": "none","wordsPerMinute": null,"beats": [{ "startSeconds": 0, "endSeconds": 1.3, "label": "hook", "text": "\"So what brought you here?\"" }]}
AI script breakdown (paid add-on, from 6 Nov 2026)
Switch on π€ AI script breakdown (aiAnalysis: true) and every video row gets an ai object written by a language model (DeepSeek V4.1 Flash). How it works, honestly: we take one frame every 2 seconds (at most 12 per video; longer videos are sampled evenly), 360 px wide, and send them to the model together with our own transcript, the on-screen text (when you switch that on) and the caption. The model sees still frames, not the moving video and not the sound itself.
Field in ai | What it holds |
|---|---|
hook | text, source (speech, on-screen, visual, caption), type and whyItWorks |
beats | 2 to 8 consecutive parts with startSeconds, endSeconds, label (hook, setup, value, proof, twist, cta, outro), visual (what is on screen) and text (the words of that part) |
cta | text and type (link_in_bio, follow, comment, dm, book, shop, save, share, other, none) |
topic, format, audience, emotion | One line each |
scriptTemplate | The script as a fill-in template with [placeholders] you can reuse |
speechIsSong | True when the audio is song lyrics rather than the author talking |
onScreenText | Text the model reads on the frames |
Descriptions are in English; spoken and on-screen words are quoted in the video's own language. aiModel names the model and aiError says why a breakdown is missing. The rule-based fields above (hookText, ctaText, beats and the rest) stay as they are. A model can misread a frame, so treat the breakdown as a strong first draft. It costs $0.05 per video on the Free plan (less on paid Apify plans), charged as the ai-analysis event only when the breakdown comes back; a failed or skipped breakdown is free. Until 6 November 2026 the switch does nothing and costs nothing. Shortened real output for a 9-second Reel:
{"ai": {"hook": { "text": "Some people call me Kara", "source": "on-screen", "type": "statement","whyItWorks": "A repeated 'some people call meβ¦' pattern makes viewers wait for the punchlineβ¦" },"beats": [{ "startSeconds": 0, "endSeconds": 2.5, "label": "hook", "visual": "Low-angle selfie of a woman walking past a white building", "text": "Some people call me Kara" },{ "startSeconds": 5.5, "endSeconds": 9.3, "label": "cta", "visual": "She keeps walking toward the camera", "text": "But you can call me when you want the best brows" }],"cta": { "text": "Link in bio to book", "type": "link_in_bio" },"topic": "Eyebrow artist introducing herself and inviting local clients to book","format": "Walking selfie with stacked on-screen text and a name-pun punchline","scriptTemplate": "Some people call me [first name]. Some people call me [full name]. But you can call me when you want the [result you deliver].","speechIsSong": true},"aiModel": "deepseek-flash","aiError": null}
How much does it cost to extract Reel transcripts?
Pay-per-event, no subscription, and short clips are not billed as if they were long ones.
| Event | Price |
|---|---|
reel-processed β one video: transcript with timestamps, language, hook | $0.002 |
audio-10-seconds β each started 10 seconds of speech recognised | $0.001 |
on-screen-text β one video read frame by frame for burned-in text | $0.06 |
A 15-second TikTok costs $0.004. A 30-second Reel costs $0.005. A 60-second Short costs $0.008. Reading on-screen text is a separate switch and a separate charge, because it is a separate job: the video is downloaded and read frame by frame.
Failed URLs, videos above your duration limit and silent videos are never billed. A row you cannot use is a row you do not pay for.
AI script breakdown is a separate switch and a separate event: ai-analysis, $0.05 per video on the Free plan ($0.045 Bronze, $0.04 Silver, $0.035 Gold and above), from 6 November 2026. It is charged only when the breakdown comes back.
Bulk export: what 50,000 videos actually cost
This Actor is built for bulk jobs β put hundreds of URLs into one run, or call it from the API on a schedule. Videos are processed three at a time, and there is no fee per run, no fee per page and no proxy charge.
| Job | This Actor | Most-used transcript Actor in this category |
|---|---|---|
| 50,000 TikToks or Reels of 30 seconds | $250 | $275 |
| 50,000 YouTube Shorts (captions, no recognition) | $100 | $275 |
| 50,000 clips of 15 seconds | $200 | $275 |
Checked on the Apify Store on 25 September 2026 against the Reel-transcript Actor with the most monthly users, which charges per dataset item plus per minute of audio, rounded to the minute. Ours is billed in 10-second steps, which is where most of the difference comes from: a 9-second TikTok should not cost the same as a 59-second one.
Two things most alternatives do not do: three platforms in one run β TikTok, Instagram Reels and YouTube Shorts, one integration instead of three β and on-screen text read and separated from speech, so caption cards and hard subtitles do not get mixed into what the author actually said.
How to extract TikTok, Reels and Shorts transcripts
- Click Try for free.
- Paste one or more video URLs into π Reel, TikTok or Shorts URLs. The field comes prefilled with a working example, so you can just press Start.
- Press Start. Results appear in the dataset, one row per video.
β¬οΈ Input
{"videoUrls": ["https://www.instagram.com/reel/DFIWSVoy1UQ","https://www.tiktok.com/@duolingo/video/7683994892506270989"],"ocrFps": "1.5","includeTranscriptSegments": true}
Video URLs
Public Instagram Reels, TikTok videos and YouTube Shorts. Private and deleted videos return an error row naming the reason.
On-screen text sampling
How many frames per second are read for on-screen text. On our labelled video, 1.5 frames per second found every caption card; 1 frame per second lost three of six. 1.5 is the default; raise it only for dense motion graphics.
Videos are read one at a time. If a video's on-screen text cannot be read before the run ends, you still get its transcript: the row carries onScreenTextError, and on-screen text is not charged for that video.
Whole profiles, not just links
Paste a TikTok handle (@duolingo) or just the TikTok username (duolingo), a TikTok profile link or a YouTube channel into Whole
profiles, set how many of the newest videos you want, and the Actor collects the links itself.
Add a date in Only videos newer than to keep a weekly watch cheap: anything older is skipped
before it is downloaded, so it costs nothing.
{"profiles": ["@duolingo", "https://www.youtube.com/@MrBeast"],"resultsLimitPerProfile": 20,"onlyPostsNewerThan": "2026-09-01"}
Instagram profiles need a login, so they are not supported β paste Reel URLs instead. A profile link dropped into the URL field is understood too; you do not have to pick the right box.
YouTube Shorts cost less than the rest
For YouTube the Actor takes the caption track YouTube has already made, instead of downloading the video and recognising speech. That means Shorts are billed at the video price alone, with no per-audio charge at all, and they come back in seconds.
β¬οΈ Output
One row per video:
{"type": "reel","url": "https://www.instagram.com/reel/DFIWSVoy1UQ","platform": "instagram","videoId": "DFIWSVoy1UQ","durationSeconds": 61.3,"language": "en","contentClass": "narrated","contentClassReason": "speech covers most of the clip","speechDetected": true,"speechCoverage": 0.891,"transcriptText": "Today, I wanted to do a quick tips and tricksβ¦","firstThreeSecondsSpeech": "Today, I wanted to do a quick tips and tricks or best practices for","onScreenText": [{ "t": "0.33-4.33", "text": "Reels Tips & Tricks" },{ "t": "7.33-8.67", "text": "No Watermarks" },{ "t": "11.67-13.0", "text": "Under 3 Minutes" }],"onScreenTextJoined": "Reels Tips & Tricks\nNo Watermarks\nUnder 3 Minutes","firstThreeSecondsOnScreen": "Reels Tips & Tricks","burnedInCaptionCount": 41,"screenRecording": false,"scrapedAt": "2026-09-18T09:20:31Z"}
Error rows
A URL that cannot be processed returns a row of its own and is not billed:
{ "type": "error", "url": "β¦", "errorCode": "download_failed", "errorMessage": "β¦" }
Codes: download_failed, timeout, unsupported_url, audio_failed, transcription_failed, ocr_failed, processing_failed.
Use cases for Reel and TikTok transcript data
Competitive research
Feed a list of a competitor's videos and read their hooks side by side. firstThreeSecondsSpeech and firstThreeSecondsOnScreen are cut on the 3.0-second boundary, so the comparison is between what viewers actually received, not between opening sentences of different lengths.
Content repurposing
Turn a back catalogue into text for blog posts, newsletters and captions. onScreenTextJoined gives the written layer separately, which is what carries the message in silent videos.
Feeding an LLM or a RAG index
The output is flat, typed and one row per video. The content class tells your prompt when the transcript is not the author's words β which is what stops a summarising agent from confidently describing someone else's trending sound as this creator's message.
Accessibility and archiving
Transcripts and on-screen text for captioning, search and long-term storage of a feed that platforms may take down.
Integrations
- API: run it from any language with the Apify API, or the Python and JavaScript clients.
- MCP: callable by AI agents through the Apify MCP server, like any other Actor.
- No-code: Make, Zapier, n8n, Google Sheets, Slack through Apify's integrations.
- Webhooks: trigger a downstream run when a batch finishes.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("lergassy/tiktok-reels-shorts-transcript-scraper").call(run_input={"videoUrls": ["https://www.tiktok.com/@duolingo/video/7683994892506270989"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["firstThreeSecondsSpeech"], "|", item["onScreenTextJoined"])
β FAQ
Is it legal to scrape Instagram Reels and TikTok?
This Actor reads only public videos, the same ones any visitor can open without logging in, and it does not collect personal profiles. Laws differ by country and by intended use; consult a lawyer before building a commercial product on scraped data.
How much does it cost to transcribe 1,000 reels?
About $5 for 30-second clips and about $4 for 15-second ones β one event per video plus the seconds of speech actually recognised. Failed URLs are free.
Can I use it with the Apify API?
Yes β it is a standard Actor. Start a run, poll it, read the dataset, or use a webhook.
Can I use it through an MCP server?
Yes. It is exposed through Apify's MCP server and its input schema is written so an agent can call it correctly without reading this page.
Does it return one row per video?
Yes. One row per video, plus a separate error row for any URL that failed. Nested arrays (transcript, onScreenText) are provided alongside flat string versions so spreadsheets stay readable.
What languages does it handle?
Speech recognition is multilingual. On-screen text has been verified on Latin and Cyrillic scripts; other scripts are not claimed.
Why is the transcript empty on some videos?
Because the video has no speech. On music-only or wordless videos, speech-recognition models do not stay silent: they invent text they learned from film subtitles and YouTube outros, such as "Subtitles by β¦", "Thanks for watching", "[Music]", a single word repeated ("The The") or a few words in a random language. The Actor drops such invented lines using a list of known phrases in 15+ languages, the recogniser's own confidence scores (standard Whisper thresholds), repeated-word checks, how many words fit in the time, and whether the script matches the caption. Real speech in the same video is kept. When nothing real is left, transcriptText is empty, transcript is [], speechDetected is false, transcriptSource is no-speech, language is null (we do not guess a language when nobody speaks; the caption's language is still in caption), and the audio of that video is not charged. This is intended behaviour, not a failure.
Does it need proxies?
No. It runs without residential proxies, which is why extraction is priced where it is.
You might also like
Part of our speech-and-text toolkit β the Store only recommends within a category, so here they are:
| Actor | What it does |
|---|---|
| Whisper Transcriber | Any audio or video file to text, 90+ languages |
| YouTube Transcript Scraper | Transcripts from YouTube videos and playlists |
| SRT Subtitle Generator | Ready-to-upload subtitle files from any video |
| Audio Transcriber | Podcasts, calls and meetings to text |
| OCR Text Extractor | Text out of images and screenshots |
Use this Actor for short vertical video, where the message is split between the voice and the screen; use the others when you already have a file or a long-form video.
Your feedback
Found a video it handles badly? Open an issue on the Actor's Issues tab with the URL β that is the fastest way to get it fixed, and every issue gets a reply.

