YouTube to Text: Video Transcript avatar

YouTube to Text: Video Transcript

Pricing

from $0.29 / 1,000 transcripts

Go to Apify Store
YouTube to Text: Video Transcript

YouTube to Text: Video Transcript

YouTube to text: paste video, Shorts, channel or playlist links and get each video's transcript as clean plain text, in its own language or translated into yours, with title, channel, duration and word count. For notes, summaries, blogs and AI. Videos without captions are free. No login.

Pricing

from $0.29 / 1,000 transcripts

Rating

0.0

(0)

Developer

DeepMine

DeepMine

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Share

YouTube to text: paste video, Shorts, channel or playlist links and get each video's whole transcript as clean plain text, in the video's own language or translated into yours, with the title, channel, duration and word count next to it. Ready for notes, summaries, blog posts or an AI prompt.

🎬 TitleπŸ“Ί Channel⏱️ DurationπŸ”€ WordsπŸ“ Text (start)
But what is a neural network? | Deep learning chapter 13Blue1Brown18:403,357This is a 3. It's sloppily written and rendered at an extremely low re…
Inside the Mind of a Master Procrastinator | Tim Urban | TEDTED14:042,277So in college, I was a government major, which means I had to write a …
How to sound smart in your TEDx Talk | Will Stephen | TEDxNewYorkTEDx Talks5:56828Translator: Gustavo Rocha Reviewer: Ariana Bleau Lugo Hear that? That'…

$0.39 per 1,000 transcripts on Starter ($0.49 Free, $0.35 Scale, $0.29 Business). The prefilled run (3 videos) costs about $0.001. Videos without captions are free.

From video to text

πŸ“„ Output starts on plain text only: each row's transcriptText is the whole talk as one block of text, without timestamps, and the πŸ“ Video to text tab shows it next to the title, channel, duration and word count. Export the tab as CSV or Excel, or paste the text into ChatGPT or Claude for a summary. Want the timings too? Choose timed segments, SRT or WebVTT. Same engine as YouTube Transcript API, which has every option in one form.

What you get

  • The right language. A run with no language set returns each video in the language spoken in it (manual captions first, then auto-generated), never an alphabetically first translation or an auto-dub. A Korean-only video gets its Korean track, and an English talk YouTube auto-dubbed into 20 languages gets English. isOriginalLanguage on every row says whether the transcript is in the spoken language.
  • Any language, timings kept. Set Languages and a video without captions in yours is machine-translated segment by segment (Google's engine), so start/end stay exact and the original text stays in originalTranscriptText. Caption tracks people made in your language always come first. Every row says how it got its language: translationSource is human, machine or youtube (empty for the video's own language). No extra cost.
  • Text plus timings: transcriptText (plain), transcript (segments with start, end, duration in seconds and text), word-level times for auto captions on request, SRT or WebVTT as a ready string.
  • Video and channel details: title, description, keywords, category, views, likes, the exact comment count, duration, exact publish time (UTC), the countries it plays in, unlisted and family-safe flags, every thumbnail size up to 1280x720, channel name, handle, URL, subscribers, an 800 px channel avatar, verified badge, and every caption track the video has (language, auto or not) plus the languages YouTube lists for auto-translation.
  • Many videos at once: single videos, Shorts, a channel's videos, Shorts or live streams, playlists and YouTube searches, each capped by Max videos and optionally by a date range: Published after and Published before (each a date or a period like 7 days; a channel skips its newer videos for free and stops at its first older one). A video listed by several inputs is read and charged once.
  • Nothing silent: videos without a transcript (no captions, private, age-restricted, removed) get a free row in the No transcript tab saying why. A "removed" or "unavailable" answer is checked on a second IP first, and when every video comes back without captions the run checks a video known to have them and fails loudly if YouTube's answer has changed.

No login, no cookies, no YouTube API key.

No language set, the 4 newest @TED talks (2026-10-18)starvibe/youtube-video-transcriptThis Actor
Transcript languageArabic, 4 of 4 (a volunteer translation track)English, 4 of 4 (the spoken language)

Input

FieldWhat it does
🎬 YouTube links or video IDsVideos (watch?v=, youtu.be/, /shorts/, an 11-character ID), channels (@handle, add /shorts or /streams) and playlists
πŸ” Search YouTubeOptional search words; the top videos are read
πŸ“Š Max videos per inputVideos read from each channel, playlist or search; default 20
🌐 Transcript languagesCodes in order of preference (en, es, pt-BR). Empty = the video's own spoken language (never an auto-dub). Set a code to get a dub's or translation's transcript on purpose. Caption tracks people made in your language (common on TED and big channels) are returned whenever they exist; otherwise the captions are translated into the first language (see Translation)
πŸ”€ TranslationMachine translation (default): every segment translated, timings kept, translationSource: machine. If the translator fails or stalls, the row comes in the original language with translationStatus: failed and the reason, and after 3 failures in a row the run stops translating instead of waiting. YouTube's auto-translation: tried once per video, but YouTube refused it for automated downloads on 20 of 21 tries in our tests, so you mostly get the original language; after 5 refusals the run stops asking. None: the original captions
πŸ“„ OutputPlain text only (default), + timed segments, + SRT, + WebVTT
πŸŽ›οΈ FiltersCaption type (manual first, manual only or auto-generated only); Searches return Shorts only; Published after and Published before (channels, playlists and searches: a date like 2026-09-01, that day included, or a period like 7 days; video links are always read)
🧾 OutputLikes, comments, date and channel stats (on by default, no extra cost); word-level timings

Ready-made examples

Open one and press Try for free: it copies the input to your account, where you change the links or the words.

Use it from an AI agent or the API

Connect the Apify MCP server at https://mcp.apify.com?tools=deepmine/youtube-to-text (Claude, VS Code or any MCP client), or call the Actor through the Apify API with urls (video links or IDs, Shorts, channels, playlists) and/or searchQueries:

{"urls": ["https://www.youtube.com/watch?v=iG9CE55wbtY", "https://www.youtube.com/@TED"], "maxVideos": 20, "languages": ["en"], "outputFormat": "segments"}

maxVideos caps each channel, playlist or search; languages picks or translates the transcript language; outputFormat is segments, text (default), srt or vtt. Each row has the whole transcript in transcriptText. With neither urls nor searchQueries, the run reads the 3 example videos.

Use cases

  • AI and RAG: feed whole transcripts with titles, channels and dates to an LLM, a vector store or a summarizer.
  • Subtitles: download SRT or WebVTT files ready for a video editor, or translated subtitles with the original timings.
  • Content research: read what a channel or a search says across 20, 200 or 2,000 videos, with views and likes next to each.
  • Repurposing: turn talks, podcasts and tutorials into blog posts, notes or quotes with timestamps.
  • Language learning and accessibility: the video's own language, or a translation that keeps every line aligned.

Output fields (transcripts, in row order)

thumbnail, title, transcriptSnippet, channelName, videoUrl, language, languageCode, originalLanguageCode and originalLanguage (the video's spoken language), isOriginalLanguage (true when the transcript is in that language, false for a dub or translation), isAutoGenerated, isTranslated, translationSource (human, machine, youtube, or empty for the video's own language), isMachineTranslated, translationStatus (ok, failed, notNeeded when a track in your language exists, notRequested), translationError (why a translation failed; the row is then in the original language), requestedLanguage, viewCount, likeCount, commentCount (exact, from the first comments page; YouTube's rounded figure if that page doesn't answer in time), durationSeconds, duration, publishedAt (exact UTC time; the date alone if YouTube gives only that), publishedTimestamp, category, segmentCount, wordCount, transcriptText, originalTranscriptText (the text before translation on machine-translated rows; null on the others), transcript (unless plain text only), srt / vtt (when chosen), availableLanguages, captionTracks (language code, name, auto-generated or not, translatable or not), translationLanguages, isTranslatable, channelHandle, channelUrl, channelId, channelSubscribers (rounded, as YouTube shows it), channelAvatar (800 px), isChannelVerified, description, descriptionSnippet, keywords, isLive, isPrivate, isUnlisted, isFamilySafe, isShortsEligible, allowRatings, isCrawlable, isUnpluggedCorpus, isOwnerViewing, isTvfilmVideo, uploadedAt, availableCountries, thumbnails, videoId, inputs, scrapedAt (when that row was read). The thumbnail field holds the 1280x720 image when YouTube has one (HD uploads), else 480x360.

No transcript tab (free): thumbnail, title, channelName, videoUrl, hasTranscript (false), status (noCaptions, noMatchingCaptions, private, ageRestricted, notFound, unavailable, liveNotReady, emptyCaptions, blocked), reason, availableLanguages, videoId, inputs, scrapedAt.

Output tabs: πŸ“ Video to text, πŸ“Š Overview (thumbnail, title, transcript snippet, channel, link, language, views, likes, duration, date, words), πŸ“ˆ Stats (every count), 🌐 Languages (language, original or not, auto or not, translated or not, every caption language the video has), πŸ“ Full Text and 🚫 No transcript. The run summary (OUTPUT) lists each input with its video count and status.

Measured runs

Apify platform, 1,024 MB (the default), 2026-10-05:

InputTranscriptsFree rows (no captions)Run timePeak memory
TED channel (60 newest) + search "sourdough bread recipe" (60)118214-21 s221 MB
MrBeast Shorts (40) + a 3Blue1Brown playlist, translated into Spanish, SRT4829-10 s208 MB
TED channel (100 newest)991about 9.5-14 s245 MB
Veritasium channel (100 newest, ~30 min videos)100022-31 s (3.2-4.5 videos/s)237 MB

Every transcript was charged once (118, 48 and 99 charges). The first row arrived about 3 s after the Actor process started for video links, and 3.6-6.5 s for channels and searches (their video list is read first).

How it gets past YouTube's bot check

YouTube refuses most datacenter IPs and serves the rest without limit, so the run looks for IPs that pass and keeps using them. A video that no datacenter IP will serve (datacenter IPs keep failing, or the video has waited a few seconds for one) is read through a residential IP instead: one small call of a few KB, included in the transcript price. The run goes back to datacenter as soon as one passes again.

On Apify's Free plan your runs get only 5 datacenter IPs (paid plans get 30 or more), and YouTube can refuse all 5. The run then reads videos through residential IPs, enough for a typical small run; a big Free-plan run can still stop with a clear message when that runs out. If YouTube refuses every IP for 5 videos in a row, the run stops and fails with a clear message instead of finishing with empty rows; run it again later (videos already delivered are never charged twice).

Pricing

Pay per transcript: $0.49 per 1,000 on Free, $0.39 Starter, $0.35 Scale, $0.29 Business. No start fee. Videos without a transcript cost nothing. Your run's max cost is never exceeded: the run stops at it.

Feedback

Missing a field or a language? Open an issue on the Actor page. Useful? A quick review helps a lot.