This workflow follows the HTTP Request → 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 →
{
"name": "Veo 3.1 \u2014 Finance Tip (Video-Only, OpenAI base \u2192 Veo Preview)",
"nodes": [
{
"parameters": {},
"id": "ManualTrigger",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-560,
0
]
},
{
"parameters": {
"functionCode": "const runId = Date.now().toString(36)+'-'+Math.random().toString(36).slice(2,8);\nreturn [{json:{runId}}];"
},
"id": "MakeRunId",
"name": "Make runId",
"type": "n8n-nodes-base.function",
"typeVersion": 2,
"position": [
-380,
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": [
-200,
0
]
},
{
"parameters": {
"operation": "chat",
"model": "gpt-4.1",
"messages": [
{
"role": "system",
"content": "You write concise 20-second finance scripts (\u224845\u201360 words) for vertical videos. Tone: soft, confident, warm, non-preachy, actionable. No emojis. No tickers, no guarantees, no solicitation. Return only the spoken script\u2014no labels."
},
{
"role": "user",
"content": "Topic: {{$json[\"/previousNode:Config\"].topic}}\nAudience: beginners under money stress\nConstraint: 45\u201360 words max\nPersona: calm, intimate, reassuring feminine voice\nEnd with 1 gentle CTA to follow for daily tips"
}
]
},
"id": "OpenAI_Base",
"name": "Script (OpenAI \u2013 Chat)",
"type": "n8n-nodes-base.openAi",
"typeVersion": 4,
"position": [
40,
0
]
},
{
"parameters": {
"functionCode": "const res = items[0].json;\nconst text = res.choices?.[0]?.message?.content || res.data?.[0]?.content || res.text || '';\nconst cfg = $json['/previousNode:Config'];\nconst runId = $json['/previousNode:Make runId'].runId;\nconst prompt = `Soft, photorealistic, vertical ${cfg.aspectRatio} video (~${cfg.durationSeconds}s) of an attractive adult woman delivering a calm, intimate personal-finance tip in a soft whisper. Professional, tasteful; avoid sexualization. Subtle head/eye movement, natural micro-expressions. Clean neutral background, shallow depth of field, soft key light.\n\nVOICEOVER (use exactly this text, paced to ${cfg.durationSeconds}s):\\n${text}\n\nCompliance: educational only, no guarantees, no securities recommendations.\nRunId:${runId}`;\nreturn [{ json: { script: text, prompt, aspectRatio: cfg.aspectRatio, durationSeconds: Number(cfg.durationSeconds), negativePrompt: cfg.negativePrompt } }];"
},
"id": "BuildVeoPrompt",
"name": "Build Veo Prompt",
"type": "n8n-nodes-base.function",
"typeVersion": 2,
"position": [
260,
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 { \"prompt\": $json.prompt, \"aspectRatio\": $json.aspectRatio, \"durationSeconds\": $json.durationSeconds }\n ],\n \"parameters\": { \"preset\": \"fast\", \"negativePrompt\": $json.negativePrompt }\n}"
},
"id": "VeoCreate",
"name": "Veo 3.1 \u2014 Create Job (Preview)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
520,
0
]
},
{
"parameters": {
"keepOnlySet": true,
"values": {
"string": [
{
"name": "operationName",
"value": "={{$json[\"name\"]}}"
}
]
}
},
"id": "StoreOperation",
"name": "Store Operation",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
720,
0
]
},
{
"parameters": {
"amount": 8,
"unit": "seconds"
},
"id": "Wait8s",
"name": "Wait 8s",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
720,
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": [
920,
60
]
},
{
"parameters": {
"conditions": {
"collection": [
{
"type": "boolean",
"value1": "={{$json.done === true}}"
}
]
}
},
"id": "IfDone",
"name": "Done?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1120,
60
]
},
{
"parameters": {
"amount": 5,
"unit": "seconds"
},
"id": "WaitLoop",
"name": "Wait (loop)",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
1120,
-80
]
},
{
"parameters": {
"functionCode": "return items;"
},
"id": "Loop",
"name": "Loop",
"type": "n8n-nodes-base.function",
"typeVersion": 2,
"position": [
1300,
-80
]
},
{
"parameters": {
"functionCode": "const op = items[0].json;\nconst url = op?.response?.generateVideoResponse?.generatedSamples?.[0]?.video?.uri;\nif (!url) throw new Error('Operation complete but no video URL found.');\nreturn [{ json: { videoUrl: url } }];"
},
"id": "ExtractUrl",
"name": "Extract Video URL",
"type": "n8n-nodes-base.function",
"typeVersion": 2,
"position": [
1320,
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": [
1520,
60
]
}
],
"connections": {
"Manual Trigger": {
"main": [
[
{
"node": "Make runId",
"type": "main",
"index": 0
}
]
]
},
"Make runId": {
"main": [
[
{
"node": "Config",
"type": "main",
"index": 0
}
]
]
},
"Config": {
"main": [
[
{
"node": "Script (OpenAI \u2013 Chat)",
"type": "main",
"index": 0
}
]
]
},
"Script (OpenAI \u2013 Chat)": {
"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": "Uses base OpenAI node. Veo via AI Studio HTTP. No exotic nodes so imports cleanly."
}
}
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, OpenAI base → Veo Preview). Uses openAi, httpRequest. Event-driven trigger; 14 nodes.
Source: https://gist.github.com/allanzilber-boop/9f1bafcbbb075c603fdbd65f9e37c26d — 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.
Ask questions like “How much did I spend on food last month?” and get instant answers from your financial data — directly in Telegram.
The Problem That it Solves
This intelligent email automation workflow helps you maximize engagement through domain-based outreach. It utilizes AI-powered personalization and strategic follow-ups to increase response rates. The
Note: Now includes an Apify alternative for Rapid API (Some users can't create new accounts on Rapid API, so I have added an alternative for you. But immediately you are able to get access to Rapid AP
Scrape ads – Pulls Facebook Ad Library data for "ai automation" keywords using Apify Filter & sort – Filters ads by page likes (>1,000) and separates into videos, images, and text ads Analyze creat