n8n Workflow
Intermediate

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:

  1. Webhook Trigger: The workflow starts when it receives a POST request to its unique URL. It expects a JSON body containing the title of the content to search for (e.g., {"title": "My Favorite Movie"}).

  2. Search for Torrent: A Function node uses the torrent-search-api library to search for the provided title on public trackers like KickassTorrents and Rarbg.

  3. Conditional Check (Found?): An IF node 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.
  4. Start Download in Transmission: An HttpRequest node sends a request to the Transmission RPC API to add the torrent using its magnet link.

  5. Smart Error Handling: The workflow includes a second IF node to handle a common Transmission API issue. If the initial request fails with a 409 Conflict error (indicating an expired session ID), the workflow automatically extracts the new session ID from the error response and retries the download request.

  6. 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

  1. Download workflow JSON
  2. Import into n8n
  3. Configure node parameters as needed
  4. Test and enable the workflow

💡 Tips

After importing, verify all connectors and credentials match your environment.

Preview

Workflow Visualization

8 nodes
100%
WebhookwebhookSearchTorrentfunctionItemStart downloadhttpRequestIFifTorrent not foundtelegramTelegram1telegramIF2ifStart download new tokenhttpRequest

Nodes

1

Webhook

webhook

v1
2

SearchTorrent

functionItem

v1
3

Start download

httpRequest

v1
4

IF

if

v1
5

Torrent not found

telegram

v1
6

Telegram1

telegram

v1
7

IF2

if

v1
8

Start download new token

httpRequest

v1

Statistics

Total nodes:8
Disabled nodes:0
Node types:5
Connections:6
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

Share
Categories:
Tags:
ifhttprequestwebhookfunctionitemtelegram

Technical Specs

Complexity:
Intermediate
Node Count:
8 nodes
Published:11 months ago
Updated:about 18 hours ago

Compatibility

Platform:
N8N Cloud & Self-hosted
Min Version:
N8N v1.0.0+
Supports cloud and self-hosted deployment

License

This workflow template follows MIT license, you can freely use, modify and distribute.

Please comply with relevant third-party service terms when using.

Related Workflows