YouTube Transcript Scraper – Bulk Captions, SRT/VTT, Playlists avatar

YouTube Transcript Scraper – Bulk Captions, SRT/VTT, Playlists

Pricing

$3.00 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper – Bulk Captions, SRT/VTT, Playlists

YouTube Transcript Scraper – Bulk Captions, SRT/VTT, Playlists

YouTube Transcript Scraper for videos, Shorts, playlists and whole channels. Plain text, timestamped segments, clean paragraphs, SRT and VTT in 100+ languages, with fallback to the video's own language. No API key, no quota. Pay only for transcripts delivered – videos without captions are free.

Pricing

$3.00 / 1,000 transcripts

Rating

0.0

(0)

Developer

Ani Björkström

Ani Björkström

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Categories

Share

The YouTube Transcript Scraper turns any YouTube video, Shorts, playlist or whole channel into text you can actually use: plain transcript, timestamped segments, clean paragraphs for LLMs, and ready-to-save SRT and VTT subtitle files, in 100+ languages.

  • Pay only for delivered transcripts. A video with no captions returns a clear reason and costs nothing. No API key, no YouTube Data API quota, no monthly plan.
  • Never comes back empty over a language mismatch. Ask for English on a Korean video and fallbackToAnyLanguage hands you the Korean captions, flagged so you know what you got.
  • Bulk by design. Paste a playlist or channel URL and it expands into individual videos automatically, with human-written captions preferred over auto-generated ones.

What you get

One flat row per video, ready for CSV, Google Sheets, a vector database or an MCP tool call.

FieldDescription
transcriptFull plain-text transcript (always included)
segments[{ start, duration, end, text }] in seconds – on by default
transcriptWithTimestampsOne [mm:ss] text line per cue, the format people paste into ChatGPT or Claude
paragraphsCues merged into ~700-character paragraphs, built for RAG chunking
srt, vttComplete subtitle file contents (.srt / WebVTT)
language, languageCodeRaw, requestedLanguage, languageMatchedRequestWhat you asked for versus what the video had
isAutoGeneratedtrue when the track is YouTube's ASR output
availableLanguages, subtitleLanguages, autoCaptionLanguagesEvery caption track the video offers
wordCount, characterCount, segmentCountSize of the transcript
title, channelName, channelId, channelUrl, durationSeconds, viewCount, likeCount, uploadDate, description, tags, thumbnailUrl, isLiveVideo details (includeVideoDetails, on by default)
videoId, url, transcriptFound, errorIdentity and status of the row

Plain text is always there; every extra format is free and just a checkbox.


Input

Runs with no input at all (it transcribes a demo video), so a scheduled run is never empty. Typical inputs:

A whole playlist as SRT and paragraphs

{
"startUrls": [{ "url": "https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF" }],
"language": "en",
"maxVideos": 100,
"includeParagraphs": true,
"includeSrt": true
}

The latest 50 videos of a channel, strict Spanish only

{
"startUrls": [{ "url": "https://www.youtube.com/@veritasium" }],
"language": "es",
"fallbackToAnyLanguage": false,
"maxVideos": 50
}

Bare video IDs from your own database

{
"videoIds": ["dQw4w9WgXcQ", "JsBZOcqZerk"],
"includeSegments": false,
"includeTimestampedText": true,
"includeVideoDetails": false
}
OptionDefaultWhat it does
startUrlsdemo videoVideo, Shorts, playlist or channel URLs (@handle, /channel/UC…)
videoIds[]Bare 11-character IDs, combined with the URLs
maxVideos100Cap on videos processed (playlists and channels expand up to this)
languageenPreferred caption language code: en, es, de, fr, pt, hi, sv, ja…
fallbackToAnyLanguagetrueTake the video's own language when the requested one is missing
preferAutoGeneratedfalsePrefer YouTube's ASR track even when human captions exist
includeSegments / includeTimestampedText / includeParagraphs / includeSrt / includeVtton / off / off / off / offExtra output formats, no extra cost
includeVideoDetailstrueTitle, channel, views, likes, description, tags, thumbnail
concurrency5Videos fetched in parallel (1–20)
proxyConfigurationApify Proxy (automatic)Datacenter IPs first; a rate-limited video is retried on fresh datacenter IPs, then once on a residential IP

Output example

{
"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",
"durationSeconds": 213,
"viewCount": 1816410960,
"language": "en",
"requestedLanguage": "en",
"languageMatchedRequest": true,
"isAutoGenerated": false,
"availableLanguages": ["de-DE", "en"],
"transcript": "We're no strangers to love, you know the rules and so do I...",
"wordCount": 487,
"segmentCount": 61,
"segments": [
{ "start": 18.64, "duration": 3.24, "end": 21.88, "text": "♪ We're no strangers to love ♪" }
],
"transcriptFound": true,
"error": null
}

A video without captions still produces a row, so nothing silently disappears from a batch:

{
"url": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
"transcriptFound": false,
"error": "This video has no captions or transcript available."
}

Use cases

  • AI, RAG and agents – developers feed paragraphs into LangChain, LlamaIndex, Pinecone or a custom pipeline; the flat rows also work as MCP tool output for Claude or ChatGPT agents.
  • Summarising and repurposing video – content teams turn hour-long podcasts, webinars and lectures into blog posts, newsletters and social threads.
  • YouTube SEO and competitor research – SEO agencies mine what competitors actually say on camera, not just their titles and tags, across whole channels.
  • Subtitles and localisation – editors export SRT/VTT to translate, correct or re-upload; availableLanguages tells you which tracks already exist.
  • Market and academic research – researchers build searchable, timestamped corpora from playlists, courses and conference channels.
  • Compliance and brand monitoring – legal and comms teams keep a written record of what was said in specific videos.
  • Accessibility – produce readable text versions of video content at scale.

Pricing

$3 per 1,000 transcripts – charged once per video that actually returns a transcript. Videos with no captions, private or removed videos and rate-limit failures produce an explanatory row and are not charged. All output formats are included in the same price, and platform usage is included in the per-transcript fee.


Integrations

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("nourishing_courier/youtube-transcript-scraper").call(run_input={
"startUrls": [{"url": "https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF"}],
"language": "en",
"includeParagraphs": True,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["transcriptFound"]:
print(row["title"], row["wordCount"], "words")

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('nourishing_courier/youtube-transcript-scraper').call({
videoIds: ['dQw4w9WgXcQ'],
includeSrt: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].srt);

curl

curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}],"includeParagraphs":true}'

n8n, Make, Zapier – add the Apify node, choose this actor, paste one of the inputs above and pass transcript or paragraphs to your LLM step. MCP – expose it through the Apify MCP server and your agent can call youtube-transcript-scraper as a tool. Results are also available as JSON, CSV, Excel, XML and RSS.


Limits and fair use

The scraper reads captions YouTube already publishes (human-written or auto-generated); it does not run speech-to-text on videos that have neither, and it cannot read private, members-only or age-restricted videos. YouTube throttles some datacenter IPs, so the default proxy setting retries a rate-limited video on fresh datacenter IPs and then on a residential IP; large runs go faster with a modest concurrency. Transcripts are the property of their creators – use them within YouTube's Terms of Service and applicable copyright law.


FAQ

Do I need a YouTube API key to get transcripts?

No. The YouTube Data API does not serve captions for videos you do not own anyway; this actor reads the public caption tracks directly, so there is no key and no quota.

Can I download transcripts for a whole playlist or channel?

Yes. Paste the playlist or channel URL into YouTube URLs and it expands into individual videos, up to maxVideos. Channel pages include their Videos, Shorts and Live tabs.

What happens if the video has no captions in my language?

With fallbackToAnyLanguage (the default) you receive the video's own language and languageMatchedRequest: false. Switch it off to accept only your exact language; the row then explains which languages were available.

Does it work with auto-generated captions?

Yes. Human-written subtitles win when both exist; set preferAutoGenerated if you specifically want the ASR track. isAutoGenerated tells you which one you got.

Can I get SRT or VTT files?

Yes – tick includeSrt and/or includeVtt and the full file content is in the srt / vtt fields, ready to save.

How much does it cost?

$3 per 1,000 delivered transcripts. Failed videos are free.

Does it work with n8n, Make or an MCP client?

Yes. The output is flat JSON, so it plugs into n8n and Make through the Apify integration and into agents through the Apify MCP server.

Why did a video come back rate-limited?

YouTube blocks some datacenter and heavily used IPs. With the default proxy setting the actor already retries a blocked video on two fresh datacenter IPs and then on a residential IP; if a row still says rate-limited, re-run those videos or lower concurrency.

Is this the YouTube Transcript API?

It is a hosted alternative to the popular youtube-transcript-api library and to the unofficial timedtext endpoint, with proxies, retries, playlist expansion and five output formats handled for you.