YouTube Transcript & Subtitles API — Channels, Search & SRT
Pricing
from $1.50 / 1,000 transcripts
YouTube Transcript & Subtitles API — Channels, Search & SRT
Bulk YouTube transcript API: YouTube to text from videos, channels, playlists and search. Captions as text, timestamped segments, SRT/VTT or RAG chunks, with metadata and optional AI translation. Works as an MCP tool for AI agents. 99%+ success; you only pay for delivered transcripts.
Pricing
from $1.50 / 1,000 transcripts
Rating
0.0
(0)
Developer
Juan Manuel D'Amico
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Share
YouTube Transcript & Subtitles API — Bulk Channels, Playlists, Search & SRT
Turn YouTube to text: extract transcripts (captions / subtitles) in bulk from single videos, whole channels, playlists and search results — as plain text, timestamped segments, SRT/VTT subtitle files or RAG-ready chunks. $3 per 1,000 transcripts, no start fee, and you only pay for successful transcripts.
Why this YouTube transcript API
| This Actor | Typical alternatives | |
|---|---|---|
| Price per 1,000 transcripts | $3 | $5–10 |
| Start fee per run | None | Often charged |
| Failed videos (no captions, private, deleted) | Free | Often charged |
| Whole channels, playlists & YouTube search | Yes, with pagination | Often single videos only |
| Filter channels by Shorts / videos / lives and by date | Yes | Rare |
| Translation | YouTube captions free, AI translation optional | Rare |
| SRT / WebVTT subtitle files | Yes | Rare |
| RAG-ready chunks for LLMs | Yes | Rare |
| Video metadata (title, channel, date, views) | Included | Sometimes extra |
What it does
- Accepts any YouTube URL format:
watch?v=,youtu.be/, Shorts,/embed/,/live/,m.youtube.com, or bare 11-character video IDs. - Takes channels (
@handle,/channel/UC…,/c/…,/user/…) and playlists, and extracts the latest N videos (or all of them). - Searches YouTube for keywords and extracts transcripts of the top results.
- Filters channels to regular videos, Shorts or past live streams only, and skips videos published before a date (skipped videos are free).
- Picks the best caption track for your preferred languages, preferring human-made captions over auto-generated ones.
- Optional translation to another language (see Translation).
- Removes duplicates, retries blocked requests with fresh residential IPs, and never fails the whole run because of a single video.
Input example
{"videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://youtu.be/9Ff4S1FJdRM"],"channels": ["https://www.youtube.com/@veritasium"],"playlists": ["https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF"],"searchQueries": ["black holes explained"],"maxVideosPerSource": 50,"channelContentType": "videos","publishedAfter": "2026-01-01","languages": ["en", "es"],"translateTo": "","outputFormat": "both","chunkSeconds": 60,"subtitleFormats": ["srt"]}
| Field | Default | Description |
|---|---|---|
videos | – | Video URLs or IDs |
channels | – | Channel URLs or handles |
playlists | – | Playlist URLs or IDs |
searchQueries | – | Keywords to search on YouTube (videos only) |
maxVideosPerSource | 50 | Max videos per channel, playlist or search query (0 = all) |
channelContentType | all | all, videos, shorts or streams (past live streams) |
publishedAfter | – | Skip videos published before this date (YYYY-MM-DD); skipped videos are not charged |
languages | ["en"] | Preferred languages, in order. If none exists, the video's own language is returned |
preferManual | true | Prefer human-made captions over auto-generated |
translateTo | "" | Language code to translate into (e.g. es) |
aiTranslation | false | Translate with AI when YouTube can't (charged per 1,000 words, see Pricing) |
outputFormat | both | text, segments or both |
chunkSeconds | 0 | If > 0, adds chunks of ~N seconds for embeddings / RAG |
subtitleFormats | – | srt and/or vtt: adds ready-to-use subtitle files |
includeMetadata | true | Title, channel, publish date, duration, views, description, tags, thumbnail |
maxConcurrency | 10 | Videos processed in parallel |
Output example
One dataset item per video:
{"videoId": "abc123def45","url": "https://www.youtube.com/watch?v=abc123def45","status": "ok","title": "How Black Holes Actually Work","channelName": "Science Channel","channelId": "UCxxxxxxxxxxxxxxxxxxxxxx","publishedAt": "2026-05-01","durationSeconds": 732,"viewCount": 1234567,"language": "en","languageName": "English","isAutoGenerated": false,"availableLanguages": ["en", "es", "pt-BR"],"wordCount": 1830,"text": "Imagine you could fall into a black hole. What would you actually see?…","segments": [{ "start": 0.0, "duration": 3.2, "text": "Imagine you could fall into a black hole." }],"chunks": [{ "start": 0.0, "end": 60.4, "text": "Imagine you could fall into a black hole. What would you actually see?…" }]}
status is one of:
ok— transcript extracted (the only charged status)no_transcript— the video has no captionsunavailable— private, deleted, age-restricted or region-blocked video (also used for channels/playlists that don't exist)error— invalid input or a failure after several retries; see theerrorfield
A run summary (ok, noTranscript, unavailable, errors) is saved in the key-value store as SUMMARY.
Use cases
- RAG & chatbots: feed transcripts of a whole channel into a vector database using
chunkSeconds. - AI agents: give an agent the ability to "watch" YouTube videos through the transcript API.
- Content research & SEO: analyze what top creators talk about, find keywords and topics.
- Translated subtitles: get transcripts in your audience's language.
- Channel analysis: combine transcripts with views, dates and durations.
How to use it from code
API (cURL)
curl -X POST "https://api.apify.com/v2/acts/cazadores~youtube-transcript-bulk/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]}'
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("cazadores/youtube-transcript-bulk").call(run_input={"channels": ["https://www.youtube.com/@veritasium"],"maxVideosPerSource": 20,"outputFormat": "text",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item.get("wordCount"))
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('cazadores/youtube-transcript-bulk').call({videos: ['https://youtu.be/dQw4w9WgXcQ'],chunkSeconds: 60,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].chunks);
As an MCP tool for AI agents
Add the Apify MCP server to Claude, Cursor or any MCP client and enable this Actor as a tool:
https://mcp.apify.com/?actors=cazadores/youtube-transcript-bulk
Your agent can then call it with a list of video URLs and read the transcripts directly.
Pricing
Pay-per-event, no subscription and no start fee:
| Event | Price |
|---|---|
Successful transcript (status: ok) | $0.003 ($3 per 1,000) — lower on higher Apify plans |
AI translation (only with aiTranslation on, and only when YouTube can't translate) | $0.003 per started 1,000 words |
| Videos without captions, unavailable videos, errors, videos skipped by date | Free |
| Listing channels, playlists & search, metadata, subtitle files, YouTube translation | Included |
Proxy (residential) and compute costs are included in the price. Set a maximum cost per run in the run options and the Actor stops cleanly when it's reached.
Translation
When translateTo is set, the Actor:
- Uses the video's own captions in that language when they exist (human-made or auto-generated).
- Otherwise tries YouTube's automatic translation.
- If YouTube doesn't provide a translation and
aiTranslationis on, translates the transcript with AI line by line, so timestamps, chunks and SRT/VTT stay in sync with the video (translationSource: "ai"). - Otherwise returns the transcript in its original language with a
translationErrorfield (still a successful transcript).
The fields translatedTo, translationSource (youtube_captions, youtube_auto_translate or ai) and originalLanguage tell you what happened for each video.
Known limitations
- Videos with no captions at all (common for Shorts, music and some live streams) return
no_transcript. Speech-to-text for those videos is not included. - Private, deleted, members-only, age-restricted and region-blocked videos return
unavailable. - YouTube's automatic translation is not available for every video; turn on
aiTranslationto cover the rest (see Translation). - Channel extraction uses the channel's uploads list, which includes regular videos, Shorts and past live streams.
Related actors
- TikTok Shop Scraper — bulk TikTok Shop product data: price, units sold, stock per variant, reviews and shop stats.
En español
Extractor de transcripciones de YouTube en lote: pegá URLs de videos, canales o playlists y obtené la transcripción (subtítulos) en texto, segmentos con tiempos o fragmentos listos para RAG. Cuesta $3 cada 1.000 transcripciones, sin costo de arranque, y solo pagás las transcripciones exitosas: los videos sin subtítulos, privados o borrados no se cobran. Incluye búsqueda por palabra clave, filtros por Shorts, videos o transmisiones y por fecha, archivos SRT/VTT, metadatos y traducción (gratis con los subtítulos de YouTube; con IA, opcional, a $0,003 cada 1.000 palabras).