YouTube Transcript Scraper - Captions, SRT, AI Transcription avatar

YouTube Transcript Scraper - Captions, SRT, AI Transcription

Pricing

from $3.50 / 1,000 transcript delivereds

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

YouTube Transcript Scraper - Captions, SRT, AI Transcription

Get 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

17

Total users

12

Monthly active users

8 hours ago

Last modified

Share

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

YouTube Transcript Scraper returns the full transcript of a YouTube video as clean text, timestamped segments, SRT or VTT, with title, channel, publish date, views, length and thumbnail. It works on regular videos, Shorts, finished live streams, channels, playlists and searches, in the language you ask for (translated when the video does not have it), and can transcribe the audio when a video has no captions. Every video you send comes back as one row: a transcript, or an errorCode that says why not. It is used for AI summaries and RAG, n8n and Make workflows, SEO research and subtitle editing.

YouTube transcript scraper pricing at a glance

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.

What the YouTube transcript scraper fixes

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 on fresh IPs, datacenter then residential, before it is reported as BLOCKED (free)
More charges than requestedThe same video in three URL formats is one row and one charge, and maxItems is a hard cap

YouTube transcript scraper quick start

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

A video in French, whatever languages it has: { "videoUrls": ["https://youtu.be/dQw4w9WgXcQ"], "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-09-15, text and lists shortened:

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channel": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"publishedAt": "2009-10-25T06:57:33+00:00",
"viewCount": 1816019470,
"lengthSeconds": 213,
"category": "Music",
"isLiveContent": false,
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"availableLanguages": ["en", "de-DE", "ja", "pt-BR", "es-419"],
"text": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ...",
"wordCount": 487,
"segments": [{ "text": "[♪♪♪]", "start": 1.36, "duration": 1.68 }],
"errorCode": null,
"sourceUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"scrapedAt": "2026-09-15T19:30:18.300795+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 tried first and Google Translate when YouTube refuses; 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 with Whisper running 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/dQw4w9WgXcQ"], "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. Two YouTube app clients and a second independent method are checked 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, n8n, Make, Zapier or an AI agent? Yes: scrapewise/youtube-transcript through the Apify API or clients, the Apify app in those tools, or the MCP server at https://mcp.apify.com/?tools=scrapewise/youtube-transcript. 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/dQw4w9WgXcQ"], "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 comes from a separate light request and can be empty in rare cases.
  • YouTube blocks most datacenter IPs, so residential proxy is the fallback; keep it on.
  • Something broke or a field is missing? Open an issue on the Issues tab.

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.