This workflow corresponds to n8n.io template #8709 — we link there as the canonical source.
This workflow follows the Form Trigger → 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": "GWfJ5QEvxgj7hwGk",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Generate video clips from your multiple image references",
"tags": [],
"nodes": [
{
"id": "1005ae66-14cf-45c1-9985-6826d1a46bb2",
"name": "Get status",
"type": "n8n-nodes-base.httpRequest",
"position": [
848,
848
],
"parameters": {
"url": "=https://queue.fal.run/fal-ai/vidu/requests/{{ $('Create Video').item.json.request_id }}/status ",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "d465656d-63ab-4808-8485-bb8347ed9e4b",
"name": "Wait 60 sec.",
"type": "n8n-nodes-base.wait",
"position": [
672,
848
],
"parameters": {
"amount": 60
},
"typeVersion": 1.1
},
{
"id": "7b4245a3-cbc2-424b-a25c-83556fd39c6c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-448
],
"parameters": {
"color": 3,
"width": 740,
"height": 280,
"content": "# Generate video clips from your multiple image references \n\nThis workflow automates the process of creating **short videos from multiple image references** (up to 7 images). It uses \"Vidu Reference to Video\" model, a video generation API to transform a user-provided prompt and image set into a consistent, **AI-generated video**.\n\nThis workflow automates the process of generating AI-powered videos from a set of reference images and then uploading them to **TikTok** and **Youtube**. The process is initiated via a user-friendly web form.\n\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "39916deb-3484-4bec-88d9-e6bea0767aea",
"name": "Completed?",
"type": "n8n-nodes-base.if",
"position": [
1024,
848
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "383d112e-2cc6-4dd4-8985-f09ce0bd1781",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "COMPLETED"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "9ab2e491-b400-4dc3-942a-9b096df01e0a",
"name": "Set data",
"type": "n8n-nodes-base.set",
"position": [
224,
848
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "c713d31f-9abd-496a-ac79-e8e2efe60aa0",
"name": "prompt",
"type": "string",
"value": "={{ $('On form submission').item.json.Prompt }}"
},
{
"id": "2308096c-702f-4ed1-9de3-c77d9685609e",
"name": "reference_images",
"type": "array",
"value": "={{ $json.reference_image_urls }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "5a2aabe2-fc28-4c7e-95d8-c3254a79ba07",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
320
],
"parameters": {
"width": 740,
"height": 100,
"content": "## STEP 2 - MAIN FLOW\nStart the workflow manually or periodically by hooking the \"Schedule Trigger\" node. It is recommended to set it at 5 minute intervals."
},
"typeVersion": 1
},
{
"id": "e74aaeda-72a1-4314-adc2-ba9bebecc2ad",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-128
],
"parameters": {
"width": 740,
"height": 140,
"content": "## STEP 1 - GET API KEY (YOURAPIKEY)\nCreate an account [here](https://fal.ai/) and obtain API KEY.\nIn the node \"Create Image\" set \"Header Auth\" and set:\n- Name: \"Authorization\"\n- Value: \"Key YOURAPIKEY\""
},
"typeVersion": 1
},
{
"id": "aa057777-f20c-43a7-b3f9-8e29f5c5790e",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
784
],
"parameters": {
"width": 180,
"height": 200,
"content": "Set API Key created in Step 1"
},
"typeVersion": 1
},
{
"id": "36c9571b-63b1-4ee5-afc4-6abe916cf7e5",
"name": "Create Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
448,
848
],
"parameters": {
"url": "https://queue.fal.run/fal-ai/vidu/q1/reference-to-video",
"method": "POST",
"options": {},
"jsonBody": "={\n \"prompt\": \"{{ $json.prompt }}\",\n \"reference_image_urls\": {{ $json.reference_images.toJsonString() }},\n \"aspect_ratio\": \"16:9\",\n \"movement_amplitude\": \"auto\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "34769b60-f9af-4604-a152-b72c02a341e4",
"name": "Get Url Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
-224,
1232
],
"parameters": {
"url": "=https://queue.fal.run/fal-ai/vidu/requests/{{ $json.request_id }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "782e998d-b27a-4496-8580-0e2d6ef1edce",
"name": "Get File Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
400,
1232
],
"parameters": {
"url": "={{ $('Get Url Video').item.json.video.url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "05b36f6c-088c-417f-bd42-93dc1f136d9d",
"name": "Upload Video",
"type": "n8n-nodes-base.googleDrive",
"position": [
688,
1104
],
"parameters": {
"name": "={{ $now.format('yyyyLLddHHmmss') }}-{{ $('Get Url Video').item.json.video.file_name }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1aHRwLWyrqfzoVC8HoB-YMrBvQ4tLC-NZ",
"cachedResultUrl": "https://drive.google.com/drive/folders/1aHRwLWyrqfzoVC8HoB-YMrBvQ4tLC-NZ",
"cachedResultName": "Fal.run"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "68e3a0ec-cafc-404b-9207-aad38c18df76",
"name": "Generate title",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
32,
1232
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-5-mini",
"cachedResultName": "GPT-5-MINI"
},
"options": {},
"messages": {
"values": [
{
"content": "=Input: {{ $('Set data').item.json.prompt }}"
},
{
"role": "system",
"content": "You are a YouTube SEO expert specialized in creating engaging and optimized titles.\n\nYour task is to generate an effective title for a YouTube video based on the user's video description.\n\nGUIDELINES:\n- Maximum 60 characters to avoid truncation\n- Use relevant keywords for SEO\n- Make the title catchy and clickable\n- Avoid excessive or misleading clickbait\n- Consider the target audience of the content\n- Use numbers, questions, or power words when appropriate\n- IMPORTANT: Generate the title in the same language as the input description\n\nOUTPUT FORMAT:\nProvide only the title, without additional explanations.\n\nEXAMPLE:\nInput: \"Tutorial video on how to cook perfect pasta carbonara\"\nOutput: \"PERFECT Carbonara in 10 Minutes - Chef's Secrets\""
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "51a03784-517c-426b-aeac-a368356fc7e2",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
672,
1264
],
"parameters": {
"width": 180,
"height": 408,
"content": "Set YOUR_USERNAME in Step 2"
},
"typeVersion": 1
},
{
"id": "0b120ffe-4b4d-45e3-ac7c-d5b40d05f9f6",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
48
],
"parameters": {
"width": 740,
"height": 232,
"content": "## STEP 2 - Upload video on Youtube and TikTok\n- Find your API key in your [Upload-Post Manage Api Keys](https://www.upload-post.com/?linkId=lp_144414&sourceId=n3witalia&tenantId=upload-post-app) 10 FREE uploads per month\n- Set the the \"Auth Header\":\n-- Name: Authorization\n-- Value: Apikey YOUR_API_KEY_HERE\n- Create profiles to manage your social media accounts. The \"Profile\" you choose will be used in the field YOUR_USRNAME (eg. test1 or test2). \n\n\nThe free plan allows uploads to all platforms except TikTok. To enable, please upgrade to a paid plan."
},
"typeVersion": 1
},
{
"id": "8b29d074-bb1d-4ee2-9ed3-8e72bdf8804b",
"name": "Upload on TikTok",
"type": "n8n-nodes-base.httpRequest",
"position": [
688,
1520
],
"parameters": {
"url": "https://api.upload-post.com/api/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "title",
"value": "={{ $('Generate title').item.json.message.content }}"
},
{
"name": "user",
"value": "YOUR_USERNAME"
},
{
"name": "platform[]",
"value": "tiktok"
},
{
"name": "video",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "c3103fc9-9ecb-4b79-936e-94bd738736d5",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-192,
848
],
"parameters": {
"options": {},
"formTitle": "Reference to video",
"formFields": {
"values": [
{
"fieldLabel": "Prompt",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "Reference images",
"requiredField": true
}
]
},
"formDescription": "In \"Refernce images\" add url images separated by comma eg:\n\nhttps://url.com/1.jpg,\nhttps://url.com/1.jpg,\nhttps://url.com/1.jpg\n"
},
"typeVersion": 2.2
},
{
"id": "2bd86ffe-6d0d-4edb-8c4a-0cdbdb4c8c7f",
"name": "Array",
"type": "n8n-nodes-base.code",
"position": [
16,
848
],
"parameters": {
"jsCode": "// Ottieni il campo con la stringa originale (modifica il campo se necessario)\nconst inputString = $json[\"Reference images\"];\n\n// 1. Rimuove spazi extra e newline\n// 2. Divide la stringa in un array\n// 3. Filtra gli elementi vuoti\n// 4. Ritorna come array JSON\n\nconst urlsArray = inputString\n .split(/,\\s*|\\r\\n+/) // divide su virgole e newline\n .filter(url => url.trim() !== \"\");\n\nreturn [\n {\n json: {\n reference_image_urls: urlsArray\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "433bc667-f6c3-49aa-8dca-d8a874907123",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
464
],
"parameters": {
"color": 4,
"width": 736,
"height": 272,
"content": "## Example On Form Submit\nPrompt:\nThe girl is showing a pair of shoes to the monkey in the forest\n\nReference images:\nhttps://n3wstorage.b-cdn.net/n3witalia/result3.png,\nhttps://n3wstorage.b-cdn.net/n3witalia/shoes.png,\nhttps://n3wstorage.b-cdn.net/n3witalia/monkey.jpeg\n\nResult:\nhttps://n3wstorage.b-cdn.net/n3witalia/output_reference.mp4\n\n"
},
"typeVersion": 1
},
{
"id": "008f1fba-bef8-42d9-8cd2-697edfe63be3",
"name": "Upload to Youtube",
"type": "n8n-nodes-base.httpRequest",
"position": [
688,
1328
],
"parameters": {
"url": "https://api.upload-post.com/api/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "title",
"value": "={{ $('Generate title').item.json.message.content }}"
},
{
"name": "user",
"value": "YOUR_USERNAME"
},
{
"name": "platform[]",
"value": "youtube"
},
{
"name": "video",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "dc322de2-ed82-4836-9169-b477f2ddf8a4",
"connections": {
"Array": {
"main": [
[
{
"node": "Set data",
"type": "main",
"index": 0
}
]
]
},
"Set data": {
"main": [
[
{
"node": "Create Video",
"type": "main",
"index": 0
}
]
]
},
"Completed?": {
"main": [
[
{
"node": "Get Url Video",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait 60 sec.",
"type": "main",
"index": 0
}
]
]
},
"Get status": {
"main": [
[
{
"node": "Completed?",
"type": "main",
"index": 0
}
]
]
},
"Create Video": {
"main": [
[
{
"node": "Wait 60 sec.",
"type": "main",
"index": 0
}
]
]
},
"Upload Video": {
"main": [
[]
]
},
"Wait 60 sec.": {
"main": [
[
{
"node": "Get status",
"type": "main",
"index": 0
}
]
]
},
"Get Url Video": {
"main": [
[
{
"node": "Generate title",
"type": "main",
"index": 0
}
]
]
},
"Generate title": {
"main": [
[
{
"node": "Get File Video",
"type": "main",
"index": 0
}
]
]
},
"Get File Video": {
"main": [
[
{
"node": "Upload Video",
"type": "main",
"index": 0
},
{
"node": "Upload to Youtube",
"type": "main",
"index": 0
},
{
"node": "Upload on TikTok",
"type": "main",
"index": 0
}
]
]
},
"Upload to Youtube": {
"main": [
[]
]
},
"On form submission": {
"main": [
[
{
"node": "Array",
"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.
googleDriveOAuth2ApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates the process of creating short videos from multiple image references (up to 7 images). It uses "Vidu Reference to Video" model, a video generation API to transform a user-provided prompt and image set into a consistent, AI-generated video.
Source: https://n8n.io/workflows/8709/ — 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.
Goal: This workflow demonstrates the full fluidX THE EYE integration — starting a live session, inviting both the customer (via SMS) and the service agent (via email), and then accessing the media (ph
This workflow is ideal for content creators, training providers, agencies, and businesses that need to quickly turn raw videos into polished, captioned, or narrated content — without hiring editors or
What it is An automated LinkedIn content system that takes a simple form (idea + optional file), generates LinkedIn posts with OpenAI, stores them in Notion, builds Google Slides carousels, and auto-p
Automate the entire process of converting any website or domain into clean, structured, AI-ready knowledge bases for Large Language Models (LLMs), semantic search, and chatbot development. URL Input v
In this tutorial, I’ll show how to create UGC (User Generated Content) videos automatically using n8n and Sora 2.