Automated Torrent Downloader with Transmission & Telegram
Automate torrent searches and downloads using a webhook. This workflow searches for content, adds it to a Transmission client, and sends notifications via Telegram.
Overview
Remotely trigger torrent downloads on a Transmission server by sending a title via a webhook, with automated error handling and status notifications sent to Telegram.
🧠 Description & Use Case
This workflow automates the process of finding and downloading torrents using a simple webhook trigger. It is designed to be called by an external service (like a media manager or a custom script) to initiate a download on a Transmission server and provide status updates via Telegram.
🔄 How It Works:
-
Webhook Trigger: The workflow starts when it receives a
POSTrequest to its unique URL. It expects a JSON body containing the title of the content to search for (e.g.,{"title": "My Favorite Movie"}). -
Search for Torrent: A
Functionnode uses thetorrent-search-apilibrary to search for the provided title on public trackers likeKickassTorrentsandRarbg. -
Conditional Check (Found?): An
IFnode checks if the search returned any results.- If Not Found: It sends a notification to a Telegram chat stating that the requested content could not be found.
- If Found: It proceeds to add the torrent to Transmission.
-
Start Download in Transmission: An
HttpRequestnode sends a request to the Transmission RPC API to add the torrent using its magnet link. -
Smart Error Handling: The workflow includes a second
IFnode to handle a common Transmission API issue. If the initial request fails with a409 Conflicterror (indicating an expired session ID), the workflow automatically extracts the new session ID from the error response and retries the download request. -
Success Notification: Once the torrent is successfully added to Transmission (either on the first or second attempt), a final Telegram message is sent to confirm that the download has started, including the torrent's title.
✅ Real-World Use Cases:
- Media Automation: Integrate with media management tools like Radarr, Sonarr, or Medusa to automate your download pipeline.
- Remote Download Trigger: Create a simple script, mobile shortcut, or browser extension that calls the webhook to start downloads on your home server from anywhere.
- Custom Download Bot: Build a personalized bot that accepts requests and manages downloads, notifying you of the progress.
- Shared Server Management: Allow trusted users to add downloads to a shared server without giving them full access to the torrent client's interface.
Instructions
Basic steps
- Download workflow JSON
- Import into n8n
- Configure node parameters as needed
- Test and enable the workflow
💡 Tips
After importing, verify all connectors and credentials match your environment.
Preview
Workflow Visualization
Nodes
Webhook
webhook
SearchTorrent
functionItem
Start download
httpRequest
IF
if
Torrent not found
telegram
Telegram1
telegram
IF2
if
Start download new token
httpRequest
Statistics
View full JSON structure
{
"nodes": [
{
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
310,
300
],
"webhookId": "6be952e8-e30f-4dd7-90b3-bc202ae9f174",
"parameters": {
"path": "6be952e8-e30f-4dd7-90b3-bc202ae9f174",
"options": {
"rawBody": true
},
"httpMethod": "POST"
},
"typeVersion": 1
},
{
"name": "SearchTorrent",
"type": "n8n-nodes-base.functionItem",
"position": [
530,
300
],
"parameters": {
"functionCode": "const TorrentSearchApi = require('torrent-search-api');\n\nTorrentSearchApi.enableProvider('KickassTorrents');\nTorrentSearchApi.enableProvider('Rarbg');\n\nitem.title = $node[\"Webhook\"].json[\"body\"].title.trim();\n\nconst torrents = await TorrentSearchApi.search(item.title, 'All', 5);\n\nitem.torrents = torrents;\nitem.found = true;\n\nif(!torrents.length)\n item.found = false;\n \nconsole.log('Done!');\n\nreturn item;"
},
"typeVersion": 1
},
{
"name": "Start download",
"type": "n8n-nodes-base.httpRequest",
"position": [
960,
280
],
"parameters": {
"url": "http://localhost:9091/transmission/rpc",
"options": {},
"requestMethod": "POST",
"authentication": "basicAuth",
"jsonParameters": true,
"bodyParametersJson": "={\"method\":\"torrent-add\",\"arguments\":{\"paused\":false,\"download-dir\":\"/media/FILM/TORRENT\",\"filename\":\"{{$node[\"SearchTorrent\"].json[\"torrents\"][0][\"magnet\"]}}\"}}",
"headerParametersJson": "{\"X-Transmission-Session-Id\":\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"}"
},
"credentials": {
"httpBasicAuth": "Transmission-basic-auth"
},
"typeVersion": 1,
"continueOnFail": true
},
{
"name": "IF",
"type": "n8n-nodes-base.if",
"position": [
740,
300
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{$json[\"found\"]}}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"name": "Torrent not found",
"type": "n8n-nodes-base.telegram",
"position": [
960,
470
],
"parameters": {
"text": "=Film {{$node[\"Webhook\"].json[\"body\"].title}} non trovato.",
"chatId": "00000000",
"additionalFields": {}
},
"credentials": {
"telegramApi": "your_bot_credential"
},
"typeVersion": 1
},
{
"name": "Telegram1",
"type": "n8n-nodes-base.telegram",
"position": [
1500,
490
],
"parameters": {
"text": "=Scarico {{$node[\"Webhook\"].json[\"body\"].title}}!\nTitolo: {{$node[\"SearchTorrent\"].json[\"torrents\"][0][\"title\"]}}",
"chatId": "0000000",
"additionalFields": {}
},
"credentials": {
"telegramApi": "your_bot_credential"
},
"typeVersion": 1
},
{
"name": "IF2",
"type": "n8n-nodes-base.if",
"position": [
1150,
280
],
"parameters": {
"conditions": {
"string": [
{
"value1": "=\"{{$json[\"error\"][\"statusCode\"]}}\"",
"value2": "=\"409\""
}
]
}
},
"typeVersion": 1
},
{
"name": "Start download new token",
"type": "n8n-nodes-base.httpRequest",
"position": [
1340,
260
],
"parameters": {
"url": "http://localhost:9091/transmission/rpc",
"options": {},
"requestMethod": "POST",
"authentication": "basicAuth",
"jsonParameters": true,
"bodyParametersJson": "={\"method\":\"torrent-add\",\"arguments\":{\"paused\":false,\"download-dir\":\"/media/FILM/TORRENT\",\"filename\":\"{{$node[\"SearchTorrent\"].json[\"torrents\"][0][\"magnet\"]}}\"}}",
"headerParametersJson": "={\"X-Transmission-Session-Id\":\"{{$node[\"Start download\"].json[\"error\"][\"response\"][\"headers\"][\"x-transmission-session-id\"]}}\"}"
},
"credentials": {
"httpBasicAuth": "Transmission-basic-auth"
},
"typeVersion": 1
}
],
"connections": {
"IF": {
"main": [
[
{
"node": "Start download",
"type": "main",
"index": 0
}
],
[
{
"node": "Torrent not found",
"type": "main",
"index": 0
}
]
]
},
"IF2": {
"main": [
[
{
"node": "Start download new token",
"type": "main",
"index": 0
}
],
[
{
"node": "Telegram1",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "SearchTorrent",
"type": "main",
"index": 0
}
]
]
},
"SearchTorrent": {
"main": [
[
{
"node": "IF",
"type": "main",
"index": 0
}
]
]
},
"Start download": {
"main": [
[
{
"node": "IF2",
"type": "main",
"index": 0
}
]
]
},
"Start download new token": {
"main": [
[
{
"node": "Telegram1",
"type": "main",
"index": 0
}
]
]
}
}
}Actions
Technical Specs
Compatibility
License
This workflow template follows MIT license, you can freely use, modify and distribute.
Please comply with relevant third-party service terms when using.