AutomationFlowsAI & RAG › Create Talking Avatar Tiktok Videos with Seedance, Openai and Blotato

Create Talking Avatar Tiktok Videos with Seedance, Openai and Blotato

ByDr. Firas @drfiras on n8n.io

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,…

Event trigger★★★★☆ complexityAI-powered14 nodesHTTP RequestAgentOpenAI Chat@Blotato/N8N Nodes Blotato
AI & RAG Trigger: Event Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

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.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

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

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

💥 Automate video ads with NanoBanana, Seedream 4, ChatGPT Image and Veo 3 - VIDE. Uses telegram, telegramTrigger, googleDrive, agent. Event-driven trigger; 63 nodes.

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

💥 Automate video ads with NanoBanana, Seedream 4, ChatGPT Image and Veo 3 - VIDE. Uses telegram, telegramTrigger, googleDrive, agent. Event-driven trigger; 63 nodes.

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

📄 Documentation: Notion Guide

Airtable, Agent, OpenAI Chat +4