# nodes

node_type: n8n-nodes-exayard.exayardTrigger
package_name: n8n-nodes-exayard
display_name: Exayard Trigger
description: Triggers when an Exayard lifecycle event fires
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: bfischer1121
author_github_url: https://github.com/ShortGenius/
npm_package_name: n8n-nodes-exayard
npm_version: 0.3.7
community_fetched_at: 2026-07-14T14:40:34.520Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-exayard

  n8n community node for [Exayard](https://exayard.com) — AI-powered construction takeoffs, estimates, and bids.

  ## Install

  In your n8n instance:

  ```
  npm install n8n-nodes-exayard
  ```

  Restart n8n. The package ships two nodes (`Exayard` and `Exayard Trigger`) and one credential type (`Exayard API`).

  ## Authentication

  1. Sign in to Exayard and open **Settings → Developer** at https://app.exayard.com/settings/developer to create an API key. Scope it to read or write per resource — least-privilege keys keep workflows safe.
  2. In n8n, **Credentials → New → Exayard API** and paste the key, then hit **Test**. The default base URL (`https://api.exayard.com/v1`) is correct for production.
  3. **Organization ID is optional everywhere** — leave the field blank and the node derives the organization from the API key automatically.

  ## Nodes

  ### Exayard (action)

  | Resource | Operations |
  |---|---|
  | Project | List, Get, Create, List Pages, Archive, Export |
  | Assessment | Run AI Takeoff, Propose Elements, Get Latest, List, Get by ID, Get Takeoff Totals |
  | Estimate | Generate |
  | Bid | Generate |
  | Vendor Price | Set |
  | Quote | Request, Record Response, Update Status |
  | File | Upload |
  | Webhook | List Endpoints, Create Endpoint, Delete Endpoint, List Deliveries |
  | Help | Search |
  | Me | Get |

  ### Exayard Trigger

  Subscribes to Exayard lifecycle events and emits a workflow run per delivery. Supported events:

  - `project.{created,updated,archived}`
  - `assessment.{started,completed,approved,cancelled,failed}`
  - `estimate.generated`
  - `bid.generated`
  - `file.processed`
  - `quote.{requested,received,accepted,rejected,expired}`
  - `*` (all events)

  ## Use as an AI Agent tool

  The Exayard node is marked `usableAsTool`, so an n8n **AI Agent** can call it directly: add the AI Agent node, click the **Tool** connector, and pick **Exayard**. The agent can then list projects, run takeoffs, generate estimates, and more from natural-language instructions.

  Self-hosted instances must allow community nodes as tools by setting the environment variable `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true`.

  Activating the trigger registers a webhook endpoint at Exayard pointing at the n8n production URL. Deactivating it deletes the endpoint so you do not leak orphan subscriptions. Signatures are verified per-delivery (HMAC-SHA256, 5-minute timestamp window).

  ## Links

  - Marketing landing page: https://exayard.com/integrations/n8n
  - API docs: https://developers.exayard.com
  - OpenAPI: https://api.exayard.com/v1/openapi.json
  - Status: https://status.exayard.com
  - Source: https://github.com/ShortGenius/n8n-nodes-exayard

  ## License

  MIT.

ai_documentation_summary:
  {"purpose":"Exayard Trigger listens for Exayard lifecycle events and starts an n8n workflow whenever a matching event delivery is received. It registers a webhook endpoint in Exayard and verifies incoming signatures for each delivery.","capabilities":["Triggers on project events: created, updated, archived","Triggers on assessment events: started, completed, approved, cancelled, failed","Triggers on estimate.generated events","Triggers on bid.generated events","Triggers on file.processed events","Triggers on quote events: requested, received, accepted, rejected, expired","Triggers on all events using wildcard subscription","Registers and removes webhook endpoints automatically on activate/deactivate","Verifies webhook signatures using HMAC-SHA256 with a 5-minute timestamp window"],"authentication":"API key required via the Exayard API credential type; the API key is created in Exayard Developer settings and used in n8n. Organization ID is optional and can be derived from the API key.","commonUseCases":["Start workflows when a project, assessment, estimate, bid, file, or quote event happens in Exayard","Automate downstream actions after takeoffs, estimates, or bids are generated","React to quote lifecycle changes such as requests, responses, acceptance, or expiration","Use as a webhook-driven event source for AI Agent or other n8n workflows"],"limitations":["Requires Exayard API access and a configured webhook endpoint","Self-hosted n8n instances must allow community nodes as tools to use the node with AI Agent functionality"],"relatedNodes":["Exayard"]}


node_type: @mlabsh/n8n-nodes-mlab.mlab
package_name: @mlabsh/n8n-nodes-mlab
display_name: mlab.sh
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: sn0walice
author_github_url: https://github.com/mlab-sh/n8n-nodes-mlab.git
npm_package_name: @mlabsh/n8n-nodes-mlab
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.521Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  mlab.sh security tooling: core scanning (domain/IP/crypto/file), CVE search and threat actor intelligence

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "domain",
      "options": [
        {
          "name": "Crypto Address",
          "value": "crypto"
        },
        {
          "name": "CVE",
          "value": "cve"
        },
        {
          "name": "Domain",
          "value": "domain"
        },
        {
          "name": "File",
          "value": "file"
        },
        {
          "name": "IP Address",
          "value": "ip"
        },
        {
          "name": "Quota",
          "value": "quota"
        },
        {
          "name": "Threat Actor",
          "value": "threatActor"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "scan",
      "options": [
        {
          "name": "Scan",
          "value": "scan",
          "action": "Scan a domain",
          "description": "Launch a domain scan and (optionally) wait for the results"
        },
        {
          "name": "Get Status",
          "value": "status",
          "action": "Get the status of a domain scan"
        },
        {
          "name": "Get Results",
          "value": "results",
          "action": "Get the results of a domain scan"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "domain"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "lookup",
      "options": [
        {
          "name": "Lookup",
          "value": "lookup",
          "action": "Look up an IP address",
          "description": "Resolve geolocation, ASN and ownership for an IP address"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ip"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "lookup",
      "options": [
        {
          "name": "Lookup",
          "value": "lookup",
          "action": "Look up a crypto address",
          "description": "Check sanctions, labels and risk score for a crypto address"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "crypto"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload a file for analysis",
          "description": "Upload a file (max 10MB) and launch analysis"
        },
        {
          "name": "Get Results",
          "value": "results",
          "action": "Get file analysis results",
          "description": "Fetch analysis results by SHA-256 hash"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get remaining quota",
          "description": "Get the remaining daily quota for a scan type"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "quota"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search vulnerabilities",
          "description": "Search vulnerabilities by keyword, vendor or product"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a CVE by ID",
          "description": "Retrieve full details for a CVE (including EPSS and KEV data)"
        },
        {
          "name": "Get Latest",
          "value": "latest",
          "action": "Get latest vulnerabilities",
          "description": "Fetch vulnerabilities from the last 7 days"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "cve"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List / Search",
          "value": "list",
          "action": "List or search threat actors",
          "description": "List actors with optional filters (origin, motivation, sector)"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a threat actor",
          "description": "Get a single actor by slug, including aliases, tools, CVEs and techniques"
        },
        {
          "name": "Get by CVE",
          "value": "byCve",
          "action": "Get actors that exploit a CVE",
          "description": "Reverse lookup: which actors are known to exploit a given CVE"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "threatActor"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Scan",
      "value": "scan",
      "action": "Scan a domain",
      "description": "Launch a domain scan and (optionally) wait for the results",
      "resource": "domain"
    },
    {
      "name": "Get Status",
      "value": "status",
      "action": "Get the status of a domain scan",
      "resource": "domain"
    },
    {
      "name": "Get Results",
      "value": "results",
      "action": "Get the results of a domain scan",
      "resource": "domain"
    },
    {
      "name": "Lookup",
      "value": "lookup",
      "action": "Look up an IP address",
      "description": "Resolve geolocation, ASN and ownership for an IP address",
      "resource": "ip"
    },
    {
      "name": "Lookup",
      "value": "lookup",
      "action": "Look up a crypto address",
      "description": "Check sanctions, labels and risk score for a crypto address",
      "resource": "crypto"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload a file for analysis",
      "description": "Upload a file (max 10MB) and launch analysis",
      "resource": "file"
    },
    {
      "name": "Get Results",
      "value": "results",
      "action": "Get file analysis results",
      "description": "Fetch analysis results by SHA-256 hash",
      "resource": "file"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get remaining quota",
      "description": "Get the remaining daily quota for a scan type",
      "resource": "quota"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search vulnerabilities",
      "description": "Search vulnerabilities by keyword, vendor or product",
      "resource": "cve"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a CVE by ID",
      "description": "Retrieve full details for a CVE (including EPSS and KEV data)",
      "resource": "cve"
    },
    {
      "name": "Get Latest",
      "value": "latest",
      "action": "Get latest vulnerabilities",
      "description": "Fetch vulnerabilities from the last 7 days",
      "resource": "cve"
    },
    {
      "name": "List / Search",
      "value": "list",
      "action": "List or search threat actors",
      "description": "List actors with optional filters (origin, motivation, sector)",
      "resource": "threatActor"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a threat actor",
      "description": "Get a single actor by slug, including aliases, tools, CVEs and techniques",
      "resource": "threatActor"
    },
    {
      "name": "Get by CVE",
      "value": "byCve",
      "action": "Get actors that exploit a CVE",
      "description": "Reverse lookup: which actors are known to exploit a given CVE",
      "resource": "threatActor"
    }
  ]

npm_readme:
  # @mlabsh/n8n-nodes-mlab

  n8n community node for [**mlab.sh**](https://mlab.sh) — bring core scanning, CVE
  vulnerability intelligence and threat-actor data into your n8n workflows.

  The package ships a single **mlab.sh** node whose surfaces are exposed as resources:

  | Resource | Service | Auth |
  |----------|---------|------|
  | **Domain / IP Address / Crypto Address / File / Quota** (Core) | `mlab.sh/api/v1` — domain / IP / crypto / file scans | API key |
  | **CVE** | `vuln.mlab.sh/api/v1` — CVE search & details | none (public) |
  | **Threat Actor** | `actors.mlab.sh/api/v1` — threat-actor intel | none (public) |

  [Installation](#installation) · [Credentials](#credentials) · [Resources & operations](#resources--operations) · [Examples](#examples)

  ---

  ## Installation

  ### From the n8n UI

  1. In n8n, go to **Settings → Community Nodes → Install**.
  2. Enter the npm package name: `@mlabsh/n8n-nodes-mlab`.
  3. Agree to the risk prompt and install.

  > Community nodes require `N8N_COMMUNITY_PACKAGES_ENABLED=true` (the default on self-hosted instances).

  ### Manually (self-hosted)

  ```bash
  cd ~/.n8n/nodes      # or your N8N_CUSTOM_EXTENSIONS path
  npm install @mlabsh/n8n-nodes-mlab
  ```

  Restart n8n afterwards. The **mlab.sh** node then appears in the nodes panel.

  ---

  ## Credentials

  Only the **Core** resources (Domain / IP Address / Crypto Address / File / Quota) need credentials. The credential field is hidden when a public resource (CVE / Threat Actor) is selected.

  1. Create an API key at **mlab.sh → Account → Settings → API Keys** (it starts with `mlab_`).
  2. In n8n, add a new **mlab.sh API** credential and paste the key.
  3. The node sends it as `Authorization: token mlab_...`. The credential's *Test* button hits `GET /limit/ip` to validate the key.

  The **CVE** and **Threat Actor** resources call public, unauthenticated APIs — no credential required.

  ---

  ## Resources & operations

  Pick a **Resource**, then an **Operation**. The node processes every input item and outputs the raw JSON returned by mlab.sh.

  ### Core — Domain

  | Operation | Endpoint | Notes |
  |-----------|----------|-------|
  | **Scan** | `POST /scan/domain` | Launches a scan. With **Wait for Completion** on (default) it polls `/scan/domain/status` and returns the full `/scan/domain/results` payload (subdomains, DNS, SSL, security.txt…). Disable it to return only the job acknowledgement. **Timeout (Seconds)** controls how long polling waits. |
  | **Get Status** | `GET /scan/domain/status` | Check an async scan you launched yourself. |
  | **Get Results** | `GET /scan/domain/results` | Fetch results once a scan has finished. |

  ### Core — IP Address

  | Operation | Endpoint | Notes |
  |-----------|----------|-------|
  | **Lookup** | `GET /scan/ip` | Geolocation, ASN and ownership for an IPv4/IPv6 address. |

  ### Core — Crypto Address

  | Operation | Endpoint | Notes |
  |-----------|----------|-------|
  | **Lookup** | `GET /scan/crypto` | Sanctions, labels and risk score. **Chain** can be auto-detected (leave blank) or forced (BTC, ETH, SOL, TRON, …). |

  ### Core — File

  | Operation | Endpoint | Notes |
  |-----------|----------|-------|
  | **Upload** | `POST /upload/file` | Uploads the file from the **Input Binary Field** (max 10 MB) and returns its `sha256`. |
  | **Get Results** | `GET /scan/file/results` | Fetch analysis results by **SHA-256** hash. |

  ### Core — Quota

  | Operation | Endpoint | Notes |
  |-----------|----------|-------|
  | **Get** | `GET /limit/{type}` | Remaining daily quota for a **Scan Type** (domain / IP / file / crypto). |

  ### CVE

  | Operation | Endpoint | Notes |
  |-----------|----------|-------|
  | **Search** | `GET /cve?q=…` | Search by keyword, vendor or product. Optional **Filters**: severity, published-after date, exact match, KEV-only. |
  | **Get** | `GET /cve/{id}` | Full detail for a CVE, including EPSS and KEV data. |
  | **Get Latest** | `GET /cve/latest` | Vulnerabilities from the last 7 days. |

  ### Threat Actor

  | Operation | Endpoint | Notes |
  |-----------|----------|-------|
  | **List / Search** | `GET /actors` | Optional **Filters**: origin, motivation, sector. Paginate with **Limit** / **Offset**. |
  | **Get** | `GET /actors/{slug}` | A single actor by slug, including aliases, tools, CVEs and techniques. |
  | **Get by CVE** | `GET /cves/{id}/actors` | Reverse lookup — which actors are known to exploit a given CVE. |

  ---

  ## Examples

  **Enrich a domain on demand.** Webhook → **mlab.sh** (Resource: *Domain*, Operation: *Scan*, Wait for Completion: on) → use the returned subdomains / SSL / DNS data downstream.

  **Vulnerability watch.** Schedule Trigger (daily) → **mlab.sh** (Resource: *CVE*, Operation: *Get Latest*) → Filter on `severity = CRITICAL` → notify Slack / email.

  **Threat-actor context for an alert.** **mlab.sh** (Resource: *Threat Actor*, Operation: *Get by CVE*, CVE ID: `CVE-2021-44228`) → attach the matching actors to your incident record.

  **Crypto / IP triage.** Feed a list of addresses or IPs into **mlab.sh** (Resource: *Crypto Address* or *IP Address*, Operation: *Lookup*); the node runs once per input item and returns risk/ownership data per row.

  > Each Core operation consumes daily quota. Use the **Quota → Get** operation to check remaining budget before large batch runs.

  ---

  ## License

  [MIT](LICENSE) · Threat-actor data is sourced from ETDA under CC BY-NC-SA 4.0.

ai_documentation_summary:
  {"purpose":"Provides mlab.sh security intelligence and scanning capabilities in n8n workflows, including domain/IP/crypto/file analysis, CVE vulnerability data, and threat-actor intelligence. It returns raw JSON from the mlab.sh APIs for use in downstream automation.","capabilities":["Domain scanning with async status polling and result retrieval","IP address lookup for geolocation, ASN, and ownership data","Crypto address lookup with sanctions, labels, and risk score","File upload and file analysis result retrieval by SHA-256","Quota checks for remaining daily usage by scan type","CVE search, detail lookup, and latest vulnerability listing","Threat actor list/search, actor detail lookup, and reverse lookup by CVE","Optional filters for CVE and threat actor searches"],"authentication":"API key required for Core resources (Domain, IP Address, Crypto Address, File, Quota); CVE and Threat Actor resources are public and require no authentication. The API key is sent as Authorization: token mlab_... .","commonUseCases":["Enriching domains, IPs, crypto addresses, or files with security intelligence","Monitoring new CVEs and filtering for critical vulnerabilities","Investigating which threat actors are associated with a specific CVE","Checking remaining quota before running large batch scans"],"limitations":["Core operations consume daily quota","File upload is limited to 10 MB","Domain scan completion polling has a configurable timeout","Threat-actor data is sourced from ETDA under CC BY-NC-SA 4.0"],"relatedNodes":[]}


node_type: @loewencreville/n8n-nodes-ttn.ttn
package_name: @loewencreville/n8n-nodes-ttn
display_name: TTN
category: Community
development_style: declarative
version: 1.92
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: loewencreville
author_github_url: https://github.com/etoilary974-ship-it/n8n-nodes-ttn.git
npm_package_name: @loewencreville/n8n-nodes-ttn
npm_version: 2.0.5
community_fetched_at: 2026-07-14T14:40:34.522Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  The Things Stack (TTN / TTS). **Data**, **Devices**, **Gateways**; **Triggers** → **Webhook · Receive Events** from the node picker.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "data",
      "options": [
        {
          "name": "Data",
          "value": "data",
          "description": "Storage (Get Last Uplink), device list, device details, online/offline status, applications"
        },
        {
          "name": "Device",
          "value": "devices",
          "description": "Send downlink commands (POST …/down/push)"
        },
        {
          "name": "Gateway",
          "value": "gateways",
          "description": "List gateways (API); get gateway online/offline status (Gateway Server connection stats)"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getLastUplink",
      "options": [
        {
          "name": "Get Last Uplink",
          "value": "getLastUplink",
          "action": "Data · Get Last Uplink",
          "description": "GET …/packages/storage/uplink_message — Storage required; no `limit` parameter (one n8n item per uplink received in the stream)"
        },
        {
          "name": "List Devices",
          "value": "listDevices",
          "action": "Data · List Devices",
          "description": "GET /api/v3/applications/{application_id}/devices"
        },
        {
          "name": "Get Device Info",
          "value": "getDeviceInfo",
          "action": "Data · Get Device Info",
          "description": "GET /api/v3/applications/{application_id}/devices/{device_id}"
        },
        {
          "name": "Get Device Status",
          "value": "getDeviceStatus",
          "action": "Data · Get Device Status",
          "description": "Latest `last_seen_at` + online/offline status (configurable threshold, TTS registry)"
        },
        {
          "name": "List Applications",
          "value": "listApplications",
          "action": "Data · List Applications",
          "description": "GET /api/v3/applications"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "data"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendCommand",
      "options": [
        {
          "name": "Send Downlink",
          "value": "sendCommand",
          "action": "Devices · Send Downlink",
          "description": "POST …/down/push"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "devices"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listGateways",
      "options": [
        {
          "name": "List Gateways",
          "value": "listGateways",
          "action": "Gateways · List Gateways",
          "description": "GET /api/v3/gateways or …/users/{ID}/gateways or …/organizations/{id}/gateways"
        },
        {
          "name": "Get Gateway Status",
          "value": "getGatewayStatus",
          "action": "Gateways · Get Gateway Status",
          "description": "GET /api/v3/gs/gateways/{gateway_id}/connection/stats — last activity and online/offline"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "gateways"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Last Uplink",
      "value": "getLastUplink",
      "action": "Data · Get Last Uplink",
      "description": "GET …/packages/storage/uplink_message — Storage required; no `limit` parameter (one n8n item per uplink received in the stream)",
      "resource": "data"
    },
    {
      "name": "List Devices",
      "value": "listDevices",
      "action": "Data · List Devices",
      "description": "GET /api/v3/applications/{application_id}/devices",
      "resource": "data"
    },
    {
      "name": "Get Device Info",
      "value": "getDeviceInfo",
      "action": "Data · Get Device Info",
      "description": "GET /api/v3/applications/{application_id}/devices/{device_id}",
      "resource": "data"
    },
    {
      "name": "Get Device Status",
      "value": "getDeviceStatus",
      "action": "Data · Get Device Status",
      "description": "Latest `last_seen_at` + online/offline status (configurable threshold, TTS registry)",
      "resource": "data"
    },
    {
      "name": "List Applications",
      "value": "listApplications",
      "action": "Data · List Applications",
      "description": "GET /api/v3/applications",
      "resource": "data"
    },
    {
      "name": "Send Downlink",
      "value": "sendCommand",
      "action": "Devices · Send Downlink",
      "description": "POST …/down/push",
      "resource": "devices"
    },
    {
      "name": "List Gateways",
      "value": "listGateways",
      "action": "Gateways · List Gateways",
      "description": "GET /api/v3/gateways or …/users/{ID}/gateways or …/organizations/{id}/gateways",
      "resource": "gateways"
    },
    {
      "name": "Get Gateway Status",
      "value": "getGatewayStatus",
      "action": "Gateways · Get Gateway Status",
      "description": "GET /api/v3/gs/gateways/{gateway_id}/connection/stats — last activity and online/offline",
      "resource": "gateways"
    }
  ]

npm_readme:
  # @loewencreville/n8n-nodes-ttn

  Community [n8n](https://n8n.io/) nodes for [The Things Stack](https://www.thethingsindustries.com/) (TTS) — also known as **The Things Network (TTN)** on the public cloud.

  Connect your LoRaWAN applications to n8n workflows: receive real-time uplinks via webhooks, read stored messages, send downlinks, and monitor devices and gateways through the TTS API.

  ## Table of contents

  - [Installation](#installation)
  - [Credentials](#credentials)
  - [Nodes](#nodes)
    - [TTN (main node)](#ttn-main-node)
    - [TTN Trigger (webhook)](#ttn-trigger-webhook)
  - [Usage examples](#usage-examples)
  - [Compatibility](#compatibility)
  - [Development](#development)
  - [Resources](#resources)
  - [Version history](#version-history)
  - [License](#license)

  ## Installation

  Follow the [n8n community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/).

  **npm package:** [`@loewencreville/n8n-nodes-ttn`](https://www.npmjs.com/package/@loewencreville/n8n-nodes-ttn)

  ```bash
  # In n8n: Settings → Community Nodes → Install → enter "@loewencreville/n8n-nodes-ttn"
  ```

  For self-hosted n8n with a custom nodes folder (Docker volume, etc.):

  ```bash
  git clone https://github.com/etoilary974-ship-it/n8n-nodes-ttn.git
  cd n8n-nodes-ttn
  npm install
  npm run build
  # Copy dist/ + package.json to your n8n custom nodes directory, then restart n8n.
  # Or use: npm run deploy
  ```

  ## Credentials

  ### The Things Stack API (`ttnApi`)

  | Field | Description |
  |-------|-------------|
  | **Server URL** | Base URL of your TTS deployment, **without** `/api`. Examples: `https://eu1.cloud.thethings.network`, `https://<tenant>.thethings.industries`, or your self-hosted URL. See [TTS deployments](https://www.thethingsindustries.com/docs/getting-started/cloud-hosted/). |
  | **API key (Application Server)** | An **Application Server** API key (`NNSXS…` format). Sent as `Authorization: Bearer`. Must have rights for the applications, devices, and operations you use. |

  **Create an API key** in the TTS console: *User settings → API keys*, or per application under *API keys*. See the official guides:

  - [API authentication](https://www.thethingsindustries.com/docs/reference/api/authentication/)
  - [API key rights](https://www.thethingsindustries.com/docs/reference/api/using-terraform-provider/#generate-api-key)

  **Required rights by operation:**

  | Operation | Typical API key rights |
  |-----------|------------------------|
  | List applications / devices | `applications:list`, `applications.devices:list` |
  | Get device info / status | `applications.devices:get`, `applications.devices:read` |
  | Send downlink | `applications.devices:downlink` |
  | Storage (Get Last Uplink) | Application Server key with Storage access on the target application |
  | List / status gateways | `gateways:list`, `gateways:read` (Gateway Server) |

  The credential test calls `GET /api/v3/applications` to verify connectivity.

  > **Storage vs webhooks:** [Storage](https://www.thethingsindustries.com/docs/integrations/storage/) reads historical uplinks from the TTS database. [Webhooks](https://www.thethingsindustries.com/docs/integrations/webhooks/) push events to n8n in real time. Enable Storage on your application in TTS if you use **Get Last Uplink**.

  ## Nodes

  All TTN nodes share the same icon and appear grouped in the n8n node picker under **TTN**.

  ### TTN (main node)

  Unified action node with three resources.

  #### Data

  | Operation | TTS API | Description |
  |-----------|---------|-------------|
  | **Get Last Uplink** | `GET …/packages/storage/uplink_message` | Reads the [Storage integration](https://www.thethingsindustries.com/docs/integrations/storage/) uplink stream (`Accept: text/event-stream`). One n8n item per uplink received. Requires Storage enabled on the application. |
  | **List Devices** | `GET /api/v3/applications/{app}/devices` | Lists devices in an application. |
  | **Get Device Info** | `GET /api/v3/applications/{app}/devices/{device}` | Full device registry object. |
  | **Get Device Status** | Registry + `last_seen_at` | Online/offline status with configurable threshold. **Summary** returns `{ device_id, online, last_seen }`; **Detailed** includes timestamps and threshold settings. |
  | **List Applications** | `GET /api/v3/applications` | Applications visible to the API key. |

  **Get Last Uplink options:**

  - **Storage scope** — single device or whole application.
  - **`Last` window** — same duration format as the TTS console (`1h`, `24h`, `168h`, …). See [Storage API](https://www.thethingsindustries.com/docs/integrations/storage/).
  - **Uplink output shape** — Decoded Payload + Meta, Decoded Payload only, or Full Storage record.

  #### Devices

  | Operation | TTS API | Description |
  |-----------|---------|-------------|
  | **Send Downlink** | `POST …/down/push` | Enqueues a downlink on the device queue. |

  Downlink parameters match [The Things Stack downlink fields](https://www.thethingsindustries.com/docs/reference/api/application_server/#message-types):

  - **FPort** (1–223)
  - **Payload type** — Hex (`frm_payload`, base64-encoded by the node) or JSON (`decoded_payload`)
  - **Priority** — `LOWEST` … `HIGHEST`
  - **Confirmed downlink** — requires device ACK

  #### Gateways

  | Operation | TTS API | Description |
  |-----------|---------|-------------|
  | **List Gateways** | `GET /api/v3/gateways` (or per user / organization) | Scope: all gateways visible to the key, a specific user, or an organization. Optional antenna location. |
  | **Get Gateway Status** | `GET /api/v3/gs/gateways/{id}/connection/stats` | Last activity, uptime, `since_last_uplink`, online/offline (configurable threshold). |

  Dynamic dropdowns (applications, devices, gateways) support [n8n expressions](https://docs.n8n.io/code/expressions/) for dynamic IDs.

  API errors from TTS are mapped to readable messages with gRPC codes and suggested actions.

  ---

  ### TTN Trigger (webhook)

  Pick **TTN → Triggers → Webhook · Receive Events** in the node picker.

  Receives real-time POST webhooks from TTS — the recommended way to react to uplinks and other events. HTTP method is fixed to **POST**.

  #### TTS console setup

  1. Open your application in [TTS Console](https://console.cloud.thethings.network/).
  2. Go to **Integrations → Webhooks**.
  3. Set **Base URL** to your n8n webhook URL (test or production).
  4. Format: **JSON**. Method: **POST**.
  5. Under **Enabled event types**, check the events you need (e.g. **Uplink message**).

  Full guide: [TTS Webhooks integration](https://www.thethingsindustries.com/docs/integrations/webhooks/)

  #### Node parameters

  | Parameter | Description |
  |-----------|-------------|
  | **Webhook path** | Path suffix after the n8n base URL (default: `ttn-uplink`). Must match the path configured in TTS. |
  | **Application (API)** | Optional filter: loads devices via API; webhook `application_id` must match when set. |
  | **Allowed devices** | Optional: only matching `device_id` values start the workflow (others get HTTP 200, no run). |
  | **Event type** | Uplink message, Normalized uplink, Join accept, Downlink ack/nack/sent/failed/queued, Location solved, Service data, or All. |
  | **Output format** | For uplinks: Sensor Data, Sensor Values Only, Full Event. For other events: Event Summary or Full Event. |
  | **When JSON does not match event type** | **Do not start workflow** (recommended) — avoids duplicate runs when TTS sends uplink + normalized payload to the same URL. |

  Credentials are optional on the trigger (only needed for the application/device filter dropdowns).

  ## Usage examples

  ### Real-time sensor data (webhook)

  ```
  TTN Trigger (Webhook · Receive Events)
    → Event type: Uplink message
    → Output format: Sensor Data
    → [your logic: Slack, database, etc.]
  ```

  Output shape (`Sensor Data`):

  ```json
  {
    "device_id": "my-sensor",
    "application_id": "my-app",
    "received_at": "2026-06-07T12:00:00.000Z",
    "f_port": 1,
    "data": { "temperature": 22.5, "humidity": 60 }
  }
  ```

  ### Send a downlink command

  ```
  TTN → Devices → Send Downlink
    → Application: my-app
    → Device: my-sensor
    → FPort: 10
    → Payload type: Hex
    → Payload: 0102FF
  ```

  See [Scheduling downlinks](https://www.thethingsindustries.com/docs/reference/api/application_server/#downlinkmessage) in the TTS docs.

  ### Read recent uplinks from Storage

  ```
  TTN → Data → Get Last Uplink
    → Storage scope: One Device
    → Last window: Last 12 Hours
    → Uplink output shape: Decoded Payload + Meta
  ```

  Requires [Storage integration](https://www.thethingsindustries.com/docs/integrations/storage/) enabled on the application.

  ### Monitor device connectivity

  ```
  TTN → Data → Get Device Status
    → Status mode: Summary
    → Offline threshold: 24 hours
  ```

  ### Check gateway health

  ```
  TTN → Gateways → Get Gateway Status
    → Gateway IDs: [your-gateway]
    → Status mode: Detailed
  ```

  ## Compatibility

  | Requirement | Version |
  |-------------|---------|
  | n8n | Community nodes supported (tested with recent self-hosted releases) |
  | Node.js | ≥ 22 (development / CI) |
  | The Things Stack | v3 API (`/api/v3/…`) — public TTN cloud, Cloud Hosted, and self-hosted |

  No runtime npm dependencies — only `n8n-workflow` as a peer dependency.

  ## Development

  ```bash
  npm install
  npm run dev      # Start n8n with hot reload
  npm run lint     # ESLint (n8n node rules)
  npm run build    # Compile to dist/
  npm run deploy   # Build + copy to custom n8n folder
  npm run release  # Lint, build, version bump, tag — triggers publish.yml on push
  ```

  Requires Node.js 22+. See [n8n node development](https://docs.n8n.io/integrations/creating-nodes/).

  **Publishing:** configure an [npm Trusted Publisher](https://docs.npmjs.com/trusted-publishers) on the package (owner `etoilary974-ship-it`, repo `n8n-nodes-ttn`, workflow `publish.yml`), then run `npm run release`. The GitHub Actions workflow publishes to npm with provenance (required for n8n community verification since May 2026).

  ## Resources

  ### n8n

  - [Community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Install community nodes](https://docs.n8n.io/integrations/community-nodes/installation/)
  - [Building custom nodes](https://docs.n8n.io/integrations/creating-nodes/)

  ### The Things Stack / TTN

  - [The Things Stack documentation](https://www.thethingsindustries.com/docs/)
  - [TTS Console (public cloud)](https://console.cloud.thethings.network/)
  - [API authentication](https://www.thethingsindustries.com/docs/reference/api/authentication/)
  - [Webhooks integration](https://www.thethingsindustries.com/docs/integrations/webhooks/)
  - [Storage integration](https://www.thethingsindustries.com/docs/integrations/storage/)
  - [Application Server API (devices, downlinks)](https://www.thethingsindustries.com/docs/reference/api/application_server/)
  - [Gateway Server API](https://www.thethingsindustries.com/docs/reference/api/gateway_server/)
  - [LoRaWAN concepts](https://www.thethingsindustries.com/docs/concepts/lorawan/)

  ### This project

  - [npm package](https://www.npmjs.com/package/@loewencreville/n8n-nodes-ttn)
  - [GitHub repository](https://github.com/etoilary974-ship-it/n8n-nodes-ttn)
  - [Changelog](CHANGELOG.md)
  - [Report an issue](https://github.com/etoilary974-ship-it/n8n-nodes-ttn/issues)

  ## Version history

  See [CHANGELOG.md](CHANGELOG.md) for the full release history.

  | Version | Highlights |
  |---------|------------|
  | **1.0.0** | First public release: TTN node, webhook trigger, credentials, push-only downlink, CI/CD + npm provenance |

  ## License

  [MIT](LICENSE.md) — Copyright Loewen Creville

ai_documentation_summary:
  {"purpose":"Connect n8n to The Things Stack / The Things Network for LoRaWAN workflows. It can read TTS data, manage devices and gateways, send downlinks, and receive real-time events via webhooks.","capabilities":["Get last uplink from TTS Storage (application-wide or per device)","List applications visible to the API key","List devices in an application","Get device registry info","Get device online/offline status with configurable threshold","Send downlinks to devices","List gateways by scope (all visible, user, or organization)","Get gateway connection/status stats","Receive real-time webhook events through the TTN Trigger node"],"authentication":"API key required (The Things Stack Application Server API key sent as Bearer token), with permissions depending on the operation.","commonUseCases":["Trigger an n8n workflow when a LoRaWAN device sends an uplink","Read historical or recent sensor data from TTS Storage","Send a downlink command to a device from an automation workflow","Monitor device and gateway status in n8n"],"limitations":["Get Last Uplink requires Storage to be enabled on the TTS application","Operation access depends on API key rights and scope","Read historical uplinks via Storage is separate from real-time webhook delivery"],"relatedNodes":["TTN Trigger"]}


node_type: @loewencreville/n8n-nodes-ttn.ttnTrigger
package_name: @loewencreville/n8n-nodes-ttn
display_name: TTN Trigger
category: Community
development_style: declarative
version: 2.4
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: loewencreville
author_github_url: https://github.com/etoilary974-ship-it/n8n-nodes-ttn.git
npm_package_name: @loewencreville/n8n-nodes-ttn
npm_version: 2.0.5
community_fetched_at: 2026-07-14T14:40:34.523Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  TTS webhook (real-time events, not Storage). Pick under **TTN** → Triggers. HTTP method: POST (fixed).

npm_readme:
  # @loewencreville/n8n-nodes-ttn

  Community [n8n](https://n8n.io/) nodes for [The Things Stack](https://www.thethingsindustries.com/) (TTS) — also known as **The Things Network (TTN)** on the public cloud.

  Connect your LoRaWAN applications to n8n workflows: receive real-time uplinks via webhooks, read stored messages, send downlinks, and monitor devices and gateways through the TTS API.

  ## Table of contents

  - [Installation](#installation)
  - [Credentials](#credentials)
  - [Nodes](#nodes)
    - [TTN (main node)](#ttn-main-node)
    - [TTN Trigger (webhook)](#ttn-trigger-webhook)
  - [Usage examples](#usage-examples)
  - [Compatibility](#compatibility)
  - [Development](#development)
  - [Resources](#resources)
  - [Version history](#version-history)
  - [License](#license)

  ## Installation

  Follow the [n8n community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/).

  **npm package:** [`@loewencreville/n8n-nodes-ttn`](https://www.npmjs.com/package/@loewencreville/n8n-nodes-ttn)

  ```bash
  # In n8n: Settings → Community Nodes → Install → enter "@loewencreville/n8n-nodes-ttn"
  ```

  For self-hosted n8n with a custom nodes folder (Docker volume, etc.):

  ```bash
  git clone https://github.com/etoilary974-ship-it/n8n-nodes-ttn.git
  cd n8n-nodes-ttn
  npm install
  npm run build
  # Copy dist/ + package.json to your n8n custom nodes directory, then restart n8n.
  # Or use: npm run deploy
  ```

  ## Credentials

  ### The Things Stack API (`ttnApi`)

  | Field | Description |
  |-------|-------------|
  | **Server URL** | Base URL of your TTS deployment, **without** `/api`. Examples: `https://eu1.cloud.thethings.network`, `https://<tenant>.thethings.industries`, or your self-hosted URL. See [TTS deployments](https://www.thethingsindustries.com/docs/getting-started/cloud-hosted/). |
  | **API key (Application Server)** | An **Application Server** API key (`NNSXS…` format). Sent as `Authorization: Bearer`. Must have rights for the applications, devices, and operations you use. |

  **Create an API key** in the TTS console: *User settings → API keys*, or per application under *API keys*. See the official guides:

  - [API authentication](https://www.thethingsindustries.com/docs/reference/api/authentication/)
  - [API key rights](https://www.thethingsindustries.com/docs/reference/api/using-terraform-provider/#generate-api-key)

  **Required rights by operation:**

  | Operation | Typical API key rights |
  |-----------|------------------------|
  | List applications / devices | `applications:list`, `applications.devices:list` |
  | Get device info / status | `applications.devices:get`, `applications.devices:read` |
  | Send downlink | `applications.devices:downlink` |
  | Storage (Get Last Uplink) | Application Server key with Storage access on the target application |
  | List / status gateways | `gateways:list`, `gateways:read` (Gateway Server) |

  The credential test calls `GET /api/v3/applications` to verify connectivity.

  > **Storage vs webhooks:** [Storage](https://www.thethingsindustries.com/docs/integrations/storage/) reads historical uplinks from the TTS database. [Webhooks](https://www.thethingsindustries.com/docs/integrations/webhooks/) push events to n8n in real time. Enable Storage on your application in TTS if you use **Get Last Uplink**.

  ## Nodes

  All TTN nodes share the same icon and appear grouped in the n8n node picker under **TTN**.

  ### TTN (main node)

  Unified action node with three resources.

  #### Data

  | Operation | TTS API | Description |
  |-----------|---------|-------------|
  | **Get Last Uplink** | `GET …/packages/storage/uplink_message` | Reads the [Storage integration](https://www.thethingsindustries.com/docs/integrations/storage/) uplink stream (`Accept: text/event-stream`). One n8n item per uplink received. Requires Storage enabled on the application. |
  | **List Devices** | `GET /api/v3/applications/{app}/devices` | Lists devices in an application. |
  | **Get Device Info** | `GET /api/v3/applications/{app}/devices/{device}` | Full device registry object. |
  | **Get Device Status** | Registry + `last_seen_at` | Online/offline status with configurable threshold. **Summary** returns `{ device_id, online, last_seen }`; **Detailed** includes timestamps and threshold settings. |
  | **List Applications** | `GET /api/v3/applications` | Applications visible to the API key. |

  **Get Last Uplink options:**

  - **Storage scope** — single device or whole application.
  - **`Last` window** — same duration format as the TTS console (`1h`, `24h`, `168h`, …). See [Storage API](https://www.thethingsindustries.com/docs/integrations/storage/).
  - **Uplink output shape** — Decoded Payload + Meta, Decoded Payload only, or Full Storage record.

  #### Devices

  | Operation | TTS API | Description |
  |-----------|---------|-------------|
  | **Send Downlink** | `POST …/down/push` | Enqueues a downlink on the device queue. |

  Downlink parameters match [The Things Stack downlink fields](https://www.thethingsindustries.com/docs/reference/api/application_server/#message-types):

  - **FPort** (1–223)
  - **Payload type** — Hex (`frm_payload`, base64-encoded by the node) or JSON (`decoded_payload`)
  - **Priority** — `LOWEST` … `HIGHEST`
  - **Confirmed downlink** — requires device ACK

  #### Gateways

  | Operation | TTS API | Description |
  |-----------|---------|-------------|
  | **List Gateways** | `GET /api/v3/gateways` (or per user / organization) | Scope: all gateways visible to the key, a specific user, or an organization. Optional antenna location. |
  | **Get Gateway Status** | `GET /api/v3/gs/gateways/{id}/connection/stats` | Last activity, uptime, `since_last_uplink`, online/offline (configurable threshold). |

  Dynamic dropdowns (applications, devices, gateways) support [n8n expressions](https://docs.n8n.io/code/expressions/) for dynamic IDs.

  API errors from TTS are mapped to readable messages with gRPC codes and suggested actions.

  ---

  ### TTN Trigger (webhook)

  Pick **TTN → Triggers → Webhook · Receive Events** in the node picker.

  Receives real-time POST webhooks from TTS — the recommended way to react to uplinks and other events. HTTP method is fixed to **POST**.

  #### TTS console setup

  1. Open your application in [TTS Console](https://console.cloud.thethings.network/).
  2. Go to **Integrations → Webhooks**.
  3. Set **Base URL** to your n8n webhook URL (test or production).
  4. Format: **JSON**. Method: **POST**.
  5. Under **Enabled event types**, check the events you need (e.g. **Uplink message**).

  Full guide: [TTS Webhooks integration](https://www.thethingsindustries.com/docs/integrations/webhooks/)

  #### Node parameters

  | Parameter | Description |
  |-----------|-------------|
  | **Webhook path** | Path suffix after the n8n base URL (default: `ttn-uplink`). Must match the path configured in TTS. |
  | **Application (API)** | Optional filter: loads devices via API; webhook `application_id` must match when set. |
  | **Allowed devices** | Optional: only matching `device_id` values start the workflow (others get HTTP 200, no run). |
  | **Event type** | Uplink message, Normalized uplink, Join accept, Downlink ack/nack/sent/failed/queued, Location solved, Service data, or All. |
  | **Output format** | For uplinks: Sensor Data, Sensor Values Only, Full Event. For other events: Event Summary or Full Event. |
  | **When JSON does not match event type** | **Do not start workflow** (recommended) — avoids duplicate runs when TTS sends uplink + normalized payload to the same URL. |

  Credentials are optional on the trigger (only needed for the application/device filter dropdowns).

  ## Usage examples

  ### Real-time sensor data (webhook)

  ```
  TTN Trigger (Webhook · Receive Events)
    → Event type: Uplink message
    → Output format: Sensor Data
    → [your logic: Slack, database, etc.]
  ```

  Output shape (`Sensor Data`):

  ```json
  {
    "device_id": "my-sensor",
    "application_id": "my-app",
    "received_at": "2026-06-07T12:00:00.000Z",
    "f_port": 1,
    "data": { "temperature": 22.5, "humidity": 60 }
  }
  ```

  ### Send a downlink command

  ```
  TTN → Devices → Send Downlink
    → Application: my-app
    → Device: my-sensor
    → FPort: 10
    → Payload type: Hex
    → Payload: 0102FF
  ```

  See [Scheduling downlinks](https://www.thethingsindustries.com/docs/reference/api/application_server/#downlinkmessage) in the TTS docs.

  ### Read recent uplinks from Storage

  ```
  TTN → Data → Get Last Uplink
    → Storage scope: One Device
    → Last window: Last 12 Hours
    → Uplink output shape: Decoded Payload + Meta
  ```

  Requires [Storage integration](https://www.thethingsindustries.com/docs/integrations/storage/) enabled on the application.

  ### Monitor device connectivity

  ```
  TTN → Data → Get Device Status
    → Status mode: Summary
    → Offline threshold: 24 hours
  ```

  ### Check gateway health

  ```
  TTN → Gateways → Get Gateway Status
    → Gateway IDs: [your-gateway]
    → Status mode: Detailed
  ```

  ## Compatibility

  | Requirement | Version |
  |-------------|---------|
  | n8n | Community nodes supported (tested with recent self-hosted releases) |
  | Node.js | ≥ 22 (development / CI) |
  | The Things Stack | v3 API (`/api/v3/…`) — public TTN cloud, Cloud Hosted, and self-hosted |

  No runtime npm dependencies — only `n8n-workflow` as a peer dependency.

  ## Development

  ```bash
  npm install
  npm run dev      # Start n8n with hot reload
  npm run lint     # ESLint (n8n node rules)
  npm run build    # Compile to dist/
  npm run deploy   # Build + copy to custom n8n folder
  npm run release  # Lint, build, version bump, tag — triggers publish.yml on push
  ```

  Requires Node.js 22+. See [n8n node development](https://docs.n8n.io/integrations/creating-nodes/).

  **Publishing:** configure an [npm Trusted Publisher](https://docs.npmjs.com/trusted-publishers) on the package (owner `etoilary974-ship-it`, repo `n8n-nodes-ttn`, workflow `publish.yml`), then run `npm run release`. The GitHub Actions workflow publishes to npm with provenance (required for n8n community verification since May 2026).

  ## Resources

  ### n8n

  - [Community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Install community nodes](https://docs.n8n.io/integrations/community-nodes/installation/)
  - [Building custom nodes](https://docs.n8n.io/integrations/creating-nodes/)

  ### The Things Stack / TTN

  - [The Things Stack documentation](https://www.thethingsindustries.com/docs/)
  - [TTS Console (public cloud)](https://console.cloud.thethings.network/)
  - [API authentication](https://www.thethingsindustries.com/docs/reference/api/authentication/)
  - [Webhooks integration](https://www.thethingsindustries.com/docs/integrations/webhooks/)
  - [Storage integration](https://www.thethingsindustries.com/docs/integrations/storage/)
  - [Application Server API (devices, downlinks)](https://www.thethingsindustries.com/docs/reference/api/application_server/)
  - [Gateway Server API](https://www.thethingsindustries.com/docs/reference/api/gateway_server/)
  - [LoRaWAN concepts](https://www.thethingsindustries.com/docs/concepts/lorawan/)

  ### This project

  - [npm package](https://www.npmjs.com/package/@loewencreville/n8n-nodes-ttn)
  - [GitHub repository](https://github.com/etoilary974-ship-it/n8n-nodes-ttn)
  - [Changelog](CHANGELOG.md)
  - [Report an issue](https://github.com/etoilary974-ship-it/n8n-nodes-ttn/issues)

  ## Version history

  See [CHANGELOG.md](CHANGELOG.md) for the full release history.

  | Version | Highlights |
  |---------|------------|
  | **1.0.0** | First public release: TTN node, webhook trigger, credentials, push-only downlink, CI/CD + npm provenance |

  ## License

  [MIT](LICENSE.md) — Copyright Loewen Creville

ai_documentation_summary:
  {"purpose":"Receives real-time The Things Stack / The Things Network webhook events in n8n as a trigger node. It is intended for live events from TTS, not historical Storage data.","capabilities":["Webhook trigger for TTN/TTS real-time events","Uses fixed HTTP POST method","Receives uplink and other application events pushed from TTS webhooks","Appears under TTN → Triggers in the n8n node picker"],"authentication":"Webhook-based trigger; no credential authentication is mentioned for the trigger in the provided README excerpt","commonUseCases":["Trigger workflows when new LoRaWAN uplinks arrive","React to real-time device or application events from The Things Stack","Start automations from TTN/TTS webhook notifications"],"limitations":["Used for real-time webhook events only, not Storage/history reads","HTTP method is fixed to POST"],"relatedNodes":["TTN"]}


node_type: @firstpromoter/n8n-nodes-firstpromoter.firstPromoterTrigger
package_name: @firstpromoter/n8n-nodes-firstpromoter
display_name: FirstPromoter Trigger
description: Triggers n8n workflow when an event is recevied from FirstPromoter.
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: firstpromoter-maxwell
author_github_url: https://github.com/firstpromoter/n8n-app.git
npm_package_name: @firstpromoter/n8n-nodes-firstpromoter
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.529Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-firstpromoter

  This is the official FirstPromoter community node for n8n that lets you start a workflow when a webhook event is received or use FirstPromoter v2 API to perform a number of [actions](#-operations-actions). For more details, see [FirstPromoter n8n node documentation](https://docs.firstpromoter.com/automation/n8n-node).


  **[FirstPromoter](https://firstpromoter.com)** is a modern and reliable affiliate tool for subscription-based/SaaS companies that enables you to track, manage, and optimize referral-based marketing programs.

  [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.

  ---

  ## Table of contents

  - [Installation](#-installation) 
  - [Verify Installation](#-verify-installation)
  - [Setting Up Credentials](#-setting-up-credentials)
  - [Webhook or Trigger Setup](#-webhook-or-trigger-setup)
  - [Quick start](#-quick-start)
  - [Operations](#-operations-actions)
  - [Usage](#usage)
  - [Development](#-development)
  - [Compatibility](#compatibility)
  - [Resources](#-resources)

  ## 📦 Installation

  ### GUI Installation

  For self-hosted n8n instances, you can install directly via the web interface:

  1. Open n8n in your browser
  2. Navigate to **Settings** → **Community Nodes**
  3. Click **Install a community node**
  4. Enter package name: `@firstpromoter/n8n-nodes-firstpromoter`
  5. Click **Install**
  6. Wait for installation to complete
  7. Refresh your browser

  **Note**: This method requires owner/admin permissions and is only available for self-hosted n8n (not n8n Cloud).

  ### n8n Cloud

  The FirstPromoter node requires verification to be available on n8n Cloud. n8n Cloud supports a select group of verified community nodes included in their official catalog.

  >**Current Status**: Until the node is verified and included in the Cloud-available catalog, use self-hosted n8n (local or Docker) with any installation methods above.

  ## 🔧 Verify Installation

  After installation and restart:

  1. Open n8n in your browser (typically `http://localhost:5678`)
  2. Create a new workflow
  3. Click the **+** button to add a node
  4. Search for **FirstPromoter** in the node picker
  5. The **FirstPromoter** node should appear in the search results

  > If you don't see the node:
  > - Verify the npm installation completed without errors
  > - Ensure you restarted n8n after installation.
  > - Check n8n logs for any loading errors

  ---

  ## 🔑 Setting Up Credentials

  Before using the [FirstPromoter](https://www.npmjs.com/package/@firstpromoter/n8n-nodes-firstpromoter) n8n node, configure your connection credentials:

  | Field | Required | Description |
  |  ---  |    ---   |     ---     |
  | Account ID | yes | FirstPromoter Account ID |
  | API Key | yes | v2 API key |

  To add credentials in n8n instance via web interface, follow the steps below:  
  1. Click the plus icon **+** on top-left
  2. Click **New Credential**
  3. Search for **FirstPromoter API**
  4. Fill in the required fields:
  	 - Account ID
  	 - API key
  5. Click **Save** 		
    
  ### Where to find your credentials on FirstPromoter

  1. Log in to your **FirstPromoter** dashboard.
  2. Go to **Settings → Integrations → API integration** section.
      - Copy your **Account id**.
  3. Click **Manage API keys**
      - Add New API key or copy existing API key

  > **Tip:** If you rotate keys, update the n8n credential and re-run affected workflows.

  ---

  ![Step 1](/screenshots/step-1-click-plus-icon.png) ![Step 2](/screenshots/step-2-new-credentials.png) ![Step 3a](/screenshots/step-3a-search.png) ![Step 3b](/screenshots/step-3b-seach-and-continue.png) ![Step 4&5](/screenshots/step-4-and-5-fill-and-save.png) ![Step 6](/screenshots/step-6-close-dialog.png)

  ---

  ## 🔄 Webhook or Trigger Setup

  > **NB:** The webhook URL will be automatically registered on FirstPromoter through n8n. Therefore you do not need to add it manually.

  #### Endpoint details (reference)
  - **Method**: `POST`
  - **Path**: `receive` (appended to your n8n webhook base URL)

  #### Event type categories
  | Category | Event types |
  | --- | --- |
  | Commission |  `commission.approved`,`commission.created`,`commission.deleted`,`commission.denied`,`commission.pending`,`commission.updated`|
  | Contract Document | `contract_document.signed` |
  | Payments Batch | 	`payments_batch.completed`,`payments_batch.created`,`payments_batch.deleted`,`payments_batch.failed`,`payments_batch.initiated`,`payments_batch.processing`,`payments_batch.updated`|
  | Payout | `payout.commissions.added`,`payout.commissions.removed`,`payout.cancelled`,`payout.completed`,`payout.created`,`payout.deleted`,`payout.failed`,`payout.pending`,`payout.processing`,`payout.updated` |
  | Payout Method | `payout_method.created`, `payout_method.updated`, `payout_method.deleted` |
  | Promoter Campaign |`promoter_campaign.accepted`,`promoter_campaign.blocked`,`promoter_campaign.created`,`promoter_campaign.deleted`,`promoter_campaign.inactive`,`promoter_campaign.pending`,`promoter_campaign.rejected`,`promoter_campaign.updated`|
  | Promoter | `promoter.balance.updated`,`promoter.created`,`promoter.deleted`,`promoter.updated` |
  | Referral | `referral.cancelled`,`referral.converted`,`referral.created`,`referral.deleted`,`referral.moved`,`referral.updated` |

  > For more information, see [documentation](https://docs.firstpromoter.com/webhooks-v2/overview)
  ---

  ## 🚀 Quick start

  ### 1) Add the trigger node in n8n

  1. Create a new workflow in n8n
  2. Search for **FirstPromoter** node and click on it.
  3. Under Triggers, select **On new FirstPromoter event**.
  4. Select or Setup Credentials. See [Setting Up Credentials](#-setting-up-credentials).
  5. Choose **Event Type Category**. 
     > Select **All Categories** to subscribe to every category, then narrow individual events in each category as needed.
  6. Select one or more **Campaign Names or IDs**
  7. Select the specific events you want.

  ### 2) Send test a event (from FirstPromoter)

  To send a test event, follow these steps:

  1. Click **Test this trigger** or **Execute step** in n8n if you haven't done that yet.
  2. Go to your FirstPromoter account and navigate to **Settings** > **Integrations** > **Webhooks** section.
  3. Click the Edit icon next to your corresponding Test or Production URL in FirstPromoter.
  4. In the Test webhook section, click **Select event** and choose your desired event.
  5. Click the **Run Test** button.


  ### 3) Process the event (action node)

  1. Add **FirstPromoter** action node or any action node after the trigger node.
  2. Use the webhook/trigger response payload in the action node added in step 1.

  > NB: All FirstPromoter actions require crendentials for their operation.

  ---

  ## 📋 Operations (actions)

  ### Referral 

  - Delete Referral
  - Get Referral
  - List Referrals
  - Move Referrals
  - Update Referral

  ### Tracking
  - Track Signup
  - Track Sale
  - Track Refund
  - Track Cancellation

  ### Commission

  - Approve Commissions
  - Create Custom Commission
  - Create Sale Commission
  - Deny Commissions
  - List Commissions
  - Mark Non-Monetary Commissions As Fulfilled
  - Mark Non-Monetary Commissions As Unfulfilled
  - Update Commission

  ### Promoter

  - Accept Promoters
  - Add Promoters to Campaign
  - Archive Promoters
  - Assign Parent
  - Block Promoters
  - Create Promoter
  - Get Promoter
  - List Promoters
  - Move Promoters to Campaign
  - Reject Promoters
  - Restore Promoters
  - Update Promoters

  ### Promo Code

  - Archive Promo Code By ID
  - Create Promo Code (Stripe Only)
  - Get Promo Code By ID
  - Get Promo Codes
  - Update Promo Code By ID

  ### Custom API

  - Custom FirstPromoter API Call

  ---

  ## Usage

  ### Custom API call (advanced)

  Use **FirstPromoter → Custom API → Custom FirstPromoter API Call** when you need an endpoint not covered by built-in operations.

  Provide:

  - **Method** (GET, POST, PUT, DELETE)
  - **URL Path** (for example `/company/promoters` — do not include the base URL `https://api.firstpromoter.com/api/v2`)
  - Optional **Query Parameters**, **Headers**, and **Body** (JSON)

  > Only set the parameters you need; empty values are ignored.

  ---

  ## 👨‍💻 Development

  Install from npm:

  ```bash
  npm install @firstpromoter/n8n-nodes-firstpromoter
  ```
  Useful scripts:

  | Command | Description |
  | --- | --- |
  | `npm run build` | Build the package to `dist/` |
  | `npm run dev` | Run n8n with this package in development mode |
  | `npm run lint` | Lint node and credential sources |
  | `npm run lint:fix` | Lint and auto-fix where possible |
  | `npm start` | Build and start n8n with `N8N_CUSTOM_EXTENSIONS` pointing at this repo |

  > For more infomation how to run a node locally, see [documentation](https://docs.n8n.io/integrations/creating-nodes/test/run-node-locally/)
  ---

  ##  🛠️ Compatibility

  - **n8n-workflow**: `>=2` (peer dependency)
  - **Node.js**: `>=22.22.0`

  ---

  ## 📚 Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

  - [FirstPromoter n8n node documentation](https://docs.firstpromoter.com/automation/n8n-node)

  - [FirstPromoter v2 authentication](https://docs.firstpromoter.com/api-reference-v2/api-admin/authentication)

  - [FirstPromoter v2 API documentation](https://docs.firstpromoter.com/api-reference-v2/api-admin/introduction)

  - [FirstPromoter v2 webhooks](https://docs.firstpromoter.com/webhooks-v2/overview)

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when FirstPromoter webhook events are received. It also supports interacting with the FirstPromoter v2 API for available actions.","capabilities":["Trigger workflows on incoming FirstPromoter webhook events","Subscribe to event categories such as commissions, referrals, promoters, payouts, payment batches, promoter campaigns, payout methods, and contract documents","Filter triggers by campaign names or IDs and specific event types","Automatically registers the webhook URL with FirstPromoter","Use FirstPromoter v2 API for supported operations/actions"],"authentication":"Account ID and API Key required (FirstPromoter v2 API key)","commonUseCases":["Trigger automation when a referral is created, converted, updated, or cancelled","React to commission or payout status changes in a workflow","Start processes when a promoter campaign or promoter record changes"],"limitations":["n8n Cloud support is not available until the node is verified and added to the cloud catalog","Webhook trigger setup requires self-hosted n8n for community node installation unless verified for cloud use"],"relatedNodes":[]}


node_type: @firstpromoter/n8n-nodes-firstpromoter.firstPromoter
package_name: @firstpromoter/n8n-nodes-firstpromoter
display_name: FirstPromoter
description: Interact with the official FirstPromoter APIs
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: firstpromoter-maxwell
author_github_url: https://github.com/firstpromoter/n8n-app.git
npm_package_name: @firstpromoter/n8n-nodes-firstpromoter
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.530Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "referrals",
      "options": [
        {
          "name": "Commission",
          "value": "commissions"
        },
        {
          "name": "Custom API",
          "value": "api"
        },
        {
          "name": "Promo Code",
          "value": "promo codes"
        },
        {
          "name": "Promoter",
          "value": "promoters"
        },
        {
          "name": "Referral",
          "value": "referrals"
        },
        {
          "name": "Tracking",
          "value": "tracking"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list referrals",
      "options": [
        {
          "name": "Delete Referral",
          "value": "delete referrals",
          "action": "Delete a referral"
        },
        {
          "name": "Get Referral",
          "value": "get referral",
          "action": "Get referral details"
        },
        {
          "name": "List Referrals",
          "value": "list referrals",
          "action": "List referrals"
        },
        {
          "name": "Move Referrals",
          "value": "move",
          "action": "Move referrals to promoter"
        },
        {
          "name": "Update Referral",
          "value": "update referrals",
          "action": "Update referral"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "referrals"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sale",
      "options": [
        {
          "name": "Track Cancellation",
          "value": "cancellation",
          "action": "Track cancellation"
        },
        {
          "name": "Track Refund",
          "value": "refund",
          "action": "Track a refund"
        },
        {
          "name": "Track Sale",
          "value": "sale",
          "action": "Track a sale"
        },
        {
          "name": "Track Signup",
          "value": "signup",
          "action": "Track a lead signup"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tracking"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list commissions",
      "options": [
        {
          "name": "Approve Commissions",
          "value": "approve commissions",
          "action": "Approve commissions"
        },
        {
          "name": "Create Custom Commission",
          "value": "create custom commission",
          "action": "Create a custom commission"
        },
        {
          "name": "Create Sale Commission",
          "value": "create commission",
          "action": "Create a sale commission"
        },
        {
          "name": "Deny Commissions",
          "value": "deny commissions",
          "action": "Deny a commission"
        },
        {
          "name": "List Commissions",
          "value": "list commissions",
          "action": "List commissions"
        },
        {
          "name": "Mark Non-Monetary Commissions As Fulfilled",
          "value": "mark commission fulfilled",
          "action": "Mark non monetary commissions as fulfilled"
        },
        {
          "name": "Mark Non-Monetary Commissions As Unfulfilled",
          "value": "mark commission unfulfilled",
          "action": "Mark non monetary commissions as unfulfilled"
        },
        {
          "name": "Update Commission",
          "value": "update commission",
          "action": "Update a commission"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "commissions"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list promoters",
      "options": [
        {
          "name": "Accept Promoters",
          "value": "accept",
          "action": "Accept promoters"
        },
        {
          "name": "Add Promoters to Campaign",
          "value": "add promoters",
          "action": "Add promoters to a campaign"
        },
        {
          "name": "Archive Promoters",
          "value": "archive",
          "action": "Archive promoters"
        },
        {
          "name": "Assign Parent",
          "value": "assign parent",
          "action": "Assign a parent promoter"
        },
        {
          "name": "Block Promoters",
          "value": "block",
          "action": "Block promoters"
        },
        {
          "name": "Create Promoter",
          "value": "create promoter",
          "action": "Create a promoter"
        },
        {
          "name": "Get Promoter",
          "value": "get promoter",
          "action": "Get a promoter details"
        },
        {
          "name": "List Promoters",
          "value": "list promoters",
          "action": "List promoters"
        },
        {
          "name": "Move Promoters to Campaign",
          "value": "move promoters",
          "action": "Move promoters to a campaign"
        },
        {
          "name": "Reject Promoters",
          "value": "reject",
          "action": "Reject promoters"
        },
        {
          "name": "Restore Promoters",
          "value": "restore",
          "action": "Restore promoters"
        },
        {
          "name": "Update Promoters",
          "value": "update promoter",
          "action": "Update a promoter"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "promoters"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get promo codes",
      "options": [
        {
          "name": "Archive Promo Code By ID",
          "value": "archive promo code by id",
          "action": "Archive a promo code by ID"
        },
        {
          "name": "Create Promo Code (Stripe Only)",
          "value": "create promo code",
          "action": "Create a promo code for stripe account only"
        },
        {
          "name": "Get Promo Code By ID",
          "value": "get promo code by id",
          "action": "Get a promo code details by ID"
        },
        {
          "name": "Get Promo Codes",
          "value": "get promo codes",
          "action": "Get promo codes"
        },
        {
          "name": "Update Promo Code By ID",
          "value": "update promo code by id",
          "action": "Update a promo code by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "promo codes"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "call",
      "options": [
        {
          "name": "Custom FirstPromoter API Call",
          "value": "call",
          "action": "Make a custom v2 API call"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "api"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Delete Referral",
      "value": "delete referrals",
      "action": "Delete a referral",
      "resource": "referrals"
    },
    {
      "name": "Get Referral",
      "value": "get referral",
      "action": "Get referral details",
      "resource": "referrals"
    },
    {
      "name": "List Referrals",
      "value": "list referrals",
      "action": "List referrals",
      "resource": "referrals"
    },
    {
      "name": "Move Referrals",
      "value": "move",
      "action": "Move referrals to promoter",
      "resource": "referrals"
    },
    {
      "name": "Update Referral",
      "value": "update referrals",
      "action": "Update referral",
      "resource": "referrals"
    },
    {
      "name": "Track Cancellation",
      "value": "cancellation",
      "action": "Track cancellation",
      "resource": "tracking"
    },
    {
      "name": "Track Refund",
      "value": "refund",
      "action": "Track a refund",
      "resource": "tracking"
    },
    {
      "name": "Track Sale",
      "value": "sale",
      "action": "Track a sale",
      "resource": "tracking"
    },
    {
      "name": "Track Signup",
      "value": "signup",
      "action": "Track a lead signup",
      "resource": "tracking"
    },
    {
      "name": "Approve Commissions",
      "value": "approve commissions",
      "action": "Approve commissions",
      "resource": "commissions"
    },
    {
      "name": "Create Custom Commission",
      "value": "create custom commission",
      "action": "Create a custom commission",
      "resource": "commissions"
    },
    {
      "name": "Create Sale Commission",
      "value": "create commission",
      "action": "Create a sale commission",
      "resource": "commissions"
    },
    {
      "name": "Deny Commissions",
      "value": "deny commissions",
      "action": "Deny a commission",
      "resource": "commissions"
    },
    {
      "name": "List Commissions",
      "value": "list commissions",
      "action": "List commissions",
      "resource": "commissions"
    },
    {
      "name": "Mark Non-Monetary Commissions As Fulfilled",
      "value": "mark commission fulfilled",
      "action": "Mark non monetary commissions as fulfilled",
      "resource": "commissions"
    },
    {
      "name": "Mark Non-Monetary Commissions As Unfulfilled",
      "value": "mark commission unfulfilled",
      "action": "Mark non monetary commissions as unfulfilled",
      "resource": "commissions"
    },
    {
      "name": "Update Commission",
      "value": "update commission",
      "action": "Update a commission",
      "resource": "commissions"
    },
    {
      "name": "Accept Promoters",
      "value": "accept",
      "action": "Accept promoters",
      "resource": "promoters"
    },
    {
      "name": "Add Promoters to Campaign",
      "value": "add promoters",
      "action": "Add promoters to a campaign",
      "resource": "promoters"
    },
    {
      "name": "Archive Promoters",
      "value": "archive",
      "action": "Archive promoters",
      "resource": "promoters"
    },
    {
      "name": "Assign Parent",
      "value": "assign parent",
      "action": "Assign a parent promoter",
      "resource": "promoters"
    },
    {
      "name": "Block Promoters",
      "value": "block",
      "action": "Block promoters",
      "resource": "promoters"
    },
    {
      "name": "Create Promoter",
      "value": "create promoter",
      "action": "Create a promoter",
      "resource": "promoters"
    },
    {
      "name": "Get Promoter",
      "value": "get promoter",
      "action": "Get a promoter details",
      "resource": "promoters"
    },
    {
      "name": "List Promoters",
      "value": "list promoters",
      "action": "List promoters",
      "resource": "promoters"
    },
    {
      "name": "Move Promoters to Campaign",
      "value": "move promoters",
      "action": "Move promoters to a campaign",
      "resource": "promoters"
    },
    {
      "name": "Reject Promoters",
      "value": "reject",
      "action": "Reject promoters",
      "resource": "promoters"
    },
    {
      "name": "Restore Promoters",
      "value": "restore",
      "action": "Restore promoters",
      "resource": "promoters"
    },
    {
      "name": "Update Promoters",
      "value": "update promoter",
      "action": "Update a promoter",
      "resource": "promoters"
    },
    {
      "name": "Archive Promo Code By ID",
      "value": "archive promo code by id",
      "action": "Archive a promo code by ID",
      "resource": "promo codes"
    },
    {
      "name": "Create Promo Code (Stripe Only)",
      "value": "create promo code",
      "action": "Create a promo code for stripe account only",
      "resource": "promo codes"
    },
    {
      "name": "Get Promo Code By ID",
      "value": "get promo code by id",
      "action": "Get a promo code details by ID",
      "resource": "promo codes"
    },
    {
      "name": "Get Promo Codes",
      "value": "get promo codes",
      "action": "Get promo codes",
      "resource": "promo codes"
    },
    {
      "name": "Update Promo Code By ID",
      "value": "update promo code by id",
      "action": "Update a promo code by ID",
      "resource": "promo codes"
    },
    {
      "name": "Custom FirstPromoter API Call",
      "value": "call",
      "action": "Make a custom v2 API call",
      "resource": "api"
    }
  ]

npm_readme:
  # n8n-nodes-firstpromoter

  This is the official FirstPromoter community node for n8n that lets you start a workflow when a webhook event is received or use FirstPromoter v2 API to perform a number of [actions](#-operations-actions). For more details, see [FirstPromoter n8n node documentation](https://docs.firstpromoter.com/automation/n8n-node).


  **[FirstPromoter](https://firstpromoter.com)** is a modern and reliable affiliate tool for subscription-based/SaaS companies that enables you to track, manage, and optimize referral-based marketing programs.

  [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.

  ---

  ## Table of contents

  - [Installation](#-installation) 
  - [Verify Installation](#-verify-installation)
  - [Setting Up Credentials](#-setting-up-credentials)
  - [Webhook or Trigger Setup](#-webhook-or-trigger-setup)
  - [Quick start](#-quick-start)
  - [Operations](#-operations-actions)
  - [Usage](#usage)
  - [Development](#-development)
  - [Compatibility](#compatibility)
  - [Resources](#-resources)

  ## 📦 Installation

  ### GUI Installation

  For self-hosted n8n instances, you can install directly via the web interface:

  1. Open n8n in your browser
  2. Navigate to **Settings** → **Community Nodes**
  3. Click **Install a community node**
  4. Enter package name: `@firstpromoter/n8n-nodes-firstpromoter`
  5. Click **Install**
  6. Wait for installation to complete
  7. Refresh your browser

  **Note**: This method requires owner/admin permissions and is only available for self-hosted n8n (not n8n Cloud).

  ### n8n Cloud

  The FirstPromoter node requires verification to be available on n8n Cloud. n8n Cloud supports a select group of verified community nodes included in their official catalog.

  >**Current Status**: Until the node is verified and included in the Cloud-available catalog, use self-hosted n8n (local or Docker) with any installation methods above.

  ## 🔧 Verify Installation

  After installation and restart:

  1. Open n8n in your browser (typically `http://localhost:5678`)
  2. Create a new workflow
  3. Click the **+** button to add a node
  4. Search for **FirstPromoter** in the node picker
  5. The **FirstPromoter** node should appear in the search results

  > If you don't see the node:
  > - Verify the npm installation completed without errors
  > - Ensure you restarted n8n after installation.
  > - Check n8n logs for any loading errors

  ---

  ## 🔑 Setting Up Credentials

  Before using the [FirstPromoter](https://www.npmjs.com/package/@firstpromoter/n8n-nodes-firstpromoter) n8n node, configure your connection credentials:

  | Field | Required | Description |
  |  ---  |    ---   |     ---     |
  | Account ID | yes | FirstPromoter Account ID |
  | API Key | yes | v2 API key |

  To add credentials in n8n instance via web interface, follow the steps below:  
  1. Click the plus icon **+** on top-left
  2. Click **New Credential**
  3. Search for **FirstPromoter API**
  4. Fill in the required fields:
  	 - Account ID
  	 - API key
  5. Click **Save** 		
    
  ### Where to find your credentials on FirstPromoter

  1. Log in to your **FirstPromoter** dashboard.
  2. Go to **Settings → Integrations → API integration** section.
      - Copy your **Account id**.
  3. Click **Manage API keys**
      - Add New API key or copy existing API key

  > **Tip:** If you rotate keys, update the n8n credential and re-run affected workflows.

  ---

  ![Step 1](/screenshots/step-1-click-plus-icon.png) ![Step 2](/screenshots/step-2-new-credentials.png) ![Step 3a](/screenshots/step-3a-search.png) ![Step 3b](/screenshots/step-3b-seach-and-continue.png) ![Step 4&5](/screenshots/step-4-and-5-fill-and-save.png) ![Step 6](/screenshots/step-6-close-dialog.png)

  ---

  ## 🔄 Webhook or Trigger Setup

  > **NB:** The webhook URL will be automatically registered on FirstPromoter through n8n. Therefore you do not need to add it manually.

  #### Endpoint details (reference)
  - **Method**: `POST`
  - **Path**: `receive` (appended to your n8n webhook base URL)

  #### Event type categories
  | Category | Event types |
  | --- | --- |
  | Commission |  `commission.approved`,`commission.created`,`commission.deleted`,`commission.denied`,`commission.pending`,`commission.updated`|
  | Contract Document | `contract_document.signed` |
  | Payments Batch | 	`payments_batch.completed`,`payments_batch.created`,`payments_batch.deleted`,`payments_batch.failed`,`payments_batch.initiated`,`payments_batch.processing`,`payments_batch.updated`|
  | Payout | `payout.commissions.added`,`payout.commissions.removed`,`payout.cancelled`,`payout.completed`,`payout.created`,`payout.deleted`,`payout.failed`,`payout.pending`,`payout.processing`,`payout.updated` |
  | Payout Method | `payout_method.created`, `payout_method.updated`, `payout_method.deleted` |
  | Promoter Campaign |`promoter_campaign.accepted`,`promoter_campaign.blocked`,`promoter_campaign.created`,`promoter_campaign.deleted`,`promoter_campaign.inactive`,`promoter_campaign.pending`,`promoter_campaign.rejected`,`promoter_campaign.updated`|
  | Promoter | `promoter.balance.updated`,`promoter.created`,`promoter.deleted`,`promoter.updated` |
  | Referral | `referral.cancelled`,`referral.converted`,`referral.created`,`referral.deleted`,`referral.moved`,`referral.updated` |

  > For more information, see [documentation](https://docs.firstpromoter.com/webhooks-v2/overview)
  ---

  ## 🚀 Quick start

  ### 1) Add the trigger node in n8n

  1. Create a new workflow in n8n
  2. Search for **FirstPromoter** node and click on it.
  3. Under Triggers, select **On new FirstPromoter event**.
  4. Select or Setup Credentials. See [Setting Up Credentials](#-setting-up-credentials).
  5. Choose **Event Type Category**. 
     > Select **All Categories** to subscribe to every category, then narrow individual events in each category as needed.
  6. Select one or more **Campaign Names or IDs**
  7. Select the specific events you want.

  ### 2) Send test a event (from FirstPromoter)

  To send a test event, follow these steps:

  1. Click **Test this trigger** or **Execute step** in n8n if you haven't done that yet.
  2. Go to your FirstPromoter account and navigate to **Settings** > **Integrations** > **Webhooks** section.
  3. Click the Edit icon next to your corresponding Test or Production URL in FirstPromoter.
  4. In the Test webhook section, click **Select event** and choose your desired event.
  5. Click the **Run Test** button.


  ### 3) Process the event (action node)

  1. Add **FirstPromoter** action node or any action node after the trigger node.
  2. Use the webhook/trigger response payload in the action node added in step 1.

  > NB: All FirstPromoter actions require crendentials for their operation.

  ---

  ## 📋 Operations (actions)

  ### Referral 

  - Delete Referral
  - Get Referral
  - List Referrals
  - Move Referrals
  - Update Referral

  ### Tracking
  - Track Signup
  - Track Sale
  - Track Refund
  - Track Cancellation

  ### Commission

  - Approve Commissions
  - Create Custom Commission
  - Create Sale Commission
  - Deny Commissions
  - List Commissions
  - Mark Non-Monetary Commissions As Fulfilled
  - Mark Non-Monetary Commissions As Unfulfilled
  - Update Commission

  ### Promoter

  - Accept Promoters
  - Add Promoters to Campaign
  - Archive Promoters
  - Assign Parent
  - Block Promoters
  - Create Promoter
  - Get Promoter
  - List Promoters
  - Move Promoters to Campaign
  - Reject Promoters
  - Restore Promoters
  - Update Promoters

  ### Promo Code

  - Archive Promo Code By ID
  - Create Promo Code (Stripe Only)
  - Get Promo Code By ID
  - Get Promo Codes
  - Update Promo Code By ID

  ### Custom API

  - Custom FirstPromoter API Call

  ---

  ## Usage

  ### Custom API call (advanced)

  Use **FirstPromoter → Custom API → Custom FirstPromoter API Call** when you need an endpoint not covered by built-in operations.

  Provide:

  - **Method** (GET, POST, PUT, DELETE)
  - **URL Path** (for example `/company/promoters` — do not include the base URL `https://api.firstpromoter.com/api/v2`)
  - Optional **Query Parameters**, **Headers**, and **Body** (JSON)

  > Only set the parameters you need; empty values are ignored.

  ---

  ## 👨‍💻 Development

  Install from npm:

  ```bash
  npm install @firstpromoter/n8n-nodes-firstpromoter
  ```
  Useful scripts:

  | Command | Description |
  | --- | --- |
  | `npm run build` | Build the package to `dist/` |
  | `npm run dev` | Run n8n with this package in development mode |
  | `npm run lint` | Lint node and credential sources |
  | `npm run lint:fix` | Lint and auto-fix where possible |
  | `npm start` | Build and start n8n with `N8N_CUSTOM_EXTENSIONS` pointing at this repo |

  > For more infomation how to run a node locally, see [documentation](https://docs.n8n.io/integrations/creating-nodes/test/run-node-locally/)
  ---

  ##  🛠️ Compatibility

  - **n8n-workflow**: `>=2` (peer dependency)
  - **Node.js**: `>=22.22.0`

  ---

  ## 📚 Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

  - [FirstPromoter n8n node documentation](https://docs.firstpromoter.com/automation/n8n-node)

  - [FirstPromoter v2 authentication](https://docs.firstpromoter.com/api-reference-v2/api-admin/authentication)

  - [FirstPromoter v2 API documentation](https://docs.firstpromoter.com/api-reference-v2/api-admin/introduction)

  - [FirstPromoter v2 webhooks](https://docs.firstpromoter.com/webhooks-v2/overview)

ai_documentation_summary:
  {"purpose":"Official FirstPromoter community node for n8n that can trigger workflows from FirstPromoter webhook events and interact with the FirstPromoter v2 API. It is used to automate affiliate/referral program workflows for SaaS and subscription businesses.","capabilities":["Trigger workflows when a FirstPromoter webhook event is received","Automatically register the webhook URL with FirstPromoter","Use FirstPromoter v2 API actions","Subscribe to event categories such as Commission, Contract Document, Payments Batch, Payout, Payout Method, Promoter Campaign, Promoter, and Referral","Filter triggers by campaign names or IDs and specific event types"],"authentication":"API key required, along with FirstPromoter Account ID (v2 API key authentication)","commonUseCases":["Start n8n workflows when commissions, referrals, payouts, or promoter events occur in FirstPromoter","Automate affiliate program operations using FirstPromoter v2 API actions","React to webhook events such as referral conversions or commission approvals"],"limitations":["n8n Cloud support requires verification; until then, the node is only usable on self-hosted n8n","Webhook setup is tied to FirstPromoter automatically and requires supported event categories/types"],"relatedNodes":[]}


node_type: n8n-nodes-pdfpipe.pdfPipe
package_name: n8n-nodes-pdfpipe
display_name: PDFPipe
description: Render HTML or URLs to pixel-perfect PDFs using PDFPipe
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: johin714
author_github_url: https://github.com/Johin2/
npm_package_name: n8n-nodes-pdfpipe
npm_version: 1.1.5
community_fetched_at: 2026-07-14T14:40:34.531Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "renderHtml",
      "options": [
        {
          "name": "Render HTML",
          "value": "renderHtml",
          "action": "Render HTML to PDF",
          "description": "Convert an HTML string to a PDF"
        },
        {
          "name": "Render URL",
          "value": "renderUrl",
          "action": "Render URL to PDF",
          "description": "Convert a web page URL to a PDF"
        },
        {
          "name": "Batch Render",
          "value": "batchRender",
          "action": "Batch render to PDF",
          "description": "Render multiple HTML or URL items in a single request"
        },
        {
          "name": "Get Document",
          "value": "getDocument",
          "action": "Get stored document",
          "description": "Retrieve a stored PDF document by ID"
        },
        {
          "name": "List Documents",
          "value": "listDocuments",
          "action": "List stored documents",
          "description": "List all stored PDF documents"
        },
        {
          "name": "Check Usage",
          "value": "checkUsage",
          "action": "Check usage and plan",
          "description": "Check current usage and plan limits"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Render HTML",
      "value": "renderHtml",
      "action": "Render HTML to PDF",
      "description": "Convert an HTML string to a PDF"
    },
    {
      "name": "Render URL",
      "value": "renderUrl",
      "action": "Render URL to PDF",
      "description": "Convert a web page URL to a PDF"
    },
    {
      "name": "Batch Render",
      "value": "batchRender",
      "action": "Batch render to PDF",
      "description": "Render multiple HTML or URL items in a single request"
    },
    {
      "name": "Get Document",
      "value": "getDocument",
      "action": "Get stored document",
      "description": "Retrieve a stored PDF document by ID"
    },
    {
      "name": "List Documents",
      "value": "listDocuments",
      "action": "List stored documents",
      "description": "List all stored PDF documents"
    },
    {
      "name": "Check Usage",
      "value": "checkUsage",
      "action": "Check usage and plan",
      "description": "Check current usage and plan limits"
    }
  ]

npm_readme:
  # n8n-nodes-pdfpipe

  Community n8n node for [PDFPipe](https://pdfpipe.xyz), the HTML-to-PDF API.

  ## Installation

  In your n8n instance, go to **Settings > Community Nodes** and install:

  ```
  n8n-nodes-pdfpipe
  ```

  Or install manually via npm in the n8n data directory:

  ```bash
  npm install n8n-nodes-pdfpipe
  ```

  ## Credentials

  Create a **PDFPipe API** credential with your API key. Keys start with `pp_live_` and can be found in your [PDFPipe dashboard](https://pdfpipe.xyz/dashboard).

  ## Operations

  | Operation | Description |
  |-----------|-------------|
  | Render HTML | Convert an HTML string to a PDF file |
  | Render URL | Convert a web page URL to a PDF file |
  | Batch Render | Render multiple HTML or URL items in one request |
  | Get Document | Retrieve a stored PDF document by ID |
  | List Documents | List all stored PDF documents |
  | Check Usage | Check current usage and plan limits |

  ## Documentation

  Full API reference: [pdfpipe.xyz/docs](https://pdfpipe.xyz/docs)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"PDFPipe is an n8n community node for converting HTML or web page URLs into pixel-perfect PDF files using the PDFPipe HTML-to-PDF API. It also supports managing generated documents and checking account usage.","capabilities":["Render HTML strings to PDF files","Render web page URLs to PDF files","Batch render multiple HTML or URL items in a single request","Get a stored PDF document by ID","List stored PDF documents","Check usage and plan limits"],"authentication":"API key required via PDFPipe API credential (keys start with pp_live_)","commonUseCases":["Generating PDFs from HTML templates in automated workflows","Converting published web pages or URLs into PDFs","Processing multiple documents in bulk","Retrieving and managing previously generated PDF files","Monitoring API usage and plan limits"],"limitations":["Requires a PDFPipe API key","Only supports PDFPipe's HTML-to-PDF API features as documented"],"relatedNodes":[]}


node_type: @strive-task/n8n-nodes-kanbano.kanbano
package_name: @strive-task/n8n-nodes-kanbano
display_name: Kanbano
description: Interact with the Kanbano API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: covium
author_github_url: https://github.com/Strive-Task/n8n-nodes-kanbano.git
npm_package_name: @strive-task/n8n-nodes-kanbano
npm_version: 1.0.1
community_fetched_at: 2026-07-14T14:40:34.532Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "task",
      "options": [
        {
          "name": "Auth",
          "value": "auth"
        },
        {
          "name": "Board",
          "value": "board"
        },
        {
          "name": "Checklist",
          "value": "checklist"
        },
        {
          "name": "Column",
          "value": "column"
        },
        {
          "name": "Firebase",
          "value": "firebase"
        },
        {
          "name": "Tag",
          "value": "tag"
        },
        {
          "name": "Task",
          "value": "task"
        },
        {
          "name": "Task Message",
          "value": "taskMessage"
        },
        {
          "name": "User",
          "value": "user"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "login",
      "options": [
        {
          "name": "Login",
          "value": "login",
          "action": "Login with email and password",
          "routing": {
            "request": {
              "url": "/auth/login",
              "method": "POST"
            }
          }
        },
        {
          "name": "Recover Password",
          "value": "recoverPassword",
          "action": "Recover password with token",
          "routing": {
            "request": {
              "url": "/auth/recover-password",
              "method": "POST"
            }
          }
        },
        {
          "name": "Refresh",
          "value": "refresh",
          "action": "Refresh access token",
          "routing": {
            "request": {
              "url": "/auth/refresh",
              "method": "GET"
            }
          }
        },
        {
          "name": "Register",
          "value": "register",
          "action": "Register a user",
          "routing": {
            "request": {
              "url": "/auth/register",
              "method": "POST"
            }
          }
        },
        {
          "name": "Request Password Reset",
          "value": "requestPasswordReset",
          "action": "Request a reset password email",
          "routing": {
            "request": {
              "url": "/auth/reset-password",
              "method": "POST"
            }
          }
        },
        {
          "name": "Sign Out",
          "value": "signOut",
          "action": "Sign out by refresh token",
          "routing": {
            "request": {
              "url": "/auth/sign-out",
              "method": "POST"
            }
          }
        },
        {
          "name": "Verify Email Registration",
          "value": "verifyEmailRegistration",
          "action": "Verify email code and create user",
          "routing": {
            "request": {
              "url": "/auth/verify-email-registration",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "auth"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Accept Access Request",
          "value": "acceptAccessRequest",
          "action": "Accept board access request",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/access-request/accept",
              "method": "POST"
            }
          }
        },
        {
          "name": "Add Member",
          "value": "addMember",
          "action": "Add board member by user id and role",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/members",
              "method": "POST"
            }
          }
        },
        {
          "name": "Archive",
          "value": "archive",
          "action": "Archive a board",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/archive",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Change Cover",
          "value": "changeCover",
          "action": "Change board color cover",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/cover",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Change Member Role",
          "value": "changeMemberRole",
          "action": "Change board member role",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/members",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a board",
          "routing": {
            "request": {
              "url": "/boards",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a board",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Duplicate",
          "value": "duplicate",
          "action": "Duplicate a board",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/duplicate",
              "method": "POST"
            }
          }
        },
        {
          "name": "Get Access Requests",
          "value": "getAccessRequests",
          "action": "Get board access requests",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/access-requests",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get boards",
          "routing": {
            "request": {
              "url": "/boards",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Members",
          "value": "getMembers",
          "action": "Get board members",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/members",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Public Token",
          "value": "getPublicToken",
          "action": "Get board public token",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/public-token",
              "method": "GET"
            }
          }
        },
        {
          "name": "Invite Member By Email",
          "value": "inviteMemberByEmail",
          "action": "Invite board member by email",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/members/invite",
              "method": "POST"
            }
          }
        },
        {
          "name": "Is Access Request Sent",
          "value": "isAccessRequestSent",
          "action": "Check whether access request is sent",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/access-request",
              "method": "GET"
            }
          }
        },
        {
          "name": "Precheck Invite",
          "value": "precheckInvite",
          "action": "Precheck board invite by email",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/members/invite-precheck",
              "method": "GET"
            }
          }
        },
        {
          "name": "Reject Access Request",
          "value": "rejectAccessRequest",
          "action": "Reject board access request",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/access-request/reject",
              "method": "POST"
            }
          }
        },
        {
          "name": "Remove Cover",
          "value": "removeCover",
          "action": "Remove board cover",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/cover",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Remove Member",
          "value": "removeMember",
          "action": "Remove board member",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/members/{{$parameter.memberId}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Send Access Request",
          "value": "sendAccessRequest",
          "action": "Send board access request",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/access-request",
              "method": "POST"
            }
          }
        },
        {
          "name": "Set Favorite",
          "value": "setFavorite",
          "action": "Set board favorite state",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/favorite",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Set Public",
          "value": "setPublic",
          "action": "Set board public state",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/public",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Unarchive",
          "value": "unarchive",
          "action": "Unarchive a board",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/unarchive",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Name",
          "value": "updateName",
          "action": "Update board name",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/name",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Order",
          "value": "updateOrder",
          "action": "Update board order",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/order",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "board"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a checklist item",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/checklist",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete checklist item",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Delete All",
          "value": "deleteAll",
          "action": "Delete all checklist items",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/checklist",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get task checklist items",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/checklist",
              "method": "GET"
            }
          }
        },
        {
          "name": "Toggle",
          "value": "toggle",
          "action": "Toggle checklist item checked state",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}/toggle",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Name",
          "value": "updateName",
          "action": "Update checklist item name",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}/name",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Order",
          "value": "updateOrder",
          "action": "Update checklist item order",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}/order",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "checklist"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Archive",
          "value": "archive",
          "action": "Archive a column",
          "routing": {
            "request": {
              "url": "=/boards/columns/{{$parameter.columnId}}/archive",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a column",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/columns",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a column",
          "routing": {
            "request": {
              "url": "=/boards/columns/{{$parameter.columnId}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Duplicate",
          "value": "duplicate",
          "action": "Duplicate a column",
          "routing": {
            "request": {
              "url": "=/boards/columns/{{$parameter.columnId}}/duplicate",
              "method": "POST"
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get board columns",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/columns",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update Name",
          "value": "updateName",
          "action": "Update a column name",
          "routing": {
            "request": {
              "url": "=/boards/columns/{{$parameter.columnId}}/name",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Order",
          "value": "updateOrder",
          "action": "Update a column order",
          "routing": {
            "request": {
              "url": "=/boards/columns/{{$parameter.columnId}}/order",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "column"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "assignToken",
      "options": [
        {
          "name": "Assign Token",
          "value": "assignToken",
          "action": "Assign firebase token to current user",
          "routing": {
            "request": {
              "url": "/firebase",
              "method": "POST"
            }
          }
        },
        {
          "name": "Revoke Token",
          "value": "revokeToken",
          "action": "Revoke firebase token",
          "routing": {
            "request": {
              "url": "=/firebase/{{$parameter.firebaseToken}}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "firebase"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get board tags",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/tags",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a tag",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/tags",
              "method": "POST"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a tag",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/tags/{{$parameter.tagId}}",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a tag",
          "routing": {
            "request": {
              "url": "=/boards/{{$parameter.boardId}}/tags/{{$parameter.tagId}}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Member",
          "value": "addMember",
          "action": "Add task member",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/add-member/{{$parameter.memberId}}",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Add Performer",
          "value": "addPerformer",
          "action": "Add task performer",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/add-performer",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Add Tag",
          "value": "addTag",
          "action": "Attach tag to task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/tags",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Archive",
          "value": "archive",
          "action": "Archive a task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/archive",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a task",
          "routing": {
            "request": {
              "url": "/tasks",
              "method": "POST"
            }
          }
        },
        {
          "name": "Create Share Link",
          "value": "createShareLink",
          "action": "Create or refresh task share link",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/share",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Duplicate",
          "value": "duplicate",
          "action": "Duplicate a task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/duplicate",
              "method": "POST"
            }
          }
        },
        {
          "name": "Get History",
          "value": "getHistory",
          "action": "Get task history",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/history",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get board tasks",
          "routing": {
            "request": {
              "url": "=/tasks/by-board/{{$parameter.boardId}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Share Link",
          "value": "getShareLink",
          "action": "Get task share link",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/share",
              "method": "GET"
            }
          }
        },
        {
          "name": "Move",
          "value": "move",
          "action": "Move task to another column",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/order",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Remove All Performers",
          "value": "removeAllPerformers",
          "action": "Remove all task performers",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/remove-all-performers",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Remove All Tags",
          "value": "removeAllTags",
          "action": "Remove all task tags",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/tags",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Remove Member",
          "value": "removeMember",
          "action": "Remove task member",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/remove-member/{{$parameter.memberId}}",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Remove Performer",
          "value": "removePerformer",
          "action": "Remove task performer",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/remove-performer",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Remove Tag",
          "value": "removeTag",
          "action": "Remove tag from task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/tags/{{$parameter.tagId}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Update Date",
          "value": "updateDate",
          "action": "Update task dates",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/date",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Description",
          "value": "updateDescription",
          "action": "Update task description",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/description",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Name",
          "value": "updateName",
          "action": "Update task name",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/name",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Status",
          "value": "updateStatus",
          "action": "Update task status",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/status",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create task message",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/messages",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete task message",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/messages/{{$parameter.messageId}}/deleted",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get task messages",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/messages",
              "method": "GET"
            }
          }
        },
        {
          "name": "Pin",
          "value": "pin",
          "action": "Pin or unpin task message",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/messages/{{$parameter.messageId}}/pinned",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update task message",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskId}}/messages/{{$parameter.messageId}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "taskMessage"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMe",
      "options": [
        {
          "name": "Change Password",
          "value": "changePassword",
          "action": "Change current user password",
          "routing": {
            "request": {
              "url": "/user/password",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Create Unauthorized",
          "value": "createUnauthorized",
          "action": "Create temporary unauthorized user",
          "routing": {
            "request": {
              "url": "/user/create/unauthorized",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete Avatar",
          "value": "deleteAvatar",
          "action": "Delete current user avatar",
          "routing": {
            "request": {
              "url": "/user/avatar",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Delete Me",
          "value": "deleteMe",
          "action": "Delete current user account",
          "routing": {
            "request": {
              "url": "/user/me",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Get Me",
          "value": "getMe",
          "action": "Get current user profile",
          "routing": {
            "request": {
              "url": "/user/me",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update Name",
          "value": "updateName",
          "action": "Update current user name",
          "routing": {
            "request": {
              "url": "/user/me/name",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Login",
      "value": "login",
      "action": "Login with email and password",
      "routing": {
        "request": {
          "url": "/auth/login",
          "method": "POST"
        }
      },
      "resource": "auth"
    },
    {
      "name": "Recover Password",
      "value": "recoverPassword",
      "action": "Recover password with token",
      "routing": {
        "request": {
          "url": "/auth/recover-password",
          "method": "POST"
        }
      },
      "resource": "auth"
    },
    {
      "name": "Refresh",
      "value": "refresh",
      "action": "Refresh access token",
      "routing": {
        "request": {
          "url": "/auth/refresh",
          "method": "GET"
        }
      },
      "resource": "auth"
    },
    {
      "name": "Register",
      "value": "register",
      "action": "Register a user",
      "routing": {
        "request": {
          "url": "/auth/register",
          "method": "POST"
        }
      },
      "resource": "auth"
    },
    {
      "name": "Request Password Reset",
      "value": "requestPasswordReset",
      "action": "Request a reset password email",
      "routing": {
        "request": {
          "url": "/auth/reset-password",
          "method": "POST"
        }
      },
      "resource": "auth"
    },
    {
      "name": "Sign Out",
      "value": "signOut",
      "action": "Sign out by refresh token",
      "routing": {
        "request": {
          "url": "/auth/sign-out",
          "method": "POST"
        }
      },
      "resource": "auth"
    },
    {
      "name": "Verify Email Registration",
      "value": "verifyEmailRegistration",
      "action": "Verify email code and create user",
      "routing": {
        "request": {
          "url": "/auth/verify-email-registration",
          "method": "POST"
        }
      },
      "resource": "auth"
    },
    {
      "name": "Accept Access Request",
      "value": "acceptAccessRequest",
      "action": "Accept board access request",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/access-request/accept",
          "method": "POST"
        }
      },
      "resource": "board"
    },
    {
      "name": "Add Member",
      "value": "addMember",
      "action": "Add board member by user id and role",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/members",
          "method": "POST"
        }
      },
      "resource": "board"
    },
    {
      "name": "Archive",
      "value": "archive",
      "action": "Archive a board",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/archive",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Change Cover",
      "value": "changeCover",
      "action": "Change board color cover",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/cover",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Change Member Role",
      "value": "changeMemberRole",
      "action": "Change board member role",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/members",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a board",
      "routing": {
        "request": {
          "url": "/boards",
          "method": "POST"
        }
      },
      "resource": "board"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a board",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}",
          "method": "DELETE"
        }
      },
      "resource": "board"
    },
    {
      "name": "Duplicate",
      "value": "duplicate",
      "action": "Duplicate a board",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/duplicate",
          "method": "POST"
        }
      },
      "resource": "board"
    },
    {
      "name": "Get Access Requests",
      "value": "getAccessRequests",
      "action": "Get board access requests",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/access-requests",
          "method": "GET"
        }
      },
      "resource": "board"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get boards",
      "routing": {
        "request": {
          "url": "/boards",
          "method": "GET"
        }
      },
      "resource": "board"
    },
    {
      "name": "Get Members",
      "value": "getMembers",
      "action": "Get board members",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/members",
          "method": "GET"
        }
      },
      "resource": "board"
    },
    {
      "name": "Get Public Token",
      "value": "getPublicToken",
      "action": "Get board public token",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/public-token",
          "method": "GET"
        }
      },
      "resource": "board"
    },
    {
      "name": "Invite Member By Email",
      "value": "inviteMemberByEmail",
      "action": "Invite board member by email",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/members/invite",
          "method": "POST"
        }
      },
      "resource": "board"
    },
    {
      "name": "Is Access Request Sent",
      "value": "isAccessRequestSent",
      "action": "Check whether access request is sent",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/access-request",
          "method": "GET"
        }
      },
      "resource": "board"
    },
    {
      "name": "Precheck Invite",
      "value": "precheckInvite",
      "action": "Precheck board invite by email",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/members/invite-precheck",
          "method": "GET"
        }
      },
      "resource": "board"
    },
    {
      "name": "Reject Access Request",
      "value": "rejectAccessRequest",
      "action": "Reject board access request",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/access-request/reject",
          "method": "POST"
        }
      },
      "resource": "board"
    },
    {
      "name": "Remove Cover",
      "value": "removeCover",
      "action": "Remove board cover",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/cover",
          "method": "DELETE"
        }
      },
      "resource": "board"
    },
    {
      "name": "Remove Member",
      "value": "removeMember",
      "action": "Remove board member",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/members/{{$parameter.memberId}}",
          "method": "DELETE"
        }
      },
      "resource": "board"
    },
    {
      "name": "Send Access Request",
      "value": "sendAccessRequest",
      "action": "Send board access request",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/access-request",
          "method": "POST"
        }
      },
      "resource": "board"
    },
    {
      "name": "Set Favorite",
      "value": "setFavorite",
      "action": "Set board favorite state",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/favorite",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Set Public",
      "value": "setPublic",
      "action": "Set board public state",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/public",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Unarchive",
      "value": "unarchive",
      "action": "Unarchive a board",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/unarchive",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Update Name",
      "value": "updateName",
      "action": "Update board name",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/name",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Update Order",
      "value": "updateOrder",
      "action": "Update board order",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/order",
          "method": "PATCH"
        }
      },
      "resource": "board"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a checklist item",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/checklist",
          "method": "POST"
        }
      },
      "resource": "checklist"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete checklist item",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}",
          "method": "DELETE"
        }
      },
      "resource": "checklist"
    },
    {
      "name": "Delete All",
      "value": "deleteAll",
      "action": "Delete all checklist items",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/checklist",
          "method": "DELETE"
        }
      },
      "resource": "checklist"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get task checklist items",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/checklist",
          "method": "GET"
        }
      },
      "resource": "checklist"
    },
    {
      "name": "Toggle",
      "value": "toggle",
      "action": "Toggle checklist item checked state",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}/toggle",
          "method": "PATCH"
        }
      },
      "resource": "checklist"
    },
    {
      "name": "Update Name",
      "value": "updateName",
      "action": "Update checklist item name",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}/name",
          "method": "PATCH"
        }
      },
      "resource": "checklist"
    },
    {
      "name": "Update Order",
      "value": "updateOrder",
      "action": "Update checklist item order",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/checklist/{{$parameter.checklistItemId}}/order",
          "method": "PATCH"
        }
      },
      "resource": "checklist"
    },
    {
      "name": "Archive",
      "value": "archive",
      "action": "Archive a column",
      "routing": {
        "request": {
          "url": "=/boards/columns/{{$parameter.columnId}}/archive",
          "method": "PATCH"
        }
      },
      "resource": "column"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a column",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/columns",
          "method": "POST"
        }
      },
      "resource": "column"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a column",
      "routing": {
        "request": {
          "url": "=/boards/columns/{{$parameter.columnId}}",
          "method": "DELETE"
        }
      },
      "resource": "column"
    },
    {
      "name": "Duplicate",
      "value": "duplicate",
      "action": "Duplicate a column",
      "routing": {
        "request": {
          "url": "=/boards/columns/{{$parameter.columnId}}/duplicate",
          "method": "POST"
        }
      },
      "resource": "column"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get board columns",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/columns",
          "method": "GET"
        }
      },
      "resource": "column"
    },
    {
      "name": "Update Name",
      "value": "updateName",
      "action": "Update a column name",
      "routing": {
        "request": {
          "url": "=/boards/columns/{{$parameter.columnId}}/name",
          "method": "PATCH"
        }
      },
      "resource": "column"
    },
    {
      "name": "Update Order",
      "value": "updateOrder",
      "action": "Update a column order",
      "routing": {
        "request": {
          "url": "=/boards/columns/{{$parameter.columnId}}/order",
          "method": "PATCH"
        }
      },
      "resource": "column"
    },
    {
      "name": "Assign Token",
      "value": "assignToken",
      "action": "Assign firebase token to current user",
      "routing": {
        "request": {
          "url": "/firebase",
          "method": "POST"
        }
      },
      "resource": "firebase"
    },
    {
      "name": "Revoke Token",
      "value": "revokeToken",
      "action": "Revoke firebase token",
      "routing": {
        "request": {
          "url": "=/firebase/{{$parameter.firebaseToken}}",
          "method": "DELETE"
        }
      },
      "resource": "firebase"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get board tags",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/tags",
          "method": "GET"
        }
      },
      "resource": "tag"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a tag",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/tags",
          "method": "POST"
        }
      },
      "resource": "tag"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a tag",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/tags/{{$parameter.tagId}}",
          "method": "PATCH"
        }
      },
      "resource": "tag"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a tag",
      "routing": {
        "request": {
          "url": "=/boards/{{$parameter.boardId}}/tags/{{$parameter.tagId}}",
          "method": "DELETE"
        }
      },
      "resource": "tag"
    },
    {
      "name": "Add Member",
      "value": "addMember",
      "action": "Add task member",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/add-member/{{$parameter.memberId}}",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Add Performer",
      "value": "addPerformer",
      "action": "Add task performer",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/add-performer",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Add Tag",
      "value": "addTag",
      "action": "Attach tag to task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/tags",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Archive",
      "value": "archive",
      "action": "Archive a task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/archive",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a task",
      "routing": {
        "request": {
          "url": "/tasks",
          "method": "POST"
        }
      },
      "resource": "task"
    },
    {
      "name": "Create Share Link",
      "value": "createShareLink",
      "action": "Create or refresh task share link",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/share",
          "method": "POST"
        }
      },
      "resource": "task"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}",
          "method": "DELETE"
        }
      },
      "resource": "task"
    },
    {
      "name": "Duplicate",
      "value": "duplicate",
      "action": "Duplicate a task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/duplicate",
          "method": "POST"
        }
      },
      "resource": "task"
    },
    {
      "name": "Get History",
      "value": "getHistory",
      "action": "Get task history",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/history",
          "method": "GET"
        }
      },
      "resource": "task"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get board tasks",
      "routing": {
        "request": {
          "url": "=/tasks/by-board/{{$parameter.boardId}}",
          "method": "GET"
        }
      },
      "resource": "task"
    },
    {
      "name": "Get Share Link",
      "value": "getShareLink",
      "action": "Get task share link",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/share",
          "method": "GET"
        }
      },
      "resource": "task"
    },
    {
      "name": "Move",
      "value": "move",
      "action": "Move task to another column",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/order",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Remove All Performers",
      "value": "removeAllPerformers",
      "action": "Remove all task performers",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/remove-all-performers",
          "method": "DELETE"
        }
      },
      "resource": "task"
    },
    {
      "name": "Remove All Tags",
      "value": "removeAllTags",
      "action": "Remove all task tags",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/tags",
          "method": "DELETE"
        }
      },
      "resource": "task"
    },
    {
      "name": "Remove Member",
      "value": "removeMember",
      "action": "Remove task member",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/remove-member/{{$parameter.memberId}}",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Remove Performer",
      "value": "removePerformer",
      "action": "Remove task performer",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/remove-performer",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Remove Tag",
      "value": "removeTag",
      "action": "Remove tag from task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/tags/{{$parameter.tagId}}",
          "method": "DELETE"
        }
      },
      "resource": "task"
    },
    {
      "name": "Update Date",
      "value": "updateDate",
      "action": "Update task dates",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/date",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Update Description",
      "value": "updateDescription",
      "action": "Update task description",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/description",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Update Name",
      "value": "updateName",
      "action": "Update task name",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/name",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Update Status",
      "value": "updateStatus",
      "action": "Update task status",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/status",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create task message",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/messages",
          "method": "POST"
        }
      },
      "resource": "taskMessage"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete task message",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/messages/{{$parameter.messageId}}/deleted",
          "method": "PATCH"
        }
      },
      "resource": "taskMessage"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get task messages",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/messages",
          "method": "GET"
        }
      },
      "resource": "taskMessage"
    },
    {
      "name": "Pin",
      "value": "pin",
      "action": "Pin or unpin task message",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/messages/{{$parameter.messageId}}/pinned",
          "method": "PATCH"
        }
      },
      "resource": "taskMessage"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update task message",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskId}}/messages/{{$parameter.messageId}}",
          "method": "PATCH"
        }
      },
      "resource": "taskMessage"
    },
    {
      "name": "Change Password",
      "value": "changePassword",
      "action": "Change current user password",
      "routing": {
        "request": {
          "url": "/user/password",
          "method": "PATCH"
        }
      },
      "resource": "user"
    },
    {
      "name": "Create Unauthorized",
      "value": "createUnauthorized",
      "action": "Create temporary unauthorized user",
      "routing": {
        "request": {
          "url": "/user/create/unauthorized",
          "method": "POST"
        }
      },
      "resource": "user"
    },
    {
      "name": "Delete Avatar",
      "value": "deleteAvatar",
      "action": "Delete current user avatar",
      "routing": {
        "request": {
          "url": "/user/avatar",
          "method": "DELETE"
        }
      },
      "resource": "user"
    },
    {
      "name": "Delete Me",
      "value": "deleteMe",
      "action": "Delete current user account",
      "routing": {
        "request": {
          "url": "/user/me",
          "method": "DELETE"
        }
      },
      "resource": "user"
    },
    {
      "name": "Get Me",
      "value": "getMe",
      "action": "Get current user profile",
      "routing": {
        "request": {
          "url": "/user/me",
          "method": "GET"
        }
      },
      "resource": "user"
    },
    {
      "name": "Update Name",
      "value": "updateName",
      "action": "Update current user name",
      "routing": {
        "request": {
          "url": "/user/me/name",
          "method": "PATCH"
        }
      },
      "resource": "user"
    }
  ]

npm_readme:
  # n8n-nodes-kanbano

  This is an n8n official node for the Kanbano API. It lets you automate authentication, users, board collaboration, tasks, messages, tags, checklist items, and notification token management in n8n workflows.

  Published package: `@strive-task/n8n-nodes-kanbano`

  [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/sustainable-use-license/) workflow automation platform.

  [Installation](#installation)
  [Operations](#operations)
  [Credentials](#credentials)
  [Compatibility](#compatibility)
  [Usage](#usage)
  [Resources](#resources)
  [Publishing](#publishing)
  [Version history](#version-history)

  ## Installation

  Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.

  ## Operations

  Supported resources and operations:

  - **Board**: get many, create, update name, update order, set favorite, set public, archive, unarchive, duplicate, delete
  - **Board (collaboration)**: get members, add member, invite member by email, change member role, remove member, precheck invite, send access request, accept/reject request, check pending request, get access requests, get public token
  - **Board (cover)**: change cover value, remove cover
  - **Auth**: register, login, verify email registration, refresh, request password reset, recover password, sign out
  - **Column**: get many, create, update name, update order, archive, duplicate, delete
  - **Firebase**: assign token, revoke token
  - **Task**: get many (with filters), create, update name, update description, update status, update date, move, add/remove performer, add/remove member, add/remove tag, archive, duplicate, get history, delete
  - **Task (sharing/advanced)**: create share link, get share link, remove all performers, remove all tags
  - **Task Message**: get many, create, update, pin/unpin, delete
  - **Tag**: get many, create, update, delete
  - **User**: get me, update name, change password, create unauthorized user, delete avatar, delete me
  - **Checklist**: get many, create, update name, update order, toggle, delete, delete all

  ## Credentials

  Create a `Kanbano API` credential in n8n and choose one authentication mode:

  1. **Access Token**
     - Paste a valid Kanbano access token
     - Useful when tokens are managed outside n8n
  2. **Email & Password (Auto Refresh)**
     - Provide Kanbano account email/password
     - Node logs in and refreshes tokens automatically

  You can also override the API base URL (default: `https://api.kanbano.ru`).

  ## Compatibility

  Tested with current n8n community node tooling (`@n8n/node-cli`). Keep n8n reasonably up to date for the best compatibility.

  ## Usage

  Common flows:

  - Sync board data: `Board -> Get Many`, then `Column -> Get Many`, then `Task -> Get Many`
  - Create and move tasks: `Task -> Create`, then `Task -> Move`
  - Complete work items: `Task -> Update Status` with `Completed`
  - Manage labels and checklist:
    - `Tag -> Create/Update/Delete`
    - `Checklist -> Create/Toggle/Delete`
  - Manage collaboration:
    - `Board -> Invite Member By Email`
    - `Board -> Get Access Requests` then `Accept Access Request` or `Reject Access Request`
  - Work with task messages:
    - `Task Message -> Get Many`, `Create`, `Pin`, `Delete`
  - Manage session lifecycle:
    - `Auth -> Login`, `Refresh`, `Sign Out`

  Order fields are entered in UI units. The node automatically scales them to Kanbano API order format.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Kanbano API docs](https://docs.kanbano.ru/)

  ## Publishing

  Release model:

  - Push to `main` runs CI (`lint` + `build`).
  - Pushing a tag like `v0.3.0` runs the publish workflow and publishes to npm.

  GitHub Actions prerequisites:

  - Repository secret `NPM_TOKEN` must be set.
  - npm token must have publish permissions for `@strive-task`.
  - Package is configured as public scoped package through `publishConfig`.

  Manual preflight before creating a release tag:

  - `pnpm lint`
  - `pnpm build`
  - Optional: `npm pack`

  ## Version history

  - `0.1.0`: initial Kanbano MVP with board/column/task/tag/checklist support.
  - `0.2.0`: expanded authenticated API coverage for auth, users, board collaboration, task sharing, and task messages.

ai_documentation_summary:
  {"purpose":"This node provides n8n workflow access to the Kanbano API for automating board, task, collaboration, authentication, messaging, tagging, checklist, and user-management actions. It supports both standard CRUD-style operations and collaborative workflow management.","capabilities":["Board management: get many, create, update name/order, set favorite/public, archive/unarchive, duplicate, delete","Board collaboration: get/add/invite/change role/remove members, precheck invites, send/handle access requests, get public token","Board cover actions: change cover value, remove cover","Authentication flows: register, login, verify email registration, refresh token, request password reset, recover password, sign out","Column management: get many, create, update name/order, archive, duplicate, delete","Firebase token management: assign token, revoke token","Task management: get many with filters, create, update name/description/status/date, move, add/remove performers, members, and tags, archive, duplicate, get history, delete","Task sharing/advanced: create share link, get share link, remove all performers, remove all tags","Task message management: get many, create, update, pin/unpin, delete","Tag management: get many, create, update, delete"],"authentication":"Kanbano API credential with either Access Token authentication or Email & Password (Auto Refresh); API base URL can be overridden from the default https://api.kanbano.ru","commonUseCases":["Sync board, column, and task data into downstream systems","Create and move tasks through a Kanbano workflow","Manage labels and checklist items for tasks","Handle board collaboration by inviting members and processing access requests","Work with task messages for team communication"],"limitations":["Order fields are entered in UI units and automatically scaled to the Kanbano API order format","Compatibility is based on current n8n community node tooling and n8n should be kept reasonably up to date"],"relatedNodes":["Board","Column","Task","Tag","Checklist"]}


node_type: n8n-nodes-deso.deso
package_name: n8n-nodes-deso
display_name: DeSo
description: Publish DeSo posts and look up DeSo profiles
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: csmediapro
author_github_url: https://github.com/csmediapro/
npm_package_name: n8n-nodes-deso
npm_version: 1.0.7
community_fetched_at: 2026-07-14T14:40:34.533Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Get Profile",
          "value": "getProfile",
          "action": "Get deso profile",
          "description": "Get profile information for a DeSo user"
        },
        {
          "name": "Post",
          "value": "post",
          "action": "Post to deso",
          "description": "Publish a text post, with an optional image, to DeSo"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Profile",
      "value": "getProfile",
      "action": "Get deso profile",
      "description": "Get profile information for a DeSo user"
    },
    {
      "name": "Post",
      "value": "post",
      "action": "Post to deso",
      "description": "Publish a text post, with an optional image, to DeSo"
    }
  ]

npm_readme:
  # n8n-nodes-deso

  Community node for publishing to the [DeSo](https://deso.org) blockchain from [n8n](https://n8n.io) workflows.

  Connect your DeSo wallet, publish text posts with images, and look up DeSo profiles — all directly from n8n workflows.

  ## Features

  - **DeSo Identity credentials** — connect a DeSo wallet from any browser that has the DeSo Identity browser extension installed.
  - **Post to DeSo** — publish public text posts with the selected credential.
  - **Image posts** — attach an existing image URL or use image binary data from a previous workflow node.
  - **Profile lookup** — fetch a DeSo profile by username or public key.
  - **Multiple accounts** — create one credential per DeSo wallet and pick the right one per node instance.

  ## Install

  In **Settings → Community Nodes**, enter:

  ```text
  n8n-nodes-deso
  ```

  For manual installs:

  ```bash
  cd ~/.n8n/nodes
  npm install n8n-nodes-deso --legacy-peer-deps
  ```

  Restart n8n after installing.

  ## Credential Setup

  Each DeSo Identity credential represents one DeSo wallet/account. You need the [DeSo Identity browser extension](https://identity.deso.org) installed in your browser.

  1. In n8n, create a **DeSo Identity API** credential.
  2. Open the **DeSo Auth Page** in a browser that has the DeSo Identity extension:

     ```
     https://csmediapro.github.io/n8n-nodes-deso/auth/
     ```

  3. Click **Connect DeSo Wallet** and complete the DeSo Identity authorization flow.
  4. Copy the credential payload that appears (click **Copy to Clipboard**).
  5. In n8n, paste the full JSON payload into the **Credential Payload** field.
  6. Leave **Node URL** as `https://node.deso.org` unless you intentionally use another DeSo node.
  7. Leave **Spending Limit (Nanos)** at the default unless you need a different DeSo Identity spending limit.
  8. Save the credential.

  > n8n encrypts credential fields at rest. The auth page runs in your browser and does not save, log, or transmit your DeSo credentials to CSMediaPro.

  ### Multiple DeSo Accounts

  Create a separate credential for each DeSo account and name each credential clearly in n8n:

  ```text
  DeSo - Main Account
  DeSo - Brand Account
  DeSo - Test Account
  ```

  Each node instance uses whichever credential you select. Accounts do not share auth state.

  If n8n creates a generic name such as `DeSo Identity account`, rename it from **Settings → Credentials** using the credential list menu.

  ## Operations

  ### Post

  Publishes a public DeSo post.

  **Fields**

  | Field | Description |
  |-------|-------------|
  | Post Text | Text content of the post |
  | Image | `None`, `From Previous Node`, or `From URL` |
  | Image Field | Binary field from the previous node that contains the image. Most n8n image/file nodes use `data`. |
  | Image URL | URL of an existing image to attach |
  | Include Image URL in Post Text | Also append the image URL as plain text at the end of the post |

  #### Text Post

  For a plain text post, set **Post Text** and leave **Image** as `None`.

  #### Image Post From a Previous Node

  Use this when a workflow starts with an image from a webhook, chat app, form upload, HTTP Request node, or another n8n node.

  1. Add a node before DeSo that outputs the image as binary data.
  2. Connect that node to the DeSo node.
  3. In the DeSo node, set **Image** to `From Previous Node`.
  4. Set **Image Field** to the binary field name from the previous node. The default is usually `data`.
  5. Set **Post Text** and run the node.

  The DeSo node uploads the binary image first, then attaches the resulting image URL to the DeSo post.

  #### Image Post From a URL

  Use this when you already have a public image URL.

  1. Set **Image** to `From URL`.
  2. Paste the URL into **Image URL**.
  3. Set **Post Text** and run the node.

  **Output**

  ```json
  {
    "postedAs": "Username",
    "publicKey": "BC1YL...",
    "postHash": "abcdef...",
    "txnHash": "1234...",
    "postUrl": "https://deso.org/posts/abcdef...",
    "imageUrls": [],
    "inMempool": true,
    "confirmationBlockHeight": null
  }
  ```

  ### Get Profile

  Fetches a DeSo profile by public key or username. Leave the input blank to fetch the profile belonging to the selected credential.

  **Output**

  ```json
  {
    "username": "Username",
    "publicKey": "BC1YL...",
    "description": "...",
    "isVerified": false,
    "desoBalance": 0.5,
    "profilePictureUrl": "https://node.deso.org/...",
    "coinPriceDesoNanos": 1000
  }
  ```

  ## Image Notes

  When using binary image data, the node uploads the image to DeSo's image endpoint before submitting the post. The image URL is automatically attached to the post, so you do not need to upload images separately.

  For best compatibility, keep images at or below 10 MB.

  ## Security

  - DeSo posts are public.
  - The credential payload contains derived signing material — treat it like a password.
  - Workflow output never includes the JWT, seed, or raw credential payload.
  - The auth page runs client-side in your browser and does not save, log, or transmit your DeSo credentials to CSMediaPro.
  - Revoke derived keys through [DeSo Identity](https://identity.deso.org) if a credential is exposed.

  ## Development

  ```bash
  npm install
  npm run build          # bundle the local signer and compile TypeScript
  ```

  The DeSo Identity auth page is a static browser page hosted outside the installed n8n node package.
  The n8n runtime does not import or bundle the DeSo browser SDK.

  Local validation:

  ```bash
  npm run test:profile
  npm run test:post
  DESO_TEST_IMAGE_PATH=/path/to/image.jpg npm run test:image-post
  ```

  The post tests create real public DeSo posts.

  ## Built By

  [CSMediaPro](https://csmediapro.com) — custom software, n8n automation, AI integrations, and internal tools for teams that need practical systems.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Publishes public posts to the DeSo blockchain and retrieves DeSo profile information from n8n workflows. It supports text posts, image posts, and profile lookup using a DeSo wallet connected through DeSo Identity.","capabilities":["Publish public DeSo text posts","Publish image posts from a previous node's binary data","Publish image posts from an existing image URL","Fetch a DeSo profile by username","Fetch a DeSo profile by public key","Use different DeSo wallet credentials per node instance"],"authentication":"DeSo Identity API credential with browser-based DeSo Identity wallet connection; requires the DeSo Identity browser extension and pasted credential payload","commonUseCases":["Posting updates or announcements to DeSo from an automated workflow","Uploading and publishing image-based posts from forms, webhooks, or HTTP downloads","Looking up user profile details by username or public key"],"limitations":["Posts are public only","Image uploads should be kept at or below 10 MB for best compatibility","Workflow output does not include JWT, seed, or raw credential payload"],"relatedNodes":[]}


node_type: n8n-nodes-sendcloud.sendCloudTrigger
package_name: n8n-nodes-sendcloud
display_name: SendCloud Trigger
description: Starts the workflow when SendCloud sends an email event (delivery, bounce, open, click…)
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: fbc623
author_github_url: https://github.com/fabianoobispo1/
npm_package_name: n8n-nodes-sendcloud
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.534Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-sendcloud

  [n8n](https://n8n.io) community node for [SendCloud](https://sendcloud.dev.br) — a Brazilian transactional email API.

  ## Installation

  In n8n: **Settings → Community Nodes → Install** and enter `n8n-nodes-sendcloud`.

  Self-hosted via CLI:

  ```bash
  npm install n8n-nodes-sendcloud
  ```

  ## Credentials

  1. Create an account at [sendcloud.dev.br](https://sendcloud.dev.br) and verify your sending domain
  2. Generate an API key in **Dashboard → API Keys**
  3. In n8n, create a **SendCloud API** credential with the key

  ## Nodes

  ### SendCloud

  | Resource | Operations |
  |---|---|
  | Email | Send, Send Batch (template to up to 500 recipients), Get, Get Many, Cancel (scheduled), Resend |
  | Template | Get, Get Many, Render (preview with test data) |

  Sending supports HTML, plain text, or Handlebars templates with variables, plus cc/bcc, reply-to, tags, metadata, scheduling (`scheduledFor`), idempotency keys, and attachments from workflow binary data.

  ### SendCloud Trigger

  Receives email events via webhook, with automatic endpoint registration/removal when the workflow is activated:

  `sent` · `delivered` · `bounced` · `opened` · `clicked` · `failed` · `unsubscribed` · `quota.warning`

  The HMAC-SHA256 signature (`X-SendCloud-Signature` header) is validated by default.

  ## Example

  Typical workflow: **Webhook (your app) → SendCloud: Send (template `welcome`) → SendCloud Trigger (bounced) → Slack**.

  ## Development

  ```bash
  npm install
  npm run build
  ```

  Publishing to npm is done by the [`publish.yml`](.github/workflows/publish.yml) workflow (GitHub Actions) with [npm provenance](https://docs.npmjs.com/generating-provenance-statements) via trusted publishing.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Receives SendCloud email event webhooks and starts an n8n workflow when events like delivery, bounce, open, or click occur. It automatically registers and removes the webhook endpoint when the workflow is activated or deactivated.","capabilities":["Triggers workflows on SendCloud email events","Supports event types: sent, delivered, bounced, opened, clicked, failed, unsubscribed, and quota.warning","Automatically registers and removes the webhook endpoint on workflow activation/deactivation","Validates incoming webhook signatures using HMAC-SHA256 via the X-SendCloud-Signature header by default"],"authentication":"SendCloud API key required for credential setup; webhook trigger signature validation uses HMAC-SHA256.","commonUseCases":["Start a workflow when an email is delivered, bounced, opened, or clicked","Build email deliverability or engagement monitoring automations","React to unsubscribe or quota warning events from SendCloud"],"limitations":["Only handles the listed SendCloud email event webhook types","Requires a verified sending domain and configured SendCloud API key"],"relatedNodes":["SendCloud","Webhook","Slack"]}


node_type: n8n-nodes-sendcloud.sendCloud
package_name: n8n-nodes-sendcloud
display_name: SendCloud
description: Send transactional emails via SendCloud (sendcloud.dev.br)
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: fbc623
author_github_url: https://github.com/fabianoobispo1/
npm_package_name: n8n-nodes-sendcloud
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.535Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "email",
      "options": [
        {
          "name": "Email",
          "value": "email"
        },
        {
          "name": "Template",
          "value": "template"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send an email",
          "description": "Send an email"
        },
        {
          "name": "Send Batch",
          "value": "sendBatch",
          "action": "Send a batch of emails",
          "description": "Send a template to multiple recipients (max 500)"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an email",
          "description": "Get an email by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many emails",
          "description": "List emails"
        },
        {
          "name": "Cancel",
          "value": "cancel",
          "action": "Cancel a scheduled email",
          "description": "Cancel a scheduled email"
        },
        {
          "name": "Resend",
          "value": "resend",
          "action": "Resend an email",
          "description": "Resend an email"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "email"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a template",
          "description": "Get a template by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many templates",
          "description": "List workspace templates"
        },
        {
          "name": "Render",
          "value": "render",
          "action": "Render a template",
          "description": "Render a template with test data (does not send)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send",
      "value": "send",
      "action": "Send an email",
      "description": "Send an email",
      "resource": "email"
    },
    {
      "name": "Send Batch",
      "value": "sendBatch",
      "action": "Send a batch of emails",
      "description": "Send a template to multiple recipients (max 500)",
      "resource": "email"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an email",
      "description": "Get an email by ID",
      "resource": "email"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many emails",
      "description": "List emails",
      "resource": "email"
    },
    {
      "name": "Cancel",
      "value": "cancel",
      "action": "Cancel a scheduled email",
      "description": "Cancel a scheduled email",
      "resource": "email"
    },
    {
      "name": "Resend",
      "value": "resend",
      "action": "Resend an email",
      "description": "Resend an email",
      "resource": "email"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a template",
      "description": "Get a template by ID",
      "resource": "template"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many templates",
      "description": "List workspace templates",
      "resource": "template"
    },
    {
      "name": "Render",
      "value": "render",
      "action": "Render a template",
      "description": "Render a template with test data (does not send)",
      "resource": "template"
    }
  ]

npm_readme:
  # n8n-nodes-sendcloud

  [n8n](https://n8n.io) community node for [SendCloud](https://sendcloud.dev.br) — a Brazilian transactional email API.

  ## Installation

  In n8n: **Settings → Community Nodes → Install** and enter `n8n-nodes-sendcloud`.

  Self-hosted via CLI:

  ```bash
  npm install n8n-nodes-sendcloud
  ```

  ## Credentials

  1. Create an account at [sendcloud.dev.br](https://sendcloud.dev.br) and verify your sending domain
  2. Generate an API key in **Dashboard → API Keys**
  3. In n8n, create a **SendCloud API** credential with the key

  ## Nodes

  ### SendCloud

  | Resource | Operations |
  |---|---|
  | Email | Send, Send Batch (template to up to 500 recipients), Get, Get Many, Cancel (scheduled), Resend |
  | Template | Get, Get Many, Render (preview with test data) |

  Sending supports HTML, plain text, or Handlebars templates with variables, plus cc/bcc, reply-to, tags, metadata, scheduling (`scheduledFor`), idempotency keys, and attachments from workflow binary data.

  ### SendCloud Trigger

  Receives email events via webhook, with automatic endpoint registration/removal when the workflow is activated:

  `sent` · `delivered` · `bounced` · `opened` · `clicked` · `failed` · `unsubscribed` · `quota.warning`

  The HMAC-SHA256 signature (`X-SendCloud-Signature` header) is validated by default.

  ## Example

  Typical workflow: **Webhook (your app) → SendCloud: Send (template `welcome`) → SendCloud Trigger (bounced) → Slack**.

  ## Development

  ```bash
  npm install
  npm run build
  ```

  Publishing to npm is done by the [`publish.yml`](.github/workflows/publish.yml) workflow (GitHub Actions) with [npm provenance](https://docs.npmjs.com/generating-provenance-statements) via trusted publishing.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"SendCloud is an n8n community node for sending and managing transactional email through the SendCloud (sendcloud.dev.br) API. It also provides a trigger for receiving email event webhooks such as delivery, bounce, open, and click events.","capabilities":["Send single emails","Send batch emails to up to 500 recipients using a template","Get email details","List multiple emails","Cancel scheduled emails","Resend emails","Get templates","List templates","Render template previews with test data","Support HTML, plain text, and Handlebars templates with variables"],"authentication":"API key required via a SendCloud API credential in n8n","commonUseCases":["Send transactional emails such as welcome, verification, and notification messages","Track email lifecycle events like sent, delivered, bounced, opened, clicked, failed, and unsubscribed","Preview or render email templates before sending","Schedule emails and manage them later by canceling or resending","Process email event webhooks and forward them to other apps like Slack"],"limitations":["Send batch email supports up to 500 recipients","Webhook signature validation is enabled by default"],"relatedNodes":["Webhook","Slack"]}


node_type: n8n-nodes-captchasonic.captchaSonic
package_name: n8n-nodes-captchasonic
display_name: CaptchaSonic
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: sonic-dev
author_github_url: https://github.com/Captcha-Sonic/
npm_package_name: n8n-nodes-captchasonic
npm_version: 1.2.4
community_fetched_at: 2026-07-14T14:40:34.536Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  AI-powered CAPTCHA solving — supports reCAPTCHA, popularcaptcha, Turnstile, GeeTest, DataDome, AWS WAF, and more

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "Token",
      "options": [
        {
          "name": "Token",
          "value": "Token"
        },
        {
          "name": "Recognition",
          "value": "Recognition"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "reCAPTCHA v2",
      "options": [
        {
          "name": "reCAPTCHA v2",
          "value": "reCAPTCHA v2",
          "action": "reCAPTCHA v2"
        },
        {
          "name": "reCAPTCHA v3",
          "value": "reCAPTCHA v3",
          "action": "reCAPTCHA v3"
        },
        {
          "name": "PopularCaptcha",
          "value": "PopularCaptcha",
          "action": "PopularCaptcha"
        },
        {
          "name": "Cloudflare Turnstile",
          "value": "Cloudflare Turnstile",
          "action": "Cloudflare Turnstile"
        },
        {
          "name": "Cloudflare Challenge",
          "value": "Cloudflare Challenge",
          "action": "Cloudflare Challenge"
        },
        {
          "name": "GeeTest V3",
          "value": "GeeTest V3",
          "action": "GeeTest V3"
        },
        {
          "name": "GeeTest V4",
          "value": "GeeTest V4",
          "action": "GeeTest V4"
        },
        {
          "name": "DataDome",
          "value": "DataDome",
          "action": "DataDome"
        },
        {
          "name": "AWS WAF",
          "value": "AWS WAF",
          "action": "AWS WAF"
        },
        {
          "name": "MTCaptcha",
          "value": "MTCaptcha",
          "action": "MTCaptcha"
        },
        {
          "name": "Tencent CAPTCHA",
          "value": "Tencent CAPTCHA",
          "action": "Tencent CAPTCHA"
        },
        {
          "name": "CaptchaFox",
          "value": "CaptchaFox",
          "action": "CaptchaFox"
        },
        {
          "name": "Prosopo / Procaptcha",
          "value": "Prosopo / Procaptcha",
          "action": "Prosopo / Procaptcha"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Token"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Image To Text",
      "options": [
        {
          "name": "Image To Text",
          "value": "Image To Text",
          "action": "Image To Text"
        },
        {
          "name": "reCAPTCHA v2 Classification",
          "value": "reCAPTCHA v2 Classification",
          "action": "reCAPTCHA v2 Classification"
        },
        {
          "name": "PopularCaptcha Classification",
          "value": "PopularCaptcha Classification",
          "action": "PopularCaptcha Classification"
        },
        {
          "name": "AWS WAF Classification",
          "value": "AWS WAF Classification",
          "action": "AWS WAF Classification"
        },
        {
          "name": "BLS / OCR",
          "value": "BLS / OCR",
          "action": "BLS / OCR"
        },
        {
          "name": "TikTok CAPTCHA",
          "value": "TikTok CAPTCHA",
          "action": "TikTok CAPTCHA"
        },
        {
          "name": "Binance CAPTCHA",
          "value": "Binance CAPTCHA",
          "action": "Binance CAPTCHA"
        },
        {
          "name": "Vision Engine",
          "value": "Vision Engine",
          "action": "Vision Engine"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Recognition"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "reCAPTCHA v2",
      "value": "reCAPTCHA v2",
      "action": "reCAPTCHA v2",
      "resource": "Token"
    },
    {
      "name": "reCAPTCHA v3",
      "value": "reCAPTCHA v3",
      "action": "reCAPTCHA v3",
      "resource": "Token"
    },
    {
      "name": "PopularCaptcha",
      "value": "PopularCaptcha",
      "action": "PopularCaptcha",
      "resource": "Token"
    },
    {
      "name": "Cloudflare Turnstile",
      "value": "Cloudflare Turnstile",
      "action": "Cloudflare Turnstile",
      "resource": "Token"
    },
    {
      "name": "Cloudflare Challenge",
      "value": "Cloudflare Challenge",
      "action": "Cloudflare Challenge",
      "resource": "Token"
    },
    {
      "name": "GeeTest V3",
      "value": "GeeTest V3",
      "action": "GeeTest V3",
      "resource": "Token"
    },
    {
      "name": "GeeTest V4",
      "value": "GeeTest V4",
      "action": "GeeTest V4",
      "resource": "Token"
    },
    {
      "name": "DataDome",
      "value": "DataDome",
      "action": "DataDome",
      "resource": "Token"
    },
    {
      "name": "AWS WAF",
      "value": "AWS WAF",
      "action": "AWS WAF",
      "resource": "Token"
    },
    {
      "name": "MTCaptcha",
      "value": "MTCaptcha",
      "action": "MTCaptcha",
      "resource": "Token"
    },
    {
      "name": "Tencent CAPTCHA",
      "value": "Tencent CAPTCHA",
      "action": "Tencent CAPTCHA",
      "resource": "Token"
    },
    {
      "name": "CaptchaFox",
      "value": "CaptchaFox",
      "action": "CaptchaFox",
      "resource": "Token"
    },
    {
      "name": "Prosopo / Procaptcha",
      "value": "Prosopo / Procaptcha",
      "action": "Prosopo / Procaptcha",
      "resource": "Token"
    },
    {
      "name": "Image To Text",
      "value": "Image To Text",
      "action": "Image To Text",
      "resource": "Recognition"
    },
    {
      "name": "reCAPTCHA v2 Classification",
      "value": "reCAPTCHA v2 Classification",
      "action": "reCAPTCHA v2 Classification",
      "resource": "Recognition"
    },
    {
      "name": "PopularCaptcha Classification",
      "value": "PopularCaptcha Classification",
      "action": "PopularCaptcha Classification",
      "resource": "Recognition"
    },
    {
      "name": "AWS WAF Classification",
      "value": "AWS WAF Classification",
      "action": "AWS WAF Classification",
      "resource": "Recognition"
    },
    {
      "name": "BLS / OCR",
      "value": "BLS / OCR",
      "action": "BLS / OCR",
      "resource": "Recognition"
    },
    {
      "name": "TikTok CAPTCHA",
      "value": "TikTok CAPTCHA",
      "action": "TikTok CAPTCHA",
      "resource": "Recognition"
    },
    {
      "name": "Binance CAPTCHA",
      "value": "Binance CAPTCHA",
      "action": "Binance CAPTCHA",
      "resource": "Recognition"
    },
    {
      "name": "Vision Engine",
      "value": "Vision Engine",
      "action": "Vision Engine",
      "resource": "Recognition"
    }
  ]

npm_readme:
  # CaptchaSonic — AI CAPTCHA Solver Node for n8n Workflow Automation

  [![npm version](https://img.shields.io/npm/v/n8n-nodes-captchasonic)](https://www.npmjs.com/package/n8n-nodes-captchasonic)
  [![npm downloads](https://img.shields.io/npm/dm/n8n-nodes-captchasonic)](https://www.npmjs.com/package/n8n-nodes-captchasonic)
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE.md)
  [![n8n community node](https://img.shields.io/badge/n8n-community%20node-ff6d5a)](https://www.npmjs.com/package/n8n-nodes-captchasonic)

  > **Solve any CAPTCHA inside n8n** — reCAPTCHA v2/v3, Cloudflare Turnstile, GeeTest, AWS WAF, DataDome, TikTok, and 20+ more types. AI-powered, no proxies required.

  **CaptchaSonic** is the official n8n community node for automated CAPTCHA solving. It integrates directly into your n8n workflows to handle reCAPTCHA v2, reCAPTCHA v3, reCAPTCHA Enterprise, PopularCaptcha, Cloudflare Turnstile, GeeTest V3/V4, DataDome Slider, AWS WAF, MTCaptcha, Tencent CAPTCHA, CaptchaFox, Prosopo/Procaptcha, and image recognition (OCR, classification) — all without writing code.

  ---

  ## ⚡ Quick Start

  ### Install in n8n (30 seconds)

  1. Open n8n → **Settings** → **Community Nodes** → **Install**
  2. Enter `n8n-nodes-captchasonic`
  3. Click **Install** — done!

  Or follow the [n8n community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/).

  ### Get Your API Key

  1. Sign up at **[my.captchasonic.com](https://my.captchasonic.com)** (free credits included)
  2. Copy your API key from the dashboard
  3. In n8n → **Credentials** → **New** → **CaptchaSonic API** → paste key → **Save**

  ### Solve Your First CAPTCHA

  ```
  Manual Trigger → CaptchaSonic → HTTP Request
  ```

  1. Add a **CaptchaSonic** node
  2. Set **Resource** = `Token`, **Operation** = `reCAPTCHA v2`
  3. Enter the target site URL and site key
  4. Execute — get back a solved token in seconds

  ---

  ## 🆚 Why CaptchaSonic for n8n?

  | Feature | CaptchaSonic | CapSolver | 2Captcha | Anti-Captcha |
  |:---|:---:|:---:|:---:|:---:|
  | **Official n8n node** | ✅ | ✅ | ❌ | ❌ |
  | **ProxyLess solving** | ✅ | ✅ | ⚠️ Limited | ⚠️ Limited |
  | **reCAPTCHA v2/v3** | ✅ | ✅ | ✅ | ✅ |
  | **reCAPTCHA Enterprise** | ✅ | ✅ | ⚠️ Partial | ✅ |
  | **Cloudflare Turnstile** | ✅ | ✅ | ⚠️ Partial | ⚠️ Partial |
  | **GeeTest V4** | ✅ | ✅ | ⚠️ Partial | ❌ |
  | **AWS WAF** | ✅ | ✅ | ❌ | ❌ |
  | **DataDome** | ✅ | ✅ | ❌ | ❌ |
  | **Prosopo / Procaptcha** | ✅ | ❌ | ❌ | ❌ |
  | **TikTok CAPTCHA** | ✅ | ❌ | ❌ | ❌ |
  | **Image classification** | ✅ | ✅ | ✅ | ✅ |
  | **AI-powered engine** | ✅ | ✅ | ❌ | ❌ |
  | **Ready-made workflow templates** | ✅ | ✅ | ❌ | ❌ |
  | **Avg. solve time** | ~8s | ~12s | ~20s | ~15s |

  ---

  ## 🎯 Supported CAPTCHA Types

  ### Token-Based (Async Polling)

  The node creates a task, polls every 3 seconds, and returns the solved token. Timeout: 120 seconds.

  | CAPTCHA Type | Task Types | Proxy Required? |
  |:---|:---|:---:|
  | **reCAPTCHA v2** | `ReCaptchaV2Task`, `ReCaptchaV2TaskProxyLess`, `ReCaptchaV2EnterpriseTask`, `ReCaptchaV2EnterpriseTaskProxyLess` | Optional |
  | **reCAPTCHA v3** | `ReCaptchaV3Task`, `ReCaptchaV3TaskProxyLess`, `ReCaptchaV3EnterpriseTask`, `ReCaptchaV3EnterpriseTaskProxyLess` | Optional |
  | **PopularCaptcha** | `PopularCaptchaTask`, `PopularCaptchaTaskProxyLess`, `PopularCaptchaEnterpriseTask`, `PopularCaptchaEnterpriseTaskProxyLess` | Optional |
  | **Cloudflare Turnstile** | `AntiTurnstileTaskProxyLess` | No |
  | **GeeTest V3** | `GeeTestTask`, `GeeTestTaskProxyLess` | Optional |
  | **GeeTest V4** | `GeeTestTask`, `GeeTestTaskProxyLess` | Optional |
  | **DataDome Slider** | `DatadomeSliderTask` | Yes |
  | **AWS WAF** | `AntiAwsWafTask`, `AntiAwsWafTaskProxyLess` | Optional |
  | **MTCaptcha** | `MtCaptchaTask`, `MtCaptchaTaskProxyLess` | Optional |
  | **Tencent CAPTCHA** | `TencentTask`, `TencentTaskProxyLess` | Optional |
  | **CaptchaFox** | `CaptchaFoxTask`, `CaptchaFoxTaskProxyLess` | Optional |
  | **Prosopo / Procaptcha** | `ProsopoTask`, `ProsopoTaskProxyLess` | Optional |

  ### Image Recognition (Immediate Response)

  These return the result instantly — no polling, no waiting.

  | CAPTCHA Type | Task Type | Input |
  |:---|:---|:---|
  | **Image To Text** | `ImageToTextTask` | Base64 image |
  | **reCAPTCHA v2 Classification** | `ReCaptchaV2Classification` | Image grid + question |
  | **PopularCaptcha Classification** | `PopularCaptchaClassification` | Image + question + choices |
  | **AWS WAF Classification** | `AwsWafClassification` | Image + question |
  | **BLS / OCR** | `BLSTask` | Image(s) + module |
  | **TikTok CAPTCHA** | `TikTokTask` | Image + question |
  | **Binance CAPTCHA** | `BinanceTask` | Image + question |
  | **Vision Engine** | `VisionEngine` | Image + prompt |

  ---

  ## 📖 Usage Examples

  ### Example 1: Solve reCAPTCHA v2 and Submit a Form

  ```
  Webhook (POST) → CaptchaSonic (reCAPTCHA v2) → HTTP Request (submit form) → Respond to Webhook
  ```

  **CaptchaSonic node config:**
  - **Resource:** Token
  - **Operation:** reCAPTCHA v2
  - **Task Type:** `ReCaptchaV2TaskProxyLess`
  - **Website URL:** `https://example.com/login`
  - **Website Key:** `6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-`

  **Output:** `{ "solution": { "gRecaptchaResponse": "03AGdBq25..." } }`

  ### Example 2: Bypass Cloudflare Turnstile Protection

  ```
  Schedule Trigger (every 1h) → CaptchaSonic (Turnstile) → HTTP Request (access protected page) → Process Data
  ```

  **CaptchaSonic node config:**
  - **Resource:** Token
  - **Operation:** Cloudflare Turnstile
  - **Task Type:** `AntiTurnstileTaskProxyLess`
  - **Website URL:** `https://protected-site.com`
  - **Website Key:** `0x4AAAAAAA...`

  ### Example 3: OCR — Read Text from CAPTCHA Image

  ```
  Manual Trigger → Set Image (base64) → CaptchaSonic (Image To Text) → Format Result
  ```

  **CaptchaSonic node config:**
  - **Resource:** Recognition
  - **Operation:** Image To Text
  - **Task Type:** `ImageToTextTask`
  - **Image:** `{{ $json.imageBase64 }}`

  **Output:** `{ "solution": { "text": "Xk9pQ2" } }`

  ### Example 4: Classify reCAPTCHA v2 Image Grid

  ```
  Webhook → CaptchaSonic (reCAPTCHA v2 Classification) → Respond to Webhook
  ```

  **CaptchaSonic node config:**
  - **Resource:** Recognition
  - **Operation:** reCAPTCHA v2 Classification
  - **Image:** base64-encoded 3×3 grid
  - **Question:** `traffic lights`

  **Output:** `{ "solution": { "objects": [true, false, true, ...] } }`

  ---

  ## 🔧 Ready-Made Workflow Templates

  Import these directly into n8n — each includes a webhook endpoint, manual test trigger, and hardcoded sample images for one-click testing.

  | Workflow | CAPTCHA Type | Mode | Webhook Path |
  |:---|:---|:---|:---|
  | [`recaptcha-v2.json`](sonic-workflows/recaptcha-v2.json) | reCAPTCHA v2 Classification | Recognition | `/solve-recaptcha-v2` |
  | [`bls-ocr.json`](sonic-workflows/bls-ocr.json) | BLS / OCR | Recognition | `/solve-bls-ocr` |
  | [`popularcaptcha.json`](sonic-workflows/popularcaptcha.json) | PopularCaptcha Classification | Recognition | `/solve-popularcaptcha` |
  | [`mtcaptcha.json`](sonic-workflows/mtcaptcha.json) | MTCaptcha OCR | Recognition | `/solve-mtcaptcha` |
  | [`tiktok.json`](sonic-workflows/tiktok.json) | TikTok CAPTCHA | Recognition | `/solve-tiktok` |

  ### How to Use a Template

  1. Download the `.json` file
  2. In n8n → **Workflows** → **Import from File**
  3. Add your **CaptchaSonic API** credential to the CaptchaSonic nodes
  4. Click **Manual Trigger** → **Test Workflow** to verify it works
  5. Activate the webhook for production use

  ---

  ## ⚙️ Node Parameters Reference

  ### Token Resource

  | Parameter | Required | Description |
  |:---|:---:|:---|
  | **Operation** | ✅ | CAPTCHA type (reCAPTCHA v2, Turnstile, etc.) |
  | **Task Type** | ✅ | Specific task variant (ProxyLess, Enterprise, etc.) |
  | **Website URL** | ✅ | URL of the page with the CAPTCHA |
  | **Website Key** | ✅ | Site key from the CAPTCHA element |
  | **Proxy** | ❌ | Proxy URL (only for non-ProxyLess types) |
  | **User Agent** | ❌ | Custom user agent string |

  **Optional fields** (varies by type):
  - `isInvisible` — for invisible reCAPTCHA
  - `apiDomain` — custom API domain
  - `pageAction` — reCAPTCHA v3 action
  - `minScore` — reCAPTCHA v3 minimum score
  - `enterprisePayload` — Enterprise additional data

  ### Recognition Resource

  | Parameter | Required | Description |
  |:---|:---:|:---|
  | **Operation** | ✅ | Recognition type (Image To Text, BLS/OCR, etc.) |
  | **Task Type** | ✅ | API task type identifier |
  | **Image** | ✅ | Base64-encoded CAPTCHA image |
  | **Question** | ❌ | Classification question (e.g. "traffic lights") |
  | **Module** | ❌ | OCR module (e.g. `bls`, `mtcaptcha`) |
  | **Images 1–9** | ❌ | Additional grid images for multi-image tasks |

  ---

  ## ❓ FAQ

  <details>
  <summary><strong>How do I install CaptchaSonic in n8n?</strong></summary>

  Go to **Settings → Community Nodes → Install**, enter `n8n-nodes-captchasonic`, and click Install. The node will appear in your node panel immediately.
  </details>

  <details>
  <summary><strong>Do I need a proxy to solve reCAPTCHA?</strong></summary>

  No. Use `ProxyLess` task types (e.g. `ReCaptchaV2TaskProxyLess`) and CaptchaSonic handles everything server-side. Proxies are only needed for `DatadomeSliderTask` and non-ProxyLess variants.
  </details>

  <details>
  <summary><strong>How long does it take to solve a CAPTCHA?</strong></summary>

  - **Token tasks:** Polled every 3s, 120s timeout. Most solve in **5–15 seconds**.
  - **Recognition tasks:** Return immediately, typically **1–3 seconds**.
  </details>

  <details>
  <summary><strong>What is the difference between Token and Recognition?</strong></summary>

  - **Token** = the node solves a live CAPTCHA on a website and returns a token string (e.g. `gRecaptchaResponse`) that you submit to the target site.
  - **Recognition** = the node analyzes a CAPTCHA image you provide and returns the text, classification, or object detection result immediately.
  </details>

  <details>
  <summary><strong>Can I solve reCAPTCHA Enterprise?</strong></summary>

  Yes. Use `ReCaptchaV2EnterpriseTaskProxyLess` or `ReCaptchaV3EnterpriseTaskProxyLess`. Set the `enterprisePayload` field if the site requires additional parameters.
  </details>

  <details>
  <summary><strong>How do I solve Cloudflare Turnstile in n8n?</strong></summary>

  Add a CaptchaSonic node → set **Operation** to `Cloudflare Turnstile` → set **Task Type** to `AntiTurnstileTaskProxyLess` → enter the Website URL and Website Key → execute. The node returns the Turnstile token.
  </details>

  <details>
  <summary><strong>Does CaptchaSonic support GeeTest V4?</strong></summary>

  Yes. Use **Operation** = `GeeTest V4` with `GeeTestTaskProxyLess`. Provide the `captchaId` and `websiteURL`. The node returns `captcha_id`, `lot_number`, `pass_token`, `gen_time`, and `captcha_output`.
  </details>

  <details>
  <summary><strong>How do I solve AWS WAF CAPTCHAs?</strong></summary>

  Use **Operation** = `AWS WAF` with `AntiAwsWafTaskProxyLess`. The node returns a session cookie you pass to subsequent HTTP requests via the `Cookie` header.
  </details>

  <details>
  <summary><strong>Is there a free trial?</strong></summary>

  Yes — sign up at [my.captchasonic.com](https://my.captchasonic.com) to get free credits for testing.
  </details>

  <details>
  <summary><strong>Where do I find the Website Key for a CAPTCHA?</strong></summary>

  Open the browser DevTools (F12) on the target page and search for `sitekey`, `data-sitekey`, or `data-widget-id` in the HTML. The value is typically a long alphanumeric string.
  </details>

  <details>
  <summary><strong>Can I use this node in n8n Cloud?</strong></summary>

  Yes. CaptchaSonic works on both self-hosted n8n and n8n Cloud. Install it as a community node from Settings.
  </details>

  <details>
  <summary><strong>What happens if solving fails?</strong></summary>

  The node throws an error by default. Enable **Continue On Fail** in node settings to handle errors gracefully in your workflow.
  </details>

  ---

  ## 🏗️ Architecture

  ```
  ┌─────────────────────────────────────────────────┐
  │                  n8n Workflow                    │
  │                                                 │
  │  ┌──────────┐   ┌──────────────┐   ┌─────────┐ │
  │  │ Trigger  │──▶│ CaptchaSonic │──▶│ Use     │ │
  │  │ (any)    │   │    Node      │   │ Result  │ │
  │  └──────────┘   └──────┬───────┘   └─────────┘ │
  │                        │                         │
  └────────────────────────┼─────────────────────────┘
                           │
                           ▼
                ┌──────────────────┐
                │  CaptchaSonic    │
                │  API Server      │
                │                  │
                │  ┌────────────┐  │
                │  │ AI Engine  │  │
                │  └────────────┘  │
                └──────────────────┘
  ```

  **Token flow:** `createTask` → poll `getTaskResult` every 3s → return solution
  **Recognition flow:** `createTask` → immediate result (no polling)

  ---

  ## 🛠️ Development

  ```bash
  # Clone the repo
  git clone https://github.com/Captcha-Sonic/n8n-nodes-captchasonic.git
  cd n8n-nodes-captchasonic

  # Install dependencies
  npm install

  # Build
  npm run build

  # Watch mode
  npm run dev

  # Lint
  npm run lint
  ```

  ### Link for Local Testing

  ```bash
  # In this project
  npm link

  # In your n8n installation
  cd ~/.n8n/nodes
  npm link n8n-nodes-captchasonic

  # Restart n8n
  ```

  ---

  ## 📝 Resources

  | Resource | Link |
  |:---|:---|
  | 🌐 **Website** | [captchasonic.com](https://captchasonic.com) |
  | 📊 **Dashboard** | [my.captchasonic.com](https://my.captchasonic.com) |
  | 📚 **API Docs** | [docs.captchasonic.com](https://docs.captchasonic.com) |
  | 💬 **Discord** | [discord.captchasonic.com](https://discord.captchasonic.com) |
  | ✈️ **Telegram** | [telegram.captchasonic.com](https://telegram.captchasonic.com) |
  | 📦 **npm** | [npmjs.com/package/n8n-nodes-captchasonic](https://www.npmjs.com/package/n8n-nodes-captchasonic) |
  | 🔗 **n8n Docs** | [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/) |

  ---

  ## 📄 License

  [MIT](LICENSE.md) © [CaptchaSonic](https://captchasonic.com)

  ---

  <p align="center">
    <strong>Built with ❤️ by <a href="https://captchasonic.com">CaptchaSonic</a></strong><br>
    <sub>The fastest AI-powered CAPTCHA solver for n8n workflow automation</sub>
  </p>

ai_documentation_summary:
  {"purpose":"CaptchaSonic is an AI-powered CAPTCHA solving node for n8n that automates solving and recognition of many CAPTCHA types inside workflows. It can return solved tokens or image-recognition results without requiring code.","capabilities":["Solve token-based CAPTCHAs with async polling and task creation","Support reCAPTCHA v2, v3, and reCAPTCHA Enterprise","Support Cloudflare Turnstile, GeeTest V3/V4, PopularCaptcha, DataDome Slider, AWS WAF, MTCaptcha, Tencent CAPTCHA, CaptchaFox, and Prosopo/Procaptcha","Perform image recognition tasks such as Image To Text, OCR/classification, Vision Engine, and CAPTCHA image solving","Use proxy-less solving for some task types","Return solved tokens or extracted text in workflow output","Poll tasks every 3 seconds with a 120-second timeout"],"authentication":"API key required via CaptchaSonic API credentials from my.captchasonic.com","commonUseCases":["Solving reCAPTCHA or Turnstile challenges before submitting forms or accessing protected pages","Extracting text from CAPTCHA images using OCR/image recognition","Automating workflows that interact with sites protected by anti-bot CAPTCHA systems"],"limitations":["Token-based tasks are asynchronous and may take up to 120 seconds to time out","Some CAPTCHA types require a proxy while others are proxy-less or optional","DataDome Slider requires a proxy","The README is truncated, so additional supported operations may exist beyond those listed"],"relatedNodes":[]}


node_type: n8n-nodes-emailsherlock.emailSherlock
package_name: n8n-nodes-emailsherlock
display_name: EmailSherlock
description: Verify email addresses with the EmailSherlock API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: matthiastosch
author_github_url: https://github.com/Emailsherlock1/
npm_package_name: n8n-nodes-emailsherlock
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:34.537Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "verifyEmail",
      "options": [
        {
          "name": "Verify Email",
          "value": "verifyEmail",
          "action": "Verify an email address",
          "description": "Verify a single email address synchronously"
        },
        {
          "name": "Verify Batch",
          "value": "verifyBatch",
          "action": "Verify a batch of email addresses",
          "description": "Verify a list of addresses in one synchronous request"
        },
        {
          "name": "Submit Verification Job",
          "value": "submitJob",
          "action": "Submit a verification job",
          "description": "Submit a list for asynchronous verification with definitive inbox verdicts (up to 10000 addresses)"
        },
        {
          "name": "Get Verification Job",
          "value": "getJob",
          "action": "Get a verification job",
          "description": "Read the status and results of a verification job by ID"
        },
        {
          "name": "Get Account Status",
          "value": "accountStatus",
          "action": "Get the account status",
          "description": "Read the credit balance and rate-limit status. Spends no credits."
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Verify Email",
      "value": "verifyEmail",
      "action": "Verify an email address",
      "description": "Verify a single email address synchronously"
    },
    {
      "name": "Verify Batch",
      "value": "verifyBatch",
      "action": "Verify a batch of email addresses",
      "description": "Verify a list of addresses in one synchronous request"
    },
    {
      "name": "Submit Verification Job",
      "value": "submitJob",
      "action": "Submit a verification job",
      "description": "Submit a list for asynchronous verification with definitive inbox verdicts (up to 10000 addresses)"
    },
    {
      "name": "Get Verification Job",
      "value": "getJob",
      "action": "Get a verification job",
      "description": "Read the status and results of a verification job by ID"
    },
    {
      "name": "Get Account Status",
      "value": "accountStatus",
      "action": "Get the account status",
      "description": "Read the credit balance and rate-limit status. Spends no credits."
    }
  ]

npm_readme:
  # n8n-nodes-emailsherlock

  n8n community node for the [EmailSherlock](https://emailsherlock.com/api) email verification API. It checks whether an address can receive mail (syntax, MX, SMTP probe) and returns reputation data about the domain behind it.

  [n8n](https://n8n.io/) is a fair-code licensed workflow automation tool.

  ## Installation

  In n8n, open **Settings > Community Nodes > Install** and enter:

  ```
  n8n-nodes-emailsherlock
  ```

  See the [n8n community nodes guide](https://docs.n8n.io/integrations/community-nodes/installation/) if the menu is not visible on your instance.

  ## Credentials

  Create an API key at [emailsherlock.com/api](https://emailsherlock.com/api), then add an **EmailSherlock API** credential in n8n and paste the key.

  Two key types exist:

  - `es_live_` keys verify real addresses and spend credits.
  - `es_test_` sandbox keys return deterministic fixtures, spend nothing, and are made for building your workflow before you go live. See [Sandbox testing](#sandbox-testing).

  The credential test calls the account-status endpoint (`GET /v1/credits`) to validate the key. It spends no credits, live or sandbox.

  ## Operations

  ### Verify Email

  Verifies one address per input item, synchronously. The output item is the full API response for that address.

  ### Verify Batch

  Verifies a list of addresses in one synchronous request. The **Emails** field accepts addresses separated by commas or newlines, or an expression that resolves to an array, for example `{{ $json.recipients }}`. The node outputs one item per address, in the order you sent them. Addresses the API could not process come back as `{ "email": "...", "error": "invalid_email" }` items.

  Batch requests skip the live SMTP probe: addresses that need it answer `result=unknown` with `reason=verification_pending`, and the probe runs in the background. Verify the same address again after a short wait to get the final verdict from cache, or use a verification job. See [Retrying transient results](#retrying-transient-results).

  ### Submit Verification Job

  For larger lists that need definitive inbox verdicts. Unlike Verify Batch, a job runs every address through the full pipeline including the SMTP probe, so the results carry real `valid`/`invalid` verdicts instead of `verification_pending`. Accepts up to 10000 addresses, charged per address at submit. Addresses that cannot be processed are refunded automatically.

  - **Wait for Completion** (default on): the node polls the job until it finishes and returns the results directly. **Max Wait** caps the polling; a job larger than the budget returns still processing, and you poll **Get Verification Job** yourself afterwards.
  - Turn **Wait for Completion** off to return the job id immediately. Drive the polling yourself, for example with a **Wait** node followed by **Get Verification Job** (the n8n-idiomatic pattern for long jobs).
  - **Split Results Into Items** (default on): one output item per address, in submit order. Off returns the whole job object (`id`, `status`, `progress`, `results`).

  ### Get Verification Job

  Reads a job by its **Job ID**. Returns the status and, once the job completed, the per-address results. An unknown or expired id (jobs are kept 7 days) answers `404 No such job`.

  ### Get Account Status

  Reads the credit balance, the key's rate-limit window and the plan. Spends no credits, so it is also the cheapest way to check that a key works (this is what the credential test uses).

  ## Output fields

  | Field | Type | Meaning |
  |---|---|---|
  | `email` | string | The address you sent |
  | `result` | string | `valid`, `invalid`, `catch_all`, `disposable`, `role` or `unknown` |
  | `deliverable` | boolean or null | `true` only after the mailbox accepted the probe, `false` only on a proven failure, `null` means unproven |
  | `reason` | string or null | Why the pipeline decided, for example `mailbox_accepts` or `greylisted`. Transient reasons signal a retry |
  | `mx` | boolean | The domain has reachable MX records |
  | `mx_record` | string or null | The primary MX host, when one was resolved |
  | `disposable` | boolean | Throwaway or temporary-mail provider |
  | `role` | boolean | Role address such as `info@` or `sales@` |
  | `catch_all` | boolean | The host accepts mail for any local part. Always-accept hosts (mail.ru and similar) answer `result=catch_all` with `deliverable=null` rather than a misleading `valid` |
  | `free_email` | boolean or null | The domain is a freemail provider |
  | `score` | number or null | 0 to 1 confidence, higher is safer to send to |
  | `freshness` | string | `fresh`, `cached_recent` or `cached_stale_refreshed` |
  | `checked_at` | string or null | When the underlying verification ran (ISO 8601) |
  | `domain` | object or null | Domain intelligence, `null` when the domain has not been crawled yet |

  The `domain` object:

  | Field | Type | Meaning |
  |---|---|---|
  | `domain.name` | string | The domain behind the address |
  | `domain.types` | array or null | Host classification: `freemail`, `disposable`, `custom`, `company`, `government`, `education`, `public`, `isp` |
  | `domain.score` | number or null | 0 to 100 domain reputation score, higher is better |
  | `domain.spf` | boolean or null | An SPF record exists |
  | `domain.dkim` | boolean or null | A DKIM record was found |
  | `domain.dmarc` | boolean or null | A DMARC record exists |
  | `domain.dmarc_policy` | string or null | `none`, `quarantine` or `reject` |
  | `domain.mta_sts` | boolean or null | An MTA-STS policy is published |
  | `domain.tls_rpt` | boolean or null | A TLS-RPT record exists |
  | `domain.bimi` | boolean or null | A BIMI record exists |
  | `domain.dane` | boolean or null | DANE/TLSA records exist for the MX hosts |
  | `domain.blacklists` | integer or null | Number of public DNS blacklists currently listing the domain's mail infrastructure |
  | `domain.dnssec` | string or null | `secure`, `insecure` or `bogus` |
  | `domain.caa` | boolean or null | A CAA record restricts certificate issuance |

  Full reference: [emailsherlock.com/api/docs](https://emailsherlock.com/api/docs) and the machine-readable [OpenAPI spec](https://api.emailsherlock.com/v1/openapi.json).

  ## Retrying transient results

  Four `reason` values are transient: `greylisted`, `smtp_timeout`, `smtp_unreachable` and `verification_pending`. The mailbox could not be probed to a final verdict yet, so a retry after a short wait usually resolves them.

  For lists, a verification job is usually the better fit: it runs the SMTP probe for every address up front, so the results are final and you avoid the retry loop entirely. The retry pattern below is for the synchronous single/batch path.

  A simple retry loop in n8n:

  1. **EmailSherlock** node verifies the address.
  2. An **If** node checks `{{ ["greylisted", "smtp_timeout", "smtp_unreachable", "verification_pending"].includes($json.reason) }}`.
  3. On the true branch, a **Wait** node pauses for 10 to 15 minutes, then connects back to the EmailSherlock node.
  4. On the false branch, the verdict is final and the workflow continues.

  The retried call is answered from cache once the background probe finished, so it costs no extra waiting time on the API side.

  ## Error handling

  | HTTP status | API code | What the node does |
  |---|---|---|
  | 401 / 403 | `unauthorized` | Fails with a hint to check the credential |
  | 402 | `insufficient_credits` | Fails with a hint to top up at [emailsherlock.com/api](https://emailsherlock.com/api) |
  | 429 | `rate_limit_exceeded` | Fails and reports the `Retry-After` wait time in seconds |
  | 503 | `verify_unavailable` | Fails; the API refunded the credits for the call, retry later |

  Enable **Continue On Fail** on the node to route errors into the output stream instead of stopping the workflow.

  ## Sandbox testing

  With an `es_test_` key the local part of the address controls the result, so you can test every branch of your workflow deterministically:

  | Address | Result |
  |---|---|
  | `valid@example.com` | `result=valid` |
  | `invalid@example.com` | `result=invalid` |
  | `catch-all@example.com` | `catch_all=true` |
  | `disposable@example.com` | `disposable=true` |
  | `role@example.com` | `role=true` |
  | `unknown@example.com` | `result=unknown` |
  | `pending@example.com` | `result=unknown`, `reason=verification_pending` (the batch retry case) |
  | `ratelimit@example.com` | HTTP 429 |
  | `servererror@example.com` | HTTP 503 |

  Sandbox responses carry the `X-Sandbox: true` header and never spend credits.

  ## Why verify before sending

  Bounced mail damages your sender reputation. Verifying a list before a campaign keeps hard bounces out and flags risky categories (disposable, role, catch-all) so you can decide what to do with them. You can [verify an email address](https://emailsherlock.com/verify) manually on the EmailSherlock site to see the same checks this node runs.

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Verifies email addresses using the EmailSherlock API. It checks deliverability signals such as syntax, MX records, SMTP probing, and domain reputation data, and can also process batch lists and verification jobs.","capabilities":["Verify a single email address per input item synchronously","Verify a batch of email addresses in one synchronous request","Submit large verification jobs for up to 10,000 addresses","Poll and retrieve verification jobs by Job ID","Get account status including credits, rate-limit window, and plan","Return detailed email results including deliverability, catch-all, disposable, role, and score fields","Return domain intelligence data such as SPF, DKIM, DMARC, MTA-STS, TLS-RPT, BIMI, DANE, blacklists, and DNSSEC","Support waiting for job completion or returning job ID for manual polling","Split job results into individual items or return the full job object","Support live API keys and sandbox test keys"],"authentication":"API key required via an EmailSherlock API credential in n8n","commonUseCases":["Validate new lead or signup email addresses before storing them","Clean and verify bulk mailing lists","Check whether an address is deliverable, disposable, role-based, or catch-all","Enrich email domains with reputation and DNS security signals","Run long-running verification jobs and poll for completed results"],"limitations":["Verify Batch skips the live SMTP probe, so some addresses may return result=unknown with reason=verification_pending","Verification jobs are kept for 7 days; expired or unknown Job IDs return 404","Jobs larger than the configured Max Wait budget may still be processing and require later polling","Live keys spend credits for real verification requests; sandbox keys only return deterministic fixtures"],"relatedNodes":["Wait"]}


node_type: @bambuser/n8n-nodes-livecommerce.bambuserWebhookTrigger
package_name: @bambuser/n8n-nodes-livecommerce
display_name: Bambuser Webhook Trigger
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: jespermjonsson
author_github_url: https://github.com/bambuser/n8n-nodes-livecommerce.git
npm_package_name: @bambuser/n8n-nodes-livecommerce
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.539Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Starts a workflow when Bambuser fires a webhook event. Registers the n8n URL with Bambuser on activation. Requires WRITE_WEBHOOKS scope. Note: deactivating the workflow does not remove the Bambuser subscription — delete it manually from the Bambuser dashboard.

npm_readme:
  # n8n-nodes-livecommerce

  [![CI](https://github.com/bambuser/n8n-nodes-livecommerce/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bambuser/n8n-nodes-livecommerce/actions/workflows/ci.yml)
  [![npm version](https://img.shields.io/npm/v/@bambuser/n8n-nodes-livecommerce.svg)](https://www.npmjs.com/package/@bambuser/n8n-nodes-livecommerce)
  [![npm downloads](https://img.shields.io/npm/dm/@bambuser/n8n-nodes-livecommerce.svg)](https://www.npmjs.com/package/@bambuser/n8n-nodes-livecommerce)
  [![Node 24+](https://img.shields.io/node/v/@bambuser/n8n-nodes-livecommerce.svg)](https://nodejs.org)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)

  Community [n8n](https://n8n.io) nodes for the [Bambuser](https://bambuser.com) video-commerce platform. A single **Bambuser** action node covers live shopping, shoppable videos, video consultation, product catalog, and shopper data; a companion **Bambuser Webhook Trigger** delivers events into n8n's 400+ integrations without writing custom HTTP code.

  ## About

  Bambuser powers live, on-demand, and one-to-one video commerce for retailers and brands. This package wraps the public Bambuser APIs as native n8n nodes so non-engineers can wire video-commerce events into CRMs, data warehouses, messaging platforms, and analytics tools by dragging nodes onto a canvas. The package is maintained by Bambuser and developed in the open.

  ## Available nodes

  Two nodes ship in the package, sharing a single `Bambuser API` credential.

  ### Bambuser (action node)

  A single action node covering every read/write surface of the Bambuser public APIs. The top-level **Resource** dropdown groups operations by service area:

  - **Live Show, Live Product, Live Channel, Live Tag, Live User, Live Statistic, Live Webhook, Live Broadcast** — Live Shopping API. List, create, update, publish, and schedule shows; pin chat messages; manage product highlights; pull viewer/sales metrics.
  - **Video, Media Asset, Video Playlist** — Shoppable Videos (VOD). Clip broadcasts into VODs, manage media assets and captions, query the video library. Requires the `VOD_MANAGE` scope.
  - **Call, Connect Link, Call Statistic** — Video Consultation. Create connect links, fetch call transcripts, pull call statistics.
  - **Catalog Product** — Product Catalog. Search, count, create, update, and delete products. Suitable for AI enrichment and stock-sync workflows. Requires `PRODUCT_CATALOG_READ` or `PRODUCT_CATALOG_MANAGE`.
  - **Shopper Data** — GDPR-relevant shopper records. List, get, and erase records. Requires `READ_SHOPPER_DATA`.

  ### Bambuser Webhook Trigger

  Start a workflow when Bambuser fires an event. The node registers and tears down the subscription against the Bambuser API on workflow activation/deactivation, and re-registers automatically if the webhook URL changes.

  - `show.*`, `broadcast.*`, `product.*`, `product-highlight.*`, `user.*` topics
  - Requires the `WRITE_WEBHOOKS` API-key scope

  ### Credential

  The `Bambuser API` credential takes an API key, a region (`EU` or `US`), and an optional base-URL override. The key is sent as `Authorization: Token <key>`. Scopes are granted per-key in the Bambuser dashboard; relevant scopes include `VOD_MANAGE`, `VOD_READ`, `PRODUCT_CATALOG_READ`, `PRODUCT_CATALOG_MANAGE`, `WRITE_WEBHOOKS`, and `READ_SHOPPER_DATA`. Grant only the scopes the workflow needs.

  ## Prerequisites

  - [n8n](https://n8n.io) 1.57.0 or later
  - Node.js 24 or later (only required for local development of the nodes themselves)

  ## Installation

  ### n8n Cloud and self-hosted (Community Nodes UI)

  1. Open n8n and go to **Settings → Community Nodes**.
  2. Click **Install** and enter `@bambuser/n8n-nodes-livecommerce`.
  3. Confirm the install. The Bambuser nodes appear in the node panel after a short refresh.

  See the n8n [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) for the full UI walkthrough and the security caveats around third-party nodes.

  ### Self-hosted via npm

  For self-hosted n8n instances that install community nodes from the file system:

  ```bash
  cd ~/.n8n/custom
  npm init -y       # only if package.json does not already exist
  npm install @bambuser/n8n-nodes-livecommerce
  ```

  Restart n8n. The nodes load from `~/.n8n/custom/node_modules`.

  ## Credentials

  A Bambuser account is required. You can create one for free at [bambuser.com](https://bambuser.com).

  1. Sign in to your Bambuser dashboard ([EU](https://lcx-eu.bambuser.com/) or [US](https://lcx.bambuser.com/), matching your org's data residency) and open **Settings → API Keys**.
  2. Create a new key and grant the scopes your workflow needs (see the list under [Available nodes](#available-nodes)).
  3. In n8n, create a new credential of type **Bambuser API**:
     - **API Key** — the key from the dashboard.
     - **Region** — `EU` or `US`, matching the org's data residency.
     - **Base URL Override** — leave empty in production. Used for pointing at a non-default API host (staging, a tunnel, a local proxy).

  The credential is reused across every node in this package.

  ## Compatibility

  Built and tested against n8n 1.57 and later. Earlier versions are not supported.

  ## Quick start

  A minimal workflow that reacts to a Bambuser show ending:

  1. Add a **Bambuser Webhook Trigger** node. Select the `show` topic.
  2. Activate the workflow. The node registers a webhook subscription against the Bambuser API automatically.
  3. Add downstream nodes (Slack, HTTP Request, database, etc.) consuming the event payload.

  End the show in the Bambuser dashboard. n8n receives the webhook and runs the workflow.

  ## What you can build

  A few workflows that merchants commonly assemble from these nodes plus n8n's built-in integrations:

  - **Go-live notification blast** — `show.started` → SMS via Twilio + email via Klaviyo + Instagram Story post.
  - **Automatic show recap** — `show.ended` → pull stats → AI summary → post to Slack and save to Notion.
  - **Live → VOD → CMS pipeline** — `broadcast.ended` → create VOD → AI writes description → push to Contentful or a Shopify product page.
  - **Data warehouse sync** — `show.ended` → append views, carts, and revenue to BigQuery or Google Sheets.
  - **Low-stock alerts** — daily catalog scan → Gemini drafts a restock recommendation → append to a shared Google Doc.
  - **GDPR shopper data erasure** — erasure webhook fires → delete shopper record → log confirmation for the audit trail.

  See [`examples/workflows/`](./examples/workflows/) for ready-to-import JSON workflows demonstrating each of these patterns.

  ## Examples

  Ready-to-import workflow JSON files live under [`examples/workflows/`](./examples/workflows/). Import a file from the n8n UI via **Workflows → Import from File**, then attach your Bambuser API credential.

  ## Local development

  ```bash
  git clone https://github.com/bambuser/n8n-nodes-livecommerce.git
  cd n8n-nodes-livecommerce
  nvm use        # picks up .nvmrc → Node 24
  npm install
  npm run build
  ```

  To link the local build into a local n8n install:

  ```bash
  cd ~/.n8n/custom
  npm link /absolute/path/to/n8n-nodes-livecommerce
  ```

  Restart n8n and the nodes load from the local build directory.

  ### Docker development environment

  The repo ships a Docker Compose setup that runs n8n with Postgres and bind-mounts the compiled nodes, so a rebuild + restart picks up changes without rebuilding the image.

  ```bash
  cp .env.example .env
  openssl rand -hex 32   # paste into N8N_ENCRYPTION_KEY in .env
  docker compose up --build
  ```

  n8n is available at `http://localhost:5678`.

  After editing anything under `credentials/`, `lib/`, or `nodes/`:

  ```bash
  npm run build
  docker compose restart n8n
  ```

  ### Webhook testing with a Cloudflare tunnel

  Bambuser needs a public HTTPS URL to deliver webhook events. To run n8n behind a free `*.trycloudflare.com` tunnel:

  ```bash
  docker compose -f docker-compose.yml -f docker-compose.tunnel.yml up --build
  ```

  The tunnel URL changes on every restart. To push the new URL to Bambuser, deactivate and reactivate the workflow in the n8n UI — the Bambuser Webhook Trigger node re-registers the subscription with the new URL automatically.

  ## Publishing

  Releases are tag-driven and run from GitHub Actions with npm provenance.

  1. A maintainer runs `npm run release` from the repo root. [release-it](https://github.com/release-it/release-it) prompts for a version bump, updates `package.json`, commits, tags, and pushes the tag.
  2. The tag push triggers `.github/workflows/publish.yml`, which builds the package and publishes it to npm under the `@bambuser` scope with an [npm provenance statement](https://docs.npmjs.com/generating-provenance-statements).

  Both Trusted Publishers (OIDC) and a long-lived `NPM_TOKEN` secret are supported. See the comments in `.github/workflows/publish.yml` for setup.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n node-development reference](https://docs.n8n.io/integrations/creating-nodes/)
  - [Bambuser developer documentation](https://bambuser.com/docs)
  - [Sign up for a Bambuser account](https://bambuser.com)

  ## License

  [MIT](./LICENSE)

ai_documentation_summary:
  {"purpose":"Triggers an n8n workflow when Bambuser sends a webhook event. On activation it registers the workflow URL as a Bambuser subscription, allowing Bambuser events to flow into n8n automatically.","capabilities":["Listens for Bambuser webhook events","Supports show.*, broadcast.*, product.*, product-highlight.*, and user.* topics","Registers the webhook subscription on workflow activation","Tears down the subscription on workflow deactivation","Re-registers automatically when the webhook URL changes"],"authentication":"Bambuser API credential using an API key sent as Authorization: Token <key>; requires the WRITE_WEBHOOKS scope and a region setting (EU or US).","commonUseCases":["Start automations when a Bambuser live show ends or changes state","Trigger downstream workflows for product, broadcast, or user events from Bambuser","Sync Bambuser event data into CRMs, databases, messaging apps, or analytics tools"],"limitations":["Deactivating the n8n workflow does not remove the Bambuser subscription; it must be deleted manually in the Bambuser dashboard","Only webhook topics supported by Bambuser and listed in the README are available"],"relatedNodes":["Bambuser"]}


node_type: @bambuser/n8n-nodes-livecommerce.bambuser
package_name: @bambuser/n8n-nodes-livecommerce
display_name: Bambuser
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: jespermjonsson
author_github_url: https://github.com/bambuser/n8n-nodes-livecommerce.git
npm_package_name: @bambuser/n8n-nodes-livecommerce
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.541Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Interact with the Bambuser Live Commerce API: live shopping, on-demand video, video calls, product catalog, and shopper data

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "liveShow",
      "options": [
        {
          "name": "Call",
          "value": "call"
        },
        {
          "name": "Call Statistic",
          "value": "callStats"
        },
        {
          "name": "Catalog Product",
          "value": "catalogProduct"
        },
        {
          "name": "Connect Link",
          "value": "connectLink"
        },
        {
          "name": "Live Broadcast",
          "value": "liveBroadcast"
        },
        {
          "name": "Live Channel",
          "value": "liveChannel"
        },
        {
          "name": "Live Product",
          "value": "liveProduct"
        },
        {
          "name": "Live Show",
          "value": "liveShow"
        },
        {
          "name": "Live Statistic",
          "value": "liveStats"
        },
        {
          "name": "Live Tag",
          "value": "liveTag"
        },
        {
          "name": "Live User",
          "value": "liveUser"
        },
        {
          "name": "Live Webhook",
          "value": "liveWebhook"
        },
        {
          "name": "Media Asset",
          "value": "mediaAsset"
        },
        {
          "name": "Shopper Data",
          "value": "shopperData"
        },
        {
          "name": "Video",
          "value": "video"
        },
        {
          "name": "Video Playlist",
          "value": "videoPlaylist"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "download",
      "options": [
        {
          "name": "Download",
          "value": "download",
          "action": "Get a download link for a broadcast recording"
        },
        {
          "name": "Get Transcriptions",
          "value": "getTranscriptions",
          "action": "Get transcriptions for a broadcast"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveBroadcast"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Add Channel",
          "value": "addChannel",
          "action": "Add a channel to a show"
        },
        {
          "name": "Add Highlight",
          "value": "addHighlight",
          "action": "Add a product highlight to a show"
        },
        {
          "name": "Add Product",
          "value": "addProduct",
          "action": "Add a product to a show"
        },
        {
          "name": "Add Products Batch",
          "value": "addProductsBatch",
          "action": "Add up to 100 products to a show"
        },
        {
          "name": "Add Tag",
          "value": "addTag",
          "action": "Add a tag to a show"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a show"
        },
        {
          "name": "Create Pinned Comment",
          "value": "createPinnedComment",
          "action": "Create a pinned comment"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a show"
        },
        {
          "name": "Delete Asset",
          "value": "deleteAsset",
          "action": "Delete a show asset"
        },
        {
          "name": "Delete Highlight",
          "value": "deleteHighlight",
          "action": "Delete a highlight from a show"
        },
        {
          "name": "Delete Pinned Comment",
          "value": "deletePinnedComment",
          "action": "Delete a pinned comment"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a show by ID"
        },
        {
          "name": "Get Assets",
          "value": "getAssets",
          "action": "List show assets"
        },
        {
          "name": "Get Broadcasts",
          "value": "getBroadcasts",
          "action": "Get broadcasts for a show"
        },
        {
          "name": "Get Chat Messages",
          "value": "getChatMessages",
          "action": "Get chat messages for a show"
        },
        {
          "name": "Get Chat Transcripts",
          "value": "getChatTranscripts",
          "action": "Get chat transcripts for a show"
        },
        {
          "name": "Get Examples",
          "value": "getExamples",
          "action": "Get demo embed URL for a show"
        },
        {
          "name": "Get Highlights",
          "value": "getHighlights",
          "action": "Get highlights for a show"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List shows"
        },
        {
          "name": "Get Pinned Comments",
          "value": "getPinnedComments",
          "action": "Get pinned comments for a show"
        },
        {
          "name": "Get Products",
          "value": "getProducts",
          "action": "Get products in a show"
        },
        {
          "name": "Remove Channel",
          "value": "removeChannel",
          "action": "Remove a channel from a show"
        },
        {
          "name": "Remove Product",
          "value": "removeProduct",
          "action": "Remove a product from a show"
        },
        {
          "name": "Remove Tag",
          "value": "removeTag",
          "action": "Remove a tag from a show"
        },
        {
          "name": "Reorder Products",
          "value": "reorderProducts",
          "action": "Reorder products in a show"
        },
        {
          "name": "Send Chat Message",
          "value": "sendChatMessage",
          "action": "Send a chat message to a show"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a show"
        },
        {
          "name": "Update Channels",
          "value": "updateChannels",
          "action": "Replace all channels on a show"
        },
        {
          "name": "Update Chat Message",
          "value": "updateChatMessage",
          "action": "Update a chat message status"
        },
        {
          "name": "Update Highlight",
          "value": "updateHighlight",
          "action": "Update highlight products"
        },
        {
          "name": "Update Pinned Comment",
          "value": "updatePinnedComment",
          "action": "Update a pinned comment"
        },
        {
          "name": "Update Tags",
          "value": "updateTags",
          "action": "Replace all tags on a show"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveShow"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a product"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a product by ID"
        },
        {
          "name": "Get Highlighted",
          "value": "getHighlighted",
          "action": "List highlighted products"
        },
        {
          "name": "Get Highlighted Shows By ID",
          "value": "getHighlightedShowsById",
          "action": "Get show appearances for a product by internal ID"
        },
        {
          "name": "Get Highlighted Shows By Ref",
          "value": "getHighlightedShows",
          "action": "Get show appearances for a product by reference"
        },
        {
          "name": "Get Highlighted Shows By Refs",
          "value": "getHighlightedShowsByRefs",
          "action": "Get show appearances for multiple product references"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List all products"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a product"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveProduct"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a channel"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a channel by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveChannel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a tag"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a tag by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List tags"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a tag"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveTag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Remove a user"
        },
        {
          "name": "Delete Asset",
          "value": "deleteAsset",
          "action": "Delete a user asset"
        },
        {
          "name": "Get Assets",
          "value": "getAssets",
          "action": "List user assets"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List users"
        },
        {
          "name": "Invite",
          "value": "invite",
          "action": "Invite a user"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update user data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveUser"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getShow",
      "options": [
        {
          "name": "Get Activity",
          "value": "getActivity",
          "action": "Get show activity in a time period"
        },
        {
          "name": "Get Activity Orders",
          "value": "getActivityOrders",
          "action": "Get orders by activity period"
        },
        {
          "name": "Get Show",
          "value": "getShow",
          "action": "Get statistics for a show"
        },
        {
          "name": "Get Show Orders",
          "value": "getShowOrders",
          "action": "Get order data for a show"
        },
        {
          "name": "Get Show Traffic",
          "value": "getShowTraffic",
          "action": "Get traffic acquisition for a show"
        },
        {
          "name": "Get Shows",
          "value": "getShows",
          "action": "Get statistics for multiple shows"
        },
        {
          "name": "Get Shows Orders",
          "value": "getShowsOrders",
          "action": "Get order data for multiple shows"
        },
        {
          "name": "Get Shows Traffic",
          "value": "getShowsTraffic",
          "action": "Get traffic acquisition for multiple shows"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveStats"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a webhook subscription"
        },
        {
          "name": "Get Event",
          "value": "getEvent",
          "action": "Get a webhook event by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "liveWebhook"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Clip",
          "value": "clip",
          "action": "Create a clip from a broadcast"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a video"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a video"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a video by ID"
        },
        {
          "name": "Get Count",
          "value": "getCount",
          "action": "Get total video count"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List videos"
        },
        {
          "name": "Get Views Count",
          "value": "getViewsCount",
          "action": "Get total views count for the org"
        },
        {
          "name": "Query",
          "value": "query",
          "action": "Query videos with filters"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a video"
        },
        {
          "name": "Update Preview",
          "value": "updatePreview",
          "action": "Update the preview image of a video"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "video"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a media asset"
        },
        {
          "name": "Create Caption",
          "value": "createCaption",
          "action": "Trigger transcription for a language"
        },
        {
          "name": "Create Upload Ticket",
          "value": "createUploadTicket",
          "action": "Get a ticket to upload an image"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a media asset"
        },
        {
          "name": "Delete Caption",
          "value": "deleteCaption",
          "action": "Delete a caption track"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a media asset by ID"
        },
        {
          "name": "Get Captions",
          "value": "getCaptions",
          "action": "List captions for a media asset"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List media assets"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a media asset"
        },
        {
          "name": "Update Caption",
          "value": "updateCaption",
          "action": "Update caption content"
        },
        {
          "name": "Update Upload Status",
          "value": "updateUploadStatus",
          "action": "Report upload progress or completion"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "mediaAsset"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a playlist"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a playlist"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a playlist by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List playlists"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a playlist"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "videoPlaylist"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a call by ID"
        },
        {
          "name": "Get Transcriptions",
          "value": "getTranscriptions",
          "action": "Get transcriptions for a call"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "call"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a connect link"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a connect link by ID"
        },
        {
          "name": "Delete by External ID",
          "value": "deleteByExternalId",
          "action": "Delete a connect link by external ID"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a connect link by ID"
        },
        {
          "name": "Get by External ID",
          "value": "getByExternalId",
          "action": "Get a connect link by external ID"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a connect link by ID"
        },
        {
          "name": "Update by External ID",
          "value": "updateByExternalId",
          "action": "Update a connect link by external ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connectLink"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAccepted",
      "options": [
        {
          "name": "Get Accepted Calls",
          "value": "getAccepted",
          "action": "Get statistics for accepted calls"
        },
        {
          "name": "Get Missed Calls",
          "value": "getMissed",
          "action": "Get statistics for missed calls"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "callStats"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Count",
          "value": "count",
          "action": "Count products matching a search query"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a product in the catalog"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a product from the catalog"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a product by ID"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search and list products"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a product in the catalog"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "catalogProduct"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a shopper data record by ID"
        },
        {
          "name": "Delete by Filter",
          "value": "deleteByFilter",
          "action": "Delete shopper data records matching a filter gdpr erasure"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a shopper data record by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "List shopper data records"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "shopperData"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Download",
      "value": "download",
      "action": "Get a download link for a broadcast recording",
      "resource": "liveBroadcast"
    },
    {
      "name": "Get Transcriptions",
      "value": "getTranscriptions",
      "action": "Get transcriptions for a broadcast",
      "resource": "liveBroadcast"
    },
    {
      "name": "Add Channel",
      "value": "addChannel",
      "action": "Add a channel to a show",
      "resource": "liveShow"
    },
    {
      "name": "Add Highlight",
      "value": "addHighlight",
      "action": "Add a product highlight to a show",
      "resource": "liveShow"
    },
    {
      "name": "Add Product",
      "value": "addProduct",
      "action": "Add a product to a show",
      "resource": "liveShow"
    },
    {
      "name": "Add Products Batch",
      "value": "addProductsBatch",
      "action": "Add up to 100 products to a show",
      "resource": "liveShow"
    },
    {
      "name": "Add Tag",
      "value": "addTag",
      "action": "Add a tag to a show",
      "resource": "liveShow"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a show",
      "resource": "liveShow"
    },
    {
      "name": "Create Pinned Comment",
      "value": "createPinnedComment",
      "action": "Create a pinned comment",
      "resource": "liveShow"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a show",
      "resource": "liveShow"
    },
    {
      "name": "Delete Asset",
      "value": "deleteAsset",
      "action": "Delete a show asset",
      "resource": "liveShow"
    },
    {
      "name": "Delete Highlight",
      "value": "deleteHighlight",
      "action": "Delete a highlight from a show",
      "resource": "liveShow"
    },
    {
      "name": "Delete Pinned Comment",
      "value": "deletePinnedComment",
      "action": "Delete a pinned comment",
      "resource": "liveShow"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a show by ID",
      "resource": "liveShow"
    },
    {
      "name": "Get Assets",
      "value": "getAssets",
      "action": "List show assets",
      "resource": "liveShow"
    },
    {
      "name": "Get Broadcasts",
      "value": "getBroadcasts",
      "action": "Get broadcasts for a show",
      "resource": "liveShow"
    },
    {
      "name": "Get Chat Messages",
      "value": "getChatMessages",
      "action": "Get chat messages for a show",
      "resource": "liveShow"
    },
    {
      "name": "Get Chat Transcripts",
      "value": "getChatTranscripts",
      "action": "Get chat transcripts for a show",
      "resource": "liveShow"
    },
    {
      "name": "Get Examples",
      "value": "getExamples",
      "action": "Get demo embed URL for a show",
      "resource": "liveShow"
    },
    {
      "name": "Get Highlights",
      "value": "getHighlights",
      "action": "Get highlights for a show",
      "resource": "liveShow"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List shows",
      "resource": "liveShow"
    },
    {
      "name": "Get Pinned Comments",
      "value": "getPinnedComments",
      "action": "Get pinned comments for a show",
      "resource": "liveShow"
    },
    {
      "name": "Get Products",
      "value": "getProducts",
      "action": "Get products in a show",
      "resource": "liveShow"
    },
    {
      "name": "Remove Channel",
      "value": "removeChannel",
      "action": "Remove a channel from a show",
      "resource": "liveShow"
    },
    {
      "name": "Remove Product",
      "value": "removeProduct",
      "action": "Remove a product from a show",
      "resource": "liveShow"
    },
    {
      "name": "Remove Tag",
      "value": "removeTag",
      "action": "Remove a tag from a show",
      "resource": "liveShow"
    },
    {
      "name": "Reorder Products",
      "value": "reorderProducts",
      "action": "Reorder products in a show",
      "resource": "liveShow"
    },
    {
      "name": "Send Chat Message",
      "value": "sendChatMessage",
      "action": "Send a chat message to a show",
      "resource": "liveShow"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a show",
      "resource": "liveShow"
    },
    {
      "name": "Update Channels",
      "value": "updateChannels",
      "action": "Replace all channels on a show",
      "resource": "liveShow"
    },
    {
      "name": "Update Chat Message",
      "value": "updateChatMessage",
      "action": "Update a chat message status",
      "resource": "liveShow"
    },
    {
      "name": "Update Highlight",
      "value": "updateHighlight",
      "action": "Update highlight products",
      "resource": "liveShow"
    },
    {
      "name": "Update Pinned Comment",
      "value": "updatePinnedComment",
      "action": "Update a pinned comment",
      "resource": "liveShow"
    },
    {
      "name": "Update Tags",
      "value": "updateTags",
      "action": "Replace all tags on a show",
      "resource": "liveShow"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a product",
      "resource": "liveProduct"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a product by ID",
      "resource": "liveProduct"
    },
    {
      "name": "Get Highlighted",
      "value": "getHighlighted",
      "action": "List highlighted products",
      "resource": "liveProduct"
    },
    {
      "name": "Get Highlighted Shows By ID",
      "value": "getHighlightedShowsById",
      "action": "Get show appearances for a product by internal ID",
      "resource": "liveProduct"
    },
    {
      "name": "Get Highlighted Shows By Ref",
      "value": "getHighlightedShows",
      "action": "Get show appearances for a product by reference",
      "resource": "liveProduct"
    },
    {
      "name": "Get Highlighted Shows By Refs",
      "value": "getHighlightedShowsByRefs",
      "action": "Get show appearances for multiple product references",
      "resource": "liveProduct"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List all products",
      "resource": "liveProduct"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a product",
      "resource": "liveProduct"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a channel",
      "resource": "liveChannel"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a channel by ID",
      "resource": "liveChannel"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a tag",
      "resource": "liveTag"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a tag by ID",
      "resource": "liveTag"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List tags",
      "resource": "liveTag"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a tag",
      "resource": "liveTag"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Remove a user",
      "resource": "liveUser"
    },
    {
      "name": "Delete Asset",
      "value": "deleteAsset",
      "action": "Delete a user asset",
      "resource": "liveUser"
    },
    {
      "name": "Get Assets",
      "value": "getAssets",
      "action": "List user assets",
      "resource": "liveUser"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List users",
      "resource": "liveUser"
    },
    {
      "name": "Invite",
      "value": "invite",
      "action": "Invite a user",
      "resource": "liveUser"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update user data",
      "resource": "liveUser"
    },
    {
      "name": "Get Activity",
      "value": "getActivity",
      "action": "Get show activity in a time period",
      "resource": "liveStats"
    },
    {
      "name": "Get Activity Orders",
      "value": "getActivityOrders",
      "action": "Get orders by activity period",
      "resource": "liveStats"
    },
    {
      "name": "Get Show",
      "value": "getShow",
      "action": "Get statistics for a show",
      "resource": "liveStats"
    },
    {
      "name": "Get Show Orders",
      "value": "getShowOrders",
      "action": "Get order data for a show",
      "resource": "liveStats"
    },
    {
      "name": "Get Show Traffic",
      "value": "getShowTraffic",
      "action": "Get traffic acquisition for a show",
      "resource": "liveStats"
    },
    {
      "name": "Get Shows",
      "value": "getShows",
      "action": "Get statistics for multiple shows",
      "resource": "liveStats"
    },
    {
      "name": "Get Shows Orders",
      "value": "getShowsOrders",
      "action": "Get order data for multiple shows",
      "resource": "liveStats"
    },
    {
      "name": "Get Shows Traffic",
      "value": "getShowsTraffic",
      "action": "Get traffic acquisition for multiple shows",
      "resource": "liveStats"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a webhook subscription",
      "resource": "liveWebhook"
    },
    {
      "name": "Get Event",
      "value": "getEvent",
      "action": "Get a webhook event by ID",
      "resource": "liveWebhook"
    },
    {
      "name": "Clip",
      "value": "clip",
      "action": "Create a clip from a broadcast",
      "resource": "video"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a video",
      "resource": "video"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a video",
      "resource": "video"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a video by ID",
      "resource": "video"
    },
    {
      "name": "Get Count",
      "value": "getCount",
      "action": "Get total video count",
      "resource": "video"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List videos",
      "resource": "video"
    },
    {
      "name": "Get Views Count",
      "value": "getViewsCount",
      "action": "Get total views count for the org",
      "resource": "video"
    },
    {
      "name": "Query",
      "value": "query",
      "action": "Query videos with filters",
      "resource": "video"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a video",
      "resource": "video"
    },
    {
      "name": "Update Preview",
      "value": "updatePreview",
      "action": "Update the preview image of a video",
      "resource": "video"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a media asset",
      "resource": "mediaAsset"
    },
    {
      "name": "Create Caption",
      "value": "createCaption",
      "action": "Trigger transcription for a language",
      "resource": "mediaAsset"
    },
    {
      "name": "Create Upload Ticket",
      "value": "createUploadTicket",
      "action": "Get a ticket to upload an image",
      "resource": "mediaAsset"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a media asset",
      "resource": "mediaAsset"
    },
    {
      "name": "Delete Caption",
      "value": "deleteCaption",
      "action": "Delete a caption track",
      "resource": "mediaAsset"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a media asset by ID",
      "resource": "mediaAsset"
    },
    {
      "name": "Get Captions",
      "value": "getCaptions",
      "action": "List captions for a media asset",
      "resource": "mediaAsset"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List media assets",
      "resource": "mediaAsset"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a media asset",
      "resource": "mediaAsset"
    },
    {
      "name": "Update Caption",
      "value": "updateCaption",
      "action": "Update caption content",
      "resource": "mediaAsset"
    },
    {
      "name": "Update Upload Status",
      "value": "updateUploadStatus",
      "action": "Report upload progress or completion",
      "resource": "mediaAsset"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a playlist",
      "resource": "videoPlaylist"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a playlist",
      "resource": "videoPlaylist"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a playlist by ID",
      "resource": "videoPlaylist"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List playlists",
      "resource": "videoPlaylist"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a playlist",
      "resource": "videoPlaylist"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a call by ID",
      "resource": "call"
    },
    {
      "name": "Get Transcriptions",
      "value": "getTranscriptions",
      "action": "Get transcriptions for a call",
      "resource": "call"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a connect link",
      "resource": "connectLink"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a connect link by ID",
      "resource": "connectLink"
    },
    {
      "name": "Delete by External ID",
      "value": "deleteByExternalId",
      "action": "Delete a connect link by external ID",
      "resource": "connectLink"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a connect link by ID",
      "resource": "connectLink"
    },
    {
      "name": "Get by External ID",
      "value": "getByExternalId",
      "action": "Get a connect link by external ID",
      "resource": "connectLink"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a connect link by ID",
      "resource": "connectLink"
    },
    {
      "name": "Update by External ID",
      "value": "updateByExternalId",
      "action": "Update a connect link by external ID",
      "resource": "connectLink"
    },
    {
      "name": "Get Accepted Calls",
      "value": "getAccepted",
      "action": "Get statistics for accepted calls",
      "resource": "callStats"
    },
    {
      "name": "Get Missed Calls",
      "value": "getMissed",
      "action": "Get statistics for missed calls",
      "resource": "callStats"
    },
    {
      "name": "Count",
      "value": "count",
      "action": "Count products matching a search query",
      "resource": "catalogProduct"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a product in the catalog",
      "resource": "catalogProduct"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a product from the catalog",
      "resource": "catalogProduct"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a product by ID",
      "resource": "catalogProduct"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search and list products",
      "resource": "catalogProduct"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a product in the catalog",
      "resource": "catalogProduct"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a shopper data record by ID",
      "resource": "shopperData"
    },
    {
      "name": "Delete by Filter",
      "value": "deleteByFilter",
      "action": "Delete shopper data records matching a filter gdpr erasure",
      "resource": "shopperData"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a shopper data record by ID",
      "resource": "shopperData"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "List shopper data records",
      "resource": "shopperData"
    }
  ]

npm_readme:
  # n8n-nodes-livecommerce

  [![CI](https://github.com/bambuser/n8n-nodes-livecommerce/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bambuser/n8n-nodes-livecommerce/actions/workflows/ci.yml)
  [![npm version](https://img.shields.io/npm/v/@bambuser/n8n-nodes-livecommerce.svg)](https://www.npmjs.com/package/@bambuser/n8n-nodes-livecommerce)
  [![npm downloads](https://img.shields.io/npm/dm/@bambuser/n8n-nodes-livecommerce.svg)](https://www.npmjs.com/package/@bambuser/n8n-nodes-livecommerce)
  [![Node 24+](https://img.shields.io/node/v/@bambuser/n8n-nodes-livecommerce.svg)](https://nodejs.org)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)

  Community [n8n](https://n8n.io) nodes for the [Bambuser](https://bambuser.com) video-commerce platform. A single **Bambuser** action node covers live shopping, shoppable videos, video consultation, product catalog, and shopper data; a companion **Bambuser Webhook Trigger** delivers events into n8n's 400+ integrations without writing custom HTTP code.

  ## About

  Bambuser powers live, on-demand, and one-to-one video commerce for retailers and brands. This package wraps the public Bambuser APIs as native n8n nodes so non-engineers can wire video-commerce events into CRMs, data warehouses, messaging platforms, and analytics tools by dragging nodes onto a canvas. The package is maintained by Bambuser and developed in the open.

  ## Available nodes

  Two nodes ship in the package, sharing a single `Bambuser API` credential.

  ### Bambuser (action node)

  A single action node covering every read/write surface of the Bambuser public APIs. The top-level **Resource** dropdown groups operations by service area:

  - **Live Show, Live Product, Live Channel, Live Tag, Live User, Live Statistic, Live Webhook, Live Broadcast** — Live Shopping API. List, create, update, publish, and schedule shows; pin chat messages; manage product highlights; pull viewer/sales metrics.
  - **Video, Media Asset, Video Playlist** — Shoppable Videos (VOD). Clip broadcasts into VODs, manage media assets and captions, query the video library. Requires the `VOD_MANAGE` scope.
  - **Call, Connect Link, Call Statistic** — Video Consultation. Create connect links, fetch call transcripts, pull call statistics.
  - **Catalog Product** — Product Catalog. Search, count, create, update, and delete products. Suitable for AI enrichment and stock-sync workflows. Requires `PRODUCT_CATALOG_READ` or `PRODUCT_CATALOG_MANAGE`.
  - **Shopper Data** — GDPR-relevant shopper records. List, get, and erase records. Requires `READ_SHOPPER_DATA`.

  ### Bambuser Webhook Trigger

  Start a workflow when Bambuser fires an event. The node registers and tears down the subscription against the Bambuser API on workflow activation/deactivation, and re-registers automatically if the webhook URL changes.

  - `show.*`, `broadcast.*`, `product.*`, `product-highlight.*`, `user.*` topics
  - Requires the `WRITE_WEBHOOKS` API-key scope

  ### Credential

  The `Bambuser API` credential takes an API key, a region (`EU` or `US`), and an optional base-URL override. The key is sent as `Authorization: Token <key>`. Scopes are granted per-key in the Bambuser dashboard; relevant scopes include `VOD_MANAGE`, `VOD_READ`, `PRODUCT_CATALOG_READ`, `PRODUCT_CATALOG_MANAGE`, `WRITE_WEBHOOKS`, and `READ_SHOPPER_DATA`. Grant only the scopes the workflow needs.

  ## Prerequisites

  - [n8n](https://n8n.io) 1.57.0 or later
  - Node.js 24 or later (only required for local development of the nodes themselves)

  ## Installation

  ### n8n Cloud and self-hosted (Community Nodes UI)

  1. Open n8n and go to **Settings → Community Nodes**.
  2. Click **Install** and enter `@bambuser/n8n-nodes-livecommerce`.
  3. Confirm the install. The Bambuser nodes appear in the node panel after a short refresh.

  See the n8n [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) for the full UI walkthrough and the security caveats around third-party nodes.

  ### Self-hosted via npm

  For self-hosted n8n instances that install community nodes from the file system:

  ```bash
  cd ~/.n8n/custom
  npm init -y       # only if package.json does not already exist
  npm install @bambuser/n8n-nodes-livecommerce
  ```

  Restart n8n. The nodes load from `~/.n8n/custom/node_modules`.

  ## Credentials

  A Bambuser account is required. You can create one for free at [bambuser.com](https://bambuser.com).

  1. Sign in to your Bambuser dashboard ([EU](https://lcx-eu.bambuser.com/) or [US](https://lcx.bambuser.com/), matching your org's data residency) and open **Settings → API Keys**.
  2. Create a new key and grant the scopes your workflow needs (see the list under [Available nodes](#available-nodes)).
  3. In n8n, create a new credential of type **Bambuser API**:
     - **API Key** — the key from the dashboard.
     - **Region** — `EU` or `US`, matching the org's data residency.
     - **Base URL Override** — leave empty in production. Used for pointing at a non-default API host (staging, a tunnel, a local proxy).

  The credential is reused across every node in this package.

  ## Compatibility

  Built and tested against n8n 1.57 and later. Earlier versions are not supported.

  ## Quick start

  A minimal workflow that reacts to a Bambuser show ending:

  1. Add a **Bambuser Webhook Trigger** node. Select the `show` topic.
  2. Activate the workflow. The node registers a webhook subscription against the Bambuser API automatically.
  3. Add downstream nodes (Slack, HTTP Request, database, etc.) consuming the event payload.

  End the show in the Bambuser dashboard. n8n receives the webhook and runs the workflow.

  ## What you can build

  A few workflows that merchants commonly assemble from these nodes plus n8n's built-in integrations:

  - **Go-live notification blast** — `show.started` → SMS via Twilio + email via Klaviyo + Instagram Story post.
  - **Automatic show recap** — `show.ended` → pull stats → AI summary → post to Slack and save to Notion.
  - **Live → VOD → CMS pipeline** — `broadcast.ended` → create VOD → AI writes description → push to Contentful or a Shopify product page.
  - **Data warehouse sync** — `show.ended` → append views, carts, and revenue to BigQuery or Google Sheets.
  - **Low-stock alerts** — daily catalog scan → Gemini drafts a restock recommendation → append to a shared Google Doc.
  - **GDPR shopper data erasure** — erasure webhook fires → delete shopper record → log confirmation for the audit trail.

  See [`examples/workflows/`](./examples/workflows/) for ready-to-import JSON workflows demonstrating each of these patterns.

  ## Examples

  Ready-to-import workflow JSON files live under [`examples/workflows/`](./examples/workflows/). Import a file from the n8n UI via **Workflows → Import from File**, then attach your Bambuser API credential.

  ## Local development

  ```bash
  git clone https://github.com/bambuser/n8n-nodes-livecommerce.git
  cd n8n-nodes-livecommerce
  nvm use        # picks up .nvmrc → Node 24
  npm install
  npm run build
  ```

  To link the local build into a local n8n install:

  ```bash
  cd ~/.n8n/custom
  npm link /absolute/path/to/n8n-nodes-livecommerce
  ```

  Restart n8n and the nodes load from the local build directory.

  ### Docker development environment

  The repo ships a Docker Compose setup that runs n8n with Postgres and bind-mounts the compiled nodes, so a rebuild + restart picks up changes without rebuilding the image.

  ```bash
  cp .env.example .env
  openssl rand -hex 32   # paste into N8N_ENCRYPTION_KEY in .env
  docker compose up --build
  ```

  n8n is available at `http://localhost:5678`.

  After editing anything under `credentials/`, `lib/`, or `nodes/`:

  ```bash
  npm run build
  docker compose restart n8n
  ```

  ### Webhook testing with a Cloudflare tunnel

  Bambuser needs a public HTTPS URL to deliver webhook events. To run n8n behind a free `*.trycloudflare.com` tunnel:

  ```bash
  docker compose -f docker-compose.yml -f docker-compose.tunnel.yml up --build
  ```

  The tunnel URL changes on every restart. To push the new URL to Bambuser, deactivate and reactivate the workflow in the n8n UI — the Bambuser Webhook Trigger node re-registers the subscription with the new URL automatically.

  ## Publishing

  Releases are tag-driven and run from GitHub Actions with npm provenance.

  1. A maintainer runs `npm run release` from the repo root. [release-it](https://github.com/release-it/release-it) prompts for a version bump, updates `package.json`, commits, tags, and pushes the tag.
  2. The tag push triggers `.github/workflows/publish.yml`, which builds the package and publishes it to npm under the `@bambuser` scope with an [npm provenance statement](https://docs.npmjs.com/generating-provenance-statements).

  Both Trusted Publishers (OIDC) and a long-lived `NPM_TOKEN` secret are supported. See the comments in `.github/workflows/publish.yml` for setup.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n node-development reference](https://docs.n8n.io/integrations/creating-nodes/)
  - [Bambuser developer documentation](https://bambuser.com/docs)
  - [Sign up for a Bambuser account](https://bambuser.com)

  ## License

  [MIT](./LICENSE)

ai_documentation_summary:
  {"purpose":"Provides n8n integration with the Bambuser Live Commerce API for managing live shopping, shoppable videos, video consultations, product catalog data, shopper records, and webhook-triggered events. It includes both an action node for API operations and a webhook trigger node for incoming Bambuser events.","capabilities":["List, create, update, publish, and schedule live shows","Manage live products, live channels, live tags, live users, live statistics, live webhooks, and live broadcasts","Clip broadcasts into videos, manage media assets and captions, and query video playlists/library","Create connect links, fetch call transcripts, and retrieve call statistics","Search, count, create, update, and delete catalog products","List, get, and erase shopper data records","Register and tear down webhook subscriptions automatically on workflow activation/deactivation","Trigger workflows from Bambuser events such as show.*, broadcast.*, product.*, product-highlight.*, and user.*"],"authentication":"API key required via the Bambuser API credential; key is sent as Authorization: Token <key>. Region selection (EU or US) is required, with an optional base URL override. Scope-based access is enforced per key.","commonUseCases":["Automating live shopping operations such as show scheduling, publishing, and analytics collection","Syncing product catalog data for enrichment or stock updates","Receiving Bambuser webhooks to trigger downstream workflows in CRM, analytics, messaging, or databases","Managing shoppable video content and media assets","Handling GDPR-related shopper record retrieval and erasure"],"limitations":["Requires n8n 1.57.0 or later; earlier versions are not supported","Some operations require specific Bambuser API scopes such as VOD_MANAGE, PRODUCT_CATALOG_MANAGE, WRITE_WEBHOOKS, or READ_SHOPPER_DATA","The webhook trigger only supports specified Bambuser topics"],"relatedNodes":[]}


node_type: @adcalls/n8n-nodes-call-tracking.AdCallsHook
package_name: @adcalls/n8n-nodes-call-tracking
display_name: AdCalls Hook
description: Starts the workflow when one of your AdCalls numbers is called
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: vince01
author_github_url: https://github.com/AdCalls/n8n-nodes-call-tracking.git
npm_package_name: @adcalls/n8n-nodes-call-tracking
npm_version: 0.1.5
community_fetched_at: 2026-07-14T14:40:34.544Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # AdCalls n8n Integration

  Integrate AdCalls call tracking events directly into your n8n workflows using the AdCalls trigger node.

  ## Prerequisites

  - An active AdCalls account with the n8n integration enabled via the AdCalls dashboard.
  - Once the integration is enabled, you will receive an **authorization token**. This token is required to authenticate requests from n8n.

  ## Getting Started

  1. **Add credentials in n8n** — Navigate to n8n and enter your AdCalls authorization token as credentials.

  2. **Create a new workflow** — Set up a new workflow in n8n and search for the **AdCalls** trigger node, then select it.

  3. **Configure the trigger** — After your credentials are verified, select the event that should trigger the workflow.

  4. **Test the integration** — Click **Execute Event** in n8n to register the webhook, then open the AdCalls dashboard. Under the n8n integration section, a new webhook entry will appear (refresh the page if needed). Click the webhook and press **Test**. A successful response confirms your workflow is ready.

  ## Further Documentation

  Detailed documentation, including available trigger events and advanced configuration options, can be found directly in the AdCalls dashboard under the n8n integration section.

ai_documentation_summary:
  {"purpose":"Triggers an n8n workflow when an AdCalls call tracking event occurs, such as when one of your AdCalls numbers is called. It integrates AdCalls events directly into n8n via a trigger node.","capabilities":["Starts workflows from AdCalls call tracking events","Authenticates and registers a webhook using an AdCalls authorization token","Lets you select which AdCalls event should trigger the workflow","Supports testing the integration from n8n with Execute Event"],"authentication":"Authorization token required","commonUseCases":["Triggering automations when an AdCalls number receives a call","Routing call tracking events into CRM, notifications, or logging workflows","Testing and monitoring AdCalls event webhooks inside n8n"],"limitations":["Requires an active AdCalls account with the n8n integration enabled in the AdCalls dashboard","Available trigger events and advanced configuration options are documented in the AdCalls dashboard rather than the README"],"relatedNodes":[]}


node_type: n8n-nodes-goodsender.goodSender
package_name: n8n-nodes-goodsender
display_name: GoodSender
description: Send transactional, custom, and consent emails through GoodSender
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: goodsender
author_github_url: https://github.com/good-sender/
npm_package_name: n8n-nodes-goodsender
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.545Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "email",
      "options": [
        {
          "name": "Email",
          "value": "email"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendTemplate",
      "options": [
        {
          "name": "Get Consent Status",
          "value": "getConsent",
          "action": "Get a recipient consent status",
          "routing": {
            "request": {
              "url": "=/v1/emails/{{encodeURIComponent($parameter[\"email\"])}}",
              "method": "GET"
            }
          },
          "description": "Get the current consent status for one recipient"
        },
        {
          "name": "List Consents",
          "value": "listConsents",
          "action": "List recipient consent statuses",
          "routing": {
            "request": {
              "url": "/v1/emails",
              "method": "GET"
            }
          },
          "description": "List recipient consent statuses for a sender domain"
        },
        {
          "name": "List Domains",
          "value": "listDomains",
          "action": "List sender domains",
          "routing": {
            "request": {
              "url": "/v1/domains",
              "method": "GET"
            }
          },
          "description": "List sender domains and their DNS verification state"
        },
        {
          "name": "Request Consent",
          "value": "requestConsent",
          "action": "Request recipient consent",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/emails/consent",
              "method": "POST"
            }
          },
          "description": "Ask a recipient to approve future custom email from your domain"
        },
        {
          "name": "Send Custom Email",
          "value": "sendCustom",
          "action": "Send a custom email",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/emails/send",
              "method": "POST"
            }
          },
          "description": "Send a custom email. Consent-gated: held until the recipient approves via the Permission Loop, so delivery is NOT guaranteed to be immediate. Only granted, active recipients are delivered; others are declined."
        },
        {
          "name": "Send Template Email",
          "value": "sendTemplate",
          "action": "Send a transactional template email",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/emails/template",
              "method": "POST"
            }
          },
          "description": "Send a predefined transactional template instantly to any recipient. Bypasses the Permission Loop — no consent required."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "email"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Consent Status",
      "value": "getConsent",
      "action": "Get a recipient consent status",
      "routing": {
        "request": {
          "url": "=/v1/emails/{{encodeURIComponent($parameter[\"email\"])}}",
          "method": "GET"
        }
      },
      "description": "Get the current consent status for one recipient",
      "resource": "email"
    },
    {
      "name": "List Consents",
      "value": "listConsents",
      "action": "List recipient consent statuses",
      "routing": {
        "request": {
          "url": "/v1/emails",
          "method": "GET"
        }
      },
      "description": "List recipient consent statuses for a sender domain",
      "resource": "email"
    },
    {
      "name": "List Domains",
      "value": "listDomains",
      "action": "List sender domains",
      "routing": {
        "request": {
          "url": "/v1/domains",
          "method": "GET"
        }
      },
      "description": "List sender domains and their DNS verification state",
      "resource": "email"
    },
    {
      "name": "Request Consent",
      "value": "requestConsent",
      "action": "Request recipient consent",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/emails/consent",
          "method": "POST"
        }
      },
      "description": "Ask a recipient to approve future custom email from your domain",
      "resource": "email"
    },
    {
      "name": "Send Custom Email",
      "value": "sendCustom",
      "action": "Send a custom email",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/emails/send",
          "method": "POST"
        }
      },
      "description": "Send a custom email. Consent-gated: held until the recipient approves via the Permission Loop, so delivery is NOT guaranteed to be immediate. Only granted, active recipients are delivered; others are declined.",
      "resource": "email"
    },
    {
      "name": "Send Template Email",
      "value": "sendTemplate",
      "action": "Send a transactional template email",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/emails/template",
          "method": "POST"
        }
      },
      "description": "Send a predefined transactional template instantly to any recipient. Bypasses the Permission Loop — no consent required.",
      "resource": "email"
    }
  ]

npm_readme:
  # n8n-nodes-goodsender

  An [n8n](https://n8n.io) community node for [GoodSender](https://goodsender.com) — a consent-based transactional email API that's free for the first 100,000 emails/month.

  This node lets your workflows:

  - **Send Template Email** — fire a predefined transactional template (OTP, order receipt, new-device login, …) instantly to anyone. No consent required.
  - **Send Custom Email** — send your own markdown/HTML/text email. **Consent-gated** (see the caveat below).
  - **Request Consent** — ask a recipient to approve future custom email.
  - **Get Consent Status** / **List Consents** — read where recipients stand in the Permission Loop.
  - **List Domains** — list your sender domains and their DNS verification state.

  It is a **declarative** node, built and verified against the live GoodSender API.

  API reference: <https://goodsender.com/docs/api-reference/>

  ---

  ## Installation

  ### Community Nodes (recommended)

  On self-hosted n8n: **Settings → Community Nodes → Install**, enter `n8n-nodes-goodsender`, and confirm. The **GoodSender** node then appears in the node panel.

  ### Manual

  ```bash
  # in your n8n custom extensions directory (default: ~/.n8n/custom)
  npm install n8n-nodes-goodsender
  ```

  Or to develop/test from source:

  ```bash
  git clone <this repo> && cd n8n-nodes-goodsender
  npm install
  npm run build
  npm link
  # then, inside ~/.n8n/custom:
  npm link n8n-nodes-goodsender
  # restart n8n
  ```

  ---

  ## Credentials

  1. Create an API key in the GoodSender dashboard.
  2. In n8n, add a **GoodSender API** credential and paste the key.
  3. (Optional) Override **Base URL** only for dev/staging (`https://api.dev.goodsender.com`). Defaults to `https://api.goodsender.com`.

  The key is sent as `Authorization: Bearer <key>` on every request. The credential's **test** button calls `GET /v1/domains`, so a bad key fails immediately with `401`.

  ---

  ## Operations

  All operations live under the single **Email** resource.

  | Operation | Method & path | Notes |
  |---|---|---|
  | Send Template Email | `POST /v1/emails/template` | Instant. Bypasses consent. Always returns `{"status":"sent"}`. |
  | Send Custom Email | `POST /v1/emails/send` | **Consent-gated** — see caveat. |
  | Request Consent | `POST /v1/emails/consent` | Starts the Permission Loop for a recipient. |
  | Get Consent Status | `GET /v1/emails/{email}` | One recipient's consent state. |
  | List Consents | `GET /v1/emails` | Paginated/filterable; `Domain` is required. |
  | List Domains | `GET /v1/domains` | Sender domains + DNS verification. |

  ### Send Template Email

  Fields: **From Email** (required, on a verified domain), **From Name**, **To Email** (required), **To Name**, **Subject** (required), **Template**, **Variables** (key/value).

  Built-in template IDs and their variables:

  | Template ID | Variables |
  |---|---|
  | `otp_code` | `app_name`, `otp_code`, `expiry_minutes`, `purpose`, `anti_phishing_notice` |
  | `mfa_enrollment` | `app_name`, `mfa_method`, `enrolled_at` |
  | `new_device_login` | `app_name`, `login_time`, `additional_info` |
  | `order_completed` | `app_name`, `order_id`, `order_total`, `completed_at` |
  | `order_receipt` | `app_name`, `description`, `receipt_number`, `purchase_date`, `payment_method`, `total` |
  | `email_changed` | `app_name`, `new_email`, `changed_at`, `additional_info` |
  | `password_changed` | `app_name`, `changed_at`, `additional_info` |

  The catalogue grows over time. Pick **Custom (By ID)** in the **Template** dropdown to send any other template ID (e.g. a newly added one) without waiting for a node update. All variables are optional; omitted ones render as empty strings. URL-type variables must point to the sender's domain.

  ### Send Custom Email

  > **Consent caveat.** Custom email is gated by GoodSender's Permission Loop. A recipient who has not yet **approved** is held/declined — delivery is **not** guaranteed to be immediate. The call returns `{ "sent": n, "declined": m }`: `sent` are recipients with granted, active consent; `declined` are everyone else (never approved, rejected, or inactive for 120+ days under the Engagement Check). Use **Request Consent** first, or **Get Consent Status** to check, before relying on a custom send.

  Fields: **From Email**/**Name**, **To Email**/**Name**, **Subject**, **Content Type** (`markdown` / `html` / `text`), **Content**, and **Additional Fields** (reply-to, tag, send-at, open/click/unsubscribe tracking).

  ### Request Consent

  Fields: **Domain** (your verified sender domain — the consent is *for* this domain), **Recipient Email**, **Recipient Name** (optional), **Redirect URL** (optional; `{email}` is substituted).

  ### Get Consent Status / List Consents / List Domains

  Read endpoints for branching on consent state and inspecting domains. `List Consents` requires a **Domain**; both list operations support `Limit`/`Cursor` paging.

  ### Screenshots

  _(placeholder — add UI screenshots of the credential dialog and the Send Template Email node here)_

  ## Example workflow

  A minimal **Manual Trigger → GoodSender (Send Template Email)** workflow. In n8n, open a new
  workflow, press `Ctrl/Cmd+V` to paste this JSON onto the canvas, then open the GoodSender node and
  select your **GoodSender API** credential. Edit `fromEmail` to an address on a domain you've
  verified in GoodSender.

  ```json
  {
    "name": "GoodSender — Send OTP",
    "nodes": [
      {
        "parameters": {},
        "id": "a1b2c3d4-0001-4000-8000-000000000001",
        "name": "When clicking Test",
        "type": "n8n-nodes-base.manualTrigger",
        "typeVersion": 1,
        "position": [0, 0]
      },
      {
        "parameters": {
          "resource": "email",
          "operation": "sendTemplate",
          "fromEmail": "you@your-domain.com",
          "toEmail": "recipient@example.com",
          "subject": "Your verification code",
          "templateId": "otp_code",
          "app_name": "MyApp",
          "otp_code": "482916",
          "expiry_minutes": "10"
        },
        "id": "a1b2c3d4-0002-4000-8000-000000000002",
        "name": "GoodSender",
        "type": "n8n-nodes-goodsender.goodSender",
        "typeVersion": 1,
        "position": [240, 0],
        "credentials": {
          "goodSenderApi": { "id": "1", "name": "GoodSender account" }
        }
      }
    ],
    "connections": {
      "When clicking Test": {
        "main": [[{ "node": "GoodSender", "type": "main", "index": 0 }]]
      }
    }
  }
  ```

  ---

  ## API notes & corrections

  This node was built against the live API. The following differ from older/internal docs — captured here so the node's behavior is clear:

  | Topic | What this node does (verified) |
  |---|---|
  | Custom-send path | `POST /v1/emails/send` (not `/v1/emails`), batch body `{ "emails": [ … ] }`. |
  | Sender field | There is no `sender_identity`. Sender is a required `from: { email, name? }` on template and custom sends. |
  | Template body | `from`, `to` (object), `subject` are all required; the template goes under `template: { template_id, variables }`. |
  | Template result | The template endpoint bypasses the Permission Loop and **always** returns `{"status":"sent"}` (it reaches denied/unknown recipients too). |
  | Consent body | `{ "domain", "emails": [ … ], "redirect_url"? }` — needs your sender **domain** plus a recipients array, not a single `email`. |
  | Templates | 7 built-in IDs verified (table above). `welcome` is **not** currently in the catalogue — use **Custom (By ID)** if/when it ships. |

  ### Webhooks (future)

  Custom sends accept `tracking` and `webhook_data`, which implies GoodSender emits delivery/open/click events. A webhook event schema isn't part of the public API reference yet, so there is no Trigger node here — it's a natural future addition once the event payloads are documented.

  ---

  ## Publishing

  Two tiers (commands shown; do not run without the right npm credentials):

  **1. Unverified — any self-hosted n8n can install it by name.**

  ```bash
  npm run build
  npm publish        # zero review; installable via Community Nodes immediately
  ```

  **2. Verified — in-app discoverability on n8n Cloud.**

  Submit through the [n8n Creator Portal](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/). Since **2026-05-01**, verified submissions must be published from CI with **npm provenance** — not from a local machine. This repo ships `.github/workflows/publish.yml` for that:

  ```yaml
  npm publish --provenance --access public   # runs in GitHub Actions with id-token: write
  ```

  It triggers on a GitHub Release and needs an `NPM_TOKEN` secret. It is a scaffold and is **not** wired to run automatically.

  ---

  ## Development

  ```bash
  npm install
  npm run build      # tsc + copy icon into dist/
  npm run lint       # eslint-plugin-n8n-nodes-base (must be clean for verification)
  npm pack           # validate the publishable tarball
  ```

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"GoodSender is an n8n community node for sending transactional, custom, and consent-based emails through the GoodSender API. It also supports consent management and domain verification lookup for workflows that need permission-aware email delivery.","capabilities":["Send template emails using predefined or custom template IDs","Send custom markdown, HTML, or text emails","Request recipient consent for future custom emails","Get the consent status for a specific recipient","List consent records with paging and domain filtering","List sender domains and their DNS verification status"],"authentication":"API key required via GoodSender API credential; the key is sent as Authorization: Bearer <key>. Optional base URL override is supported for dev/staging.","commonUseCases":["Sending transactional emails such as OTPs, order receipts, password changes, and login alerts","Requesting and checking recipient consent before sending custom marketing or notification emails","Inspecting verified sender domains before enabling email delivery in workflows"],"limitations":["Custom email delivery is consent-gated and may be declined or held if the recipient has not granted active consent","List Consents requires a Domain value","Template email from address must be on a verified domain","URL-type variables in templates must point to the sender's domain"],"relatedNodes":[]}


node_type: n8n-nodes-keupera.keupera
package_name: n8n-nodes-keupera
display_name: Keupera
description: Automate your SEO, AEO and GEO with Keupera.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: keupera
author_github_url: https://github.com/keupera/
npm_package_name: n8n-nodes-keupera
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.546Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "keywords",
      "options": [
        {
          "name": "AI Visibility",
          "value": "aiVisibility"
        },
        {
          "name": "Analytics",
          "value": "analytics"
        },
        {
          "name": "Backlink",
          "value": "backlinks"
        },
        {
          "name": "Content",
          "value": "content"
        },
        {
          "name": "Keyword",
          "value": "keywords"
        },
        {
          "name": "Utility",
          "value": "utilities"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "action": "Add keywords",
          "description": "Add one or more keywords"
        },
        {
          "name": "Bulk Update Status",
          "value": "bulkUpdateStatus",
          "action": "Bulk update keyword status",
          "description": "Set status on multiple keywords"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete keywords",
          "description": "Delete keywords by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List keywords",
          "description": "List all tracked keywords"
        },
        {
          "name": "List Groups",
          "value": "listGroups",
          "action": "List keyword groups",
          "description": "List all keyword groups"
        },
        {
          "name": "Poll Research Job",
          "value": "pollResearch",
          "action": "Poll keyword research job",
          "description": "Check status of a research job"
        },
        {
          "name": "Toggle Star",
          "value": "toggleStar",
          "action": "Toggle keyword star",
          "description": "Star or unstar a keyword"
        },
        {
          "name": "Trigger Research",
          "value": "triggerResearch",
          "action": "Trigger keyword research",
          "description": "Start a keyword research job"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "keywords"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listCampaigns",
      "options": [
        {
          "name": "Create Campaign",
          "value": "createCampaign",
          "action": "Create backlink campaign",
          "description": "Create a new backlink campaign"
        },
        {
          "name": "Generate Outreach Email",
          "value": "generateEmail",
          "action": "Generate outreach email",
          "description": "AI-generate an outreach email for an opportunity"
        },
        {
          "name": "Get Campaign",
          "value": "getCampaign",
          "action": "Get backlink campaign",
          "description": "Get details of a campaign"
        },
        {
          "name": "Get Opportunity",
          "value": "getOpportunity",
          "action": "Get backlink opportunity",
          "description": "Get a single opportunity"
        },
        {
          "name": "Get Recommendations",
          "value": "getRecommendations",
          "action": "Get campaign recommendations",
          "description": "Get strategic recommendations for a campaign"
        },
        {
          "name": "List Campaigns",
          "value": "listCampaigns",
          "action": "List backlink campaigns",
          "description": "List all backlink campaigns"
        },
        {
          "name": "List Opportunities",
          "value": "listOpportunities",
          "action": "List campaign opportunities",
          "description": "List opportunities for a campaign"
        },
        {
          "name": "Send Outreach Email",
          "value": "sendEmail",
          "action": "Send outreach email",
          "description": "Send the outreach email for an opportunity"
        },
        {
          "name": "Update Opportunity",
          "value": "updateOpportunity",
          "action": "Update backlink opportunity",
          "description": "Update an opportunity"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "backlinks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listArticles",
      "options": [
        {
          "name": "Create Article",
          "value": "createArticle",
          "action": "Create article"
        },
        {
          "name": "Delete Article",
          "value": "deleteArticle",
          "action": "Delete article"
        },
        {
          "name": "Get Article",
          "value": "getArticle",
          "action": "Get article"
        },
        {
          "name": "Get Automation Settings",
          "value": "getAutomation",
          "action": "Get automation settings"
        },
        {
          "name": "Get Calendar",
          "value": "getCalendar",
          "action": "Get content calendar"
        },
        {
          "name": "List Articles",
          "value": "listArticles",
          "action": "List articles"
        },
        {
          "name": "Trigger Generation",
          "value": "triggerGeneration",
          "action": "Trigger article generation",
          "description": "Start AI generation for an article"
        },
        {
          "name": "Update Article",
          "value": "updateArticle",
          "action": "Update article"
        },
        {
          "name": "Update Automation Settings",
          "value": "updateAutomation",
          "action": "Update automation settings"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "content"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "brListCampaigns",
      "options": [
        {
          "name": "Brand Radar: Create Campaign",
          "value": "brCreateCampaign",
          "action": "Create brand radar campaign",
          "description": "Create a Brand Radar campaign"
        },
        {
          "name": "Brand Radar: Delete Campaign",
          "value": "brDeleteCampaign",
          "action": "Delete brand radar campaign",
          "description": "Delete a Brand Radar campaign"
        },
        {
          "name": "Brand Radar: Get Results",
          "value": "brGetResults",
          "action": "Get brand radar campaign results",
          "description": "Get results for a Brand Radar campaign"
        },
        {
          "name": "Brand Radar: List Campaigns",
          "value": "brListCampaigns",
          "action": "List brand radar campaigns",
          "description": "List all Brand Radar campaigns"
        },
        {
          "name": "Brand Radar: Update Campaign",
          "value": "brUpdateCampaign",
          "action": "Update brand radar campaign",
          "description": "Update a Brand Radar campaign"
        },
        {
          "name": "Get AI Visibility Score",
          "value": "getScore",
          "action": "Get AI visibility score",
          "description": "Get aggregated AI visibility score"
        },
        {
          "name": "Prompt Research: Create Campaign",
          "value": "prCreateCampaign",
          "action": "Create prompt research campaign",
          "description": "Create a Prompt Research campaign"
        },
        {
          "name": "Prompt Research: Get Details",
          "value": "prGetDetails",
          "action": "Get prompt research campaign details",
          "description": "Get campaign details and results"
        },
        {
          "name": "Prompt Research: List Campaigns",
          "value": "prListCampaigns",
          "action": "List prompt research campaigns",
          "description": "List all Prompt Research campaigns"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "aiVisibility"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "websiteSummary",
      "options": [
        {
          "name": "Bot Traffic: Daily",
          "value": "botDaily",
          "action": "Get bot traffic daily",
          "description": "Day-by-day bot traffic"
        },
        {
          "name": "Bot Traffic: Summary",
          "value": "botSummary",
          "action": "Get bot traffic summary",
          "description": "AI & search bot visit summary"
        },
        {
          "name": "Bot Traffic: Top Pages",
          "value": "botTopPages",
          "action": "Get bot traffic top pages",
          "description": "Most bot-crawled pages"
        },
        {
          "name": "Search Console: Daily Stats",
          "value": "scDaily",
          "action": "Get search console daily stats",
          "description": "Daily clicks, impressions, CTR, position"
        },
        {
          "name": "Search Console: Top Keywords",
          "value": "scKeywords",
          "action": "Get search console top keywords",
          "description": "Top keywords from Search Console"
        },
        {
          "name": "Search Console: Top Pages",
          "value": "scPages",
          "action": "Get search console top pages",
          "description": "Top pages from Search Console"
        },
        {
          "name": "Website: Browser Breakdown",
          "value": "websiteBrowsers",
          "action": "Get website browser breakdown",
          "description": "Browser share"
        },
        {
          "name": "Website: Daily Traffic",
          "value": "websiteDaily",
          "action": "Get website daily traffic",
          "description": "Day-by-day traffic breakdown"
        },
        {
          "name": "Website: Device Breakdown",
          "value": "websiteDevices",
          "action": "Get website device breakdown",
          "description": "Desktop / mobile / tablet split"
        },
        {
          "name": "Website: Geographic Traffic",
          "value": "websiteGeo",
          "action": "Get website geographic traffic",
          "description": "Traffic by country"
        },
        {
          "name": "Website: Referrers",
          "value": "websiteReferrers",
          "action": "Get website referrers",
          "description": "Traffic sources / referrers"
        },
        {
          "name": "Website: Summary",
          "value": "websiteSummary",
          "action": "Get website analytics summary",
          "description": "Overall traffic summary"
        },
        {
          "name": "Website: Top Pages",
          "value": "websiteTopPages",
          "action": "Get website top pages",
          "description": "Most-visited pages"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "analytics"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "verifyCredentials",
      "options": [
        {
          "name": "Verify Credentials",
          "value": "verifyCredentials",
          "action": "Verify keupera credentials",
          "description": "Return the authenticated user profile"
        },
        {
          "name": "Connect CMS",
          "value": "connectCms",
          "action": "Connect CMS integration",
          "description": "Connect a CMS integration (Framer or WordPress)"
        },
        {
          "name": "Track Bot Hit",
          "value": "trackBot",
          "action": "Track bot hit",
          "description": "Record a bot visit (internal use)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "utilities"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Add",
      "value": "add",
      "action": "Add keywords",
      "description": "Add one or more keywords",
      "resource": "keywords"
    },
    {
      "name": "Bulk Update Status",
      "value": "bulkUpdateStatus",
      "action": "Bulk update keyword status",
      "description": "Set status on multiple keywords",
      "resource": "keywords"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete keywords",
      "description": "Delete keywords by ID",
      "resource": "keywords"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List keywords",
      "description": "List all tracked keywords",
      "resource": "keywords"
    },
    {
      "name": "List Groups",
      "value": "listGroups",
      "action": "List keyword groups",
      "description": "List all keyword groups",
      "resource": "keywords"
    },
    {
      "name": "Poll Research Job",
      "value": "pollResearch",
      "action": "Poll keyword research job",
      "description": "Check status of a research job",
      "resource": "keywords"
    },
    {
      "name": "Toggle Star",
      "value": "toggleStar",
      "action": "Toggle keyword star",
      "description": "Star or unstar a keyword",
      "resource": "keywords"
    },
    {
      "name": "Trigger Research",
      "value": "triggerResearch",
      "action": "Trigger keyword research",
      "description": "Start a keyword research job",
      "resource": "keywords"
    },
    {
      "name": "Create Campaign",
      "value": "createCampaign",
      "action": "Create backlink campaign",
      "description": "Create a new backlink campaign",
      "resource": "backlinks"
    },
    {
      "name": "Generate Outreach Email",
      "value": "generateEmail",
      "action": "Generate outreach email",
      "description": "AI-generate an outreach email for an opportunity",
      "resource": "backlinks"
    },
    {
      "name": "Get Campaign",
      "value": "getCampaign",
      "action": "Get backlink campaign",
      "description": "Get details of a campaign",
      "resource": "backlinks"
    },
    {
      "name": "Get Opportunity",
      "value": "getOpportunity",
      "action": "Get backlink opportunity",
      "description": "Get a single opportunity",
      "resource": "backlinks"
    },
    {
      "name": "Get Recommendations",
      "value": "getRecommendations",
      "action": "Get campaign recommendations",
      "description": "Get strategic recommendations for a campaign",
      "resource": "backlinks"
    },
    {
      "name": "List Campaigns",
      "value": "listCampaigns",
      "action": "List backlink campaigns",
      "description": "List all backlink campaigns",
      "resource": "backlinks"
    },
    {
      "name": "List Opportunities",
      "value": "listOpportunities",
      "action": "List campaign opportunities",
      "description": "List opportunities for a campaign",
      "resource": "backlinks"
    },
    {
      "name": "Send Outreach Email",
      "value": "sendEmail",
      "action": "Send outreach email",
      "description": "Send the outreach email for an opportunity",
      "resource": "backlinks"
    },
    {
      "name": "Update Opportunity",
      "value": "updateOpportunity",
      "action": "Update backlink opportunity",
      "description": "Update an opportunity",
      "resource": "backlinks"
    },
    {
      "name": "Create Article",
      "value": "createArticle",
      "action": "Create article",
      "resource": "content"
    },
    {
      "name": "Delete Article",
      "value": "deleteArticle",
      "action": "Delete article",
      "resource": "content"
    },
    {
      "name": "Get Article",
      "value": "getArticle",
      "action": "Get article",
      "resource": "content"
    },
    {
      "name": "Get Automation Settings",
      "value": "getAutomation",
      "action": "Get automation settings",
      "resource": "content"
    },
    {
      "name": "Get Calendar",
      "value": "getCalendar",
      "action": "Get content calendar",
      "resource": "content"
    },
    {
      "name": "List Articles",
      "value": "listArticles",
      "action": "List articles",
      "resource": "content"
    },
    {
      "name": "Trigger Generation",
      "value": "triggerGeneration",
      "action": "Trigger article generation",
      "description": "Start AI generation for an article",
      "resource": "content"
    },
    {
      "name": "Update Article",
      "value": "updateArticle",
      "action": "Update article",
      "resource": "content"
    },
    {
      "name": "Update Automation Settings",
      "value": "updateAutomation",
      "action": "Update automation settings",
      "resource": "content"
    },
    {
      "name": "Brand Radar: Create Campaign",
      "value": "brCreateCampaign",
      "action": "Create brand radar campaign",
      "description": "Create a Brand Radar campaign",
      "resource": "aiVisibility"
    },
    {
      "name": "Brand Radar: Delete Campaign",
      "value": "brDeleteCampaign",
      "action": "Delete brand radar campaign",
      "description": "Delete a Brand Radar campaign",
      "resource": "aiVisibility"
    },
    {
      "name": "Brand Radar: Get Results",
      "value": "brGetResults",
      "action": "Get brand radar campaign results",
      "description": "Get results for a Brand Radar campaign",
      "resource": "aiVisibility"
    },
    {
      "name": "Brand Radar: List Campaigns",
      "value": "brListCampaigns",
      "action": "List brand radar campaigns",
      "description": "List all Brand Radar campaigns",
      "resource": "aiVisibility"
    },
    {
      "name": "Brand Radar: Update Campaign",
      "value": "brUpdateCampaign",
      "action": "Update brand radar campaign",
      "description": "Update a Brand Radar campaign",
      "resource": "aiVisibility"
    },
    {
      "name": "Get AI Visibility Score",
      "value": "getScore",
      "action": "Get AI visibility score",
      "description": "Get aggregated AI visibility score",
      "resource": "aiVisibility"
    },
    {
      "name": "Prompt Research: Create Campaign",
      "value": "prCreateCampaign",
      "action": "Create prompt research campaign",
      "description": "Create a Prompt Research campaign",
      "resource": "aiVisibility"
    },
    {
      "name": "Prompt Research: Get Details",
      "value": "prGetDetails",
      "action": "Get prompt research campaign details",
      "description": "Get campaign details and results",
      "resource": "aiVisibility"
    },
    {
      "name": "Prompt Research: List Campaigns",
      "value": "prListCampaigns",
      "action": "List prompt research campaigns",
      "description": "List all Prompt Research campaigns",
      "resource": "aiVisibility"
    },
    {
      "name": "Bot Traffic: Daily",
      "value": "botDaily",
      "action": "Get bot traffic daily",
      "description": "Day-by-day bot traffic",
      "resource": "analytics"
    },
    {
      "name": "Bot Traffic: Summary",
      "value": "botSummary",
      "action": "Get bot traffic summary",
      "description": "AI & search bot visit summary",
      "resource": "analytics"
    },
    {
      "name": "Bot Traffic: Top Pages",
      "value": "botTopPages",
      "action": "Get bot traffic top pages",
      "description": "Most bot-crawled pages",
      "resource": "analytics"
    },
    {
      "name": "Search Console: Daily Stats",
      "value": "scDaily",
      "action": "Get search console daily stats",
      "description": "Daily clicks, impressions, CTR, position",
      "resource": "analytics"
    },
    {
      "name": "Search Console: Top Keywords",
      "value": "scKeywords",
      "action": "Get search console top keywords",
      "description": "Top keywords from Search Console",
      "resource": "analytics"
    },
    {
      "name": "Search Console: Top Pages",
      "value": "scPages",
      "action": "Get search console top pages",
      "description": "Top pages from Search Console",
      "resource": "analytics"
    },
    {
      "name": "Website: Browser Breakdown",
      "value": "websiteBrowsers",
      "action": "Get website browser breakdown",
      "description": "Browser share",
      "resource": "analytics"
    },
    {
      "name": "Website: Daily Traffic",
      "value": "websiteDaily",
      "action": "Get website daily traffic",
      "description": "Day-by-day traffic breakdown",
      "resource": "analytics"
    },
    {
      "name": "Website: Device Breakdown",
      "value": "websiteDevices",
      "action": "Get website device breakdown",
      "description": "Desktop / mobile / tablet split",
      "resource": "analytics"
    },
    {
      "name": "Website: Geographic Traffic",
      "value": "websiteGeo",
      "action": "Get website geographic traffic",
      "description": "Traffic by country",
      "resource": "analytics"
    },
    {
      "name": "Website: Referrers",
      "value": "websiteReferrers",
      "action": "Get website referrers",
      "description": "Traffic sources / referrers",
      "resource": "analytics"
    },
    {
      "name": "Website: Summary",
      "value": "websiteSummary",
      "action": "Get website analytics summary",
      "description": "Overall traffic summary",
      "resource": "analytics"
    },
    {
      "name": "Website: Top Pages",
      "value": "websiteTopPages",
      "action": "Get website top pages",
      "description": "Most-visited pages",
      "resource": "analytics"
    },
    {
      "name": "Verify Credentials",
      "value": "verifyCredentials",
      "action": "Verify keupera credentials",
      "description": "Return the authenticated user profile",
      "resource": "utilities"
    },
    {
      "name": "Connect CMS",
      "value": "connectCms",
      "action": "Connect CMS integration",
      "description": "Connect a CMS integration (Framer or WordPress)",
      "resource": "utilities"
    },
    {
      "name": "Track Bot Hit",
      "value": "trackBot",
      "action": "Track bot hit",
      "description": "Record a bot visit (internal use)",
      "resource": "utilities"
    }
  ]

npm_readme:
  # n8n-nodes-keupera

  An [n8n](https://n8n.io) community node for the [Keupera](https://keupera.com) SEO, GEO and AI Visibility platform.

  Automate every part of your SEO and GEO workflows with Keupera, inside n8n — keyword research, content planning, backlink outreach, AI-visibility monitoring (Brand Radar, Prompt Research), and detailed analytics.

  ## Resources

  | Resource | Operations |
  |---|---|
  | **Keywords** | List, Add, Delete, Toggle Star, Bulk Update Status, Trigger Research, Poll Research Job, List Groups |
  | **Backlinks** | List Campaigns, Create Campaign, Get Campaign, List Opportunities, Get Recommendations, Get Opportunity, Update Opportunity, Generate Email, Send Email |
  | **Content** | List Articles, Get Article, Create Article, Update Article, Delete Article, Trigger Generation, Get Calendar, Get Automation Settings, Update Automation Settings |
  | **AI Visibility** | Brand Radar List/Create/Delete/Update/Get Results; Prompt Research List/Create/Get; AI Score |
  | **Analytics** | Website Summary/Daily/Top Pages/Referrers/Devices/Browsers/Geo; Search Console Daily/Keywords/Pages; Bot Traffic Summary/Daily/Top Pages |
  | **Utilities** | Verify Credentials, Connect CMS, Track Bot Hit |

  ## Authentication

  This node uses an **API Key** (Bearer token). Obtain your key from the [Keupera dashboard](https://app.keupera.com) under **Settings → Developers**.

  > **Note**: each API key is bound to a single website. The `Website ID` field is optional in most cases — leave it empty to use the website your key is bound to. Only set it to override and target another website you own.

  ## Compatibility

  - n8n >= 2.21.7
  - Node.js >= 20
  - Requires a Keupera paid subscription with API access enabled.

  ## API Reference

  Full API documentation: [https://docs.keupera.com/api-reference/introduction](https://docs.keupera.com/api-reference/introduction)

  ## Support

  We're here to help you get the most out of Keupera + n8n.

  - **Email**: [ask@support.keupera.com](mailto:ask@support.keupera.com)
  - **Website**: [https://keupera.com](https://keupera.com)
  - **Docs**: [https://docs.keupera.com](https://docs.keupera.com)
  - **Bug reports & feature requests**: [open an issue on GitHub](https://github.com/keupera/n8n-nodes-keupera/issues)
  - **Community help (n8n)**: [n8n community forum](https://community.n8n.io)

  When reporting a bug, please include:

  1. n8n version (`Settings → Version`)
  2. `n8n-nodes-keupera` version
  3. The resource + operation in use
  4. A screenshot or copy of the error message
  5. (If possible) a workflow JSON export with credentials stripped

  ## Contributing

  Contributions are welcome! To get a local dev environment running:

  ```bash
  git clone https://github.com/keupera/n8n-nodes-keupera.git
  cd n8n-nodes-keupera
  npm install
  npm run lint
  npm run dev
  ```

  Open a pull request against the `main` branch describing the change and linking any related issue.

  ## License

  [MIT](LICENSE) © [Keupera](https://keupera.com) 2026 - present

ai_documentation_summary:
  {"purpose":"A community n8n node for the Keupera SEO, GEO, and AI Visibility platform. It helps automate keyword research, content planning, backlink outreach, AI visibility monitoring, and analytics workflows inside n8n.","capabilities":["Keywords management: list, add, delete, toggle star, bulk update status, trigger research, poll research jobs, list groups","Backlink workflows: list/create/get campaigns, list opportunities, get recommendations, get/update opportunities, generate email, send email","Content workflows: list/get/create/update/delete articles, trigger content generation, get calendar, get and update automation settings","AI Visibility tools: Brand Radar list/create/delete/update/get results, Prompt Research list/create/get, AI Score","Analytics reporting: website summary, daily, top pages, referrers, devices, browsers, geo, Search Console daily/keywords/pages, bot traffic summary/daily/top pages","Utilities: verify credentials, connect CMS, track bot hit"],"authentication":"API key required (Bearer token). The key is obtained from the Keupera dashboard under Settings → Developers. Each API key is bound to a single website; Website ID is optional in most cases.","commonUseCases":["Automating SEO keyword research and status management","Planning, generating, and managing content calendars and articles","Running backlink outreach campaigns and emailing prospects","Monitoring brand and prompt visibility in AI tools","Pulling SEO, Search Console, and bot traffic analytics into n8n workflows"],"limitations":["Requires a Keupera paid subscription with API access enabled","Each API key is bound to a single website","Designed for n8n >= 2.21.7 and Node.js >= 20"],"relatedNodes":[]}


node_type: @checkilo/n8n-nodes-checkilo.checkilo
package_name: @checkilo/n8n-nodes-checkilo
display_name: Checkilo
description: Send event and workflow pings to Checkilo
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: coke3a
author_github_url: https://github.com/Coke3a/checkilo-n8n-node.git
npm_package_name: @checkilo/n8n-nodes-checkilo
npm_version: 0.2.1
community_fetched_at: 2026-07-14T14:40:34.547Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # @checkilo/n8n-nodes-checkilo

  `@checkilo/n8n-nodes-checkilo` is an n8n community node package for sending Checkilo pings from inside n8n workflows.

  > [Checkilo](https://checkilo.app) is heartbeat and checkpoint monitoring for business-critical automations — it alerts you when an n8n workflow stops running or silently stops working. Learn more and start free (5 automations, no card) at **[checkilo.app](https://checkilo.app)**.

  It provides one node, `Checkilo`, with two operations:

  - `Event Ping` — a single heartbeat marked Success or Failure
  - `Workflow Ping` — a multi-step run: Start → Checkpoint → Finish (Success/Failure)

  The node uses Checkilo API keys and loads available automations from the real Checkilo API. Every ping carries a Checkilo `run` correlation id derived automatically from the n8n execution ID — workflow steps (start → checkpoint → finish) share one value, and event pings include it so a ping can be traced back to its n8n execution.

  > **Node versions:** newly added nodes default to **v2** (the UX described here). Existing workflows pinned to **v1** keep their original behavior — see [Node Versions](#node-versions).

  ## What It Does

  Use the `Checkilo` node when you want to:

  - send a simple event-style heartbeat ping from a workflow
  - track workflow lifecycle steps: start, checkpoint, and finish (success or failure)
  - send a failure ping from an n8n Error Trigger workflow using the original failed execution ID when n8n provides it

  The node returns the live Checkilo ping response and adds a few non-secret helper fields such as the derived `run_id`, selected `target_url`, selected `target_name` when available, the operation, and the workflow event.

  ## Installation

  Follow the official n8n community node installation guide:

  - [Install community nodes](https://docs.n8n.io/integrations/community-nodes/installation/)

  For self-hosted n8n, install this package as:

  ```bash
  npm install @checkilo/n8n-nodes-checkilo
  ```

  This package expects a Checkilo backend that exposes:

  - `GET /n8n/auth/test`
  - `GET /n8n/automations`

  Those routes were added in this repository as compatibility aliases over the existing authenticated integration endpoints.

  ## Credentials

  Create a `Checkilo API` credential in n8n with:

  - `API Key`

  Details:

  - Auth header: `Authorization: Bearer <api_key>`
  - The Checkilo ping host is fixed to `https://ping.checkilo.app` (not a credential field)

  Credential testing uses:

  - `GET https://ping.checkilo.app/n8n/auth/test`

  ## Operations

  ### Event Ping

  `Event Ping` sends one self-contained `POST` to the selected Checkilo ping URL:

  - `Result` = `Success` → `/success`, or `Failure` → `/fail`
  - optional key/value metadata, sent as a JSON request body
  - `run=<execution id>` so the ping can be traced back to its n8n execution (the backend still treats each event ping as its own one-shot run and never joins other pings to it)

  Use this for simple heartbeat-style tracking when you only need one ping.

  ### Workflow Ping

  `Workflow Ping` sends a `POST` to the selected Checkilo ping URL based on the chosen `Event`:

  - `Start` → `/start`
  - `Checkpoint` → `/checkpoint` (with `label=<checkpoint name>`)
  - `Finish` + `Result` = `Success` → `/success`, or `Failure` → `/fail`

  All workflow pings include `run=<execution id>`, derived automatically from the current n8n execution so every step of one run shares the same value (there is no user-entered Run ID field). For failure pings sent from an Error Trigger workflow, the node reuses the original failed execution ID when n8n provides it. Optional key/value metadata is sent as the JSON request body.

  ## Example Workflow Patterns

  ### Simple Event Heartbeat

  1. Add `Checkilo`
  2. Choose `Event Ping`
  3. Pick the Checkilo automation from the dropdown
  4. Optionally add JSON metadata

  ### Workflow Lifecycle Tracking

  Use multiple `Checkilo` nodes in the same workflow:

  1. `Workflow Ping` with `Start` near the beginning
  2. `Workflow Ping` with `Checkpoint` at important milestones
  3. `Workflow Ping` with `Finish` → `Success` at the end

  Because the node derives the Checkilo `run` value from the n8n execution ID, Checkilo correlates those pings into one workflow run.

  ### Error Trigger Failure Tracking

  Use n8n’s Error Trigger workflow pattern to report failures:

  1. Create an Error Trigger workflow
  2. Add the `Checkilo` node after the trigger
  3. Choose `Workflow Ping`
  4. Choose `Finish` → `Failure`
  5. Select the same Checkilo automation

  When the incoming item includes the original failed `execution.id`, the node uses that original execution ID as the Checkilo `run` value so the failure ping attaches to the same Checkilo workflow run.

  ## Local Development

  From this package directory:

  ```bash
  npm install
  npm run dev
  npm run lint
  npm test
  npm run build
  ```

  ## n8n References Used

  - [Creating nodes](https://docs.n8n.io/integrations/creating-nodes/)
  - [Build a node](https://docs.n8n.io/integrations/creating-nodes/build/n8n-node/)
  - [Choose node method](https://docs.n8n.io/integrations/creating-nodes/plan/choose-node-method/)
  - [Community node installation](https://docs.n8n.io/integrations/community-nodes/installation/)
  - [Submit community nodes](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/)

  ## Node Versions

  - **v2 (default):** `Event Ping` has a `Result` (Success/Failure); `Workflow Ping` uses `Start` / `Checkpoint` / `Finish` (Finish adds a `Result`); metadata is a key/value collection; the `run` correlation id is always derived automatically from the n8n execution ID (no user-entered Run ID field).
  - **v1:** original behavior — `Workflow Ping` events `Started` / `Checkpoint` / `Succeeded` / `Failed`, a `Checkpoint Label` field, and a JSON `Metadata` field. Existing workflows keep v1 automatically; only newly added nodes use v2.

  Both versions call the same Checkilo API, so v1 workflows keep working unchanged.

  ## Current Status

  Implemented:

  - Checkilo API credential with secret API key handling
  - credential test against `/n8n/auth/test`
  - dynamic automation dropdown backed by `/n8n/automations`
  - `Event Ping` (Success/Failure) and `Workflow Ping` (Start/Checkpoint/Finish)
  - key/value metadata body
  - automatic execution ID → Checkilo `run` on every ping (event and workflow); no user-entered Run ID
  - Error Trigger-friendly failure ping behavior (reuses the original execution ID)
  - full versioning: v1 preserved, v2 default

ai_documentation_summary:
  {"purpose":"Sends Checkilo pings from n8n workflows to track events and workflow lifecycle states. It correlates pings to an n8n execution using an automatically derived run ID.","capabilities":["Send Event Ping heartbeats with Success or Failure results","Send Workflow Ping steps for Start, Checkpoint, and Finish","Send Finish pings with Success or Failure results","Attach optional key/value metadata to pings","Automatically derive and include a run correlation ID from the n8n execution ID","Reuse the original failed execution ID for Error Trigger failure workflows when available","Load available automations from the Checkilo API","Return the live Checkilo ping response plus helper fields like run_id, target_url, target_name, operation, and workflow event"],"authentication":"API key required via Checkilo API credential using Authorization: Bearer <api_key>","commonUseCases":["Send simple heartbeat pings from a workflow","Track workflow lifecycle progress across start, checkpoint, and finish steps","Report workflow failures from an n8n Error Trigger workflow","Correlate multiple pings to a single Checkilo run for observability"],"limitations":["Requires a Checkilo backend that supports GET /n8n/auth/test and GET /n8n/automations","Checkilo ping host is fixed to https://ping.checkilo.app and is not configurable in the credential","v1 and v2 node behaviors differ; existing workflows pinned to v1 keep the old event names and fields"],"relatedNodes":[]}


node_type: n8n-nodes-deep-ocr.deepOcr
package_name: n8n-nodes-deep-ocr
display_name: Deep-OCR
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: hteske
author_github_url: https://github.com/Heey-Global/deep-ocr-n8n.git
npm_package_name: n8n-nodes-deep-ocr
npm_version: 1.13.0
community_fetched_at: 2026-07-14T14:40:34.548Z
description:
  AI-powered OCR for invoices, receipts, contracts, IDs, bank statements and more — returns structured JSON ready to use


node_type: n8n-nodes-seatalk.seaTalk
package_name: n8n-nodes-seatalk
display_name: SeaTalk
description: Send messages or interactive cards via SeaTalk
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: khunmza1
author_github_url: https://github.com/khunmza1/
npm_package_name: n8n-nodes-seatalk
npm_version: 1.1.1
community_fetched_at: 2026-07-14T14:40:34.549Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Message",
          "value": "message"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send Text Message",
          "value": "send",
          "action": "Send a standard text message"
        },
        {
          "name": "Send Interactive Card",
          "value": "sendInteractive",
          "action": "Send a card with buttons"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Text Message",
      "value": "send",
      "action": "Send a standard text message",
      "resource": "message"
    },
    {
      "name": "Send Interactive Card",
      "value": "sendInteractive",
      "action": "Send a card with buttons",
      "resource": "message"
    }
  ]

npm_readme:
  # n8n-nodes-seatalk

  This is an n8n community node that lets you interact with the [SeaTalk Open Platform](https://open.seatalk.io). It allows you to send text messages, rich interactive cards, and trigger workflows based on incoming SeaTalk events and button clicks.

  ## Features
  * **Send Text & Interactive Cards:** Send formatted rich text, @mentions, and interactive cards with buttons.
  * **Thread Routing:** Reply directly to existing conversations.
  * **SeaTalk Trigger:** Listen for real-time webhooks directly from SeaTalk with built-in handshake verification.

  ## Prerequisites

  To use this node, you need a SeaTalk Open Platform account and an active application.

  1. Go to the [SeaTalk Developer Center](https://open.seatalk.io).
  2. Create a new Application (or select an existing one).
  3. Navigate to **App Settings > App Credentials**.
  4. Copy your **App ID** and **App Secret**. You will need these for the n8n credentials setup.
  5. Ensure your app has the correct **Bot & Messaging** permissions enabled.

  ## Webhook Setup (For the Trigger Node)

  SeaTalk requires you to manually register your webhook URL in their developer console. n8n cannot do this automatically.

  1. In n8n, add the **SeaTalk Trigger** node to your canvas.
  2. Open the node and copy the **Test Webhook URL** (or Production Webhook URL).
  3. Go back to your SeaTalk Developer Console.
  4. Navigate to **Event Subscriptions**.
  5. Paste your n8n Webhook URL into the **Callback URL** field and save. 
  *(Note: Your n8n instance must be accessible from the public internet for SeaTalk to reach it).*

  ## Example Usage

  ### Send a standard message
  1. Add the **SeaTalk** node to your canvas.
  2. Select **Message** as the Resource and **Send Text Message** as the Operation.
  3. Choose **Group Chat** or **Direct Message**.
  4. Enter the recipient ID (Group ID or Employee Code) and your message text.
  5. Execute the node.

  ### Create an Interactive Card Workflow
  1. Use the **SeaTalk Trigger** node to listen for incoming messages.
  2. Connect it to a **SeaTalk** node configured to **Send Interactive Card**.
  3. Add Vertical Buttons or Horizontal Button Groups to the card.
  4. When a user clicks a button, the SeaTalk Trigger node will fire again with an `interactive_message_click` event containing the button's value.

  ## License
  [MIT](LICENSE)

  ## Installation
  In your n8n instance, go to **Settings > Community Nodes**, click **Install a community node**, and enter `n8n-nodes-seatalk`.

ai_documentation_summary:
  {"purpose":"Integrates n8n with the SeaTalk Open Platform to send text messages and interactive cards, and to trigger workflows from SeaTalk events and button clicks.","capabilities":["Send formatted text messages","Send rich interactive cards with buttons","Use @mentions in messages","Reply within existing conversations using thread routing","Listen for incoming SeaTalk webhooks via a trigger node","Verify incoming webhook handshakes","Handle interactive_message_click events from button clicks"],"authentication":"SeaTalk Open Platform credentials required: App ID and App Secret from a SeaTalk application, with Bot & Messaging permissions enabled.","commonUseCases":["Send notifications or alerts to SeaTalk group chats or direct messages","Build interactive approval or response workflows using SeaTalk cards and buttons","Trigger n8n automations from incoming SeaTalk messages or interactions"],"limitations":["Webhook URLs must be registered manually in the SeaTalk developer console; n8n cannot do this automatically","The n8n instance must be publicly accessible for SeaTalk to reach the webhook","Requires an active SeaTalk Open Platform application"],"relatedNodes":["SeaTalk Trigger"]}


node_type: n8n-nodes-seatalk.seaTalkTrigger
package_name: n8n-nodes-seatalk
display_name: SeaTalk Trigger
description: Starts the workflow when a SeaTalk message is received
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: khunmza1
author_github_url: https://github.com/khunmza1/
npm_package_name: n8n-nodes-seatalk
npm_version: 1.1.1
community_fetched_at: 2026-07-14T14:40:34.550Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-seatalk

  This is an n8n community node that lets you interact with the [SeaTalk Open Platform](https://open.seatalk.io). It allows you to send text messages, rich interactive cards, and trigger workflows based on incoming SeaTalk events and button clicks.

  ## Features
  * **Send Text & Interactive Cards:** Send formatted rich text, @mentions, and interactive cards with buttons.
  * **Thread Routing:** Reply directly to existing conversations.
  * **SeaTalk Trigger:** Listen for real-time webhooks directly from SeaTalk with built-in handshake verification.

  ## Prerequisites

  To use this node, you need a SeaTalk Open Platform account and an active application.

  1. Go to the [SeaTalk Developer Center](https://open.seatalk.io).
  2. Create a new Application (or select an existing one).
  3. Navigate to **App Settings > App Credentials**.
  4. Copy your **App ID** and **App Secret**. You will need these for the n8n credentials setup.
  5. Ensure your app has the correct **Bot & Messaging** permissions enabled.

  ## Webhook Setup (For the Trigger Node)

  SeaTalk requires you to manually register your webhook URL in their developer console. n8n cannot do this automatically.

  1. In n8n, add the **SeaTalk Trigger** node to your canvas.
  2. Open the node and copy the **Test Webhook URL** (or Production Webhook URL).
  3. Go back to your SeaTalk Developer Console.
  4. Navigate to **Event Subscriptions**.
  5. Paste your n8n Webhook URL into the **Callback URL** field and save. 
  *(Note: Your n8n instance must be accessible from the public internet for SeaTalk to reach it).*

  ## Example Usage

  ### Send a standard message
  1. Add the **SeaTalk** node to your canvas.
  2. Select **Message** as the Resource and **Send Text Message** as the Operation.
  3. Choose **Group Chat** or **Direct Message**.
  4. Enter the recipient ID (Group ID or Employee Code) and your message text.
  5. Execute the node.

  ### Create an Interactive Card Workflow
  1. Use the **SeaTalk Trigger** node to listen for incoming messages.
  2. Connect it to a **SeaTalk** node configured to **Send Interactive Card**.
  3. Add Vertical Buttons or Horizontal Button Groups to the card.
  4. When a user clicks a button, the SeaTalk Trigger node will fire again with an `interactive_message_click` event containing the button's value.

  ## License
  [MIT](LICENSE)

  ## Installation
  In your n8n instance, go to **Settings > Community Nodes**, click **Install a community node**, and enter `n8n-nodes-seatalk`.

ai_documentation_summary:
  {"purpose":"Triggers an n8n workflow when a SeaTalk event is received, including incoming messages and interactive button clicks. It is part of the SeaTalk Open Platform integration for real-time webhook-based automation.","capabilities":["Listens for real-time SeaTalk webhooks","Verifies webhook handshake requests","Triggers on incoming SeaTalk events","Triggers on interactive_message_click button click events"],"authentication":"SeaTalk Open Platform app credentials required (App ID and App Secret) with Bot & Messaging permissions; webhook URL must be manually registered in the SeaTalk developer console.","commonUseCases":["Start workflows when a SeaTalk message is received","Build interactive card workflows that continue after a user clicks a button","Route incoming SeaTalk events into downstream n8n automations"],"limitations":["Webhook registration cannot be automated from n8n and must be done manually in the SeaTalk developer console","The n8n instance must be publicly accessible for SeaTalk webhooks to reach it"],"relatedNodes":["SeaTalk"]}


node_type: n8n-nodes-doubleverify.doubleVerify
package_name: n8n-nodes-doubleverify
display_name: DoubleVerify
description: Interact with the DoubleVerify Report Data API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: sakretsos
author_github_url: https://github.com/Sakretsos/
npm_package_name: n8n-nodes-doubleverify
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.551Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "report",
      "options": [
        {
          "name": "Compatibility",
          "value": "compatibility"
        },
        {
          "name": "Data Load Time",
          "value": "dataLoadTime"
        },
        {
          "name": "Dimension",
          "value": "dimension"
        },
        {
          "name": "Metric",
          "value": "metric"
        },
        {
          "name": "Report",
          "value": "report"
        },
        {
          "name": "Request Type",
          "value": "requestType"
        },
        {
          "name": "Template",
          "value": "template"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many request types",
          "description": "Get many available request types"
        },
        {
          "name": "Get Details",
          "value": "get",
          "action": "Get request type details",
          "description": "Get details for a specific request type including templates and time zones"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "requestType"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Details",
          "value": "get",
          "action": "Get template details",
          "description": "Get dimensions and metrics for a specific template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many dimensions",
          "description": "Get many dimensions for a request type"
        },
        {
          "name": "Get Filter Values",
          "value": "getFilterValues",
          "action": "Get dimension filter values",
          "description": "Get filter values for a specific dimension"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dimension"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many metrics",
          "description": "Get many metrics for a request type"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "metric"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "check",
      "options": [
        {
          "name": "Check",
          "value": "check",
          "action": "Check compatibility",
          "description": "Check if dimensions and metrics are compatible with each other"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "compatibility"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Request",
          "value": "create",
          "action": "Create a report request",
          "description": "Submit an asynchronous data request"
        },
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get report request status",
          "description": "Get the status of a previous report request"
        },
        {
          "name": "Fetch Data",
          "value": "fetchData",
          "action": "Fetch report data",
          "description": "Download the CSV data for a completed report"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "report"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get data load time",
          "description": "Get the last available data load time per request type"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dataLoadTime"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many request types",
      "description": "Get many available request types",
      "resource": "requestType"
    },
    {
      "name": "Get Details",
      "value": "get",
      "action": "Get request type details",
      "description": "Get details for a specific request type including templates and time zones",
      "resource": "requestType"
    },
    {
      "name": "Get Details",
      "value": "get",
      "action": "Get template details",
      "description": "Get dimensions and metrics for a specific template",
      "resource": "template"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many dimensions",
      "description": "Get many dimensions for a request type",
      "resource": "dimension"
    },
    {
      "name": "Get Filter Values",
      "value": "getFilterValues",
      "action": "Get dimension filter values",
      "description": "Get filter values for a specific dimension",
      "resource": "dimension"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many metrics",
      "description": "Get many metrics for a request type",
      "resource": "metric"
    },
    {
      "name": "Check",
      "value": "check",
      "action": "Check compatibility",
      "description": "Check if dimensions and metrics are compatible with each other",
      "resource": "compatibility"
    },
    {
      "name": "Create Request",
      "value": "create",
      "action": "Create a report request",
      "description": "Submit an asynchronous data request",
      "resource": "report"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get report request status",
      "description": "Get the status of a previous report request",
      "resource": "report"
    },
    {
      "name": "Fetch Data",
      "value": "fetchData",
      "action": "Fetch report data",
      "description": "Download the CSV data for a completed report",
      "resource": "report"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get data load time",
      "description": "Get the last available data load time per request type",
      "resource": "dataLoadTime"
    }
  ]

npm_readme:
  # n8n-nodes-doubleverify

  This is an [n8n](https://n8n.io/) community node for the [DoubleVerify Report Data API V1](https://developer.doubleverify.com/docs/client-integrations).

  It lets you interact with the DoubleVerify Report Data API directly from your n8n workflows.

  ## Installation

  Follow the [n8n community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/).

  ### npm

  ```
  npm install n8n-nodes-doubleverify
  ```

  ## Credentials

  You need a DoubleVerify API **Bearer Token**. Contact your DoubleVerify account team to obtain API access.

  ## Resources

  This node supports the following resources and operations:

  | Resource | Operations |
  | --- | --- |
  | **Report** | Create Request, Get Status, Fetch Data |
  | **Request Type** | Get Many, Get Details |
  | **Template** | Get Details |
  | **Dimension** | Get Many, Get Filter Values |
  | **Metric** | Get Many |
  | **Compatibility** | Check |
  | **Data Load Time** | Get |

  ## Usage

  ### Creating a Report

  1. Select the **Report** resource and **Create Request** operation.
  2. Choose a **Request Type ID** (use the Request Type resource to discover available types).
  3. Set the **Date From** and **Date To** range.
  4. Provide the **Metrics** array as JSON.
  5. Optionally add dimensions, time zone, and metric thresholds in the additional options.
  6. The API returns a request ID. Use **Get Status** to poll until the report is ready, then **Fetch Data** to download the CSV results.

  ### Discovering Available Fields

  Use the **Request Type**, **Dimension**, and **Metric** resources to discover what's available for your account before building report requests.

  ### Checking Compatibility

  Use the **Compatibility** resource to verify that your selected dimensions and metrics can be used together before creating a report.

  ## API Documentation

  - [DoubleVerify Client Integrations](https://developer.doubleverify.com/docs/client-integrations)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Provides direct access to the DoubleVerify Report Data API V1 from n8n workflows. It is used to create report requests, check report status, and fetch report data, as well as discover supported request types, dimensions, and metrics.","capabilities":["Create report requests","Check report request status","Fetch report data as CSV","List request types","Get request type details","Get template details","List dimensions","Get dimension filter values","List metrics","Check dimension/metric compatibility"],"authentication":"DoubleVerify API Bearer Token required","commonUseCases":["Generating DoubleVerify reporting exports for a date range","Polling a report request until it is ready and then downloading results","Discovering available dimensions, metrics, and request types before building a report","Validating whether selected dimensions and metrics are compatible"],"limitations":["Requires a DoubleVerify API bearer token obtained through the account team","Report data must be retrieved in a separate step after creating the request and checking its status"],"relatedNodes":[]}


node_type: n8n-nodes-dhis2.dhis2
package_name: n8n-nodes-dhis2
display_name: DHIS2
description: Interact with DHIS2 Web API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: monfortbrian
author_github_url: https://github.com/monfortbrian/
npm_package_name: n8n-nodes-dhis2
npm_version: 1.2.4
community_fetched_at: 2026-07-14T14:40:34.551Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "dataValueSet",
      "options": [
        {
          "name": "Analytics",
          "value": "analytics"
        },
        {
          "name": "Data Value Set",
          "value": "dataValueSet"
        },
        {
          "name": "Enrollment",
          "value": "enrollment"
        },
        {
          "name": "Event",
          "value": "event"
        },
        {
          "name": "FHIR",
          "value": "fhir"
        },
        {
          "name": "Organisation Unit",
          "value": "organisationUnit"
        },
        {
          "name": "Program",
          "value": "program"
        },
        {
          "name": "Tracked Entity",
          "value": "trackedEntity"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "query",
      "options": [
        {
          "name": "Query",
          "value": "query",
          "action": "Query analytics",
          "description": "Query analytics data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "analytics"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get data values",
          "description": "Get data values for a data set"
        },
        {
          "name": "Push",
          "value": "push",
          "action": "Push data values",
          "description": "Push data values to DHIS2"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dataValueSet"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an enrollment",
          "description": "Enroll a tracked entity into a program"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an enrollment",
          "description": "Get an enrollment by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "enrollment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an event",
          "description": "Create a tracker event"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an event",
          "description": "Get an event by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many events",
          "description": "Get many events"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "readPatient",
      "options": [
        {
          "name": "Read Patient",
          "value": "readPatient",
          "action": "Read a FHIR patient",
          "description": "Read a FHIR Patient by ID"
        },
        {
          "name": "Search Patients",
          "value": "searchPatients",
          "action": "Search FHIR patients",
          "description": "Search FHIR Patients by identifier or name"
        },
        {
          "name": "Create Observation",
          "value": "createObservation",
          "action": "Create a FHIR observation",
          "description": "Post a FHIR Observation to DHIS2"
        },
        {
          "name": "Search Observations",
          "value": "searchObservations",
          "action": "Search FHIR observations",
          "description": "Search FHIR Observations by patient or code"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "fhir"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get an organisation unit",
          "description": "Get an organisation unit by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many organisation units",
          "description": "Get many organisation units"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "organisationUnit"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a program",
          "description": "Get a program by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many programs",
          "description": "Get many programs"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "program"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a tracked entity",
          "description": "Get a tracked entity by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many tracked entities",
          "description": "Get many tracked entities"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "trackedEntity"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Query",
      "value": "query",
      "action": "Query analytics",
      "description": "Query analytics data",
      "resource": "analytics"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get data values",
      "description": "Get data values for a data set",
      "resource": "dataValueSet"
    },
    {
      "name": "Push",
      "value": "push",
      "action": "Push data values",
      "description": "Push data values to DHIS2",
      "resource": "dataValueSet"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an enrollment",
      "description": "Enroll a tracked entity into a program",
      "resource": "enrollment"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an enrollment",
      "description": "Get an enrollment by ID",
      "resource": "enrollment"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an event",
      "description": "Create a tracker event",
      "resource": "event"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an event",
      "description": "Get an event by ID",
      "resource": "event"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many events",
      "description": "Get many events",
      "resource": "event"
    },
    {
      "name": "Read Patient",
      "value": "readPatient",
      "action": "Read a FHIR patient",
      "description": "Read a FHIR Patient by ID",
      "resource": "fhir"
    },
    {
      "name": "Search Patients",
      "value": "searchPatients",
      "action": "Search FHIR patients",
      "description": "Search FHIR Patients by identifier or name",
      "resource": "fhir"
    },
    {
      "name": "Create Observation",
      "value": "createObservation",
      "action": "Create a FHIR observation",
      "description": "Post a FHIR Observation to DHIS2",
      "resource": "fhir"
    },
    {
      "name": "Search Observations",
      "value": "searchObservations",
      "action": "Search FHIR observations",
      "description": "Search FHIR Observations by patient or code",
      "resource": "fhir"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an organisation unit",
      "description": "Get an organisation unit by ID",
      "resource": "organisationUnit"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many organisation units",
      "description": "Get many organisation units",
      "resource": "organisationUnit"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a program",
      "description": "Get a program by ID",
      "resource": "program"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many programs",
      "description": "Get many programs",
      "resource": "program"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a tracked entity",
      "description": "Get a tracked entity by ID",
      "resource": "trackedEntity"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many tracked entities",
      "description": "Get many tracked entities",
      "resource": "trackedEntity"
    }
  ]

npm_readme:
  # n8n-nodes-dhis2

  [![npm](https://img.shields.io/npm/v/n8n-nodes-dhis2)](https://www.npmjs.com/package/n8n-nodes-dhis2)
  [![npm downloads](https://img.shields.io/npm/dt/n8n-nodes-dhis2)](https://www.npmjs.com/package/n8n-nodes-dhis2)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

  n8n community node for [DHIS2](https://dhis2.org). Query analytics, push aggregate data, manage tracker events, enrollments, and FHIR interoperability.

  [n8n](https://n8n.io/) is a fair-code licensed workflow automation platform.

  ---

  ## Installation

  **Via n8n UI:** Settings → Community Nodes → search `n8n-nodes-dhis2` → Install

  **Via npm:**
  ```bash
  npm install n8n-nodes-dhis2
  ```

  ---

  ## Credentials

  | Field    | Description |
  |----------|-------------|
  | Base URL | Your DHIS2 instance (e.g. `https://play.im.dhis2.org/stable-2-43-0`) |
  | Username | DHIS2 username |
  | Password | DHIS2 password |

  Demo: `https://play.im.dhis2.org/stable-2-43-0` username `admin`, password `district`

  ---

  ## Resources & Operations

  | Resource           | Operations |
  |--------------------|------------|
  | Analytics          | Query |
  | Data Value Set     | Get, Push |
  | Enrollment         | Create, Get |
  | Event              | Create, Get, Get Many |
  | FHIR               | Read Patient, Search Patients, Create Observation, Search Observations |
  | Organisation Unit  | Get, Get Many |
  | Program            | Get, Get Many |
  | Tracked Entity     | Get, Get Many |

  ---

  ## Example: Query Analytics

  ```
  Resource:   Analytics
  Operation:  Query
  Dimension:  dx:Uvn6LCg7dVU;ou:ImspTQPwCqd;pe:LAST_12_MONTHS
  ```

  Returns each row as a flat object: `{ dx, ou, pe, value }`. All three dimensions are required by the DHIS2 Analytics API.

  > **Note:** Analytics tables must be built before querying. Run Data Administration → Analytics Tables → Start export on your instance if you get a 409 error.

  ---

  ## Compatibility

  - **DHIS2:** 2.39+ (Tracker API v2), 2.38+ for FHIR
  - **n8n:** 1.0+
  - **Node.js:** 22+

  ---

  ## API Reference

  ```
  GET  /api/analytics.json?dimension=dx:X&dimension=ou:Y&dimension=pe:Z
  GET  /api/dataValueSets.json?dataSet={id}&orgUnit={id}&period={p}
  POST /api/dataValueSets.json
  POST /api/tracker                        (event + enrollment create)
  GET  /api/tracker/enrollments/{id}
  GET  /api/tracker/events/{id}
  GET  /api/tracker/events?program={id}&orgUnit={id}
  GET  /api/tracker/trackedEntities/{id}
  GET  /api/tracker/trackedEntities?trackedEntityType={id}&orgUnit={id}
  GET  /api/organisationUnits/{id}.json
  GET  /api/organisationUnits.json
  GET  /api/programs/{id}.json
  GET  /api/programs.json
  GET  /fhir/Patient/{id}
  GET  /fhir/Patient?{param}={value}
  POST /fhir/Observation
  GET  /fhir/Observation?patient={ref}
  ```

  ---

  ## Resources

  - [DHIS2 Documentation](https://docs.dhis2.org/)
  - [DHIS2 Web API Guide](https://docs.dhis2.org/en/develop/using-the-api/dhis-core-version-master/introduction.html)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n-nodes-openmrs](https://www.npmjs.com/package/n8n-nodes-openmrs) OpenMRS FHIR integration
  - [n8n-nodes-rapidpro](https://www.npmjs.com/package/n8n-nodes-rapidpro) RapidPro messaging

  ---

  ## Contributing

  1. Fork the repository
  2. Create a feature branch: `git checkout -b feat/your-feature`
  3. Commit: `git commit -m 'feat(dhis2): your change'`
  4. Push and open a Pull Request

  ---

  ## Support

  - **Issues:** [GitHub Issues](https://github.com/monfortbrian/n8n-nodes-dhis2/issues)
  - **n8n Community:** [community.n8n.io](https://community.n8n.io/)

  ---

  ## License

  [MIT](LICENSE) © 2026 [Monfort Brian N. | 宁俊](https://github.com/monfortbrian)

  ---

  ## Acknowledgments

  Built to bridge clinical systems and national health information infrastructure. Part of an open-source interoperability stack for outbreak response and healthcare orchestration across low-resource settings.

ai_documentation_summary:
  {"purpose":"This node connects n8n to the DHIS2 Web API for health information workflows. It supports querying analytics, pushing aggregate data, and managing tracker, program, organization unit, and FHIR records.","capabilities":["Query analytics data","Get and push data value sets","Create and get enrollments","Create, get, and list events","Read and search FHIR patients","Create and search FHIR observations","Get single and multiple organisation units","Get single and multiple programs","Get single and multiple tracked entities"],"authentication":"Basic authentication using DHIS2 Base URL, Username, and Password","commonUseCases":["Retrieving DHIS2 analytics for reporting and dashboards","Sending aggregate health data into DHIS2 data value sets","Managing tracker events and enrollments for patient or case workflows","Interacting with DHIS2 FHIR endpoints for patient and observation data"],"limitations":["Analytics queries require all three dimensions and only return flat row objects","Analytics tables must be built in DHIS2 before querying, or a 409 error may occur","Compatibility is limited to DHIS2 2.39+ for Tracker API v2 and 2.38+ for FHIR"],"relatedNodes":["n8n-nodes-openmrs","n8n-nodes-rapidpro"]}


node_type: n8n-nodes-emailconnect.emailConnect
package_name: n8n-nodes-emailconnect
display_name: EmailConnect
description: Interact with EmailConnect API for email automation
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: axtg
author_github_url: https://github.com/xadi-hq/
npm_package_name: n8n-nodes-emailconnect
npm_version: 1.3.3
community_fetched_at: 2026-07-14T14:40:34.552Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "domain",
      "options": [
        {
          "name": "Domain",
          "value": "domain"
        },
        {
          "name": "Alias",
          "value": "alias"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many domains",
          "description": "Get many domains"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a domain",
          "description": "Get a domain"
        },
        {
          "name": "Update Configuration",
          "value": "updateConfig",
          "action": "Update domain configuration",
          "description": "Update domain configuration"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "domain"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an alias",
          "description": "Create a new alias"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an alias",
          "description": "Delete an alias"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an alias",
          "description": "Get an alias"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many aliases",
          "description": "Get many aliases for a domain"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an alias",
          "description": "Update an alias"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "alias"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a webhook",
          "description": "Create a new webhook"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a webhook",
          "description": "Delete a webhook"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a webhook",
          "description": "Get a webhook"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many webhooks",
          "description": "Get many webhooks"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a webhook",
          "description": "Update a webhook"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many domains",
      "description": "Get many domains",
      "resource": "domain"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a domain",
      "description": "Get a domain",
      "resource": "domain"
    },
    {
      "name": "Update Configuration",
      "value": "updateConfig",
      "action": "Update domain configuration",
      "description": "Update domain configuration",
      "resource": "domain"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an alias",
      "description": "Create a new alias",
      "resource": "alias"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an alias",
      "description": "Delete an alias",
      "resource": "alias"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an alias",
      "description": "Get an alias",
      "resource": "alias"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many aliases",
      "description": "Get many aliases for a domain",
      "resource": "alias"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an alias",
      "description": "Update an alias",
      "resource": "alias"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a webhook",
      "description": "Create a new webhook",
      "resource": "webhook"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a webhook",
      "description": "Delete a webhook",
      "resource": "webhook"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a webhook",
      "description": "Get a webhook",
      "resource": "webhook"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many webhooks",
      "description": "Get many webhooks",
      "resource": "webhook"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a webhook",
      "description": "Update a webhook",
      "resource": "webhook"
    }
  ]

npm_readme:
  # n8n-nodes-emailconnect

  ![n8n.io - Workflow Automation](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png)

  An n8n community node for [EmailConnect](https://emailconnect.eu) - enabling seamless email automation and webhook integration in your n8n workflows.

  ## Features

  - **Domain Management**: List, get details, check status, and configure your EmailConnect domains
  - **Alias Management**: Create, read, update, and delete email aliases under your domains
  - **Webhook Configuration**: Set up and manage webhooks for email processing automation
  - **Email Triggers**: Receive real-time notifications when emails are processed through EmailConnect
  - **Filtering Options**: Filter triggers by domain, alias, or event type for precise workflow control

  ## Installation

  ### Community Nodes (Recommended)

  1. Go to **Settings > Community Nodes** in your n8n instance
  2. Click **Install a community node**
  3. Enter `n8n-nodes-emailconnect`
  4. Click **Install**

  ### Manual Installation

  ```bash
  # In your n8n root directory
  npm install n8n-nodes-emailconnect
  ```

  ### Docker

  Add to your n8n Docker environment:

  ```dockerfile
  # Add to your n8n Dockerfile or docker-compose
  RUN npm install -g n8n-nodes-emailconnect
  ```

  ## Configuration

  ### 1. EmailConnect API Credentials

  Before using the nodes, you need to configure your EmailConnect API credentials:

  1. Go to **Credentials** in your n8n instance
  2. Click **Create New Credential**
  3. Search for **EmailConnect API**
  4. Enter your EmailConnect API key (get it from [EmailConnect Dashboard](https://app.emailconnect.eu/settings))

  ### 2. EmailConnect Service Setup

  Make sure you have:
  - An active EmailConnect account at [emailconnect.eu](https://app.emailconnect.eu)
  - At least one verified domain configured
  - API access enabled in your account settings

  ## Nodes Overview

  ### EmailConnect Node

  The main node for interacting with EmailConnect API operations.

  **Resources:**
  - **Domain**: Manage your email domains
  - **Alias**: Manage email aliases under domains
  - **Webhook**: Configure webhook endpoints for email processing

  ### EmailConnect Trigger Node

  A trigger node that starts workflows when EmailConnect processes emails.

  **Features:**
  - Real-time email processing notifications via webhooks
  - Multiple alias configuration modes:
    - Create new aliases with webhooks
    - Use existing aliases
    - Use domain catch-all functionality
  - Automatic webhook URL management (test/production switching)
  - Domain and catch-all webhook synchronization
  - Robust webhook lifecycle management

  ## Usage Examples

  ### Example 1: List All Domains

  ```json
  {
    "nodes": [
      {
        "name": "Get Domains",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "domain",
          "operation": "getAll"
        }
      }
    ]
  }
  ```

  ### Example 2: Create Email Alias

  ```json
  {
    "nodes": [
      {
        "name": "Create Alias",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "alias",
          "operation": "create",
          "domainId": "your-domain-id",
          "localPart": "support",
          "aliasWebhookId": "your-webhook-id"
        }
      }
    ]
  }
  ```

  ### Example 3: Email Processing Trigger

  ```json
  {
    "nodes": [
      {
        "name": "Email Received",
        "type": "n8n-nodes-emailconnect.emailConnectTrigger",
        "parameters": {
          "domainId": "your-domain-id",
          "aliasMode": "create",
          "aliasEmail": "support@example.com",
          "webhookName": "Support Email Webhook",
          "webhookDescription": "Webhook for support email processing"
        }
      }
    ]
  }
  ```

  ## API Permissions

  This n8n node requires an EmailConnect API key with **"API User"** scope, which provides:

  ✅ **Allowed Operations:**
  - `GET /api/domains` - List your domains
  - `GET /api/domains/{domainId}` - Get domain details
  - `GET /api/domains/{domainId}/status` - Check verification status
  - `PUT /api/domains/{domainId}` - Update domain configuration (allowAttachments & includeEnvelopeData only)
  - Full CRUD access to aliases and webhooks

  ❌ **Blocked Operations:**
  - `POST /api/domains` - Create domain (use EmailConnect dashboard)
  - `DELETE /api/domains/{domain}` - Delete domain (use EmailConnect dashboard)

  ## Workflow Examples

  ### Complete Email Processing Workflow

  ```json
  {
    "name": "EmailConnect Processing Workflow",
    "nodes": [
      {
        "name": "Email Received Trigger",
        "type": "n8n-nodes-emailconnect.emailConnectTrigger",
        "parameters": {
          "events": ["email.received"],
          "domainFilter": "support.example.com"
        }
      },
      {
        "name": "Process Email Content",
        "type": "n8n-nodes-base.function",
        "parameters": {
          "functionCode": "// Extract email data\nconst email = items[0].json;\nreturn [{\n  json: {\n    sender: email.sender,\n    subject: email.subject,\n    content: email.textContent,\n    receivedAt: email.receivedAt\n  }\n}];"
        }
      },
      {
        "name": "Send to Slack",
        "type": "n8n-nodes-base.slack",
        "parameters": {
          "operation": "postMessage",
          "channel": "#support",
          "text": "New email from {{$node['Process Email Content'].json['sender']}}: {{$node['Process Email Content'].json['subject']}}"
        }
      }
    ]
  }
  ```

  ### Domain Status Monitoring

  ```json
  {
    "name": "Domain Status Monitor",
    "nodes": [
      {
        "name": "Get All Domains",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "domain",
          "operation": "getAll"
        }
      },
      {
        "name": "Check Each Domain Status",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "domain",
          "operation": "getStatus",
          "domainId": "={{$json.id}}"
        }
      },
      {
        "name": "Alert on Issues",
        "type": "n8n-nodes-base.if",
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json.status}}",
                "operation": "notEqual",
                "value2": "verified"
              }
            ]
          }
        }
      }
    ]
  }
  ```

  ## Known Limitations

  ### Webhook Cleanup on Node Deletion

  ⚠️ **Important**: Due to changes in n8n 1.15.0+, webhooks are **not automatically deleted** when EmailConnect trigger nodes are removed from workflows. This is a limitation of the n8n framework, not a bug in this node.

  **Impact**: Deleted trigger nodes may leave "orphaned" webhooks in your EmailConnect account.

  **Solution**: Manually clean up unused webhooks via the [EmailConnect Webhooks Dashboard](https://app.emailconnect.eu/webhooks).

  **Why this happens**: n8n no longer calls webhook deregistration methods to improve performance, assuming third-party services will handle webhook retries gracefully.

  ## Troubleshooting

  ### Common Issues

  **"Invalid API Key" Error**
  - Ensure your API key has "API User" scope
  - Check that the API key is correctly entered in n8n credentials
  - Verify your EmailConnect account is active

  **"Domain not found" Error**
  - Verify the domain exists in your EmailConnect account
  - Check that you're using the correct domain ID
  - Ensure the domain is verified and active

  **Webhook not receiving data**
  - Verify the webhook URL is accessible from EmailConnect servers
  - Check that the webhook is properly configured in EmailConnect dashboard
  - Ensure your n8n instance can receive external HTTP requests

  **"Insufficient permissions" Error**
  - Your API key may not have the required scope
  - Contact EmailConnect support to upgrade your API key permissions

  **Catch-all Alias Issues**
  - Catch-all aliases (`*@domain.com`) are automatically updated when recreated
  - Domain and catch-all webhooks are synchronized automatically
  - Use the "Use Domain Catch-All" option in trigger nodes for catch-all functionality

  ### Getting Help

  - **EmailConnect Documentation**: [https://emailconnect.eu/docs](https://emailconnect.eu/docs)
  - **EmailConnect Dashboard**: [https://app.emailconnect.eu](https://app.emailconnect.eu) (for webhook management)
  - **EmailConnect Support**: [support@emailconnect.eu](mailto:support@emailconnect.eu)
  - **n8n Community**: [https://community.n8n.io](https://community.n8n.io)
  - **GitHub Issues**: [https://github.com/xadi-hq/n8n-nodes-emailconnect/issues](https://github.com/xadi-hq/n8n-nodes-emailconnect/issues)

  ## Development

  ### Building from Source

  ```bash
  git clone https://github.com/xadi-hq/n8n-nodes-emailconnect.git
  cd n8n-nodes-emailconnect
  npm install
  npm run build
  ```

  ### Testing

  ```bash
  npm test
  ```

  ### Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Submit a pull request

  ## License

  MIT License - see [LICENSE](LICENSE) file for details.

  ## Changelog

  See [CHANGELOG.md](CHANGELOG.md) and the [GitHub releases](https://github.com/xadi-hq/n8n-nodes-emailconnect/releases) for the full version history.

  ## Detailed Node Documentation

  ### EmailConnect Node Operations

  #### Domain Operations

  **Get All Domains**
  - **Operation**: `getAll`
  - **Description**: Retrieves all domains configured in your EmailConnect account
  - **Output**: Array of domain objects with ID, name, status, and configuration

  **Get Domain**
  - **Operation**: `get`
  - **Parameters**:
    - `domainId` (required): The ID of the domain to retrieve
  - **Output**: Single domain object with detailed information

  **Get Domain Status**
  - **Operation**: `getStatus`
  - **Parameters**:
    - `domainId` (required): The ID of the domain to check
  - **Output**: Domain verification and DNS status information

  **Update Domain Configuration**
  - **Operation**: `updateConfig`
  - **Parameters**:
    - `domainId` (required): The ID of the domain to update
    - `allowAttachments` (boolean): Whether to allow email attachments
    - `includeEnvelopeData` (boolean): Whether to include SMTP envelope data
  - **Output**: Updated domain configuration

  #### Alias Operations

  **Get All Aliases**
  - **Operation**: `getAll`
  - **Parameters**:
    - `domainId` (required): The domain ID to list aliases for
  - **Output**: Array of alias objects

  **Get Alias**
  - **Operation**: `get`
  - **Parameters**:
    - `aliasId` (required): The ID of the alias to retrieve
  - **Output**: Single alias object with details

  **Create Alias**
  - **Operation**: `create`
  - **Parameters**:
    - `domainId` (required): The domain the alias belongs to
    - `localPart` (required): The part before the `@` (e.g. `support` for `support@yourdomain.com`, or `*` for catch-all)
    - `aliasWebhookId` (required): The webhook that receives email sent to this alias
    - **Additional Fields** (optional): `active`, `allowAttachments`, `includeEnvelope`, `includeHtml`, `includeText`
  - **Output**: Created alias object with generated ID

  **Update Alias**
  - **Operation**: `update`
  - **Parameters**:
    - `aliasId` (required): The ID of the alias to update
    - **Update Fields** (at least one): `email`, `webhookId`, `active`, `allowAttachments`, `includeEnvelope`, `includeHtml`, `includeText`
  - **Output**: Updated alias object

  **Delete Alias**
  - **Operation**: `delete`
  - **Parameters**:
    - `aliasId` (required): The ID of the alias to delete
  - **Output**: Success confirmation

  #### Webhook Operations

  **Get All Webhooks**
  - **Operation**: `getAll`
  - **Parameters**:
    - `domainId` (optional): Filter webhooks by domain
  - **Output**: Array of webhook configurations

  **Get Webhook**
  - **Operation**: `get`
  - **Parameters**:
    - `webhookId` (required): The ID of the webhook to retrieve
  - **Output**: Single webhook object

  **Create Webhook**
  - **Operation**: `create`
  - **Parameters**:
    - `domainId` (optional): Domain to associate webhook with
    - `aliasId` (optional): Alias to associate webhook with
    - `url` (required): Webhook endpoint URL
    - `description` (optional): Webhook description
  - **Output**: Created webhook object

  **Update Webhook**
  - **Operation**: `update`
  - **Parameters**:
    - `webhookId` (required): The ID of the webhook to update
    - `url` (optional): New webhook URL
    - `description` (optional): New description
  - **Output**: Updated webhook object

  **Delete Webhook**
  - **Operation**: `delete`
  - **Parameters**:
    - `webhookId` (required): The ID of the webhook to delete
  - **Output**: Success confirmation

  ### EmailConnect Trigger Node

  The trigger node receives webhook data from EmailConnect when emails are processed.

  #### Configuration Options

  **Alias Modes**
  - **Create New Alias**: Creates a new email alias with an associated webhook
  - **Use Existing Alias**: Links to an existing alias and updates its webhook
  - **Use Domain Catch-All**: Uses or creates a catch-all alias (`*@domain.com`) for the domain

  **Webhook Management**
  - Automatic webhook URL switching between test and production modes
  - Webhook verification and activation
  - Domain and catch-all webhook synchronization
  - Comprehensive cleanup logic (limited by n8n framework)

  #### Webhook Data Structure

  The trigger node outputs the following data structure:

  ```json
  {
    "id": "email-processing-id",
    "domainId": "domain-id",
    "receivedAt": "2025-06-21T10:30:00Z",
    "sender": "user@example.com",
    "recipient": "support@yourdomain.com",
    "subject": "Email subject",
    "status": "email.received",
    "payload": {
      "headers": {},
      "text": "Plain text content",
      "html": "<p>HTML content</p>",
      "attachments": []
    },
    "envelope": {
      "from": "user@example.com",
      "to": ["support@yourdomain.com"]
    }
  }
  ```

ai_documentation_summary:
  {"purpose":"EmailConnect provides n8n workflows with email automation and webhook integration for managing domains, aliases, and email-processing triggers. It lets you automate email handling through EmailConnect's API and real-time event notifications.","capabilities":["List, get details for, check status of, and update EmailConnect domains","Create, read, update, and delete email aliases under domains","Configure and manage webhooks for email processing","Trigger workflows on real-time email processing events","Filter trigger events by domain, alias, or event type","Support automatic webhook URL management and webhook lifecycle handling"],"authentication":"EmailConnect API key required, using an EmailConnect API credential with 'API User' scope","commonUseCases":["Monitor incoming emails and start workflows when email events are received","Create and manage alias-based email routing for support or automated processing","Track domain verification status and update allowed domain configuration settings","Connect processed email events to other systems like Slack or internal workflows"],"limitations":["Domain creation and domain deletion are not supported via the node and must be done in the EmailConnect dashboard","Domain update access is limited to allowAttachments and includeEnvelopeData configuration only"],"relatedNodes":["EmailConnect Trigger","Webhook"]}


node_type: n8n-nodes-emailconnect.emailConnectTrigger
package_name: n8n-nodes-emailconnect
display_name: EmailConnect Trigger
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: axtg
author_github_url: https://github.com/xadi-hq/
npm_package_name: n8n-nodes-emailconnect
npm_version: 1.3.3
community_fetched_at: 2026-07-14T14:40:34.553Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Trigger workflows when emails are received via EmailConnect - 100% EU-operated email service with multi-alias support

npm_readme:
  # n8n-nodes-emailconnect

  ![n8n.io - Workflow Automation](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png)

  An n8n community node for [EmailConnect](https://emailconnect.eu) - enabling seamless email automation and webhook integration in your n8n workflows.

  ## Features

  - **Domain Management**: List, get details, check status, and configure your EmailConnect domains
  - **Alias Management**: Create, read, update, and delete email aliases under your domains
  - **Webhook Configuration**: Set up and manage webhooks for email processing automation
  - **Email Triggers**: Receive real-time notifications when emails are processed through EmailConnect
  - **Filtering Options**: Filter triggers by domain, alias, or event type for precise workflow control

  ## Installation

  ### Community Nodes (Recommended)

  1. Go to **Settings > Community Nodes** in your n8n instance
  2. Click **Install a community node**
  3. Enter `n8n-nodes-emailconnect`
  4. Click **Install**

  ### Manual Installation

  ```bash
  # In your n8n root directory
  npm install n8n-nodes-emailconnect
  ```

  ### Docker

  Add to your n8n Docker environment:

  ```dockerfile
  # Add to your n8n Dockerfile or docker-compose
  RUN npm install -g n8n-nodes-emailconnect
  ```

  ## Configuration

  ### 1. EmailConnect API Credentials

  Before using the nodes, you need to configure your EmailConnect API credentials:

  1. Go to **Credentials** in your n8n instance
  2. Click **Create New Credential**
  3. Search for **EmailConnect API**
  4. Enter your EmailConnect API key (get it from [EmailConnect Dashboard](https://app.emailconnect.eu/settings))

  ### 2. EmailConnect Service Setup

  Make sure you have:
  - An active EmailConnect account at [emailconnect.eu](https://app.emailconnect.eu)
  - At least one verified domain configured
  - API access enabled in your account settings

  ## Nodes Overview

  ### EmailConnect Node

  The main node for interacting with EmailConnect API operations.

  **Resources:**
  - **Domain**: Manage your email domains
  - **Alias**: Manage email aliases under domains
  - **Webhook**: Configure webhook endpoints for email processing

  ### EmailConnect Trigger Node

  A trigger node that starts workflows when EmailConnect processes emails.

  **Features:**
  - Real-time email processing notifications via webhooks
  - Multiple alias configuration modes:
    - Create new aliases with webhooks
    - Use existing aliases
    - Use domain catch-all functionality
  - Automatic webhook URL management (test/production switching)
  - Domain and catch-all webhook synchronization
  - Robust webhook lifecycle management

  ## Usage Examples

  ### Example 1: List All Domains

  ```json
  {
    "nodes": [
      {
        "name": "Get Domains",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "domain",
          "operation": "getAll"
        }
      }
    ]
  }
  ```

  ### Example 2: Create Email Alias

  ```json
  {
    "nodes": [
      {
        "name": "Create Alias",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "alias",
          "operation": "create",
          "domainId": "your-domain-id",
          "localPart": "support",
          "aliasWebhookId": "your-webhook-id"
        }
      }
    ]
  }
  ```

  ### Example 3: Email Processing Trigger

  ```json
  {
    "nodes": [
      {
        "name": "Email Received",
        "type": "n8n-nodes-emailconnect.emailConnectTrigger",
        "parameters": {
          "domainId": "your-domain-id",
          "aliasMode": "create",
          "aliasEmail": "support@example.com",
          "webhookName": "Support Email Webhook",
          "webhookDescription": "Webhook for support email processing"
        }
      }
    ]
  }
  ```

  ## API Permissions

  This n8n node requires an EmailConnect API key with **"API User"** scope, which provides:

  ✅ **Allowed Operations:**
  - `GET /api/domains` - List your domains
  - `GET /api/domains/{domainId}` - Get domain details
  - `GET /api/domains/{domainId}/status` - Check verification status
  - `PUT /api/domains/{domainId}` - Update domain configuration (allowAttachments & includeEnvelopeData only)
  - Full CRUD access to aliases and webhooks

  ❌ **Blocked Operations:**
  - `POST /api/domains` - Create domain (use EmailConnect dashboard)
  - `DELETE /api/domains/{domain}` - Delete domain (use EmailConnect dashboard)

  ## Workflow Examples

  ### Complete Email Processing Workflow

  ```json
  {
    "name": "EmailConnect Processing Workflow",
    "nodes": [
      {
        "name": "Email Received Trigger",
        "type": "n8n-nodes-emailconnect.emailConnectTrigger",
        "parameters": {
          "events": ["email.received"],
          "domainFilter": "support.example.com"
        }
      },
      {
        "name": "Process Email Content",
        "type": "n8n-nodes-base.function",
        "parameters": {
          "functionCode": "// Extract email data\nconst email = items[0].json;\nreturn [{\n  json: {\n    sender: email.sender,\n    subject: email.subject,\n    content: email.textContent,\n    receivedAt: email.receivedAt\n  }\n}];"
        }
      },
      {
        "name": "Send to Slack",
        "type": "n8n-nodes-base.slack",
        "parameters": {
          "operation": "postMessage",
          "channel": "#support",
          "text": "New email from {{$node['Process Email Content'].json['sender']}}: {{$node['Process Email Content'].json['subject']}}"
        }
      }
    ]
  }
  ```

  ### Domain Status Monitoring

  ```json
  {
    "name": "Domain Status Monitor",
    "nodes": [
      {
        "name": "Get All Domains",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "domain",
          "operation": "getAll"
        }
      },
      {
        "name": "Check Each Domain Status",
        "type": "n8n-nodes-emailconnect.emailConnect",
        "parameters": {
          "resource": "domain",
          "operation": "getStatus",
          "domainId": "={{$json.id}}"
        }
      },
      {
        "name": "Alert on Issues",
        "type": "n8n-nodes-base.if",
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json.status}}",
                "operation": "notEqual",
                "value2": "verified"
              }
            ]
          }
        }
      }
    ]
  }
  ```

  ## Known Limitations

  ### Webhook Cleanup on Node Deletion

  ⚠️ **Important**: Due to changes in n8n 1.15.0+, webhooks are **not automatically deleted** when EmailConnect trigger nodes are removed from workflows. This is a limitation of the n8n framework, not a bug in this node.

  **Impact**: Deleted trigger nodes may leave "orphaned" webhooks in your EmailConnect account.

  **Solution**: Manually clean up unused webhooks via the [EmailConnect Webhooks Dashboard](https://app.emailconnect.eu/webhooks).

  **Why this happens**: n8n no longer calls webhook deregistration methods to improve performance, assuming third-party services will handle webhook retries gracefully.

  ## Troubleshooting

  ### Common Issues

  **"Invalid API Key" Error**
  - Ensure your API key has "API User" scope
  - Check that the API key is correctly entered in n8n credentials
  - Verify your EmailConnect account is active

  **"Domain not found" Error**
  - Verify the domain exists in your EmailConnect account
  - Check that you're using the correct domain ID
  - Ensure the domain is verified and active

  **Webhook not receiving data**
  - Verify the webhook URL is accessible from EmailConnect servers
  - Check that the webhook is properly configured in EmailConnect dashboard
  - Ensure your n8n instance can receive external HTTP requests

  **"Insufficient permissions" Error**
  - Your API key may not have the required scope
  - Contact EmailConnect support to upgrade your API key permissions

  **Catch-all Alias Issues**
  - Catch-all aliases (`*@domain.com`) are automatically updated when recreated
  - Domain and catch-all webhooks are synchronized automatically
  - Use the "Use Domain Catch-All" option in trigger nodes for catch-all functionality

  ### Getting Help

  - **EmailConnect Documentation**: [https://emailconnect.eu/docs](https://emailconnect.eu/docs)
  - **EmailConnect Dashboard**: [https://app.emailconnect.eu](https://app.emailconnect.eu) (for webhook management)
  - **EmailConnect Support**: [support@emailconnect.eu](mailto:support@emailconnect.eu)
  - **n8n Community**: [https://community.n8n.io](https://community.n8n.io)
  - **GitHub Issues**: [https://github.com/xadi-hq/n8n-nodes-emailconnect/issues](https://github.com/xadi-hq/n8n-nodes-emailconnect/issues)

  ## Development

  ### Building from Source

  ```bash
  git clone https://github.com/xadi-hq/n8n-nodes-emailconnect.git
  cd n8n-nodes-emailconnect
  npm install
  npm run build
  ```

  ### Testing

  ```bash
  npm test
  ```

  ### Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Submit a pull request

  ## License

  MIT License - see [LICENSE](LICENSE) file for details.

  ## Changelog

  See [CHANGELOG.md](CHANGELOG.md) and the [GitHub releases](https://github.com/xadi-hq/n8n-nodes-emailconnect/releases) for the full version history.

  ## Detailed Node Documentation

  ### EmailConnect Node Operations

  #### Domain Operations

  **Get All Domains**
  - **Operation**: `getAll`
  - **Description**: Retrieves all domains configured in your EmailConnect account
  - **Output**: Array of domain objects with ID, name, status, and configuration

  **Get Domain**
  - **Operation**: `get`
  - **Parameters**:
    - `domainId` (required): The ID of the domain to retrieve
  - **Output**: Single domain object with detailed information

  **Get Domain Status**
  - **Operation**: `getStatus`
  - **Parameters**:
    - `domainId` (required): The ID of the domain to check
  - **Output**: Domain verification and DNS status information

  **Update Domain Configuration**
  - **Operation**: `updateConfig`
  - **Parameters**:
    - `domainId` (required): The ID of the domain to update
    - `allowAttachments` (boolean): Whether to allow email attachments
    - `includeEnvelopeData` (boolean): Whether to include SMTP envelope data
  - **Output**: Updated domain configuration

  #### Alias Operations

  **Get All Aliases**
  - **Operation**: `getAll`
  - **Parameters**:
    - `domainId` (required): The domain ID to list aliases for
  - **Output**: Array of alias objects

  **Get Alias**
  - **Operation**: `get`
  - **Parameters**:
    - `aliasId` (required): The ID of the alias to retrieve
  - **Output**: Single alias object with details

  **Create Alias**
  - **Operation**: `create`
  - **Parameters**:
    - `domainId` (required): The domain the alias belongs to
    - `localPart` (required): The part before the `@` (e.g. `support` for `support@yourdomain.com`, or `*` for catch-all)
    - `aliasWebhookId` (required): The webhook that receives email sent to this alias
    - **Additional Fields** (optional): `active`, `allowAttachments`, `includeEnvelope`, `includeHtml`, `includeText`
  - **Output**: Created alias object with generated ID

  **Update Alias**
  - **Operation**: `update`
  - **Parameters**:
    - `aliasId` (required): The ID of the alias to update
    - **Update Fields** (at least one): `email`, `webhookId`, `active`, `allowAttachments`, `includeEnvelope`, `includeHtml`, `includeText`
  - **Output**: Updated alias object

  **Delete Alias**
  - **Operation**: `delete`
  - **Parameters**:
    - `aliasId` (required): The ID of the alias to delete
  - **Output**: Success confirmation

  #### Webhook Operations

  **Get All Webhooks**
  - **Operation**: `getAll`
  - **Parameters**:
    - `domainId` (optional): Filter webhooks by domain
  - **Output**: Array of webhook configurations

  **Get Webhook**
  - **Operation**: `get`
  - **Parameters**:
    - `webhookId` (required): The ID of the webhook to retrieve
  - **Output**: Single webhook object

  **Create Webhook**
  - **Operation**: `create`
  - **Parameters**:
    - `domainId` (optional): Domain to associate webhook with
    - `aliasId` (optional): Alias to associate webhook with
    - `url` (required): Webhook endpoint URL
    - `description` (optional): Webhook description
  - **Output**: Created webhook object

  **Update Webhook**
  - **Operation**: `update`
  - **Parameters**:
    - `webhookId` (required): The ID of the webhook to update
    - `url` (optional): New webhook URL
    - `description` (optional): New description
  - **Output**: Updated webhook object

  **Delete Webhook**
  - **Operation**: `delete`
  - **Parameters**:
    - `webhookId` (required): The ID of the webhook to delete
  - **Output**: Success confirmation

  ### EmailConnect Trigger Node

  The trigger node receives webhook data from EmailConnect when emails are processed.

  #### Configuration Options

  **Alias Modes**
  - **Create New Alias**: Creates a new email alias with an associated webhook
  - **Use Existing Alias**: Links to an existing alias and updates its webhook
  - **Use Domain Catch-All**: Uses or creates a catch-all alias (`*@domain.com`) for the domain

  **Webhook Management**
  - Automatic webhook URL switching between test and production modes
  - Webhook verification and activation
  - Domain and catch-all webhook synchronization
  - Comprehensive cleanup logic (limited by n8n framework)

  #### Webhook Data Structure

  The trigger node outputs the following data structure:

  ```json
  {
    "id": "email-processing-id",
    "domainId": "domain-id",
    "receivedAt": "2025-06-21T10:30:00Z",
    "sender": "user@example.com",
    "recipient": "support@yourdomain.com",
    "subject": "Email subject",
    "status": "email.received",
    "payload": {
      "headers": {},
      "text": "Plain text content",
      "html": "<p>HTML content</p>",
      "attachments": []
    },
    "envelope": {
      "from": "user@example.com",
      "to": ["support@yourdomain.com"]
    }
  }
  ```

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows when EmailConnect processes or receives emails, using webhooks tied to domains, aliases, or catch-all setups. It supports real-time email event handling with automatic webhook lifecycle management.","capabilities":["Trigger workflows on email processing events such as email.received","Configure trigger modes for new aliases, existing aliases, or domain catch-all","Filter trigger execution by domain, alias, or event type","Automatically manage webhook URLs for test and production environments","Synchronize webhooks with domains and catch-all behavior"],"authentication":"EmailConnect API key required, using an EmailConnect API credential with 'API User' scope","commonUseCases":["Start a workflow when a support or incoming email is received","Route emails from specific domains or aliases into automations","Process incoming emails and forward extracted data to other apps"],"limitations":["Requires an active EmailConnect account, at least one verified domain, and API access enabled","Domain creation and domain deletion are not allowed through the API and must be done in the EmailConnect dashboard"],"relatedNodes":["EmailConnect Node"]}


