YouTube Transcript (Apify)
Transcripciones de YouTube como texto, marcas de tiempo, SRT o VTT en más de 70 idiomas, con traducción. Funciona desde servidores en la nube donde YouTube bloquea solicitudes directas.
Documentación
youtube-transcript-apify
Una API de transcripciones de YouTube para Python que sigue funcionando en AWS, Google Cloud, Azure, Vercel, Render y otros servidores en la nube: una solución directa para youtube-transcript-api cuando recibe bloqueo por IP.
Si tu código funciona en tu computadora pero falla en producción con RequestBlocked, IpBlocked, TooManyRequests o HTTP 429, YouTube está bloqueando la dirección IP de tu servidor. La mayoría de los rangos de IP de la nube están bloqueados. Este paquete envía la solicitud a un scraper alojado en Apify que maneja proxies y reintentos, y te devuelve datos simples de Python.
- Misma forma que la llamada clásica de
youtube-transcript-api: una lista de{"text", "start", "duration"}. - Texto plano, texto con marcas de tiempo, subtítulos SRT y VTT, en el idioma propio del video, cualquier idioma de subtítulos que solicites, o traducidos.
- Los videos sin subtítulos se reportan, no se cobran.
- El cliente usa solo la biblioteca estándar. Incluye una CLI y un servidor MCP para Claude, Cursor y otros agentes de IA.
Divulgación: este paquete es un cliente ligero para el Actor YouTube Transcript Scraper, creado por el mismo autor (nokia2k). Las ejecuciones son facturadas por Apify: $2.99 por 1,000 transcripciones en el plan gratuito de Apify, hasta $1.49 en planes de pago, al momento de escribir esto. El plan gratuito incluye $5 de crédito cada mes, sin necesidad de tarjeta.
Instalación
pip install youtube-transcript-apify # client, CLI and MCP server
Obtén un token de API gratuito en https://console.apify.com/settings/integrations y configúralo:
export APIFY_TOKEN=apify_api_...
Usa la API de transcripciones de YouTube en Python
Reemplaza la llamada que recibe el bloqueo:
# before
# from youtube_transcript_api import YouTubeTranscriptApi
# segments = YouTubeTranscriptApi.get_transcript("arj7oStGLkU", languages=["en"])
# after
from yt_transcript_apify import get_transcript
segments = get_transcript("arj7oStGLkU", languages=["en"])
print(segments[0]) # {'text': 'So in college,', 'start': 1.2, 'duration': 2.16}
Más control:
from yt_transcript_apify import ApifyTranscriptClient
client = ApifyTranscriptClient() # reads APIFY_TOKEN
t = client.fetch("https://youtu.be/arj7oStGLkU", formats=["text", "srt"])
print(t.title, t.language, t.is_generated)
print(t.text[:200])
open("talk.srt", "w").write(t.srt)
rows = client.fetch_many(["arj7oStGLkU", "iG9CE55wbtY"], translate_to="es")
for row in rows:
print(row["status"], row.get("title")) # failed videos keep a plain message
fetch lanza TranscriptError (con .status, por ejemplo no_captions, video_unplayable, video_unavailable) cuando un video no tiene transcripción. fetch_many nunca lanza excepciones para videos individuales: cada fila lleva su propio status y message.
Cargador de documentos LangChain
pip install "youtube-transcript-apify[langchain]"
from yt_transcript_apify.langchain import YouTubeTranscriptApifyLoader
docs = YouTubeTranscriptApifyLoader(
["https://youtu.be/arj7oStGLkU", "iG9CE55wbtY"], languages=["en"]
).load()
print(docs[0].metadata["title"], len(docs[0].page_content))
Un Document por video, con title, channelName, language, durationSeconds y source en los metadatos. Los videos sin subtítulos se omiten. Funciona igual en AWS, GCP o Vercel, donde el cargador clásico recibe bloqueo por IP.
Línea de comandos
yt-transcript-apify arj7oStGLkU # plain text
yt-transcript-apify https://youtu.be/arj7oStGLkU --format srt > talk.srt
yt-transcript-apify arj7oStGLkU --lang es --translate en
Servidor MCP de transcripciones de YouTube (Claude Desktop, Claude Code, Cursor)
Agrega esto a la configuración de tu cliente MCP:
{
"mcpServers": {
"youtube-transcript": {
"command": "uvx",
"args": ["youtube-transcript-apify"],
"env": { "APIFY_TOKEN": "apify_api_..." }
}
}
}
Herramientas:
| Herramienta | Qué hace |
|---|---|
get_youtube_transcript | Un video o Short: text, timestamps, srt o vtt, idioma y traducción opcionales |
get_youtube_transcripts | Hasta 50 videos a la vez, texto plano, una sección por video |
Luego pregunta: "Resume este video: https://www.youtube.com/watch?v=arj7oStGLkU".
Otras formas de llamar al mismo scraper
- Sin código: ejecútalo desde la página de Apify Store y descarga JSON, CSV o Excel.
- n8n, Make, Zapier: usa la integración de Apify y elige
nokia2k/youtube-transcript-scraper. - Miles de videos como texto plano: YouTube Video to Text es más económico por video.
- Canales completos, listas de reproducción, resultados de búsqueda, me gusta y comentarios: YouTube Scraper.
Preguntas frecuentes
¿Por qué youtube-transcript-api funciona localmente pero no en mi servidor? YouTube bloquea la mayoría de las solicitudes desde rangos de IP de proveedores de nube. Los proxies residenciales rotativos lo solucionan; este paquete usa un servicio alojado que ya los tiene, por lo que no gestionas proxies tú mismo.
¿Es gratuito? El paquete es gratuito y de código abierto (MIT). Las ejecuciones de Apify que llama se pagan por transcripción: $2.99 por 1,000 en el plan gratuito, cuyo crédito mensual de $5 cubre aproximadamente 1,600 transcripciones.
¿Cómo soluciono RequestBlocked o IpBlocked de youtube-transcript-api? Reemplaza YouTubeTranscriptApi.get_transcript con yt_transcript_apify.get_transcript (ver arriba). La solicitud entonces sale desde los proxies de Apify en lugar de la IP bloqueada de tu servidor, y el resultado tiene la misma forma.
¿Puedo descargar subtítulos de YouTube como SRT o VTT? Sí: client.fetch(video, formats=["srt", "vtt"]) devuelve ambos, o usa --format srt en la línea de comandos.
¿Qué datos devuelve? Solo lo que YouTube muestra públicamente: subtítulos, título, canal, idioma. No descarga video ni audio.
Licencia
MIT