This workflow corresponds to n8n.io template #15710 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "8204c264-2fbd-45ba-a6c3-8d0c576ddfe6",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1408,
-96
],
"parameters": {
"color": 4,
"width": 524,
"height": 1156,
"content": "## YouTube Video to SEO Description + Tags + Chapters Generator \u2014 WayinVideo Summarization + Find Moments + GPT-4o-mini + Sheets\n\nFor YouTube creators, video agencies, and content managers who publish regularly and want to automatically generate a fully SEO-optimized video description with timestamps, tags, and hashtags \u2014 without writing it manually after each upload. Submit any YouTube video URL via the form. Two WayinVideo APIs run in parallel \u2014 the Summarization API generates a structured summary with highlights and tags, and the Find Moments API finds all key section transitions. Both APIs have independent 90-second waits and 30-second retry loops. GPT-4o-mini reads both outputs and generates six labeled sections: a full 800\u20131000 character YouTube description with chapters embedded, a standalone chapter list, 15 keyword tags, 6 hashtags, the above-the-fold description hook, and SEO notes. Everything is saved to Google Sheets as one row with 16 columns \u2014 ready to paste into YouTube Studio.\n\n## How it works\n- **1. Form \u2014 Video URL + SEO Details** collects the video URL, title, channel, niche, focus keyword, section query, and channel link\n- **2a. WayinVideo \u2014 Submit Summarization** and **2b. WayinVideo \u2014 Submit Find Moments** both submit simultaneously from the Form node \u2014 the workflow runs two API jobs in parallel\n- **3a/3b. Wait \u2014 90 Seconds** gives each API initial processing time independently\n- **4a/4b. WayinVideo \u2014 Get Results** polls each API on its own branch\n- **5a. IF \u2014 Summary Complete?** and **5b. IF \u2014 Moments Complete?** check each status independently \u2014 FALSE branches loop back via 30-second retry waits (5c above, 5d below)\n- **6. Code \u2014 Merge + Format API Results** reads from both 4a and 4b, sorts chapters chronologically, prepends 0:00 Introduction if missing, and assembles the combined prompt for GPT\n- **7. AI Agent \u2014 Write YouTube SEO Package** uses GPT-4o-mini to write all 6 labeled output sections\n- **8. OpenAI \u2014 GPT-4o-mini Model** language model attached to the AI Agent\n- **9. Code \u2014 Parse SEO Output** extracts all 6 sections via regex and counts tags and description characters\n- **10. Google Sheets \u2014 Save YouTube SEO Package** appends one row with 16 fields and Status set to Ready\n\n## Set up steps\n1. In **2a**, **2b**, **4a**, **4b** \u2014 replace `YOUR_WAYINVIDEO_API_KEY`\n2. In **8. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **10. Google Sheets \u2014 Save YouTube SEO Package** \u2014 connect your Google Sheets OAuth2 credential and replace `YOUR_GOOGLE_SHEET_ID`\n4. Create a Google Sheet tab named YouTube SEO with columns: Video URL, Video Title, Channel, Niche, Focus Keyword, Description Hook, YouTube Description, Description Char Count, Chapter Timestamps, Total Chapters, YouTube Tags, Tag Count, Hashtags, SEO Notes, Generated On, Status"
},
"typeVersion": 1
},
{
"id": "a03d2b45-7670-4ea5-9927-02c4e89c5d20",
"name": "Section \u2014 Form Input",
"type": "n8n-nodes-base.stickyNote",
"position": [
-800,
112
],
"parameters": {
"color": 5,
"width": 280,
"height": 452,
"content": "## Form Input\nCreator submits video URL, title, channel name, niche, focus keyword, section query for timestamps, and optional channel link. The section query drives the Find Moments API \u2014 use 4\u20136 descriptive words matching your video style."
},
"typeVersion": 1
},
{
"id": "93e370e1-a209-4df6-b60b-08ef3f8bbd4b",
"name": "Section \u2014 Parallel API Submission",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-32
],
"parameters": {
"color": 6,
"width": 292,
"height": 724,
"content": "## Parallel API Submission\nBoth WayinVideo APIs are submitted simultaneously from the Form node. Branch A submits to the Summarization API. Branch B submits to the Find Moments API. Each returns a task ID for independent polling."
},
"typeVersion": 1
},
{
"id": "96b32843-d826-47f6-ad05-04b41abd0202",
"name": "Section \u2014 Independent Wait, Poll, and Retry Loops",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
-128
],
"parameters": {
"color": 6,
"width": 740,
"height": 964,
"content": "## Independent Wait, Poll, and Retry Loops\nBoth branches wait 90 seconds independently. Each polls its own results endpoint. IF SUCCEEDED \u2014 proceeds to merge. IF not ready \u2014 30-second retry loops back. Branch A retry (5c) sits above the main row. Branch B retry (5d) sits below."
},
"typeVersion": 1
},
{
"id": "d4ef53a3-7a75-451c-80a2-d7da17928751",
"name": "Section \u2014 Merge, Format, and AI SEO Writing",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
192
],
"parameters": {
"color": 6,
"width": 612,
"height": 468,
"content": "## Merge, Format, and AI SEO Writing\nCode node reads from both 4a and 4b, sorts chapters chronologically, prepends 0:00 Introduction if missing. GPT-4o-mini writes all 6 labeled SEO sections in one call."
},
"typeVersion": 1
},
{
"id": "1eca8a5a-6f2f-46cd-bd05-e9064bebf899",
"name": "Section \u2014 SEO Parse and Google Sheets Save",
"type": "n8n-nodes-base.stickyNote",
"position": [
1312,
192
],
"parameters": {
"color": 4,
"width": 484,
"height": 356,
"content": "## SEO Parse and Google Sheets Save\nRegex extracts all 6 labeled sections. Counts tags and description characters. Appends one row to Google Sheets with 16 fields and Status set to Ready."
},
"typeVersion": 1
},
{
"id": "b187aa07-64a5-4104-a2d9-454a5f2cb4a1",
"name": "1. Form \u2014 Video URL + SEO Details",
"type": "n8n-nodes-base.formTrigger",
"position": [
-720,
320
],
"parameters": {
"options": {},
"formTitle": "YouTube SEO Description Generator",
"formFields": {
"values": [
{
"fieldLabel": "YouTube Video URL",
"placeholder": "https://www.youtube.com/watch?v=xxxxxxx",
"requiredField": true
},
{
"fieldLabel": "Video Title",
"placeholder": "e.g. Complete SEO Tutorial for Beginners 2025 \u2014 Step by Step",
"requiredField": true
},
{
"fieldLabel": "Channel Name",
"placeholder": "e.g. Incrementors, Ali Abdaal, TechWithTim",
"requiredField": true
},
{
"fieldLabel": "Content Niche",
"placeholder": "e.g. SEO, Python Programming, Personal Finance, Fitness",
"requiredField": true
},
{
"fieldLabel": "Focus Keyword",
"placeholder": "e.g. SEO tutorial for beginners, Python functions explained",
"requiredField": true
},
{
"fieldLabel": "Section Query for Timestamps",
"placeholder": "e.g. step by step tutorial section transition",
"requiredField": true
},
{
"fieldLabel": "Channel / Website Link",
"placeholder": "e.g. https://yourwebsite.com"
}
]
},
"formDescription": "Paste your YouTube video URL. AI will generate a complete SEO-optimized description with chapter timestamps, keyword tags, and hashtags \u2014 ready to paste into YouTube Studio."
},
"typeVersion": 2.2
},
{
"id": "0a92cad4-4780-4c5f-8104-0f1daeb86fbf",
"name": "2a. WayinVideo \u2014 Submit Summarization",
"type": "n8n-nodes-base.httpRequest",
"position": [
-400,
176
],
"parameters": {
"url": "https://wayinvideo-api.wayin.ai/api/v2/summaries",
"method": "POST",
"options": {},
"jsonBody": "={\n \"video_url\": \"{{ $json['YouTube Video URL'] }}\",\n \"target_lang\": \"en\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "f075bba5-d282-4f14-9e13-02c6e8a6d983",
"name": "2b. WayinVideo \u2014 Submit Find Moments",
"type": "n8n-nodes-base.httpRequest",
"position": [
-400,
448
],
"parameters": {
"url": "https://wayinvideo-api.wayin.ai/api/v2/clips/find-moments",
"method": "POST",
"options": {},
"jsonBody": "={\n \"video_url\": \"{{ $('1. Form \u2014 Video URL + SEO Details').item.json['YouTube Video URL'] }}\",\n \"query\": \"{{ $('1. Form \u2014 Video URL + SEO Details').item.json['Section Query for Timestamps'] }}\",\n \"project_name\": \"Chapters \u2014 {{ $('1. Form \u2014 Video URL + SEO Details').item.json['Video Title'] }}\",\n \"limit\": 12,\n \"enable_export\": false,\n \"target_lang\": \"en\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "f0653386-1970-4a18-91c8-d9543e7960b8",
"name": "3a. Wait \u2014 90 Seconds (Summary)",
"type": "n8n-nodes-base.wait",
"position": [
-64,
176
],
"parameters": {
"amount": 90
},
"typeVersion": 1.1
},
{
"id": "e625ad76-2e57-4842-b15a-9519dfe420c0",
"name": "3b. Wait \u2014 90 Seconds (Moments)",
"type": "n8n-nodes-base.wait",
"position": [
-64,
448
],
"parameters": {
"amount": 90
},
"typeVersion": 1.1
},
{
"id": "80643e4b-aa20-45de-8d45-c72ecb9c7bce",
"name": "4a. WayinVideo \u2014 Get Summary Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
192,
176
],
"parameters": {
"url": "=https://wayinvideo-api.wayin.ai/api/v2/summaries/results/{{ $('2a. WayinVideo \u2014 Submit Summarization').item.json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "5d41e73c-9a05-43bf-9bc6-542ce7531eb1",
"name": "4b. WayinVideo \u2014 Get Moments Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
192,
448
],
"parameters": {
"url": "=https://wayinvideo-api.wayin.ai/api/v2/clips/find-moments/results/{{ $('2b. WayinVideo \u2014 Submit Find Moments').item.json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "97963e56-e569-4bed-b3b7-6c72512e4fa3",
"name": "5a. IF \u2014 Summary Complete?",
"type": "n8n-nodes-base.if",
"position": [
432,
176
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "s-status",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "069738e1-7fc3-4814-b1c1-ca65496a32f3",
"name": "5b. IF \u2014 Moments Complete?",
"type": "n8n-nodes-base.if",
"position": [
432,
448
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "m-status",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "8eaa9cef-0794-42bf-ba1c-f5b98ad6222c",
"name": "5c. Wait \u2014 30 Seconds Retry (Summary)",
"type": "n8n-nodes-base.wait",
"position": [
432,
16
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "26c2c59d-a08c-4d9e-afd5-d354b7eb0a10",
"name": "5d. Wait \u2014 30 Seconds Retry (Moments)",
"type": "n8n-nodes-base.wait",
"position": [
432,
608
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "d882c46b-9a18-49b1-8469-d0fc73a747e1",
"name": "6. Code \u2014 Merge + Format API Results",
"type": "n8n-nodes-base.code",
"position": [
704,
320
],
"parameters": {
"jsCode": "// Extract and format both API results for GPT\n\n// --- SUMMARY DATA ---\nconst summaryData = $('4a. WayinVideo \u2014 Get Summary Results').item.json.data;\nconst summary = summaryData.summary || '';\nconst highlights = Array.isArray(summaryData.highlights)\n ? summaryData.highlights.map((h, i) => `${i + 1}. ${h.desc}`).join('\\n')\n : '';\nconst apiTags = Array.isArray(summaryData.tags) ? summaryData.tags : [];\n\n// --- MOMENTS / CHAPTERS DATA ---\nconst clips = $('4b. WayinVideo \u2014 Get Moments Results').item.json.data?.clips || [];\n\n// Sort chapters chronologically by start time\nconst sortedClips = clips.sort((a, b) => (a.begin_ms || 0) - (b.begin_ms || 0));\n\n// Build formatted chapters list\nconst chapters = sortedClips.map((clip, index) => {\n const startMs = clip.begin_ms || 0;\n const mm = Math.floor(startMs / 60000);\n const ss = String(Math.floor((startMs % 60000) / 1000)).padStart(2, '0');\n const timestamp = `${mm}:${ss}`;\n return `${timestamp} ${clip.title || `Section ${index + 1}`}`;\n});\n\n// Make sure 0:00 Introduction is first\nif (chapters.length > 0 && !chapters[0].startsWith('0:00')) {\n chapters.unshift('0:00 Introduction');\n}\n\nconst chaptersText = chapters.join('\\n');\nconst totalChapters = chapters.length;\n\n// --- FORM DATA ---\nconst videoTitle = $('1. Form \u2014 Video URL + SEO Details').item.json['Video Title'];\nconst channelName = $('1. Form \u2014 Video URL + SEO Details').item.json['Channel Name'];\nconst niche = $('1. Form \u2014 Video URL + SEO Details').item.json['Content Niche'];\nconst focusKeyword = $('1. Form \u2014 Video URL + SEO Details').item.json['Focus Keyword'];\nconst channelLink = $('1. Form \u2014 Video URL + SEO Details').item.json['Channel / Website Link'] || '';\nconst videoUrl = $('1. Form \u2014 Video URL + SEO Details').item.json['YouTube Video URL'];\n\nreturn [{\n json: {\n summary,\n highlights,\n apiTags,\n apiTagsText: apiTags.join(', '),\n chaptersText,\n totalChapters,\n videoTitle,\n channelName,\n niche,\n focusKeyword,\n channelLink,\n videoUrl\n }\n}];"
},
"typeVersion": 2
},
{
"id": "df15ca04-7242-48f7-ac70-bab06628b866",
"name": "7. AI Agent \u2014 Write YouTube SEO Package",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
944,
320
],
"parameters": {
"text": "=Video Summary:\n{{ $json.summary }}\n\nKey Highlights:\n{{ $json.highlights }}\n\nChapter Timestamps (already sorted chronologically):\n{{ $json.chaptersText }}\n\nAPI Tags from WayinVideo:\n{{ $json.apiTagsText }}",
"options": {
"systemMessage": "=You are an expert YouTube SEO strategist who writes high-performing video descriptions that rank well in YouTube search and drive clicks.\n\nRead the video summary, highlights, and chapter timestamps provided and write a complete YouTube SEO package.\n\n---\n\n## VIDEO DETAILS\n- Video Title: {{ $json.videoTitle }}\n- Channel: {{ $json.channelName }}\n- Niche: {{ $json.niche }}\n- Focus Keyword: {{ $json.focusKeyword }}\n- Channel Link: {{ $json.channelLink }}\n- Video URL: {{ $json.videoUrl }}\n- Total Chapters: {{ $json.totalChapters }}\n\n---\n\n## YOUTUBE DESCRIPTION RULES\n1. Total description length: 800-1000 characters (YouTube shows ~157 chars above the fold)\n2. First 2 lines must be the strongest hook \u2014 include the focus keyword naturally\n3. Structure: Hook (2 lines) \u2192 What you will learn (3-4 bullet points) \u2192 Chapter timestamps \u2192 Channel/links section \u2192 Hashtags\n4. Use the exact chapter timestamps provided \u2014 do NOT change MM:SS values\n5. Include focus keyword in first 100 characters\n6. Write naturally \u2014 not keyword stuffed\n7. End with 5-7 hashtags on the last line\n\n## YOUTUBE TAGS RULES\n- Generate exactly 15 tags\n- Mix of: exact focus keyword, broad niche keywords, long-tail variations, channel-related tags\n- All lowercase\n- No hashtags \u2014 plain text tags only\n- 2-5 words per tag maximum\n\n## HASHTAGS RULES\n- Generate exactly 6 hashtags\n- Include focus keyword hashtag, niche hashtag, 4 discovery hashtags\n- Lowercase, no spaces\n\n---\n\n## OUTPUT FORMAT\nReturn in this exact structure:\n\nYOUTUBE_DESCRIPTION:\n[Full YouTube description \u2014 800-1000 characters \u2014 with chapters embedded \u2014 hashtags at end]\n\nCHAPTERS_STANDALONE:\n[Clean chapter list for copy-paste \u2014 one per line \u2014 MM:SS Title format]\n\nYOUTUBE_TAGS:\n[15 tags \u2014 comma separated \u2014 lowercase \u2014 no hashtags]\n\nHASHTAGS:\n[6 hashtags \u2014 space separated]\n\nDESCRIPTION_HOOK:\n[First 2 lines of the description \u2014 the above-the-fold preview]\n\nSEO_NOTES:\n[2-3 bullet points of SEO tips specific to this video's topic and niche]\n\n---\n\nNow write the complete YouTube SEO package:"
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "39b23edb-2dd1-4836-a44a-d1c725b8d3fc",
"name": "8. OpenAI \u2014 GPT-4o-mini Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
944,
512
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "51a62971-9a83-494d-b1db-93aab484f5f5",
"name": "9. Code \u2014 Parse SEO Output",
"type": "n8n-nodes-base.code",
"position": [
1376,
320
],
"parameters": {
"jsCode": "// Parse AI YouTube SEO output\nconst output = $input.first().json.output || '';\n\n// Extract each section\nconst descMatch = output.match(/YOUTUBE_DESCRIPTION:\\s*([\\s\\S]*?)(?=\\nCHAPTERS_STANDALONE:|$)/);\nconst chaptersMatch = output.match(/CHAPTERS_STANDALONE:\\s*([\\s\\S]*?)(?=\\nYOUTUBE_TAGS:|$)/);\nconst tagsMatch = output.match(/YOUTUBE_TAGS:\\s*([\\s\\S]*?)(?=\\nHASHTAGS:|$)/);\nconst hashtagsMatch = output.match(/HASHTAGS:\\s*([\\s\\S]*?)(?=\\nDESCRIPTION_HOOK:|$)/);\nconst hookMatch = output.match(/DESCRIPTION_HOOK:\\s*([\\s\\S]*?)(?=\\nSEO_NOTES:|$)/);\nconst seoNotesMatch = output.match(/SEO_NOTES:\\s*([\\s\\S]*)$/);\n\nconst youtubeDescription = descMatch ? descMatch[1].trim() : '';\nconst chaptersStandalone = chaptersMatch ? chaptersMatch[1].trim() : '';\nconst youtubeTags = tagsMatch ? tagsMatch[1].trim() : '';\nconst hashtags = hashtagsMatch ? hashtagsMatch[1].trim() : '';\nconst descriptionHook = hookMatch ? hookMatch[1].trim() : '';\nconst seoNotes = seoNotesMatch ? seoNotesMatch[1].trim() : '';\n\nif (!youtubeDescription || !youtubeTags) {\n throw new Error('Could not parse YouTube SEO output. Check AI prompt format.');\n}\n\n// Count tags\nconst tagCount = youtubeTags.split(',').map(t => t.trim()).filter(Boolean).length;\nconst descCharCount = youtubeDescription.length;\n\n// Get metadata\nconst metaData = $('6. Code \u2014 Merge + Format API Results').item.json;\n\nreturn [{\n json: {\n youtubeDescription,\n chaptersStandalone,\n youtubeTags,\n hashtags,\n descriptionHook,\n seoNotes,\n tagCount,\n descCharCount,\n focusKeyword: metaData.focusKeyword,\n videoTitle: metaData.videoTitle,\n channelName: metaData.channelName,\n niche: metaData.niche,\n videoUrl: metaData.videoUrl,\n totalChapters: metaData.totalChapters\n }\n}];"
},
"typeVersion": 2
},
{
"id": "213d53a1-0e37-4135-b85f-b2af0d8fbf4d",
"name": "10. Google Sheets \u2014 Save YouTube SEO Package",
"type": "n8n-nodes-base.googleSheets",
"position": [
1616,
320
],
"parameters": {
"columns": {
"value": {
"Niche": "={{ $json.niche }}",
"Status": "Ready",
"Channel": "={{ $json.channelName }}",
"Hashtags": "={{ $json.hashtags }}",
"SEO Notes": "={{ $json.seoNotes }}",
"Tag Count": "={{ $json.tagCount }}",
"Video URL": "={{ $json.videoUrl }}",
"Video Title": "={{ $json.videoTitle }}",
"Generated On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
"YouTube Tags": "={{ $json.youtubeTags }}",
"Focus Keyword": "={{ $json.focusKeyword }}",
"Total Chapters": "={{ $json.totalChapters }}",
"Description Hook": "={{ $json.descriptionHook }}",
"Chapter Timestamps": "={{ $json.chaptersStandalone }}",
"YouTube Description": "={{ $json.youtubeDescription }}",
"Description Char Count": "={{ $json.descCharCount }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "YouTube SEO"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
}
],
"connections": {
"5a. IF \u2014 Summary Complete?": {
"main": [
[
{
"node": "6. Code \u2014 Merge + Format API Results",
"type": "main",
"index": 0
}
],
[
{
"node": "5c. Wait \u2014 30 Seconds Retry (Summary)",
"type": "main",
"index": 0
}
]
]
},
"5b. IF \u2014 Moments Complete?": {
"main": [
[
{
"node": "6. Code \u2014 Merge + Format API Results",
"type": "main",
"index": 0
}
],
[
{
"node": "5d. Wait \u2014 30 Seconds Retry (Moments)",
"type": "main",
"index": 0
}
]
]
},
"9. Code \u2014 Parse SEO Output": {
"main": [
[
{
"node": "10. Google Sheets \u2014 Save YouTube SEO Package",
"type": "main",
"index": 0
}
]
]
},
"8. OpenAI \u2014 GPT-4o-mini Model": {
"ai_languageModel": [
[
{
"node": "7. AI Agent \u2014 Write YouTube SEO Package",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"3a. Wait \u2014 90 Seconds (Summary)": {
"main": [
[
{
"node": "4a. WayinVideo \u2014 Get Summary Results",
"type": "main",
"index": 0
}
]
]
},
"3b. Wait \u2014 90 Seconds (Moments)": {
"main": [
[
{
"node": "4b. WayinVideo \u2014 Get Moments Results",
"type": "main",
"index": 0
}
]
]
},
"1. Form \u2014 Video URL + SEO Details": {
"main": [
[
{
"node": "2a. WayinVideo \u2014 Submit Summarization",
"type": "main",
"index": 0
},
{
"node": "2b. WayinVideo \u2014 Submit Find Moments",
"type": "main",
"index": 0
}
]
]
},
"2b. WayinVideo \u2014 Submit Find Moments": {
"main": [
[
{
"node": "3b. Wait \u2014 90 Seconds (Moments)",
"type": "main",
"index": 0
}
]
]
},
"4a. WayinVideo \u2014 Get Summary Results": {
"main": [
[
{
"node": "5a. IF \u2014 Summary Complete?",
"type": "main",
"index": 0
}
]
]
},
"4b. WayinVideo \u2014 Get Moments Results": {
"main": [
[
{
"node": "5b. IF \u2014 Moments Complete?",
"type": "main",
"index": 0
}
]
]
},
"6. Code \u2014 Merge + Format API Results": {
"main": [
[
{
"node": "7. AI Agent \u2014 Write YouTube SEO Package",
"type": "main",
"index": 0
}
]
]
},
"2a. WayinVideo \u2014 Submit Summarization": {
"main": [
[
{
"node": "3a. Wait \u2014 90 Seconds (Summary)",
"type": "main",
"index": 0
}
]
]
},
"5c. Wait \u2014 30 Seconds Retry (Summary)": {
"main": [
[
{
"node": "4a. WayinVideo \u2014 Get Summary Results",
"type": "main",
"index": 0
}
]
]
},
"5d. Wait \u2014 30 Seconds Retry (Moments)": {
"main": [
[
{
"node": "4b. WayinVideo \u2014 Get Moments Results",
"type": "main",
"index": 0
}
]
]
},
"7. AI Agent \u2014 Write YouTube SEO Package": {
"main": [
[
{
"node": "9. Code \u2014 Parse SEO Output",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Submit any YouTube video URL along with your video title, channel name, niche, focus keyword, and a section query for timestamps and the workflow runs two AI processes simultaneously. WayinVideo's Summarization API and Find Moments API both start at the same time — one…
Source: https://n8n.io/workflows/15710/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
Digistars - Scrape & Crawl. Uses httpRequest, n8n-nodes-firecrawl-scraper, googleSheets, lmChatOpenAi. Event-driven trigger; 63 nodes.
🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.
The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical
This n8n workflow automates turning short user ideas into production-ready real-estate marketing assets (photorealistic images and optional 360° videos). A form submission seeds a prompt board → an LL