AutomationFlowsAI & RAG › Summarize and Translate Youtube Videos with Supadata and Openai

Summarize and Translate Youtube Videos with Supadata and Openai

ByVáclav Čikl @venca on n8n.io

This workflow collects a YouTube URL via an n8n form, retrieves the video transcript and metadata using Supadata, then uses OpenAI to generate a summary, key points, and optional translation, and returns a downloadable text file. Receives a YouTube URL plus language and…

Event trigger★★★★☆ complexityAI-powered12 nodesForm TriggerN8N Nodes SupadataOpenAI
AI & RAG Trigger: Event Nodes: 12 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #16122 — we link there as the canonical source.

This workflow follows the Form Trigger → OpenAI recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "jIAuYt51P9QmSSpk",
  "name": "YouTube Video Transcriber & Summarizer_TEMPLATE",
  "tags": [],
  "nodes": [
    {
      "id": "0a706603-e6e3-4d6a-85a3-422ff55c12e6",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "width": 480,
        "height": 528,
        "content": "## YouTube Video Transcriber & Summarizer & Translator\n\n### How it works\n\n1. Workflow starts with a user submitting a YouTube URL through a form.\n2. The URL is used to fetch the transcript and video information.\n3. The retrieved data is merged for further processing.\n4. The data is summarized and translated using an AI service.\n5. The summary is formatted and converted into a file for output.\n\n### Setup steps\n\n- [ ] Configure the YouTube API keys for data fetching.\n- [ ] Set up SupaData credentials for transcript and video info retrieval.\n- [ ] Ensure OpenAI API is configured for summarizing and translating.\n- [ ] Set up storage access for file conversion.\n\n### Customization\n\nThe workflow can be customized to handle different languages during the summarization and translation step."
      },
      "typeVersion": 1
    },
    {
      "id": "9585cb8e-2719-4bf6-b25b-4868208eee63",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 464,
        "content": "## Trigger and fetch video data\n\nInitial node to capture YouTube URLs and fetch transcript and video information."
      },
      "typeVersion": 1
    },
    {
      "id": "70fbd2a4-98e2-4c6a-83be-d9658b761f6a",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1024,
        64
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 304,
        "content": "## Merge and prepare data\n\nMerge transcript and video info data and prepare for AI processing."
      },
      "typeVersion": 1
    },
    {
      "id": "f7fbb230-7c91-4801-a25f-ba0f8f803bf8",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1424,
        64
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 304,
        "content": "## Summarize, translate, format and convert\n\nAI-based summarization, output formatting, and file conversion."
      },
      "typeVersion": 1
    },
    {
      "id": "b960f70a-accb-4dc8-9ec3-31fb5b5b8906",
      "name": "When URL Submitted",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        608,
        192
      ],
      "parameters": {
        "options": {},
        "formTitle": "YouTube Video Summarizer",
        "formFields": {
          "values": [
            {
              "fieldLabel": "YouTube URL",
              "placeholder": "https://www.youtube.com/watch?v=...",
              "requiredField": true
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Output Language",
              "fieldOptions": {
                "values": [
                  {
                    "option": "English"
                  },
                  {
                    "option": "Chinese (Mandarin)"
                  },
                  {
                    "option": "Spanish"
                  },
                  {
                    "option": "Hindi"
                  },
                  {
                    "option": "Arabic"
                  },
                  {
                    "option": "French"
                  },
                  {
                    "option": "Portuguese"
                  },
                  {
                    "option": "Russian"
                  },
                  {
                    "option": "Japanese"
                  },
                  {
                    "option": "German"
                  },
                  {
                    "option": "Czech"
                  }
                ]
              },
              "requiredField": true
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "What to Translate",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Summary + Key Points only"
                  },
                  {
                    "option": "Everything (including transcript)"
                  },
                  {
                    "option": "No translation (keep original language)"
                  }
                ]
              },
              "requiredField": true
            }
          ]
        },
        "responseMode": "lastNode",
        "formDescription": "Paste a YouTube URL, choose your output language, and select what should be translated."
      },
      "typeVersion": 2.2
    },
    {
      "id": "f680f561-de41-4bdc-befe-0418edf2dcd3",
      "name": "Extract Transcript",
      "type": "n8n-nodes-supadata.supadata",
      "position": [
        848,
        128
      ],
      "parameters": {
        "videoUrl": "={{ $json[\"YouTube URL\"] }}",
        "operation": "getTranscript"
      },
      "credentials": {
        "supadataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "68857d7b-e0dd-40d7-8bbf-bf40ea67d4a1",
      "name": "Fetch Video Details",
      "type": "n8n-nodes-supadata.supadata",
      "position": [
        848,
        288
      ],
      "parameters": {
        "videoUrl": "={{ $json[\"YouTube URL\"] }}"
      },
      "credentials": {
        "supadataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "761a7d81-cb45-43f2-9ebc-6a79c8a5bd7a",
      "name": "Combine Video and Transcript",
      "type": "n8n-nodes-base.code",
      "position": [
        1248,
        192
      ],
      "parameters": {
        "jsCode": "// After Merge node, we get two items:\n// Item 0 = transcript data (from Get Transcript)\n// Item 1 = metadata (from Get Video Info)\nconst items = $input.all();\n\nlet transcriptItem = null;\nlet metadataItem = null;\n\nfor (const item of items) {\n  const d = item.json;\n  if (d.content && Array.isArray(d.content)) {\n    transcriptItem = d;\n  } else if (d.platform || d.title) {\n    metadataItem = d;\n  }\n}\n\n// Build transcript text from content array\nlet transcript = '';\nif (transcriptItem && Array.isArray(transcriptItem.content)) {\n  transcript = transcriptItem.content.map(s => s.text).join(' ');\n} else if (transcriptItem && typeof transcriptItem.content === 'string') {\n  transcript = transcriptItem.content;\n} else {\n  transcript = 'Transcript not available.';\n}\n\nconst detectedLang = transcriptItem?.lang || 'unknown';\nconst title = metadataItem?.title || 'Unknown Title';\nconst formData = $('When URL Submitted').first().json;\nconst targetLanguage = formData['Output Language'];\nconst translateScope = formData['What to Translate'];\n\nlet systemPrompt = '';\nif (translateScope === 'No translation (keep original language)') {\n  systemPrompt = `You are an expert at analyzing video transcripts.\\n\\nThe transcript language is: ${detectedLang}\\n\\nYour tasks:\\n1. Write a concise SUMMARY (3-5 sentences) in the original language of the transcript.\\n2. Write 5-8 KEY POINTS as bullet points in the original language.\\n\\nFormat your response EXACTLY as:\\n\\nDETECTED LANGUAGE: ${detectedLang}\\n\\nSUMMARY:\\n[summary]\\n\\nKEY POINTS:\\n- [point 1]\\n- [point 2]\\n(etc.)`;\n} else if (translateScope === 'Summary + Key Points only') {\n  systemPrompt = `You are an expert at analyzing video transcripts.\\n\\nThe transcript language is: ${detectedLang}\\nTarget language: ${targetLanguage}\\n\\nYour tasks:\\n1. Write a concise SUMMARY (3-5 sentences) in ${targetLanguage}.\\n2. Write 5-8 KEY POINTS as bullet points in ${targetLanguage}.\\n\\nIMPORTANT: If the transcript is already in ${targetLanguage}, just write the summary and key points normally - no translation needed.\\n\\nTranslation rules:\\n- Keep established IT/programming terms in English (e.g. workflow, node, trigger, webhook, API, pipeline, template, credentials, boolean, debug, loop, branch). Translate only general language.\\n\\nFormat your response EXACTLY as:\\n\\nDETECTED LANGUAGE: ${detectedLang}\\n\\nSUMMARY:\\n[summary in ${targetLanguage}]\\n\\nKEY POINTS:\\n- [point 1]\\n- [point 2]\\n(etc.)`;\n} else {\n  systemPrompt = `You are an expert at analyzing video transcripts.\\n\\nThe transcript language is: ${detectedLang}\\nTarget language: ${targetLanguage}\\n\\nYour tasks:\\n1. Write a concise SUMMARY (3-5 sentences) in ${targetLanguage}.\\n2. Write 5-8 KEY POINTS as bullet points in ${targetLanguage}.\\n3. Provide a FULL TRANSLATION of the entire transcript into ${targetLanguage}.\\n\\nIMPORTANT: If the transcript is already in ${targetLanguage}, skip the translation and write \\\"N/A - Transcript is already in ${targetLanguage}\\\" in the TRANSLATED TRANSCRIPT section.\\n\\nTranslation rules:\\n- Keep established IT/programming terms in English (e.g. workflow, node, trigger, webhook, API, pipeline, template, credentials, boolean, debug, loop, branch). Translate only general language.\\n\\nFormat your response EXACTLY as:\\n\\nDETECTED LANGUAGE: ${detectedLang}\\n\\nSUMMARY:\\n[summary in ${targetLanguage}]\\n\\nKEY POINTS:\\n- [point 1]\\n- [point 2]\\n(etc.)\\n\\nTRANSLATED TRANSCRIPT:\\n[full translation or N/A]`;\n}\n\nreturn [{\n  json: {\n    transcript,\n    detectedLang,\n    title,\n    youtubeUrl: formData['YouTube URL'],\n    targetLanguage,\n    translateScope,\n    systemPrompt,\n    userMessage: 'TRANSCRIPT:\\n' + transcript\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "90473f83-462a-4dff-bfe8-8e07624585e0",
      "name": "Format for AI Processing",
      "type": "n8n-nodes-base.code",
      "position": [
        1664,
        192
      ],
      "parameters": {
        "jsCode": "const info = $('Combine Video and Transcript').first().json;\nconst aiResponse = $input.first().json.content || $input.first().json.message?.content || JSON.stringify($input.first().json);\nconst divider = '='.repeat(60);\nconst now = new Date().toISOString().split('T')[0];\n\nconst sections = [\n  `VIDEO: ${info.title}`,\n  `URL: ${info.youtubeUrl}`,\n  `OUTPUT LANGUAGE: ${info.targetLanguage}`,\n  `TRANSLATION SCOPE: ${info.translateScope}`,\n  `DATE: ${now}`,\n  '',\n  divider,\n  '',\n  aiResponse,\n  '',\n  divider,\n  '',\n  'ORIGINAL TRANSCRIPT:',\n  '',\n  info.transcript\n];\n\nreturn [{\n  json: {\n    output: sections.join('\\n')\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "edaba3ef-bb04-4bbb-ad41-04986c67a863",
      "name": "AI Summarization and Translation",
      "type": "n8n-nodes-base.openAi",
      "position": [
        1472,
        192
      ],
      "parameters": {
        "prompt": {
          "messages": [
            {
              "role": "system",
              "content": "={{ $json.systemPrompt }}"
            },
            {
              "content": "={{ $json.userMessage }}"
            }
          ]
        },
        "options": {
          "maxTokens": 16000,
          "temperature": 0.3
        },
        "resource": "chat",
        "requestOptions": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "62ac3b15-6769-4f8a-a236-bf924b7c8cc1",
      "name": "Merge Transcript and Video Info",
      "type": "n8n-nodes-base.merge",
      "position": [
        1072,
        192
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "d9ba94ed-3f5f-4775-8f0c-ab0a3fd92386",
      "name": "Output File Conversion",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        1856,
        192
      ],
      "parameters": {
        "options": {},
        "operation": "toText",
        "sourceProperty": "output"
      },
      "typeVersion": 1.1
    }
  ],
  "active": true,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "5e284069-78e5-492e-bb93-e9931466802b",
  "connections": {
    "Extract Transcript": {
      "main": [
        [
          {
            "node": "Merge Transcript and Video Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When URL Submitted": {
      "main": [
        [
          {
            "node": "Extract Transcript",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Video Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Video Details": {
      "main": [
        [
          {
            "node": "Merge Transcript and Video Info",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Format for AI Processing": {
      "main": [
        [
          {
            "node": "Output File Conversion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Video and Transcript": {
      "main": [
        [
          {
            "node": "AI Summarization and Translation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Transcript and Video Info": {
      "main": [
        [
          {
            "node": "Combine Video and Transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Summarization and Translation": {
      "main": [
        [
          {
            "node": "Format for AI Processing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow collects a YouTube URL via an n8n form, retrieves the video transcript and metadata using Supadata, then uses OpenAI to generate a summary, key points, and optional translation, and returns a downloadable text file. Receives a YouTube URL plus language and…

Source: https://n8n.io/workflows/16122/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Deep Multiline Icebreaker automates high-quality, research-led outreach. Feed it a list of leads (emails + websites) and a short product brief via the built-in form; the workflow scrapes each company'

HTTP Request, OpenAI, Google Sheets +1
AI & RAG

Turn your keyword research into a clear, fact-based content outline with this workflow. It splits your keyword into 5-6 subtopics, makes research questions for those subtopics, and uses Tavily to pull

OpenAI, @Tavily/N8N Nodes Tavily, Form Trigger
AI & RAG

Submit one or more Apple Podcast episode URLs via the built-in n8n form The workflow queries the iTunes API to retrieve each podcast's public RSS feed, then parses the XML to locate the matching episo

HTTP Request, Form Trigger, OpenAI +1
AI & RAG

IntelliX.AI - Editorial Automatizado v2. Uses postgres, rssFeedRead, openAi, httpRequest. Event-driven trigger; 62 nodes.

Postgres, RSS Feed Read, OpenAI +4
AI & RAG

Marketing agencies, digital agencies, and freelancers who need to streamline their client onboarding process and create consistent, professional documentation for new clients. Perfect for teams handli

Google Drive, Slack, Typeform Trigger +3