{
  "id": "t0lp3QCoEA7KBVi6",
  "name": "AI videos with Sora 2 Cameos",
  "tags": [],
  "nodes": [
    {
      "id": "b80d7c0f-23bd-49a0-8859-f1eb143113a8",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1296,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 1152,
        "content": "### Video Generation\nAutomatically creates AI videos using Sora 2 Cameos based on generated prompts, with retry and status handling."
      },
      "typeVersion": 1
    },
    {
      "id": "875f6c25-175c-4aa2-9687-d0d334895a9e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1760,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 1152,
        "content": "### Video Merges\nMerges, processes, and finalizes video outputs into a publish-ready format."
      },
      "typeVersion": 1
    },
    {
      "id": "3dcc173b-5660-45d8-bb90-dd97726a6b9d",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2080,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 1152,
        "content": "### Auto Publishing\nAutomatically publishes videos to multiple social platforms (TikTok, Facebook, Instagram)."
      },
      "typeVersion": 1
    },
    {
      "id": "85729f71-c04b-4a93-a0c0-08f83ca487b8",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2464,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 1152,
        "content": "### Logging & Status Tracking\nUpdates Google Sheets with success or error status for monitoring and analytics."
      },
      "typeVersion": 1
    },
    {
      "id": "c2dae1ed-7001-4b63-81e6-ba6920fce2f4",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 2256,
        "height": 304,
        "content": "### Viral Content Collector\nAutomatically collects viral content ideas for AI video creation."
      },
      "typeVersion": 1
    },
    {
      "id": "57f9c9b9-5f81-4c0a-aa10-64f15392755e",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 704,
        "height": 1152,
        "content": "### Prompt & Script Generation\nAnalyzes viral content and uses AI to generate structured video prompts and scripts optimized for Sora 2 Cameos."
      },
      "typeVersion": 1
    },
    {
      "id": "4ce28d56-06a9-4c46-be84-dfc5f5aee3c5",
      "name": "Daily Content Scheduler",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        688,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "fac463de-b27b-4561-8dad-3f74e01c7e7b",
      "name": "Fetch Viral Content Dataset",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        928,
        0
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "list",
          "value": "GdWCkxBtKWOsKjdch",
          "cachedResultUrl": "https://console.apify.com/actors/GdWCkxBtKWOsKjdch/input",
          "cachedResultName": "TikTok Scraper (clockworks/tiktok-scraper)"
        },
        "timeout": {},
        "operation": "Run actor and get dataset",
        "customBody": "={\n    \"excludePinnedPosts\": false,\n    \"profileScrapeSections\": [\n        \"videos\"\n    ],\n    \"profileSorting\": \"popular\",\n    \"profiles\": [\n        \"@donal.store\"\n    ],\n    \"proxyCountryCode\": \"VN\",\n    \"resultsPerPage\": 10,\n    \"scrapeRelatedVideos\": false,\n    \"shouldDownloadAvatars\": false,\n    \"shouldDownloadCovers\": false,\n    \"shouldDownloadMusicCovers\": false,\n    \"shouldDownloadSlideshowImages\": false,\n    \"shouldDownloadSubtitles\": false,\n    \"shouldDownloadVideos\": true,\n    \"videoKvStoreIdOrName\": \"my-tiktok-ASMR\"\n}",
        "authentication": "apifyOAuth2Api"
      },
      "typeVersion": 1
    },
    {
      "id": "be55f7c2-716c-4893-af5d-e85dee06d9d1",
      "name": "Normalize Content Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        1200,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "2927eb2d-7868-4945-b7c7-163782fc0044",
              "name": "Caption",
              "type": "string",
              "value": "={{ $json.text }}"
            },
            {
              "id": "8b7c1f39-207f-4433-9694-9aa4c5ac8c55",
              "name": "Date Post",
              "type": "string",
              "value": "={{ $json.createTimeISO.toDateTime().format('dd/LL/yyyy') }}"
            },
            {
              "id": "3be36a1b-f1c3-4b44-b265-bd79ab6bddbe",
              "name": "Username",
              "type": "string",
              "value": "={{ $json.authorMeta.name }}"
            },
            {
              "id": "25128c7b-b6e0-4c63-8bcb-c71866976737",
              "name": "Link user",
              "type": "string",
              "value": "={{ $json.authorMeta.profileUrl }}"
            },
            {
              "id": "ada46de7-8651-422a-bf7a-a958aad7ce28",
              "name": "Link video",
              "type": "string",
              "value": "={{ $json.webVideoUrl }}"
            },
            {
              "id": "92d4e87b-9cc9-4609-8e17-383c61ca3058",
              "name": "VideoURL",
              "type": "array",
              "value": "={{ $json.mediaUrls }}"
            },
            {
              "id": "1f428824-106f-49f3-8816-92c7ff9ef324",
              "name": "Likes",
              "type": "number",
              "value": "={{ $json.diggCount }}"
            },
            {
              "id": "5f1c9240-7a37-424e-8318-333c8de42797",
              "name": "Shares",
              "type": "number",
              "value": "={{ $json.shareCount }}"
            },
            {
              "id": "56c177a1-b382-4674-8308-45f9423a6e54",
              "name": "View",
              "type": "number",
              "value": "={{ $json.playCount }}"
            },
            {
              "id": "73cb5bb3-bdbf-406b-a778-bf36e935ead9",
              "name": "Save",
              "type": "number",
              "value": "={{ $json.collectCount }}"
            },
            {
              "id": "a8bbcfbe-7c37-4f78-9e9d-ad9387a581d1",
              "name": "Hasgtag",
              "type": "array",
              "value": "={{ $json.hashtags }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "bb187067-1533-4414-8609-ceccbe27d3f1",
      "name": "Save Viral Content to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1440,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "View": "={{$json.View }}",
            "Likes": "={{ $json.Likes }}",
            "Shares": "={{ $json.Shares }}",
            "Status": "Pending",
            "Caption": "={{ $json.Caption }}",
            "Username": "{{ $json.Username }}",
            "VideoURL": "={{ $json.VideoURL[0] }}",
            "Date Post": "={{ $json['Date Post'] }}",
            "Link user": "={{ $json['Link user'] }}",
            "Link video": "={{ $json['Link video'] }}"
          },
          "schema": [
            {
              "id": "Caption",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date Post",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date Post",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Username",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Username",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link user",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Link user",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link video",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Link video",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "VideoURL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "VideoURL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Likes",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Likes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Shares",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Shares",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "View",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "View",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Save",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Save",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Hasgtag",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Hasgtag",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4/edit?usp=drivesdk",
          "cachedResultName": "Sora Cameos"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "9dfc9a29-9f41-4935-ad86-d5d4efe79542",
      "name": "Video Processing Scheduler",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        688,
        368
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "66891aca-93d0-4202-8654-c6c62100f588",
      "name": "Load Viral Content",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        896,
        368
      ],
      "parameters": {
        "options": {
          "returnFirstMatch": true
        },
        "filtersUI": {
          "values": [
            {
              "lookupValue": "Pending",
              "lookupColumn": "Status"
            },
            {
              "lookupValue": "Pending",
              "lookupColumn": "Status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4/edit#gid=0",
          "cachedResultName": "Trang t\u00ednh1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4/edit?usp=drivesdk",
          "cachedResultName": "Sora Cameos"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "0fdc3458-243f-4e08-99d3-67ef0fab1b75",
      "name": "Analyze Viral Idea",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        1120,
        368
      ],
      "parameters": {
        "text": "Detailed video description including detailed analysis of setting and characters (no description with watermark if any)",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-3-pro-preview",
          "cachedResultName": "models/gemini-3-pro-preview"
        },
        "options": {},
        "resource": "video",
        "operation": "analyze",
        "videoUrls": "={{ $json.VideoURL }}"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "379ea756-c13c-4da6-9e2e-a49fa4010366",
      "name": "AI Script & Prompt Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        944,
        624
      ],
      "parameters": {
        "text": "=Reference analysis extracted from the video: {{ $json.content.parts[0].text }}\n",
        "options": {
          "systemMessage": "=MAIN CHARACTER REFERENCE:\nAll videos must revolve around ONE consistent main character, referenced as @cameo\nThis person represents someone on a personal development journey.\nAll scenes, actions, and spoken thoughts belong to the same person.\n\n\n\nVOICE PROFILE (FIXED AND UNCHANGING):\nThe spoken narration in ALL prompts must strictly follow the SAME voice profile:\n\nTone: gentle, calm, and warm\n\nStyle: sharing and reflective, as if speaking softly to oneself or a close friend\n\nPace: slow and steady, no rush\n\nEmotion: sincere, grounded, and composed\n\nDelivery: neutral and even, no strong emphasis, no dramatic shifts\n\nPerspective: first-person only\n\nThis voice profile is constant and must NOT change between prompts.\nDo NOT reinterpret, exaggerate, or vary the voice style in any prompt.\n\nINPUT:\nYou will receive a reference analysis of a successful personal development video.\nThis input includes key insights, reflections, or short spoken ideas that performed well.\n\nTASK:\nTransform the input into TWO SEPARATE video prompts.\nEach prompt represents ONE complete short-form video of approximately 15 seconds.\n\nFor each video prompt:\n\nPlace the same person into a calm, everyday lifestyle vlog scene\n\nEmbed spoken narration directly into the prompt\n\nEnsure the narration follows the FIXED VOICE PROFILE exactly\n\nWrite narration in first-person perspective\n\nEach video must feel complete on its own\n\nAcross both prompts:\n\nThe narration must sound as if spoken by the same person in the same emotional state\n\nWhen the two videos are played back-to-back, the voice must feel continuous and unified\n\nYour ONLY output must strictly follow the JSON structure below:\n{\n  \"title\": \"Overall title for the video series\",\n  \"description\": \"1\u20133 sentences summarizing the main message\",\n  \"prompts\": [\n    \"Video prompt #1 \u2013 15-second video, gentle tone, sharing style, following the voice profile\",\n    \"Video prompt #2 \u2013 15-second video, KEEP the SAME voice profile, no changes in tone or style\"\n  ]\n}\n\nRules:\n\nOutput valid JSON only.\n\nDo not include explanations or extra text outside the JSON.\n\nDo NOT create a separate script or dialogue section.\n\nThe voice must be embedded naturally inside each prompt.\n\nAvoid hype, teaching tone, selling language, or dramatic storytelling.\n\nPrompts must be safe, non-violent, and platform-friendly.\n\n\nEnsure the narration follows the FIXED VOICE PROFILE exactly\n\nWrite narration in first-person perspective\n\nEach video must feel complete on its own\n\nAcross both prompts:\n\nThe narration must sound as if spoken by the same person in the same emotional state\n\nWhen the two videos are played back-to-back, the voice must feel continuous and seamless"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "b32b4115-e3da-4c33-a481-ec7f402d5c1d",
      "name": "Reasoning Engine",
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "position": [
        928,
        816
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "ec3ddaca-df72-495a-a2fb-f958edee3a03",
      "name": "Parse Script Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1024,
        880
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"prompts\": [\n    {\n      \"prompt\": \"string\"\n    }\n    \n  ]\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "65b6d1e8-f94a-42f5-8f4d-698fe7f1c4b1",
      "name": "Gemini LLM",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        704,
        720
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-3-pro-preview"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5eda7ff6-b0d1-4310-a6a4-2ef982005877",
      "name": "Split Video Prompt",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1440,
        352
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.prompts"
      },
      "typeVersion": 1
    },
    {
      "id": "2d0f4341-cc2e-4924-b503-8ac0f5a5a8b7",
      "name": "Generate Sora Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1456,
        560
      ],
      "parameters": {
        "url": "https://api.geminigen.ai/uapi/v1/video-gen/sora",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "prompt",
              "value": "={{ $json.prompt }}"
            },
            {
              "name": "model",
              "value": "sora-2"
            },
            {
              "name": "resolution",
              "value": "small"
            },
            {
              "name": "duration",
              "value": "15"
            },
            {
              "name": "aspect_ratio",
              "value": "portrait"
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "8c6cbce3-7cce-4e1a-ac14-92dda477147a",
      "name": "Render Status Check1",
      "type": "n8n-nodes-base.switch",
      "position": [
        1472,
        1168
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Processing",
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "f59af75f-b4aa-4c00-9c8c-5e89ea224cff",
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.status }}",
                    "rightValue": 1
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Completed",
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "95b628d6-c13a-49cc-8d8e-7bdd3a77c3ca",
                    "operator": {
                      "type": "number",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.status }}",
                    "rightValue": 2
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Failed",
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "43a3ecb8-6e35-434c-8364-bda3429b7a57",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.status }}",
                    "rightValue": "3"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {},
        "looseTypeValidation": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "b8adf756-c964-497f-b976-85ee50438cc4",
      "name": "Get Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1456,
        976
      ],
      "parameters": {
        "url": "=https://api.geminigen.ai/uapi/v1/history/{{ $json.uuid }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.3
    },
    {
      "id": "d21b9012-7fad-400a-81a3-cd5c0a097d26",
      "name": "Aggregate Video Parts",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1872,
        464
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "generated_video[0].video_url"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ab96d636-9f49-4b22-b511-c663f200a80b",
      "name": "Prepare Video Metadata",
      "type": "n8n-nodes-base.code",
      "position": [
        1872,
        720
      ],
      "parameters": {
        "jsCode": "// 1. L\u1ea5y item \u0111\u1ea7u ti\u00ean t\u1eeb node Aggregate\nconst item = $input.first();\n\n// 2. L\u1ea5y danh s\u00e1ch link (\u0111ang l\u00e0 m\u1ea3ng c\u00e1c chu\u1ed7i text)\n// D\u1eef li\u1ec7u l\u1ea5y t\u1eeb tr\u01b0\u1eddng 'video_url'\nconst originalUrls = item.json.video_url; \n\n// 3. Bi\u1ebfn \u0111\u1ed5i th\u00e0nh d\u1ea1ng [{\"video_url\": \"link1\"}, {\"video_url\": \"link2\"}]\nconst formattedList = originalUrls.map(url => ({\n    video_url: url\n}));\n\n// 4. T\u1ea1o object t\u1ed5ng theo \u0111\u00fang c\u1ea5u tr\u00fac y\u00eau c\u1ea7u\nconst finalObject = {\n    video_urls: formattedList,\n    id: \"2323\"\n};\n\n// 5. Tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3\n// Quan tr\u1ecdng: D\u00f9ng JSON.stringify() \u0111\u1ec3 bi\u1ebfn object th\u00e0nh chu\u1ed7i text nh\u01b0 b\u1ea1n mu\u1ed1n\nreturn {\n    json: {\n        output: JSON.stringify(finalObject)\n    }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "bf682a1b-a5ed-4532-9cb0-350ac1281fbf",
      "name": "Merge Video Clips",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1888,
        960
      ],
      "parameters": {
        "url": "=https://no-code-architects-toolkit-843211623372.us-central1.run.app/v1/video/concatenate",
        "method": "POST",
        "options": {
          "redirect": {
            "redirect": {}
          }
        },
        "jsonBody": "={{ $json.output }}",
        "sendBody": true,
        "contentType": "=json",
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {}
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "68f10f92-c592-4edb-99f2-844adfbeaafd",
      "name": "Publish to TikTok",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "onError": "continueErrorOutput",
      "position": [
        2192,
        528
      ],
      "parameters": {
        "options": {},
        "platform": "tiktok",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "23867",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/23867",
          "cachedResultName": "kytagiang"
        },
        "postContentText": "={{ $('AI Agent1').item.json.output.title }}",
        "postContentMediaUrls": "={{ $json.response }}"
      },
      "credentials": {
        "blotatoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "2c5547b2-5ebf-4f0f-853d-c3583a574589",
      "name": "Publish to Facebook",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "onError": "continueErrorOutput",
      "position": [
        2192,
        816
      ],
      "parameters": {
        "options": {},
        "platform": "facebook",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "16978",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/16978",
          "cachedResultName": "Giang VT"
        },
        "facebookPageId": {
          "__rl": true,
          "mode": "list",
          "value": "884148598111681",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/16978/subaccounts/884148598111681",
          "cachedResultName": "Qu\u1ef3nh Hoa Tr\u1ea7n AI"
        },
        "postContentText": "={{ $('AI Agent1').item.json.output.title }}",
        "postContentMediaUrls": "={{ $json.response }}"
      },
      "credentials": {
        "blotatoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "6561b970-a1fa-4c8d-b6bb-a2ea6fa415a8",
      "name": "Publish to Instagram",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "onError": "continueErrorOutput",
      "position": [
        2208,
        1120
      ],
      "parameters": {
        "options": {},
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "25299",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/25299",
          "cachedResultName": "giangxai.aff"
        },
        "postContentText": "={{ $('AI Agent1').item.json.output.title }}.\n{{ $('AI Agent1').item.json.output.description }}",
        "postContentMediaUrls": "={{ $json.response }}"
      },
      "credentials": {
        "blotatoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "4c18ae2b-509b-4e1f-a735-b46cb46c14b7",
      "name": "Update Success Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2672,
        752
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Done",
            "row_number": "={{ $('Load Viral Content').item.json.row_number }}"
          },
          "schema": [
            {
              "id": "Caption",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date Post",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Date Post",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Username",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Username",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link user",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Link user",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link video",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Link video",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "VideoURL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "VideoURL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Likes",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Likes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Shares",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Shares",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "View",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "View",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Save",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Save",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Hasgtag",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Hasgtag",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4/edit#gid=0",
          "cachedResultName": "Trang t\u00ednh1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4/edit?usp=drivesdk",
          "cachedResultName": "Sora Cameos"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "db2a54c4-c5ce-4be6-b917-892dbb36266d",
      "name": "Update Error Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2656,
        976
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Error",
            "row_number": "={{ $('Load Viral Content').item.json.row_number }}"
          },
          "schema": [
            {
              "id": "Caption",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date Post",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Date Post",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Username",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Username",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link user",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Link user",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link video",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Link video",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "VideoURL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "VideoURL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Likes",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Likes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Shares",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Shares",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "View",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "View",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Save",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Save",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Hasgtag",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Hasgtag",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4/edit#gid=0",
          "cachedResultName": "Trang t\u00ednh1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/12gO8JoMveX2vcM_mZBSe2HSJB3zKrjUer6NkkQoxaG4/edit?usp=drivesdk",
          "cachedResultName": "Sora Cameos"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "fb947e43-07cd-43ea-bfd2-bb21c88a8a38",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -80
      ],
      "parameters": {
        "width": 592,
        "height": 1456,
        "content": "# \ud83d\udee0\ufe0f Workflow Setup Guide\n\nAuthor: [GiangxAI](https://www.youtube.com/@giangxai.official)\n\n## How it works\n- Viral video ideas are automatically collected and stored in Google Sheets  \n- A Sora 2 Cameos character is selected on Sora2.com and used as the video avatar  \n- Each idea is analyzed and converted into a structured AI video script and prompt  \n- Sora 2 Cameos generates AI video clips based on the prompts  \n- Video clips are merged into a single final video  \n- The video is published to social platforms via Blotato  \n- Google Sheets is updated with publishing status and results  \n\nThe entire workflow runs on a schedule and operates end-to-end without manual editing.\n\n---\n\n## Setup guide\n- Connect Google Sheets for content intake and status tracking  \n- Select and configure a Cameos character on Sora2.com  \n- Add credentials for your AI model (e.g. Gemini)  \n- Add Sora 2 Cameos API credentials for video generation  \n- Connect Blotato for automated publishing  \n- Adjust the schedule to control video creation and publishing frequency  \n\nSetup is fast and requires no coding knowledge.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "833e02ad-82f8-4706-a7e4-512a94c566ec",
      "name": "Wait for Render",
      "type": "n8n-nodes-base.wait",
      "position": [
        1456,
        768
      ],
      "parameters": {},
      "typeVersion": 1.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "5f5a13e2-8ec6-4b1f-aed8-ea7eb888b572",
  "connections": {
    "Get Video": {
      "main": [
        [
          {
            "node": "Render Status Check1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini LLM": {
      "ai_languageModel": [
        [
          {
            "node": "Parse Script Output",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "AI Script & Prompt Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Render": {
      "main": [
        [
          {
            "node": "Get Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reasoning Engine": {
      "ai_tool": [
        [
          {
            "node": "AI Script & Prompt Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Merge Video Clips": {
      "main": [
        [
          {
            "node": "Publish to Facebook",
            "type": "main",
            "index": 0
          },
          {
            "node": "Publish to TikTok",
            "type": "main",
            "index": 0
          },
          {
            "node": "Publish to Instagram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Publish to TikTok": {
      "main": [
        [
          {
            "node": "Update Success Status",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update Error Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Viral Idea": {
      "main": [
        [
          {
            "node": "AI Script & Prompt Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Load Viral Content": {
      "main": [
        [
          {
            "node": "Analyze Viral Idea",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Video Prompt": {
      "main": [
        [
          {
            "node": "Generate Sora Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Sora Video": {
      "main": [
        [
          {
            "node": "Wait for Render",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Script Output": {
      "ai_outputParser": [
        [
          {
            "node": "AI Script & Prompt Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Publish to Facebook": {
      "main": [
        [
          {
            "node": "Update Success Status",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update Error Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Publish to Instagram": {
      "main": [
        [
          {
            "node": "Update Success Status",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update Error Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Render Status Check1": {
      "main": [
        [
          {
            "node": "Wait for Render",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Aggregate Video Parts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Video Parts": {
      "main": [
        [
          {
            "node": "Prepare Video Metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Video Metadata": {
      "main": [
        [
          {
            "node": "Merge Video Clips",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Content Scheduler": {
      "main": [
        [
          {
            "node": "Fetch Viral Content Dataset",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Script & Prompt Agent": {
      "main": [
        [
          {
            "node": "Split Video Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Content Fields": {
      "main": [
        [
          {
            "node": "Save Viral Content to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Video Processing Scheduler": {
      "main": [
        [
          {
            "node": "Load Viral Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Viral Content Dataset": {
      "main": [
        [
          {
            "node": "Normalize Content Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}