Extraer subtítulos de YouTube automáticamente con n8n (YouTube Transcript API)

11 minutos
Cómo obtener la transcripción de un vídeo con YouTube Transcript API con n8n

¿Qué hace este workflow?

Este workflow de n8n obtiene automáticamente la transcripción completa de cualquier vídeo de YouTube usando la YouTube Transcript API. Funciona como un sub-workflow reutilizable que puedes llamar desde otros automatismos, pasándole un youtubeVideoId y recibiendo el texto completo del vídeo.

El workflow incluye:

  • Control de errores automático que diferencia entre fallos técnicos y transcripciones no disponibles
  • Verificación de existencia de transcripción antes de procesarla
  • Transformación a texto plano mediante JavaScript para facilitar su reutilización
  • Respuesta estructurada lista para integrar en pipelines de IA o análisis de contenido

Casos de uso y beneficios

Este workflow es especialmente útil cuando necesitas transcribir vídeos públicos de terceros que no están en tu canal. A diferencia de la YouTube Data API oficial (que requiere autenticación OAuth y solo funciona con tu contenido), este enfoque permite acceder a cualquier vídeo público.

Casos de uso principales:

  • Creación de contenido: Genera automáticamente resúmenes, artículos o posts de blog a partir de vídeos relevantes de tu sector
  • Análisis competitivo: Extrae y analiza el contenido de vídeos de competidores para detectar tendencias y temas
  • Investigación y documentación: Convierte webinars, tutoriales o conferencias en documentos de texto estructurados
  • Pipelines de IA: Alimenta modelos de lenguaje (ChatGPT, Claude) con transcripciones para generar insights automáticos
  • SEO y marketing: Reutiliza contenido de vídeo para crear múltiples formatos (threads, newsletters, infografías)

Beneficio clave: Al exponerlo como sub-workflow, centralizas la lógica de obtención de transcripciones y la reutilizas en múltiples automatismos sin duplicar código ni configuraciones.

Requisitos previos

  • Cuenta en YouTube Transcript API: Regístrate en youtube-transcript.io para obtener tu API key
  • Credenciales configuradas en n8n: Crea una credencial tipo Header Auth con tu API key de YouTube Transcript API
  • Nodos n8n requeridos:
    • When Executed by Another Workflow (trigger)
    • HTTP Request
    • Switch
    • Code (JavaScript)
    • Stop and Error
  • Versión mínima de n8n: 1.0.0 (todos los nodos son nativos)
  • Conocimiento básico: Uso de expresiones n8n ($json) y llamadas entre workflows

⚠️ Importante: Si necesitas transcribir vídeos de tu propio canal, es más recomendable usar la YouTube Data API oficial (requiere OAuth) para gestionar captions de forma soportada por Google.

Cómo configurar el workflow paso a paso

Paso 1: Configura el trigger para sub-workflow

Añade el nodo When Executed by Another Workflow como primer nodo:

  • Define un parámetro de entrada llamado youtubeVideoId (tipo: String)
  • Este nodo permite que cualquier otro workflow de n8n ejecute este flujo pasándole el ID del vídeo
  • La respuesta del workflow será la transcripción procesada que podrás usar en el workflow padre

Paso 2: Configura la petición HTTP a YouTube Transcript API

Añade un nodo HTTP Request con la siguiente configuración:

  • Method: POST
  • URL: https://www.youtube-transcript.io/api/transcripts
  • Authentication: Generic Credential TypeHeader Auth
  • Credential: Selecciona la credencial creada con tu API key
  • Send Headers: Activar
    • Header: Content-Type
    • Value: application/json
  • Send Body: Activar
    • Body Content Type: JSON
    • Specify Body: Using JSON
    • JSON: { "ids": [ "{{ $json.youtubeVideoId }}" ] }
  • Options → Response: Activa Include Response Headers and Status para gestionar errores manualmente

Paso 3: Implementa control de errores con Switch

Añade un nodo Switch que evalúa la respuesta de la API con tres condiciones:

  • Condición 1 – Error desconocido:
    • Si {{ $json.statusMessage }} es diferente de "OK"
    • Redirige a nodo «Transcript Failed» (Stop and Error)
  • Condición 2 – Transcripción existe:
    • Si {{ $json.statusMessage }} es "OK"
    • Y {{ $json?.data?.parseJson?.()[0]?.text }} contiene texto
    • Continúa al nodo de procesamiento
  • Condición 3 – Transcripción no existe:
    • Si statusMessage es "OK" pero no hay texto
    • Redirige a «Transcription does not exist» (Stop and Error)

Paso 4: Añade nodos de gestión de errores

Crea dos nodos Stop and Error conectados a las salidas del Switch:

  • Nodo «Transcript Failed»:
    • Error Message: "Unknown error"
    • Se ejecuta cuando la API devuelve códigos de error (5xx, 4xx)
  • Nodo «Transcription does not exist»:
    • Error Message: "Transcription not available for this video"
    • Se ejecuta cuando el vídeo no tiene subtítulos/transcripción

Paso 5: Transforma la respuesta con JavaScript

Añade un nodo Code (JavaScript) que procesa la transcripción:

// Función auxiliar para convertir track a texto
function trackToText(track) {
  return track.map(item => item.text).join(' ');
}

// Parsear respuesta de la API
const data = typeof $input.item.json.data === 'string' 
  ? JSON.parse($input.item.json.data) 
  : $input.item.json.data;

// Extraer primer resultado y primer track
const firstResult = data[0];
const firstTrack = firstResult.tracks[0];

// Generar texto completo
const transcript = trackToText(firstTrack);

// Devolver objeto estructurado
return {
  id: firstResult.id,
  transcript: transcript
};

Este código:

  • Convierte el campo data en objeto si viene como string
  • Extrae el primer track de transcripción del array de resultados
  • Concatena todos los fragmentos de texto en un string único
  • Devuelve un objeto con id y transcript listos para usar

Notas técnicas importantes

Límites y consideraciones:

  • Límites de la API: YouTube Transcript API tiene límites de rate limiting según tu plan. Consulta la documentación oficial para evitar errores 429 (Too Many Requests)
  • Vídeos sin transcripción: No todos los vídeos tienen subtítulos automáticos o manuales. El workflow detecta esto y devuelve un error controlado
  • Idioma de la transcripción: La API devuelve la transcripción en el idioma configurado por defecto del vídeo. No puedes especificar idioma en esta versión básica
  • Tamaño de respuesta: Vídeos muy largos (>2h) pueden generar transcripciones de 50-100KB. Asegúrate de que tu instancia n8n maneja bien estos volúmenes

Troubleshooting común:

  • Error 401 Unauthorized: Verifica que tu API key esté correctamente configurada en las credenciales de n8n
  • Error 503 Service Unavailable: La API externa está caída temporalmente. Implementa reintentos con nodo «Wait» entre intentos
  • Texto vacío o null: El vídeo puede tener subtítulos desactivados o ser privado

Mejoras y personalizaciones

Variaciones recomendadas del workflow:

  • Añadir selección de idioma: Modifica el body JSON para incluir "lang": "es" si la API lo soporta, permitiendo obtener transcripciones en español específicamente
  • Cache de transcripciones: Guarda las transcripciones en Google Sheets o base de datos para evitar llamadas repetidas a la misma URL
  • Integración con IA: Conecta la salida directamente a un nodo de OpenAI o Claude para generar automáticamente resúmenes, bullets points o artículos
  • Batch processing: Modifica el trigger para aceptar arrays de vídeo IDs y procesar múltiples transcripciones en paralelo usando Split In Batches
  • Formato con timestamps: En lugar de concatenar solo el texto, mantén los timestamps de cada fragmento para referencias temporales precisas

Migración a YouTube Data API oficial:

Si trabajas con vídeos de tu canal, considera reemplazar el nodo HTTP Request por nodos nativos de YouTube de n8n:

  • Usar captions.list para obtener IDs de pistas de subtítulos
  • Descargar la pista específica con captions.download
  • Procesar el formato SRT/VTT con Code node para extraer solo el texto

Esto te da mayor control, elimina dependencias externas y funciona dentro del ecosistema oficial de Google.

Descargar gratis este workflow

Importa este workflow directamente en tu instancia de n8n. Descarga el archivo JSON y luego ve a Workflows → Import from File.