YouTube Transcripts in Bulk — whole channels, playlists avatar

YouTube Transcripts in Bulk — whole channels, playlists

Pricing

from $1.50 / 1,000 transcripts

Go to Apify Store
YouTube Transcripts in Bulk — whole channels, playlists

YouTube Transcripts in Bulk — whole channels, playlists

Transcripts of whole YouTube channels (no 200-video cap), playlists and video lists, with timestamps, your language or the next one available, manual vs auto-generated marked. Charged only per transcript delivered.

Pricing

from $1.50 / 1,000 transcripts

Rating

0.0

(0)

Developer

Cowboi Bebot

Cowboi Bebot

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

Transcripts of whole YouTube channels (no 200-video cap: the channel's list is read to the end), playlists and lists of videos, in one run. Each row has the transcript with timestamps and as plain text, in your language or the next one available, and says whether the subtitles were written by a person or auto-generated. You pay only per transcript delivered: a run that finds nothing costs nothing beyond Apify's start event, and a video without subtitles is never charged.

Versión en español más abajo.

Quick facts

  • What it does: Transcripts of whole YouTube channels (no 200-video cap), playlists and video lists, with timestamps and plain text, in your language or the next one available, manual vs auto-generated marked.
  • Use it for: text of a channel's or playlist's videos for search, analysis, summaries or AI pipelines; monitoring channels for new videos.
  • Not for: comments or viewer data; age-restricted, private or members-only videos (no login); translated transcripts (YouTube refuses them); search queries as input, SRT/VTT, chapters (not in this version).
  • Input: videos, channels and/or playlists (links or IDs); languages in order (default en); optional fallbackToAnyLanguage and allowAutoGenerated (default on), includeTimestamps (default on), channelContent, maxVideosPerSource (0 = all), includeVideosWithoutTranscript, onlyNew + stateName, maxConcurrency.
  • Output: one dataset row per transcript delivered (and, if asked, a free row per video without one), and one SUMMARY record with one item per input. Every field with its type is under Output reference below.
  • Charged events (pay per event): transcript, one per transcript delivered (price in the Price section below); plus Apify's standard start event apify-actor-start.
  • Never charged: videos without subtitles, private, deleted, age-restricted or members-only videos, videos that could not be read, repeats, videos already delivered in monitoring mode, the free rows, the SUMMARY record; a run that delivers no transcript costs nothing beyond apify-actor-start.
  • Limits: stops at maxVideosPerSource or at your maximum charge per run (SUMMARY stoppedBy); after 20 failed videos in a row the run stops with the reason; monitoring remembers the last 100,000 videos per stateName.
  • Run it from: Apify Console, the Apify API or an AI agent through the Apify MCP server (Actor pampadata/youtube-transcripts-bulk), with schedules and integrations.

Minimal input

A small input that works, taken from this Actor's own tests; every other field is optional:

{
"videos": [
"dQw4w9WgXcQ"
],
"languages": [
"es",
"en"
]
}

Why this one

  • Whole channels, past 200. The Actor reads a channel's Videos tab (and, if you ask, Shorts and Live) page by page until YouTube says there is nothing more. Test on 2026-10-13:
ChannelVideos on the channel (yt-dlp count)Listed by this ActorTranscripts delivered
Veritasium (Videos tab)451451448 (2 age-restricted, 1 without subtitles)
Wendover Productions (Videos tab)288288287 (1 age-restricted)
  • Playlists and video lists, mixed with channels in one run. A video that shows up in two of your inputs is delivered and charged once.
  • Your language, or the next one. List languages in order (en, es, pt…). The first one the video has is used; es also takes es-419 and es-ES. If the video has none of them, you still get its own subtitles, marked fallbackUsed: true (turn that off and such videos are skipped, free).
  • Manual or auto-generated, always said. Every row has kind: "manual" or "auto-generated". Inside a language, subtitles written by a person come first. Turn off allowAutoGenerated to get only those.
  • Timestamps. segments: [{start, duration, text}] in seconds, plus the full text.
  • A check per input (SUMMARY record): videos listed, transcripts delivered, how many came from the fallback or were auto-generated, every video without a transcript with the reason (no subtitles, private, deleted, age-restricted, members-only, live not finished; the first 300 per input are listed by id, all are counted in byStatus), and listComplete: true only when the list was read to its end.
  • Only new videos, for monitoring. Turn on onlyNew and the Actor remembers which transcripts it delivered (one memory per stateName, shared by all inputs, in a key-value store of your own account; the last 100,000 videos): a scheduled run delivers and charges only new ones, also when the same video comes through another channel, playlist or link. Videos that had no subtitles yet are tried again next time (YouTube adds automatic subtitles some hours after upload).
  • No YouTube API key, no login. It reads the same public data the YouTube apps read.

Input

FieldWhat it does
videosVideo links (watch, youtu.be, shorts, live, embed) or 11-character ids.
channels@handle, youtube.com/@handle, /channel/UC…, /c/name, /user/name. Read to the end.
playlistsyoutube.com/playlist?list=… or the id (PL…). Read to the end. Mixes (RD…), Watch later and Liked videos are personal lists and are not supported.
languagesCodes in order of preference. Default en.
fallbackToAnyLanguageOn by default: no asked language → the video's own subtitles.
allowAutoGeneratedOn by default. Off = only subtitles written by a person.
includeTimestampsOn by default (segments). Off = plain text only (smaller rows).
channelContentvideos (default), shorts, streams (past live streams).
maxVideosPerSource0 = all. Newest first on channels, list order on playlists.
includeVideosWithoutTranscriptOff by default. On = also a free row (with status and reason) for each video without a transcript.
onlyNew, stateNameMonitoring: skip videos whose transcript was delivered by earlier runs with the same state name.
maxConcurrencyVideos read at the same time, at most (default 4). The run slows down by itself when YouTube pushes back.

What you get for each video

videoId, url, title, channelName, channelId, publishedAt (YouTube's date, with its time zone), durationSeconds, viewCount, language, languageName, kind, languageMatched (the asked code it answered, or null), fallbackUsed, availableLanguages, segmentCount, wordCount, text, segments, input, sourceType.

Example

{
"videoId": "dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channelName": "Rick Astley",
"publishedAt": "2009-10-24T23:57:33-07:00",
"durationSeconds": 213,
"language": "es-419",
"kind": "manual",
"languageMatched": "es",
"fallbackUsed": false,
"availableLanguages": ["de-DE", "en", "en (auto)", "es-419", "ja", "pt-BR"],
"segments": [{"start": 18.64, "duration": 3.24, "text": "Conocemos bien el amor"}],
"text": "Conocemos bien el amor Tú conoces las reglas, igual que yo …"
}

Price

You pay only for transcripts delivered: USD 1.50 per 1,000 transcripts (USD 0.0015 each; one row is one video's transcript with timestamps and full text). No charge per run beyond Apify's standard start event: a run that delivers no transcript is not charged for anything else, and nothing is charged for videos without subtitles, private, deleted, age-restricted or members-only videos, videos that could not be read, repeats, videos already delivered in an earlier monitoring run, the free rows of includeVideosWithoutTranscript, or the SUMMARY record. Set a maximum charge per run in Apify and the Actor stops there (it does not even read videos it could not deliver).

How long it takes

One video in about a second. 451 videos of one channel in under 2 minutes (test on 2026-10-13, 4 at a time).

Good to know

  • Only public subtitles. The Actor reads each video's public subtitle tracks and basic video details (title, channel, date, duration, views). It does not collect comments, viewers' data or anything behind a login. A transcript is what was said in the video, so it can name people: that is the published content of the video.
  • Auto-generated subtitles are YouTube's speech recognition: words can be wrong and there is little punctuation. Check kind.
  • Translated transcripts are not offered: YouTube refuses its machine-translation requests (measured).
  • Age-restricted, private and members-only videos need a signed-in account; the Actor never signs in, so they are reported, not delivered.
  • When YouTube pushes back, the run slows down and, on Apify, moves to residential IPs by itself (that traffic is included in the price). Videos that still cannot be read are reported as failed and not charged.
  • Monitoring: one stateName per monitor, and don't run two runs with the same stateName at the same time.
  • Not affiliated with YouTube or Google. "YouTube" names the public source of the data.

Output reference

Dataset: one row per transcript

FieldTypeWhat it is
videoIdstring11-character video ID.
urlstringWatch link.
titlestringVideo title.
channelNamestringChannel name.
channelIdstringChannel ID (UC…).
publishedAtstring or nullYouTube's publish date, with its time zone.
durationSecondsintegerDuration in seconds.
viewCountintegerViews when read.
languagestringLanguage code of the transcript (e.g. en, es-419).
languageNamestringLanguage name as YouTube gives it.
kindstringmanual (written by a person) or auto-generated.
languageMatchedstring or nullThe asked code it answered (null when the fallback was used).
fallbackUsedbooleantrue when none of your languages existed and the video's own subtitles were taken.
availableLanguagesarray of stringEvery subtitle track of the video (" (auto)" marks auto-generated).
segmentCountintegerNumber of segments.
wordCountintegerNumber of words.
textstring or nullThe full transcript as plain text (null on free rows).
segmentsarray of objectWith includeTimestamps: start and duration in seconds, text.
inputstringYour input line this video came from.
sourceTypestringvideo, channel or playlist.
statusstringOnly on free rows (includeVideosWithoutTranscript): why there is no transcript, e.g. noTranscript, private, age, members, live, unavailable, failed.
reasonstring or nullOnly on free rows: YouTube's reason text.

SUMMARY record (run's key-value store, never charged)

FieldTypeWhat it is
inputsarray of objectOne item per input line (fields below).
transcriptsDeliveredintegerTranscripts delivered (charged) in the run.
freeRowsDeliveredintegerFree rows for videos without a transcript.
languages, fallbackToAnyLanguage, allowAutoGenerated, channelContentarray, boolean, boolean, arraySettings used.
onlyNew, stateNameboolean, string or nullMonitoring settings.
stoppedBecauseBlockedbooleantrue when YouTube kept refusing and the run stopped.
requestsobjectRequest counters of the run (requests, retries, refusals or blocks, failures; whether the run moved to residential IPs).

Each item of inputs:

FieldTypeWhat it is
inputstringYour input line.
typestringvideo, channel, playlist or invalid.
listedintegerVideos listed for this input.
transcriptsintegerTranscripts delivered (charged).
deliveredFreeintegerFree rows delivered.
autoGenerated, fallbackUsedintegerTranscripts that were auto-generated / came from the fallback.
alreadyDelivered, seenInEarlierRunsintegerRepeats in the run; monitoring repeats (not charged).
listPagesintegerList pages read.
byStatusobjectCount per video status (ok, noTranscript, private, age, members, live, failed…).
listCompletebooleantrue only when the list was read to its end.
videosWithoutTranscriptarray of objectvideoId, status, reason (first 300).
stoppedBystring or nullWhy it stopped early (maxVideosPerSource, your maximum charge…).
incompleteParts, warnings, errorsarrayWhat was not read, warnings, errors.

More Actors by this developer


Versión en español

Transcripciones de canales de YouTube completos (sin tope de 200 videos: la lista del canal se lee hasta el final), listas de reproducción y listas de videos, en una sola corrida. Cada fila trae la transcripción con marcas de tiempo y como texto corrido, en tu idioma o el siguiente disponible, y dice si los subtítulos los escribió una persona o son automáticos. Pagás solo por transcripción entregada: una corrida que no encuentra nada no cuesta nada aparte del evento de inicio de Apify, y un video sin subtítulos nunca se cobra.

De un vistazo

  • Qué hace: Transcripciones de canales completos de YouTube (sin tope de 200), listas y videos sueltos, con marcas de tiempo y texto corrido, en tu idioma o el siguiente, marcando manual o automático.
  • Sirve para: el texto de los videos de un canal o lista para búsqueda, análisis, resúmenes o flujos de IA; monitorear canales.
  • No sirve para: comentarios o datos de quienes miran; videos con restricción de edad, privados o de miembros (sin iniciar sesión); transcripciones traducidas; búsquedas como entrada, SRT/VTT, capítulos.
  • Entrada: videos, channels y/o playlists; languages en orden (en por defecto); opcionales de respaldo, automáticos, marcas de tiempo, channelContent, maxVideosPerSource, includeVideosWithoutTranscript, onlyNew + stateName, maxConcurrency. Ejemplo mínimo en JSON: sección Minimal input de la parte en inglés.
  • Salida: una fila por transcripción (y, si lo pedís, una fila gratis por video sin ella) y un registro SUMMARY con un ítem por entrada.
  • Eventos que se cobran: transcript, una por transcripción entregada (precio en la sección Precio); más apify-actor-start.
  • Nunca se cobra: videos sin subtítulos, privados, borrados, con restricción o de miembros, ilegibles, repetidos, ya entregados, las filas gratis, el SUMMARY; una corrida sin transcripciones no cuesta nada aparte de apify-actor-start.
  • Límites: se detiene en maxVideosPerSource o en tu costo máximo por corrida (stoppedBy).

Por qué este

  • Canales completos, más allá de 200. El Actor lee la pestaña Videos del canal (y, si pedís, Shorts y En vivo) página por página hasta que YouTube dice que no hay más. Prueba del 2026-10-13: Veritasium, 451 videos en el canal → 451 listados, 448 transcripciones (2 con restricción de edad, 1 sin subtítulos); Wendover Productions, 288 → 288 listados, 287 transcripciones.
  • Listas de reproducción y listas de videos, mezcladas con canales en la misma corrida. Un video que aparece en dos de tus entradas se entrega y se cobra una vez.
  • Tu idioma, o el siguiente. Poné idiomas en orden (es, en, pt…). Se usa el primero que tenga el video; es también toma es-419 y es-ES. Si el video no tiene ninguno, igual recibís sus propios subtítulos, marcados fallbackUsed: true (si lo apagás, esos videos se saltean, gratis).
  • Manual o automático, siempre dicho. Cada fila trae kind: "manual" o "auto-generated". Dentro de un idioma, primero los escritos por una persona. Apagá allowAutoGenerated para recibir solo esos.
  • Marcas de tiempo: segments: [{start, duration, text}] en segundos, más el text completo.
  • Control por entrada (registro SUMMARY): videos listados, transcripciones entregadas, cuántas salieron del respaldo o fueron automáticas, cada video sin transcripción con el motivo (sin subtítulos, privado, borrado, restricción de edad, solo para miembros, en vivo sin terminar; los primeros 300 por entrada van con su id, todos se cuentan en byStatus), y listComplete: true solo cuando la lista se leyó hasta el final.
  • Solo videos nuevos, para monitoreo: con onlyNew, el Actor recuerda qué transcripciones entregó (una memoria por stateName, compartida por todas las entradas, en un almacén de tu propia cuenta; los últimos 100.000 videos) y cada corrida programada entrega y cobra solo las nuevas, también si el mismo video llega por otro canal, lista o link. Los videos que todavía no tenían subtítulos se vuelven a probar (YouTube agrega los automáticos unas horas después de subir el video).
  • Sin clave de la API de YouTube y sin iniciar sesión.

Precio

Pagás solo las transcripciones entregadas: USD 1,50 cada 1.000 transcripciones (USD 0,0015 cada una; una fila es la transcripción de un video con marcas de tiempo y texto completo). No hay cargo por corrida aparte del evento de inicio estándar de Apify: una corrida que no entrega ninguna transcripción no se cobra por nada más, y no se cobran los videos sin subtítulos, privados, borrados, con restricción de edad o solo para miembros, los que no se pudieron leer, los repetidos, los ya entregados en una corrida anterior de monitoreo, las filas gratis de includeVideosWithoutTranscript ni el registro SUMMARY. Poné un cargo máximo por corrida en Apify y el Actor se detiene ahí (ni siquiera lee videos que no podría entregar).

Para saber

  • Solo subtítulos públicos. El Actor lee los subtítulos públicos de cada video y sus datos básicos (título, canal, fecha, duración, vistas). No junta comentarios, datos de quienes miran ni nada que requiera iniciar sesión. Una transcripción es lo que se dijo en el video y puede nombrar personas: es el contenido publicado del video.
  • Los subtítulos automáticos son el reconocimiento de voz de YouTube: puede haber palabras mal y poca puntuación. Mirá kind.
  • No se ofrecen transcripciones traducidas: YouTube rechaza sus pedidos de traducción automática (medido).
  • Los videos con restricción de edad, privados o solo para miembros piden una cuenta; el Actor nunca inicia sesión, así que se informan y no se entregan.
  • Cuando YouTube frena, la corrida baja el ritmo y, en Apify, pasa sola a IPs residenciales (ese tráfico está incluido en el precio). Los videos que igual no se pueden leer se informan como failed y no se cobran.
  • Monitoreo: un stateName por monitor, y no corras dos corridas con el mismo stateName a la vez.
  • Sin relación con YouTube ni con Google. "YouTube" nombra la fuente pública de los datos.