Extraer transcripciones de videos de YouTube usando la API de YouTube Transcript
Este es unMarket Research, Miscellaneous, Multimodal AIflujo de automatización del dominio deautomatización que contiene 13 nodos.Utiliza principalmente nodos como Code, Webhook, HttpRequest, GoogleSheets, RespondToWebhook. Extraer subtítulos de YouTube a través de Google Sheets o Webhook API
- •Punto final de HTTP Webhook (n8n generará automáticamente)
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Credenciales de API de Google Sheets
Nodos utilizados (13)
{
"name": "Extract YouTube video transcripts using YouTube Transcript API",
"nodes": [
{
"id": "main-explanation-note",
"name": "Explicación de la plantilla principal",
"type": "n8n-nodes-base.stickyNote",
"position": [
200,
-200
],
"parameters": {
"color": 7,
"width": 700,
"height": 800,
"content": "# YouTube Transcript Extractor\n\nThis n8n template demonstrates how to extract transcripts from YouTube videos using two different approaches: automated Google Sheets monitoring and direct webhook API calls.\n\n**Use cases:** Content creation, research, accessibility, meeting notes, content repurposing, SEO analysis, or building transcript databases for analysis.\n\n## How it works\n- **Google Sheets Integration:** Monitor a sheet for new YouTube URLs and automatically extract transcripts\n- **Direct API Access:** Send YouTube URLs via webhook and get instant transcript responses\n- **Smart Parsing:** Extracts video ID from various YouTube URL formats (youtube.com, youtu.be, embed)\n- **Rich Metadata:** Returns video title, channel, publish date, duration, and category alongside transcript\n- **Fallback Handling:** Gracefully handles videos without available transcripts\n\n## Two Workflow Paths\n1. **Automated Sheet Processing:** Add URLs to Google Sheet → Auto-extract → Save results to sheet\n2. **Webhook API:** Send POST request with video URL → Get instant transcript response\n\n## How to set up\n1. Replace \"Dummy YouTube Transcript API\" credentials with your YouTube Transcript API key\n2. Create your own Google Sheet with columns: \"url\" (input sheet) and \"video title\", \"transcript\" (results sheet)\n3. Update Google Sheets credentials to connect your sheets\n4. Test each workflow path separately\n5. Customize the webhook path and authentication as needed\n\n## Requirements\n- YouTube Transcript API access (youtube-transcript.io or similar)\n- Google Sheets API credentials (for automated workflow)\n- n8n instance (cloud or self-hosted)\n- YouTube videos with available transcripts\n\n## How to customize\n- Modify transcript processing in the Code nodes\n- Add additional metadata extraction\n- Connect to other storage solutions (databases, CMS)\n- Add text analysis or summarization steps\n- Set up notifications for new transcripts"
},
"typeVersion": 1
},
{
"id": "sheets-workflow-note",
"name": "Nota del flujo de trabajo en Sheets",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-128
],
"parameters": {
"color": 3,
"width": 600,
"height": 100,
"content": "## Google Sheets Automated Processing\n\nMonitors Google Sheet for new YouTube URLs and processes them automatically"
},
"typeVersion": 1
},
{
"id": "webhook-workflow-note",
"name": "Nota del flujo de trabajo Webhook",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
320
],
"parameters": {
"color": 4,
"width": 600,
"height": 100,
"content": "## Webhook Direct Processing\n\nSend POST request with YouTube URL to get instant transcript response"
},
"typeVersion": 1
},
{
"id": "sheets-trigger",
"name": "Monitorear hoja Google para URLs",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
528,
32
],
"parameters": {
"event": "rowAdded",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "urls",
"cachedResultName": "urls"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "YOUR_GOOGLE_SHEET_ID",
"cachedResultName": "Your YouTube Transcript Sheet"
}
},
"credentials": {
"googleSheetsTriggerOAuth2Api": {
"id": "google-sheets-credentials",
"name": "Google Sheets API"
}
},
"typeVersion": 1
},
{
"id": "extract-video-id-sheets",
"name": "Extraer ID de video YouTube (Sheets)",
"type": "n8n-nodes-base.code",
"position": [
768,
32
],
"parameters": {
"jsCode": "// Get the URL from n8n input\nconst url = $input.first().json.url;\n\n// Function to extract YouTube video ID\nfunction getVideoId(url) {\n if (!url) return null;\n const match = url.match(/(?:v=|youtu\\.be\\/|embed\\/)([^&\\n?#]+)/);\n return match ? match[1] : null;\n}\n\n// Extract the video ID\nconst videoId = getVideoId(url);\n\n// Return the result for n8n\nreturn {\n json: {\n url: url,\n videoId: videoId,\n success: videoId ? true : false\n }\n};"
},
"typeVersion": 2
},
{
"id": "fetch-transcript-sheets",
"name": "Obtener datos de transcripción de video (Sheets)",
"type": "n8n-nodes-base.httpRequest",
"position": [
1008,
32
],
"parameters": {
"url": "https://www.youtube-transcript.io/api/transcripts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"ids\": [\n \"{{ $json.videoId }}\"\n ]\n} ",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ $credentials.youtubeTranscriptApi.token }}"
}
]
}
},
"credentials": {
"youtubeTranscriptApi": {
"id": "youtube-transcript-api",
"name": "Dummy YouTube Transcript API"
}
},
"typeVersion": 4.2
},
{
"id": "parse-transcript-sheets",
"name": "Analizar texto de transcripción (Sheets)",
"type": "n8n-nodes-base.code",
"position": [
1232,
32
],
"parameters": {
"jsCode": "const data = $input.first().json;\n\nreturn {\n json: {\n fullTranscript: data.tracks[0].transcript.map(segment => segment.text).join(' ')\n }\n};"
},
"typeVersion": 2
},
{
"id": "save-to-sheet",
"name": "Guardar transcripción en hoja",
"type": "n8n-nodes-base.googleSheets",
"position": [
1440,
32
],
"parameters": {
"columns": {
"value": {
"transcript": "={{ $json.fullTranscript }}",
"video title": "={{ $('Fetch Video Transcript Data (Sheets)').item.json.microformat.playerMicroformatRenderer.title.simpleText }}"
},
"schema": [
{
"id": "video title",
"type": "string",
"display": true,
"required": false,
"displayName": "video title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "transcript",
"type": "string",
"display": true,
"required": false,
"displayName": "transcript",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "transcripts",
"cachedResultName": "transcripts"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "YOUR_GOOGLE_SHEET_ID",
"cachedResultName": "Your YouTube Transcript Sheet"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "google-sheets-credentials",
"name": "Google Sheets API"
}
},
"typeVersion": 4.6
},
{
"id": "webhook-trigger",
"name": "Activador Webhook (Entrada directa)",
"type": "n8n-nodes-base.webhook",
"position": [
512,
464
],
"webhookId": "extract-youtube-transcript",
"parameters": {
"path": "extract-youtube-transcript",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2.1
},
{
"id": "extract-video-id-webhook",
"name": "Extraer ID de video YouTube (Webhook)",
"type": "n8n-nodes-base.code",
"position": [
752,
464
],
"parameters": {
"jsCode": "// Get the video_url from n8n input\nconst url = $input.first().json.body.video_url;\n\n// Function to extract YouTube video ID\nfunction getVideoId(url) {\n if (!url) return null;\n const match = url.match(/(?:v=|youtu\\.be\\/|embed\\/)([^&\\n?#]+)/);\n return match ? match[1] : null;\n}\n\n// Extract the video ID\nconst videoId = getVideoId(url);\n\n// Return the result for n8n\nreturn {\n json: {\n url: url,\n videoId: videoId,\n success: !!videoId\n }\n};\n"
},
"typeVersion": 2
},
{
"id": "fetch-transcript-webhook",
"name": "Obtener datos de transcripción de video (Webhook)",
"type": "n8n-nodes-base.httpRequest",
"position": [
1008,
464
],
"parameters": {
"url": "https://www.youtube-transcript.io/api/transcripts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"ids\": [\n \"{{ $json.videoId }}\"\n ]\n} ",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ $credentials.youtubeTranscriptApi.token }}"
}
]
}
},
"credentials": {
"youtubeTranscriptApi": {
"id": "youtube-transcript-api",
"name": "Dummy YouTube Transcript API"
}
},
"typeVersion": 4.2
},
{
"id": "parse-transcript-webhook",
"name": "Analizar texto de transcripción (Webhook)",
"type": "n8n-nodes-base.code",
"position": [
1264,
464
],
"parameters": {
"jsCode": "const data = $input.first().json;\n\nlet fullTranscript = null;\n\n// ✅ If transcript exists in POST response\nif (data.tracks && data.tracks.length > 0) {\n fullTranscript = data.tracks[0].transcript\n .map(segment => segment.text)\n .join(' ');\n}\n\n// ✅ Fallback if transcript missing\nif (!fullTranscript && data.microformat?.playerMicroformatRenderer?.description?.simpleText) {\n fullTranscript = data.microformat.playerMicroformatRenderer.description.simpleText;\n}\n\nreturn {\n json: {\n id: data.id,\n title: data.title,\n channel: data.microformat?.playerMicroformatRenderer?.ownerChannelName,\n publishDate: data.microformat?.playerMicroformatRenderer?.publishDate,\n duration: data.microformat?.playerMicroformatRenderer?.lengthSeconds,\n category: data.microformat?.playerMicroformatRenderer?.category,\n fullTranscript,\n hasTranscript: (data.tracks?.length ?? 0) > 0\n }\n};\n\n"
},
"typeVersion": 2
},
{
"id": "return-transcript",
"name": "Devolver respuesta de transcripción",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1488,
464
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={\n \"success\": true,\n \"video\": {\n \"id\": \"{{ $json.id }}\",\n \"title\": \"{{ $json.title }}\",\n \"channel\": \"{{ $json.channel }}\",\n \"duration\": \"{{ $json.duration }}\",\n \"hasTranscript\": {{ $json.hasTranscript }}\n },\n \"transcript\": \"{{ $json.fullTranscript }}\"\n}"
},
"typeVersion": 1.4
}
],
"connections": {
"sheets-trigger": {
"main": [
[
{
"node": "extract-video-id-sheets",
"type": "main",
"index": 0
}
]
]
},
"parse-transcript-sheets": {
"main": [
[
{
"node": "save-to-sheet",
"type": "main",
"index": 0
}
]
]
},
"webhook-trigger": {
"main": [
[
{
"node": "extract-video-id-webhook",
"type": "main",
"index": 0
}
]
]
},
"parse-transcript-webhook": {
"main": [
[
{
"node": "return-transcript",
"type": "main",
"index": 0
}
]
]
},
"extract-video-id-sheets": {
"main": [
[
{
"node": "fetch-transcript-sheets",
"type": "main",
"index": 0
}
]
]
},
"extract-video-id-webhook": {
"main": [
[
{
"node": "fetch-transcript-webhook",
"type": "main",
"index": 0
}
]
]
},
"fetch-transcript-sheets": {
"main": [
[
{
"node": "parse-transcript-sheets",
"type": "main",
"index": 0
}
]
]
},
"fetch-transcript-webhook": {
"main": [
[
{
"node": "parse-transcript-webhook",
"type": "main",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio - Investigación de mercado, Varios, IA Multimodal
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
Dahiana
@mssportoNo-Code Specialist with more than 10 years of experience in Digital Marketing. Currently working with Bubble. Webflow, AI, Agents and N8N.
Compartir este flujo de trabajo