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 →
{
"name": "Veo 3.1 \u2014 Finance Tip (Video-Only, Base Nodes)",
"nodes": [
{
"parameters": {},
"id": "ManualTrigger",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-560,
0
]
},
{
"parameters": {
"keepOnlySet": true,
"values": {
"string": [
{
"name": "topic",
"value": "One quick way to start a $1K emergency fund"
},
{
"name": "durationSeconds",
"value": "20"
},
{
"name": "aspectRatio",
"value": "9:16"
},
{
"name": "negativePrompt",
"value": "nudity, explicit, low quality, glitch, distorted, disfigured"
}
]
}
},
"id": "Config",
"name": "Config",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
-360,
0
]
},
{
"parameters": {
"keepOnlySet": true,
"values": {
"string": [
{
"name": "script",
"value": "Keep $20 from every paycheck in a separate high-interest savings account. Automate the transfer on payday so you never feel it. After 50 deposits you\u2019re at $1,000\u2014your emergency buffer. Keep it boring, keep it untouched. Follow for one small money win every day."
}
]
}
},
"id": "Script",
"name": "Script (Placeholder)",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
-160,
0
]
},
{
"parameters": {
"keepOnlySet": true,
"values": {
"string": [
{
"name": "prompt",
"value": "={{`Soft, photorealistic, vertical ${$node[\"Config\"].json[\"aspectRatio\"]} video (~${$node[\"Config\"].json[\"durationSeconds\"]}s) of an attractive adult woman delivering a calm, intimate personal-finance tip in a soft whisper. Professional and tasteful; avoid sexualization. Subtle head/eye movement, natural micro-expressions. Neutral background, shallow depth of field, soft key light.\n\nVOICEOVER (use exactly this text, paced to ${$node[\"Config\"].json[\"durationSeconds\"]}s):\n${$node[\"Script\"].json[\"script\"]}\n\nCompliance: educational only, no guarantees, no securities recommendations.\nRunId:${Date.now()}-${Math.random().toString(36).slice(2,8)}`}}"
},
{
"name": "aspectRatio",
"value": "={{$node[\"Config\"].json[\"aspectRatio\"]}}"
},
{
"name": "durationSeconds",
"value": "={{$node[\"Config\"].json[\"durationSeconds\"]}}"
},
{
"name": "negativePrompt",
"value": "={{$node[\"Config\"].json[\"negativePrompt\"]}}"
}
]
}
},
"id": "BuildPrompt",
"name": "Build Veo Prompt",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
40,
0
]
},
{
"parameters": {
"url": "https://generativelanguage.googleapis.com/v1beta/models/veo-3.1-generate-preview:predictLongRunning",
"method": "POST",
"sendBody": true,
"jsonParameters": true,
"responseFormat": "json",
"authentication": "none",
"headerParametersJson": "={\"x-goog-api-key\": $env.GEMINI_API_KEY, \"Content-Type\": \"application/json\"}",
"bodyParametersJson": "={\n \"instances\": [\n {\n \"prompt\": $json[\"/previousNode:Build Veo Prompt\"].prompt,\n \"aspectRatio\": $json[\"/previousNode:Build Veo Prompt\"].aspectRatio,\n \"durationSeconds\": Number($json[\"/previousNode:Build Veo Prompt\"].durationSeconds)\n }\n ],\n \"parameters\": {\n \"preset\": \"fast\",\n \"negativePrompt\": $json[\"/previousNode:Build Veo Prompt\"].negativePrompt\n }\n}"
},
"id": "VeoCreate",
"name": "Veo 3.1 \u2014 Create Job (Preview)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
300,
0
]
},
{
"parameters": {
"keepOnlySet": true,
"values": {
"string": [
{
"name": "operationName",
"value": "={{$json[\"name\"]}}"
}
]
}
},
"id": "StoreOperation",
"name": "Store Operation",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
520,
0
]
},
{
"parameters": {
"amount": 8,
"unit": "seconds"
},
"id": "Wait8s",
"name": "Wait 8s",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
520,
160
]
},
{
"parameters": {
"url": "={{\"https://generativelanguage.googleapis.com/v1beta/\" + $json[\"operationName\"]}}",
"method": "GET",
"responseFormat": "json",
"authentication": "none",
"headerParametersJson": "={\"x-goog-api-key\": $env.GEMINI_API_KEY}"
},
"id": "PollOperation",
"name": "Poll Operation",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
720,
60
]
},
{
"parameters": {
"conditions": {
"collection": [
{
"type": "boolean",
"value1": "={{$json.done === true}}"
}
]
}
},
"id": "IfDone",
"name": "Done?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
920,
60
]
},
{
"parameters": {
"amount": 5,
"unit": "seconds"
},
"id": "WaitLoop",
"name": "Wait (loop)",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
920,
-80
]
},
{
"parameters": {},
"id": "Loop",
"name": "Loop",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
1100,
-80
]
},
{
"parameters": {
"keepOnlySet": true,
"values": {
"string": [
{
"name": "videoUrl",
"value": "={{$json[\"response\"]?.[\"generateVideoResponse\"]?.[\"generatedSamples\"]?.[0]?.[\"video\"]?.[\"uri\"]}}"
}
]
}
},
"id": "ExtractUrl",
"name": "Extract Video URL",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
1100,
60
]
},
{
"parameters": {
"message": "\u2705 Veo render complete: {{$json[\"/previousNode:Extract Video URL\"].videoUrl}}",
"raiseMessage": true
},
"id": "Success",
"name": "Success",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
1300,
60
]
}
],
"connections": {
"Manual Trigger": {
"main": [
[
{
"node": "Config",
"type": "main",
"index": 0
}
]
]
},
"Config": {
"main": [
[
{
"node": "Script (Placeholder)",
"type": "main",
"index": 0
}
]
]
},
"Script (Placeholder)": {
"main": [
[
{
"node": "Build Veo Prompt",
"type": "main",
"index": 0
}
]
]
},
"Build Veo Prompt": {
"main": [
[
{
"node": "Veo 3.1 \u2014 Create Job (Preview)",
"type": "main",
"index": 0
}
]
]
},
"Veo 3.1 \u2014 Create Job (Preview)": {
"main": [
[
{
"node": "Store Operation",
"type": "main",
"index": 0
}
]
]
},
"Store Operation": {
"main": [
[
{
"node": "Poll Operation",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait 8s",
"type": "main",
"index": 0
}
]
]
},
"Wait 8s": {
"main": [
[
{
"node": "Poll Operation",
"type": "main",
"index": 0
}
]
]
},
"Poll Operation": {
"main": [
[
{
"node": "Done?",
"type": "main",
"index": 0
}
]
]
},
"Done?": {
"main": [
[
{
"node": "Extract Video URL",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait (loop)",
"type": "main",
"index": 0
}
]
]
},
"Wait (loop)": {
"main": [
[
{
"node": "Loop",
"type": "main",
"index": 0
}
]
]
},
"Loop": {
"main": [
[
{
"node": "Poll Operation",
"type": "main",
"index": 0
}
]
]
},
"Extract Video URL": {
"main": [
[
{
"node": "Success",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"meta": {
"version": "1.114.x",
"notes": "Pure base nodes. No Function/Code nodes. Placeholder script so it runs before wiring OpenAI."
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Veo 3.1 — Finance Tip (Video-Only, Base Nodes). Uses httpRequest. Event-driven trigger; 13 nodes.
Source: https://gist.github.com/allanzilber-boop/bba4ab738822bde9d39842aa471faed8 — 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 allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t
[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.
[](https://youtu.be/c7yCZhmMjtI)
This automation organizes your n8n workflows files into categorizes (Active, Template, Done, Archived) and uploads them directly to a categorized Google Drive folders. It is designed to help users man
Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.