YouTube Subtitles Downloader: Download SRT & VTT ยท Apify
YouTube Subtitles Downloader: SRT & VTT avatar

YouTube Subtitles Downloader: SRT & VTT

Pricing

from $0.29 / 1,000 transcripts

Go to Apify Store
YouTube Subtitles Downloader: SRT & VTT

YouTube Subtitles Downloader: SRT & VTT

YouTube subtitles downloader and YouTube subtitles API: download YouTube SRT and WebVTT files from video, Shorts, channel or playlist links, the video's own captions or translated with timestamps kept, plus full text and views. A YouTube subtitle scraper; videos without captions are free.

Pricing

from $0.29 / 1,000 transcripts

Rating

0.0

(0)

Developer

DeepMine

DeepMine

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

19 hours ago

Last modified

Features

Limited permissions

Share

YouTube subtitles downloader and YouTube subtitle scraper: paste video, Shorts, channel or playlist links and download YouTube SRT files (or WebVTT), one per video, in the video's own language or in yours, machine-translated line by line with every timestamp kept. Each row also has the full text, title, views, likes, publish date and channel.

๐ŸŽฌ Title๐Ÿ“บ Channel๐ŸŒ Languageโฑ๏ธ Duration๐Ÿ“„ SRT (first line)
Do schools kill creativity? | Sir Ken Robinson | TEDTEDEnglish20:0300:00:27,103 --> 00:00:29,678 Good morning. How are you?
Your Body Language May Shape Who You Are | Amy Cuddy | TEDTEDEnglish21:0300:00:00,000 --> 00:00:07,000 Translator: Joseph Geni Reviewer: Morton Bast
Steve Jobs' 2005 Stanford Commencement AddressStanfordEnglish - English15:0400:00:07,470 --> 00:00:10,369 This program is brought to you by Stanford University.

$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.

The start of the first file (srt, Do schools kill creativity?):

1
00:00:27,103 --> 00:00:29,678
Good morning. How are you?
2
00:00:29,702 --> 00:00:31,105
(Audience) Good.
3
00:00:31,129 --> 00:00:32,797
It's been great, hasn't it?

Subtitle files, ready to use

๐Ÿ“„ Subtitle file format starts on SRT here: every row's srt field is a complete .srt file (numbered cues, 00:00:27,103 --> 00:00:29,678 times) ready for Premiere, DaVinci Resolve, VLC or a re-upload. Pick WebVTT for HTML5 players and you get vtt instead. The ๐Ÿ“„ SRT files tab lists them next to each title. Set ๐ŸŒ Transcript languages to es, de or any code: captions people made in that language come first, and otherwise the captions are machine-translated line by line with the original timings, so the translated file stays in sync with the video.

Every row links its own file: fileUrl downloads <videoId>.<language>.srt (or .vtt) from the run's storage as that file, no token needed, and the same files sit in the run's Key-value store. From the API, list the links with https://api.apify.com/v2/datasets/<datasetId>/items?fields=videoId,fileUrl&clean=1 and GET each one.

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, and SRT, WebVTT or text as a real file per video (fileUrl).
  • 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 saying why, in the run's No transcript dataset (linked in the run summary and the run's status message). 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
๐Ÿ“„ Subtitle file formatSRT (default), WebVTT, or no file: plain text + segments, plain text only
๐ŸŽ›๏ธ 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-subtitles-downloader (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": "srt"}

maxVideos caps each channel, playlist or search; languages picks or translates the transcript language; outputFormat is segments, text, srt (default) or vtt. With srt, vtt or text every row also has fileName and fileUrl: a link that downloads that video's own file (<videoId>.<language>.srt, .vtt or .txt) from the run's storage, no token needed. Each row has the whole transcript in transcriptText. With neither urls nor searchQueries, the run reads the 3 example videos.

Get links with YouTube Search Scraper (videos for a keyword), YouTube Channel Scraper or YouTube Playlist Scraper, then paste each row's url here (this Actor also reads a channel, playlist or search directly). Same engine as YouTube Transcript API (every option, text and timed segments), YouTube Captions API (timed captions for code) and YouTube to Text (plain text).

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), fileName and fileUrl (with SRT, WebVTT or text: the file saved for this video and a link that downloads it), 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 dataset (free): thumbnail, title, channelName, videoUrl, hasTranscript (false), status (noCaptions, noMatchingCaptions, private, ageRestricted, notFound, unavailable, liveNotReady, emptyCaptions, blocked), reason, availableLanguages, videoId, inputs, scrapedAt.

Output tabs: ๐Ÿ“„ SRT files, ๐Ÿ“„ WebVTT files (Output format: WebVTT), ๐Ÿ“Š 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. The run summary (OUTPUT) lists each input with its video count and status, and links the free No transcript dataset (noTranscriptDataset) when a video had no transcript.

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.