This workflow corresponds to n8n.io template #13085 — we link there as the canonical source.
This workflow follows the Agent → Blotaton8N Nodes Blotato 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 →
{
"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
}
]
]
}
}
}
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.
blotatoApigooglePalmApihttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically creates short-form AI videos using Sora 2 Cameos, powered by n8n and AI agents.
Source: https://n8n.io/workflows/13085/ — 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.
kisisel asistan. Uses toolWorkflow, toolHttpRequest, toolCalculator, toolThink. Scheduled trigger; 43 nodes.
Automatically generate viral short-form health videos using AI and publish them to social platforms with n8n and Veo 3. This workflow collects viral ideas, analyzes engagement patterns, generates AI v
This workflow is ideal for: Content creators who want to replicate successful LinkedIn strategies Social media managers monitoring competitor content performance Marketing teams analyzing trending top
Overview
Generate AI Viral Videos with VEO 3 and Upload to TikTok. Uses toolThink, outputParserStructured, googleSheets, agent. Scheduled trigger; 24 nodes.