This workflow corresponds to n8n.io template #6014 — we link there as the canonical source.
This workflow follows the Chainllm → Google Drive 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 →
{
"id": "SfN2LB0yzDGfq2fl",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Faceless Video Machine \u2013 Turn Ideas into Videos Automatically",
"tags": [],
"nodes": [
{
"id": "da94f942-f640-427e-ab03-8fd2dd2ac64e",
"name": "Upload Audio to Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
-80,
320
],
"parameters": {
"name": "=faceless-video-audio-{{ $now.toISO() }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultName": "/ (Root folder)"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "75321cd0-3789-4ac2-9ce5-13e49165c106",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
420,
200
],
"parameters": {
"mode": "combine",
"options": {
"includeUnpaired": true
},
"combineBy": "combineByPosition"
},
"typeVersion": 3
},
{
"id": "d06d65ee-1c31-4b3a-962e-0b418b089e2f",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
780,
560
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"start_time\": {\n \"type\": \"number\"\n },\n \"end_time\": {\n \"type\": \"number\"\n },\n \"duration\": {\n \"type\": \"number\"\n },\n \"prompt\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"start_time_seconds\", \"end_time_seconds\", \"prompt\"]\n }\n}\n"
},
"typeVersion": 1.2
},
{
"id": "a77b5b6b-86cd-40ca-9e89-646461177189",
"name": "Sticky Note22",
"type": "n8n-nodes-base.stickyNote",
"position": [
2860,
-140
],
"parameters": {
"color": 3,
"width": 860,
"height": 880,
"content": "## 7. Video Editing And Downloading\n- The raw video, along with timestamps or subtitles, is sent to **Shotstack**, a video editing tool that supports advanced edits.\n- A delay of 1 minute allows **Shotstack** to process the edit.\n- Then, the tool checks whether the edited video is finished by **Shotstack** and ready to be downloaded.\n- Once completed, you can download the final polished video to your local storage for later use."
},
"typeVersion": 1
},
{
"id": "6e3428b3-c1fb-4bf5-826c-6b41c90fc7c5",
"name": "Sticky Note23",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
-140
],
"parameters": {
"color": 3,
"width": 640,
"height": 880,
"content": "## 4. Timestamps Generation\n- The tool merges the original script and the **OpenAI Whisper**-generated transcription.\n- The merged data is passed to **Google Gemini's chat model** to generate image prompts with precise timestamps.\n- The output is parsed and cleaned using a structured parser to ensure it's in ready-to-use JSON format for image generation."
},
"typeVersion": 1
},
{
"id": "7fe9f339-f0a9-4ef1-a187-b99267169bee",
"name": "Sticky Note24",
"type": "n8n-nodes-base.stickyNote",
"position": [
1040,
-140
],
"parameters": {
"color": 3,
"width": 740,
"height": 880,
"content": "## 5. Images Generation\n- The full list of timestamped prompts is is split into individual entries.\n- Each prompt is sent to **Leonardo's API** that turns text descriptions into visuals.\n- A delay of 30 seconds is added to give the image generation engine enough time to complete rendering.\n- Once completed, the workflow retrieves all final images for the next stage."
},
"typeVersion": 1
},
{
"id": "4d469807-e522-4af3-8e8a-d8765e5ddb21",
"name": "Sticky Note25",
"type": "n8n-nodes-base.stickyNote",
"position": [
1840,
-140
],
"parameters": {
"color": 3,
"width": 960,
"height": 880,
"content": "## 6. Images to Video Conversion\n- All generated images are sent to **Leonardo's API**, which stitches them together based on the structured prompts and timing.\n- A 5-minute wait allows time for rendering.\n- After the wait, the workflow retrieves the generated small videos and makes them downloadable.\n- Then, the tool aggregates all downloaded videos into a single unified structure, preparing them for the final editing."
},
"typeVersion": 1
},
{
"id": "c4943664-8f2e-437e-b2ce-cccce7831b94",
"name": "Sticky Note29",
"type": "n8n-nodes-base.stickyNote",
"position": [
-960,
-140
],
"parameters": {
"color": 3,
"width": 560,
"height": 880,
"content": "## 2. Script Generation\n- Your idea is passed to **Google Gemini's chat model**. The model returns a concise, 60-second faceless video script. \n- The script is then reformatted into a structured layout optimized for voice generation and visual synchronization."
},
"typeVersion": 1
},
{
"id": "3a0703be-2494-4769-b57c-5d6f2adefb54",
"name": "Sticky Note30",
"type": "n8n-nodes-base.stickyNote",
"position": [
-340,
-140
],
"parameters": {
"color": 3,
"width": 620,
"height": 880,
"content": "## 3. Audio Generation\n- The formatted script is passed to **ElevenLabs**, which turns the text into a high-quality voiceover audio.\n- The generated audio is uploaded to **Google Drive** and made publicly accessible.\n- At the same time, the audio is sent to **OpenAI Whisper** via a POST request to generate a transcription of the voiceover."
},
"typeVersion": 1
},
{
"id": "e3f43f3a-7b68-4534-a2e0-425d4d9fc6e3",
"name": "When clicking \u2018Test workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1420,
180
],
"parameters": {},
"typeVersion": 1
},
{
"id": "2cb28f94-f118-4cb3-a94c-b006d4bf7268",
"name": "Generate Image Prompts",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
600,
200
],
"parameters": {
"text": "=You are an expert image generation prompt creator. Based on the transcript provided below, divide the video into consecutive scenes, with each scene lasting between 2.00 to 4.00 seconds. There must be no gaps between scenes \u2014 ensure the entire duration of the video is covered.\n\nFor each scene, output:\n\nA descriptive image prompt that best represents the content of that scene\n\nThe start time, end time, and duration of the scene (in seconds), formatted like this: 2.00-4.25\n\nEach duration must have exactly two decimal points of precision\n\nOnly output one prompt per scene. Prioritize visual storytelling, aligning imagery with the spoken content in the transcript. The prompts should be rich, cinematic, and vivid, ideal for faceless video content.\n\nHere is the video transcript:\n\n{{JSON.stringify($json.words) }}",
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5
},
{
"id": "8d34836e-3a01-4f6e-819a-89386854e139",
"name": "Auto-fixing Output Parse",
"type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
"position": [
680,
400
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "64a688f7-5cdc-4ee3-b063-52a25157189b",
"name": "Split Prompts",
"type": "n8n-nodes-base.splitOut",
"position": [
1100,
200
],
"parameters": {
"options": {},
"fieldToSplitOut": "output"
},
"typeVersion": 1
},
{
"id": "69287f57-453c-4f7a-bb6e-f5207eceff45",
"name": "Wait 5 mins",
"type": "n8n-nodes-base.wait",
"position": [
2100,
200
],
"parameters": {
"unit": "minutes"
},
"typeVersion": 1.1
},
{
"id": "d38722a5-eee9-49af-a3ef-ded73f2deaeb",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
2640,
200
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "list"
},
"typeVersion": 1
},
{
"id": "40559316-89fc-4ef2-9215-065b30e96bab",
"name": "Edit with Shotstack",
"type": "n8n-nodes-base.httpRequest",
"position": [
2920,
200
],
"parameters": {
"url": "https://api.shotstack.io/edit/stage/render",
"method": "POST",
"options": {},
"jsonBody": "={\n \"timeline\": {\n \"soundtrack\":{\n \"src\":\"{{ $('Upload Audio to Drive').first().json.webContentLink }}\" \n},\n \"tracks\": [\n {\n \"clips\":{{ JSON.stringify($('Aggregate').first().json.list.map((item, i) => ({\n \"asset\": {\n \"type\": \"video\",\n \"src\": item.generations_by_pk.generated_images[0].motionMP4URL\n },\n \"start\": $('Generate Image Prompts').first().json.output[i].start_time,\n \"length\": 20\n }))) }}\n }\n ]\n },\n \"output\": {\n \"format\": \"mp4\",\n \"size\": {\n \"width\": 720,\n \"height\": 1280\n }\n }\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "6db5e94d-b6da-4f04-b22a-e27caca48c60",
"name": "Wait 1 min",
"type": "n8n-nodes-base.wait",
"position": [
3120,
200
],
"parameters": {
"unit": "minutes",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "c664a13e-1298-4828-a446-bd853c7d31e2",
"name": "Fields - Set Idea",
"type": "n8n-nodes-base.set",
"position": [
-1200,
180
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6b5b5d77-fd3d-497c-82e5-99fc74f53efb",
"name": "Idea",
"type": "string",
"value": "What is AI Agents"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "859c2506-afe3-43ec-abc4-f09d7cbde9db",
"name": "60 Second Script Writer",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-880,
180
],
"parameters": {
"text": "=Idea: {{ $json.idea }}",
"messages": {
"messageValues": [
{
"message": "Act as a YouTube video scriptwriter and create an engaging, captivating script for a 1-minute video (based on medium-paced speech). The script should attract and retain viewers using elements like storytelling, relatable content, a clear structure, and clever analogies to boost audience engagement.\n\nThe video topic is: (VIDEO IDEA). Use your creativity and expertise to produce a high-quality, informative script that appeals to a wide audience.\n\nInstructions:\n- Only output the script text\u2014no explanations or extra commentary.\n- Use CAPITAL LETTERS and EXCLAMATION MARKS (!) generously to add emotion and emphasis where appropriate."
}
]
},
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "f2ca8c1b-2512-4aaa-bdc3-ac64459b6778",
"name": "OpenAI Chat Mode",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-720,
360
],
"parameters": {
"model": "anthropic/claude-3.5-sonnet",
"options": {
"baseURL": "https://openrouter.ai/api/v1"
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c69ecd98-cc31-4fa1-b0f1-c6c7edb5950a",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
420,
560
],
"parameters": {
"model": "anthropic/claude-3.5-sonnet",
"options": {
"baseURL": "https://openrouter.ai/api/v1"
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "1bb38452-6806-412c-8568-c74260d0a103",
"name": "Fields - Script Format",
"type": "n8n-nodes-base.set",
"position": [
-540,
180
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "974ee00c-4264-494f-9606-c8b717d1fb09",
"name": "text",
"type": "string",
"value": "={{ $json.text.replace(/(\\r\\n|\\n|\\r)/g, \"\"); }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a410a4cd-14d3-4c8f-857d-03af500f764b",
"name": "Generate Voice",
"type": "n8n-nodes-base.httpRequest",
"position": [
-260,
180
],
"parameters": {
"url": "=https://api.elevenlabs.io/v1/text-to-speech/TxGEqnHWrfWFTfGW9XjX",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "={{ $json.text }}"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "0ef69faa-ed6e-4760-b3b1-9f61ff1ab3b6",
"name": "Generate Images",
"type": "n8n-nodes-base.httpRequest",
"position": [
1280,
200
],
"parameters": {
"url": "https://cloud.leonardo.ai/api/rest/v1/generations",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "height",
"value": "={{ 1280 }}"
},
{
"name": "prompt",
"value": "={{ $json.prompt }}"
},
{
"name": "width",
"value": "={{ 720 }}"
},
{
"name": "modelId",
"value": "1dd50843-d653-4516-a8e3-f0238ee453ff"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "30931947-d793-4e9c-b01d-c23b0879eff1",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2420,
-460
],
"parameters": {
"width": 700,
"height": 2680,
"content": "## [Agent Circle's N8N Workflow] Automated Faceless Video Creator - Try It Out!\n\n**This n8n template demonstrates walks you through a fully automated process to generate faceless videos - from script creation to final download - using AI-generated voice, images, and smart video editing.**\n\nUse cases are many: This tool is perfect for **YouTube and Shorts creators** who want to publish daily content without showing their face, **TikTok and Reels marketers** automating voice-over-driven videos, and **solopreneurs** scaling up their content without hiring a team. It\u2019s also ideal for **agencies** producing batches of faceless video ads, **automation enthusiasts** building smart media workflows in n8n, and anyone who\u2019s rich in ideas but tired of spending hours editing.\n\n## How It Works\n- Phase 1: **Provide Topic Input**\n - A short topic and idea should be entered into the **Idea** part in Node **Fields - Set Idea** inside the workflow in n8n.\n - Trigger the process manually by clicking **Test Workflow** or **Execute Workflow**. \n- Phase 2: **Script Generation**\n - Your idea is passed to **Google Gemini's chat model**. The model returns a concise, 60-second faceless video script. \n - The script is then reformatted into a structured layout optimized for voice generation and visual synchronization.\n- Phase 3: **Audio Generation**\n - The formatted script is passed to **ElevenLabs**, which turns the text into a high-quality voiceover audio.\n - The generated audio is uploaded to **Google Drive** and made publicly accessible.\n - At the same time, the audio is sent to **OpenAI Whisper** via a POST request to generate a transcription of the voiceover.\n- Phase 4: **Timestamps Generation**\n - The tool merges the original script and the **OpenAI Whispe**r-generated transcription.\n - The merged data is passed to **Google Gemini's chat model** to generate image prompts with precise timestamps.\n - The output is parsed and cleaned using a structured parser to ensure it's in ready-to-use JSON format for image generation.\n- Phase 5: **Images Generation**\n - The full list of timestamped prompts is is split into individual entries.\n - Each prompt is sent to **Leonardo's API** that turns text descriptions into visuals.\n - A delay of 30 seconds is added to give the image generation engine enough time to complete rendering.\n - Once completed, the workflow retrieves all final images for the next stage.\n- Phase 6: **Images To Video Conversion**\n - All generated images are sent to **Leonardo's API**, which stitches them together based on the structured prompts and timing.\n - A 5-minute wait allows time for rendering.\n - After the wait, the workflow retrieves the generated small videos and makes them downloadable.\n - Then, the tool aggregates all downloaded videos into a single unified structure, preparing them for the final editing.\n- Phase 7: **Video Editing and Downloading**\n - The raw video, along with timestamps or subtitles, is sent to **Shotstack**, a video editing tool that supports advanced edits.\n - A delay of 1 minute allows **Shotstack** to process the edit.\n - Then, the tool checks whether the edited video is finished by **Shotstack** and ready to be downloaded.\n - Once completed, you can download the final polished video to your local storage for later use.\n\n## How To Use\n- Download the workflow package.\n- Import the package into your n8n interface.\n- Set up necessary credentials for tools access and usability:\n + For Google Gemini access, please connect to its API in the following nodes:\n Node **Google Gemini Chat Model 1**\n Node **Google Gemini Chat Model 2**\n + For Google Drive access, please ensure connection in the following nodes:\n Node **Upload Audio to Drive**\n Node **Make Audio File Public**\n + For ElevenLabs access, please connect to its API in the following node:\n Node **Generate Voice**\n + For OpenAI Whisper access, please connect to its API in the following node:\n Node **Transcribe Audio with OpenAI Whisper**\n + For Leonardo access, please allow connection to its API in the following nodes:\n Node **Generate Images**\n Node **Generate Videos/Scenes**\n + For Shortstack access, please connect to its API in the following nodes:\n Node **Edit with Shotstack**\n Node **Render Final Video with Shotstack**\n- Input your video idea or short description as a string in Node **Fields - Set Idea** in n8n.\n- Run the workflow by clicking **Execute Workflow** or **Test Workflow**.\n- Wait the process to run and finish.\n- View the result in Node **Download Final Video** and download it in your local storage for later use.\n\n## Requirements\n- Basic setup in **Google Cloud Console** (OAuth or API Key method enabled) with enabled access to Google Drive.\n- **Google Gemini API** access with permission to use chat-based large language models.\n- **ElevenLabs API** access for generating high-quality voiceovers from scripts.\n- **OpenAI Whisper API** access to transcribe voiceovers into clean text.\n- **Leonardo API** access for both image and video generation tasks.\n- **Shotstack API** access for editing and rendering the final video with enhanced visuals and timing.\n\n## How To Customize\n- You can input your requested video topic or description directly in Node **Fields \u2013 Set Idea**.\n- By default, the script length is set to around 60 seconds in Node **60 Second Script Writer**. You can easily change this in the prompt to create shorter or longer videos based on your needs.\n- While the default setup uses **Google Gemini** for script and prompt generation, you can replace it with **OpenAI ChatGPT**, **Claude**, or any other compatible chat-based model you prefer.\n- The voiceover is currently created using **ElevenLabs**, but you\u2019re free to substitute it with other text-to-speech engines like **Google Cloud Text-to-Speech**, **HeyGen**, etc.\n- We're using **OpenAI Whisper** to transcribe the voiceover into text. You can switch to alternatives such as **AssemblyAI**, **Deepgram**, or other compatible providers depending on your preference.\n- This workflow uses **Leonardo** for both image and video generation. You can swap it out for other compatible providers based on availability or style preference.\n- Video editing is handled by **Shotstack** by default. You can plug in alternatives like **Runway**, **FFmpeg**, or other API-based editors depending on your editing needs or desired effects.\n\n\nIf you\u2019d like this workflow customized to fit your tools and platforms availability, or if you\u2019re looking to build a tailored AI Agent for your own business - please feel free to reach out to [**Agent Circle**](https://www.agentcircle.ai/). We\u2019re always here to support and help you to bring automation ideas to life.\n\n## Need Help?\nJoin our community on different platforms for support, inspiration and tips from others.\n\nWebsite: https://www.agentcircle.ai/\nEtsy: https://www.etsy.com/shop/AgentCircle\nGumroad: http://agentcircle.gumroad.com/\nDiscord Global: https://discord.gg/d8SkCzKwnP\nFB Page Global: https://www.facebook.com/agentcircle/\nFB Group Global: https://www.facebook.com/groups/aiagentcircle/\nX: https://x.com/agent_circle\nYouTube: https://www.youtube.com/@agentcircle\nLinkedIn: https://www.linkedin.com/company/agentcircle\n"
},
"typeVersion": 1
},
{
"id": "c34f4595-1f67-4141-999e-6650c88f1356",
"name": "Google Gemini Chat Model 2",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
600,
560
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "a046815f-556b-4d0e-a0c5-f31081fba0f8",
"name": "Google Gemini Chat Model 1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-880,
360
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e3c5aedf-6828-459c-9552-324567e4a928",
"name": "Make Audio File Public",
"type": "n8n-nodes-base.googleDrive",
"position": [
120,
320
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "share",
"permissionsUi": {
"permissionsValues": {
"role": "reader",
"type": "anyone"
}
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7942c242-9d3d-43e9-aa2b-07c43a302828",
"name": "Transcribe Audio with OpenAI Whisper",
"type": "n8n-nodes-base.httpRequest",
"position": [
20,
100
],
"parameters": {
"url": "https://api.openai.com/v1/audio/transcriptions",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "timestamp_granularities[]",
"value": "word"
},
{
"name": "model",
"value": "whisper-1"
},
{
"name": "response_format",
"value": "verbose_json"
},
{
"name": "file",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
},
"nodeCredentialType": "openAiApi"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "0d44a577-a9d6-4c67-84a8-3e9b0abfbc38",
"name": "Generate Videos/Scenes",
"type": "n8n-nodes-base.httpRequest",
"position": [
1900,
200
],
"parameters": {
"url": "https://cloud.leonardo.ai/api/rest/v1/generations-motion-svd",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "imageId",
"value": "={{ $json.generations_by_pk.generated_images[0].id }}"
},
{
"name": "motionStrength",
"value": 3
},
{
"name": "isPublic",
"value": true
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "0899c6d2-f54f-449c-8282-1bde6d8329cc",
"name": "Get Videos/Scenes",
"type": "n8n-nodes-base.httpRequest",
"position": [
2280,
200
],
"parameters": {
"url": "=https://cloud.leonardo.ai/api/rest/v1/generations/{{ $json.motionSvdGenerationJob.generationId }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "f6ab796f-17df-49c0-8bfb-7a1f3972175e",
"name": "Download Generated Videos/Scenes",
"type": "n8n-nodes-base.httpRequest",
"position": [
2460,
200
],
"parameters": {
"url": "={{ $json.generations_by_pk.generated_images[0].motionMP4URL }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "1c2a0287-993b-4a84-80fa-867da759672e",
"name": "Get Images",
"type": "n8n-nodes-base.httpRequest",
"position": [
1640,
200
],
"parameters": {
"url": "=https://cloud.leonardo.ai/api/rest/v1/generations/{{ $json.sdGenerationJob.generationId }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "1ed9d8c7-98d8-44b4-bb51-ed3bfe3d28a6",
"name": "Render Final Video with Shotstack",
"type": "n8n-nodes-base.httpRequest",
"position": [
3320,
200
],
"parameters": {
"url": "=https://api.shotstack.io/edit/stage/render/{{ $json.response.id }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "1173fde6-b688-4848-a49b-a5e403d0d61c",
"name": "Wait 30s",
"type": "n8n-nodes-base.wait",
"position": [
1460,
200
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "dc1a0674-e2ef-45b9-811b-7d87689b531c",
"name": "Download Final Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
3520,
200
],
"parameters": {
"url": "={{ $json.response.url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "a1697e1f-d1c3-4483-853e-78f180818bd4",
"name": "Sticky Note31",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1500,
-140
],
"parameters": {
"color": 3,
"width": 480,
"height": 880,
"content": "## 1. Provide Topic Input For Your Video\n- A short topic and idea should be entered into the **Idea** part in Node **Fields - Set Idea** before you trigger the process."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "16edc864-eb87-4a2c-b415-c6a468ba5e8e",
"connections": {
"Merge": {
"main": [
[
{
"node": "Generate Image Prompts",
"type": "main",
"index": 0
}
]
]
},
"Wait 30s": {
"main": [
[
{
"node": "Get Images",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Edit with Shotstack",
"type": "main",
"index": 0
}
]
]
},
"Get Images": {
"main": [
[
{
"node": "Generate Videos/Scenes",
"type": "main",
"index": 0
}
]
]
},
"Wait 1 min": {
"main": [
[
{
"node": "Render Final Video with Shotstack",
"type": "main",
"index": 0
}
]
]
},
"Wait 5 mins": {
"main": [
[
{
"node": "Get Videos/Scenes",
"type": "main",
"index": 0
}
]
]
},
"Split Prompts": {
"main": [
[
{
"node": "Generate Images",
"type": "main",
"index": 0
}
]
]
},
"Generate Voice": {
"main": [
[
{
"node": "Upload Audio to Drive",
"type": "main",
"index": 0
},
{
"node": "Transcribe Audio with OpenAI Whisper",
"type": "main",
"index": 0
}
]
]
},
"Generate Images": {
"main": [
[
{
"node": "Wait 30s",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Mode": {
"ai_languageModel": [
[]
]
},
"Fields - Set Idea": {
"main": [
[
{
"node": "60 Second Script Writer",
"type": "main",
"index": 0
}
]
]
},
"Get Videos/Scenes": {
"main": [
[
{
"node": "Download Generated Videos/Scenes",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[]
]
},
"Edit with Shotstack": {
"main": [
[
{
"node": "Wait 1 min",
"type": "main",
"index": 0
}
]
]
},
"Upload Audio to Drive": {
"main": [
[
{
"node": "Make Audio File Public",
"type": "main",
"index": 0
}
]
]
},
"Fields - Script Format": {
"main": [
[
{
"node": "Generate Voice",
"type": "main",
"index": 0
}
]
]
},
"Generate Image Prompts": {
"main": [
[
{
"node": "Split Prompts",
"type": "main",
"index": 0
}
]
]
},
"Generate Videos/Scenes": {
"main": [
[
{
"node": "Wait 5 mins",
"type": "main",
"index": 0
}
]
]
},
"Make Audio File Public": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"60 Second Script Writer": {
"main": [
[
{
"node": "Fields - Script Format",
"type": "main",
"index": 0
}
]
]
},
"Auto-fixing Output Parse": {
"ai_outputParser": [
[
{
"node": "Generate Image Prompts",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Structured Output Parser1": {
"ai_outputParser": [
[
{
"node": "Auto-fixing Output Parse",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Google Gemini Chat Model 1": {
"ai_languageModel": [
[
{
"node": "60 Second Script Writer",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Google Gemini Chat Model 2": {
"ai_languageModel": [
[
{
"node": "Auto-fixing Output Parse",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Generate Image Prompts",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Download Generated Videos/Scenes": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Render Final Video with Shotstack": {
"main": [
[
{
"node": "Download Final Video",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Fields - Set Idea",
"type": "main",
"index": 0
}
]
]
},
"Transcribe Audio with OpenAI Whisper": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
}
}
}
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.
googleDriveOAuth2ApigooglePalmApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Use cases are many: This tool is perfect for YouTube and Shorts creators who want to publish daily content without showing their face, TikTok and Reels marketers automating voice-over-driven videos, and solopreneurs scaling up their content without hiring a team. It’s also ideal…
Source: https://n8n.io/workflows/6014/ — 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.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Content - Write Best Tools In Category Article. Uses formTrigger, httpRequest, slack, chainLlm. Event-driven trigger; 41 nodes.
(from just and image to complete Shopify product page.)
Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.
This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.