YouTube Transcript Extractor: Text, SRT, VTT, $3/1K avatar

YouTube Transcript Extractor: Text, SRT, VTT, $3/1K

Pricing

from $2.00 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Extractor: Text, SRT, VTT, $3/1K

YouTube Transcript Extractor: Text, SRT, VTT, $3/1K

Get YouTube transcripts and subtitles from videos, Shorts, channels, playlists or searches as plain text, timed segments, SRT or VTT, with title, channel, views, duration and caption languages. Pick languages, manual or auto. No login, no API key.

Pricing

from $2.00 / 1,000 transcripts

Rating

0.0

(0)

Developer

Detroit Web Agent - Open Data

Detroit Web Agent - Open Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Categories

Share

YouTube Transcript Extractor: Transcripts and Subtitles as Text, SRT and VTT

YouTube Transcript Extractor: features, price and a real output row

Run it free on Apify

Price per 1,000 transcriptsFree planStarterScaleBusiness
This Actor$3.00$2.70$2.40$2.00
Most-used alternative$10.00$10.00$10.00$10.00

YouTube Transcript Extractor sample output table from a real run

Get the transcript of any YouTube video, or of every video on a channel, playlist or search, as plain text, timed segments, SRT or WebVTT. Each row also has the title, channel, views, duration, description and the full list of caption languages. You choose the language and whether to take human or auto-generated captions. You don't need a login or an API key, and you only pay for videos that actually return a transcript.

  • In short: YouTube Transcript Extractor (Apify actor transparent_meteorite/youtube-transcript-extractor) downloads the public caption tracks of YouTube videos. It returns one row per video with the transcript in the formats you pick.
  • Who it is for:
    • AI and RAG builders feeding video content to LLMs
    • content teams turning videos into blog posts, notes or quotes
    • researchers analysing what is said on channels or topics
    • subtitle and translation work
    • AI agents that need "what does this video say" as a tool
  • Input:
    • URLs: video, Shorts, channel, playlist or search page
    • or plain search words, or bare video IDs
    • preferred languages, with a fallback to the video's own language
    • manual, auto-generated or any captions
    • output formats: text, timed segments, SRT, VTT
    • optional machine translation (best effort) and extra video details
  • Output: up to 37 fields per video, including:
    • transcript, segments (start, duration, end, text), srt, vtt
    • language, isAutoGenerated, isTranslated, availableLanguages
    • wordCount and segmentCount
    • title, channel, views, duration, description, tags, thumbnail
    • status and a reason for videos without a transcript
  • Pricing: pay per event. $0.003 per transcript on the Free plan and $0.002 on Gold and above, plus a $0.00005 start event. Videos without captions, and unavailable or failed videos, are never charged.
  • Limits: it reads the captions YouTube publishes. It does not run speech-to-text, so a video with no captions at all returns no_transcript (free). Machine translation is rate-limited by YouTube and is best effort.

Key facts

  • Data source: public YouTube caption tracks (manual and auto-generated)
  • Output formats: JSON, CSV, Excel, XML, HTML table (Apify dataset), plus SRT and VTT text inside each row
  • Access: Apify Console, REST API, JavaScript/Python clients, schedules, webhooks, Apify MCP server
  • Login, cookies or YouTube API key needed: no
  • Also known as: YouTube transcript scraper, YouTube subtitles downloader, YouTube captions extractor, YouTube to text, YouTube transcript API alternative

Run in 30 seconds

  1. Open YouTube Transcript Extractor and press Try for free.
  2. Keep the prefilled video, or paste any YouTube URL, then press Start. One transcript takes about 2 seconds.
  3. Open the Output tab. Use the table, or download the results as CSV, Excel or JSON.
{
"startUrls": [{ "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }],
"languages": ["en"],
"outputFormats": ["text", "segments"]
}

What can it extract?

You pasteWhat you get
Video, Shorts or live URL (watch?v=, youtu.be/, /shorts/)That video's transcript
Channel (@handle, /channel/UC...)Transcripts of the latest videos, Shorts or streams (maxVideosPerSource)
Playlist URLTranscripts of every video in the playlist, up to your limit
Search URL or search wordsTranscripts of the top videos for that search
Bare video ID (dQw4w9WgXcQ)Same as a video URL

Input

FieldDefaultWhat it does
startUrlsexample videoAny mix of video, Shorts, channel, playlist and search URLs
searchQueriesnoneSearch words. The top videos for each one are used
maxVideosPerSource10Videos taken from each channel, playlist or search
languages["en"]Preferred caption languages, in order. pt also matches pt-BR
fallbackToAnyLanguageonNo preferred language? Return the video's own captions instead
transcriptTypeanyany (human-made preferred), manual or auto
outputFormatstext, segmentsAny of text, segments, srt, vtt
textWithTimestampsoffPlain text as [m:ss] line instead of one paragraph
translateTononeYouTube machine translation, e.g. de (best effort)
includeExtendedMetadataoffAdds publish date, category, likes and comment count
includeVideosWithoutTranscriptonFree rows that explain why a video was skipped
maxItems0Stop after this many transcripts (cost cap)
monitorModeoffSkip videos already extracted in earlier runs

Output

One row per video:

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channelName": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"durationSeconds": 213,
"viewCount": 1826323732,
"status": "ok",
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"isTranslated": false,
"availableLanguages": [{ "languageCode": "en", "name": "English", "isAutoGenerated": false }, { "languageCode": "ja", "name": "Japanese", "isAutoGenerated": false }],
"wordCount": 487,
"segmentCount": 61,
"transcript": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ...",
"segments": [{ "start": 1.36, "duration": 1.68, "end": 3.04, "text": "[♪♪♪]" }],
"srt": "1\n00:00:18,640 --> 00:00:21,880\nWe're no strangers to love\n...",
"scrapedAt": "2026-10-13T23:50:00.000Z"
}

The row above is from a real run (lists shortened). Videos without a transcript come back as "status": "no_transcript", "unavailable" or "failed", with a message that gives the reason. Those rows are free. The run summary is saved as OUTPUT in the key-value store.

Field names compared with other YouTube transcript actors

Other actorsThis actor
transcript_text / texttranscript
transcript (array of lines) / captionssegments
video_title / channel_nametitle / channelName
languagelanguage plus originalLanguage, isAutoGenerated, isTranslated
not availableavailableLanguages, wordCount, srt, vtt, status + message

Pricing

You pay per video that returns a transcript. One price covers every format you pick:

Apify planPer transcriptPer 1,000 transcripts
Free$0.003$3.00
Bronze$0.0027$2.70
Silver$0.0024$2.40
Gold, Platinum, Diamond$0.002$2.00

There's also a $0.00005 start event per run. Videos without captions, unavailable or private videos, and failed videos cost nothing.

Use it from code, schedules or AI agents

  • API: POST https://api.apify.com/v2/acts/transparent_meteorite~youtube-transcript-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN with the input JSON as the body returns the rows directly.
  • Schedules: point it at a channel with monitorMode: true and run it daily to transcribe each new upload once.
  • MCP / AI agents: add https://mcp.apify.com?actors=transparent_meteorite/youtube-transcript-extractor to Claude, Cursor or any MCP client, then ask something like "summarize this video" or "what did the last 5 videos of this channel say about X".

Who uses it and why

  • Researchers and students turn lectures, interviews and conference talks into searchable text, then quote exact passages using the start time of each segment.
  • Content teams and repurposing agencies take a long video's transcript and use it as the base for blog posts, newsletters, show notes and social snippets.
  • SEO and content analysts compare what top-ranking videos actually say about a topic by pulling the transcripts of the top search results for a query.
  • AI and data teams build corpora for summarization, retrieval (RAG), classification or fine-tuning. Each row has the transcript, language, word count and video identifiers in one flat record.
  • Accessibility and localization teams export srt or vtt files for videos that already have captions, or request a machine translation as a starting point.
  • AI agents call the actor through MCP to read a video before answering questions about it, instead of guessing from the title.

How the input fields work together

Choose sources with startUrls, videoIds and searchQueries; all three can be combined in one run. A video, Shorts or live URL is processed directly. A channel, playlist or search is expanded into videos, limited by maxVideosPerSource (1 to 5,000, default 10). For channels, channelTab picks Videos, Shorts or Streams. A video that appears in more than one source is processed once.

languages is an ordered list of caption language codes. The actor walks the list and takes the first language the video has. A short code such as pt also matches regional variants such as pt-BR. If none match, fallbackToAnyLanguage (on by default) returns the video's own captions, and the row's languageMatch field tells you that a fallback happened. Turn it off if you only want your exact languages and prefer a no_transcript row otherwise.

transcriptType controls human-made versus auto-generated captions. any prefers human-made captions when they exist, manual accepts only those, and auto accepts only auto-generated ones. Check isAutoGenerated in the output if accuracy matters, because auto-generated captions can misspell names and technical terms.

outputFormats selects which fields each row carries: text gives the transcript string, segments gives an array with start, duration, end and text, and srt and vtt give complete subtitle files as text. textWithTimestamps changes the plain text from one paragraph into one line per caption with a [m:ss] prefix, which is handy for reading or for pasting into a model with time references.

includeExtendedMetadata reads the watch page once per video to add fields such as publish date, upload date, category, like count and comment count. includeVideosWithoutTranscript keeps the free explanatory rows for videos that returned nothing. maxItems is a hard cap on transcripts for the run. monitorMode remembers extracted video IDs in a named store (monitorStoreName) and skips them next time.

Worked examples

One lecture with timestamps for quoting

{
"startUrls": [{ "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }],
"languages": ["en"],
"outputFormats": ["text", "segments"],
"textWithTimestamps": true
}

Content research: transcripts of the top videos for a search

{
"searchQueries": ["how to bake sourdough bread"],
"maxVideosPerSource": 5,
"languages": ["en"],
"transcriptType": "manual",
"includeExtendedMetadata": true
}

Subtitle files from a channel in two languages

{
"startUrls": [{ "url": "https://www.youtube.com/@freecodecamp" }],
"maxVideosPerSource": 10,
"languages": ["es", "en"],
"outputFormats": ["srt", "vtt"],
"maxItems": 10
}

Here the actor tries Spanish first and English second for every video, and stops after ten transcripts.

Tips to keep runs fast and cheap

  • Start with a small maxVideosPerSource and a maxItems cap, check one row, and then scale up.
  • Request only the formats you need. segments and srt on a long video make rows large.
  • Use monitorMode on a channel to transcribe each new upload once instead of re-processing old ones.
  • Keep includeVideosWithoutTranscript on while you test. The free rows show exactly why a video was skipped.
  • Raise videoConcurrency (1 to 10, default 5) for many short videos.

Limits and honest caveats

  • The actor reads the caption tracks that YouTube already publishes. It does not listen to audio and does not run its own speech-to-text, so a video with no captions returns no_transcript.
  • Auto-generated captions are only as good as YouTube's recognition. Expect errors with accents, music, jargon and proper nouns.
  • Machine translation through translateTo is best effort and YouTube often rate-limits it. When it refuses, the row carries the original language plus a translationError.
  • Only public videos are available. Private, deleted and region-blocked videos return unavailable, and a failed fetch returns failed. Both come with a message.
  • Transcripts of copyrighted videos remain the creator's content. Use them for analysis and quotation in line with the law that applies to you.

Output status values

statusMeaningCharged
okA transcript was found and returnedYes
no_transcriptThe video exists but has no caption track, or none matches your settingsNo
unavailableThe video is private, removed or blockedNo
failedThe page could not be fetched after retriesNo

More questions

How do I get a YouTube transcript as plain text? Keep outputFormats at text, run the actor on the video URL, and read the transcript field. Export the dataset as CSV or JSON if you need a file.

Can I get transcripts for a whole channel? Paste the channel URL, set maxVideosPerSource to the number of recent uploads you want, and choose the tab with channelTab.

Does it support languages other than English? Yes. List the codes you want in languages. The available tracks for each video are listed in availableLanguages.

Can I call it from Python?

from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("transparent_meteorite/youtube-transcript-extractor").call(
run_input={
"startUrls": [{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}],
"languages": ["en"],
}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["title"], row["wordCount"])

FAQ

Does it work on videos without subtitles? Most videos have auto-generated captions, and those work. A video with no captions at all (YouTube made none) returns no_transcript and is free. The actor does not run its own speech-to-text.

Which language do I get? It tries your languages in order, preferring human-made captions. If none of them exist and fallbackToAnyLanguage is on, you get the video's own captions, and languageMatch says fallback.

Is translation reliable? It uses YouTube's own machine translation, and YouTube often rate-limits it. When YouTube refuses, the row contains the original-language transcript plus a translationError, at the same price. For guaranteed translations, translate the transcript text yourself.

Can I get SRT or VTT files? Yes. Add srt or vtt to outputFormats; each row then carries the full subtitle file as text.

Do I need a proxy? No, not for normal runs. If YouTube starts refusing requests, the run switches to Apify residential proxy on its own. Turn autoProxyFallback off to prevent this.

Is this legal? The actor reads public captions only. Transcripts are the creators' content, so you are responsible for using them in line with YouTube's terms and copyright law.

Something missing or broken? Open an issue on the Issues tab with the run URL and we will reply there.

New to Apify? Create a free account and run this Actor in under a minute. Some links are affiliate links.