Skip to the content.

YouTube Transcript Scraper

Transcripts and subtitles of videos, playlists and channels, with timestamps and metadata. From $0.004 / video, pay per result, no browser, no login.

▶ Run it on Apify · Python example · All scrapers

Get the transcript (subtitles / captions) of any YouTube video as clean JSON, plain text, SRT or VTT. Paste video links, a playlist or a whole channel: this YouTube transcript scraper calls YouTube’s own data endpoints directly — no headless browser, no API key, no YouTube account — so runs start instantly and cost a fraction of a cent per video.

✅ Transcripts with timestamps (start + duration for every line) and the full text in one field ✅ SRT and VTT subtitle files ready to download or burn into a video ✅ Manual or auto-generated captions — you choose which one wins ✅ 100+ languages: pick your preferred languages in order, with automatic fallback ✅ Whole playlists and channels (/@handle, /channel/UC…) expanded to their videos automatically ✅ Video metadata: title, channel, duration, views, publish date, description, keywords, thumbnail ✅ Works with watch?v=, youtu.be/, Shorts, live replays, embeds and bare video IDs ✅ You never pay for videos without captions or for failed videos


🚀 Why this YouTube transcript API is different

  This Actor Typical transcript scrapers
Price per video $0.004 (less on higher plans) $0.005 – $0.01
Playlists and channels in one run Yes, with pagination Often single videos only
Output formats Segments, text, SRT, VTT JSON only
Metadata included Yes (title, channel, views, date…) Separate Actor
Charged for videos without captions Never Often
Browser needed No — 5 videos in parallel, seconds per video Usually slow headless Chrome
Blocking handling Session retries, new IPs, automatic residential fallback Fails on cloud IPs

💡 What can you do with YouTube transcripts?


🛠️ How to get a YouTube transcript (3 steps)

  1. Paste video links (one per line) — or add a playlist or channel URL.
  2. Choose languages and formats — e.g. en, then es; segments + text, or SRT/VTT.
  3. Click Start and download your dataset as JSON, CSV, Excel, XML or HTML, or fetch it through the API.

📥 Input example

{
  "videos": ["https://www.youtube.com/watch?v=jNQXAC9IVRw", "https://youtu.be/dQw4w9WgXcQ"],
  "playlistOrChannelUrls": ["https://www.youtube.com/@TED"],
  "maxVideosPerSource": 20,
  "languages": ["en", "es"],
  "preferManual": true,
  "outputFormats": ["segments", "text", "srt"],
  "includeMetadata": true
}

📤 Output example

{
  "videoId": "jNQXAC9IVRw",
  "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "title": "Me at the zoo",
  "channelName": "jawed",
  "durationSeconds": 19,
  "viewCount": 380000000,
  "publishDate": "2005-04-23",
  "language": "en",
  "languageName": "English",
  "isAutoGenerated": false,
  "availableLanguages": [{ "code": "en", "name": "English", "isAutoGenerated": false }],
  "segments": [
    { "start": 1.2, "duration": 2.16, "text": "All right, so here we are, in front of the elephants" }
  ],
  "text": "All right, so here we are, in front of the elephants the cool thing about these guys is that…",
  "srt": "1\n00:00:01,200 --> 00:00:03,360\nAll right, so here we are, in front of the elephants\n…",
  "wordCount": 48,
  "status": "ok"
}

Videos without captions are listed in the RUN_SUMMARY record of the run (key-value store), not in the dataset — and they are not charged.


⚙️ Input parameters

Field Type Default Description
videos array ["jNQXAC9IVRw"] YouTube video URLs or 11-character IDs; watch, short, live and embed links work. Maximum 1000.
playlistOrChannelUrls array — Playlist and channel URLs to expand through InnerTube browse continuation.
maxVideosPerSource integer 50 Maximum videos read from each playlist or channel.
languages array ["en"] Language codes in preference order; any available track is a fallback.
preferManual boolean true Prefer human-written captions over auto-generated captions within the chosen language.
outputFormats array ["segments", "text"] Choose segments, plain text, SRT or VTT.
includeMetadata boolean true Include title, channel, duration, views, date, description, thumbnail and keywords.
concurrency integer 5 Maximum videos being processed in parallel.
proxyConfiguration, maxRetries object, integer Apify Proxy, auto Proxy and retries; the defaults work for most runs.

📋 Output fields

Field Type Description
videoId string YouTube video ID
url string Watch URL
title string Video title
channelName string Channel name
channelId string Channel ID
durationSeconds integer Duration in seconds
viewCount integer View count
publishDate string Published date
description string Description, up to 5000 characters
thumbnail string Thumbnail URL
keywords array Video keywords
language string Output language code
languageName string Caption track name
isAutoGenerated boolean Selected caption track is automatic
availableLanguages array Available caption tracks
segments array Timed caption segments
text string Plain transcript
srt string SRT subtitle file content
vtt string WebVTT subtitle file content
wordCount integer Transcript word count
status string Always ok for dataset items

Export as JSON, CSV, Excel, XML or HTML, or read it through the API.


💰 Pricing — pay only for transcripts

What you run Results Cost (free plan)
1 video 1 $0.004
100 videos 100 $0.40
A 50-video playlist 50 $0.20
1,000 videos 1,000 $4.00

Higher Apify plans pay less: $0.0035 (Bronze), $0.003 (Silver), $0.0025 (Gold and above). Platform usage and proxies are included. Set a maximum cost per run and the Actor stops cleanly when it is reached. Videos without captions and failed videos are never charged.


🔌 Use the YouTube Transcript API from your code

Python

from apify_client import ApifyClient  # pip install "apify-client>=3"

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("victorrodi/youtube-transcript-scraper-api").call(
    run_input={"videos": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"], "outputFormats": ["text"]}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["title"], "-", item["text"][:200])

JavaScript / Node.js

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('victorrodi/youtube-transcript-scraper-api').call({
  playlistOrChannelUrls: ['https://www.youtube.com/@TED'],
  maxVideosPerSource: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((v) => console.log(v.title, v.wordCount));

cURL (run and get the results in one call)

curl -X POST "https://api.apify.com/v2/acts/victorrodi~youtube-transcript-scraper-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"videos": ["dQw4w9WgXcQ"], "outputFormats": ["text"]}'

Also works with Make, Zapier, n8n, Google Sheets, Slack, LangChain, LlamaIndex and MCP / AI agents through Apify integrations.

🤖 Use it from AI agents (Claude, ChatGPT, Cursor…)

This Actor is available to AI assistants through the Apify MCP server. Add it with --actors victorrodi/youtube-transcript-scraper-api, then ask:

“Get the transcript of https://youtu.be/dQw4w9WgXcQ and summarize it in 5 bullet points.”

“Fetch the last 10 videos of @TED and list the main ideas of each one.”


🛡️ Reliability

More examples and docs for all our Actors: trendpulse-scrapers.


📌 Tips


❓ FAQ

Do I need a YouTube API key? No. The official YouTube Data API does not return transcripts of other people’s videos; this Actor does, without any key or login.

Which videos work? Any public video, Short or live replay that has captions (manual or auto-generated). Private, deleted, age-restricted and members-only videos are skipped and not charged.

How many videos can I process? Up to 1,000 videos per run, plus playlists and channels (up to 1,000 videos per source).

Can I get subtitles in another language? Yes, when the video has a track in that language: list your preferred languages in order. availableLanguages shows every track of the video.

Is scraping YouTube transcripts legal? The Actor only reads publicly available captions and video information; it collects no personal data. Make sure your use respects YouTube’s terms, copyright and the laws that apply to you.


💬 Support

Missing a field, a format or found an issue? Open an issue in the Issues tab — it is answered fast. Feature requests are welcome.