Extraction des transcriptions de vidéos YouTube avec l'API YouTube Transcript

Intermédiaire

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

Prérequis
  • 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
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "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
          }
        ]
      ]
    }
  }
}
Foire aux questions

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

Générez des noms de prototypes UX/UI pilotés par l'IA pour n'importe quel modèle LLM (modèle)
Générer des noms diversifiés pour les prototypes UX/UI avec OpenAI
Code
Webhook
Agent
+
Code
Webhook
Agent
9 NœudsDahiana
Création de contenu
Analyseur d'écart de contenu concurrentiel : mappage automatisé des thèmes de sites web
Analyser les écarts de contenu concurrentiel avec Gemini AI, Apify et Google Sheets
If
Set
Code
+
If
Set
Code
30 NœudsMychel Garzon
Divers
Téléchargement automatique des Reels Instagram avec Google Drive pour le stockage et les rappels Telegram
Automatiser le téléchargement des Reels Instagram avec le stockage sur Google Drive et des rappels Telegram
If
Code
Webhook
+
If
Code
Webhook
11 NœudsAryan Shinde
Gestion de fichiers
Automatisation des appels prospects : VAPI, enregistrements Google Sheets et rendez-vous sur le calendrier
Automatisation des appels prospects : VAPI, enregistrement Google Sheets et rendez-vous dans le calendrier
Set
Code
Webhook
+
Set
Code
Webhook
13 NœudsMeak
Création de contenu
Marketing par e-mail et téléphone immobilier intelligent avec génération automatisée de prospects par IA
Automatisation du marketing immobilier avec l'IA Llama, les appels VAPI et les campagnes Gmail
Code
Wait
Gmail
+
Code
Wait
Gmail
23 NœudsOneclick AI Squad
Nurturing de leads
Vérification par lots des indicateurs d'autorité de domaine et enregistrement dans Google Sheets
Vérification par lots des indicateurs d'autorité de domaine via RapidAPI et enregistrement dans Google Sheets
Code
Form Trigger
Http Request
+
Code
Form Trigger
Http Request
9 NœudsSk developer
Étude de marché
Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds13
Catégorie3
Types de nœuds7
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Auteur
Dahiana

Dahiana

@mssporto

No-Code Specialist with more than 10 years of experience in Digital Marketing. Currently working with Bubble. Webflow, AI, Agents and N8N.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34