YouTube Transcript Scraper API - YouTube Subtitles avatar

YouTube Transcript Scraper API - YouTube Subtitles

Pricing

from $4.00 / 1,000 transcript extracteds

Go to Apify Store
YouTube Transcript Scraper API - YouTube Subtitles

YouTube Transcript Scraper API - YouTube Subtitles

Get YouTube transcripts, subtitles and captions from videos, Shorts, playlists and whole channels. Download as SRT, VTT, plain text, JSON with timestamps or clean LLM-ready text, in 100+ languages, with video metadata. Run it in Console or call it as an API. You pay only per transcript extracted.

Pricing

from $4.00 / 1,000 transcript extracteds

Rating

0.0

(0)

Developer

Proooxy

Proooxy

Maintained by Community

Actor stats

0

Bookmarked

67

Total users

6

Monthly active users

4 days ago

Last modified

Security

Limited permissions

Share

Get the transcript of any YouTube video as text, or its subtitles and captions in SRT or VTT format — for one video, a list of videos, a whole playlist or an entire channel.

This YouTube transcript extractor reads the captions YouTube has for each video, in 100+ languages, and falls back to auto-generated captions when there are no manual ones. Run it in Apify Console with no code, or call it as a YouTube transcript API from your own code or an AI agent.

🎯 What you get

For each video, the scraper returns:

  • Full transcript text with timestamps
  • Rich video metadata — title, channel, description, view count, thumbnail, publish date
  • Language info — detected language, auto-generated flag, all available languages listed
  • Multiple output formats — pick what fits your workflow

🚀 How to get the transcript of a YouTube video

  1. Paste one or more YouTube URLs or video IDs into urls.
  2. Pick an outputFormat: text for plain text, srt or vtt for subtitles, json for timestamped segments, or llm for clean text to feed an AI model.
  3. Set languages in order of preference, for example ["en", "es"].
  4. Start the run, then export the results as JSON, CSV or Excel, or read them over the API.

The scraper reads the captions YouTube already has. A video with no captions at all, manual or auto-generated, has no transcript to read: it shows up in the results with an error field and you are not charged for it.

📤 Download YouTube subtitles as SRT, VTT, text or JSON

FormatBest for
JSONApps, databases, APIs — structured data with timestamps per segment
SRTVideo editors, media players — standard subtitle file format
VTTWeb players, HTML5 video — WebVTT subtitle format
TextSearch indexing, content analysis — plain text joined together
LLMAI/ML pipelines, RAG, fine-tuning — clean text with annotations stripped

The LLM format automatically removes [Music], [Applause], speaker labels, and other non-speech annotations so you get pure spoken content ready for language models.

With srt or vtt, each result also carries the complete subtitle file in its srt or vtt field. Save that text as a .srt or .vtt file and it loads in video players and editors.

🔗 Supported URL types

You can pass any of these as input:

  • https://www.youtube.com/watch?v=dQw4w9WgXcQ — standard video
  • https://youtu.be/dQw4w9WgXcQ — short link
  • https://www.youtube.com/shorts/dQw4w9WgXcQ — YouTube Shorts
  • https://www.youtube.com/playlist?list=PLxxxxx — full playlist
  • https://www.youtube.com/@channelname — all videos from a channel
  • dQw4w9WgXcQ — just the video ID

Mix and match in a single run — the scraper handles them all.

💡 Transcripts for a whole playlist or channel

Pass a playlist URL or a channel URL and the scraper lists the videos in it, then returns one transcript per video in the same run. A channel URL covers the videos on the channel's Videos tab.

Set maxVideos to cap how many videos the run processes in total, which keeps a first test small:

{
"urls": ["https://www.youtube.com/@TED"],
"outputFormat": "text",
"languages": ["en"],
"maxVideos": 50
}

📋 Input options

OptionDefaultDescription
urls—List of YouTube URLs or video IDs to process
outputFormatjsonOutput format: json, srt, vtt, text, or llm
languages["en"]Preferred languages in priority order (e.g. ["en", "ja", "de"])
includeAutoGeneratedtrueUse YouTube's auto-generated captions when manual ones aren't available
maxVideos0 (unlimited)Cap on the videos the run processes in total, playlists and channels included
maxConcurrency3How many videos to process in parallel (1–10)
proxyApify ProxyProxy settings — residential proxies recommended

You can also use startUrls (the [{url: "..."}] format) instead of urls — both work.

📋 Example input

{
"urls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/JGwWNGJdvx8"
],
"outputFormat": "llm",
"languages": ["en"],
"maxConcurrency": 2
}

📤 Example output

Each video produces one result in the dataset:

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video)",
"channelName": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"description": "The official video for \"Never Gonna Give You Up\" by Rick Astley...",
"publishDate": "2009-10-25",
"viewCount": 1761003712,
"thumbnail": "https://i.ytimg.com/vi/dQw4w9WgXcQ/sddefault.jpg",
"availableLanguages": ["en", "de-DE", "ja", "pt-BR", "es-419"],
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"duration": 213,
"wordCount": 487,
"segmentCount": 61,
"text": "We're no strangers to love, you know the rules and so do I...",
"segments": [
{ "text": "We're no strangers to love", "start": 18.64, "end": 21.88 },
{ "text": "You know the rules and so do I", "start": 22.64, "end": 26.96 }
],
"extractedAt": "2026-04-10T07:00:00.000Z",
"error": null
}

When using SRT or VTT format, the result includes an srt or vtt field with the formatted subtitle file content.

🚀 YouTube transcript API for Python and JavaScript

Call the scraper from your own code with the Apify API client and read the records shown above:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('autofacts/youtube-subtitle-transcript-scraper').call({
urls: ['https://www.youtube.com/watch?v=dQw4w9WgXcQ'],
outputFormat: 'text',
languages: ['en'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const video of items) console.log(video.title, video.text);
import os
from apify_client import ApifyClient
client = ApifyClient(token=os.environ["APIFY_TOKEN"])
run = client.actor("autofacts/youtube-subtitle-transcript-scraper").call(run_input={
"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"outputFormat": "text",
"languages": ["en"],
})
for video in client.dataset(run.default_dataset_id).iterate_items():
print(video["title"], video["text"])

The Python example uses apify-client 3.x, where a run is an object (run.default_dataset_id). The plain HTTP call is in Use with AI agents below.

💡 Recommendations

For best results:

  • Use residential proxies (the default) — they work much better with YouTube than datacenter proxies
  • Start with maxConcurrency: 1 if you're processing many videos, then increase gradually
  • Set languages to your target language — the scraper picks the best available match
  • Use the LLM format if you're feeding transcripts into AI models — it strips all the noise

For large jobs:

  • Use playlists or channel URLs to batch-process videos in one run
  • Set maxVideos to limit playlist/channel scrapes during testing
  • The scraper handles failures gracefully — if one video fails, the rest still process. Failed videos show up in the results with an error field so you can retry them later

For AI/ML workflows:

  • The LLM output format gives you clean, annotation-free text optimized for context windows
  • JSON format preserves timestamps, which is useful for building time-aligned datasets
  • The segments array gives you natural sentence boundaries from the original captions

💳 Fair billing

You're never charged for videos that fail to extract. You only pay for successful results.

🌍 Language support

The scraper supports all languages that YouTube captions are available in — over 100 languages. Set your preferred languages in priority order and the scraper will pick the best available match.

If manual captions aren't available in your language, YouTube's auto-generated captions are used as a fallback (unless you disable this with includeAutoGenerated: false).

🛠️ Error handling

The scraper is designed to be resilient:

  • If a video has no captions, it reports the error and moves on
  • If YouTube rate-limits a request, the scraper retries with backoff
  • If one extraction method fails, it automatically tries alternatives
  • Failed videos appear in the dataset with a descriptive error field — successful videos have error: null

💬 Need help?

If you run into issues or have questions, open an issue on the Apify Store page.


🤖 Use with AI agents

This Actor is callable as a tool by any MCP-capable agent — Claude, Cursor, VS Code — or by your own code, with no wrapper and nothing extra to deploy.

Connect over MCP

https://mcp.apify.com?tools=autofacts/youtube-subtitle-transcript-scraper

In a client that reads an mcpServers configuration block:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=autofacts/youtube-subtitle-transcript-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

The agent reads this Actor's parameters and their descriptions straight from the input schema, and the hosted server infers the result field types from the dataset schema — so a model knows what to send and what comes back before it ever calls anything.

Or call the API directly

curl -X POST "https://api.apify.com/v2/acts/autofacts~youtube-subtitle-transcript-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "languages": ["en"]}'

The response body is the dataset records described above.

🧰 Other Actors by autofacts

Apify only auto-recommends Actors in the same category, so here are the ones that actually pair with this scraper:

ActorWhat it's for
TikTok Transcript API & Subtitle ScraperTikTok captions and transcripts
Instagram Transcript ScraperInstagram Reels turned into text with timestamps
Google Ads ScraperA competitor's YouTube video ads, with the video ids to pull their spoken words here
Google Trends Trending NowWhat is trending on Google right now, in 125 countries, to find the videos worth transcribing
Schema Markup Scraper & SEO AuditorJSON-LD, Open Graph and a 0-100 SEO audit of any URL
HTML to PDF & URL to PDF APITurn any URL or HTML into PDF, PNG, JPEG or WebP
Bluesky ScraperPosts, profiles, feeds and interactions

All of them: apify.com/autofacts