This workflow corresponds to n8n.io template #16937 — we link there as the canonical source.
This workflow follows the Blotaton8N Nodes Blotato → HTTP Request 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": "IeYRHfuYjk7rTlBh",
"meta": {
"builderVariant": "mcp",
"aiBuilderAssisted": true
},
"name": "Repost watermark-free TikTok videos to social media with Blotato",
"tags": [],
"nodes": [
{
"id": "64caea67-fe42-497a-8a81-717230f44796",
"name": "Receive TikTok URL on Telegram",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
240,
-128
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "de946548-a9c7-4242-a5be-504b49d86abd",
"name": "Configuration",
"type": "n8n-nodes-base.set",
"position": [
448,
-128
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a1",
"name": "tiktok_url",
"type": "string",
"value": "={{ $('Receive TikTok URL on Telegram').item.json.message.text }}"
},
{
"id": "a2",
"name": "telegram_chat_id",
"type": "string",
"value": "={{ $('Receive TikTok URL on Telegram').item.json.message.chat.id }}"
},
{
"id": "a3",
"name": "post_caption",
"type": "string",
"value": "Check out this clip"
},
{
"id": "a4",
"name": "youtube_title",
"type": "string",
"value": "Reposted TikTok video"
},
{
"id": "a5",
"name": "tiktok_privacy_level",
"type": "string",
"value": "PUBLIC_TO_EVERYONE"
},
{
"id": "a6",
"name": "youtube_privacy_status",
"type": "string",
"value": "public"
},
{
"id": "a7",
"name": "is_ai_generated",
"type": "boolean",
"value": false
},
{
"id": "a8",
"name": "scraper_user_agent",
"type": "string",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e298fd64-f94d-4033-bcde-736d827032eb",
"name": "Get TikTok Video Page",
"type": "n8n-nodes-base.httpRequest",
"position": [
688,
-128
],
"parameters": {
"url": "={{ $('Configuration').item.json.tiktok_url }}",
"options": {
"response": {
"response": {
"fullResponse": true,
"responseFormat": "text"
}
}
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "User-Agent",
"value": "={{ $('Configuration').item.json.scraper_user_agent }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "991c373e-c7a5-48be-a89e-8325f43c1c67",
"name": "Extract Raw Video URL",
"type": "n8n-nodes-base.code",
"position": [
880,
-128
],
"parameters": {
"jsCode": "const html = $input.first().json.data;\nconst headers = $input.first().json.headers || {};\nlet cookies = headers['set-cookie'] || [];\nif (Array.isArray(cookies)) { cookies = cookies.join('; '); }\n\nif (!html) {\n throw new Error(\"HTML body is undefined. Check the previous node's output.\");\n}\n\nconst regex = /<script id=\"__UNIVERSAL_DATA_FOR_REHYDRATION__\" type=\"application\\/json\">([\\s\\S]*?)<\\/script>/;\nconst match = html.match(regex);\n\nif (!match) {\n throw new Error(\"Could not find __UNIVERSAL_DATA_FOR_REHYDRATION__ script in the HTML. TikTok may have changed its page or blocked the request.\");\n}\n\nconst data = JSON.parse(match[1]);\nconst videoUrl = data?.__DEFAULT_SCOPE__?.[\"webapp.video-detail\"]?.itemInfo?.itemStruct?.video?.playAddr;\n\nif (!videoUrl) {\n throw new Error(\"Could not find the raw video URL in the page data.\");\n}\n\nreturn [{ json: { videoUrl, cookies } }];"
},
"typeVersion": 2
},
{
"id": "331f3bbd-beee-4718-a209-35c21753e740",
"name": "Download Video Without Watermark",
"type": "n8n-nodes-base.httpRequest",
"position": [
1088,
-128
],
"parameters": {
"url": "={{ $json.videoUrl }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
},
"allowUnauthorizedCerts": true
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "User-Agent",
"value": "={{ $('Configuration').item.json.scraper_user_agent }}"
},
{
"name": "Referer",
"value": "https://www.tiktok.com/"
},
{
"name": "Accept",
"value": "video/mp4,video/webm,video/*;q=0.9,application/octet-stream;q=0.8"
},
{
"name": "Cookie",
"value": "={{ $json.cookies }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "e4a7bc81-7e1b-44c9-9287-5f2db49448af",
"name": "Upload Video to Blotato",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1328,
-128
],
"parameters": {
"resource": "media",
"useBinaryData": true
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "2959e53c-fdd9-4a34-a2a6-e6e49f9daa58",
"name": "Publish to TikTok",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1504,
-128
],
"parameters": {
"options": {},
"platform": "tiktok",
"accountId": {
"__rl": true,
"mode": "list",
"value": "9332",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/9332",
"cachedResultName": "docteur.firas"
},
"postContentText": "={{ $('Configuration').item.json.post_caption }}",
"postContentMediaUrls": "={{ $('Upload Video to Blotato').item.json.url }}",
"postCreateTiktokOptionPrivacyLevel": "={{ $('Configuration').item.json.tiktok_privacy_level }}",
"postCreateTiktokOptionIsAiGenerated": "={{ $('Configuration').item.json.is_ai_generated }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "7c2aaf54-3359-4bb3-832c-e46806c3248f",
"name": "Publish to YouTube",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1712,
-128
],
"parameters": {
"options": {},
"platform": "youtube",
"accountId": {
"__rl": true,
"mode": "list",
"value": "8047",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/8047",
"cachedResultName": "DR FIRASS (Dr. Firas)"
},
"postContentText": "={{ $('Configuration').item.json.post_caption }}",
"postContentMediaUrls": "={{ $('Upload Video to Blotato').item.json.url }}",
"postCreateYoutubeOptionTitle": "={{ $('Configuration').item.json.youtube_title }}",
"postCreateYoutubeOptionPrivacyStatus": "={{ $('Configuration').item.json.youtube_privacy_status }}",
"postCreateYoutubeOptionContainsSyntheticMedia": "={{ $('Configuration').item.json.is_ai_generated }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "4d8988e8-4aad-4ef9-aa23-1bce8bd49336",
"name": "Notify on Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
1904,
-128
],
"parameters": {
"text": "Your TikTok video has been downloaded and reposted to your social accounts.",
"chatId": "={{ $('Configuration').item.json.telegram_chat_id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "03487ebd-84ed-489e-810b-a69909a2b3d9",
"name": "Sticky Note 4bb2e89e",
"type": "n8n-nodes-base.stickyNote",
"position": [
-512,
-336
],
"parameters": {
"width": 620,
"height": 1032,
"content": "# Repost watermark-free TikTok videos to social media with Blotato\n\n# \ud83d\udce5 [Open full documentation on Notion](https://automatisation.notion.site/Repost-watermark-free-TikTok-videos-to-social-media-with-Blotato-course-material-3983d6550fd981cca6decf915014630b)\n\n## Who is this for\nContent creators and social media managers who want to grab a TikTok video without its watermark and repost it to TikTok, YouTube and more, straight from Telegram.\n\n## How it works\n1. Send a TikTok video URL to your Telegram bot.\n2. The workflow fetches the video page, extracts the raw source and downloads the file without watermark.\n3. The clip is uploaded to [Blotato](https://blotato.com/?ref=firas) and reposted to your connected social accounts.\n4. You get a confirmation message back on Telegram.\n\n## Setup\n1. Add your Telegram bot credential to the trigger and the confirmation node.\n2. Add your [Blotato](https://blotato.com/?ref=firas) credential to the three Blotato nodes and pick the target account for each platform.\n3. Open the Configuration node and adjust the caption, titles and privacy levels.\n\n## Requirements\n- A Telegram bot (via BotFather)\n- A Blotato account with connected social accounts\n- Community node: this workflow uses the Blotato node, so it needs n8n self-hosted or n8n Cloud with Verified Community Nodes enabled.\n\n## Customization\n- Add more platforms by duplicating a Blotato Publish node and changing the platform.\n- Edit the default caption, YouTube title and privacy in the Configuration node.\n- Set is_ai_generated to true in Configuration if the clip is AI-made (honest disclosure on TikTok and YouTube)."
},
"typeVersion": 1
},
{
"id": "5e19db35-f938-4399-ae55-589d3b78d7e0",
"name": "Sticky Note 6da09d92",
"type": "n8n-nodes-base.stickyNote",
"position": [
144,
-320
],
"parameters": {
"color": 7,
"width": 472,
"height": 408,
"content": "## 1. Receive & configure\nSend a TikTok URL to your Telegram bot. Everything you can tune (caption, titles, privacy, AI flag) lives in the Configuration node."
},
"typeVersion": 1
},
{
"id": "27fc1f45-1a9b-4432-8942-76f244566d84",
"name": "Sticky Note acc191fd",
"type": "n8n-nodes-base.stickyNote",
"position": [
640,
-320
],
"parameters": {
"color": 7,
"width": 596,
"height": 408,
"content": "## 2. Download without watermark\nFetch the video page, extract the raw source URL and download the original file with no watermark."
},
"typeVersion": 1
},
{
"id": "6bfa85c7-1b2e-406b-904c-b1d1e69973ff",
"name": "Sticky Note 585b76f2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
-320
],
"parameters": {
"color": 7,
"width": 960,
"height": 408,
"content": "## 3. Upload & publish everywhere\nUpload the file to Blotato, then repost to TikTok and YouTube. A Telegram message confirms when done."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": true,
"executionOrder": "v1"
},
"versionId": "05318c09-9ba4-4cf0-bcb1-107d9217d56c",
"nodeGroups": [],
"connections": {
"Configuration": {
"main": [
[
{
"node": "Get TikTok Video Page",
"type": "main",
"index": 0
}
]
]
},
"Publish to TikTok": {
"main": [
[
{
"node": "Publish to YouTube",
"type": "main",
"index": 0
}
]
]
},
"Publish to YouTube": {
"main": [
[
{
"node": "Notify on Telegram",
"type": "main",
"index": 0
}
]
]
},
"Extract Raw Video URL": {
"main": [
[
{
"node": "Download Video Without Watermark",
"type": "main",
"index": 0
}
]
]
},
"Get TikTok Video Page": {
"main": [
[
{
"node": "Extract Raw Video URL",
"type": "main",
"index": 0
}
]
]
},
"Upload Video to Blotato": {
"main": [
[
{
"node": "Publish to TikTok",
"type": "main",
"index": 0
}
]
]
},
"Receive TikTok URL on Telegram": {
"main": [
[
{
"node": "Configuration",
"type": "main",
"index": 0
}
]
]
},
"Download Video Without Watermark": {
"main": [
[
{
"node": "Upload Video to Blotato",
"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.
blotatoApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow listens for a TikTok URL sent to a Telegram bot, downloads the source video file without a watermark, uploads it to Blotato, publishes it to YouTube (and optionally TikTok), and then sends a confirmation message back on Telegram. Triggers when a Telegram bot…
Source: https://n8n.io/workflows/16937/ — 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.
This workflow accepts a video URL from Telegram, sends it to the ElevenLabs Dubbing API to generate a dubbed version in a target language, then uploads the result to Blotato to publish it on YouTube a
This workflow listens for a Telegram message containing a photo and caption, generates an image-to-video clip via AtlasCloud (WAN 2.7), then publishes the resulting video to TikTok, Instagram, and Fac
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
💥 HeyGen - From Idea to Post: GPT-5 Video Automation for YouTube, TikTok & Instagram - vide. Uses @blotato/n8n-nodes-blotato, googleSheets, openAi, agent. Event-driven trigger; 41 nodes.
💥 HeyGen II - CLONE ME - From Idea to Post: GPT-5 Video Automation for YouTube, TikTok & Instagram - vide. Uses @blotato/n8n-nodes-blotato, googleSheets, openAi, lmChatOpenAi. Event-driven trigger; 41