This workflow corresponds to n8n.io template #16939 — 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": "BF3oWyUchDWdSmC8",
"meta": {
"builderVariant": "mcp",
"aiBuilderAssisted": true
},
"name": "Generate a talking avatar video from an image and post to TikTok",
"tags": [],
"nodes": [
{
"id": "d9f6d3cf-590f-4210-82dd-8e25c7938d2d",
"name": "When clicking 'Execute workflow'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
0,
96
],
"parameters": {},
"typeVersion": 1
},
{
"id": "4fea8b75-088e-40a1-94d2-2047ef02fbb1",
"name": "Configuration",
"type": "n8n-nodes-base.set",
"position": [
224,
96
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a1",
"name": "atlas_model",
"type": "string",
"value": "bytedance/seedance-2.0/image-to-video"
},
{
"id": "a2",
"name": "image_url",
"type": "string",
"value": "https://your-storage.com/portrait.jpg"
},
{
"id": "a3",
"name": "video_prompt",
"type": "string",
"value": "A friendly female presenter looks at the camera and says: \"Tomorrow in New York the weather will be clear and partly cloudy, with a high of 25 degrees.\" She is expressive and speaks naturally."
},
{
"id": "a4",
"name": "aspect_ratio",
"type": "string",
"value": "9:16"
},
{
"id": "a5",
"name": "resolution",
"type": "string",
"value": "720p"
},
{
"id": "a6",
"name": "video_duration",
"type": "number",
"value": 5
},
{
"id": "a7",
"name": "fps",
"type": "number",
"value": 24
},
{
"id": "a8",
"name": "poll_interval_seconds",
"type": "number",
"value": 10
},
{
"id": "a9",
"name": "tiktok_privacy_level",
"type": "string",
"value": "PUBLIC_TO_EVERYONE"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "c65b3612-ba6a-46cb-a1ca-cdbc2d7536aa",
"name": "Generate video (Seedance 2.0)",
"type": "n8n-nodes-base.httpRequest",
"position": [
416,
96
],
"parameters": {
"url": "https://api.atlascloud.ai/api/v1/model/generateVideo",
"method": "POST",
"options": {},
"jsonBody": "={ \"model\": \"{{ $('Configuration').item.json.atlas_model }}\", \"prompt\": {{ JSON.stringify($('Configuration').item.json.video_prompt) }}, \"image_url\": \"{{ $('Configuration').item.json.image_url }}\", \"duration\": {{ $('Configuration').item.json.video_duration }}, \"resolution\": \"{{ $('Configuration').item.json.resolution }}\", \"aspect_ratio\": \"{{ $('Configuration').item.json.aspect_ratio }}\", \"fps\": {{ $('Configuration').item.json.fps }} }",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "a01e3bc7-96db-43be-8506-8bc49b0a71e2",
"name": "Wait for generation",
"type": "n8n-nodes-base.wait",
"position": [
608,
96
],
"parameters": {
"amount": "={{ $('Configuration').item.json.poll_interval_seconds }}"
},
"typeVersion": 1.1
},
{
"id": "8b14af30-4c97-4164-bcab-848f6eae4966",
"name": "Get generation status",
"type": "n8n-nodes-base.httpRequest",
"position": [
816,
96
],
"parameters": {
"url": "=https://api.atlascloud.ai/api/v1/model/prediction/{{ $('Generate video (Seedance 2.0)').item.json.data.id }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "3b959c29-b05b-45eb-a985-1a10c5ceefa6",
"name": "Is video ready?",
"type": "n8n-nodes-base.if",
"position": [
1008,
96
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "c1",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "completed"
},
{
"id": "c2",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "succeeded"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c1e09c20-4185-4ae6-a6bd-1697028cd88c",
"name": "Set video URL",
"type": "n8n-nodes-base.set",
"position": [
1312,
80
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "v1",
"name": "video_url",
"type": "string",
"value": "={{ $('Get generation status').item.json.data.outputs[0] }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "9945cbd2-562e-423f-b4ca-0c92ea9e0ef4",
"name": "Generate TikTok title",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1456,
80
],
"parameters": {
"text": "=Video description: {{ $('Configuration').item.json.video_prompt }}",
"options": {
"systemMessage": "You are a TikTok expert specialized in creating engaging, optimized titles.\n\nGenerate ONE effective title for a TikTok video based on the user's video description.\n\nGUIDELINES:\n- Maximum 60 characters to avoid truncation\n- Catchy and clickable, but not misleading clickbait\n- Use power words, numbers or questions when relevant\n- Write the title in the SAME language as the description\n\nOUTPUT: Provide only the title, with no quotes and no explanation."
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "5c966998-c3a6-40ca-bbc4-30338d2f8f65",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1472,
240
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "gpt-4.1-mini"
},
"options": {},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "8786fc5c-29b4-4e62-99a3-73413e66f96d",
"name": "Post to TikTok",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1792,
80
],
"parameters": {
"options": {},
"platform": "tiktok",
"accountId": {
"__rl": true,
"mode": "list",
"value": "9332",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/9332",
"cachedResultName": "docteur.firas"
},
"postContentText": "={{ $('Generate TikTok title').item.json.output }}",
"postContentMediaUrls": "={{ $('Set video URL').item.json.video_url }}",
"postCreateTiktokOptionPrivacyLevel": "={{ $('Configuration').item.json.tiktok_privacy_level }}",
"postCreateTiktokOptionIsAiGenerated": true
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "0e93b762-9fc1-4c77-8fa3-c4b8c3d296cf",
"name": "Main overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-640,
-144
],
"parameters": {
"width": 560,
"height": 1212,
"content": "# Generate a talking avatar video from an image and post to TikTok\n\n# \ud83d\udce5 [Open full documentation on Notion](https://automatisation.notion.site/Generate-a-talking-avatar-video-from-an-image-and-post-to-TikTok-Course-support-EN-3983d6550fd981bf8f89d9d72e59cccd)\n\nTurn one portrait image and a short script into a talking-avatar video with a native voice, then auto-publish it to TikTok with [Blotato](https://blotato.com/?ref=firas). The video is generated by Seedance 2.0 Image-to-Video on [AtlasCloud](https://www.atlascloud.ai/?ref=8QKPJE), which animates the face and creates lip-synced audio directly from your prompt.\n\n## How it works\n- Set your image, script and video options in the Configuration node.\n- Seedance 2.0 generates a talking video (with native audio) from the first-frame image + prompt.\n- The workflow polls the video API until the status is completed.\n- OpenAI writes a short, engaging TikTok title (under 60 characters).\n- The video is published to your connected TikTok account.\n\n## Setup\n1. AtlasCloud: add your API key as an HTTP Header Auth credential and select it on both AtlasCloud nodes.\n2. OpenAI: use the credential named \"OpenAi account\".\n3. Blotato: connect your TikTok account, then pick it in the Post to TikTok node.\n4. Open Configuration and set image_url, video_prompt, aspect_ratio, resolution and video_duration.\n\n## Requirements\n- AtlasCloud account (Seedance 2.0 image-to-video)\n- OpenAI API key\n- Blotato account with a connected TikTok account\n- n8n self-hosted, or n8n Cloud with Verified Community Nodes enabled (Blotato is a community node)\n\n## Customization\n- Change aspect_ratio to 16:9 (landscape) or 1:1 (square).\n- Adjust video_duration and resolution (720p / 1080p-SR / 1440p-SR).\n- Edit the title system prompt to match your brand voice.\n- Duplicate the Blotato node to cross-post to YouTube, Instagram, etc.\n\nNote: Blotato is a community node, so template previews show a \"?\" instead of its logo. Add a workflow screenshot when submitting to the n8n catalog."
},
"typeVersion": 1
},
{
"id": "50a30dbe-e7a4-4741-bc8a-33d746a7c35c",
"name": "Section 1 - Configuration",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-144
],
"parameters": {
"color": 7,
"width": 260,
"height": 492,
"content": "## 1. Configure your inputs\nEverything you can adjust is here: image_url, video_prompt, aspect_ratio, resolution, video_duration and the poll interval. All downstream nodes read from this single node."
},
"typeVersion": 1
},
{
"id": "d9af77a3-621c-4ae3-853e-c746fdb0871a",
"name": "Section 2 - Generate video",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-144
],
"parameters": {
"color": 7,
"width": 900,
"height": 492,
"content": "## 2. Generate the talking video with Seedance 2.0\n[AtlasCloud](https://www.atlascloud.ai/?ref=8QKPJE) animates the first-frame image and adds native lip-synced audio, then we poll until the status is completed or succeeded.\n\n\u26a0\ufe0f HTTP Header Auth cannot be attached automatically. Open both AtlasCloud HTTP nodes and select your \"AtlasCloud API\" credential."
},
"typeVersion": 1
},
{
"id": "f03028ea-ff50-44d5-a4b4-375bb90d0112",
"name": "Section 3 - Title and publish",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
-144
],
"parameters": {
"color": 7,
"width": 720,
"height": 500,
"content": "## 3. Write a title and publish to TikTok\nOpenAI drafts a short TikTok title (under 60 characters), then [Blotato](https://blotato.com/?ref=firas) publishes the video to your connected TikTok account.\n\nAI-content honesty: postCreateTiktokOptionIsAiGenerated is set to true."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": true,
"executionOrder": "v1"
},
"versionId": "4f830b3f-134f-44b7-a9b1-9329ba21f189",
"nodeGroups": [],
"connections": {
"Configuration": {
"main": [
[
{
"node": "Generate video (Seedance 2.0)",
"type": "main",
"index": 0
}
]
]
},
"Set video URL": {
"main": [
[
{
"node": "Generate TikTok title",
"type": "main",
"index": 0
}
]
]
},
"Is video ready?": {
"main": [
[
{
"node": "Set video URL",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait for generation",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Generate TikTok title",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Wait for generation": {
"main": [
[
{
"node": "Get generation status",
"type": "main",
"index": 0
}
]
]
},
"Generate TikTok title": {
"main": [
[
{
"node": "Post to TikTok",
"type": "main",
"index": 0
}
]
]
},
"Get generation status": {
"main": [
[
{
"node": "Is video ready?",
"type": "main",
"index": 0
}
]
]
},
"Generate video (Seedance 2.0)": {
"main": [
[
{
"node": "Wait for generation",
"type": "main",
"index": 0
}
]
]
},
"When clicking 'Execute workflow'": {
"main": [
[
{
"node": "Configuration",
"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.
blotatoApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow generates a talking-avatar video from a portrait image using AtlasCloud Seedance 2.0, creates a TikTok-ready title with OpenAI, and publishes the resulting video to TikTok via Blotato. Starts when you manually execute the workflow in n8n. Sends the image URL,…
Source: https://n8n.io/workflows/16939/ — 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.
Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.
This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste
💥 Automate video ads with NanoBanana, Seedream 4, ChatGPT Image and Veo 3 - VIDE. Uses telegram, telegramTrigger, googleDrive, agent. Event-driven trigger; 63 nodes.
💥 Automate video ads with NanoBanana, Seedream 4, ChatGPT Image and Veo 3 - VIDE. Uses telegram, telegramTrigger, googleDrive, agent. Event-driven trigger; 63 nodes.
📄 Documentation: Notion Guide