YouTube Transcript & Subtitles Scraper - Captions, SRT, AI avatar

YouTube Transcript & Subtitles Scraper - Captions, SRT, AI

Pricing

from $3.50 / 1,000 transcript delivereds

Go to Apify Store
YouTube Transcript & Subtitles Scraper - Captions, SRT, AI

YouTube Transcript & Subtitles Scraper - Captions, SRT, AI

Scrape YouTube transcripts and subtitles from video, Shorts, channel, playlist or search links as text, timestamps, SRT or VTT. Any caption language or translated; AI audio transcription when a video has no captions. Only-new-videos mode for schedules. For AI agents, MCP and n8n. Pay per transcript.

Pricing

from $3.50 / 1,000 transcript delivereds

Rating

0.0

(0)

Developer

Scrapewise Data

Scrapewise Data

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

9

Monthly active users

2 days ago

Last modified

Features

Limited permissions

Share

YouTube Transcript Scraper: captions, subtitles, SRT/VTT and AI transcription

Scrape the full transcript of any YouTube video as clean text, timestamped segments, SRT or VTT, with title, channel, views and length. No API key. US$ 5 per 1,000 transcripts, 3 to 8 seconds per video.

What does this YouTube transcript scraper do?

  • Takes videos, Shorts, finished live streams, channels, playlists or search terms.
  • Returns the transcript in the language you ask for, translated when the video does not have it.
  • Transcribes the audio when a video has no captions, if you turn it on.
  • Gives every video one row: a transcript, or a free row with an errorCode that says why not.

Who uses it

  • AI and RAG builders: transcripts and timestamped chunks to summarize, quote or index.
  • Automation (n8n, Make, Zapier): one call per video that never breaks on a video without captions.
  • SEO and content teams: what competitors say in their videos, as text to search and repurpose.
  • Subtitle editors and translators: SRT and VTT files in the language they need.

How much does it cost to scrape YouTube transcripts?

Apify planPer transcriptPer 1,000 transcripts
FreeUS$ 0.005US$ 5.00
BronzeUS$ 0.0045US$ 4.50
SilverUS$ 0.004US$ 4.00
Gold and aboveUS$ 0.0035US$ 3.50
  • One charge per video whose transcript is delivered, whatever its length, format or translation. 50 transcripts cost US$ 0.25 on the Free plan.
  • Free: listing channels, playlists and searches, videos without captions, private, removed, age restricted, live or blocked videos, videos skipped by a date filter, duplicates.
  • Audio transcription, from October 29, 2026, only when you turn it on and the video has no captions: the transcript price plus US$ 0.03 per started minute of audio (a 12 minute video costs US$ 0.365).
  • Actor start, from October 29, 2026: US$ 0.00005 per run (US$ 0.05 per 1,000 runs).
  • Proxy and compute are included. No YouTube API key needed.

Why use this YouTube transcript scraper

Common problemWhat this Actor does
A live stream that already ended returns nothingTranscribed like any video (tested on a 3.6 hour stream, 37,561 words)
A stream that is still live or scheduledFree row with LIVE_NOT_ENDED and YouTube's own message
"Could not retrieve the video ID"Accepts watch, youtu.be, m., music., Shorts, live, embed, youtube-nocookie.com, attribution links, URLs without https:// or with quotes, and bare 11-character ids
Language parameter ignoredThe language you ask for comes first; if the video does not have it, the transcript is translated and the row says so (translatedTo, translationSource)
Empty string returned as successEvery video gets text, or error plus a stable errorCode
"Failed with status 403"Each video is retried several times before it is reported as BLOCKED (free)
Paying for runs that failOnly delivered transcripts are charged: failed, blocked, private or captionless videos come back as free rows
More charges than requestedThe same video in three URL formats is one row and one charge, and maxItems is a hard cap

How to scrape YouTube transcripts

  1. Paste video, channel or playlist links in Video, channel, playlist or search URLs, or add Search terms.
  2. Set Preferred languages and, for channels, Max videos per channel, playlist or search.
  3. Click Start. Transcripts appear in the Output tab and export to JSON, CSV, Excel, SRT or VTT.

The same run as JSON input:

{ "videoUrls": ["https://www.youtube.com/watch?v=iG9CE55wbtY"] }

A video in French, whatever languages it has: { "videoUrls": ["https://youtu.be/iG9CE55wbtY"], "targetLanguage": "fr" }. The 50 newest videos of a channel since January:

{ "videoUrls": ["https://www.youtube.com/@veritasium"], "maxVideosPerSource": 50, "publishedAfter": "2026-01-01" }

Search terms: { "searchQueries": ["python asyncio explained"], "maxVideosPerSource": 6 }. An empty input transcribes one example video.

One real row from 2026-10-21, text and lists shortened:

{
"videoId": "iG9CE55wbtY",
"url": "https://www.youtube.com/watch?v=iG9CE55wbtY",
"title": "Do schools kill creativity? | Sir Ken Robinson | TED",
"channel": "TED",
"channelId": "UCAuUUnT6oDeKwE6v1NGQxug",
"publishedAt": "2007-01-07T05:00:34+00:00",
"viewCount": 25055607,
"lengthSeconds": 1203,
"category": "Education",
"isLiveContent": false,
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"availableLanguages": ["en", "fr", "de", "es", "pt-BR"],
"text": "Good morning. How are you? (Audience) Good. It's been great, hasn't it? ...",
"wordCount": 3170,
"segments": [{ "text": "Good morning. How are you?", "start": 27.1, "duration": 2.58 }],
"errorCode": null,
"sourceUrl": "https://www.youtube.com/watch?v=iG9CE55wbtY",
"scrapedAt": "2026-10-21T20:18:26.310132+00:00"
}

Switching from another YouTube transcript scraper? Your existing input works

Send the same JSON through the API and change only the Actor id.

Field you already sendWhat happens here
videoUrl, youtube_url, urls, startUrls, video_urls, videoIdsMerged into videoUrls
targetLanguage, languageThe language you want, translated when missing; auto for the spoken language
translate_to / transcript_typeSame as translateTo / captionType (generated = auto)
output_formats (srt, vtt, text)Same as subtitleFormats; text is always included
list_onlyReturns each video's caption tracks (captionTracks) without downloading them; free
channel, channel_urlLists or transcribes the channel's videos ("channel_transcripts": true with channel)
max_videos, start_date, end_datePer-source limit and publish date range
include_metadata, include_transcript_text, preserve_formattingAccepted; metadata and text are always included
{ "channel_url": "https://www.youtube.com/@veritasium", "max_videos": 5, "language": "en" }

YouTube transcript languages and translation

languages is an ordered list of caption codes (default en, pt, pt-BR, es); ["auto"] returns the language spoken in the video. targetLanguage puts one language first and translates into it when the video lacks it; add "autoTranslate": false to get only original captions. translateTo translates every transcript. YouTube's own translation is used when it exists, machine translation otherwise; timestamps stay the same and the row records the source. Translation is included in the price.

YouTube videos without captions

With transcribeAudioIfNoCaptions on, videos with no captions at all are transcribed from their audio inside the Actor (no API key, about 99 languages). Rows get transcriptSource: "audio" and audioMinutes; videos longer than maxAudioMinutes (default 30) come back as a free AUDIO_TOO_LONG row. Videos with captions always use the captions. Give the run 2 to 4 GB of memory: an 11.8 minute video took 9.8 min at 2 GB and 5.5 min at 4 GB, with a one-time setup per run.

Monitor YouTube channels: only new videos

Turn on onlyNewVideos, save the input as a Task and attach a Schedule. Delivered video ids are kept per channel, playlist or search in the key-value store youtube-transcript-only-new-videos in your account, so each run transcribes only new uploads and a day without uploads costs nothing. Videos that had no captions are tried again on the next run, free.

Video guides from Apify: how to schedule an Actor and how to connect it to other apps.

Use it from AI agents, n8n and Make

  • AI agents (MCP): add this Actor to the Apify MCP server and call it from Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent sends a video, channel or search and gets the transcript back as text, ready to summarize, quote or index. Example prompt: "get the transcripts of the 10 newest videos of this channel and list the main topics". Server URL: https://mcp.apify.com/?actors=scrapewise/youtube-transcript.
  • RAG and summaries: includeSegments gives timestamped chunks you can embed one by one and link back to the exact second of the video.
  • n8n, Make, Zapier: use the Apify node or module ("Run Actor and get dataset items") with the same JSON input as above, or read the dataset from the Apify API. See Apify integrations.
  • Schedules: run it daily with onlyNewVideos on a list of channels to get each new video's transcript once.
  • Exports: JSON, CSV, Excel or XML from the run page, and SRT or VTT files with subtitleFormats.

Requests an agent can pass straight through:

  • "Transcribe the 10 newest Veritasium videos and list the main topics" -> {"videoUrls": ["https://www.youtube.com/@veritasium"], "maxVideosPerSource": 10}
  • "Find videos that explain the Model Context Protocol and give me their transcripts" -> {"searchQueries": ["model context protocol explained"], "maxVideosPerSource": 5}
  • "Give me this video's transcript in Spanish" -> {"videoUrls": ["https://youtu.be/iG9CE55wbtY"], "targetLanguage": "es"}

YouTube transcript output fields

FieldNotes
videoId, url, title, channel, channelId, channel_urlAlways present when the video exists
publishedAt, viewCount, lengthSeconds, category, description, thumbnailUrlVideo metadata at the moment of the run
isLiveContentTrue for past or current live streams
language, languageName, isAutoGeneratedLanguage of the delivered text and whether it is an automatic caption or audio transcription
availableLanguagesEvery caption language the video has
text, wordCountThe full transcript as one string and its word count
segments{text, start, duration} per caption line (includeSegments, on by default)
durationSecondsWhere the last caption line ends
srt, vttFull subtitle files, with subtitleFormats
translatedTo, translationSource, translationErrorOnly on translated rows
transcriptSource, audioMinutesOnly on rows transcribed from audio
videoStatus, publishDateWith includeVideoStatus
captionTracksOnly with list_only
sourceUrlThe input the video came from
error, errorCode, scrapedAtSee below

The dataset has two views: Overview and All fields.

Error codes (rows not charged)

errorCodeMeaning
NO_CAPTIONSNo captions at all (turn on audio transcription to get text)
NO_CAPTIONS_IN_LANGUAGENo captions of the requested captionType
EMPTY_TRANSCRIPTThe caption track exists but has no text
VIDEO_UNAVAILABLE, VIDEO_UNPLAYABLEPrivate, removed or region locked
AGE_RESTRICTEDAge restricted video
LIVE_NOT_ENDEDLive stream still running, scheduled, or without a recording yet
INVALID_VIDEO_ID, INVALID_INPUTNot a valid video id or YouTube URL
AUDIO_TOO_LONG, NO_SPEECHAudio transcription only
BLOCKEDYouTube refused every attempt; run it again

The run itself fails only when nothing was delivered because YouTube blocked the requests, or when no channel, playlist or search could be listed.

YouTube transcript scraper FAQ

Why not the official YouTube API? The YouTube Data API downloads caption tracks only with OAuth for videos you own or manage, and every call uses your daily quota. This Actor reads the public captions of any public video without an API key, adds translation, SRT and VTT, and can transcribe videos that have no captions.

How fast is it? One video takes 3 to 8 seconds; a channel of 10 videos about 11 seconds; 34 mixed videos in 9 languages took 50 seconds. Rows arrive in the order they finish, so sort by publishedAt for a timeline.

It said NO_CAPTIONS but the video has captions. Several ways of reading the captions are tried first. Open an issue with the URL and it will be looked at.

How many videos can I pull from one channel? maxVideosPerSource goes up to 5,000 and maxItems up to 10,000; set both.

Can I call it from the API? Yes, for example with curl. A video without captions is a row with errorCode, so a one-video-per-call workflow does not break.

curl -X POST "https://api.apify.com/v2/acts/scrapewise~youtube-transcript/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" -d '{"videoUrls": ["https://youtu.be/iG9CE55wbtY"], "subtitleFormats": ["srt"]}'

Is it legal? The Actor reads public caption tracks and audio of public videos without login. You are responsible for how you use and republish the text.

YouTube transcript scraper limitations

  • Machine translation and audio transcription can contain mistakes; rows say when they were used.
  • Age restricted and members-only videos cannot be transcribed.
  • publishedAt can be empty in rare cases.
  • Keep the default proxy settings: they are included in the price and give the most complete results.

Try it now

Click Start with the example input: one TED talk, about 3,000 words, for US$ 0.005. Need a field, a format or a language option? Open an issue in the Issues tab of this page; user requests decide what the next version adds.

Changelog

  • 19 Oct 2026: examples for AI agents (Apify MCP server).
  • 16 Oct 2026: section on AI agents (MCP), n8n and Make in this page.
  • 2026-10-08: LIVE_NOT_ENDED right away for running streams; targetLanguage with automatic translation; ["auto"] language; more URL formats; optional audio transcription; field names of other transcript actors accepted; empty caption tracks become free EMPTY_TRANSCRIPT rows.
  • 2026-10-07: optional videoStatus and publishDate.
  • 2026-09-14: lower price with Store discounts by plan.