Video Transcriber - YouTube, TikTok, Instagram & X to Text
Pricing
from $5.40 / 1,000 audio minute transcribeds
Video Transcriber - YouTube, TikTok, Instagram & X to Text
Transcribe any public video URL to text with timestamps: YouTube, TikTok, Instagram reels, X, Facebook, Vimeo, Loom, LinkedIn, podcasts, direct files. Platform captions first ($1.80 per 1,000 videos), built-in Whisper otherwise ($0.0054 per audio minute). SRT, VTT, translation. No login.
Pricing
from $5.40 / 1,000 audio minute transcribeds
Rating
0.0
(0)
Developer
Top Api
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
What does Video Transcriber do?
Video Transcriber turns any public video or audio link into a timed transcript: YouTube, TikTok, Instagram reels and posts, X (Twitter), Facebook videos and reels, Vimeo, Dailymotion, Loom, Wistia, LinkedIn posts, podcast feeds, Apple Podcasts shows and direct media files. When the platform publishes its own caption track the actor reads it; when it does not, built-in Whisper speech recognition writes one. One row per video: the full text, timed segments, language, title, author and duration.
Video to text - speech to text - TikTok transcript - Instagram reel transcript - YouTube transcript - X video transcript
- 🎬 One field for every platform: paste links from 11 platforms (plus any page with a video in it), the platform is recognised from the URL.
- 💬 Captions first: a video that carries its own caption track is billed one flat price per video, whatever its length.
- 🎙️ Speech recognition otherwise: Whisper runs inside the actor (English goes to tiny.en, other languages to base, or pick small for accents and noise). No API key of yours.
- ⏱️ Timed output: segments, word timings, SRT and WebVTT subtitles, a
[0:03 - 0:07]transcript and RAG chunks, all free. - 🌍 Any language, or English: the spoken language is detected; switch on translation to get English text.
- 🔁 Channels, playlists and podcast feeds expand to their newest videos; monitor mode returns only the ones you have not had before.
- 💸 Pay only for transcripts: private or removed videos, music without speech and every other failure come back as free rows with the reason.
- 🔌 API, schedules, webhooks, Make, Zapier, n8n and MCP through Apify.
What data can you get from a video?
📝 Full transcript transcript | ⏱️ Timed segments segments | 🔤 Word timings (words in each segment) |
🎞️ SRT srt and WebVTT vtt | 🕒 [0:03 - 0:07] lines timestampedTranscript | 🧩 RAG chunks with start/end chunks |
🌍 Language language + confidence | 🔁 English translation + spokenLanguage | 💬 Where the words came from transcriptSource |
🏷️ Caption track used captionLanguage | 🤖 Auto-generated caption? captionAutoGenerated | 📚 Every caption language listed availableCaptionLanguages |
| 🎬 Platform, video id, canonical URL | 📰 Title / post caption title, description | 👤 Author, display name, profile link |
📅 Published publishedAt | ⏳ Duration durationSec | 👀 Views where the platform shows them |
| 🖼️ Thumbnail | 🎣 The first 3 seconds hook | 🔢 Words, characters, segments |
🎙️ Show name for podcasts podcast | 💲 What the row was billed chargedEvent, billedMinutes | ⚠️ status, errorCode, error, note |
On a 16-video test run across 8 platforms (TikTok, Instagram, X, Facebook, LinkedIn, YouTube, Vimeo, Loom) 14 videos returned a transcript - 7 from the platform's captions and 7 by speech recognition - and 2 music-only clips came back as free NO_SPEECH rows. Fill on that run's 14 transcripts: transcript, durationSec, title and segments 100%, language 93% (Loom does not name its transcript's language), author and thumbnail 86%, publishedAt 79%, viewCount 29% (only where the platform shows views to visitors).
How to transcribe videos with Video Transcriber
- Create a free Apify account (free monthly credit included).
- Open Video Transcriber and click Try for free.
- Paste your links into Video or audio URLs - one per line, any mix of platforms.
- Leave Transcript source on Captions first, speech recognition otherwise, or force one of them.
- Click Start. Transcripts arrive in the dataset as each video finishes.
- Open Storage and Export as JSON, CSV or Excel - or read the rows through the API.
⬇️ Input
| Field | Type | Default | What it does |
|---|---|---|---|
urls | list of URLs | - | Videos, Shorts, reels, posts, channels, playlists, podcast feeds, Apple Podcasts shows, direct files. |
urlsFromFile | URL | - | A public .txt / .csv; every http(s) link in it is transcribed. |
datasetId | string | - | The dataset of another actor's run (TikTok, Instagram, YouTube, X scrapers...); the video link in each row is found. Up to 10,000 rows. |
datasetItems | JSON rows | - | Paste rows from any scraper instead of a dataset id. |
transcriptSource | select | Captions first | auto = captions when the video has them, speech recognition otherwise; captions = captions only; asr = speech recognition only. |
language | string | auto | Spoken language code or name (en, es, Spanish); forces recognition and picks that caption track. |
preferredCaptionLanguages | list | - | Caption tracks to prefer, in order (en, es). Empty = the video's own spoken language. |
translateToEnglish | boolean | false | English text whatever is spoken: an English caption track or YouTube's own translation when available, Whisper's translation otherwise. |
model | select | Auto | auto (tiny.en for English, base otherwise), tiny, base, small. Same price per minute. |
minWords | integer | 1 | Fewer words = a free NO_SPEECH row. |
publishedAfter | date or period | - | 2026-10-01, 7 days, 24 hours; videos with an unknown date are kept. |
maxMinutesPerVideo | integer | 120 | Speech recognition stops after this many minutes of one video (the row says truncated). Caption transcripts are never cut. |
monitorMode + monitorStoreName | boolean + string | false | Skip every video a previous run with the same monitor name delivered. |
outputFormats | multi-select | segments | segments, words, srt, vtt, timestamped, chunks. Plain text is always included. |
chunkSize | integer | 1000 | Characters per RAG chunk. |
maxVideosPerSource | integer | 10 | Newest videos taken from each channel, playlist or feed. |
maxResults | integer | 0 | Stop after this many transcripts (0 = no limit). |
maxTotalMinutes | integer | 0 | Stop speech recognition after this many billed audio minutes in the run. |
includeFailedRows | boolean | true | Free rows for videos that could not be transcribed. |
maxConcurrency | integer | 4 | Videos resolved and downloaded at the same time. |
proxyConfiguration | proxy | - | Optional; leave empty and the actor picks the route per site. |
Input JSON
{"urls": ["https://www.tiktok.com/@zachking/video/7095025543627705643","https://www.instagram.com/reel/DMflZnXOKUj/","https://x.com/NASA/status/2113776971603689874","https://www.youtube.com/watch?v=jNQXAC9IVRw","https://www.youtube.com/@NASA","https://podcasts.apple.com/us/podcast/the-daily/id1200361736"],"transcriptSource": "auto","outputFormats": ["segments", "srt"],"maxVideosPerSource": 5}
Which links work
| Platform | Links | Where the transcript comes from |
|---|---|---|
| YouTube | watch?v=, youtu.be/, /shorts/, /live/, /embed/, channels (@handle, /channel/), playlists | YouTube's captions (creator or auto-generated, the video's own audio language); speech recognition when a video has none |
| TikTok | /@user/video/<id>, vm. / vt. short links, embeds | TikTok's own captions when the video has them; speech recognition otherwise |
/reel/, /reels/, /p/, /tv/ | speech recognition (Instagram shows no captions to visitors) | |
| X (Twitter) | x.com / twitter.com /status/<id> | speech recognition |
/watch/?v=, /reel/, /<page>/videos/<id>, fb.watch, /share/v/ and /share/r/ | Facebook's captions (auto-generated or uploaded); speech recognition otherwise | |
/posts/..., /feed/update/urn:li:activity:<id> | LinkedIn's captions; speech recognition otherwise | |
| Vimeo | vimeo.com/<id>, player.vimeo.com/video/<id>, unlisted ?h= links | Vimeo's captions (uploaded or AI-generated); speech recognition otherwise |
| Dailymotion | /video/<id>, dai.ly/<id> | Dailymotion's subtitles; speech recognition otherwise |
| Loom | /share/<id>, /embed/<id> | Loom's own transcript |
| Wistia | fast.wistia.net/embed/..., *.wistia.com/medias/<id> | Wistia captions; speech recognition otherwise |
| Podcasts | RSS / Atom feeds, Apple Podcasts show links | speech recognition (episodes newest first) |
| Files | .mp3 .m4a .mp4 .mov .webm .wav .flac .ogg .m3u8 and more | speech recognition |
| Any other page | a page with a video or audio player, og:video, an embedded YouTube / Vimeo / Wistia / Loom player, or a site yt-dlp knows (SoundCloud and many more) | the site's subtitles when it lists some; speech recognition otherwise |
⬆️ Output
One row per video. A real row from a test run (segments shortened):
{"sourceUrl": "https://x.com/NASA/status/2113776971603689874","url": "https://x.com/NASA/status/2113776971603689874","platform": "x","videoId": "2113776971603689874","title": "We are not slowing down. 🚀Our Artemis III mission will send four astronauts to low Earth orbit next year ...","author": "NASA","authorName": "NASA","authorUrl": "https://x.com/NASA","publishedAt": "2026-10-23T23:37:56.000Z","durationSec": 59.89,"thumbnail": "https://pbs.twimg.com/media/HVWk812WIAAg_hz.jpg","transcriptSource": "asr","language": "en","languageProbability": 0.992,"translatedToEnglish": false,"availableCaptionLanguages": [],"model": "whisper-tiny.en","transcript": "The standard that we should continuously aspire to exceed, which is why we are bringing that intensity, that discipline, that engineering ownership back to NASA, because great nations do not remain great by being caretakers of this dream, but by continuously making history. ...","wordCount": 179,"charCount": 1059,"segmentCount": 11,"segments": [{ "start": 0, "end": 16, "text": "The standard that we should continuously aspire to exceed, which is why we are bringing that intensity, ..." }],"audioSeconds": 59.9,"billedMinutes": 1,"chargedEvent": "audio-minute","truncated": false,"note": null,"status": "ok","errorCode": null,"error": null}
A caption row looks the same with transcriptSource: "captions", captionLanguage (e.g. eng-US, en, en_US), captionAutoGenerated, billedMinutes: 0 and chargedEvent: "caption-transcript".
A failed video is a free row:
{ "sourceUrl": "https://www.instagram.com/reel/Dd9RyBWBVih/", "platform": "instagram", "status": "error", "errorCode": "NO_SPEECH", "error": "no speech recognised in 17 s of audio; not charged", "chargedEvent": null, "billedMinutes": 0 }
Error codes: INVALID_URL, NOT_FOUND, PRIVATE, LOGIN_REQUIRED, NO_VIDEO, NO_AUDIO, NO_CAPTIONS (captions-only mode), NO_SPEECH, DOWNLOAD_FAILED, BLOCKED, LIMIT_REACHED, TIME_LIMIT, UNSUPPORTED.
The run's key-value store holds RUN_SUMMARY (for runs of more than 3 videos, or with a failure or a skip): transcripts from captions and from speech recognition, audio minutes billed, failures by code, skipped videos, recognition speed.
How much does it cost to transcribe videos?
Two prices, no start fee:
| Event | Price | When |
|---|---|---|
caption-transcript | $0.0018 per video ($1.80 per 1,000) | the transcript is the platform's own caption track, any length |
audio-minute | $0.0054 per started audio minute | speech recognition; minutes counted per video (a 45-second reel = 1 minute, a 2.5-minute video = 3) |
Examples from test runs:
| Run | Result | Charged |
|---|---|---|
| 1 YouTube video with captions + 1 11-second audio file (the default input) | 2 transcripts | $0.0018 + $0.0054 = $0.0072 |
| 16 mixed links (TikTok, Instagram, X, Facebook, LinkedIn, YouTube, Vimeo, Loom) | 14 transcripts, 2 free NO_SPEECH rows | 7 caption transcripts + 10 audio minutes = $0.0666 |
| 3 newest videos of a YouTube channel, captions only | 3 transcripts (9-20 minute videos) | $0.0054 |
Nothing is charged for errors, videos without speech, videos skipped by monitor mode, publishedAfter or your limits. Set Max audio minutes per run or a maximum charge per run in the run options to cap a run: the actor shortens the last video to fit and says so in its note.
Run it on a schedule
Point the actor at a channel, playlist or podcast feed, switch on Only new videos, and add an Apify schedule (daily or hourly). Each run transcribes only the videos the earlier runs did not deliver:
{"urls": ["https://www.youtube.com/@NASA", "https://feeds.npr.org/510289/podcast.xml"],"monitorMode": true,"monitorStoreName": "nasa-and-npr","maxVideosPerSource": 5,"publishedAfter": "7 days"}
Through the API: POST https://api.apify.com/v2/acts/TopApi~video-transcriber/runs?token=<token> with the input above as the body; add waitForFinish=300 for short jobs, or a webhook to get the dataset when the run ends. AI agents can call it through the Apify MCP server.
Chain it after another scraper
Already scraping TikTok, Instagram, YouTube or X with another actor? Pass that run's dataset id as datasetId (or use Apify's Connect actor integration): every row's video link is found (url, videoUrl, webVideoUrl, postUrl, shortCode...) and transcribed.
Limits
- Public videos only. Private, followers-only, age-restricted and removed videos come back as free rows (
PRIVATE,LOGIN_REQUIRED,NOT_FOUND). No login, no cookies. - Instagram and X publish no captions to visitors, so those videos always go through speech recognition.
- Speech recognition is Whisper on CPU: tiny.en / base / small. Clear speech comes out well; heavy music, crowd noise and several people talking at once lower accuracy. Pick
smallfor difficult audio. Speaker labels (who said what) are not produced. - Speed: about 0.15-0.35 s of processing per second of audio at the default 1 GB memory (the 16-video test run took 78-121 s, 493 s of audio recognised). More memory makes long files faster at the same price.
- Long files:
maxMinutesPerVideo(default 120, up to 600) caps one video; podcasts are processed in 10-minute windows, and the part recognised before a time or charge limit is delivered and billed. - YouTube translations (
translateToEnglish, or a preferred language the video has no track in) come from YouTube when it serves them and from Whisper otherwise; Whisper translates only into English. - Music-only clips return
NO_SPEECHand are not charged.
❓ FAQ
How much does Video Transcriber cost?
$0.0018 per video transcribed from the platform's captions, $0.0054 per started audio minute of speech recognition, no start fee. Failures are free.
Which platforms does Video Transcriber support?
YouTube, TikTok, Instagram, X (Twitter), Facebook, LinkedIn, Vimeo, Dailymotion, Loom, Wistia, podcast feeds, Apple Podcasts, direct audio/video files, pages with an embedded video, and the sites yt-dlp supports (SoundCloud and many more).
Does Video Transcriber need an API key or a login?
No. Public videos only, no account, no cookies, no OpenAI or other API key.
What is the difference between captions and speech recognition?
Captions are the text the platform already shows under the video (creator-uploaded or the platform's own auto-captions): fast and billed once per video. Speech recognition listens to the audio with Whisper and is billed per minute. With the default setting you always get the cheaper one available.
Can Video Transcriber translate?
Yes: switch on Translate to English. The original language stays in spokenLanguage.
Can I get subtitles?
Yes: add srt and/or vtt to Extra output; word-level timings with words.
Can it transcribe a whole YouTube channel or podcast?
Yes: paste the channel, playlist or feed link and set Max videos per channel / feed. With Only new videos and a schedule, each run picks up only new uploads.
How accurate is the speech recognition?
On two English test clips checked against human captions, the word error rate was 9.0% and 10.6% with the default (tiny.en), 9.6% and 8.1% with base, and 5.1% with small on the first. Captions from the platform itself are used whenever they exist.
Why did a video come back as an error?
The error field says why: private or removed, no speech in the audio, a platform that refused the request, or a link that is not a video. Error rows are never charged.
Can I use Video Transcriber through the API or with AI agents?
Yes: the Apify API, the Python and JavaScript clients, Make, Zapier, n8n, webhooks, and the Apify MCP server for agents.
Your feedback
Found a link that should work and does not? Open an issue on the actor's page with the URL and we will look at it.