{
  "name": "Approve Veo 3.1 videos in Telegram before posting to TikTok, Reels and YouTube Shorts",
  "nodes": [
    {
      "id": "e913ed17-8716-4a6b-a59f-4e41277cc7a1",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -657,
        -121
      ],
      "parameters": {
        "width": 520,
        "height": 792,
        "content": "## Approve AI videos in Telegram before they are posted\nAdd a video idea to Google Sheets and review the finished clip on your phone. Gemini plans it, Veo 3.1 renders it, and PostWire posts it to TikTok, Instagram Reels and YouTube Shorts only after you tap Approve in Telegram.\n\n### How it works\n1. **New idea in Google Sheets** fires when you add a row.\n2. **Plan the video with Gemini** returns the Veo prompt, a caption for each network and the YouTube title.\n3. **Generate the clip with Veo 3.1** renders 8 seconds in 9:16 and the file goes straight to a PostWire upload slot.\n4. **Send the clip to Telegram** shows you the video with its captions, and **Ask for approval in Telegram** waits for your Approve or Decline.\n5. On Approve, **Publish with PostWire** posts each network with its own text. The row and the chat get the links, or the exact fix for each network that refused. On Decline the row is marked declined.\n\n### Setup\n1. Create a free account at postwire.io, connect your networks and copy your API key. In n8n add a **Header Auth** credential (name `Authorization`, value `Bearer pw_live_…`) and select it in the three PostWire nodes.\n2. Create a sheet with the columns idea, status, links and note, and pick it in the trigger and the three Sheets nodes.\n3. Add a Google Gemini credential with billing enabled (about one dollar per 8-second Veo 3.1 Fast clip).\n4. Create a bot with @BotFather, select its credential in the four Telegram nodes and type your chat ID in **Read the plan**.\n\n### Customize\nEdit the networks in Read the plan, or the video style in the Gemini system message."
      },
      "typeVersion": 1
    },
    {
      "id": "32441106-14a4-4fa3-a462-2d61e1d8747b",
      "name": "Sticky Note 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -77,
        -121
      ],
      "parameters": {
        "color": 7,
        "width": 518,
        "height": 295,
        "content": "## 1. Idea from Google Sheets\nA new row is the idea; rows without one, or already handled, are skipped."
      },
      "typeVersion": 1
    },
    {
      "id": "aee936f1-0175-413a-aee8-9ceaa4209c27",
      "name": "Sticky Note 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        519,
        -97
      ],
      "parameters": {
        "color": 7,
        "width": 521,
        "height": 271,
        "content": "## 2. Plan with Gemini\nOne Veo prompt and a caption for each network."
      },
      "typeVersion": 1
    },
    {
      "id": "cbb9f5a7-2e62-4dc1-ad96-eadb4e2f7efb",
      "name": "Sticky Note 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1147,
        -97
      ],
      "parameters": {
        "color": 7,
        "width": 1106,
        "height": 271,
        "content": "## 3. Render with Veo 3.1 and upload\nAn upload slot, the 9:16 clip from Veo, then its link. No public link needed."
      },
      "typeVersion": 1
    },
    {
      "id": "54cc2f0f-c179-4f9c-a5e0-58b9e16fef75",
      "name": "Sticky Note 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -53,
        263
      ],
      "parameters": {
        "color": 7,
        "width": 794,
        "height": 271,
        "content": "## 4. Review in Telegram\nThe clip and its captions arrive in your chat; the workflow waits for Approve or Decline."
      },
      "typeVersion": 1
    },
    {
      "id": "e085758a-dc33-4c14-aead-2c76b35b07fa",
      "name": "Sticky Note 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        823,
        263
      ],
      "parameters": {
        "color": 7,
        "width": 1159,
        "height": 511,
        "content": "## 5. Publish, log and report\nApproved clips go to every network; the row and the chat get the links or the fix. Declined ideas are marked in the sheet."
      },
      "typeVersion": 1
    },
    {
      "id": "62c41f14-0c2e-458b-a971-2a8f382eef0d",
      "name": "New idea in Google Sheets",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ccecd753-a4ea-432b-a187-ebfd17d2c994",
      "name": "Only new ideas",
      "type": "n8n-nodes-base.filter",
      "position": [
        300,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ea29636a-311e-4c9f-a2ff-5aaaba2f6fef",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ String($json.idea || '').trim() }}",
              "rightValue": ""
            },
            {
              "id": "a87d1919-b529-47b1-a987-e4adc97c7735",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ String($json.status || '').trim() }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4c2cbeb3-81e8-47a2-ac94-807441476fca",
      "name": "Plan the video with Gemini",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        600,
        0
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "models/gemini-2.5-flash"
        },
        "options": {
          "systemMessage": "You plan one 8-second vertical (9:16) video for short-form social media. Return JSON with the keys veo_prompt (one paragraph for Veo: subject, action, camera movement, lighting, ambient sound; no on-screen text, no logos, no real people), tiktok (a hook of up to 150 characters with 3 hashtags), instagram (2 sentences and up to 5 hashtags), youtube_title (a searchable title of up to 90 characters), youtube (a 2-sentence description), linkedin (2 short professional paragraphs) and facebook (1 or 2 conversational sentences)."
        },
        "messages": {
          "values": [
            {
              "content": "={{ 'Idea: ' + $json.idea }}"
            }
          ]
        },
        "resource": "text",
        "operation": "message",
        "jsonOutput": true
      },
      "typeVersion": 1.2
    },
    {
      "id": "d0990b52-7969-4058-a3fb-e2b63a80b62a",
      "name": "Read the plan",
      "type": "n8n-nodes-base.set",
      "position": [
        900,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "0c124b44-c039-4655-a452-1d33b1f22270",
              "name": "plan",
              "type": "object",
              "value": "={{ JSON.parse($('Plan the video with Gemini').item.json.content.parts.map(p => p.text || '').join('')) }}"
            },
            {
              "id": "097fdc6b-e586-46b3-aec6-72b345bde003",
              "name": "idea",
              "type": "string",
              "value": "={{ String($('Only new ideas').item.json.idea).trim() }}"
            },
            {
              "id": "654a87b0-08b6-4d6a-ab77-be1828448e0a",
              "name": "networks",
              "type": "array",
              "value": "={{ ['tiktok', 'instagram', 'youtube'] }}"
            },
            {
              "id": "72ae6d1f-84b5-4d01-a5d1-9892e2d18ac5",
              "name": "telegram_chat_id",
              "type": "string",
              "value": "YOUR_CHAT_ID"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5a1fd547-568e-4eeb-a54b-14557e9742bf",
      "name": "Get an upload slot",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1200,
        0
      ],
      "parameters": {
        "url": "https://postwire.io/api/media/upload-url",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "neverError": true
            }
          }
        },
        "jsonBody": "={{ JSON.stringify({ content_type: 'video/mp4' }) }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "beb3da6c-dd12-4bb1-aa03-77b88db0a9d2",
      "name": "Generate the clip with Veo 3.1",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        1500,
        0
      ],
      "parameters": {
        "prompt": "={{ $('Read the plan').item.json.plan.veo_prompt }}",
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "models/veo-3.1-fast-generate-preview"
        },
        "options": {
          "aspectRatio": "9:16",
          "durationSeconds": 8
        },
        "resource": "video",
        "returnAs": "video",
        "operation": "generate"
      },
      "typeVersion": 1.2
    },
    {
      "id": "5ec6fa28-c2dd-4347-a470-82fd665a46f9",
      "name": "Upload the clip",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1800,
        0
      ],
      "parameters": {
        "url": "={{ $('Get an upload slot').item.json.upload_url }}",
        "method": "PUT",
        "options": {},
        "sendBody": true,
        "contentType": "binaryData",
        "inputDataFieldName": "data"
      },
      "typeVersion": 4.2
    },
    {
      "id": "5381784e-c9f7-465e-ac2b-4253fa6c715a",
      "name": "Get the video link",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2100,
        0
      ],
      "parameters": {
        "url": "https://postwire.io/api/media/finalize",
        "method": "GET",
        "options": {
          "response": {
            "response": {
              "neverError": true
            }
          }
        },
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "path",
              "value": "={{ $('Get an upload slot').item.json.path }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3eb4bd1f-2745-40dd-ab04-fb5be4b207c4",
      "name": "Send the clip to Telegram",
      "type": "n8n-nodes-base.telegram",
      "onError": "continueRegularOutput",
      "position": [
        0,
        360
      ],
      "parameters": {
        "file": "={{ $json.media_url }}",
        "chatId": "={{ $('Read the plan').item.json.telegram_chat_id }}",
        "resource": "message",
        "operation": "sendVideo",
        "binaryData": false,
        "additionalFields": {
          "caption": "={{ (() => { const p = $('Read the plan').item.json; const c = p.plan; return String(('TikTok: ' + (c.tiktok || p.idea) + '\\n\\nInstagram: ' + (c.instagram || p.idea) + '\\n\\nYouTube: ' + (c.youtube_title || p.idea)).slice(0, 900)).replace(/&/g, '&amp;').replace(/</g, '&lt;'); })() }}",
          "parse_mode": "HTML"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d9587fde-25fa-4842-a473-43b3272a0b64",
      "name": "Ask for approval in Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        300,
        360
      ],
      "parameters": {
        "chatId": "={{ $('Read the plan').item.json.telegram_chat_id }}",
        "message": "Publish this video? Approve posts it to TikTok, Instagram Reels and YouTube Shorts with the captions above. Decline discards it.",
        "options": {
          "appendAttribution": false
        },
        "resource": "message",
        "operation": "sendAndWait",
        "responseType": "approval",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "approveLabel": "Approve",
            "disapproveLabel": "Decline"
          }
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5f0418b2-8f8c-4631-aaf2-6ea261b0675f",
      "name": "Approved?",
      "type": "n8n-nodes-base.if",
      "position": [
        600,
        360
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "a7751091-409d-4939-a7c5-542447b8ba8d",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.data.approved }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "87f3b11a-f0fe-44f0-a632-0fca9df5bc98",
      "name": "Publish with PostWire",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        900,
        360
      ],
      "parameters": {
        "url": "https://postwire.io/api/post",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "neverError": true
            }
          }
        },
        "jsonBody": "={{ (() => { const p = $('Read the plan').item.json; const c = p.plan; return JSON.stringify({ platforms: p.networks, text: p.idea, title: c.youtube_title, video_url: $('Get the video link').item.json.media_url, per_platform: Object.fromEntries(p.networks.map(n => [n, n === 'youtube' ? { text: c.youtube || p.idea, title: c.youtube_title } : { text: c[n] || p.idea }])), options: { tiktok: { ai_generated: true }, youtube: { ai_generated: true } }, idempotency_key: ('approved-' + p.idea).slice(0, 200) }); })() }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "fb77ef90-c71a-4e9e-a5b1-d2c43c1f7131",
      "name": "Every network published?",
      "type": "n8n-nodes-base.if",
      "position": [
        1200,
        360
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3470ed7d-000c-4427-a1b6-67945f8b0fd7",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ ($json.results || []).length > 0 && $json.results.every(r => r.ok) }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "3072c343-7b25-477e-ac99-b4b31ce002fc",
      "name": "Log the links",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1500,
        360
      ],
      "parameters": {
        "columns": {
          "value": {
            "idea": "={{ $('Read the plan').item.json.idea }}",
            "note": "",
            "links": "={{ ($json.results || []).filter(r => r.ok).map(r => r.platform + ' ' + (r.url || '')).join(' | ') }}",
            "status": "posted"
          },
          "schema": [
            {
              "id": "idea",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "links",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "links",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "note",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "idea"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "96e84aa9-4b7c-403b-ad07-3d85c85fdfaa",
      "name": "Log the failure",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1500,
        600
      ],
      "parameters": {
        "columns": {
          "value": {
            "idea": "={{ $('Read the plan').item.json.idea }}",
            "note": "={{ $json.error ? $json.error : ($json.results || []).filter(r => !r.ok).map(r => r.platform + ': ' + (r.fix || r.error)).join(' | ') }}",
            "links": "={{ ($json.results || []).filter(r => r.ok).map(r => r.platform + ' ' + (r.url || '')).join(' | ') }}",
            "status": "={{ ($json.posted || 0) > 0 ? 'partly posted' : 'needs fix' }}"
          },
          "schema": [
            {
              "id": "idea",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "links",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "links",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "note",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "idea"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "082f7a3d-9c6b-4ffb-ae82-00b9c4317566",
      "name": "Send the links to Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1800,
        360
      ],
      "parameters": {
        "text": "={{ 'Published everywhere:\\n' + String(($('Publish with PostWire').item.json.results || []).map(r => r.platform + '  ' + (r.url || 'processing, the link appears in PostWire')).join('\\n')).replace(/&/g, '&amp;').replace(/</g, '&lt;') }}",
        "chatId": "={{ $('Read the plan').item.json.telegram_chat_id }}",
        "resource": "message",
        "operation": "sendMessage",
        "additionalFields": {
          "parse_mode": "HTML",
          "appendAttribution": false
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3ee24661-984d-4c35-a6e4-af696b515e4a",
      "name": "Send the fix to Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1800,
        600
      ],
      "parameters": {
        "text": "={{ 'Not published everywhere:\\n' + String((() => { const r = $('Publish with PostWire').item.json; return r.error ? r.error : (r.results || []).map(x => (x.ok ? 'Published  ' : 'NOT published  ') + x.platform + (x.url ? '  ' + x.url : '') + (x.ok ? '' : '\\n    ' + (x.fix || x.error))).join('\\n'); })()).replace(/&/g, '&amp;').replace(/</g, '&lt;') }}",
        "chatId": "={{ $('Read the plan').item.json.telegram_chat_id }}",
        "resource": "message",
        "operation": "sendMessage",
        "additionalFields": {
          "parse_mode": "HTML",
          "appendAttribution": false
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "adf2509b-67b8-4fd7-a33c-0205586f81d4",
      "name": "Mark the idea as declined",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        900,
        600
      ],
      "parameters": {
        "columns": {
          "value": {
            "idea": "={{ $('Read the plan').item.json.idea }}",
            "note": "={{ 'Declined in Telegram on ' + $now.toFormat('yyyy-MM-dd HH:mm') }}",
            "links": "",
            "status": "declined"
          },
          "schema": [
            {
              "id": "idea",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "links",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "links",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "note",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "note",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "idea"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.7
    }
  ],
  "connections": {
    "Approved?": {
      "main": [
        [
          {
            "node": "Publish with PostWire",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark the idea as declined",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log the links": {
      "main": [
        [
          {
            "node": "Send the links to Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read the plan": {
      "main": [
        [
          {
            "node": "Get an upload slot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Only new ideas": {
      "main": [
        [
          {
            "node": "Plan the video with Gemini",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log the failure": {
      "main": [
        [
          {
            "node": "Send the fix to Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload the clip": {
      "main": [
        [
          {
            "node": "Get the video link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get an upload slot": {
      "main": [
        [
          {
            "node": "Generate the clip with Veo 3.1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get the video link": {
      "main": [
        [
          {
            "node": "Send the clip to Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Publish with PostWire": {
      "main": [
        [
          {
            "node": "Every network published?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every network published?": {
      "main": [
        [
          {
            "node": "Log the links",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log the failure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New idea in Google Sheets": {
      "main": [
        [
          {
            "node": "Only new ideas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send the clip to Telegram": {
      "main": [
        [
          {
            "node": "Ask for approval in Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Plan the video with Gemini": {
      "main": [
        [
          {
            "node": "Read the plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ask for approval in Telegram": {
      "main": [
        [
          {
            "node": "Approved?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate the clip with Veo 3.1": {
      "main": [
        [
          {
            "node": "Upload the clip",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "active": false
}
