Video Transcriber - YouTube, TikTok, Instagram & X to Text avatar

Video Transcriber - YouTube, TikTok, Instagram & X to Text

Pricing

from $5.40 / 1,000 audio minute transcribeds

Go to Apify Store
Video Transcriber - YouTube, TikTok, Instagram & X to Text

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

Top Api

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

  1. Create a free Apify account (free monthly credit included).
  2. Open Video Transcriber and click Try for free.
  3. Paste your links into Video or audio URLs - one per line, any mix of platforms.
  4. Leave Transcript source on Captions first, speech recognition otherwise, or force one of them.
  5. Click Start. Transcripts arrive in the dataset as each video finishes.
  6. Open Storage and Export as JSON, CSV or Excel - or read the rows through the API.

⬇️ Input

FieldTypeDefaultWhat it does
urlslist of URLs-Videos, Shorts, reels, posts, channels, playlists, podcast feeds, Apple Podcasts shows, direct files.
urlsFromFileURL-A public .txt / .csv; every http(s) link in it is transcribed.
datasetIdstring-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.
datasetItemsJSON rows-Paste rows from any scraper instead of a dataset id.
transcriptSourceselectCaptions firstauto = captions when the video has them, speech recognition otherwise; captions = captions only; asr = speech recognition only.
languagestringautoSpoken language code or name (en, es, Spanish); forces recognition and picks that caption track.
preferredCaptionLanguageslist-Caption tracks to prefer, in order (en, es). Empty = the video's own spoken language.
translateToEnglishbooleanfalseEnglish text whatever is spoken: an English caption track or YouTube's own translation when available, Whisper's translation otherwise.
modelselectAutoauto (tiny.en for English, base otherwise), tiny, base, small. Same price per minute.
minWordsinteger1Fewer words = a free NO_SPEECH row.
publishedAfterdate or period-2026-10-01, 7 days, 24 hours; videos with an unknown date are kept.
maxMinutesPerVideointeger120Speech recognition stops after this many minutes of one video (the row says truncated). Caption transcripts are never cut.
monitorMode + monitorStoreNameboolean + stringfalseSkip every video a previous run with the same monitor name delivered.
outputFormatsmulti-selectsegmentssegments, words, srt, vtt, timestamped, chunks. Plain text is always included.
chunkSizeinteger1000Characters per RAG chunk.
maxVideosPerSourceinteger10Newest videos taken from each channel, playlist or feed.
maxResultsinteger0Stop after this many transcripts (0 = no limit).
maxTotalMinutesinteger0Stop speech recognition after this many billed audio minutes in the run.
includeFailedRowsbooleantrueFree rows for videos that could not be transcribed.
maxConcurrencyinteger4Videos resolved and downloaded at the same time.
proxyConfigurationproxy-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
}
PlatformLinksWhere the transcript comes from
YouTubewatch?v=, youtu.be/, /shorts/, /live/, /embed/, channels (@handle, /channel/), playlistsYouTube'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, embedsTikTok's own captions when the video has them; speech recognition otherwise
Instagram/reel/, /reels/, /p/, /tv/speech recognition (Instagram shows no captions to visitors)
X (Twitter)x.com / twitter.com /status/<id>speech recognition
Facebook/watch/?v=, /reel/, /<page>/videos/<id>, fb.watch, /share/v/ and /share/r/Facebook's captions (auto-generated or uploaded); speech recognition otherwise
LinkedIn/posts/..., /feed/update/urn:li:activity:<id>LinkedIn's captions; speech recognition otherwise
Vimeovimeo.com/<id>, player.vimeo.com/video/<id>, unlisted ?h= linksVimeo'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
Wistiafast.wistia.net/embed/..., *.wistia.com/medias/<id>Wistia captions; speech recognition otherwise
PodcastsRSS / Atom feeds, Apple Podcasts show linksspeech recognition (episodes newest first)
Files.mp3 .m4a .mp4 .mov .webm .wav .flac .ogg .m3u8 and morespeech recognition
Any other pagea 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:

EventPriceWhen
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 minutespeech recognition; minutes counted per video (a 45-second reel = 1 minute, a 2.5-minute video = 3)

Examples from test runs:

RunResultCharged
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 rows7 caption transcripts + 10 audio minutes = $0.0666
3 newest videos of a YouTube channel, captions only3 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 small for 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_SPEECH and 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.