Back to Catalog

Search and download torrents using transmission-daemon

DangerDanger
3077 views
2/3/2026
Official Page

Ok google download "movie name"

I develop this automation to improve my quality of life in handling torrents in my media-center.

Goal

Automate the search operations of a movie based on its name and trigger a download using your transmission-daemon.

Setup

Prerequisite

  • Transmission daemon up and running and its authentication method
  • N8N configured self-hosted or with the possibility to add npm package better with docker-compose.yaml
  • Telegram bot credential [optional]

Configuration

Create a folder where your docker-compose.yaml belongs n8n_dir and proceed in installing the node package.

cd ~/n8n_dir
npm i torrent-search-api

Configuring your docker-compose.yaml file this way. You must include all the dependencies of torrent-search-api. This will let you run the new torrent search node presented in this workflow.

version: '3.3'
services:
    n8n:
        container_name: n8n
        ports:
            - '5678:5678'
        restart: always
        volumes:
            - '~/n8n_dir/.n8n:/home/node/.n8n'
            - '~/n8n_dir/node_modules/@tootallnate:/usr/local/lib/node_modules/@tootallnate'
            - '~/n8n_dir/node_modules/accepts:/usr/local/lib/node_modules/accepts'
            - '~/n8n_dir/node_modules/agent-base:/usr/local/lib/node_modules/agent-base'
            - '~/n8n_dir/node_modules/ajv:/usr/local/lib/node_modules/ajv'
            - '~/n8n_dir/node_modules/ansi-styles:/usr/local/lib/node_modules/ansi-styles'
            - '~/n8n_dir/node_modules/asn1:/usr/local/lib/node_modules/asn1'
            - '~/n8n_dir/node_modules/assert:/usr/local/lib/node_modules/assert'
            - '~/n8n_dir/node_modules/assert-plus:/usr/local/lib/node_modules/assert-plus'
            - '~/n8n_dir/node_modules/ast-types:/usr/local/lib/node_modules/ast-types'
            - '~/n8n_dir/node_modules/asynckit:/usr/local/lib/node_modules/asynckit'
            - '~/n8n_dir/node_modules/aws-sign2:/usr/local/lib/node_modules/aws-sign2'
            - '~/n8n_dir/node_modules/aws4:/usr/local/lib/node_modules/aws4'
            - '~/n8n_dir/node_modules/base64-js:/usr/local/lib/node_modules/base64-js'
            - '~/n8n_dir/node_modules/batch:/usr/local/lib/node_modules/batch'
            - '~/n8n_dir/node_modules/bcrypt-pbkdf:/usr/local/lib/node_modules/bcrypt-pbkdf'
            - '~/n8n_dir/node_modules/bluebird:/usr/local/lib/node_modules/bluebird'
            - '~/n8n_dir/node_modules/boolbase:/usr/local/lib/node_modules/boolbase'
            - '~/n8n_dir/node_modules/brotli:/usr/local/lib/node_modules/brotli'
            - '~/n8n_dir/node_modules/bytes:/usr/local/lib/node_modules/bytes'
            - '~/n8n_dir/node_modules/caseless:/usr/local/lib/node_modules/caseless'
            - '~/n8n_dir/node_modules/chalk:/usr/local/lib/node_modules/chalk'
            - '~/n8n_dir/node_modules/cheerio:/usr/local/lib/node_modules/cheerio'
            - '~/n8n_dir/node_modules/cloudscraper:/usr/local/lib/node_modules/cloudscraper'
            - '~/n8n_dir/node_modules/co:/usr/local/lib/node_modules/co'
            - '~/n8n_dir/node_modules/color-convert:/usr/local/lib/node_modules/color-convert'
            - '~/n8n_dir/node_modules/color-name:/usr/local/lib/node_modules/color-name'
            - '~/n8n_dir/node_modules/combined-stream:/usr/local/lib/node_modules/combined-stream'
            - '~/n8n_dir/node_modules/component-emitter:/usr/local/lib/node_modules/component-emitter'
            - '~/n8n_dir/node_modules/content-disposition:/usr/local/lib/node_modules/content-disposition'
            - '~/n8n_dir/node_modules/content-type:/usr/local/lib/node_modules/content-type'
            - '~/n8n_dir/node_modules/cookiejar:/usr/local/lib/node_modules/cookiejar'
            - '~/n8n_dir/node_modules/core-util-is:/usr/local/lib/node_modules/core-util-is'
            - '~/n8n_dir/node_modules/css-select:/usr/local/lib/node_modules/css-select'
            - '~/n8n_dir/node_modules/css-what:/usr/local/lib/node_modules/css-what'
            - '~/n8n_dir/node_modules/dashdash:/usr/local/lib/node_modules/dashdash'
            - '~/n8n_dir/node_modules/data-uri-to-buffer:/usr/local/lib/node_modules/data-uri-to-buffer'
            - '~/n8n_dir/node_modules/debug:/usr/local/lib/node_modules/debug'
            - '~/n8n_dir/node_modules/deep-is:/usr/local/lib/node_modules/deep-is'
            - '~/n8n_dir/node_modules/degenerator:/usr/local/lib/node_modules/degenerator'
            - '~/n8n_dir/node_modules/delayed-stream:/usr/local/lib/node_modules/delayed-stream'
            - '~/n8n_dir/node_modules/delegates:/usr/local/lib/node_modules/delegates'
            - '~/n8n_dir/node_modules/depd:/usr/local/lib/node_modules/depd'
            - '~/n8n_dir/node_modules/destroy:/usr/local/lib/node_modules/destroy'
            - '~/n8n_dir/node_modules/dom-serializer:/usr/local/lib/node_modules/dom-serializer'
            - '~/n8n_dir/node_modules/domelementtype:/usr/local/lib/node_modules/domelementtype'
            - '~/n8n_dir/node_modules/domhandler:/usr/local/lib/node_modules/domhandler'
            - '~/n8n_dir/node_modules/domutils:/usr/local/lib/node_modules/domutils'
            - '~/n8n_dir/node_modules/ecc-jsbn:/usr/local/lib/node_modules/ecc-jsbn'
            - '~/n8n_dir/node_modules/ee-first:/usr/local/lib/node_modules/ee-first'
            - '~/n8n_dir/node_modules/emitter-component:/usr/local/lib/node_modules/emitter-component'
            - '~/n8n_dir/node_modules/enqueue:/usr/local/lib/node_modules/enqueue'
            - '~/n8n_dir/node_modules/enstore:/usr/local/lib/node_modules/enstore'
            - '~/n8n_dir/node_modules/entities:/usr/local/lib/node_modules/entities'
            - '~/n8n_dir/node_modules/error-inject:/usr/local/lib/node_modules/error-inject'
            - '~/n8n_dir/node_modules/escape-html:/usr/local/lib/node_modules/escape-html'
            - '~/n8n_dir/node_modules/escape-string-regexp:/usr/local/lib/node_modules/escape-string-regexp'
            - '~/n8n_dir/node_modules/escodegen:/usr/local/lib/node_modules/escodegen'
            - '~/n8n_dir/node_modules/esprima:/usr/local/lib/node_modules/esprima'
            - '~/n8n_dir/node_modules/estraverse:/usr/local/lib/node_modules/estraverse'
            - '~/n8n_dir/node_modules/esutils:/usr/local/lib/node_modules/esutils'
            - '~/n8n_dir/node_modules/extend:/usr/local/lib/node_modules/extend'
            - '~/n8n_dir/node_modules/extsprintf:/usr/local/lib/node_modules/extsprintf'
            - '~/n8n_dir/node_modules/fast-deep-equal:/usr/local/lib/node_modules/fast-deep-equal'
            - '~/n8n_dir/node_modules/fast-json-stable-stringify:/usr/local/lib/node_modules/fast-json-stable-stringify'
            - '~/n8n_dir/node_modules/fast-levenshtein:/usr/local/lib/node_modules/fast-levenshtein'
            - '~/n8n_dir/node_modules/file-uri-to-path:/usr/local/lib/node_modules/file-uri-to-path'
            - '~/n8n_dir/node_modules/forever-agent:/usr/local/lib/node_modules/forever-agent'
            - '~/n8n_dir/node_modules/form-data:/usr/local/lib/node_modules/form-data'
            - '~/n8n_dir/node_modules/format-parser:/usr/local/lib/node_modules/format-parser'
            - '~/n8n_dir/node_modules/formidable:/usr/local/lib/node_modules/formidable'
            - '~/n8n_dir/node_modules/fs-extra:/usr/local/lib/node_modules/fs-extra'
            - '~/n8n_dir/node_modules/ftp:/usr/local/lib/node_modules/ftp'
            - '~/n8n_dir/node_modules/get-uri:/usr/local/lib/node_modules/get-uri'
            - '~/n8n_dir/node_modules/getpass:/usr/local/lib/node_modules/getpass'
            - '~/n8n_dir/node_modules/graceful-fs:/usr/local/lib/node_modules/graceful-fs'
            - '~/n8n_dir/node_modules/har-schema:/usr/local/lib/node_modules/har-schema'
            - '~/n8n_dir/node_modules/har-validator:/usr/local/lib/node_modules/har-validator'
            - '~/n8n_dir/node_modules/has-flag:/usr/local/lib/node_modules/has-flag'
            - '~/n8n_dir/node_modules/htmlparser2:/usr/local/lib/node_modules/htmlparser2'
            - '~/n8n_dir/node_modules/http-context:/usr/local/lib/node_modules/http-context'
            - '~/n8n_dir/node_modules/http-errors:/usr/local/lib/node_modules/http-errors'
            - '~/n8n_dir/node_modules/http-incoming:/usr/local/lib/node_modules/http-incoming'
            - '~/n8n_dir/node_modules/http-outgoing:/usr/local/lib/node_modules/http-outgoing'
            - '~/n8n_dir/node_modules/http-proxy-agent:/usr/local/lib/node_modules/http-proxy-agent'
            - '~/n8n_dir/node_modules/http-signature:/usr/local/lib/node_modules/http-signature'
            - '~/n8n_dir/node_modules/https-proxy-agent:/usr/local/lib/node_modules/https-proxy-agent'
            - '~/n8n_dir/node_modules/iconv-lite:/usr/local/lib/node_modules/iconv-lite'
            - '~/n8n_dir/node_modules/inherits:/usr/local/lib/node_modules/inherits'
            - '~/n8n_dir/node_modules/ip:/usr/local/lib/node_modules/ip'
            - '~/n8n_dir/node_modules/is-browser:/usr/local/lib/node_modules/is-browser'
            - '~/n8n_dir/node_modules/is-typedarray:/usr/local/lib/node_modules/is-typedarray'
            - '~/n8n_dir/node_modules/is-url:/usr/local/lib/node_modules/is-url'
            - '~/n8n_dir/node_modules/isarray:/usr/local/lib/node_modules/isarray'
            - '~/n8n_dir/node_modules/isobject:/usr/local/lib/node_modules/isobject'
            - '~/n8n_dir/node_modules/isstream:/usr/local/lib/node_modules/isstream'
            - '~/n8n_dir/node_modules/jsbn:/usr/local/lib/node_modules/jsbn'
            - '~/n8n_dir/node_modules/json-schema:/usr/local/lib/node_modules/json-schema'
            - '~/n8n_dir/node_modules/json-schema-traverse:/usr/local/lib/node_modules/json-schema-traverse'
            - '~/n8n_dir/node_modules/json-stringify-safe:/usr/local/lib/node_modules/json-stringify-safe'
            - '~/n8n_dir/node_modules/jsonfile:/usr/local/lib/node_modules/jsonfile'
            - '~/n8n_dir/node_modules/jsprim:/usr/local/lib/node_modules/jsprim'
            - '~/n8n_dir/node_modules/koa-is-json:/usr/local/lib/node_modules/koa-is-json'
            - '~/n8n_dir/node_modules/levn:/usr/local/lib/node_modules/levn'
            - '~/n8n_dir/node_modules/lodash:/usr/local/lib/node_modules/lodash'
            - '~/n8n_dir/node_modules/lodash.assignin:/usr/local/lib/node_modules/lodash.assignin'
            - '~/n8n_dir/node_modules/lodash.bind:/usr/local/lib/node_modules/lodash.bind'
            - '~/n8n_dir/node_modules/lodash.defaults:/usr/local/lib/node_modules/lodash.defaults'
            - '~/n8n_dir/node_modules/lodash.filter:/usr/local/lib/node_modules/lodash.filter'
            - '~/n8n_dir/node_modules/lodash.flatten:/usr/local/lib/node_modules/lodash.flatten'
            - '~/n8n_dir/node_modules/lodash.foreach:/usr/local/lib/node_modules/lodash.foreach'
            - '~/n8n_dir/node_modules/lodash.map:/usr/local/lib/node_modules/lodash.map'
            - '~/n8n_dir/node_modules/lodash.merge:/usr/local/lib/node_modules/lodash.merge'
            - '~/n8n_dir/node_modules/lodash.pick:/usr/local/lib/node_modules/lodash.pick'
            - '~/n8n_dir/node_modules/lodash.reduce:/usr/local/lib/node_modules/lodash.reduce'
            - '~/n8n_dir/node_modules/lodash.reject:/usr/local/lib/node_modules/lodash.reject'
            - '~/n8n_dir/node_modules/lodash.some:/usr/local/lib/node_modules/lodash.some'
            - '~/n8n_dir/node_modules/lru-cache:/usr/local/lib/node_modules/lru-cache'
            - '~/n8n_dir/node_modules/media-typer:/usr/local/lib/node_modules/media-typer'
            - '~/n8n_dir/node_modules/methods:/usr/local/lib/node_modules/methods'
            - '~/n8n_dir/node_modules/mime:/usr/local/lib/node_modules/mime'
            - '~/n8n_dir/node_modules/mime-db:/usr/local/lib/node_modules/mime-db'
            - '~/n8n_dir/node_modules/mime-types:/usr/local/lib/node_modules/mime-types'
            - '~/n8n_dir/node_modules/monotonic-timestamp:/usr/local/lib/node_modules/monotonic-timestamp'
            - '~/n8n_dir/node_modules/ms:/usr/local/lib/node_modules/ms'
            - '~/n8n_dir/node_modules/negotiator:/usr/local/lib/node_modules/negotiator'
            - '~/n8n_dir/node_modules/netmask:/usr/local/lib/node_modules/netmask'
            - '~/n8n_dir/node_modules/nth-check:/usr/local/lib/node_modules/nth-check'
            - '~/n8n_dir/node_modules/oauth-sign:/usr/local/lib/node_modules/oauth-sign'
            - '~/n8n_dir/node_modules/object-assign:/usr/local/lib/node_modules/object-assign'
            - '~/n8n_dir/node_modules/on-finished:/usr/local/lib/node_modules/on-finished'
            - '~/n8n_dir/node_modules/optionator:/usr/local/lib/node_modules/optionator'
            - '~/n8n_dir/node_modules/pac-proxy-agent:/usr/local/lib/node_modules/pac-proxy-agent'
            - '~/n8n_dir/node_modules/pac-resolver:/usr/local/lib/node_modules/pac-resolver'
            - '~/n8n_dir/node_modules/parseurl:/usr/local/lib/node_modules/parseurl'
            - '~/n8n_dir/node_modules/performance-now:/usr/local/lib/node_modules/performance-now'
            - '~/n8n_dir/node_modules/prelude-ls:/usr/local/lib/node_modules/prelude-ls'
            - '~/n8n_dir/node_modules/process-nextick-args:/usr/local/lib/node_modules/process-nextick-args'
            - '~/n8n_dir/node_modules/promise-polyfill:/usr/local/lib/node_modules/promise-polyfill'
            - '~/n8n_dir/node_modules/proxy-agent:/usr/local/lib/node_modules/proxy-agent'
            - '~/n8n_dir/node_modules/proxy-from-env:/usr/local/lib/node_modules/proxy-from-env'
            - '~/n8n_dir/node_modules/psl:/usr/local/lib/node_modules/psl'
            - '~/n8n_dir/node_modules/punycode:/usr/local/lib/node_modules/punycode'
            - '~/n8n_dir/node_modules/qs:/usr/local/lib/node_modules/qs'
            - '~/n8n_dir/node_modules/querystring:/usr/local/lib/node_modules/querystring'
            - '~/n8n_dir/node_modules/raw-body:/usr/local/lib/node_modules/raw-body'
            - '~/n8n_dir/node_modules/readable-stream:/usr/local/lib/node_modules/readable-stream'
            - '~/n8n_dir/node_modules/request:/usr/local/lib/node_modules/request'
            - '~/n8n_dir/node_modules/request-promise:/usr/local/lib/node_modules/request-promise'
            - '~/n8n_dir/node_modules/request-promise-core:/usr/local/lib/node_modules/request-promise-core'
            - '~/n8n_dir/node_modules/request-x-ray:/usr/local/lib/node_modules/request-x-ray'
            - '~/n8n_dir/node_modules/safe-buffer:/usr/local/lib/node_modules/safe-buffer'
            - '~/n8n_dir/node_modules/safer-buffer:/usr/local/lib/node_modules/safer-buffer'
            - '~/n8n_dir/node_modules/selectn:/usr/local/lib/node_modules/selectn'
            - '~/n8n_dir/node_modules/setprototypeof:/usr/local/lib/node_modules/setprototypeof'
            - '~/n8n_dir/node_modules/sliced:/usr/local/lib/node_modules/sliced'
            - '~/n8n_dir/node_modules/smart-buffer:/usr/local/lib/node_modules/smart-buffer'
            - '~/n8n_dir/node_modules/socks:/usr/local/lib/node_modules/socks'
            - '~/n8n_dir/node_modules/socks-proxy-agent:/usr/local/lib/node_modules/socks-proxy-agent'
            - '~/n8n_dir/node_modules/source-map:/usr/local/lib/node_modules/source-map'
            - '~/n8n_dir/node_modules/sshpk:/usr/local/lib/node_modules/sshpk'
            - '~/n8n_dir/node_modules/statuses:/usr/local/lib/node_modules/statuses'
            - '~/n8n_dir/node_modules/stealthy-require:/usr/local/lib/node_modules/stealthy-require'
            - '~/n8n_dir/node_modules/stream-to-string:/usr/local/lib/node_modules/stream-to-string'
            - '~/n8n_dir/node_modules/string-format:/usr/local/lib/node_modules/string-format'
            - '~/n8n_dir/node_modules/string_decoder:/usr/local/lib/node_modules/string_decoder'
            - '~/n8n_dir/node_modules/superagent:/usr/local/lib/node_modules/superagent'
            - '~/n8n_dir/node_modules/superagent-proxy:/usr/local/lib/node_modules/superagent-proxy'
            - '~/n8n_dir/node_modules/supports-color:/usr/local/lib/node_modules/supports-color'
            - '~/n8n_dir/node_modules/toidentifier:/usr/local/lib/node_modules/toidentifier'
            - '~/n8n_dir/node_modules/torrent-search-api:/usr/local/lib/node_modules/torrent-search-api'
            - '~/n8n_dir/node_modules/tough-cookie:/usr/local/lib/node_modules/tough-cookie'
            - '~/n8n_dir/node_modules/tslib:/usr/local/lib/node_modules/tslib'
            - '~/n8n_dir/node_modules/tunnel-agent:/usr/local/lib/node_modules/tunnel-agent'
            - '~/n8n_dir/node_modules/tweetnacl:/usr/local/lib/node_modules/tweetnacl'
            - '~/n8n_dir/node_modules/type-check:/usr/local/lib/node_modules/type-check'
            - '~/n8n_dir/node_modules/type-is:/usr/local/lib/node_modules/type-is'
            - '~/n8n_dir/node_modules/universalify:/usr/local/lib/node_modules/universalify'
            - '~/n8n_dir/node_modules/unpipe:/usr/local/lib/node_modules/unpipe'
            - '~/n8n_dir/node_modules/uri-js:/usr/local/lib/node_modules/uri-js'
            - '~/n8n_dir/node_modules/util:/usr/local/lib/node_modules/util'
            - '~/n8n_dir/node_modules/util-deprecate:/usr/local/lib/node_modules/util-deprecate'
            - '~/n8n_dir/node_modules/uuid:/usr/local/lib/node_modules/uuid'
            - '~/n8n_dir/node_modules/vary:/usr/local/lib/node_modules/vary'
            - '~/n8n_dir/node_modules/verror:/usr/local/lib/node_modules/verror'
            - '~/n8n_dir/node_modules/word-wrap:/usr/local/lib/node_modules/word-wrap'
            - '~/n8n_dir/node_modules/wrap-fn:/usr/local/lib/node_modules/wrap-fn'
            - '~/n8n_dir/node_modules/x-ray:/usr/local/lib/node_modules/x-ray'
            - '~/n8n_dir/node_modules/x-ray-crawler:/usr/local/lib/node_modules/x-ray-crawler'
            - '~/n8n_dir/node_modules/x-ray-parse:/usr/local/lib/node_modules/x-ray-parse'
            - '~/n8n_dir/node_modules/x-ray-scraper:/usr/local/lib/node_modules/x-ray-scraper'
            - '~/n8n_dir/node_modules/xregexp:/usr/local/lib/node_modules/xregexp'
            - '~/n8n_dir/node_modules/yallist:/usr/local/lib/node_modules/yallist'
            - '~/n8n_dir/node_modules/yieldly:/usr/local/lib/node_modules/yieldly'
        image: 'n8nio/n8n:latest-rpi'
        environment:
            - N8N_BASIC_AUTH_ACTIVE=true
            - N8N_BASIC_AUTH_USER=username
            - N8N_BASIC_AUTH_PASSWORD=your_secret_n8n_password
            - EXECUTIONS_DATA_PRUNE=true
            - EXECUTIONS_DATA_MAX_AGE=120
            - EXECUTIONS_TIMEOUT=300
            - EXECUTIONS_TIMEOUT_MAX=500
            - GENERIC_TIMEZONE=Europe/Berlin
            - NODE_FUNCTION_ALLOW_EXTERNAL=torrent-search-api

Once configured this way run n8n and create a new workflow coping the one proposed.

Configure workflow

Transmission

In order to send command to transmission you must validate the Basic Auth. To do so: open the Start download node and edit the Credentials.

image.png

Perform the same operation choosing the new credentials also in node Start download new token. In this automation we call transmission twice due to a security protocol in transmission system that prevents single click commands to be triggered, performing the request twice bypasses this security mechanism. https://en.wikipedia.org/wiki/Cross-site_request_forgery We use the X-Transmission-Session-Id provided by the first request to authenticate the second request.

Telegram

In order to make the workflow work as expected you must create a telegram bot and configure the nodes (Torrent not found and Telegram1) to send your message once the workflow is complete. Here's an easy guide to follow https://docs.n8n.io/nodes/n8n-nodes-base.telegram/ In those nodes you also should configure the Chat ID, you may use your telegram username or use a bot to retrieve your id. You may chat with useridinfobot that sends you your id.

Ok google automation

Since right now we do not have a n8n client for mobile that can trigger automation using google assistant I decided to use an IFTTT automation to trigger the webhook.

I connect my IFTTT account with google assistant and pick the trigger. Say a phrase with a text ingredient as in the picture below.

image.png

And configure the trigger this way. scarica $ -> download $ or metti in download $ -> put in download $

or some other trigger you may want.

image.png

Then configure your server to trigger the webhook of n8n.

image.png

Conclusion

In conclusion we provide a fully working automation that integrates in n8n a node library and provides an easy trigger to perform a complex operation.

Security concern

Giving the ability to trigger a download may be problematic for potential unwanted torrent malware download, so you may decide to authenticate the webhook request passing in the body another field with a shared token between the two endpoints.

Moreover the torrent-search-api library and its dependencies have some vulnerability that you may want to avoid on your own media-center, this will hopefully be patched soon in a further release of the library.

This is just an interesting proof of concept.

Quality of the download

You may want to introduce another block between torrent search and webhook trigger to search for a movie based on the words detected by google assistant, sometimes it misinterprets something and you may end up downloading potential copyrighted material. Please use this automation only for free and open source movies and music.

n8n Workflow: Search and Download Torrents using Transmission Daemon

This n8n workflow provides a basic framework for searching for torrents and potentially interacting with a Transmission daemon. It is designed to be triggered externally, process a search query, and then respond via Telegram.

What it does

This workflow performs the following steps:

  1. Receives a Webhook Trigger: The workflow starts by listening for an incoming webhook, which is expected to contain a search query.
  2. Processes Search Query: A "Function Item" node is used to process the incoming data. While the current JSON doesn't specify the exact logic, this node is typically used to extract the search term from the webhook payload.
  3. Performs HTTP Request: An "HTTP Request" node is configured to make an external API call. Based on the workflow's directory name, this is likely intended to search for torrents on a public tracker or a private indexer. The exact endpoint and parameters would need to be configured.
  4. Conditional Logic (If): An "If" node introduces conditional branching. This node would typically evaluate the results of the HTTP request to determine if torrents were found or if a specific condition is met.
  5. Sends Telegram Message: A "Telegram" node is used to send messages. This could be used to:
    • Report the search results (e.g., list found torrents).
    • Confirm that a torrent has been added to Transmission.
    • Provide error messages if the search fails.

Prerequisites/Requirements

To use this workflow, you will need:

  • n8n Instance: A running instance of n8n.
  • Webhook Source: An external application or service capable of sending HTTP POST requests to the n8n webhook URL.
  • Torrent Search API/Website: An API endpoint or website that can be queried for torrents (e.g., a torrent tracker's API, Jackett, Prowlarr).
  • Telegram Bot: A Telegram bot token and chat ID to send messages.
  • Transmission Daemon (Optional): If the intention is to interact with Transmission, you would need a running Transmission daemon with its RPC interface accessible, and potentially an additional HTTP Request node or a dedicated Transmission node (if available) to add torrents.

Setup/Usage

  1. Import the Workflow: Import the provided JSON into your n8n instance.
  2. Configure the Webhook:
    • Activate the "Webhook" node.
    • Copy the generated webhook URL. This URL will be used by your external application to trigger the workflow.
  3. Configure the Function Item:
    • Edit the "Function Item" node to parse the incoming webhook data and extract the search query. For example, if your webhook sends {"query": "my search term"}, the code should extract my search term.
  4. Configure the HTTP Request Node:
    • Edit the "HTTP Request" node.
    • Set the URL to your chosen torrent search API or website.
    • Configure the Method (e.g., GET) and any necessary Headers or Query Parameters to include your search term (derived from the "Function Item" node's output).
    • Add any required Authentication (e.g., API key).
  5. Configure the If Node:
    • Edit the "If" node to define the conditions for branching. For instance, check if the HTTP Request node returned any search results.
  6. Configure the Telegram Node:
    • Add a Telegram API credential.
    • Set the Chat ID where you want to receive messages.
    • Configure the Text message to send, potentially including search results or status updates from previous nodes.
  7. Activate the Workflow: Save and activate the workflow in n8n.

Once configured, you can trigger the workflow by sending an HTTP POST request to the webhook URL with your search query. The workflow will then execute the defined steps, perform the torrent search, and send a notification via Telegram. Further development would be needed to actually add torrents to Transmission based on the search results.

Related Templates

Automate RSS to social media pipeline with AI, Airtable & GetLate for multiple platforms

Overview Automates your complete social media content pipeline: sources articles from Wallabag RSS, generates platform-specific posts with AI, creates contextual images, and publishes via GetLate API. Built with 63 nodes across two workflows to handle LinkedIn, Instagram, and Bluesky—with easy expansion to more platforms. Ideal for: Content marketers, solo creators, agencies, and community managers maintaining a consistent multi-platform presence with minimal manual effort. How It Works Two-Workflow Architecture: Content Aggregation Workflow Monitors Wallabag RSS feeds for tagged articles (to-share-linkedin, to-share-instagram, etc.) Extracts and converts content from HTML to Markdown Stores structured data in Airtable with platform assignment AI Generation & Publishing Workflow Scheduled trigger queries Airtable for unpublished content Routes to platform-specific sub-workflows (LinkedIn, Instagram, Bluesky) LLM generates optimized post text and image prompts based on custom brand parameters Optionally generates AI images and hosts them on Imgbb CDN Publishes via GetLate API (immediate or draft mode) Updates Airtable with publication status and metadata Key Features: Tag-based content routing using Wallabag's native system Swappable AI providers (Groq, OpenAI, Anthropic) Platform-specific optimization (tone, length, hashtags, CTAs) Modular design—duplicate sub-workflows to add new platforms in \~30 minutes Centralized Airtable tracking with 17 data points per post Set Up Steps Setup time: \~45-60 minutes for initial configuration Create accounts and get API keys (\~15 min) Wallabag (with RSS feeds enabled) GetLate (social media publishing) Airtable (create base with provided schema—see sticky notes) LLM provider (Groq, OpenAI, or Anthropic) Image service (Hugging Face, Fal.ai, or Stability AI) Imgbb (image hosting) Configure n8n credentials (\~10 min) Add all API keys in n8n's credential manager Detailed credential setup instructions in workflow sticky notes Set up Airtable database (\~10 min) Create "RSS Feed - Content Store" base Add 19 required fields (schema provided in workflow sticky notes) Get Airtable base ID and API key Customize brand prompts (\~15 min) Edit "Set Custom SMCG Prompt" node for each platform Define brand voice, tone, goals, audience, and image preferences Platform-specific examples provided in sticky notes Configure platform settings (\~10 min) Set GetLate account IDs for each platform Enable/disable image generation per platform Choose immediate publish vs. draft mode Adjust schedule trigger frequency Test and deploy Tag test articles in Wallabag Monitor the first few executions in draft mode Activate workflows when satisfied with the output Important: This is a proof-of-concept template. Test thoroughly with draft mode before production use. Detailed setup instructions, troubleshooting tips, and customization guidance are in the workflow's sticky notes. Technical Details 63 nodes: 9 Airtable operations, 8 HTTP requests, 7 code nodes, 3 LangChain LLM chains, 3 RSS triggers, 3 GetLate publishers Supports: Multiple LLM providers, multiple image generation services, unlimited platforms via modular architecture Tracking: 17 metadata fields per post, including publish status, applied parameters, character counts, hashtags, image URLs Prerequisites n8n instance (self-hosted or cloud) Accounts: Wallabag, GetLate, Airtable, LLM provider, image generation service, Imgbb Basic understanding of n8n workflows and credential configuration Time to customize prompts for your brand voice Detailed documentation, Airtable schema, prompt examples, and troubleshooting guides are in the workflow's sticky notes. Category Tags social-media-automation, ai-content-generation, rss-to-social, multi-platform-posting, getlate-api, airtable-database, langchain, workflow-automation, content-marketing

Mikal Hayden-GatesBy Mikal Hayden-Gates
188

Ai website scraper & company intelligence

AI Website Scraper & Company Intelligence Description This workflow automates the process of transforming any website URL into a structured, intelligent company profile. It's triggered by a form, allowing a user to submit a website and choose between a "basic" or "deep" scrape. The workflow extracts key information (mission, services, contacts, SEO keywords), stores it in a structured Supabase database, and archives a full JSON backup to Google Drive. It also features a secondary AI agent that automatically finds and saves competitors for each company, building a rich, interconnected database of company intelligence. --- Quick Implementation Steps Import the Workflow: Import the provided JSON file into your n8n instance. Install Custom Community Node: You must install the community node from: https://www.npmjs.com/package/n8n-nodes-crawl-and-scrape FIRECRAWL N8N Documentation https://docs.firecrawl.dev/developer-guides/workflow-automation/n8n Install Additional Nodes: n8n-nodes-crawl-and-scrape and n8n-nodes-mcp fire crawl mcp . Set up Credentials: Create credentials in n8n for FIRE CRAWL API,Supabase, Mistral AI, and Google Drive. Configure API Key (CRITICAL): Open the Web Search tool node. Go to Parameters → Headers and replace the hardcoded Tavily AI API key with your own. Configure Supabase Nodes: Assign your Supabase credential to all Supabase nodes. Ensure table names (e.g., companies, competitors) match your schema. Configure Google Drive Nodes: Assign your Google Drive credential to the Google Drive2 and save to Google Drive1 nodes. Select the correct Folder ID. Activate Workflow: Turn on the workflow and open the Webhook URL in the “On form submission” node to access the form. --- What It Does Form Trigger Captures user input: “Website URL” and “Scraping Type” (basic or deep). Scraping Router A Switch node routes the flow: Deep Scraping → AI-based MCP Firecrawler agent. Basic Scraping → Crawlee node. Deep Scraping (Firecrawl AI Agent) Uses Firecrawl and Tavily Web Search. Extracts a detailed JSON profile: mission, services, contacts, SEO keywords, etc. Basic Scraping (Crawlee) Uses Crawl and Scrape node to collect raw text. A Mistral-based AI extractor structures the data into JSON. Data Storage Stores structured data in Supabase tables (companies, company_basicprofiles). Archives a full JSON backup to Google Drive. Automated Competitor Analysis Runs after a deep scrape. Uses Tavily web search to find competitors (e.g., from Crunchbase). Saves competitor data to Supabase, linked by company_id. --- Who's It For Sales & Marketing Teams: Enrich leads with deep company info. Market Researchers: Build structured, searchable company databases. B2B Data Providers: Automate company intelligence collection. Developers: Use as a base for RAG or enrichment pipelines. --- Requirements n8n instance (self-hosted or cloud) Supabase Account: With tables like companies, competitors, social_links, etc. Mistral AI API Key Google Drive Credentials Tavily AI API Key (Optional) Custom Nodes: n8n-nodes-crawl-and-scrape --- How It Works Flow Summary Form Trigger: Captures “Website URL” and “Scraping Type”. Switch Node: deep → MCP Firecrawler (AI Agent). basic → Crawl and Scrape node. Scraping & Extraction: Deep path: Firecrawler → JSON structure. Basic path: Crawlee → Mistral extractor → JSON. Storage: Save JSON to Supabase. Archive in Google Drive. Competitor Analysis (Deep Only): Finds competitors via Tavily. Saves to Supabase competitors table. End: Finishes with a No Operation node. --- How To Set Up Import workflow JSON. Install community nodes (especially n8n-nodes-crawl-and-scrape from npm). Configure credentials (Supabase, Mistral AI, Google Drive). Add your Tavily API key. Connect Supabase and Drive nodes properly. Fix disconnected “basic” path if needed. Activate workflow. Test via the webhook form URL. --- How To Customize Change LLMs: Swap Mistral for OpenAI or Claude. Edit Scraper Prompts: Modify system prompts in AI agent nodes. Change Extraction Schema: Update JSON Schema in extractor nodes. Fix Relational Tables: Add Items node before Supabase inserts for arrays (social links, keywords). Enhance Automation: Add email/slack notifications, or replace form trigger with a Google Sheets trigger. --- Add-ons Automated Trigger: Run on new sheet rows. Notifications: Email or Slack alerts after completion. RAG Integration: Use the Supabase database as a chatbot knowledge source. --- Use Case Examples Sales Lead Enrichment: Instantly get company + competitor data from a URL. Market Research: Collect and compare companies in a niche. B2B Database Creation: Build a proprietary company dataset. --- WORKFLOW IMAGE --- Troubleshooting Guide | Issue | Possible Cause | Solution | |-------|----------------|-----------| | Form Trigger 404 | Workflow not active | Activate the workflow | | Web Search Tool fails | Missing Tavily API key | Replace the placeholder key | | FIRECRAWLER / find competitor fails | Missing MCP node | Install n8n-nodes-mcp | | Basic scrape does nothing | Switch node path disconnected | Reconnect “basic” output | | Supabase node error | Wrong table/column names | Match schema exactly | --- Need Help or More Workflows? Want to customize this workflow for your business or integrate it with your existing tools? Our team at Digital Biz Tech can tailor it precisely to your use case from automation logic to AI-powered enhancements. Contact: shilpa.raju@digitalbiz.tech For more such offerings, visit us: https://www.digitalbiz.tech ---

DIGITAL BIZ TECHBy DIGITAL BIZ TECH
923

Automated weekly security audit reports with Gmail delivery

🔒 N8N Security Audit Report - Automated Weekly Email 🎯 What does this workflow do? This workflow automatically generates and emails a comprehensive security audit report for your N8N instance every week. It identifies potential security risks related to: Credentials 🔑 : Exposed or insecure credentials Nodes 🧩 : Sensitive nodes (Code, HTTP Request, SSH, FTP, etc.) Instance settings 🏢 : Global security configuration Community nodes 📦 : Third-party nodes that may pose risks The report includes direct links to affected workflows, execution statuses, and actionable recommendations. --- ✨ Key Features 📊 Smart Risk Assessment Calculates overall risk level: 🟩 Low / 🟧 Moderate / 🟥 High Tracks unique credentials (not just total occurrences) Provides detailed breakdown by node type 🔗 Direct Workflow Links Clickable links to each workflow mentioned Shows last execution status (🟢 success / 🔴 failed) Displays execution timestamps 🌍 Bilingual Support Full support for French and English Switch language with a single variable 📧 Beautiful HTML Email Clean, professional formatting Color-coded risk levels Emoji icons for easy scanning --- 🚀 Quick Setup (5 minutes) 1️⃣ Configure Credentials N8N API: Generate an API key in your N8N settings Gmail OAuth2: Set up OAuth2 for Gmail sending 2️⃣ Set Your Variables Edit the "Set Config Variables" node: javascript { "email_to": "your.email@domain.com", "project_name": "My-N8N-Project", "server_url": "https://n8n.yourdomain.com", // NO trailing slash! "Language": "EN" // or "FR" } 3️⃣ Test & Activate Click "Execute Workflow" to test Check your email inbox Activate for weekly automation --- 📧 Example Report Output Subject: 🔒 Audit Report My-Project – Risk 🟧 Moderate Content: 📊 Summary • Credentials involved: 8 (5 unique) • Nodes involved: 12 💻 code: 4 🌐 httpRequest: 3 🔐 ssh: 2 • Community nodes: 1 • Overall risk level: 🟧 Moderate 🔐 Credentials Risk Report 🔹 Credentials with full access 🔑 My AWS Credentials 🔑 Database Admin 📋 Workflow: Data Processing Pipeline 🟢 (25-10-2024 06:15 → 06:16) 💻 Process Data 🌐 API Call 🧩 Nodes Risk Report [...detailed node analysis...] --- 🎨 Customization Options Change Schedule Modify the "Schedule Trigger" node to run: Daily at 8 AM Monthly on the 1st Custom cron expression Add Recipients Add multiple emails in the Gmail node's toList parameter Adjust Risk Thresholds Edit the JavaScript in "Format Audit Report" nodes to customize when risk levels change Use Different Email Service Replace Gmail node with: SMTP Microsoft Outlook SendGrid Any email service N8N supports --- 💡 Use Cases ✅ Compliance Monitoring: Track security posture for audits ✅ Team Awareness: Keep your team informed of security status ✅ Change Detection: Notice when new risky nodes are added ✅ Best Practices: Get recommendations to improve security ✅ Multi-Environment: Run separate instances for dev/staging/prod --- 🔧 Technical Details Nodes Used: 8 Credentials Required: 2 (N8N API + Gmail OAuth2) External Dependencies: None N8N Version: Compatible with latest N8N versions Execution Time: ~10-20 seconds --- 📋 Requirements N8N instance with API access Gmail account (or other email service) N8N API key with audit permissions Valid SSL certificate for workflow links (recommended) --- 🐛 Troubleshooting Empty report? → Check your N8N API key has audit permissions Workflow links don't work? → Verify server_url is correct and has no trailing slash No execution status shown? → Workflows must have been executed at least once Wrong language displayed? → Set Language to exactly "FR" or "EN" (uppercase) --- 🌟 Why This Template? Unlike basic monitoring tools, this workflow: ✅ Provides context-aware security analysis ✅ Links directly to affected workflows ✅ Shows real execution data (not just theoretical risks) ✅ Calculates unique credential exposure (not just counts) ✅ Supports bilingual reports ✅ Delivers actionable recommendations --- 🤝 Feedback & Support Found this helpful? Please rate the template! Have suggestions? Drop a comment below. Pro tip: Combine this with N8N's native alerting for real-time incident response! --- Tags: security audit monitoring compliance automation email reporting credentials governance --- 📜 License MIT - Feel free to modify and share!

MatthieuBy Matthieu
389