YouTube Transcript & Subtitles API — Channels, Search & SRT avatar

YouTube Transcript & Subtitles API — Channels, Search & SRT

Pricing

from $1.50 / 1,000 transcripts

Go to Apify Store
YouTube Transcript & Subtitles API — Channels, Search & SRT

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

Juan Manuel D'Amico

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

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 ActorTypical alternatives
Price per 1,000 transcripts$3$5–10
Start fee per runNoneOften charged
Failed videos (no captions, private, deleted)FreeOften charged
Whole channels, playlists & YouTube searchYes, with paginationOften single videos only
Filter channels by Shorts / videos / lives and by dateYesRare
TranslationYouTube captions free, AI translation optionalRare
SRT / WebVTT subtitle filesYesRare
RAG-ready chunks for LLMsYesRare
Video metadata (title, channel, date, views)IncludedSometimes 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"]
}
FieldDefaultDescription
videos–Video URLs or IDs
channels–Channel URLs or handles
playlists–Playlist URLs or IDs
searchQueries–Keywords to search on YouTube (videos only)
maxVideosPerSource50Max videos per channel, playlist or search query (0 = all)
channelContentTypeallall, 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
preferManualtruePrefer human-made captions over auto-generated
translateTo""Language code to translate into (e.g. es)
aiTranslationfalseTranslate with AI when YouTube can't (charged per 1,000 words, see Pricing)
outputFormatbothtext, segments or both
chunkSeconds0If > 0, adds chunks of ~N seconds for embeddings / RAG
subtitleFormats–srt and/or vtt: adds ready-to-use subtitle files
includeMetadatatrueTitle, channel, publish date, duration, views, description, tags, thumbnail
maxConcurrency10Videos 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 captions
  • unavailable — 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 the error field

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 ApifyClient
client = 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:

EventPrice
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 dateFree
Listing channels, playlists & search, metadata, subtitle files, YouTube translationIncluded

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:

  1. Uses the video's own captions in that language when they exist (human-made or auto-generated).
  2. Otherwise tries YouTube's automatic translation.
  3. If YouTube doesn't provide a translation and aiTranslation is on, translates the transcript with AI line by line, so timestamps, chunks and SRT/VTT stay in sync with the video (translationSource: "ai").
  4. Otherwise returns the transcript in its original language with a translationError field (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 aiTranslation to cover the rest (see Translation).
  • Channel extraction uses the channel's uploads list, which includes regular videos, Shorts and past live streams.
  • 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).