This workflow corresponds to n8n.io template #10001 — we link there as the canonical source.
This workflow follows the HTTP Request → Telegram 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "0b75420f-8be7-4da1-bc93-df2877de4adc",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-288,
880
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "ad042de8-2758-4fcd-9887-f015daecbf22",
"name": "Validate TikTok URL",
"type": "n8n-nodes-base.if",
"position": [
0,
880
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "url-check-1",
"operator": {
"type": "string",
"operation": "contains"
},
"leftValue": "={{ $json.message.text }}",
"rightValue": "tiktok.com"
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "fdadd1c3-37d8-4d36-a445-6904705d894e",
"name": "Send Invalid URL Message",
"type": "n8n-nodes-base.telegram",
"position": [
240,
976
],
"parameters": {
"text": "\u274c Please send a valid TikTok link!\n\nExamples:\n\u2022 https://www.tiktok.com/@user/video/123\n\u2022 https://vm.tiktok.com/abc123",
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "c98646f6-47dd-475d-9625-a90b19f9b246",
"name": "Send Chat Action",
"type": "n8n-nodes-base.telegram",
"position": [
240,
784
],
"parameters": {
"action": "upload_video",
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"operation": "sendChatAction"
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "9c8b5462-99ca-49c6-85ad-069338299d1f",
"name": "Send Processing Message",
"type": "n8n-nodes-base.telegram",
"position": [
464,
784
],
"parameters": {
"text": "\u23f3 Downloading video... Please wait!",
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "7a1d2ad9-6007-4797-8320-0f7d21924354",
"name": "Configure Variables",
"type": "n8n-nodes-base.set",
"position": [
688,
784
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0f5772c0-1f84-45e9-b131-8be1c8dd6d85",
"name": "share_video_url",
"type": "string",
"value": "={{ $json.message.text.trim() }}"
},
{
"id": "781d5f1b-1724-4cd4-9e0d-916de65b43e5",
"name": "chat_id",
"type": "string",
"value": "={{ $json.message.from.id }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "225bfc1b-93fb-4a51-912c-0aff791f98b3",
"name": "Get TikTok Page HTML",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
864,
784
],
"parameters": {
"url": "={{ $('Telegram Trigger').item.json.message.text }}",
"options": {
"timeout": 30000,
"redirect": {
"redirect": {}
},
"response": {
"response": {
"fullResponse": true,
"responseFormat": "text"
}
}
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
},
{
"name": "Accept",
"value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
},
{
"name": "Accept-Language",
"value": "en-US,en;q=0.9"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "993c6555-94ec-49dd-97a8-fd03c31ac894",
"name": "Extract Video URL",
"type": "n8n-nodes-base.code",
"onError": "continueErrorOutput",
"position": [
1040,
784
],
"parameters": {
"jsCode": "const html = $input.first().json.data;\nconst headers = $input.first().json.headers || {};\nconst cookies = headers['set-cookie'] || [];\n\nif (!html) {\n throw new Error(\"Unable to load TikTok page. Please try again!\");\n}\n\n// Find JSON data from script tag\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(\"Video data not found. The link may be deleted or private.\");\n}\n\nconst jsonStr = match[1];\nlet data;\n\ntry {\n data = JSON.parse(jsonStr);\n} catch (e) {\n throw new Error(\"Unable to parse video data. Please try again!\");\n}\n\n// Get video URL from multiple possible paths\nconst itemInfo = data?.__DEFAULT_SCOPE__?.[\"webapp.video-detail\"]?.itemInfo?.itemStruct;\nconst videoUrl = itemInfo?.video?.playAddr || itemInfo?.video?.downloadAddr;\n\nif (!videoUrl) {\n throw new Error(\"Video URL not found. The video may be restricted from downloading.\");\n}\n\nconst videoInfo = {\n videoUrl: videoUrl,\n cookies: cookies.join('; '),\n description: itemInfo?.desc || 'TikTok Video',\n author: itemInfo?.author?.uniqueId || 'unknown',\n stats: {\n plays: itemInfo?.stats?.playCount || 0,\n likes: itemInfo?.stats?.diggCount || 0,\n comments: itemInfo?.stats?.commentCount || 0\n }\n};\n\nreturn [{ json: videoInfo }];"
},
"typeVersion": 2
},
{
"id": "a7a82681-5e5d-47ff-b8b2-b06d25a46764",
"name": "Download Video File",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
1248,
784
],
"parameters": {
"url": "={{ $json.videoUrl }}",
"options": {
"timeout": 60000,
"response": {
"response": {
"responseFormat": "file"
}
},
"allowUnauthorizedCerts": true
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
},
{
"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": "Accept-Language",
"value": "en-US,en;q=0.9"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Cookie",
"value": "={{ $json.cookies }}"
},
{
"name": "Range",
"value": "bytes=0-"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "a4d0002b-3bca-41ca-970f-7fb6f00b86af",
"name": "Send Video to User",
"type": "n8n-nodes-base.telegram",
"position": [
1504,
640
],
"parameters": {
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"operation": "sendVideo",
"binaryData": true,
"additionalFields": {
"caption": "=\u2705 Video downloaded successfully!\n\n\ud83d\udc64 Author: @{{ $('Extract Video URL').item.json.author }}\n\ud83d\udc41 Views: {{ $('Extract Video URL').item.json.stats.plays.toLocaleString() }}\n\u2764\ufe0f Likes: {{ $('Extract Video URL').item.json.stats.likes.toLocaleString() }}"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "1d66e474-5c33-4785-96fe-7cf470e1506a",
"name": "Format Error",
"type": "n8n-nodes-base.code",
"position": [
1088,
1072
],
"parameters": {
"jsCode": "// Capture and format error message\nconst errorData = $input.first().json;\nconst error = errorData.error || errorData.message || 'Unknown error occurred';\n\nreturn [{\n json: {\n error: error,\n chat_id: $('Configure Variables').first().json.chat_id\n }\n}];"
},
"typeVersion": 2
},
{
"id": "1b10fdd9-80fd-4387-b8d4-79c38234e397",
"name": "Send Error Message",
"type": "n8n-nodes-base.telegram",
"position": [
1488,
1072
],
"parameters": {
"text": "=\u274c Error: {{ $json.error }}\n\n\ud83d\udca1 Possible reasons:\n\u2022 Video was deleted or set to private\n\u2022 Invalid link\n\u2022 TikTok is under maintenance\n\u2022 Video is restricted from downloading\n\nPlease try again or use a different link!",
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "ac4f9ce6-c84f-4bd2-9297-0fca86e6a233",
"name": "Note - Trigger",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
592
],
"parameters": {
"color": 7,
"width": 272,
"height": 636,
"content": "## \ud83d\udce5 TRIGGER\nReceives messages from Telegram users"
},
"typeVersion": 1
},
{
"id": "b62ec2e9-f8a4-4fdb-95a0-74784f2134ed",
"name": "Note - Validation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
592
],
"parameters": {
"color": 7,
"height": 636,
"content": "## \u2705 VALIDATION\nChecks if the message contains a valid TikTok URL"
},
"typeVersion": 1
},
{
"id": "1335249e-7ceb-4f3d-b442-e7d0e25ef23c",
"name": "Note - Feedback",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
592
],
"parameters": {
"color": 7,
"width": 460,
"height": 636,
"content": "## \ud83d\udcac USER FEEDBACK\nSends status messages to keep user informed"
},
"typeVersion": 1
},
{
"id": "053de0eb-8169-48ce-bae6-d83a3ab5a009",
"name": "Note - Processing",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
592
],
"parameters": {
"color": 7,
"width": 1048,
"height": 348,
"content": "## \ud83c\udfac VIDEO PROCESSING\nFetches HTML \u2192 Extracts video URL \u2192 Downloads file"
},
"typeVersion": 1
},
{
"id": "15ed8c93-95b4-4697-9d66-630e9ff0fdc2",
"name": "Note - Error",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
960
],
"parameters": {
"color": 3,
"width": 1036,
"height": 268,
"content": "## \u26a0\ufe0f ERROR HANDLING\nCatches errors and sends user-friendly messages"
},
"typeVersion": 1
},
{
"id": "1c93ba5d-2bfa-460a-902c-7322660760c2",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
16
],
"parameters": {
"width": 528,
"height": 560,
"content": "## \u25b6\ufe0f Telegram Bot TikTok Video Downloader (No Watermark)\n---\n### \u2728 What This Workflow Does\nThis powerful automation turns your Telegram bot into a **TikTok video downloader**. Simply send any TikTok link, and the bot will:\n- \u2705 Validate the URL automatically \n- \u26a1 Extract video without watermark \n- \ud83d\udcca Display video statistics (views, likes, author) \n- \ud83d\ude80 Send the clean video file directly to you \n**No ads. No watermarks. Pure automation magic.**\n\n### Author & Support\nCreated by **Nguy\u1ec5n Thi\u1ec7u To\u00e0n** (Jay Nguyen)\n- Website: [nguyenthieutoan.com](https://nguyenthieutoan.com)\n- Email: me@nguyenthieutoan.com\n- n8n Workflows: [n8n.io/creators/nguyenthieutoan](https://n8n.io/creators/nguyenthieutoan)\n\n### LICENCE\nThis template is shared free of charge. Copyright belongs to [Nguy\u1ec5n Thi\u1ec7u To\u00e0n](https://nguyenthieutoan.com) (n8n creator at n8n.io). Any copying or modification must credit the author."
},
"typeVersion": 1
},
{
"id": "3e3f5f1e-eea9-4ae4-8950-2b277c6337a0",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
16
],
"parameters": {
"color": 7,
"width": 400,
"height": 560,
"content": "### **Workflow Flow Diagram**\n\n```\n\ud83d\udcf1 User sends TikTok link\n \u2193\n\u2705 URL Validation\n \u251c\u2500 Valid \u2192 Continue\n \u2514\u2500 Invalid \u2192 Send error message\n \u2193\n\ud83d\udcac Send \"Processing...\" status\n \u2193\n\ud83c\udf10 Fetch TikTok page HTML\n \u2193\n\ud83d\udd0d Extract video URL from page data\n \u2193\n\u2b07\ufe0f Download video file (no watermark)\n \u2193\n\ud83d\udce4 Send video to user with stats\n```"
},
"typeVersion": 1
},
{
"id": "7b73bb06-ee9c-4997-9443-8c573f4da365",
"name": "Delete Process Notif",
"type": "n8n-nodes-base.telegram",
"position": [
1504,
800
],
"parameters": {
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"messageId": "={{ $('Send Processing Message').item.json.result.message_id }}",
"operation": "deleteMessage"
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "6511cc24-db6e-4300-9f8a-ad3e060771a2",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
256
],
"parameters": {
"color": 5,
"width": 464,
"height": 320,
"content": "### \ud83d\udccc More Useful Workflows from Nguyen Thieu Toan (Jay Nguyen)\n- [Search Flights via Telegram + SerpAPI Price Alerts](https://n8n.io/workflows/12971): Automates flight search with Gemini and sends price alerts directly to Telegram.\n- [Smart Message Batching Messenger Chatbot](https://n8n.io/workflows/9192-smart-message-batching-ai-powered-facebook-messenger-chatbot-use-data-table/): Uses Data Tables to batch and manage AI-powered chatbot messages efficiently.\n- [Build a Messenger Customer Service Chatbot with Google Gemini](https://n8n.io/workflows/13080): Create a customer service chatbot using Gemini AI, designed for handling complex queries.\n- [Forum Pulse for Telegram with Gemini](https://n8n.io/workflows/8573): Monitors community activity and sends updates to Telegram using AI models.\n\n*More Free workflow: *[Click here](https://n8n.io/creators/nguyenthieutoan/)**"
},
"typeVersion": 1
},
{
"id": "f38ab8fe-2ae9-4257-adda-827c7be950ac",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
16
],
"parameters": {
"color": 7,
"width": 624,
"height": 560,
"content": "### **Technical Process**\n1. **Trigger Reception**: Telegram webhook receives user message\n2. **URL Validation**: IF node checks for `tiktok.com` or `vm.tiktok.com` domains\n3. **User Feedback**: Bot sends \"uploading video...\" chat action + status message\n4. **Variable Configuration**: Stores chat ID and video URL for later use\n5. **HTML Fetching**: HTTP request to TikTok with browser-like headers\n6. **Data Extraction**: JavaScript code parses `__UNIVERSAL_DATA_FOR_REHYDRATION__` JSON\n7. **Video Download**: HTTP request with proper cookies and referrer headers\n8. **Delivery**: Telegram sends video file with formatted caption including stats\n\n### **Error Handling Strategy**\nEach critical node (HTTP requests, code execution) has error output enabled:\n- **On Success**: Continues to next processing step\n- **On Error**: Routes to \"Format Error\" \u2192 \"Send Error Message\" path\n- **User Experience**: Clear, actionable error messages instead of silent failures"
},
"typeVersion": 1
},
{
"id": "68276bca-f9c6-4dd1-b806-1f4d1d822031",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
16
],
"parameters": {
"color": 3,
"width": 464,
"height": 224,
"content": "## \u2615BUY ME A COFFEE?\nHi! I am **Nguy\u1ec5n Thi\u1ec7u To\u00e0n (or you can call me Jay / Jay Nguyen)** - a Verified n8n Creator. Thank you for using this template!\nThis workflow is shared with you for free. If it brings value to your work or saves you time, you can buy me a coffee as a small token of appreciation here: **[My Donate Website](https://nguyenthieutoan.com/payment/)** *(PayPal or Momo)*\n\n*You can get more my useful workflow:* **[Click here](https://n8n.io/creators/nguyenthieutoan/)**"
},
"typeVersion": 1
}
],
"connections": {
"Format Error": {
"main": [
[
{
"node": "Send Error Message",
"type": "main",
"index": 0
}
]
]
},
"Send Chat Action": {
"main": [
[
{
"node": "Send Processing Message",
"type": "main",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "Validate TikTok URL",
"type": "main",
"index": 0
}
]
]
},
"Extract Video URL": {
"main": [
[
{
"node": "Download Video File",
"type": "main",
"index": 0
}
],
[
{
"node": "Format Error",
"type": "main",
"index": 0
}
]
]
},
"Configure Variables": {
"main": [
[
{
"node": "Get TikTok Page HTML",
"type": "main",
"index": 0
}
]
]
},
"Download Video File": {
"main": [
[
{
"node": "Delete Process Notif",
"type": "main",
"index": 0
},
{
"node": "Send Video to User",
"type": "main",
"index": 0
}
],
[
{
"node": "Format Error",
"type": "main",
"index": 0
}
]
]
},
"Validate TikTok URL": {
"main": [
[
{
"node": "Send Chat Action",
"type": "main",
"index": 0
}
],
[
{
"node": "Send Invalid URL Message",
"type": "main",
"index": 0
}
]
]
},
"Delete Process Notif": {
"main": [
[]
]
},
"Get TikTok Page HTML": {
"main": [
[
{
"node": "Extract Video URL",
"type": "main",
"index": 0
}
],
[
{
"node": "Format Error",
"type": "main",
"index": 0
}
]
]
},
"Send Processing Message": {
"main": [
[
{
"node": "Configure Variables",
"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.
telegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
> Download TikTok videos instantly without watermarks via Telegram > Fast, reliable, and user-friendly automated workflow
Source: https://n8n.io/workflows/10001/ — 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.
Once set up, simply send any Instagram Reel or Facebook video link to your Telegram bot, and it will automatically: Check if the shared link is valid. Detect whether it’s an Instagram or Facebook link
Desafio RPA TikTok - Bot Dinâmico Master. Uses telegramTrigger, httpRequest, telegram, errorTrigger. Event-driven trigger; 21 nodes.
Description
Description This workflow is an n8n-based automation that allows users to download TikTok/Reels videos without watermarks simply by sending the video link through a Telegram Bot.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.