Extraction des transcriptions de vidéos YouTube avec l'API YouTube Transcript
Ceci est unMarket Research, Miscellaneous, Multimodal AIworkflow d'automatisation du domainecontenant 13 nœuds.Utilise principalement des nœuds comme Code, Webhook, HttpRequest, GoogleSheets, RespondToWebhook. Extraire les sous-titres YouTube via Google Sheets ou un Webhook API
- •Point de terminaison HTTP Webhook (généré automatiquement par n8n)
- •Peut nécessiter les informations d'identification d'authentification de l'API cible
- •Informations d'identification Google Sheets API
Catégorie
{
"name": "Extract YouTube video transcripts using YouTube Transcript API",
"nodes": [
{
"id": "main-explanation-note",
"name": "Explication du modèle 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": "Note de workflow 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": "Note de workflow 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": "Surveiller la feuille Google pour les URL",
"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": "Extraire l'ID vidéo 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": "Récupérer les données de transcription vidéo (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": "Analyser le texte de transcription (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": "Enregistrer la transcription dans la feuille",
"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": "Déclencheur Webhook (saisie directe)",
"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": "Extraire l'ID vidéo 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": "Récupérer les données de transcription vidéo (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": "Analyser le texte de transcription (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": "Renvoi de la réponse de transcription",
"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
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Intermédiaire - Étude de marché, Divers, IA Multimodale
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Dahiana
@mssportoNo-Code Specialist with more than 10 years of experience in Digital Marketing. Currently working with Bubble. Webflow, AI, Agents and N8N.
Partager ce workflow