AutomationFlowsAI & RAG › Workflow Veo 3

Workflow Veo 3

Workflow-Veo-3. Uses httpRequest, openAi, googleDrive. Event-driven trigger; 14 nodes.

Event trigger★★★★☆ complexityAI-powered14 nodesHTTP RequestOpenAIGoogle Drive
AI & RAG Trigger: Event Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Google Drive → HTTP Request 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 →

Download .json
{
  "name": "My workflow",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -880,
        720
      ],
      "id": "a89d22fb-dc80-4811-8d5d-994a731ad6b7",
      "name": "When clicking \u2018Execute workflow\u2019"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.replicate.com/v1/models/google/veo-3/predictions",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"input\": {\n    \"prompt\": \"{{ $json.message.content.replace(/\\n/g, ' ').replace(/\\r/g, ' ').replace(/\"/g, '\\'')}}\",\n    \"enhance_prompt\": true,\n    \"aspect_ratio\": \"16:9\",\n    \"duration\": \"8\"\n  }\n}",
        "options": {
          "timeout": 60000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        140,
        800
      ],
      "id": "9d2f0e95-e5f1-4ee3-bf38-b30198e42693",
      "name": "Start Video Generation",
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "prediction-id",
              "name": "prediction_id",
              "value": "={{ $json.id }}",
              "type": "string"
            },
            {
              "id": "attempt-counter",
              "name": "attempt_count",
              "value": 0,
              "type": "number"
            },
            {
              "id": "max-attempts",
              "name": "max_attempts",
              "value": 120,
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        420,
        800
      ],
      "id": "8bf4177e-47ce-49f7-8b3b-f8eb2fb21438",
      "name": "Store Prediction ID"
    },
    {
      "parameters": {
        "amount": 15
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        700,
        800
      ],
      "id": "eb0e9286-01a9-4505-a60c-b683d068439e",
      "name": "Wait 15 seconds"
    },
    {
      "parameters": {
        "url": "=https://api.replicate.com/v1/predictions/{{ $json.prediction_id }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "options": {
          "timeout": 30000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        980,
        800
      ],
      "id": "02c25b5a-5196-4b32-871f-6f3cd9a8e007",
      "name": "Check Video Status",
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 1
          },
          "conditions": [
            {
              "id": "video-ready",
              "leftValue": "={{ $json.status }}",
              "rightValue": "succeeded",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1260,
        800
      ],
      "id": "13369db9-7908-4db2-938d-5f253b694b3c",
      "name": "Check if Complete"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 1
          },
          "conditions": [
            {
              "id": "success-condition",
              "leftValue": "={{ $json.output }}",
              "rightValue": "http",
              "operator": {
                "type": "string",
                "operation": "contains"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1540,
        720
      ],
      "id": "3d299053-03c8-4bd6-a707-ca3d9950cfda",
      "name": "Check if Succeeded"
    },
    {
      "parameters": {
        "url": "=https://api.replicate.com/v1/predictions/{{ $json.id }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "options": {
          "timeout": 30000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1820,
        640
      ],
      "id": "6b140a12-d3c8-460a-87b5-02b36e60f400",
      "name": "Download Video",
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "increment-counter",
              "name": "attempt_count",
              "value": "={{ $('Store Prediction ID').item.json.attempt_count + 1 }}",
              "type": "number"
            },
            {
              "id": "keep-prediction-id",
              "name": "prediction_id",
              "value": "={{ $('Store Prediction ID').item.json.prediction_id }}",
              "type": "string"
            },
            {
              "id": "keep-max-attempts",
              "name": "max_attempts",
              "value": "={{ $('Store Prediction ID').item.json.max_attempts }}",
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1540,
        880
      ],
      "id": "800ee6d2-22ee-441a-87ef-a3d16e71d6f7",
      "name": "Increment Attempt Counter"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1820,
        800
      ],
      "id": "b0b14694-4491-4166-a29a-f2d3ce07ede5",
      "name": "Error or Timeout"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "4f9d462d-fa0d-4dda-9288-99909169975b",
              "name": "prompt",
              "value": "un Youtuber caminando por Roma impresionado con el arte, comiendo un helado. Y hablando un poco de historia",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -520,
        800
      ],
      "id": "767a2c8b-651b-4561-993f-ee3e84a172ea",
      "name": "Input Parameters1"
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "chatgpt-4o-latest",
          "mode": "list",
          "cachedResultName": "CHATGPT-4O-LATEST"
        },
        "messages": {
          "values": [
            {
              "content": "You're an expert in creating prompts for AI-powered video generation. Your job is to transform user ideas into detailed, cinematic prompts.\n\nRequired structure:\n[Establishing shot description]: Close-up selfie video shot from handheld phone perspective, dynamic and shaky movement\n[Subject details + environment]: \n[Energy/mood description]: High-energy, urgent and exciting yet casual YouTuber vibe, contrasting modern social media personality with historical chaos\n[Environment details]: 18th century French street scene with cobblestones, burning barricades, period buildings, revolutionary soldiers in tricorn hats and uniforms, smoke and fire effects, flags and banners\n[Subject action description]: YouTuber while maintaining selfie angle, speaking directly to camera with animated expressions and gestures, occasionally glancing back at the action behind her\n[Lighting]: Natural daylight with dramatic orange glow from fires and smoke, creating cinematic contrast between bright selfie lighting on subject's face and darker, atmospheric battlefield lighting\n[Style]: Modern social media aesthetic mixed with cinematic historical drama, handheld phone camera quality with slight motion blur, vibrant colors for the YouTuber contrasting with muted historical tones\n\n- DO NOT use the following symbols \"{,}\"\n- DO NOT use emojis\n- DO NOT use line breaks or unusual characters\n- Always have the dialogue in Spanish, but the rest of the text in English.\nMaintain narrative coherence and make sure the prompt is specific but not excessively long.",
              "role": "system"
            },
            {
              "content": "=Crea un prompt detallado para video basado en:  {{ $json.prompt }}"
            }
          ]
        },
        "options": {
          "maxTokens": 8000,
          "temperature": 0.7
        }
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        -240,
        800
      ],
      "id": "4328fdfc-4eba-4685-be6d-43c5c7b435c2",
      "name": "Prompt Generator1",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "name": "={{ $json.output.split('/').pop() }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "value": "1WtyTKvG3yW0yrbWKvDTN8q6KUx5gmeU4",
          "mode": "list",
          "cachedResultName": "VEO-3",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1WtyTKvG3yW0yrbWKvDTN8q6KUx5gmeU4"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        2280,
        640
      ],
      "id": "5b2a48cb-166e-499e-87b8-07268777c919",
      "name": "Google Drive",
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "url": "={{ $json.output }}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        2080,
        640
      ],
      "id": "47347128-c7fc-4612-8ec8-a1ef0014f352",
      "name": "HTTP Request",
      "alwaysOutputData": false
    }
  ],
  "connections": {
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Input Parameters1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Video Generation": {
      "main": [
        [
          {
            "node": "Store Prediction ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Prediction ID": {
      "main": [
        [
          {
            "node": "Wait 15 seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 15 seconds": {
      "main": [
        [
          {
            "node": "Check Video Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Video Status": {
      "main": [
        [
          {
            "node": "Check if Complete",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if Complete": {
      "main": [
        [
          {
            "node": "Check if Succeeded",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Increment Attempt Counter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if Succeeded": {
      "main": [
        [
          {
            "node": "Download Video",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Error or Timeout",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Increment Attempt Counter": {
      "main": [
        [
          {
            "node": "Wait 15 seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Input Parameters1": {
      "main": [
        [
          {
            "node": "Prompt Generator1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prompt Generator1": {
      "main": [
        [
          {
            "node": "Start Video Generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Video": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Google Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a1ea2516-d602-4362-b096-bcef8d943796",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "C04ENKd7IfnW0l2W",
  "tags": []
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Workflow-Veo-3. Uses httpRequest, openAi, googleDrive. Event-driven trigger; 14 nodes.

Source: https://gist.github.com/leifermendez/d78185ca8563e5dc4b612c044993ddc1 — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

The Problem That it Solves

Google Drive Trigger, OpenAI, Google Drive +5
AI & RAG

Scrape ads – Pulls Facebook Ad Library data for "ai automation" keywords using Apify Filter & sort – Filters ads by page likes (&gt;1,000) and separates into videos, images, and text ads Analyze creat

HTTP Request, Google Drive, OpenAI +3
AI & RAG

This workflow converts emailed timesheets into structured invoice rows in Google Sheets and stores them in the correct Google Drive folder structure.

Gmail Trigger, OpenAI, Google Sheets +2
AI & RAG

Voice Note -> Veo 3 AD. Uses telegramTrigger, telegram, openAi, httpRequest. Event-driven trigger; 49 nodes.

Telegram Trigger, Telegram, OpenAI +3
AI & RAG

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

Form Trigger, Google Drive, Email Send +3