# nodes

node_type: @videosailor/n8n-nodes-videosailor.videoSailor
package_name: @videosailor/n8n-nodes-videosailor
display_name: VideoSailor
description: Download, transcribe, trim, cut, resize, and add subtitles to videos
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: blytheparadox
author_github_url: https://github.com/VideoSailor/n8n-nodes-videosailor.git
npm_package_name: @videosailor/n8n-nodes-videosailor
npm_version: 1.1.6
community_fetched_at: 2026-07-14T14:40:34.152Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "download",
      "options": [
        {
          "name": "Download",
          "value": "download",
          "action": "Download a video",
          "description": "Download a video and return the file as binary data"
        },
        {
          "name": "Video Info",
          "value": "videoInfo",
          "action": "Get video info",
          "description": "Get video metadata without downloading"
        },
        {
          "name": "Trim",
          "value": "trim",
          "action": "Trim a video",
          "description": "Trim a video to a time range"
        },
        {
          "name": "Cut",
          "value": "cut",
          "action": "Cut a video segment",
          "description": "Cut a segment from a video (alias for trim)"
        },
        {
          "name": "Resize",
          "value": "resize",
          "action": "Resize a video",
          "description": "Resize a video to new dimensions or aspect ratio"
        },
        {
          "name": "Transcribe",
          "value": "transcribe",
          "action": "Transcribe a video",
          "description": "Transcribe a video and get timestamped words/segments"
        },
        {
          "name": "Subtitles",
          "value": "subtitles",
          "action": "Add subtitles to a video",
          "description": "Burn subtitles into a video"
        },
        {
          "name": "Info",
          "value": "info",
          "action": "Get video dimensions",
          "description": "Get video dimensions and aspect ratio"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Download",
      "value": "download",
      "action": "Download a video",
      "description": "Download a video and return the file as binary data"
    },
    {
      "name": "Video Info",
      "value": "videoInfo",
      "action": "Get video info",
      "description": "Get video metadata without downloading"
    },
    {
      "name": "Trim",
      "value": "trim",
      "action": "Trim a video",
      "description": "Trim a video to a time range"
    },
    {
      "name": "Cut",
      "value": "cut",
      "action": "Cut a video segment",
      "description": "Cut a segment from a video (alias for trim)"
    },
    {
      "name": "Resize",
      "value": "resize",
      "action": "Resize a video",
      "description": "Resize a video to new dimensions or aspect ratio"
    },
    {
      "name": "Transcribe",
      "value": "transcribe",
      "action": "Transcribe a video",
      "description": "Transcribe a video and get timestamped words/segments"
    },
    {
      "name": "Subtitles",
      "value": "subtitles",
      "action": "Add subtitles to a video",
      "description": "Burn subtitles into a video"
    },
    {
      "name": "Info",
      "value": "info",
      "action": "Get video dimensions",
      "description": "Get video dimensions and aspect ratio"
    }
  ]

npm_readme:
  # 🎬 n8n-nodes-videosailor

  ![License](https://img.shields.io/badge/license-MIT-blue.svg)
  ![npm](https://img.shields.io/npm/v/n8n-nodes-videosailor)

  ⛵ This is an n8n community node for processing video files using the [VideoSailor](https://videosailor.com) API. It enables you to download, trim, cut, resize, transcribe, and subtitle videos from within your n8n workflows.

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

  ## ✨ Features

  **🎞️ Video Processing Operations**
  - ⬇️ Download, ✂️ trim, cut, and 📐 resize videos
  - 📊 Get detailed video metadata
  - 🎙️ Transcribe audio with word- and segment-level timestamps
  - 💬 Burn custom styled subtitles into videos

  **🌍 Universal Input Support**
  - 🔗 Direct video URLs
  - 📱 Social media links — YouTube, TikTok, Instagram, Twitter/X, Vimeo, and 1,000+ sites

  **🔌 Easy Integration**
  - 🔑 Simple credential setup (API key header auth)
  - 🤖 Native n8n integration — `usableAsTool: true`, so the node works as an AI agent tool
  - 🎯 Single node with operation dropdown — no per-operation node sprawl

  ## 📚 Table of Contents

  - [Installation](#-installation)
  - [Operations](#-operations)
  - [Credentials](#-credentials)
  - [Compatibility](#-compatibility)
  - [Example Workflow](#-example-workflow)
  - [Resources](#-resources)
  - [Development](#-development)

  ## 📦 Installation

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

  ## ⚙️ Operations

  ### 🎥 Video Operations

  - ⬇️ **Download** — Download a video from a URL and return the file as n8n binary data
  - ℹ️ **Video Info** — Get video metadata (title, duration, thumbnails) without downloading
  - ✂️ **Trim** — Trim a video to a start/end time range
  - 🔪 **Cut** — Cut a segment from a video (alias for Trim)
  - 📐 **Resize** — Resize a video either by explicit width/height or by aspect ratio + resolution preset (HD / Full HD / 2K / 4K / 8K)
  - 🎙️ **Transcribe** — Transcribe a video and return timestamped words and segments
  - 💬 **Subtitles** — Burn custom subtitles (position, font size, color, stroke, background) into a video
  - 📏 **Info** — Get video dimensions and aspect ratio

  💡 The node accepts any URL the VideoSailor API supports — direct media URLs and social media URLs (YouTube, TikTok, Instagram, etc.).

  ## 🔐 Credentials

  This node requires API credentials for the VideoSailor API.

  ### 🗝️ Getting Your API Key

  1. 🌐 Visit [VideoSailor](https://videosailor.com) and sign up for an account
  2. ⚙️ Navigate to **Settings → API Keys** in the dashboard
  3. ✨ Generate a new API key
  4. 📋 Copy the API key

  📖 Refer to the [API Keys Guide](https://videosailor.com/api-usage?content=keys) for detailed instructions on obtaining and managing your API keys.

  ### 🛠️ Configuring Credentials in n8n

  1. ➕ In n8n, create new credentials
  2. 🎯 Select **VideoSailor API** from the credential types
  3. 🔑 Enter your API key
  4. 🌐 (Optional) Override the **Base URL** — defaults to `https://api.videosailor.com`; set to `http://localhost:8080` for local development
  5. 💾 Save the credentials
  6. ✅ Use these credentials when configuring the VideoSailor node

  ## 🧩 Compatibility

  ✅ Compatible with n8n@1.60.0 or later.

  ## 🗂️ Example Workflow

  An example workflow is included at [`examples/download-and-transcribe.json`](examples/download-and-transcribe.json). It demonstrates:

  1. **Download** a YouTube video as binary data
  2. **Transcribe** the same video and return timestamped segments

  To use it: in n8n go to **Workflows → Import from file**, select the JSON, then add your VideoSailor credentials.

  ## 🔗 Resources

  - 📘 [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - 📗 [VideoSailor API Documentation](https://videosailor.com/api-usage?content=documentation)
  - 🔑 [VideoSailor API Keys Guide](https://videosailor.com/api-usage?content=keys)

  ## 🧑‍💻 Development

  ### 📋 Prerequisites

  - 🟢 Node.js (version compatible with the `typescript` and `n8n-workflow` peer range)
  - 📦 npm

  ### 🚀 Setup

  1. 📥 Clone the repository
  2. 📦 Install dependencies:
     ```bash
     cd n8n-node
     npm install
     ```

  ### 🏗️ Building

  Build the node package (compiles TypeScript and copies icons via gulp):
  ```bash
  npm run build
  ```

  👀 Watch mode for development:
  ```bash
  npm run dev
  ```

  ### 🔗 Linking into a local n8n instance

  ```bash
  npm link
  cd ~/.n8n/custom
  npm link n8n-nodes-videosailor
  ```

  🔄 Then restart n8n so the custom node is picked up.

  ### 🧹 Linting & Formatting

  🔍 Run ESLint:
  ```bash
  npm run lint
  ```

  🛠️ Fix linting issues automatically:
  ```bash
  npm run lintfix
  ```

  ✨ Format sources with Prettier:
  ```bash
  npm run format
  ```

  ### 🚢 Publishing

  Releases are automated via [release-please](https://github.com/googleapis/release-please). Commit to `main` using [Conventional Commits](https://www.conventionalcommits.org/) and release-please handles the rest:

  | Prefix | Effect | npm version bump |
  |--------|--------|-----------------|
  | `feat:` | New operation or capability | minor |
  | `fix:` | Bug fix | patch |
  | `perf:` | Performance improvement | patch |
  | `deps:` | Dependency update | patch |
  | `feat!:` or `BREAKING CHANGE:` footer | Breaking API change | major |
  | `chore:` / `docs:` / `refactor:` | No user-facing change | none |

  When commits land on `main`, release-please opens or updates a **Release PR** with a changelog and bumped version. Merging that PR creates a GitHub release, which triggers the publish workflow to push to npm with provenance automatically.

ai_documentation_summary:
  {"purpose":"This n8n community node processes video files using the VideoSailor API to enable downloading, trimming, resizing, transcribing, and adding subtitles to videos from various sources.","capabilities":["Download videos from URLs","Get video metadata (title, duration, thumbnails)","Trim videos to specific time ranges","Cut video segments","Resize videos (width/height, aspect ratio, or presets)","Transcribe audio with word-level and segment-level timestamps","Burn custom styled subtitles into videos","Get video dimensions and aspect ratio","Support for 1,000+ social media platforms including YouTube, TikTok, Instagram, Twitter/X, Vimeo"],"authentication":"API key required (configured via n8n credentials with API key header)","commonUseCases":["Automated video content processing in marketing workflows","AI agent tools for video analysis and transcription","Social media video management and repurposing","Video metadata extraction for content databases"],"limitations":["Requires VideoSailor API account and API key","Compatible only with n8n version 1.60.0 or later","Video processing operations depend on VideoSailor API capabilities and limits"],"relatedNodes":["n8n Binary Node","n8n HTTP Request Node","n8n Code Node"]}


node_type: @consolidate-software/n8n-nodes-consolidate.consolidateTrigger
package_name: @consolidate-software/n8n-nodes-consolidate
display_name: Consolidate Trigger
description: Handle Consolidate events via webhooks
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lukas.bickel
author_github_url: https://github.com/Consolidate-Software/n8n-nodes-consolidate.git
npm_package_name: @consolidate-software/n8n-nodes-consolidate
npm_version: 0.1.8
community_fetched_at: 2026-07-14T14:40:34.153Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # @consolidate-software/n8n-nodes-consolidate

  > **Beta Notice**
  >
  > This node is in **beta** and under active development. Features and behavior may change. Please report any issues or feedback.

  This is an n8n community node for integrating with the **Consolidate API** in your n8n workflows.

  This node allows managing data entry, appointments, emails, and custom queries through the Consolidate API. With it you can automate and connect these operations within your n8n workflows.

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

  ## Installation

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

  ## Operations

  This node supports the following operations:

  - **Data Entry**: Create, update, and manage data entries in Consolidate.
  - **Appointment**: Schedule, update, and manage appointments.
  - **Email**: Send and manage emails via Consolidate.
  - **Custom API Call**: Execute custom GraphQL queries against the Consolidate API.

  ## Credentials

  To use this node, you must configure the following credentials in n8n:

  - **Base URL**: The URL of your Consolidate instance (e.g., `https://{your instance}.consi.cloud/`). Do not include `/graphql` at the end.
  - **API Key**: Your Consolidate API Key. This is used for authenticating API requests.

  The node authenticates using the `X-API-KEY` header. You can create your API key in your Consolidate account.

  For more details, see the [Consolidate API authentication documentation](https://community.consolidate.eu/t/consolidate-api-authentifizierung).

  ## Compatibility

  - Minimum n8n version: 1.0.0
  - Tested with the latest n8n versions
  - No known incompatibilities at this time

  ## Usage

  Add the Consolidate node to your workflow and configure the desired operation and resource. For advanced use cases, use the Custom API Call to send raw GraphQL queries.

  For general n8n usage, see the [Try it out](https://docs.n8n.io/try-it-out/) documentation.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Consolidate API documentation](https://community.consolidate.eu/t/consolidate-api-ueberblick)

ai_documentation_summary:
  {"purpose":"A beta n8n community node that handles Consolidate API events and operations via webhooks, enabling automation of data entry, appointments, emails, and custom GraphQL queries.","capabilities":["Create data entries in Consolidate","Update data entries in Consolidate","Manage data entries in Consolidate","Schedule appointments","Update appointments","Manage appointments","Send emails via Consolidate","Manage emails via Consolidate","Execute custom GraphQL queries against the Consolidate API"],"authentication":"API Key required (configured via Base URL and API Key credentials; uses X-API-KEY header)","commonUseCases":["Automating data entry workflows with Consolidate","Scheduling and managing appointments through n8n","Sending automated emails via Consolidate","Running custom GraphQL queries to fetch or manipulate Consolidate data"],"limitations":["Node is in beta and under active development; features and behavior may change","Requires a valid Consolidate instance URL and API key"],"relatedNodes":["n8n HTTP Request node","n8n Webhook node"]}


node_type: @consolidate-software/n8n-nodes-consolidate.consolidate
package_name: @consolidate-software/n8n-nodes-consolidate
display_name: Consolidate
description: Consume Consolidate API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lukas.bickel
author_github_url: https://github.com/Consolidate-Software/n8n-nodes-consolidate.git
npm_package_name: @consolidate-software/n8n-nodes-consolidate
npm_version: 0.1.8
community_fetched_at: 2026-07-14T14:40:34.154Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "dataEntry",
      "options": [
        {
          "name": "Appointment",
          "value": "appointment"
        },
        {
          "name": "Custom API Call",
          "value": "customQuery"
        },
        {
          "name": "Data Entry",
          "value": "dataEntry"
        },
        {
          "name": "Email",
          "value": "email"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create appointment"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update appointment"
        },
        {
          "name": "Delete",
          "value": "deleteAppointment",
          "action": "Delete appointment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "appointment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getById",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a data entry"
        },
        {
          "name": "Delete",
          "value": "deleteEntry",
          "action": "Delete a data entry"
        },
        {
          "name": "Get by ID",
          "value": "getById",
          "action": "Get a data entry by ID"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search data entries"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a data entry"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dataEntry"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "customQuery",
      "options": [
        {
          "name": "Custom API Call",
          "value": "customQuery",
          "action": "Custom API call"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customQuery"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send an email"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "email"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create appointment",
      "resource": "appointment"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update appointment",
      "resource": "appointment"
    },
    {
      "name": "Delete",
      "value": "deleteAppointment",
      "action": "Delete appointment",
      "resource": "appointment"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a data entry",
      "resource": "dataEntry"
    },
    {
      "name": "Delete",
      "value": "deleteEntry",
      "action": "Delete a data entry",
      "resource": "dataEntry"
    },
    {
      "name": "Get by ID",
      "value": "getById",
      "action": "Get a data entry by ID",
      "resource": "dataEntry"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search data entries",
      "resource": "dataEntry"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a data entry",
      "resource": "dataEntry"
    },
    {
      "name": "Custom API Call",
      "value": "customQuery",
      "action": "Custom API call",
      "resource": "customQuery"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send an email",
      "resource": "email"
    }
  ]

npm_readme:
  # @consolidate-software/n8n-nodes-consolidate

  > **Beta Notice**
  >
  > This node is in **beta** and under active development. Features and behavior may change. Please report any issues or feedback.

  This is an n8n community node for integrating with the **Consolidate API** in your n8n workflows.

  This node allows managing data entry, appointments, emails, and custom queries through the Consolidate API. With it you can automate and connect these operations within your n8n workflows.

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

  ## Installation

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

  ## Operations

  This node supports the following operations:

  - **Data Entry**: Create, update, and manage data entries in Consolidate.
  - **Appointment**: Schedule, update, and manage appointments.
  - **Email**: Send and manage emails via Consolidate.
  - **Custom API Call**: Execute custom GraphQL queries against the Consolidate API.

  ## Credentials

  To use this node, you must configure the following credentials in n8n:

  - **Base URL**: The URL of your Consolidate instance (e.g., `https://{your instance}.consi.cloud/`). Do not include `/graphql` at the end.
  - **API Key**: Your Consolidate API Key. This is used for authenticating API requests.

  The node authenticates using the `X-API-KEY` header. You can create your API key in your Consolidate account.

  For more details, see the [Consolidate API authentication documentation](https://community.consolidate.eu/t/consolidate-api-authentifizierung).

  ## Compatibility

  - Minimum n8n version: 1.0.0
  - Tested with the latest n8n versions
  - No known incompatibilities at this time

  ## Usage

  Add the Consolidate node to your workflow and configure the desired operation and resource. For advanced use cases, use the Custom API Call to send raw GraphQL queries.

  For general n8n usage, see the [Try it out](https://docs.n8n.io/try-it-out/) documentation.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Consolidate API documentation](https://community.consolidate.eu/t/consolidate-api-ueberblick)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of data entry, appointments, emails, and custom GraphQL queries through the Consolidate API.","capabilities":["Create data entries","Update data entries","Manage data entries","Schedule appointments","Update appointments","Manage appointments","Send emails","Manage emails","Execute custom GraphQL queries"],"authentication":"API Key required (via X-API-KEY header)","commonUseCases":["Automating data entry workflows","Scheduling and managing appointments","Sending automated emails","Custom API integrations via GraphQL"],"limitations":["Node is in beta and under active development","Features and behavior may change","No known incompatibilities at this time"],"relatedNodes":["n8n HTTP Request","n8n GraphQL"]}


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

updated_at: 2026-07-14 14:40:34
author_name: styx0r
author_github_url: https://github.com/atroo/work4all_n8n_integration.git
npm_package_name: n8n-nodes-work4all
npm_version: 0.2.9
community_fetched_at: 2026-07-14T14:40:34.156Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "createIncomingInvoice",
      "options": [
        {
          "name": "Create Customer",
          "value": "createCustomer",
          "action": "Create a customer",
          "description": "Create a new customer in work4all"
        },
        {
          "name": "Create Incoming Invoice",
          "value": "createIncomingInvoice",
          "action": "Create an incoming invoice",
          "description": "Create a new incoming invoice in work4all"
        },
        {
          "name": "Extract Invoice Data",
          "value": "extractInvoiceData",
          "action": "Extract invoice data from attachments",
          "description": "Send attachments to the work4all AI backend and get structured invoice data"
        },
        {
          "name": "Get Customer",
          "value": "getCustomer",
          "action": "Get a customer",
          "description": "Retrieve a single customer by code"
        },
        {
          "name": "Get Many Customers",
          "value": "getManyCustomers",
          "action": "Get many customers",
          "description": "Retrieve a list of customers from work4all"
        },
        {
          "name": "Get Many Projects",
          "value": "getManyProjects",
          "action": "Get many projects",
          "description": "Retrieve a list of projects from work4all"
        },
        {
          "name": "Get Project",
          "value": "getProject",
          "action": "Get a project",
          "description": "Retrieve a single project by code"
        },
        {
          "name": "Update Customer",
          "value": "updateCustomer",
          "action": "Update a customer",
          "description": "Update an existing customer in work4all"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Customer",
      "value": "createCustomer",
      "action": "Create a customer",
      "description": "Create a new customer in work4all"
    },
    {
      "name": "Create Incoming Invoice",
      "value": "createIncomingInvoice",
      "action": "Create an incoming invoice",
      "description": "Create a new incoming invoice in work4all"
    },
    {
      "name": "Extract Invoice Data",
      "value": "extractInvoiceData",
      "action": "Extract invoice data from attachments",
      "description": "Send attachments to the work4all AI backend and get structured invoice data"
    },
    {
      "name": "Get Customer",
      "value": "getCustomer",
      "action": "Get a customer",
      "description": "Retrieve a single customer by code"
    },
    {
      "name": "Get Many Customers",
      "value": "getManyCustomers",
      "action": "Get many customers",
      "description": "Retrieve a list of customers from work4all"
    },
    {
      "name": "Get Many Projects",
      "value": "getManyProjects",
      "action": "Get many projects",
      "description": "Retrieve a list of projects from work4all"
    },
    {
      "name": "Get Project",
      "value": "getProject",
      "action": "Get a project",
      "description": "Retrieve a single project by code"
    },
    {
      "name": "Update Customer",
      "value": "updateCustomer",
      "action": "Update a customer",
      "description": "Update an existing customer in work4all"
    }
  ]

npm_readme:
  # n8n-nodes-work4all

  This is an n8n community node package that integrates [work4all](https://work4all.de) — the all-in-one ERP and CRM system — into your n8n workflows.

  ## Features

  - **Create Incoming Invoices** — post incoming invoices to work4all via GraphQL, with support for:
    - Form-field mode (fill each field individually)
    - JSON mode (pass a single JSON object — ideal for LLM output)
    - File attachments (PDFs, XMLs, ZIPs) via binary data from upstream nodes
  - **Customers** — create, update, and retrieve customers (single or paginated list)
  - **Projects** — retrieve projects (single or paginated list)
  - **Multi-tenant (Mandant) support** — pick the target work4all tenant per node; the tenant list is loaded directly from your instance

  ## Multi-tenant (Mandant) support

  work4all instances can host multiple tenants (Mandanten). Every node has a **Mandant** field at the top that controls which tenant the request targets — the value is sent on each API call via the `x-work4all-mandant` HTTP header.

  - **Default** is `1`.
  - The dropdown is populated dynamically: when you open it, the node loads the tenants your credential has access to (via `POST /api/Mandant/query`) and shows their names, while storing the numeric tenant code internally. If the credential has no tenants assigned, it falls back to tenant `1`.
  - You can also switch the field to **expression mode** to set the tenant code from data (e.g. `={{ $json.mandant }}`).

  The Mandant is applied consistently to **all** operations, including the file upload step of *Create Incoming Invoice*.

  ## Authentication

  This node uses **OAuth2 Client Credentials** to authenticate against the work4all API.

  You will need:

  | Field | Description |
  |-------|-------------|
  | API URL | Base URL of your work4all instance, e.g. `https://api.work4all.de` |
  | Access Token URL | OAuth2 token endpoint, e.g. `https://auth.work4all.de/connect/token` |
  | Client ID | Your OAuth2 client ID |
  | Client Secret | Your OAuth2 client secret |

  Contact your work4all administrator to obtain client credentials with the required permissions.

  ## Development

  ### Dev Container (recommended)

  This repo includes a [Dev Container](https://containers.dev/) configuration under `.devcontainer/`.

  1. Install the [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension in VS Code or Cursor.
  2. **Dev Containers: Reopen in Container** from the command palette.
  3. After the container builds, run:

  ```bash
  npm run dev          # local n8n with this node — http://localhost:5678
  npm test             # integration tests (requires .env.test)
  npm run build:watch  # rebuild on TypeScript changes
  ```

  Copy `.env.test.example` to `.env.test` inside the container for integration tests against a real work4all tenant. The workspace folder is mounted into the container, so your local `.env.test` is available after you create it on the host.

  ### Local (without container)

  This package requires **Node.js 22** (the `@n8n/node-cli` build/dev tooling relies on Node 22+). A [`.nvmrc`](.nvmrc) is included, so you can run:

  ```bash
  nvm use      # selects Node 22 from .nvmrc
  npm ci
  npm run build
  npm run dev
  ```

  ## Installation

  ### In n8n (recommended)

  1. Go to **Settings → Community Nodes**
  2. Click **Install a community node**
  3. Enter `n8n-nodes-work4all`
  4. Click **Install**

  ### Manual (self-hosted)

  ```bash
  npm install n8n-nodes-work4all
  ```

  Then restart your n8n instance.

  ## Operations

  ### Create Incoming Invoice

  Creates a complete incoming invoice in work4all including line items and optional file attachments.

  **Supplier lookup** — you can identify the supplier by (in priority order):
  - Supplier Code (internal work4all ID)
  - Supplier Name
  - Customer Number at Supplier
  - Supplier Contact Email
  - Supplier IBAN

  **Invoice items** — enter manually via form fields or provide a JSON array.

  **Attachments** — attach files from binary properties of upstream nodes (e.g. HTTP Request, Gmail, Read Binary File). Supports form mode or JSON array mode for dynamic/LLM-driven attachment selection.

  ### Customers

  - **Get Customer** — retrieve a single customer by its internal code.
  - **Get Many Customers** — retrieve a paginated list, with an optional JSON filter.
  - **Create Customer** / **Update Customer** — create or update a customer record.

  ### Projects

  - **Get Project** — retrieve a single project by its internal code.
  - **Get Many Projects** — retrieve a paginated list, with an optional JSON filter.

  > **Pagination note:** the `Page` field is **zero-based** — the first page is `0`.

  All list and read operations support an **Output** mode (`Simplified`, `Raw`, or `Selected Fields`) to control how much of the response is returned.

  ## Example Workflows

  The [`workflows/createIncomingInvoice/`](workflows/createIncomingInvoice/) directory contains ready-to-import workflows:

  | File | Description |
  |------|-------------|
  | `w4a-invoice-gmail.json` | Polls a Gmail inbox for invoice emails, extracts attachments, and creates incoming invoices in work4all |
  | `w4a-invoice-exchange.json` | Polls a Microsoft Exchange/Outlook inbox for invoice emails and creates incoming invoices in work4all |

  To import: open n8n → **Workflows** → **Import from file**.

  ## Resources

  - [work4all website](https://work4all.de)
  - [work4all API documentation](https://docs.work4all.de)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node enables the creation of incoming invoices in the work4all ERP/CRM system via GraphQL API integration.","capabilities":["Create incoming invoices with line items","Support form-field mode for manual field entry","Support JSON mode for LLM-driven invoice creation","Attach file attachments (PDF, XML, ZIP) via binary data","Automated supplier lookup using multiple identifiers (code, name, email, IBAN)","Integrate with Gmail and Microsoft Exchange/Outlook for invoice email polling"],"authentication":"OAuth2 Client Credentials (requires Client ID, Client Secret, API URL, and Access Token URL)","commonUseCases":["Automated invoice processing from email inboxes","LLM-driven invoice creation from unstructured data","Batch invoice upload with file attachments"],"limitations":["Requires valid OAuth2 credentials with appropriate permissions from work4all administrator","Supplier identification requires one of the specified lookup methods to succeed"],"relatedNodes":["Gmail","Microsoft Exchange","HTTP Request","Read Binary File"]}


node_type: n8n-nodes-postora.postora
package_name: n8n-nodes-postora
display_name: Postora
description: Publish content to social media platforms via Postora
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: postora
author_github_url: https://github.com/lolotam/postora-n8n-community-node.git
npm_package_name: n8n-nodes-postora
npm_version: 1.1.13
community_fetched_at: 2026-07-14T14:40:34.157Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Media",
          "value": "media"
        },
        {
          "name": "Post",
          "value": "post"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a post",
          "description": "Create and publish a post"
        },
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get post status",
          "description": "Get post status and results"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List posts",
          "description": "List recent posts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "post"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload media",
          "description": "Upload a media file"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "media"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List accounts",
          "description": "List connected accounts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a post",
      "description": "Create and publish a post",
      "resource": "post"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get post status",
      "description": "Get post status and results",
      "resource": "post"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List posts",
      "description": "List recent posts",
      "resource": "post"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload media",
      "description": "Upload a media file",
      "resource": "media"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List accounts",
      "description": "List connected accounts",
      "resource": "account"
    }
  ]

npm_readme:
  # n8n-nodes-postora

  This is an [n8n](https://n8n.io/) community node for [Postora](https://postora.cloud) — the AI-powered social media management platform.

  Publish content to **Instagram, Facebook, TikTok, YouTube, Twitter/X, LinkedIn, Pinterest, Threads, Bluesky, and Reddit** directly from your n8n workflows.

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

  ## Installation

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

  1. Go to **Settings → Community Nodes**
  2. Click **Install a community node**
  3. Enter `n8n-nodes-postora`
  4. Click **Install**

  ## Operations

  ### Post
  - **Create** — Publish content to one or more social media platforms
  - **Get Status** — Check the publishing status of a post
  - **List** — List recent posts with optional status filter

  ### Media
  - **Upload** — Upload an image or video file to the Postora media library. Accepts three sources (see [Media → Upload](#media--upload) below):
    - **Binary Property** — a file from a previous n8n node
    - **URL** — download from a public web address (http/https)
    - **Media File ID** — look up & re-attach a file already in Postora (no re-upload)

  ### Account
  - **List** — List all connected social media accounts

  ## Credentials

  You need a Postora API key to use this node:

  1. Sign up at [postora.cloud](https://postora.cloud)
  2. Go to **Settings → API Keys**
  3. Generate a new API key
  4. In n8n, create a new **Postora API** credential and paste the key

  ## Usage Examples

  ### Schedule a Post to Instagram

  1. Add a **Postora** node to your workflow.
  2. Set **Resource** to `Post`.
  3. Set **Operation** to `Create`.
  4. Set **Platform** to `Instagram`.
  5. In **Social Accounts**, select the Instagram account(s) to publish to.
  6. (Optional) Set **Post Type** to `Reel` for short-form video or `Story` for ephemeral content.
  7. Write your **Caption** (disabled for Stories — only media is posted).
  8. Set **Media Source** to `URL` and paste a direct image or video URL (e.g. `https://example.com/photo.jpg`).
  9. (Optional) Set **Schedule At** to a future date/time to publish later. Leave empty to post immediately.
  10. (Optional) Expand **Additional Options** and add a **First Comment**.
  11. Execute the node. Since v1.1.13, immediate posts return their completed `post` record, including one entry per account in `post.platform_results`; use each `post_url` to open the published post. Scheduled posts return before publishing, so use **Post → Get Status** after the scheduled time to retrieve their URLs. If the status lookup fails after creation, the response includes `post_status_lookup_error` and retains the created post ID for a later status check.

  For example, an immediate post can return:

  ```json
  {
    "post": {
      "id": "post-uuid",
      "status": "completed",
      "platform_results": [
        { "platform": "instagram", "status": "success", "post_url": "https://instagram.com/p/..." }
      ]
    }
  }
  ```

  ### List Connected Accounts

  Use this to verify your credentials work and discover which social accounts are available:

  1. Add a **Postora** node to your workflow.
  2. Set **Resource** to `Account`.
  3. Set **Operation** to `List`.
  4. Execute the node. The output lists every connected social account with its ID, name, and platform.

  ### Publish a YouTube Video

  1. Add a **Postora** node to your workflow.
  2. Set **Resource** to `Post`.
  3. Set **Operation** to `Create`.
  4. Set **Platform** to `YouTube`.
  5. In **Social Accounts**, select the YouTube channel to publish to.
  6. Write your video description in **Caption**.
  7. Set **Media Source** to `URL` and paste a direct video URL.
  8. Expand **Additional Options** and configure:
     - **YouTube Title** — the video title.
     - **YouTube Visibility** — `Public`, `Unlisted`, or `Private`.
     - **YouTube Category** — category ID (default: `22` for People & Blogs).
  9. Execute the node.

  ## Platform-Specific Options

  When creating a post, you can set platform-specific options:

  | Platform | Options |
  |----------|---------|
  | YouTube | Title, Privacy (public/unlisted/private), Category ID |
  | TikTok | Privacy level, Allow Comments/Duet/Stitch |
  | Pinterest | Board ID, Title |
  | Reddit | Subreddit, Title |

  ## Media → Upload

  The **Media → Upload** node ingests files into your Postora media library. Choose where the files come from with the **Media Source** dropdown. Every source produces the same output shape:

  ```json
  { "total": 2, "uploaded": 2, "failed": 0, "results": [ { "success": true, ... }, { "success": true, ... } ] }
  ```

  The `results` array contains one entry per input item. Each entry has `success: true|false` plus source-specific fields (`field` for binary, `url` for URL, `file_id` for Media File ID).

  ### Source 1 — Binary Property (n8n file)

  Default. Reads one or more binary properties produced by an upstream node and uploads each as a multipart file.

  - **Binary Property:** the property name(s). Default `data`. For multiple files, use comma-separated names: `data,data1,data2`.

  ### Source 2 — URL (download from web)

  Downloads each URL on the n8n side and uploads the bytes to Postora. **SSRF hardening:** only `http`/`https` schemes; literal private/loopback/link-local/reserved IPs (IPv4 and IPv6) and well-known internal hostnames are rejected — checked on the original URL *and* on every redirect hop, before that hop is requested (up to 5 hops); 50 MB max; 30 s per-hop timeout; the response `Content-Type` must be `image/*` or `video/*`.

  > **Known limit:** this checks the hostname/IP as written in the URL, not where DNS actually resolves it. A domain an attacker controls that resolves to an internal address (DNS rebinding) is not caught. If you accept media URLs from untrusted sources, treat this as defense-in-depth, not a full guarantee.

  - **Media URLs:** one or more public URLs. Comma-separated, **or** use an expression returning an array:

    ```
    ={{ $json.urls }}
    ```

    Each bad URL (private host, wrong content-type, oversized, dead link) becomes a per-item failure in `results`; the node never crashes.

  ### Source 3 — Media File ID (look up & re-attach)

  Resolves Postora media file UUID(s) you uploaded earlier and re-attaches them to this item — **no re-upload**. The node calls `GET /api/v1/media/:id` for each UUID, validates each is a well-formed UUID, and de-duplicates.

  - **Media File ID(s):** one or more UUIDs. Comma-separated, **or** an expression returning an array:

    ```
    ={{ $json.file_ids }}
    ```

  > **Note on `uploaded` counts for this source:** "uploaded" means *successfully resolved & attached* media items, not files re-uploaded to storage.

  Invalid UUIDs, IDs you don't own, and missing IDs each become a per-item failure with a clear message. The node never crashes on bad input. If the API key is rejected (HTTP 401), the whole node fails — because auth is broken for everything.

  ### Backward compatibility

  Workflows saved before v1.1.7 used a single **Binary Property** field (`binaryPropertyName`). Those workflows keep working unchanged: the node detects the legacy field and defaults the Media Source to **Binary Property** automatically.

  ## Media Source Options

  When creating a post, you can attach media using one of four methods:

  | Source | Description |
  |--------|-------------|
  | **None** | Text-only post, no media attached |
  | **URL** | Provide one or more comma-separated media URLs (e.g., `https://example.com/photo1.jpg,https://example.com/photo2.jpg`) |
  | **Binary Data** | Attach binary file(s) from previous nodes. Specify property names as comma-separated values (e.g., `data,data1,data2`) to upload multiple files at once |
  | **Media File ID** | Reuse file(s) already uploaded via **Media → Upload**, by ID |

  ### Binary Data Details

  To use binary data:
  1. Connect a node that outputs binary data (e.g., HTTP Request, Read Binary File)
  2. Select **Binary Data** as the Media Source
  3. Enter the binary property name(s) — default is `data`
  4. For multiple files, use comma-separated names: `data,data1,data2`

  Binary files are automatically converted to base64 and sent via the `media_base64` API parameter.

  ### Media File ID Details

  If you already uploaded file(s) with a **Media → Upload** step (e.g. earlier in the same workflow), you can post them without re-uploading:

  1. Select **Media File ID** as the Media Source on the **Post → Create** node.
  2. Enter the ID(s) returned by the Upload step in **Media File ID(s)**.
  3. For multiple files, separate IDs with a comma: `id-1,id-2,id-3`. Wrapping them in brackets (`[id-1, id-2, id-3]`) also works — the brackets are stripped automatically.

  ## Troubleshooting

  ### "Could not find any entity of type BinaryDataFile matching..."

  This error comes from n8n itself, not from this node — it means n8n can no longer find the actual file bytes for a binary field on the item you're processing.

  The most common cause: the upstream node's output was **pinned** (📌) in the n8n editor while you were building the workflow. Pinning freezes the *shape* of the data, but the underlying file content lives in n8n's own storage and can be cleaned up over time (e.g. on restart, or by n8n's execution data retention settings). Once that happens, the pinned item still *looks* like it has a file attached, but reading it fails with this error.

  **Fix:** unpin the upstream node (click the pin icon again to remove it) and re-run the workflow with a fresh execution before testing **Media → Upload** or **Post → Create** with binary data.

  ## Resources

  - [Postora Website](https://postora.cloud)
  - [API Documentation](https://postora.cloud/docs/api)
  - [n8n Community Nodes Docs](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Publishes content to multiple social media platforms (Instagram, Facebook, TikTok, YouTube, Twitter/X, LinkedIn, Pinterest, Threads, Bluesky, Reddit) directly from n8n workflows.","capabilities":["Create posts across multiple platforms","Check post publishing status","List recent posts with optional status filter","Upload images and videos for use in posts","List connected social media accounts","Schedule posts for future publication","Add platform-specific metadata (titles, visibility, categories, boards, subreddits)"],"authentication":"API key required (Postora API key)","commonUseCases":["Automated social media content scheduling","Cross-platform content distribution","Social media analytics and status monitoring","Automated video and image posting"],"limitations":["Community node (fair-code licensed)","Media source requires direct URL input","Stories do not accept captions (only media)"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: n8n-nodes-org21.flowSniffer
package_name: n8n-nodes-org21
display_name: Org21-Observer
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: ofekdekel
author_github_url: https://github.com/Org21-ai/
npm_package_name: n8n-nodes-org21
npm_version: 0.3.7
community_fetched_at: 2026-07-14T14:40:34.158Z
ai_summary_generated_at: 2026-05-22 10:26:01
description:
  Sniff workflow metadata, logs, timing, and errors. Export to the Org21 OTLP collector or trigger a sub-flow via webhook or n8n API.

npm_readme:
  # n8n-nodes-org21

  n8n custom community node package that sniffs workflow metadata, items, timing, and errors from any n8n flow and forwards them to an Org21 sub-flow (webhook or n8n REST API) for AI-spend observability and orchestration.

  ## What it does

  The package ships one node — `Org21-Observer` (internal name `flowSniffer`, displayed under the **Miscellaneous** category) — that drops inline anywhere on an n8n canvas and:

  1. Captures `workflow.{id,name,active}`, `executionId`, `node.{name,type}`, and an ISO timestamp via `IExecuteFunctions.getWorkflow()` / `getExecutionId()` / `getNode()`.
  2. Captures the JSON payload of every input item, plus `inputItemCount` and `executionStartMs` timing, and any `item.error` records.
  3. Allows free-form `customFields` (string / number / boolean / array(JSON) / object(JSON) / binary) merged into the payload.
  4. Exports the captured payload via one of three trigger modes:
     - **OTLP Export** (`triggerMode=otlp`) — `POST {otlpEndpoint}/v1/{logs|traces}` against the Org21 OTLP collector (OTLP/HTTP+JSON). Requires Org21 OAuth2 authentication; the collector validates the JWT and derives `tenant_id` from the subject claim. Recommended path for sending data to the Org21 platform.
     - **Webhook POST** (`triggerMode=webhook`) — `POST <Webhook URL>` with the assembled JSON payload. Use for fan-out to any sub-flow webhook.
     - **n8n API** (`triggerMode=n8nApi`, *deprecated*) — `POST {baseUrl}/api/v1/workflows/{workflowId}/run`. Kept for backward compatibility; not offered to new workflows.
  5. Adds `triggerDurationMs` after the sub-flow returns.
  6. Emits original input items downstream by default (`passThrough=true`), so the Observer is non-invasive.

  By default, the sub-flow it points at is the Org21 metric-ingest pipeline that converts each event into OTEL `AIModelPipeline` metric envelopes (DELTA temporality) and ships them to the Org21 backend for cost / token attribution.

  ## Where it fits

  Per `architecture/PLATFORM_OVERVIEW.md`, n8n is the workflow-automation tier of the Org21 platform; this repo is the **Flow Sniffer / Custom Node** portion of that tier:

  ```
  n8n Workflow Engine → Flow Sniffer (this repo) → Sub-flow → otel-collector → ingest-metrics
  ```

  The Observer is what makes Org21 visibility "BYO" for n8n: any customer running n8n can `npm install n8n-nodes-org21` into their own instance, drop the node into existing workflows, and start emitting the same metric shape that the rest of the platform ingests from native AI-spend connectors (OpenAI, Anthropic, Vertex, Bedrock, etc.). DEV-226 splits each LLM event into the four-part `AIModelPipeline` series — input tokens, output tokens, cache-read tokens, cache-creation tokens — using DELTA temporality so the collector aggregates them server-side rather than fighting cumulative resets across n8n executions.

  ## Install (npm install in n8n custom dir)

  End-user installation, on any self-hosted n8n instance:

  ```bash
  # Recommended path — n8n's Community Nodes UI:
  #   Settings → Community Nodes → Install a community node → "n8n-nodes-org21"

  # Or from the n8n custom-nodes directory:
  cd ~/.n8n/nodes
  npm install n8n-nodes-org21
  # then restart n8n
  ```

  For end-to-end setup against an Org21 tenant (OAuth2 realm, Key Service per-workflow secret, OTLP endpoint), see the **Configuration** section below — it walks the credential setup, the OAuth2 + OTLP wiring, and the legacy migration. Reach out to your Org21 contact for the per-workflow Key Service client ID + secret.

  Compatibility: **n8n >= 1.0.0**, **Node.js >= 22**.

  ## Build & run (dev workflow)

  ```bash
  git clone https://github.com/Org21-ai/n8n-nodes-org21.git
  cd n8n-nodes-org21
  npm install

  npm run build         # n8n-node build → tsc + copy SVGs/JSON into dist/
  npm run build:watch   # tsc --watch (no asset copy)
  npm run dev           # n8n-node dev — local n8n at http://localhost:5678 with this node hot-loaded
  npm run lint          # n8n-node lint
  npm run lint:fix      # n8n-node lint --fix
  ```

  Dev-mode n8n state lives in `~/.n8n-node-cli/.n8n/`. `tsconfig.json` targets `es2019`, `commonjs`, `strict: true`; build output is emitted to `dist/` (the only directory shipped to npm — see `"files": ["dist"]` in `package.json`).

  Manual publish (when not relying on the tag-driven CI release):

  ```bash
  npm run publish:manual   # = npm run lint && npm run build && npm publish --access public
  ```

  ## Configuration (n8n credentials, OTEL endpoint)

  The node ships two credential types and a node-level `Authentication` selector that picks between them (or none):

  | Node `authMethod`        | Credential type (n8n name)                                              | Defined in                                                | Used by                                                                                |
  | ------------------------ | ----------------------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------- |
  | `none`                   | —                                                                       | —                                                         | Unauthenticated webhook POST. Useful for fire-and-forget local sub-flows.              |
  | `keycloak` *(default)*   | **`Org21 OAuth2 API`** (`org21KeycloakOAuth2Api`, extends `oAuth2Api`) | `credentials/Org21KeycloakOAuth2Api.credentials.ts`       | OTLP Export to the Org21 collector (default); also Webhook POST against any URL that requires the Bearer. OAuth2 `client_credentials` flow.  |
  | `apiKey` *(deprecated, hidden in v0.3.0)* | **`Org21 Legacy (Deprecated) API`** (`org21Api`)                        | `credentials/Org21Api.credentials.ts`                     | n8n API trigger mode against a self-hosted n8n; not for Org21 metric ingest. No longer offered for new workflows from v0.3.0; existing configs still run. Migrate to `keycloak`. |

  The OAuth2 token exchange is delegated entirely to n8n's built-in oAuth2 framework via `httpRequestWithAuthentication` — n8n handles token fetch, caching, refresh, and audit logging. The credential pre-fills the standard `oAuth2Api` fields:

  - `grantType: 'clientCredentials'`
  - `accessTokenUrl` computed from `Auth URL` + `Realm`: `{authUrl}/realms/{realm}/protocol/openid-connect/token`
  - `authentication: 'body'` (the Org21 auth server expects form-body client auth)
  - `sendAdditionalBodyProperties: true` with `additionalBodyProperties: '{"audience":"api otel"}'` — the same audience scoping the previous inline implementation used. n8n forwards this to `client-oauth2` (see `n8n-core/dist/execution-engine/.../request-helper-functions.js::createOAuth2Client`).

  Outgoing requests get `Authorization: Bearer <jwt>` (auto-injected by n8n) and `X-Org21-Source: formatter` (added by the node). User-facing fields on the credential are just `Auth URL` (default `https://auth.org21.ai`), `Realm` (default `global-customers`), `Client ID`, and `Client Secret`.

  `Client ID` / `Client Secret` are issued per-workflow by the Org21 **Key Service** (placeholder shown in the credential UI: `sa-acme-corp__my-workflow`), so a leaked secret only blasts a single workflow. The OAuth2 token has `aud=metric-ingest` (also `api`) so the `otel-collector` accepts it on the metric-ingest path; the alternative static `sk_otel_s1_*` bearer (via `otel-auth-proxy`) is not used here — n8n always uses OAuth2 client_credentials.

  The legacy API-key credential test pings `GET {baseUrl}/api/v1/workflows`. The OAuth2 credential is validated implicitly by n8n's oAuth2 framework on first token fetch.

  The **OTEL endpoint** itself is not configured on the node — it is the Webhook URL, which by convention points at a sub-flow that forwards into the Org21 collector. The collector authenticates the Bearer the Observer attaches.

  > **Migration from 0.1.x.** The pre-0.2.0 `org21Api` credential carried both auth modes inside an `Auth Method` field on the credential itself, with a hand-rolled OAuth2 token exchange in the node. After 0.2.0, the OAuth2 fields are gone from `org21Api`; existing customers must create a new `Org21 OAuth2 API` credential, re-enter `Auth URL` / `Realm` / `Client ID` / `Client Secret`, and pick `Authentication: Org21 OAuth2` on the node.

  ## Public surface (nodes published, parameters)

  `package.json` declares:

  ```json
  "n8n": {
    "n8nNodesApiVersion": 1,
    "strict": true,
    "credentials": [
      "dist/credentials/Org21Api.credentials.js",
      "dist/credentials/Org21KeycloakOAuth2Api.credentials.js"
    ],
    "nodes":       ["dist/nodes/FlowSniffer/FlowSniffer.node.js"]
  }
  ```

  So the package publishes exactly **one node** and **two credentials**.

  ### Node: `Org21-Observer` (`flowSniffer`)

  - `inputs`: `[Main]`
  - `outputs`: `[Main]`
  - `usableAsTool`: object form with `replacements.displayName='Org21-Observer-for-AI-agent-node'` and a tool-specific description — selectable from AI Agent / Tools nodes as a separate marketplace card
  - `credentials`: conditional on `authMethod` — `org21KeycloakOAuth2Api` when `keycloak`, `org21Api` when `apiKey`, none when `none`

  Parameters (full list, in declaration order):

  | Parameter            | Type                          | Default     | Notes                                                                                                                |
  | -------------------- | ----------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------- |
  | `authMethod`         | options                       | `keycloak`  | `none` \| `keycloak` \| `apiKey` *(deprecated)* — gates which credential slot the node shows                          |
  | `triggerMode`        | options                       | `otlp`      | `otlp` \| `webhook` \| `n8nApi` *(deprecated)* — `otlp` requires `authMethod=keycloak`; `n8nApi` requires `authMethod=apiKey` for the `baseUrl` |
  | `otlpEndpoint`       | string (required)             | `https://otel.org21.ai` | Shown only when `triggerMode=otlp`. Base URL of the Org21 OTLP collector; signal-specific path (`/v1/logs` or `/v1/traces`) is appended automatically. Override only for BYOC. |
  | `otlpSignal`         | options                       | `logs`      | Shown only when `triggerMode=otlp`. `logs` (one OTLP log record per execution) \| `traces` (one OTLP span per execution) |
  | `webhookUrl`         | string (required)             | —           | Shown only when `triggerMode=webhook`                                                                                |
  | `workflowId`         | string (required)             | —           | Shown only when `triggerMode=n8nApi`                                                                                 |
  | `includeMetadata`    | boolean                       | `true`      | Workflow + execution + node + timestamp                                                                              |
  | `includeItemData`    | boolean                       | `true`      | Raw `item.json` for every input item                                                                                 |
  | `includeTiming`      | boolean                       | `true`      | `sniffedAt`, `inputItemCount`, `executionStartMs`, `triggerDurationMs`                                               |
  | `includeErrors`      | boolean                       | `true`      | Per-item `{itemIndex, error}` pulled from `item.error`                                                               |
  | `passThrough`        | boolean                       | `true`      | Return original `items` unchanged (otherwise output the sniffed payload)                                             |
  | `customFields`       | fixedCollection (multiValues) | `{}`        | `{name, fieldType, value}` × N — types: `string`/`number`/`boolean`/`array`/`object`/`binary`                        |
  | `additionalHeaders`  | fixedCollection (multiValues) | `{}`        | `{name, value}` headers added to outbound HTTP                                                                       |

  Outbound payload shape (any subset, depending on toggles):

  ```json
  {
    "metadata":     { "workflowId", "workflowName", "workflowActive", "executionId", "nodeName", "nodeType", "timestamp" },
    "items":        [ /* item.json[] */ ],
    "timing":       { "sniffedAt", "inputItemCount", "executionStartMs", "triggerDurationMs" },
    "errors":       [ { "itemIndex", "error": { "message", "name" } } ],
    "customFields": { /* user-defined */ }
  }
  ```

  Outbound headers (always): `Content-Type: application/json`, `X-Org21-Source: formatter`. Plus `Authorization: Bearer <jwt>` when Org21 OAuth2 auth is configured, or `X-N8N-API-KEY` for legacy API-key mode.

  ### Codex metadata (`FlowSniffer.node.json`)

  ```
  node:        n8n-nodes-org21.flowSniffer
  categories:  ["Miscellaneous"]
  aliases:     ["formatter", "metadata", "logs", "observability", "monitor", "trigger", "sub-flow", "org21"]
  ```

  ### OTEL emission shape

  The Observer itself emits a generic JSON envelope (above). The downstream sub-flow is what materializes the Org21-canonical OTEL shape:

  - **Instrumentation scope**: `AIModelPipeline`
  - **Aggregation temporality**: **DELTA** (per-execution increments — the collector handles roll-up)
  - **Per-event split (DEV-226)**: every LLM call becomes **four** metric points on the same series, distinguished by attributes:
    1. `input_tokens`
    2. `output_tokens`
    3. `cache_read_input_tokens`
    4. `cache_creation_input_tokens`
  - Authenticated as an Org21 OAuth2 service account with `aud=metric-ingest`.

  ## Layout

  ```
  n8n-nodes-org21/
  ├── credentials/
  │   ├── Org21Api.credentials.ts                Legacy n8n API-key credential
  │   ├── Org21KeycloakOAuth2Api.credentials.ts  Org21 OAuth2 client_credentials (extends oAuth2Api; file name retained for storage-id compat)
  │   └── org21.svg
  ├── nodes/
  │   └── FlowSniffer/
  │       ├── FlowSniffer.node.ts   Node logic (export class FlowSniffer)
  │       ├── FlowSniffer.node.json Codex metadata
  │       └── org21.svg
  ├── icons/org21.svg               Source icon
  ├── docs/git-scanner.md
  ├── templates/                    Reference n8n workflow JSONs
  │   ├── 01-slack-error-alerts.json
  │   ├── 02-weekly-timing-digest.json
  │   ├── 03-auto-jira-on-failure.json
  │   └── README.md
  ├── dist/                         Build output (shipped to npm)
  ├── .github/workflows/
  │   ├── release.yml               Tag-triggered npm publish (v*)
  │   └── jira-check.yml            Reuses Org21-ai/pipelines/.github/workflows/jira-check.yml@main
  ├── DEVELOPER_GUIDE.md            Detailed dev / publish runbook
  ├── package.json                  n8n-node CLI scripts; declares the node + credential paths
  ├── tsconfig.json                 strict, es2019, commonjs, outDir=./dist
  ├── eslint.config.mjs
  └── .npmrc                        @org21:registry=https://registry.npmjs.org/
  ```

  ## Tests

  There is no automated test suite in this repo. Pre-publish validation is:

  - `npm run lint` — `n8n-node lint` (catches the n8n community-node ruleset).
  - `npm run dev` — interactive smoke test in a local n8n at `http://localhost:5678`.
  - The reference workflow JSONs in `templates/` (`01-slack-error-alerts.json`, `02-weekly-timing-digest.json`, `03-auto-jira-on-failure.json`) are the manual end-to-end fixtures — import each into a clean n8n, configure credentials, and verify the sub-flow fires.

  CI runs `npm ci && npm run build && npm run lint` on `v*` tag pushes (`.github/workflows/release.yml`), then `npm publish --provenance --access public`.

  ## Conventions

  - **Trunk-based development** — commit straight to `main`, no feature branches or PRs.
  - **Jira-tagged commits** — every commit message must reference a `DEV-xxx` key (SOC 2). Enforced in CI by `Org21-ai/pipelines/.github/workflows/jira-check.yml@main` on push and PR.
  - **Don't rename `name: 'flowSniffer'`** — that's the persisted node identifier; renaming it breaks every existing workflow that uses the Observer. Change `displayName` and `defaults.name` if you need to rebrand. (See `DEVELOPER_GUIDE.md`.)
  - **Versioning** — semver in `package.json`. Tag `vX.Y.Z` to trigger the npm publish workflow.
  - **Icons** — clean SVGs (no `<!DOCTYPE>`, `px` not `pt`), placed alongside the `.ts` file and referenced via `icon: 'file:org21.svg'`.
  - **`dist/` is the only published artifact** (`"files": ["dist"]`).
  - **Auth defaults to `Org21 OAuth2` and trigger mode defaults to `OTLP Export`** — new node instances render with the production-correct setup and prompt for an `Org21 OAuth2 API` credential immediately. Users running unauthenticated local sub-flows can flip Authentication back to `None` and Trigger Mode to `Webhook POST`. The deprecated `apiKey` auth + `n8nApi` trigger mode are kept only for backward compatibility with existing self-hosted-n8n configurations and will be removed in a future release.
  - **Always use `https://auth.org21.ai`** as the OAuth2 issuer (public hostname) when validating Bearers downstream — even from inside the cluster.

  ## Related

  - `Org21-ai/pipelines` — reusable `standard-ci.yml` and `jira-check.yml` workflows; this repo only consumes `jira-check.yml`.
  - `Org21-ai/otel-collector`, `otel-auth-proxy` — receive the metrics this node emits; honor `aud=metric-ingest` OAuth2 JWTs.
  - `Org21-ai/ingest-metrics`, `Org21-ai/query-platform` — downstream of the collector; convert Observer events into the AI-spend metric model.
  - `Org21-ai/architecture/CICD_new_repo.md` — repo-bootstrapping conventions referenced by this package's CI.
  - npm: https://www.npmjs.com/package/n8n-nodes-org21
  - GitHub: https://github.com/Org21-ai/n8n-nodes-org21

ai_documentation_summary:
  {"purpose":"The Org21-Observer node captures workflow metadata, execution timing, and item payloads from any n8n flow to forward them to an Org21 sub-flow for AI-spend observability and cost attribution.","capabilities":["Capture workflow metadata (id, name, active status)","Capture execution ID and node details","Capture input item JSON payloads and error records","Support custom fields (string, number, boolean, array, object, binary)","Export data via OTLP HTTP/JSON to Org21 collector","Export data via Webhook POST to custom endpoints","Export data via n8n REST API (deprecated mode)","Pass original input items downstream non-invasively","Track trigger duration after sub-flow execution"],"authentication":"OAuth2 (Keycloak) required for OTLP export and Webhook POST; API Key available for deprecated n8n API mode; None option for unauthenticated webhooks","commonUseCases":["AI-spend observability and cost tracking","Token attribution (input, output, cache-read, cache-creation)","Workflow error monitoring and logging","Real-time execution timing analysis","Fan-out to custom sub-flows or external systems"],"limitations":["n8n API trigger mode is deprecated and not offered for new workflows","Requires n8n >= 1.0.0 and Node.js >= 22","Legacy API key authentication is no longer recommended","Requires manual installation via npm in custom nodes directory"],"relatedNodes":["Org21-OTLP-Collector","Org21-Metric-Ingest-Pipeline","OpenAI Connector","Anthropic Connector","Vertex AI Connector"]}


node_type: @getpopapi/n8n-nodes-pop.pop
package_name: @getpopapi/n8n-nodes-pop
display_name: POP
description: Interact with POP Cloud API (v2) for e-invoicing (SdI and Peppol)
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: mircobabinimazzari
author_github_url: https://github.com/getpopapi/n8n-nodes-pop.git
npm_package_name: @getpopapi/n8n-nodes-pop
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.159Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "invoices",
      "options": [
        {
          "name": "Invoice",
          "value": "invoices"
        },
        {
          "name": "VAT Validation",
          "value": "vies"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Create SdI Invoice (XML)",
          "value": "createSdiInvoiceXml",
          "action": "Create an SDI Invoice",
          "description": "Create an Italian e-invoice (FatturaPA) and/or submit to SdI, according to your POP API configuration"
        },
        {
          "name": "Create Peppol Invoice (UBL)",
          "value": "createPeppolInvoiceUbl",
          "action": "Create a Peppol invoice",
          "description": "Create a Peppol invoice (UBL) and/or submit to Peppol, according to your POP API configuration"
        },
        {
          "name": "Get Invoice Status",
          "value": "getInvoiceStatus",
          "action": "Get invoice status",
          "description": "Fetch document notifications/status for an invoice integration UUID"
        },
        {
          "name": "Get Peppol Document",
          "value": "getPeppolDocument",
          "action": "Get Peppol document",
          "description": "Retrieve a Peppol document by integration UUID"
        },
        {
          "name": "Verify SdI Document (XML)",
          "value": "verifySdiDocument",
          "action": "Verify an SDI document",
          "description": "Validate an SdI XML document via the POP API document-verify endpoint"
        },
        {
          "name": "Sync Document to Zoho",
          "value": "syncZohoDocument",
          "action": "Sync document to Zoho",
          "description": "Sync an invoice or credit note to Zoho Books/Invoice via the POP API Zoho connector"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invoices"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Validate VAT Number",
          "value": "validateVat",
          "action": "Validate VAT number",
          "description": "Check if a European VAT number (Partita IVA / VAT) is valid via EU VIES"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vies"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create SdI Invoice (XML)",
      "value": "createSdiInvoiceXml",
      "action": "Create an SDI Invoice",
      "description": "Create an Italian e-invoice (FatturaPA) and/or submit to SdI, according to your POP API configuration",
      "resource": "invoices"
    },
    {
      "name": "Create Peppol Invoice (UBL)",
      "value": "createPeppolInvoiceUbl",
      "action": "Create a Peppol invoice",
      "description": "Create a Peppol invoice (UBL) and/or submit to Peppol, according to your POP API configuration",
      "resource": "invoices"
    },
    {
      "name": "Get Invoice Status",
      "value": "getInvoiceStatus",
      "action": "Get invoice status",
      "description": "Fetch document notifications/status for an invoice integration UUID",
      "resource": "invoices"
    },
    {
      "name": "Get Peppol Document",
      "value": "getPeppolDocument",
      "action": "Get Peppol document",
      "description": "Retrieve a Peppol document by integration UUID",
      "resource": "invoices"
    },
    {
      "name": "Verify SdI Document (XML)",
      "value": "verifySdiDocument",
      "action": "Verify an SDI document",
      "description": "Validate an SdI XML document via the POP API document-verify endpoint",
      "resource": "invoices"
    },
    {
      "name": "Sync Document to Zoho",
      "value": "syncZohoDocument",
      "action": "Sync document to Zoho",
      "description": "Sync an invoice or credit note to Zoho Books/Invoice via the POP API Zoho connector",
      "resource": "invoices"
    },
    {
      "name": "Validate VAT Number",
      "value": "validateVat",
      "action": "Validate VAT number",
      "description": "Check if a European VAT number (Partita IVA / VAT) is valid via EU VIES",
      "resource": "vies"
    }
  ]

npm_readme:
  # n8n-nodes-pop

  ![POP Cloud API](https://img.shields.io/badge/POP_Cloud_API-v2-ff5f5e?style=flat-square)
  ![License](https://img.shields.io/badge/license-MIT-a8dadc?style=flat-square)
  ![n8n community](https://img.shields.io/badge/n8n-community_node-1a1a1a?style=flat-square)

  > Community node for [n8n](https://n8n.io/) that integrates with **[POP](https://popapi.io/)** for automated electronic invoicing.

  **POP** is an e-invoicing platform that automates the generation, delivery, and management of legally compliant electronic invoices. It supports both the **Italian SdI** (Sistema di Interscambio / FatturaPA) and the **European Peppol** network.

  This node lets you create, send, and track electronic invoices directly from n8n workflows. Authenticate once with a **POP credential** (sent as the `X-API-Key` header) or supply the license key per operation — both are supported.

  ---

  ## Table of Contents

  - [Installation](#installation)
  - [Configuration](#configuration)
  - [Authentication](#authentication)
    - [Get Your License Key](#get-your-license-key)
  - [Operations](#operations)
  - [Input Modes](#input-modes)
  - [Form Fields Reference](#form-fields-reference)
  - [Example Workflow](#example-workflow)
  - [Example Payloads](#example-payloads)
  - [Project Structure](#project-structure)
  - [Local Development](#local-development)
  - [Publishing](#publishing)
  - [Resources](#resources)
  - [License](#license)

  ---

  ## Installation

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

  1. In n8n, go to **Settings > Community Nodes**
  2. Select **Install**
  3. Enter `@getpopapi/n8n-nodes-pop`
  4. Click **Install**

  ---

  ## Authentication

  ### Get Your License Key

  > 🔑 **New to POP?** Visit **[popapi.io](https://popapi.io/)** to create your account and get your license key.

  API-only users can activate their account and obtain a `license_key` with this flow:

  1. Open **[https://popapi.io/otp-login/](https://popapi.io/otp-login/)**
  2. Enter your email address
  3. Receive a one-time password (OTP) by email and enter it
  4. Complete the configuration wizard
  5. Open **[https://popapi.io/](https://popapi.io/)** → **Account > API**
  6. Copy the default generated `license_key`

  **Key management:**
  - Your account includes one default `license_key`, visible under **Account > API**
  - You can generate additional keys linked to the same account from that same page
  - Every `license_key` must be treated as a secret credential — do not commit it to source control

  **Recommended first steps:**
  1. Get your `license_key`
  2. Test it with `GET /account-profile`
  3. Send one document-generation request with a real payload
  4. Add optional delivery integrations only after local generation works

  ---

  ### How the credential is sent

  POP (v2) accepts the license key in **two** forms:

  | Method                       | How                                                  | Status                  |
  |------------------------------|------------------------------------------------------|-------------------------|
  | **`X-API-Key` HTTP header**  | `X-API-Key: <your_license_key>`                      | **Preferred**           |
  | **`license_key` body param** | `{ "license_key": "<your_license_key>", ... }`       | Legacy fallback         |

  When both are present, the header wins. The body fallback exists so older POP deployments continue to work without changes.

  ### How to provide the key in n8n

  This node supports two ways of supplying the key, which can be combined:

  1. **POP credential** _(recommended)_ — In n8n, go to **Credentials → New → POP API**, paste the license key, and select that credential on the POP node. The node will send `X-API-Key: <your_license_key>` on every request automatically.
  2. **Per-operation License Key field** — In **Form Fields** input mode, every invoice operation exposes a **License Key** field. When non-empty it overrides the credential and is sent both as the `X-API-Key` header **and** as `license_key` in the request body. Useful when one workflow needs to drive multiple licenses.

  For **Use Incoming JSON**, **JSON**, and **Raw** input modes the credential is the simplest option — the header is injected automatically. You can still embed `license_key` in the body if you prefer; the API accepts both.

  ### What the node sends

  | Mode                  | `X-API-Key` header                            | `license_key` in body                              |
  |-----------------------|-----------------------------------------------|----------------------------------------------------|
  | Form (key field set)  | The form field value (overrides credential)   | The form field value                               |
  | Form (key field empty)| Credential value (if any)                     | Empty (`""`) — relies on header auth               |
  | Use Incoming JSON     | Credential value (if any)                     | Whatever the upstream item provides                |
  | JSON                  | Credential value (if any)                     | Whatever you put in the JSON body                  |
  | Raw                   | Credential value (if any)                     | n/a (raw payload)                                  |

  The **Verify SdI Document (XML)** operation auto-detects the license key from the upstream Create SdI Invoice node — that detected key is sent both as the header and in the body, taking precedence over the credential.

  ### Self-hosted POP deployments

  If you operate your own POP deployment, make sure it includes the auth-header support — see `LicenseHelper::buildLicenseInfo` and `Utils::apiPermissionCallback` in pop-cloud-api, which prefer `X-API-Key` and fall back to `license_key`. Older deployments without that change still work because this node also sends `license_key` in the body whenever it has a key to send.

  ---

  ## Configuration

  ### Environment

  Each invoice operation includes an **Environment** selector. The published node exposes only **Production** (`https://popapi.io/wp-json/api/v2/`).

  > **Note for developers:** The Staging option (`https://staging7.popapi.io/wp-json/api/v2/`) is commented out in the source and can be re-enabled locally for testing against a staging deployment.

  ---

  ## Operations

  ### Resource: Invoice

  #### Create SdI Invoice (XML)

  Generates an Italian e-invoice in **FatturaPA** format and optionally submits it to the **Sistema di Interscambio**.

  - **Endpoint:** `POST /create-xml`
  - **Invio Fattura:** Toggle to `Yes` to include the SdI integration object and trigger submission via POP
  - **Input modes:** Passthrough, Form Fields, JSON, Raw

  #### Create Peppol Invoice (UBL)

  Generates a **Peppol** invoice in **UBL** format and optionally submits it to the **Peppol** network.

  - **Endpoint:** `POST /create-ubl`
  - **Invio Fattura:** Toggle to `Yes` to include the Peppol integration object
  - **Input modes:** Passthrough, Form Fields, JSON, Raw
  - Customer type is limited to **Company** or **Freelance** (Peppol does not support Private individuals)

  #### Get Invoice Status

  Retrieves document notifications for a previously submitted SdI invoice.

  - **Endpoint:** `POST /document-notifications`
  - **Form payload:** `{ license_key, integration: { uuid } }`
  - **Input modes:** Passthrough, Form Fields, JSON, Raw

  #### Get Peppol Document

  Retrieves a Peppol document by integration UUID.

  - **Endpoint:** `POST /peppol/document-get`
  - **Form payload:** `{ license_key, integration: { uuid, zone? } }`
  - The `zone` field (e.g. `"BE"`) is required for Belgian VAT numbers; it is normalised to uppercase automatically
  - **Input modes:** Passthrough, Form Fields, JSON, Raw

  #### Verify SdI Document (XML)

  Validates an SdI XML document via the POP document-verify endpoint. Designed to be used immediately after **Create SdI Invoice (XML)** in a workflow — it reads the XML from the incoming item, base64-encodes it, and auto-detects the license key from the upstream node.

  - **Endpoint:** `POST /sdi-via-pop/document-verify`
  - **Input:** Always passthrough — connects directly to the output of the **Create SdI Invoice (XML)** node
  - **License key:** Auto-detected from the upstream POP node (supports both Form Fields and JSON input modes of the upstream node). No manual entry required.
  - **Payload sent:** `{ license_key, skip_business_check: true, integration: { xml: "<base64-encoded XML>" } }`

  #### Sync Document to Zoho

  Syncs an invoice or credit note to Zoho Books/Invoice via POP's native Zoho connector. All Zoho-side mapping (tax, customer, payment terms, document status) happens server-side in the POP API — this node only gates the request and forwards the payload.

  - **Prerequisite:** The Zoho integration must be activated for your account from the POP account panel before this action can succeed — see [Setting Up the Zoho Connector](#setting-up-the-zoho-connector-prerequisite) below.
  - **Status check:** With **Check Connector Status First** set to `Yes` (the default), the node first calls `GET /integration/zoho/status` and confirms `data.active_connector === "zoho"` and `data.zoho_connected === true`. If the connector isn't active, the operation fails immediately with a clear error instead of attempting the sync.
  - **Sync endpoint:** `POST /integration/zoho/sync`
  - **Document Type:** Reuses the **Invoice Details → Document Type** field — `TD01` (Invoice) or `TD04` (Credit Note).
  - **Credit notes (TD04):** The POP API requires a connected invoice reference. Set **Additional Options → Connected Invoice Data (JSON)** to an array whose first entry has a numeric `id`, e.g. `[{"id": 123}]`. The node validates this locally before sending the request and fails fast if it's missing.
  - **Input modes:** Passthrough, Form Fields, JSON (no Raw — the endpoint only accepts JSON)
  - **Output shape:**
    ```json
    {
      "connector_active": true,
      "status_checked": true,
      "sync_attempted": true,
      "response": { "...": "raw POP API response" }
    }
    ```

  #### Setting Up the Zoho Connector (Prerequisite)

  Before you can use **Sync Document to Zoho**, you need to connect your Zoho account to POP. This is a one-time setup done in the POP dashboard, not in n8n. Full documentation: [docs.popapi.io/en/api/zoho](https://docs.popapi.io/en/api/zoho/).

  1. Go to [**popapi.io/my-account/api-integrations/zoho-connector/connect**](https://popapi.io/my-account/api-integrations/zoho-connector/connect/) and log in to your POP account.
  2. **Choose the Zoho product** you actually use:
     - **Zoho Invoice** — if your account uses Zoho Invoice.
     - **Zoho Books** — if your account uses Zoho Books.

     Once connected, POP will create invoices or credit notes directly in that Zoho account.
  3. **Create a Zoho OAuth app:**
     - Open the [Zoho API Console](https://api-console.zoho.com) and create a **Server-based Application**.
     - Set the Redirect URI to **exactly**:
       ```
       https://popapi.io/it/wp-json/api/v2/integration/oauth/callback?connector=zoho
       ```
     - Zoho validates the Redirect URI character-for-character — if you set up the app before this screen showed you the final URL, update the Redirect URI in Zoho and paste the exact value shown on the POP connector page, including `?connector=zoho`.
  4. **Copy the credentials into POP:**
     - After creating the Zoho app, copy its **Client ID** and **Client Secret** into the corresponding fields on the POP connector page.
     - In Zoho Invoice or Zoho Books, go to **Settings → Organization Profile** and copy the **Organization ID** into the POP connector page.
  5. Save and authorize the connection. Once `active_connector` is `zoho` and the connection shows as connected, the **Sync Document to Zoho** operation in this node will succeed (you can verify this with **Check Connector Status First** = `Yes`, the default).

  ---

  ### Resource: VAT Validation

  #### Validate VAT

  Validates a VAT number against the official **EU VIES** (VAT Information Exchange System) SOAP service.

  - **Service:** `https://ec.europa.eu/taxation_customs/vies/services/checkVatService`
  - **Supported countries:** All 27 EU member states + Northern Ireland (`XI`)
  - **Retry logic:** Up to 5 attempts with exponential backoff (1s, 2s, 4s, 8s…) when the VIES service is temporarily unavailable
  - **Returns:** `valid` (boolean), `name`, `address`, `requestDate`, `attempts` (number of retries), `latencyMs`

  | Field          | Description                                    |
  |----------------|------------------------------------------------|
  | Country Code   | EU country code from dropdown (e.g. `IT`, `DE`, `EL`, `XI`) |
  | VAT Number     | VAT number without the country prefix (e.g. `01234567890`) |

  ---

  ## Input Modes

  Most invoice operations support the same four input modes:

  | Mode                  | Description                                                                                             |
  |-----------------------|---------------------------------------------------------------------------------------------------------|
  | **Use Incoming JSON** | Forwards the input item's JSON data directly to the API. Default mode, ideal for automated pipelines.  |
  | **Form Fields**       | Structured form with all relevant fields. Best for manual entry or mapping from other nodes.            |
  | **JSON**              | Paste or build the full request JSON payload manually.                                                  |
  | **Raw (XML/Other)**   | Send a raw string body (e.g. XML). Sets `Content-Type: application/xml` unless overridden via headers.  |

  **Sync Document to Zoho** only supports **Use Incoming JSON**, **Form Fields**, and **JSON** — the `integration/zoho/sync` endpoint accepts JSON only, so **Raw** is not offered for this operation.

  ---

  ## Form Fields Reference

  The **Form Fields** input mode for `Create SdI Invoice (XML)` and `Create Peppol Invoice (UBL)` exposes the following sections. Fields marked with an asterisk (`*`) are required.

  ### A. Top-level Fields

  | Field                     | SDI | Peppol | Description                                              |
  |---------------------------|:---:|:------:|----------------------------------------------------------|
  | License Key               | ✓   | ✓      | POP license key. Optional when a POP credential is configured. When set, sent both as `X-API-Key` header and `license_key` body param. |
  | Invoice / Order ID `*`    | ✓   | ✓      | Numeric ID of the invoice or order                       |
  | Filename `*`              | ✓   | ✓      | FatturaPA / Peppol filename (e.g. `IT99900088876_00009`) |
  | Customer Type `*`         | ✓   | ✓      | `Private` / `Company` / `Freelance` (Peppol: no Private) |
  | SDI Type (Codice Destinatario) `*` | ✓ | —   | SdI destination code (7 chars). Defaults to `0000000` for private customers without a code; forced to `XXXXXXX` for foreign clients |
  | Invoice Number `*`        | ✓   | ✓      | Full invoice number (e.g. `WEB9/2025`)                   |
  | Invoice Date `*`          | ✓   | ✓      | Invoice date in `YYYY-MM-DD` format                      |
  | Total Document Amount `*` | ✓   | ✓      | Total amount including taxes                             |

  ### B. Transmitter Data

  | Field              | SDI | Peppol | Description                                  |
  |--------------------|:---:|:------:|----------------------------------------------|
  | Country            | ✓   | ✓      | ISO country code of the transmitter           |
  | Email              | ✓   | ✓      | Transmitter contact email                     |
  | ID Code            | ✓   | ✓      | Transmitter identification code               |
  | Phone              | ✓   | ✓      | Transmitter contact phone                     |
  | Progressive        | ✓   | —      | Progressive identifier for the transmission   |
  | Recipient PEC      | ✓   | —      | PEC (certified email) of the recipient        |
  | SDI Code           | ✓   | —      | Codice destinatario SdI (7 chars)             |
  | Transmitter Format | ✓   | ✓      | `FPR12` (Private) or `FPA12` (Public Admin)   |

  ### C. Sender (Lender)

  | Field         | SDI | Peppol | Description                                       |
  |---------------|:---:|:------:|---------------------------------------------------|
  | Address       | ✓   | ✓      | Street address                                    |
  | City          | ✓   | ✓      | City name                                         |
  | Company Name  | ✓   | ✓      | Company or business name                          |
  | Country       | ✓   | ✓      | ISO country code of the sender address            |
  | Email         | ✓   | ✓      | Contact email                                     |
  | Phone         | ✓   | ✓      | Contact phone                                     |
  | Province      | ✓   | ✓      | Province abbreviation (e.g. `CT`, `MI`)           |
  | Tax Regime    | ✓   | —      | Italian tax regime code (e.g. `RF01` — Ordinary)  |
  | VAT Country   | ✓   | ✓      | ISO country code for VAT identification           |
  | VAT ID Code   | ✓   | ✓      | Full VAT identification code                      |
  | ZIP Code      | ✓   | ✓      | Postal / ZIP code                                 |

  ### D. Recipient (Client)

  | Field                          | SDI | Peppol | Description                                      |
  |--------------------------------|:---:|:------:|--------------------------------------------------|
  | Address                        | ✓   | ✓      | Street address                                   |
  | City                           | ✓   | ✓      | City name                                        |
  | Company Name                   | ✓   | ✓      | Company name (leave empty for individuals)        |
  | Country                        | ✓   | ✓      | ISO country code of the recipient address         |
  | Email                          | ✓   | ✓      | Email address                                    |
  | First Name                     | ✓   | ✓      | First name (individuals)                         |
  | Last Name                      | ✓   | ✓      | Last name (individuals)                          |
  | Province                       | ✓   | ✓      | Province abbreviation                            |
  | Tax ID Code (Codice Fiscale)   | ✓   | —      | Italian fiscal code of the recipient             |
  | VAT Country                    | ✓   | ✓      | ISO country code for VAT identification          |
  | VAT ID Code                    | ✓   | ✓      | VAT identification code                          |
  | ZIP Code                       | ✓   | ✓      | Postal / ZIP code                                |

  ### E. Invoice Details

  | Field           | Description                                         |
  |-----------------|-----------------------------------------------------|
  | Document Type   | `TD01` (Invoice) or `TD04` (Credit Note)            |
  | Currency        | ISO 4217 currency code (default: `EUR`)             |
  | Invoice Prefix  | Prefix portion of the invoice number (e.g. `WEB`)  |
  | Invoice Suffix  | Suffix portion of the invoice number (e.g. `2025`) |

  ### F. Order Items

  Each line item supports multiple values. Fields apply to both SDI and Peppol unless noted.

  | Field            | Description                                                                 |
  |------------------|-----------------------------------------------------------------------------|
  | Description `*`  | Item description text                                                       |
  | Discount         | `No` (default) or `Yes`. When `Yes`, sets `discount_type = SC` in the payload |
  | Discount Percent | Required when Discount is `Yes`. Percentage to apply (e.g. `10.00`)        |
  | Gift Product     | `No` or `Yes` — whether the item is a gift / free product                  |
  | Item Code Type   | Type of item code (e.g. `INTERNO`, `EAN`)                                  |
  | Item Code Value  | Value of the item code                                                      |
  | Item Type        | `Product`, `Shipping`, or `Fee`                                             |
  | Quantity         | Quantity (e.g. `1.00`)                                                      |
  | Total Tax        | Tax amount for this line item                                               |
  | Unit             | Unit of measure (e.g. `N.`, `KG`, `LT`)                                    |
  | Unit Price       | Price per unit (e.g. `4.09`)                                                |
  | VAT Rate         | VAT rate percentage (e.g. `22.00`, `10.00`, `0.00`)                        |

  > **Discount behaviour:** When **Discount** is set to `Yes`, **Discount Percent** is required. The `discount_amount` and `total_price` are **automatically calculated** by the node — they are not editable inputs:
  > - `total_price = unit_price × quantity`
  > - `discount_amount = total_price × discount_percent / 100`
  > - `total_price` (sent to API) `= total_price − discount_amount`

  ### G. Payment Data

  **Payment Method** — select from the dropdown (code is sent in the payload):

  | Label                  | Payload value |
  |------------------------|---------------|
  | Bank Transfer          | `MP05`        |
  | Cash                   | `MP01`        |
  | Check                  | `MP02`        |
  | Credit Card            | `MP08`        |
  | Direct Debit           | `MP16`        |
  | PagoPA                 | `MP23`        |
  | RIBA                   | `MP12`        |
  | SEPA Core Direct Debit | `MP21`        |
  | SEPA Direct Debit      | `MP19`        |
  | Special Account RIBA   | `MP15`        |
  | Withholding on Payments| `MP22`        |

  **Payment Data** (fixedCollection):

  | Field          | Description                                                      |
  |----------------|------------------------------------------------------------------|
  | Payment Amount | Amount to be paid (typically equals the total document amount)   |
  | Payment Terms  | `TP01` (Instalment), `TP02` (Full — default), `TP03` (Advance)  |

  **Bank Details** — shown only when Payment Method is `Bank Transfer`:

  | Field                 | Description                              |
  |-----------------------|------------------------------------------|
  | Beneficiary `*`       | Name of the payment beneficiary          |
  | Financial Institution `*` | Name of the bank or institution     |
  | IBAN `*`              | IBAN for bank transfer payments          |

  ### H. Additional Options

  Optional advanced fields available in both SDI and Peppol form modes:

  | Field                        | Description                                                        |
  |------------------------------|--------------------------------------------------------------------|
  | Connected Invoice Data (JSON)| Connected invoice references as a JSON array                       |
  | Document Type (String)       | Document type string (e.g. `invoice`, `credit_note`)              |
  | Purchase Order Date          | Date of the related purchase order (`YYYY-MM-DD`)                 |
  | Purchase Order ID            | Reference to the related purchase order                            |
  | Tax Exemption Reason         | Normative reference text for VAT exempt operations                |
  | VAT Exemption Code           | Nature code for VAT exempt operations (e.g. `N1`, `N2`, `N3`, `N4`) |
  | VIES                         | Whether the transaction is intra-EU and VIES validated (`true`/`false`) |

  ---

  ## Example Workflow

  ### E-invoice creation and verification

  ```
  [Webhook] → [POP: Create SdI Invoice] → [POP: Verify SdI Document] → [POP: Get Invoice Status] → [Slack]
  ```

  1. A **Webhook** node receives order data from your e-commerce platform
  2. The **POP** node creates an SdI invoice using **Use Incoming JSON** mode — the webhook payload is forwarded as-is
  3. A second **POP** node (Verify SdI Document) validates the generated XML — no configuration needed, it reads everything from the previous node
  4. A third **POP** node checks the invoice status using the UUID from the create response
  5. A **Slack** node notifies the team of the result

  ### VAT number validation

  ```
  [Manual Trigger] → [POP: Validate VAT] → [IF: valid?] → [Send Invoice / Flag for review]
  ```

  1. Trigger with a customer's country code and VAT number
  2. The **POP** node (VAT Validation resource) calls the EU VIES service and returns validity, company name, and address
  3. Branch on the `valid` field to decide whether to proceed with invoicing

  ---

  ## Example Payloads

  ### SdI Invoice (XML) — `POST /create-xml`

  ```json
  {
    "license_key": "your_license_key",
    "data": {
      "id": 2575,
      "filename": "IT99900088876_00009",
      "type": "invoice",
      "version": "FPR12",
      "sdi_type": "",
      "customer_type": "private",
      "nature": "",
      "ref_normative": null,
      "vies": false,
      "transmitter_data": {
        "transmitter_id": { "country_id": "IT", "id_code": "IT99900088876" },
        "progressive": "5b27a73cab",
        "transmitter_format": "FPR12",
        "sdi_code": "0000000",
        "transmitter_contact": { "phone": "", "email": "" },
        "recipient_pec": ""
      },
      "transfer_lender": {
        "personal_data": {
          "tax_id_vat": { "country_id": "IT", "id_code": "IT99900088876", "tax_regime": "RF01" },
          "company_name": "TEST123"
        },
        "place": { "address": "Via Roma, 123", "zip_code": "95100", "city": "Catania", "province_id": "CT", "country_id": "IT" },
        "contact": { "phone": "", "email": "" }
      },
      "transferee_client": {
        "personal_data": {
          "tax_id_vat": { "country_id": "IT", "id_code": "" },
          "tax_id_code": "PCCLFA75L04A494S",
          "company_name": "",
          "first_name": "Alfio",
          "last_name": "Piccione"
        },
        "place": { "address": "Via Roma 123", "zip_code": "95100", "city": "Catania", "province_id": "CT", "country_id": "IT" }
      },
      "invoice_body": {
        "general_data": {
          "doc_type": "TD01",
          "currency": "EUR",
          "date": "2025-01-31",
          "invoice_number": "WEB9/2025",
          "invoice_prefix": "WEB",
          "invoice_suffix": "2025"
        },
        "total_document_amount": "16.38"
      },
      "purchase_order_data": { "id": "#2575", "date": "2025-01-31" },
      "connected_invoice_data": [],
      "order_items": [
        {
          "item_code": { "type": "INTERNO", "value": "2563" },
          "item_type": "product",
          "gift_product": "no",
          "description": "Product A",
          "quantity": "1.00",
          "unit": "N.",
          "discount_type": "",
          "discount_percent": "",
          "discount_amount": "",
          "unit_price": "4.09",
          "total_price": "4.09",
          "rate": "0.00",
          "total_tax": 0
        }
      ],
      "payment_data": {
        "terms_payment": "TP02",
        "payment_amount": "16.38",
        "payment_details": "MP02",
        "beneficiary": "",
        "financial_institution": "",
        "iban": ""
      }
    },
    "integration": {
      "use": "sdi-via-pop",
      "action": "create"
    }
  }
  ```

  ### Peppol Invoice (UBL) — `POST /create-ubl`

  ```json
  {
    "license_key": "your_license_key",
    "data": {
      "id": 2855,
      "xml_style": "",
      "view": false,
      "save": false,
      "save_bulk": false,
      "filename": "BE0123456789_0000T",
      "type": "invoice",
      "version": "FPR12",
      "sdi_type": "",
      "customer_type": "company",
      "nature": "",
      "ref_normative": null,
      "vies": false,
      "transmitter_data": {
        "transmitter_id": { "country_id": "BE", "id_code": "BE0123456789" },
        "progressive": "cea0d365b4",
        "transmitter_format": "FPR12",
        "sdi_code": "0000000",
        "transmitter_contact": { "phone": "", "email": "info@company.com" },
        "recipient_pec": ""
      },
      "transfer_lender": {
        "personal_data": {
          "tax_id_vat": { "country_id": "BE", "id_code": "BE0123456789", "tax_regime": "" },
          "company_name": "My Company SRL"
        },
        "place": { "address": "Via Roma, 123", "zip_code": "1000", "city": "Brussels", "province_id": "", "country_id": "BE" },
        "contact": { "phone": "", "email": "info@company.com" }
      },
      "transferee_client": {
        "personal_data": {
          "tax_id_vat": { "country_id": "BE", "id_code": "BE0727506532" },
          "tax_id_code": "",
          "company_name": "Client Company NV",
          "first_name": "",
          "last_name": ""
        },
        "place": { "address": "Rue du Test 12", "zip_code": "4444", "city": "Liege", "province_id": "", "country_id": "BE" }
      },
      "invoice_body": {
        "general_data": {
          "doc_type": "TD01",
          "currency": "EUR",
          "date": "2025-10-03",
          "invoice_number": "WEB097/2025",
          "invoice_prefix": "WEB",
          "invoice_suffix": "2025"
        },
        "total_document_amount": "4.80"
      },
      "purchase_order_data": { "id": "#2855", "date": "2025-10-03" },
      "connected_invoice_data": [],
      "order_items": [
        {
          "item_code": { "type": "INTERNO", "value": "2636" },
          "item_type": "product",
          "gift_product": null,
          "description": "Product B",
          "quantity": "1.00",
          "unit": "N.",
          "discount_type": "",
          "discount_percent": "",
          "discount_amount": "",
          "unit_price": "4.80",
          "total_price": "4.80",
          "rate": "0.00",
          "total_tax": 0
        }
      ],
      "payment_data": {
        "terms_payment": "TP02",
        "payment_amount": "4.80",
        "payment_details": "MP01",
        "beneficiary": "",
        "financial_institution": "",
        "iban": ""
      }
    },
    "integration": {
      "use": "peppol-via-pop",
      "action": "create"
    }
  }
  ```

  ### Get Invoice Status — `POST /document-notifications`

  ```json
  {
    "license_key": "your_license_key",
    "integration": {
      "uuid": "your-integration-uuid"
    }
  }
  ```

  ### Get Peppol Document — `POST /peppol/document-get`

  ```json
  {
    "license_key": "your_license_key",
    "integration": {
      "uuid": "your-integration-uuid",
      "zone": "BE"
    }
  }
  ```

  ### Verify SdI Document — `POST /sdi-via-pop/document-verify`

  > This operation has no manual payload — it is always passthrough. The node reads the XML from the incoming item (output of **Create SdI Invoice (XML)**), base64-encodes it, and auto-detects the license key from the upstream node.

  The request sent to the API looks like:

  ```json
  {
    "license_key": "<auto-detected from upstream node>",
    "skip_business_check": true,
    "integration": {
      "xml": "<base64-encoded FatturaPA XML>"
    }
  }
  ```

  ### Sync Document to Zoho — `POST /integration/zoho/sync`

  Invoice (TD01):

  ```json
  {
    "license_key": "your_license_key",
    "data": {
      "id": 0,
      "filename": "",
      "type": "invoice",
      "customer_type": "private",
      "transferee_client": {},
      "invoice_body": {
        "general_data": {
          "doc_type": "TD01",
          "date": "2025-01-31",
          "currency": "EUR"
        }
      },
      "order_items": [{}]
    }
  }
  ```

  Credit note (TD04) — requires `connected_invoice_data`:

  ```json
  {
    "license_key": "your_license_key",
    "data": {
      "id": 0,
      "filename": "",
      "type": "invoice",
      "customer_type": "private",
      "transferee_client": {},
      "invoice_body": {
        "general_data": {
          "doc_type": "TD04",
          "date": "2025-01-31",
          "currency": "EUR"
        }
      },
      "connected_invoice_data": [{ "id": 123 }],
      "order_items": [{}]
    }
  }
  ```

  The status check that runs first (unless disabled) calls `GET /integration/zoho/status` with no body.

  ### Validate VAT (VIES)

  > This operation calls the EU VIES SOAP service, not the POP Cloud API.

  Example response:

  ```json
  {
    "valid": true,
    "name": "GOOGLE ITALY S.R.L.",
    "address": "VIA FEDERICO CONFALONIERI 4\n20124 MILANO MI",
    "requestDate": "2026-04-02",
    "attempts": 1,
    "latencyMs": 412
  }
  ```

  ---

  ## Project Structure

  ```
  n8n-nodes-pop/
  ├── nodes/Pop/
  │   ├── Pop.node.ts                  # Node definition and metadata
  │   ├── Pop.node.json                # Codex metadata (categories, aliases, docs links)
  │   ├── pop.svg                      # Node icon
  │   ├── router.ts                    # Per-item operation dispatcher
  │   ├── types/pop.ts                 # TypeScript resource/operation type map
  │   ├── utils/request.ts             # Shared HTTP helper (base URL + error wrapping)
  │   ├── invoices/
  │   │   ├── index.ts                 # Operation aggregator for the invoices resource
  │   │   ├── invoiceFields.ts         # Form field factory (shared by SdI, Peppol, and Zoho)
  │   │   ├── invoicePayloadBuilder.ts # Assembles API payloads from form values
  │   │   ├── createSdiInvoiceXml.ts   # Operation: Create SdI Invoice
  │   │   ├── createPeppolInvoiceUbl.ts# Operation: Create Peppol Invoice
  │   │   ├── getInvoiceStatus.ts      # Operation: Get Invoice Status
  │   │   ├── getPeppolDocument.ts     # Operation: Get Peppol Document
  │   │   ├── verifySdiDocument.ts     # Operation: Verify SdI Document (XML)
  │   │   └── syncZohoDocument.ts      # Operation: Sync Document to Zoho
  │   └── vies/
  │       ├── index.ts                 # Operation aggregator for the vies resource
  │       └── validateVat.ts           # Operation: Validate VAT (EU VIES SOAP)
  ├── package.json
  ├── tsconfig.json
  └── eslint.config.mjs
  ```

  ---

  ## Local Development

  ### Prerequisites

  - **Node.js v22+** (use `.nvmrc`: `nvm use`)
  - **npm**

  ### Steps

  ```bash
  npm install       # Install dependencies
  npm run build     # Compile TypeScript → dist/
  npm run lint      # Check for linting issues
  npm run lint:fix  # Auto-fix linting issues where possible
  npm run dev       # Start watch mode + n8n
  ```

  `npm run dev` (via `@n8n/node-cli`):
  - Symlinks the package into `~/.n8n-node-cli/.n8n/custom/node_modules/`
  - Starts `tsc --watch`, which recompiles on every file save
  - Downloads and starts `n8n@latest` via `npx` (first run may take a while)
  - Sets `N8N_DEV_RELOAD=true` so n8n picks up changes automatically

  Open [http://localhost:5678](http://localhost:5678), search for **POP** in the node panel, and start testing. Code changes are picked up automatically — no restart needed.

  ### Verifying the node works

  1. Create a new workflow
  2. Add a **Manual Trigger** node
  3. Add the **POP** node and connect it to the trigger
  4. Select **Invoice** as the resource and an operation (e.g. **Create SdI Invoice (XML)**)
  5. Set **Input Mode** to **JSON** and paste one of the [example payloads](#example-payloads) above
  6. Click **Execute node** — you should see a successful API response or a descriptive error with the full URL, HTTP status, and response body

  ---

  ## Publishing

  ```bash
  npm login        # Log in to your npm account
  npm run release  # Builds, versions, and publishes via @n8n/node-cli
  ```

  > From **May 1st, 2026**, all community nodes must be published via a GitHub Action that includes a provenance statement. See the [n8n community node publishing guide](https://docs.n8n.io/integrations/community-nodes/build-community-nodes/) for details.

  ---

  ## Resources

  - [POP Cloud API Documentation (Postman)](https://documenter.getpostman.com/view/41622997/2sAYkLmGT8)
  - [POP Website](https://popapi.io/)
  - [n8n Community Nodes Guide](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n Creating Nodes](https://docs.n8n.io/integrations/creating-nodes/)

  ---

  ## License

  [MIT](LICENSE.md) — Babini Mazzari S.r.l.

ai_documentation_summary:
  {"purpose":"A community n8n node for interacting with the POP Cloud API (v2) to automate the generation, delivery, and management of legally compliant electronic invoices for Italian SdI and European Peppol standards.","capabilities":["Create electronic invoices","Send electronic invoices","Track invoice status","Verify SdI Document (XML)","Generate invoices for both SdI and Peppol networks","Support multiple input modes (Form, JSON, Raw, Incoming JSON)","Dynamic license key injection via HTTP header and request body"],"authentication":"POP API License Key (provided via n8n Credential or per-operation field, sent as X-API-Key header)","commonUseCases":["Automated invoice generation in n8n workflows","Integration with Italian FatturaPA (SdI) systems","European Peppol network compliance","Centralized invoice management and delivery tracking"],"limitations":["Self-hosted POP deployments must support X-API-Key header for optimal functionality","Older POP deployments rely on body fallback which may not be preferred in all cases","License key must be managed securely and treated as a secret credential"],"relatedNodes":["n8n HTTP Request","n8n JSON","n8n Credentials"]}


node_type: n8n-nodes-memberpass.memberPass
package_name: n8n-nodes-memberpass
display_name: MemberPass
description: Manage MemberPass projects, plans, subscriptions, and members.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: envigo
author_github_url: https://github.com/envigoinnovations/memberpass-n8n.git
npm_package_name: n8n-nodes-memberpass
npm_version: 1.4.0
community_fetched_at: 2026-07-14T14:40:34.160Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "project",
      "options": [
        {
          "name": "Access Code",
          "value": "accessCode"
        },
        {
          "name": "Activity",
          "value": "activity"
        },
        {
          "name": "Analytics",
          "value": "analytics"
        },
        {
          "name": "Bot",
          "value": "bot"
        },
        {
          "name": "Distribution",
          "value": "distribution"
        },
        {
          "name": "Group",
          "value": "group"
        },
        {
          "name": "Member",
          "value": "member"
        },
        {
          "name": "Payment Method",
          "value": "paymentMethod"
        },
        {
          "name": "Plan",
          "value": "plan"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Resource",
          "value": "resource"
        },
        {
          "name": "Role",
          "value": "role"
        },
        {
          "name": "Subscriber",
          "value": "subscriber"
        },
        {
          "name": "Subscription",
          "value": "subscription"
        },
        {
          "name": "Team",
          "value": "team"
        },
        {
          "name": "Team Member",
          "value": "teamMember"
        },
        {
          "name": "Token",
          "value": "token"
        },
        {
          "name": "Webhook Delivery",
          "value": "webhookDelivery"
        },
        {
          "name": "Webhook Endpoint",
          "value": "webhookEndpoint"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Archive",
          "value": "archive",
          "action": "Archive a project",
          "description": "Soft-delete a project"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a project",
          "description": "Create a new project"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a project",
          "description": "Permanently delete a project"
        },
        {
          "name": "Find by Handle",
          "value": "findByHandle",
          "action": "Find a project by handle",
          "description": "Return the first project whose handle matches"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project",
          "description": "Fetch a project by UUID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List projects",
          "description": "List all projects visible to the current team"
        },
        {
          "name": "Restore",
          "value": "restore",
          "action": "Restore a project",
          "description": "Restore an archived project"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a project",
          "description": "Update an existing project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a plan",
          "description": "Create a subscription plan under a project"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a plan",
          "description": "Permanently delete a plan"
        },
        {
          "name": "Find by Name",
          "value": "findByName",
          "action": "Find a plan by name",
          "description": "Return the first plan whose name matches"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a plan",
          "description": "Fetch a plan by UUID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List plans",
          "description": "List all plans under a project"
        },
        {
          "name": "Publish",
          "value": "publish",
          "action": "Publish a plan",
          "description": "Make a plan publicly purchasable"
        },
        {
          "name": "Unpublish",
          "value": "unpublish",
          "action": "Unpublish a plan",
          "description": "Hide a plan from purchase"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a plan",
          "description": "Update plan attributes"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "plan"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "cancel",
      "options": [
        {
          "name": "Cancel",
          "value": "cancel",
          "action": "Cancel a subscription",
          "description": "Cancel a subscription immediately or at period end"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a subscription",
          "description": "Fetch a subscription by UUID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List subscriptions",
          "description": "List subscriptions filtered by status or plan"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "subscription"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "ban",
      "options": [
        {
          "name": "Ban",
          "value": "ban",
          "action": "Ban a member",
          "description": "Ban a member from the project community"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a member",
          "description": "Fetch a member by UUID"
        },
        {
          "name": "Kick",
          "value": "kick",
          "action": "Kick a member",
          "description": "Remove a member without a permanent ban"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List members",
          "description": "List members of a project"
        },
        {
          "name": "Unban",
          "value": "unban",
          "action": "Unban a member",
          "description": "Lift a previous ban"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "member"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "findByTelegramId",
      "options": [
        {
          "name": "Find by Telegram ID",
          "value": "findByTelegramId",
          "action": "Find a subscriber by telegram id",
          "description": "Return the subscriber whose Telegram user ID matches"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "subscriber"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "bulkGenerate",
      "options": [
        {
          "name": "Bulk Generate",
          "value": "bulkGenerate",
          "action": "Bulk generate access codes",
          "description": "Generate a batch of single-use access codes for a plan"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List access codes",
          "description": "List all access codes under a plan"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an access code",
          "description": "Revoke a single access code"
        },
        {
          "name": "Preview",
          "value": "preview",
          "action": "Preview access code generation",
          "description": "Dry-run generation to preview the codes that would be issued"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "accessCode"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a resource",
          "description": "Attach an external deliverable to a project"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a resource",
          "description": "Permanently delete a resource"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a resource",
          "description": "Fetch a resource by UUID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List resources",
          "description": "List all resources attached to a project"
        },
        {
          "name": "Unlink",
          "value": "unlink",
          "action": "Unlink a resource",
          "description": "Detach a resource from delivery without deleting it"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "resource"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List payment methods",
          "description": "List all payment methods for a project"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a payment method",
          "description": "Fetch a payment method by UUID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "paymentMethod"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a webhook endpoint",
          "description": "Register a new webhook endpoint"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a webhook endpoint",
          "description": "Remove a webhook endpoint"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List webhook endpoints",
          "description": "List all webhook endpoints for the current team"
        },
        {
          "name": "Rotate Secret",
          "value": "rotateSecret",
          "action": "Rotate the signing secret",
          "description": "Rotate the HMAC signing secret for a webhook endpoint"
        },
        {
          "name": "Test",
          "value": "test",
          "action": "Send a test delivery",
          "description": "Trigger a test delivery from MemberPass to the endpoint"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhookEndpoint"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List webhook deliveries",
          "description": "List recent webhook event deliveries by event type"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhookDelivery"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List API tokens",
          "description": "List all API tokens for the current team"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an API token",
          "description": "Fetch an API token by UUID"
        },
        {
          "name": "Revoke",
          "value": "revoke",
          "action": "Revoke an API token",
          "description": "Revoke an API token immediately"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "token"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List teams",
          "description": "List all teams the caller belongs to"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a team",
          "description": "Fetch a team by UUID"
        },
        {
          "name": "Get Current",
          "value": "getCurrent",
          "action": "Get the current team",
          "description": "Fetch the team that owns the API token"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "team"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List team members",
          "description": "List all members of a team"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a team member",
          "description": "Fetch a single team member"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "teamMember"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List roles",
          "description": "List all roles defined for the current team"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a role",
          "description": "Fetch a role by UUID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "role"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List groups",
          "description": "List all groups for the current team"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a group",
          "description": "Fetch a group by UUID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "group"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List activity log entries",
          "description": "List activity log entries for a subject"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "activity"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStatus",
      "options": [
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get bot status",
          "description": "Fetch the current bot connection status for a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "bot"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getBotLink",
      "options": [
        {
          "name": "Get Bot Link",
          "value": "getBotLink",
          "action": "Get bot link",
          "description": "Fetch the Telegram bot link for a project"
        },
        {
          "name": "Get Portal URL",
          "value": "getPortalUrl",
          "action": "Get portal URL",
          "description": "Fetch the public portal URL for a project"
        },
        {
          "name": "Get Deep Link",
          "value": "getDeepLink",
          "action": "Get a deep link",
          "description": "Generate a Telegram deep link targeting an access code, plan, or custom payload"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "distribution"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getDashboard",
      "options": [
        {
          "name": "Get Dashboard",
          "value": "getDashboard",
          "action": "Get dashboard analytics",
          "description": "Fetch aggregated dashboard metrics"
        },
        {
          "name": "Get Earnings",
          "value": "getEarnings",
          "action": "Get earnings analytics",
          "description": "Fetch earnings time-series data"
        },
        {
          "name": "Get Plan Performance",
          "value": "getPlanPerformance",
          "action": "Get plan performance",
          "description": "Fetch per-plan performance analytics for a project"
        },
        {
          "name": "Get Subscribers",
          "value": "getSubscribers",
          "action": "Get subscriber analytics",
          "description": "Fetch subscriber growth analytics"
        },
        {
          "name": "Get Transaction Breakdown",
          "value": "getTransactionBreakdown",
          "action": "Get transaction breakdown",
          "description": "Fetch a transaction breakdown by dimension"
        },
        {
          "name": "List Transactions",
          "value": "listTransactions",
          "action": "List transactions",
          "description": "List raw transactions for a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "analytics"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Archive",
      "value": "archive",
      "action": "Archive a project",
      "description": "Soft-delete a project",
      "resource": "project"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a project",
      "description": "Create a new project",
      "resource": "project"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a project",
      "description": "Permanently delete a project",
      "resource": "project"
    },
    {
      "name": "Find by Handle",
      "value": "findByHandle",
      "action": "Find a project by handle",
      "description": "Return the first project whose handle matches",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "description": "Fetch a project by UUID",
      "resource": "project"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List projects",
      "description": "List all projects visible to the current team",
      "resource": "project"
    },
    {
      "name": "Restore",
      "value": "restore",
      "action": "Restore a project",
      "description": "Restore an archived project",
      "resource": "project"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a project",
      "description": "Update an existing project",
      "resource": "project"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a plan",
      "description": "Create a subscription plan under a project",
      "resource": "plan"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a plan",
      "description": "Permanently delete a plan",
      "resource": "plan"
    },
    {
      "name": "Find by Name",
      "value": "findByName",
      "action": "Find a plan by name",
      "description": "Return the first plan whose name matches",
      "resource": "plan"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a plan",
      "description": "Fetch a plan by UUID",
      "resource": "plan"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List plans",
      "description": "List all plans under a project",
      "resource": "plan"
    },
    {
      "name": "Publish",
      "value": "publish",
      "action": "Publish a plan",
      "description": "Make a plan publicly purchasable",
      "resource": "plan"
    },
    {
      "name": "Unpublish",
      "value": "unpublish",
      "action": "Unpublish a plan",
      "description": "Hide a plan from purchase",
      "resource": "plan"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a plan",
      "description": "Update plan attributes",
      "resource": "plan"
    },
    {
      "name": "Cancel",
      "value": "cancel",
      "action": "Cancel a subscription",
      "description": "Cancel a subscription immediately or at period end",
      "resource": "subscription"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a subscription",
      "description": "Fetch a subscription by UUID",
      "resource": "subscription"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List subscriptions",
      "description": "List subscriptions filtered by status or plan",
      "resource": "subscription"
    },
    {
      "name": "Ban",
      "value": "ban",
      "action": "Ban a member",
      "description": "Ban a member from the project community",
      "resource": "member"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a member",
      "description": "Fetch a member by UUID",
      "resource": "member"
    },
    {
      "name": "Kick",
      "value": "kick",
      "action": "Kick a member",
      "description": "Remove a member without a permanent ban",
      "resource": "member"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List members",
      "description": "List members of a project",
      "resource": "member"
    },
    {
      "name": "Unban",
      "value": "unban",
      "action": "Unban a member",
      "description": "Lift a previous ban",
      "resource": "member"
    },
    {
      "name": "Find by Telegram ID",
      "value": "findByTelegramId",
      "action": "Find a subscriber by telegram id",
      "description": "Return the subscriber whose Telegram user ID matches",
      "resource": "subscriber"
    },
    {
      "name": "Bulk Generate",
      "value": "bulkGenerate",
      "action": "Bulk generate access codes",
      "description": "Generate a batch of single-use access codes for a plan",
      "resource": "accessCode"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List access codes",
      "description": "List all access codes under a plan",
      "resource": "accessCode"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an access code",
      "description": "Revoke a single access code",
      "resource": "accessCode"
    },
    {
      "name": "Preview",
      "value": "preview",
      "action": "Preview access code generation",
      "description": "Dry-run generation to preview the codes that would be issued",
      "resource": "accessCode"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a resource",
      "description": "Attach an external deliverable to a project",
      "resource": "resource"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a resource",
      "description": "Permanently delete a resource",
      "resource": "resource"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a resource",
      "description": "Fetch a resource by UUID",
      "resource": "resource"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List resources",
      "description": "List all resources attached to a project",
      "resource": "resource"
    },
    {
      "name": "Unlink",
      "value": "unlink",
      "action": "Unlink a resource",
      "description": "Detach a resource from delivery without deleting it",
      "resource": "resource"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List payment methods",
      "description": "List all payment methods for a project",
      "resource": "paymentMethod"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a payment method",
      "description": "Fetch a payment method by UUID",
      "resource": "paymentMethod"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a webhook endpoint",
      "description": "Register a new webhook endpoint",
      "resource": "webhookEndpoint"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a webhook endpoint",
      "description": "Remove a webhook endpoint",
      "resource": "webhookEndpoint"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List webhook endpoints",
      "description": "List all webhook endpoints for the current team",
      "resource": "webhookEndpoint"
    },
    {
      "name": "Rotate Secret",
      "value": "rotateSecret",
      "action": "Rotate the signing secret",
      "description": "Rotate the HMAC signing secret for a webhook endpoint",
      "resource": "webhookEndpoint"
    },
    {
      "name": "Test",
      "value": "test",
      "action": "Send a test delivery",
      "description": "Trigger a test delivery from MemberPass to the endpoint",
      "resource": "webhookEndpoint"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List webhook deliveries",
      "description": "List recent webhook event deliveries by event type",
      "resource": "webhookDelivery"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List API tokens",
      "description": "List all API tokens for the current team",
      "resource": "token"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an API token",
      "description": "Fetch an API token by UUID",
      "resource": "token"
    },
    {
      "name": "Revoke",
      "value": "revoke",
      "action": "Revoke an API token",
      "description": "Revoke an API token immediately",
      "resource": "token"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List teams",
      "description": "List all teams the caller belongs to",
      "resource": "team"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a team",
      "description": "Fetch a team by UUID",
      "resource": "team"
    },
    {
      "name": "Get Current",
      "value": "getCurrent",
      "action": "Get the current team",
      "description": "Fetch the team that owns the API token",
      "resource": "team"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List team members",
      "description": "List all members of a team",
      "resource": "teamMember"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a team member",
      "description": "Fetch a single team member",
      "resource": "teamMember"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List roles",
      "description": "List all roles defined for the current team",
      "resource": "role"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a role",
      "description": "Fetch a role by UUID",
      "resource": "role"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List groups",
      "description": "List all groups for the current team",
      "resource": "group"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a group",
      "description": "Fetch a group by UUID",
      "resource": "group"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List activity log entries",
      "description": "List activity log entries for a subject",
      "resource": "activity"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get bot status",
      "description": "Fetch the current bot connection status for a project",
      "resource": "bot"
    },
    {
      "name": "Get Bot Link",
      "value": "getBotLink",
      "action": "Get bot link",
      "description": "Fetch the Telegram bot link for a project",
      "resource": "distribution"
    },
    {
      "name": "Get Portal URL",
      "value": "getPortalUrl",
      "action": "Get portal URL",
      "description": "Fetch the public portal URL for a project",
      "resource": "distribution"
    },
    {
      "name": "Get Deep Link",
      "value": "getDeepLink",
      "action": "Get a deep link",
      "description": "Generate a Telegram deep link targeting an access code, plan, or custom payload",
      "resource": "distribution"
    },
    {
      "name": "Get Dashboard",
      "value": "getDashboard",
      "action": "Get dashboard analytics",
      "description": "Fetch aggregated dashboard metrics",
      "resource": "analytics"
    },
    {
      "name": "Get Earnings",
      "value": "getEarnings",
      "action": "Get earnings analytics",
      "description": "Fetch earnings time-series data",
      "resource": "analytics"
    },
    {
      "name": "Get Plan Performance",
      "value": "getPlanPerformance",
      "action": "Get plan performance",
      "description": "Fetch per-plan performance analytics for a project",
      "resource": "analytics"
    },
    {
      "name": "Get Subscribers",
      "value": "getSubscribers",
      "action": "Get subscriber analytics",
      "description": "Fetch subscriber growth analytics",
      "resource": "analytics"
    },
    {
      "name": "Get Transaction Breakdown",
      "value": "getTransactionBreakdown",
      "action": "Get transaction breakdown",
      "description": "Fetch a transaction breakdown by dimension",
      "resource": "analytics"
    },
    {
      "name": "List Transactions",
      "value": "listTransactions",
      "action": "List transactions",
      "description": "List raw transactions for a project",
      "resource": "analytics"
    }
  ]

npm_readme:
  # n8n-nodes-memberpass

  Community node for [n8n](https://n8n.io/) that drives [MemberPass](https://www.memberpass.net) — subscription + access-code monetisation for Telegram communities.

  Provides two nodes:

  - **MemberPass Trigger** — starts a workflow when a MemberPass event fires. Covers subscriptions, payments, members, access codes, plans, projects, project resources, bot connectivity, billing, groups, roles, teams, and team members (71 events total). Uses the `/v1/webhook-subscriptions` lifecycle and validates the `MP-Signature` HMAC on every request.
  - **MemberPass** — action node for every documented route on `api.memberpass.net`. Covers 19 resources across creator-facing surfaces (projects, plans, subscriptions, subscribers, members, access codes, resources, payment methods), admin surfaces (teams, team members, roles, groups, tokens, webhook endpoints, webhook deliveries, activity log), and read-only data surfaces (analytics, bot status, distribution links).

  ## Installation

  ### Community install (recommended)

  Inside n8n:

  1. **Settings → Community Nodes → Install**
  2. Enter `n8n-nodes-memberpass`
  3. Agree to the community-node warning and restart n8n

  ### Manual install (self-hosted)

  ```bash
  cd ~/.n8n/custom
  npm install n8n-nodes-memberpass
  ```

  Restart the n8n process after install.

  ## Setup

  1. Mint an API token at `https://app.memberpass.net/settings/tokens`. Every token is auto-bound to a team (`scope:team:<uuid>`); you pick the abilities it carries. See the [ability catalogue](https://docs.memberpass.net/api/abilities) for the full list. Minimums per use-case:
     - **Trigger node** — `webhook-endpoint:manage`. Restrict to a single project by also scoping the token to that project (`scope:project:<uuid>`).
     - **Read-only workflows** — combine `*:view` / `*:view-any` abilities for the resources you list or fetch (e.g. `project:view-any`, `project-subscription:view`, `project-subscription-plan:view`, `project-access-code:view-any`, `team-member:view-any`, `role:view`, `group:view`, `activity:read`, `dashboard:read`, `distribution:read`, `billing:read`).
     - **Write workflows** — add the matching `*:create` / `*:update` / `*:delete` abilities (e.g. `project:create`, `project-subscription-plan:update`, `project-access-code:create`, `project-resource:delete`). Cancelling a subscription is `project-subscription:update`; banning/kicking a member is `project-user:update`.
  2. In n8n, **Credentials → New → MemberPass API** and paste the `mpt_...` token. Leave the base URL at the default unless you are self-hosting.
  3. Add a **MemberPass Trigger** node, pick one or more events, optionally scope to a single project, and activate the workflow. On activation n8n registers the endpoint with MemberPass. Deactivating the workflow deletes the endpoint.

  ## Supported events (71)

  The full catalogue is defined in [`nodes/MemberPassTrigger/events.ts`](nodes/MemberPassTrigger/events.ts) and mirrors the [event reference](https://docs.memberpass.net/webhooks/event-reference).

  | Family           | Count | Events                                                                                                                                                                                                                                                                                                 |
  | ---------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
  | Subscription     | 16    | `subscription.created`, `subscription.activated`, `subscription.renewed`, `subscription.cancelled`, `subscription.expired`, `subscription.downgraded`, `subscription.upgraded`, `subscription.past_due`, `subscription.unpaid`, `subscription.paused`, `subscription.unpaused`, `subscription.reactivated`, `subscription.refunded`, `subscription.trial_started`, `subscription.trial_converting`, `subscription.trial_expired` |
  | Payment          | 4     | `payment.succeeded`, `payment.failed`, `payment.pending`, `payment.refunded`                                                                                                                                                                                                                           |
  | Member           | 10    | `member.joined`, `member.trial_joined`, `member.banned`, `member.unbanned`, `member.kicked`, `member.removed`, `member.churned`, `member.converted`, `member.resource_added`, `member.resource_removed`                                                                                                |
  | Access Code      | 3     | `access_code.generated`, `access_code.redeemed`, `access_code.expired`                                                                                                                                                                                                                                 |
  | Plan             | 6     | `plan.created`, `plan.updated`, `plan.activated`, `plan.deactivated`, `plan.deleted`, `plan.sync_completed`                                                                                                                                                                                            |
  | Project          | 7     | `project.created`, `project.updated`, `project.archived`, `project.restored`, `project.deleted`, `project.bot.connected`, `project.bot.disconnected`                                                                                                                                                   |
  | Project Resource | 4     | `project.resource.created`, `project.resource.linked`, `project.resource.unlinked`, `project.resource.deleted`                                                                                                                                                                                         |
  | Billing          | 9     | `billing.invoice_created`, `billing.invoice_paid`, `billing.invoice_overdue`, `billing.payment_failed`, `billing.grace_period_warning`, `billing.account_locked`, `billing.tier_upgraded`, `billing.tier_downgraded`, `billing.tier_cancelled`                                                          |
  | Group            | 3     | `group.created`, `group.updated`, `group.deleted`                                                                                                                                                                                                                                                      |
  | Role             | 3     | `role.created`, `role.updated`, `role.deleted`                                                                                                                                                                                                                                                         |
  | Team             | 2     | `team.created`, `team.deleted`                                                                                                                                                                                                                                                                         |
  | Team Member      | 4     | `team.member.invited`, `team.member.joined`, `team.member.removed`, `team.member.role_changed`                                                                                                                                                                                                         |

  ## Supported actions

  | Resource         | Operations                                                                                                          |
  | ---------------- | ------------------------------------------------------------------------------------------------------------------- |
  | Project          | Create, Update, Archive, Restore, Delete, List, Get, Find by Handle                                                 |
  | Plan             | Create, Update, Publish, Unpublish, Get, List, Delete, Find by Name                                                 |
  | Subscription     | Cancel, Get, List                                                                                                   |
  | Subscriber       | Find by Telegram ID                                                                                                 |
  | Member           | Ban, Unban, Kick, Get, List                                                                                         |
  | Access Code      | Bulk Generate, List, Delete, Preview                                                                                |
  | Resource         | Create, List, Get, Unlink, Delete                                                                                   |
  | Payment Method   | List, Get                                                                                                           |
  | Distribution     | Get Bot Link, Get Portal URL, Get Deep Link                                                                         |
  | Bot              | Get Status                                                                                                          |
  | Analytics        | Get Dashboard, Get Earnings, Get Subscribers, Get Transaction Breakdown, Get Plan Performance, List Transactions    |
  | Activity         | List                                                                                                                |
  | Team             | List, Get, Get Current                                                                                              |
  | Team Member      | List, Get                                                                                                           |
  | Role             | List, Get                                                                                                           |
  | Group            | List, Get                                                                                                           |
  | Token            | List, Get, Revoke                                                                                                   |
  | Webhook Endpoint | List, Create, Delete, Rotate Secret, Test                                                                           |
  | Webhook Delivery | List                                                                                                                |

  Every mutation automatically sends a fresh `Idempotency-Key` header so node re-runs never double-fire.

  ## Development

  ```bash
  npm install
  npm run build    # compile TS + copy icons
  npm run dev      # watch mode
  npm run lint
  ```

  To test against a local n8n:

  ```bash
  npm link
  cd ~/.n8n/custom
  npm link n8n-nodes-memberpass
  n8n start
  ```

  ## Links

  - [MemberPass documentation](https://docs.memberpass.net)
  - [n8n integration guide](https://docs.memberpass.net/integrations/n8n)
  - [API reference](https://docs.memberpass.net/api)
  - [Event reference](https://docs.memberpass.net/webhooks/event-reference)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community n8n node that manages MemberPass projects, plans, subscriptions, and members, offering both event-driven triggers and API action nodes for subscription-based Telegram community monetization.","capabilities":["Webhook trigger for 71 MemberPass lifecycle events (subscriptions, payments, members, access codes, plans, projects)","API action node for 19 resources (creator-facing, admin, and read-only surfaces)","HMAC signature validation for webhook requests","Management of projects, plans, subscriptions, subscribers, members, access codes, resources, payment methods","Management of admin surfaces (teams, team members, roles, groups, tokens, webhooks, activity logs)","Access to analytics, bot status, and distribution links","Support for create, update, and delete operations on MemberPass resources"],"authentication":"API Token (mpt_...) obtained from MemberPass app settings; requires specific ability scopes (e.g., webhook-endpoint:manage, view, create, update, delete)","commonUseCases":["Automated workflow triggers for subscription lifecycle events (e.g., new subscription, cancellation, renewal)","Member management automation (e.g., banning, kicking, adding resources upon join)","Access code generation and redemption tracking","Project and plan updates via API","Webhook endpoint registration and management for n8n"],"limitations":["Community node (requires manual installation for self-hosted setups)","Requires specific API token abilities configured in MemberPass app","Read-only workflows require specific view abilities; write workflows require create/update/delete abilities"],"relatedNodes":["n8n-nodes-webhook","n8n-nodes-credentialManager","n8n-nodes-code"]}


node_type: n8n-nodes-memberpass.memberPassTrigger
package_name: n8n-nodes-memberpass
display_name: MemberPass 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: envigo
author_github_url: https://github.com/envigoinnovations/memberpass-n8n.git
npm_package_name: n8n-nodes-memberpass
npm_version: 1.4.0
community_fetched_at: 2026-07-14T14:40:34.161Z
ai_summary_generated_at: 2026-05-22 10:26:01
description:
  Starts a workflow when a MemberPass event fires (subscription, payment, member, access code, plan, project).

npm_readme:
  # n8n-nodes-memberpass

  Community node for [n8n](https://n8n.io/) that drives [MemberPass](https://www.memberpass.net) — subscription + access-code monetisation for Telegram communities.

  Provides two nodes:

  - **MemberPass Trigger** — starts a workflow when a MemberPass event fires. Covers subscriptions, payments, members, access codes, plans, projects, project resources, bot connectivity, billing, groups, roles, teams, and team members (71 events total). Uses the `/v1/webhook-subscriptions` lifecycle and validates the `MP-Signature` HMAC on every request.
  - **MemberPass** — action node for every documented route on `api.memberpass.net`. Covers 19 resources across creator-facing surfaces (projects, plans, subscriptions, subscribers, members, access codes, resources, payment methods), admin surfaces (teams, team members, roles, groups, tokens, webhook endpoints, webhook deliveries, activity log), and read-only data surfaces (analytics, bot status, distribution links).

  ## Installation

  ### Community install (recommended)

  Inside n8n:

  1. **Settings → Community Nodes → Install**
  2. Enter `n8n-nodes-memberpass`
  3. Agree to the community-node warning and restart n8n

  ### Manual install (self-hosted)

  ```bash
  cd ~/.n8n/custom
  npm install n8n-nodes-memberpass
  ```

  Restart the n8n process after install.

  ## Setup

  1. Mint an API token at `https://app.memberpass.net/settings/tokens`. Every token is auto-bound to a team (`scope:team:<uuid>`); you pick the abilities it carries. See the [ability catalogue](https://docs.memberpass.net/api/abilities) for the full list. Minimums per use-case:
     - **Trigger node** — `webhook-endpoint:manage`. Restrict to a single project by also scoping the token to that project (`scope:project:<uuid>`).
     - **Read-only workflows** — combine `*:view` / `*:view-any` abilities for the resources you list or fetch (e.g. `project:view-any`, `project-subscription:view`, `project-subscription-plan:view`, `project-access-code:view-any`, `team-member:view-any`, `role:view`, `group:view`, `activity:read`, `dashboard:read`, `distribution:read`, `billing:read`).
     - **Write workflows** — add the matching `*:create` / `*:update` / `*:delete` abilities (e.g. `project:create`, `project-subscription-plan:update`, `project-access-code:create`, `project-resource:delete`). Cancelling a subscription is `project-subscription:update`; banning/kicking a member is `project-user:update`.
  2. In n8n, **Credentials → New → MemberPass API** and paste the `mpt_...` token. Leave the base URL at the default unless you are self-hosting.
  3. Add a **MemberPass Trigger** node, pick one or more events, optionally scope to a single project, and activate the workflow. On activation n8n registers the endpoint with MemberPass. Deactivating the workflow deletes the endpoint.

  ## Supported events (71)

  The full catalogue is defined in [`nodes/MemberPassTrigger/events.ts`](nodes/MemberPassTrigger/events.ts) and mirrors the [event reference](https://docs.memberpass.net/webhooks/event-reference).

  | Family           | Count | Events                                                                                                                                                                                                                                                                                                 |
  | ---------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
  | Subscription     | 16    | `subscription.created`, `subscription.activated`, `subscription.renewed`, `subscription.cancelled`, `subscription.expired`, `subscription.downgraded`, `subscription.upgraded`, `subscription.past_due`, `subscription.unpaid`, `subscription.paused`, `subscription.unpaused`, `subscription.reactivated`, `subscription.refunded`, `subscription.trial_started`, `subscription.trial_converting`, `subscription.trial_expired` |
  | Payment          | 4     | `payment.succeeded`, `payment.failed`, `payment.pending`, `payment.refunded`                                                                                                                                                                                                                           |
  | Member           | 10    | `member.joined`, `member.trial_joined`, `member.banned`, `member.unbanned`, `member.kicked`, `member.removed`, `member.churned`, `member.converted`, `member.resource_added`, `member.resource_removed`                                                                                                |
  | Access Code      | 3     | `access_code.generated`, `access_code.redeemed`, `access_code.expired`                                                                                                                                                                                                                                 |
  | Plan             | 6     | `plan.created`, `plan.updated`, `plan.activated`, `plan.deactivated`, `plan.deleted`, `plan.sync_completed`                                                                                                                                                                                            |
  | Project          | 7     | `project.created`, `project.updated`, `project.archived`, `project.restored`, `project.deleted`, `project.bot.connected`, `project.bot.disconnected`                                                                                                                                                   |
  | Project Resource | 4     | `project.resource.created`, `project.resource.linked`, `project.resource.unlinked`, `project.resource.deleted`                                                                                                                                                                                         |
  | Billing          | 9     | `billing.invoice_created`, `billing.invoice_paid`, `billing.invoice_overdue`, `billing.payment_failed`, `billing.grace_period_warning`, `billing.account_locked`, `billing.tier_upgraded`, `billing.tier_downgraded`, `billing.tier_cancelled`                                                          |
  | Group            | 3     | `group.created`, `group.updated`, `group.deleted`                                                                                                                                                                                                                                                      |
  | Role             | 3     | `role.created`, `role.updated`, `role.deleted`                                                                                                                                                                                                                                                         |
  | Team             | 2     | `team.created`, `team.deleted`                                                                                                                                                                                                                                                                         |
  | Team Member      | 4     | `team.member.invited`, `team.member.joined`, `team.member.removed`, `team.member.role_changed`                                                                                                                                                                                                         |

  ## Supported actions

  | Resource         | Operations                                                                                                          |
  | ---------------- | ------------------------------------------------------------------------------------------------------------------- |
  | Project          | Create, Update, Archive, Restore, Delete, List, Get, Find by Handle                                                 |
  | Plan             | Create, Update, Publish, Unpublish, Get, List, Delete, Find by Name                                                 |
  | Subscription     | Cancel, Get, List                                                                                                   |
  | Subscriber       | Find by Telegram ID                                                                                                 |
  | Member           | Ban, Unban, Kick, Get, List                                                                                         |
  | Access Code      | Bulk Generate, List, Delete, Preview                                                                                |
  | Resource         | Create, List, Get, Unlink, Delete                                                                                   |
  | Payment Method   | List, Get                                                                                                           |
  | Distribution     | Get Bot Link, Get Portal URL, Get Deep Link                                                                         |
  | Bot              | Get Status                                                                                                          |
  | Analytics        | Get Dashboard, Get Earnings, Get Subscribers, Get Transaction Breakdown, Get Plan Performance, List Transactions    |
  | Activity         | List                                                                                                                |
  | Team             | List, Get, Get Current                                                                                              |
  | Team Member      | List, Get                                                                                                           |
  | Role             | List, Get                                                                                                           |
  | Group            | List, Get                                                                                                           |
  | Token            | List, Get, Revoke                                                                                                   |
  | Webhook Endpoint | List, Create, Delete, Rotate Secret, Test                                                                           |
  | Webhook Delivery | List                                                                                                                |

  Every mutation automatically sends a fresh `Idempotency-Key` header so node re-runs never double-fire.

  ## Development

  ```bash
  npm install
  npm run build    # compile TS + copy icons
  npm run dev      # watch mode
  npm run lint
  ```

  To test against a local n8n:

  ```bash
  npm link
  cd ~/.n8n/custom
  npm link n8n-nodes-memberpass
  n8n start
  ```

  ## Links

  - [MemberPass documentation](https://docs.memberpass.net)
  - [n8n integration guide](https://docs.memberpass.net/integrations/n8n)
  - [API reference](https://docs.memberpass.net/api)
  - [Event reference](https://docs.memberpass.net/webhooks/event-reference)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"The MemberPass Trigger node starts an n8n workflow when specific MemberPass events occur, such as subscription changes, payments, member actions, or access code usage.","capabilities":["Monitors 71 specific MemberPass events including subscriptions, payments, members, access codes, plans, and projects","Validates HMAC signatures via MP-Signature on every incoming request","Supports filtering events by specific project scope","Automatically registers and deregisters webhook endpoints with MemberPass based on workflow activation/deactivation","Triggers on lifecycle events like subscription creation, renewal, cancellation, and payment success/failure"],"authentication":"API token required (mpt_... format obtained from MemberPass dashboard)","commonUseCases":["Automatically create or update Telegram bots when new members join","Send welcome emails or onboarding tasks when a subscription is activated","Trigger content release when a member redeems an access code","Handle payment failures or refunds by notifying the creator","Manage project resources or templates when a new member is added"],"limitations":["Requires manual token creation and ability selection in the MemberPass dashboard","Only supports community installation via n8n's node marketplace or manual npm install","Limited to events that trigger via the /v1/webhook-subscriptions lifecycle endpoint"],"relatedNodes":["MemberPass Action Node","Webhook Trigger","Telegram Bot Node","Email Node"]}


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

updated_at: 2026-07-14 14:40:34
author_name: newsman
author_github_url: https://github.com/Newsman/
npm_package_name: n8n-nodes-newsmanapp
npm_version: 0.1.21
community_fetched_at: 2026-07-14T14:40:34.162Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "getLists",
      "options": [
        {
          "name": "Get Lists",
          "value": "getLists"
        },
        {
          "name": "Get Subscriber",
          "value": "getSubscriberByEmail"
        },
        {
          "name": "Get Segments",
          "value": "getSegments"
        },
        {
          "name": "Add Subscriber to Segment",
          "value": "addSegmentSubscriber"
        },
        {
          "name": "Add Subscriber to Segment by Email",
          "value": "addSegmentSubscriberByEmail"
        },
        {
          "name": "Create or Update Subscriber",
          "value": "saveSubscribe"
        },
        {
          "name": "Add Tag to Subscriber",
          "value": "subscriberAddTag"
        },
        {
          "name": "Send Transactional Message",
          "value": "messageSend"
        },
        {
          "name": "Get SMS Lists",
          "value": "smsLists"
        },
        {
          "name": "Create or Update SMS Subscriber",
          "value": "smsSaveSubscribe"
        },
        {
          "name": "Send SMS",
          "value": "smsSendOne"
        }
      ],
      "displayName": "Operation"
    }
  ]

operations:
  [
    {
      "name": "Get Lists",
      "value": "getLists"
    },
    {
      "name": "Get Subscriber",
      "value": "getSubscriberByEmail"
    },
    {
      "name": "Get Segments",
      "value": "getSegments"
    },
    {
      "name": "Add Subscriber to Segment",
      "value": "addSegmentSubscriber"
    },
    {
      "name": "Add Subscriber to Segment by Email",
      "value": "addSegmentSubscriberByEmail"
    },
    {
      "name": "Create or Update Subscriber",
      "value": "saveSubscribe"
    },
    {
      "name": "Add Tag to Subscriber",
      "value": "subscriberAddTag"
    },
    {
      "name": "Send Transactional Message",
      "value": "messageSend"
    },
    {
      "name": "Get SMS Lists",
      "value": "smsLists"
    },
    {
      "name": "Create or Update SMS Subscriber",
      "value": "smsSaveSubscribe"
    },
    {
      "name": "Send SMS",
      "value": "smsSendOne"
    }
  ]

npm_readme:
  # n8n-nodes-newsmanapp

  NewsMAN community node for n8n.

  Use this node to manage subscribers and segments, send transactional emails, and send SMS through NewsMAN API v1.2.

  ## Features

  - Lists: get available email and SMS lists
  - Subscribers: get by email, create or update, add tags
  - Segments: get segments, add subscriber to segment
  - Transactional: send one message to many recipients in a single API call
  - SMS: subscribe contacts and send one-off SMS messages

  ## Compatibility

  - n8n: tested on self-hosted n8n 2.x
  - Node.js: 22+ recommended for local development and publishing
  - NewsMAN API: `https://ssl.newsman.app/api/1.2/rest/{userId}/{apiKey}/`

  ## Install

  ### n8n Community Nodes UI

  Install package:

  `n8n-nodes-newsmanapp`

  ### Manual / self-hosted

  ```bash
  npm install n8n-nodes-newsmanapp
  ```

  Then restart n8n.

  ## Credentials

  Create **NewsMAN API** credentials in n8n:

  - `User ID`
  - `API Key`

  ## Quick Start

  Example flow for transactional email:

  1. Prepare recipient rows in a previous node (for example Edit Fields), one recipient per item:
     - `email` (required)
     - `name` (optional)
     - `params` (optional object)
  2. Add **NewsMAN** node and choose **Send Transactional Message**.
  3. Set **Recipients Source** to **From Previous Items (Single API Call)**.
  4. Configure sender fields, subject, and HTML.
  5. Execute the node.

  ## Transactional Recipients Modes

  For **Send Transactional Message**, choose one mode:

  - **From Previous Items (Single API Call)**: use all incoming items as recipients in one API call
  - **From Expression (JSON Array)**: provide an expression that resolves to an array
  - **Manual JSON**: provide the recipients array directly in the field

  Recipient object format:

  ```json
  {
    "email": "recipient@example.com",
    "name": "Recipient Name",
    "params": {
      "name": "Recipient Name"
    }
  }
  ```

  ## Operations

  ### Lists

  - `Get Lists` -> `list.all`
  - `Get SMS Lists` -> `sms.lists`

  ### Subscribers

  - `Get Subscriber` -> `subscriber.getByEmail`
  - `Create or Update Subscriber` -> `subscriber.saveSubscribe`
  - `Add Tag to Subscriber` -> `subscriber.addTag`
  - `Create or Update SMS Subscriber` -> `sms.saveSubscribe`

  ### Segments

  - `Get Segments` -> `segment.all`
  - `Add Subscriber to Segment` -> `segment.addSubscriber`
  - `Add Subscriber to Segment by Email` -> `subscriber.getByEmail` + `segment.addSubscriber`

  ### Messaging

  - `Send Transactional Message` -> `transactional.messageSend`
  - `Send SMS` -> `sms.sendone`

  ## Output Notes

  - `Create or Update Subscriber` and `Create or Update SMS Subscriber` normalize scalar responses to:
    - `{ "subscriber_id": <id> }`
  - `Add Tag to Subscriber` normalizes boolean responses to:
    - `{ "success": true | false }`

  This helps downstream expressions like:

  `{{$json.subscriber_id}}`

  ## Development

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

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community node for n8n that enables interaction with the NewsMAN API v1.2 to manage email and SMS subscribers, segments, and send transactional messages.","capabilities":["List available email and SMS lists","Get, create, or update email subscribers by email","Add tags to email subscribers","Manage SMS subscribers (subscribe and update)","Get and manage segments","Add subscribers to segments","Send transactional email messages to multiple recipients in a single API call","Send one-off SMS messages"],"authentication":"API Key required (User ID and API Key)","commonUseCases":["Sending bulk transactional emails to customer lists","Managing user segmentation for targeted campaigns","Sending promotional or transactional SMS notifications","Automating subscriber onboarding and tagging workflows"],"limitations":["Compatible only with n8n 2.x (self-hosted)","Node.js 22+ recommended for local development"],"relatedNodes":["Edit Fields","Function","JSON"]}


node_type: n8n-nodes-centovacast.centovaCast
package_name: n8n-nodes-centovacast
display_name: Centova Cast
description: Manage Centova Cast streaming servers via the JSON 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-centovacast
npm_version: 0.2.3
community_fetched_at: 2026-07-14T14:40:34.163Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "server",
      "options": [
        {
          "name": "Server",
          "value": "server",
          "description": "Manage individual streaming server accounts"
        },
        {
          "name": "System",
          "value": "system",
          "description": "System-wide administration operations"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getstatus",
      "options": [
        {
          "name": "Archive Logs",
          "value": "archivelogs",
          "action": "Archive logs",
          "description": "Archive logs for the account"
        },
        {
          "name": "Authenticate",
          "value": "authenticate",
          "action": "Authenticate",
          "description": "Test whether credentials are valid"
        },
        {
          "name": "Copy File",
          "value": "copyfile",
          "action": "Copy file",
          "description": "Copy a file into the account spool directory"
        },
        {
          "name": "Enabled",
          "value": "enabled",
          "action": "Get enabled state",
          "description": "Get basic account state information"
        },
        {
          "name": "Get Account",
          "value": "getaccount",
          "action": "Get account",
          "description": "Retrieve account configuration"
        },
        {
          "name": "Get Listeners",
          "value": "getlisteners",
          "action": "Get listeners",
          "description": "Get current listeners"
        },
        {
          "name": "Get Logs",
          "value": "getlogs",
          "action": "Get logs",
          "description": "Retrieve streaming server logs"
        },
        {
          "name": "Get Songs",
          "value": "getsongs",
          "action": "Get songs",
          "description": "Get recently played tracks"
        },
        {
          "name": "Get Status",
          "value": "getstatus",
          "action": "Get status",
          "description": "Retrieve streaming server status"
        },
        {
          "name": "Manage DJ",
          "value": "managedj",
          "action": "Manage DJ",
          "description": "Create, update, remove, or list DJ accounts"
        },
        {
          "name": "Next Song",
          "value": "nextsong",
          "action": "Next song",
          "description": "Skip to next song in autoDJ"
        },
        {
          "name": "Playlist",
          "value": "playlist",
          "action": "Manage playlist",
          "description": "Manage playlists (activate, deactivate, add, remove, list)"
        },
        {
          "name": "Reconfigure",
          "value": "reconfigure",
          "action": "Reconfigure",
          "description": "Update account settings"
        },
        {
          "name": "Refresh Disk Usage",
          "value": "refreshdiskusage",
          "action": "Refresh disk usage",
          "description": "Update disk usage stats"
        },
        {
          "name": "Reindex",
          "value": "reindex",
          "action": "Reindex",
          "description": "Update autoDJ media library"
        },
        {
          "name": "Reload",
          "value": "reload",
          "action": "Reload",
          "description": "Reload server config without disconnecting listeners"
        },
        {
          "name": "Report",
          "value": "report",
          "action": "Generate report",
          "description": "Generate a track/royalty report"
        },
        {
          "name": "Restart",
          "value": "restart",
          "action": "Restart",
          "description": "Restart the streaming server"
        },
        {
          "name": "Start",
          "value": "start",
          "action": "Start",
          "description": "Start the streaming server"
        },
        {
          "name": "Stop",
          "value": "stop",
          "action": "Stop",
          "description": "Stop the streaming server"
        },
        {
          "name": "Switch Source",
          "value": "switchsource",
          "action": "Switch source",
          "description": "Activate or deactivate the autoDJ"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "server"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listaccounts",
      "options": [
        {
          "name": "App Change",
          "value": "appchange",
          "action": "App change",
          "description": "Change software applications for an account (experimental)"
        },
        {
          "name": "Backup",
          "value": "backup",
          "action": "Backup",
          "description": "Create a complete account backup"
        },
        {
          "name": "Batch",
          "value": "batch",
          "action": "Batch",
          "description": "Run a method on one or more accounts"
        },
        {
          "name": "Check",
          "value": "check",
          "action": "Check",
          "description": "Check accounts for outages and restart if needed"
        },
        {
          "name": "Database",
          "value": "database",
          "action": "Database",
          "description": "Import or export account database"
        },
        {
          "name": "Info",
          "value": "info",
          "action": "Info",
          "description": "Get state (up/down) of accounts"
        },
        {
          "name": "List Accounts",
          "value": "listaccounts",
          "action": "List accounts",
          "description": "List all accounts"
        },
        {
          "name": "List Hosts",
          "value": "listhosts",
          "action": "List hosts",
          "description": "List all hosting servers"
        },
        {
          "name": "List Regions",
          "value": "listregions",
          "action": "List regions",
          "description": "List all regions"
        },
        {
          "name": "Process Logs",
          "value": "processlogs",
          "action": "Process logs",
          "description": "Process and rotate log files"
        },
        {
          "name": "Provision",
          "value": "provision",
          "action": "Provision",
          "description": "Create a new streaming server account"
        },
        {
          "name": "Rename",
          "value": "rename",
          "action": "Rename",
          "description": "Change account username"
        },
        {
          "name": "Reparent",
          "value": "reparent",
          "action": "Reparent",
          "description": "Move account to another reseller"
        },
        {
          "name": "Restore",
          "value": "restore",
          "action": "Restore",
          "description": "Restore an account backup"
        },
        {
          "name": "Sanity Check",
          "value": "sanitycheck",
          "action": "Sanity check",
          "description": "Test communication with Centova Cast"
        },
        {
          "name": "Set Status",
          "value": "setstatus",
          "action": "Set status",
          "description": "Enable or disable an account"
        },
        {
          "name": "Terminate",
          "value": "terminate",
          "action": "Terminate",
          "description": "Permanently remove an account"
        },
        {
          "name": "Usage",
          "value": "usage",
          "action": "Usage",
          "description": "Get resource utilization of accounts"
        },
        {
          "name": "Version",
          "value": "version",
          "action": "Version",
          "description": "Get Centova Cast version info"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "system"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Archive Logs",
      "value": "archivelogs",
      "action": "Archive logs",
      "description": "Archive logs for the account",
      "resource": "server"
    },
    {
      "name": "Authenticate",
      "value": "authenticate",
      "action": "Authenticate",
      "description": "Test whether credentials are valid",
      "resource": "server"
    },
    {
      "name": "Copy File",
      "value": "copyfile",
      "action": "Copy file",
      "description": "Copy a file into the account spool directory",
      "resource": "server"
    },
    {
      "name": "Enabled",
      "value": "enabled",
      "action": "Get enabled state",
      "description": "Get basic account state information",
      "resource": "server"
    },
    {
      "name": "Get Account",
      "value": "getaccount",
      "action": "Get account",
      "description": "Retrieve account configuration",
      "resource": "server"
    },
    {
      "name": "Get Listeners",
      "value": "getlisteners",
      "action": "Get listeners",
      "description": "Get current listeners",
      "resource": "server"
    },
    {
      "name": "Get Logs",
      "value": "getlogs",
      "action": "Get logs",
      "description": "Retrieve streaming server logs",
      "resource": "server"
    },
    {
      "name": "Get Songs",
      "value": "getsongs",
      "action": "Get songs",
      "description": "Get recently played tracks",
      "resource": "server"
    },
    {
      "name": "Get Status",
      "value": "getstatus",
      "action": "Get status",
      "description": "Retrieve streaming server status",
      "resource": "server"
    },
    {
      "name": "Manage DJ",
      "value": "managedj",
      "action": "Manage DJ",
      "description": "Create, update, remove, or list DJ accounts",
      "resource": "server"
    },
    {
      "name": "Next Song",
      "value": "nextsong",
      "action": "Next song",
      "description": "Skip to next song in autoDJ",
      "resource": "server"
    },
    {
      "name": "Playlist",
      "value": "playlist",
      "action": "Manage playlist",
      "description": "Manage playlists (activate, deactivate, add, remove, list)",
      "resource": "server"
    },
    {
      "name": "Reconfigure",
      "value": "reconfigure",
      "action": "Reconfigure",
      "description": "Update account settings",
      "resource": "server"
    },
    {
      "name": "Refresh Disk Usage",
      "value": "refreshdiskusage",
      "action": "Refresh disk usage",
      "description": "Update disk usage stats",
      "resource": "server"
    },
    {
      "name": "Reindex",
      "value": "reindex",
      "action": "Reindex",
      "description": "Update autoDJ media library",
      "resource": "server"
    },
    {
      "name": "Reload",
      "value": "reload",
      "action": "Reload",
      "description": "Reload server config without disconnecting listeners",
      "resource": "server"
    },
    {
      "name": "Report",
      "value": "report",
      "action": "Generate report",
      "description": "Generate a track/royalty report",
      "resource": "server"
    },
    {
      "name": "Restart",
      "value": "restart",
      "action": "Restart",
      "description": "Restart the streaming server",
      "resource": "server"
    },
    {
      "name": "Start",
      "value": "start",
      "action": "Start",
      "description": "Start the streaming server",
      "resource": "server"
    },
    {
      "name": "Stop",
      "value": "stop",
      "action": "Stop",
      "description": "Stop the streaming server",
      "resource": "server"
    },
    {
      "name": "Switch Source",
      "value": "switchsource",
      "action": "Switch source",
      "description": "Activate or deactivate the autoDJ",
      "resource": "server"
    },
    {
      "name": "App Change",
      "value": "appchange",
      "action": "App change",
      "description": "Change software applications for an account (experimental)",
      "resource": "system"
    },
    {
      "name": "Backup",
      "value": "backup",
      "action": "Backup",
      "description": "Create a complete account backup",
      "resource": "system"
    },
    {
      "name": "Batch",
      "value": "batch",
      "action": "Batch",
      "description": "Run a method on one or more accounts",
      "resource": "system"
    },
    {
      "name": "Check",
      "value": "check",
      "action": "Check",
      "description": "Check accounts for outages and restart if needed",
      "resource": "system"
    },
    {
      "name": "Database",
      "value": "database",
      "action": "Database",
      "description": "Import or export account database",
      "resource": "system"
    },
    {
      "name": "Info",
      "value": "info",
      "action": "Info",
      "description": "Get state (up/down) of accounts",
      "resource": "system"
    },
    {
      "name": "List Accounts",
      "value": "listaccounts",
      "action": "List accounts",
      "description": "List all accounts",
      "resource": "system"
    },
    {
      "name": "List Hosts",
      "value": "listhosts",
      "action": "List hosts",
      "description": "List all hosting servers",
      "resource": "system"
    },
    {
      "name": "List Regions",
      "value": "listregions",
      "action": "List regions",
      "description": "List all regions",
      "resource": "system"
    },
    {
      "name": "Process Logs",
      "value": "processlogs",
      "action": "Process logs",
      "description": "Process and rotate log files",
      "resource": "system"
    },
    {
      "name": "Provision",
      "value": "provision",
      "action": "Provision",
      "description": "Create a new streaming server account",
      "resource": "system"
    },
    {
      "name": "Rename",
      "value": "rename",
      "action": "Rename",
      "description": "Change account username",
      "resource": "system"
    },
    {
      "name": "Reparent",
      "value": "reparent",
      "action": "Reparent",
      "description": "Move account to another reseller",
      "resource": "system"
    },
    {
      "name": "Restore",
      "value": "restore",
      "action": "Restore",
      "description": "Restore an account backup",
      "resource": "system"
    },
    {
      "name": "Sanity Check",
      "value": "sanitycheck",
      "action": "Sanity check",
      "description": "Test communication with Centova Cast",
      "resource": "system"
    },
    {
      "name": "Set Status",
      "value": "setstatus",
      "action": "Set status",
      "description": "Enable or disable an account",
      "resource": "system"
    },
    {
      "name": "Terminate",
      "value": "terminate",
      "action": "Terminate",
      "description": "Permanently remove an account",
      "resource": "system"
    },
    {
      "name": "Usage",
      "value": "usage",
      "action": "Usage",
      "description": "Get resource utilization of accounts",
      "resource": "system"
    },
    {
      "name": "Version",
      "value": "version",
      "action": "Version",
      "description": "Get Centova Cast version info",
      "resource": "system"
    }
  ]

npm_readme:
  # n8n-nodes-centovacast

  This is an [n8n](https://n8n.io/) community node that lets you manage [Centova Cast](https://centova.com/) streaming servers directly from your n8n workflows.

  Centova Cast is a web-based control panel for internet radio stations that supports SHOUTcast, Icecast, and other streaming server software.

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

  ## Table of Contents

  - [Installation](#installation)
    - [Community Nodes (Recommended)](#community-nodes-recommended)
    - [Docker Installation](#docker-installation)
    - [Building from Source](#building-from-source)
  - [Credentials](#credentials)
  - [Operations](#operations)
    - [Server Operations](#server-operations)
    - [System Operations](#system-operations)
  - [Usage Examples](#usage-examples)
  - [API Reference](#api-reference)
  - [License](#license)

  ## Installation

  ### Community Nodes (Recommended)

  1. Open your n8n instance
  2. Go to **Settings** > **Community Nodes**
  3. Click **Install a community node**
  4. Enter `n8n-nodes-centovacast` and click **Install**
  5. The node will be available immediately — no restart required

  > **Note:** Community Nodes is available from n8n version 0.187.0 and above.

  ### Docker Installation

  If you are running n8n in Docker, follow these steps:

  **1. Build the package (if not already built)**

  ```bash
  git clone https://github.com/Sakretsos/n8n-nodes-centovacast.git
  cd n8n-nodes-centovacast
  npm install
  npm run build
  npm pack
  ```

  This will create a `n8n-nodes-centovacast-0.2.0.tgz` file.

  **2. Install into your n8n Docker container**

  ```bash
  # Create the target directory (first time only)
  docker exec -it n8n sh -c "mkdir -p /home/node/.n8n/custom/node_modules/n8n-nodes-centovacast"

  # Copy the tgz into the container
  docker cp n8n-nodes-centovacast-0.2.0.tgz n8n:/tmp/

  # Extract and install
  docker exec -it n8n sh -c "cd /tmp && tar xzf n8n-nodes-centovacast-0.2.0.tgz && cp -r package/* /home/node/.n8n/custom/node_modules/n8n-nodes-centovacast/"

  # Restart n8n to load the new node
  docker restart n8n
  ```

  > **Note:** Replace `n8n` with your actual n8n container name. You can find it with `docker ps`.

  **3. Updating to a new version**

  ```bash
  # Clear the old version
  docker exec -it n8n sh -c "rm -rf /home/node/.n8n/custom/node_modules/n8n-nodes-centovacast/*"

  # Copy and extract the new tgz
  docker cp n8n-nodes-centovacast-0.2.0.tgz n8n:/tmp/
  docker exec -it n8n sh -c "cd /tmp && tar xzf n8n-nodes-centovacast-0.2.0.tgz && cp -r package/* /home/node/.n8n/custom/node_modules/n8n-nodes-centovacast/"

  # Restart n8n
  docker restart n8n
  ```

  ### Building from Source

  ```bash
  # Clone the repository
  git clone https://github.com/Sakretsos/n8n-nodes-centovacast.git
  cd n8n-nodes-centovacast

  # Install dependencies
  npm install

  # Build the project
  npm run build

  # Create the tgz package
  npm pack
  ```

  ### Development

  To watch for changes during development:

  ```bash
  npm run dev
  ```

  ## Credentials

  To use this node, you need to configure the **Centova Cast API** credentials in n8n:

  | Field | Description | Example |
  |-------|-------------|---------|
  | **Base URL** | The URL of your Centova Cast panel | `https://panel.example.com:2199` |
  | **Username** | Your admin or account username | `admin` |
  | **Password** | Your admin or account password | `yourpassword` |

  > **Tip:** For **Server** operations, the credentials password is used to authenticate against the target account. For **System** operations, the admin password is required.

  ## Operations

  ### Server Operations

  Operations for managing individual streaming server accounts.

  | Operation | Description |
  |-----------|-------------|
  | **Get Account** | Retrieve account configuration and autoDJ settings |
  | **Get Status** | Get streaming server status (listeners, bitrate, state) |
  | **Get Songs** | Get recently played tracks |
  | **Get Listeners** | Get currently connected listeners |
  | **Get Logs** | Retrieve error, access, or source logs |
  | **Start** | Start the streaming server and autoDJ |
  | **Stop** | Stop the streaming server |
  | **Restart** | Restart the server (disconnects all listeners) |
  | **Reload** | Reload config without disconnecting listeners |
  | **Switch Source** | Activate or deactivate the autoDJ |
  | **Next Song** | Skip to the next song in the autoDJ playlist |
  | **Reconfigure** | Update account settings (title, bitrate, limits, etc.) |
  | **Reindex** | Update the autoDJ media library |
  | **Playlist** | Manage playlists (activate, deactivate, add/remove tracks, list) |
  | **Manage DJ** | Create, update, remove, or list DJ accounts |
  | **Copy File** | Copy a file into the account's spool directory |
  | **Refresh Disk Usage** | Update disk usage statistics |
  | **Report** | Generate a track/royalty report |
  | **Archive Logs** | Archive logs and get a download URL |
  | **Authenticate** | Test if credentials are valid |
  | **Enabled** | Check if an account is enabled/disabled |

  ### System Operations

  Admin-level operations for managing the Centova Cast installation.

  | Operation | Description |
  |-----------|-------------|
  | **List Accounts** | List all accounts (with pagination and filtering) |
  | **List Hosts** | List all hosting servers |
  | **List Regions** | List all configured regions |
  | **Provision** | Create a new streaming server account |
  | **Terminate** | Permanently remove an account |
  | **Rename** | Change an account's username |
  | **Set Status** | Enable or disable an account |
  | **Reparent** | Move an account to another reseller |
  | **Info** | Get the state (up/down) of accounts |
  | **Usage** | Get resource utilization (disk, transfer) |
  | **Check** | Check for outages and restart if needed |
  | **Batch** | Run a method on multiple accounts at once |
  | **Backup** | Create a complete account backup |
  | **Restore** | Restore an account from a backup file |
  | **Database** | Import or export an account database |
  | **App Change** | Change the streaming software (experimental) |
  | **Process Logs** | Process and rotate log files |
  | **Version** | Get Centova Cast version and server info |
  | **Sanity Check** | Test communication with Centova Cast |

  ## Usage Examples

  ### Check Server Status

  1. Add a **Centova Cast** node to your workflow
  2. Select **Resource:** `Server`
  3. Select **Operation:** `Get Status`
  4. Enter the **Account Username** of the stream to check
  5. Optionally set **Mountpoints** to check specific mount points

  ### Start/Stop a Stream

  1. Add a **Centova Cast** node
  2. Select **Resource:** `Server`
  3. Select **Operation:** `Start` or `Stop`
  4. Enter the **Account Username**

  ### List All Accounts

  1. Add a **Centova Cast** node
  2. Select **Resource:** `System`
  3. Select **Operation:** `List Accounts`
  4. Optionally set a **Filter** keyword and **Limit**

  ### Create a New Account

  1. Add a **Centova Cast** node
  2. Select **Resource:** `System`
  3. Select **Operation:** `Provision`
  4. Fill in the required fields: Username, Hostname, IP Address, Port, etc.

  ## API Reference

  This node implements the [Centova Cast JSON API](https://centova.com/doc/cast/internals/API_Reference). All requests are sent via POST for security (passwords are not logged in URL parameters).

  The API uses two main classes:
  - **Server** class - requires account username + password, manages individual streams
  - **System** class - requires admin password, manages the entire Centova Cast installation

  For full API documentation, visit: https://centova.com/doc/cast/internals/API_Reference

  ## Compatibility

  - **n8n version:** 1.0.0+
  - **Node.js version:** 22+
  - **Centova Cast version:** 3.x

  ## License

  This project is licensed under the [MIT License](LICENSE).

ai_documentation_summary:
  {"purpose":"This n8n community node allows users to manage Centova Cast streaming servers via its JSON API, enabling control over radio station configurations, playback, and system administration.","capabilities":["Manage streaming server accounts (start, stop, restart, reload)","Monitor server status (listeners, bitrate, state)","Retrieve and manage playlist content","Configure account settings (title, bitrate, limits)","Handle DJ accounts (create, update, remove)","Access logs and generate reports","Manage file operations in spool directories","Test authentication credentials"],"authentication":"Username and Password required","commonUseCases":["Automating radio station startup/shutdown schedules","Monitoring streaming server health and listener counts","Managing playlist updates via workflow automation","Generating royalty and track reports","Testing API credentials before deployment"],"limitations":["Community node (not official n8n node)","Requires manual installation in Docker environments","System operations require admin-level credentials separate from server operations"],"relatedNodes":["n8n-nodes-http.request","n8n-nodes-webhook","n8n-nodes-conditional"]}


node_type: n8n-nodes-agentmail.agentMail
package_name: n8n-nodes-agentmail
display_name: AgentMail
description: Email API for AI Agents - Create inboxes, send/receive emails, and more
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: agentmail-1
author_github_url: https://github.com/josephfeleke/
npm_package_name: n8n-nodes-agentmail
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.164Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "inbox",
      "options": [
        {
          "name": "Inbox",
          "value": "inbox",
          "description": "Manage email inboxes for your AI agents"
        },
        {
          "name": "Message",
          "value": "message",
          "description": "Send, receive, and manage emails"
        },
        {
          "name": "Thread",
          "value": "thread",
          "description": "Manage email threads/conversations"
        },
        {
          "name": "Webhook",
          "value": "webhook",
          "description": "Manage webhooks for real-time events"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an inbox",
          "description": "Create a new inbox for an AI agent"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an inbox",
          "description": "Delete an inbox"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an inbox",
          "description": "Get an inbox by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List inboxes",
          "description": "List all inboxes"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "inbox"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a message",
          "description": "Get a message by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List messages",
          "description": "List messages in an inbox"
        },
        {
          "name": "Reply",
          "value": "reply",
          "action": "Reply to a message",
          "description": "Reply to an existing message"
        },
        {
          "name": "Send",
          "value": "send",
          "action": "Send an email",
          "description": "Send an email from an inbox"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a thread",
          "description": "Get a thread by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List threads",
          "description": "List threads in an inbox"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "thread"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "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": "List",
          "value": "list",
          "action": "List webhooks",
          "description": "List all webhooks"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an inbox",
      "description": "Create a new inbox for an AI agent",
      "resource": "inbox"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an inbox",
      "description": "Delete an inbox",
      "resource": "inbox"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an inbox",
      "description": "Get an inbox by ID",
      "resource": "inbox"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List inboxes",
      "description": "List all inboxes",
      "resource": "inbox"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a message",
      "description": "Get a message by ID",
      "resource": "message"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List messages",
      "description": "List messages in an inbox",
      "resource": "message"
    },
    {
      "name": "Reply",
      "value": "reply",
      "action": "Reply to a message",
      "description": "Reply to an existing message",
      "resource": "message"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send an email",
      "description": "Send an email from an inbox",
      "resource": "message"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a thread",
      "description": "Get a thread by ID",
      "resource": "thread"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List threads",
      "description": "List threads in an inbox",
      "resource": "thread"
    },
    {
      "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": "List",
      "value": "list",
      "action": "List webhooks",
      "description": "List all webhooks",
      "resource": "webhook"
    }
  ]

npm_readme:
  # n8n-nodes-agentmail

  This is an n8n community node for [AgentMail](https://agentmail.to) — the Email API for AI Agents.

  ![Smart Inbox Filter Workflow](images/workflow-overview.png)

  *Example: AI-powered email triage workflow with AgentMail*

  AgentMail lets you create email inboxes for your AI agents so they can send, receive, and act on emails autonomously. No SMTP configuration needed — just an API key.

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

  ## Features

  ### AgentMail Node (Actions)
  - **Inbox** — Create, Get, List, Delete inboxes
  - **Message** — Send, Reply, Get, List messages
  - **Thread** — Get, List email threads
  - **Webhook** — Create, List, Delete webhooks

  ### AgentMail Trigger (Events)
  - **Email Received** — Triggers when an inbox gets an email
  - **Email Sent** — Triggers when an email is sent
  - **Email Delivered** — Triggers when delivery is confirmed
  - **Email Bounced** — Triggers when an email bounces

  ### User-Friendly
  - **Inbox dropdown** — Pick inboxes from a list instead of typing IDs
  - **Simple forms** — Only essential fields are shown; advanced options are tucked away
  - **Return All** — Fetch all results with one toggle, or set a custom limit
  - **AI Agent compatible** — Use as a tool in n8n AI Agent workflows

  ![AgentMail Trigger Node](images/workflow-trigger.png)

  ## Installation

  ### Community Node (Recommended)
  1. Go to **Settings > Community Nodes**
  2. Search for `n8n-nodes-agentmail`
  3. Click **Install**

  ### Manual Installation
  ```bash
  npm install n8n-nodes-agentmail
  ```

  ## Getting Started

  1. **Get an API key** — Sign up at [agentmail.to](https://agentmail.to) and copy your key from the dashboard
  2. **Add credentials in n8n** — Go to Credentials > New > **AgentMail API** > paste your key > click Test
  3. **Create an inbox** — Add an AgentMail node > Inbox > Create > type a username > Execute
  4. **Send an email** — Add another AgentMail node > Message > Send > pick your inbox from the dropdown > fill in the recipient, subject, and message > Execute
  5. **Receive emails** — Add an AgentMail Trigger > pick an event > activate the workflow

  ## Example Workflows

  | Example | Description | Integrations |
  |---------|-------------|--------------|
  | [Smart Inbox Filter](docs/examples/07-smart-inbox-filter.md) | AI-powered email triage with promo digests | OpenAI, Google Sheets |

  <details>
  <summary>More examples</summary>

  | Example | Description | Integrations |
  |---------|-------------|--------------|
  | [AI Auto-Reply](docs/examples/01-ai-auto-reply.md) | Automatically respond to emails using GPT-4 | OpenAI |
  | [Email Classification](docs/examples/02-email-classification.md) | Route emails based on AI-detected categories | OpenAI |
  | [Lead Capture](docs/examples/03-lead-capture.md) | Extract contact info and save to spreadsheet | OpenAI, Google Sheets |
  | [Slack Notifications](docs/examples/04-slack-notifications.md) | Get notified of important emails in Slack | Slack |
  | [Daily Summary](docs/examples/05-daily-summary.md) | AI-generated daily email digest | OpenAI, Slack |
  | [Support Tickets](docs/examples/06-support-tickets.md) | Auto-create tickets and send confirmations | OpenAI, HTTP/Webhooks |

  </details>

  Importable JSON files are in the [`examples/`](examples/) directory.

  ## Node Reference

  ### Inbox Operations

  | Operation | Description |
  |-----------|-------------|
  | Create | Create a new inbox with a unique email address |
  | Get | Retrieve inbox details |
  | List | List all inboxes in your account |
  | Delete | Delete an inbox permanently |

  ### Message Operations

  | Operation | Description |
  |-----------|-------------|
  | Send | Send an email from an inbox |
  | Reply | Reply to an existing message |
  | Get | Retrieve a specific message |
  | List | List messages in an inbox |

  ### Thread Operations

  | Operation | Description |
  |-----------|-------------|
  | Get | Retrieve a thread with all messages |
  | List | List threads in an inbox |

  ### Webhook Operations

  | Operation | Description |
  |-----------|-------------|
  | Create | Register a new webhook URL |
  | List | List all registered webhooks |
  | Delete | Remove a webhook |

  ## Trigger Output

  When the trigger fires, you receive:

  ```json
  {
    "event": "message.received",
    "eventId": "evt_123",
    "timestamp": "2024-01-25T10:30:00Z",
    "messageId": "msg_456",
    "inboxId": "inbox_789",
    "threadId": "thread_012",
    "from": "sender@example.com",
    "to": ["agent@agentmail.to"],
    "subject": "Hello Agent",
    "text": "Plain text content",
    "html": "<p>HTML content</p>",
    "labels": ["received"],
    "attachments": []
  }
  ```

  ## Resources

  - [Getting Started Guide](docs/getting-started.md)
  - [AgentMail Documentation](https://docs.agentmail.to)
  - [AgentMail API Reference](https://docs.agentmail.to/api-reference)
  - [n8n Community Forum](https://community.n8n.io)

  ## License

  [MIT](LICENSE.md)

  ## Author

  Created by Joseph Maregn

ai_documentation_summary:
  {"purpose":"A community n8n node that provides an Email API for AI Agents, enabling the creation of inboxes, sending/receiving emails, and managing email threads without SMTP configuration.","capabilities":["Create, retrieve, list, and delete email inboxes","Send emails and reply to existing messages","Retrieve and list email messages and threads","Create, list, and delete webhooks","Trigger workflows on email received, sent, delivered, or bounced events","Support AI Agent workflows as a tool","Provide user-friendly inbox dropdown selection"],"authentication":"API key required","commonUseCases":["AI-powered email triage and filtering","Automated email responses using LLMs","Email classification and routing","Lead capture from emails","Daily email digest generation"],"limitations":["Community node (not official n8n node)","Requires separate API key from agentmail.to"],"relatedNodes":["n8n-nodes-http.request","n8n-nodes-webhook","n8n-nodes-ai-chat","n8n-nodes-google-sheets"]}


node_type: n8n-nodes-agentmail.agentMailTrigger
package_name: n8n-nodes-agentmail
display_name: AgentMail Trigger
description: Triggers when an email event occurs (received, sent, etc.)
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: agentmail-1
author_github_url: https://github.com/josephfeleke/
npm_package_name: n8n-nodes-agentmail
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.165Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-agentmail

  This is an n8n community node for [AgentMail](https://agentmail.to) — the Email API for AI Agents.

  ![Smart Inbox Filter Workflow](images/workflow-overview.png)

  *Example: AI-powered email triage workflow with AgentMail*

  AgentMail lets you create email inboxes for your AI agents so they can send, receive, and act on emails autonomously. No SMTP configuration needed — just an API key.

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

  ## Features

  ### AgentMail Node (Actions)
  - **Inbox** — Create, Get, List, Delete inboxes
  - **Message** — Send, Reply, Get, List messages
  - **Thread** — Get, List email threads
  - **Webhook** — Create, List, Delete webhooks

  ### AgentMail Trigger (Events)
  - **Email Received** — Triggers when an inbox gets an email
  - **Email Sent** — Triggers when an email is sent
  - **Email Delivered** — Triggers when delivery is confirmed
  - **Email Bounced** — Triggers when an email bounces

  ### User-Friendly
  - **Inbox dropdown** — Pick inboxes from a list instead of typing IDs
  - **Simple forms** — Only essential fields are shown; advanced options are tucked away
  - **Return All** — Fetch all results with one toggle, or set a custom limit
  - **AI Agent compatible** — Use as a tool in n8n AI Agent workflows

  ![AgentMail Trigger Node](images/workflow-trigger.png)

  ## Installation

  ### Community Node (Recommended)
  1. Go to **Settings > Community Nodes**
  2. Search for `n8n-nodes-agentmail`
  3. Click **Install**

  ### Manual Installation
  ```bash
  npm install n8n-nodes-agentmail
  ```

  ## Getting Started

  1. **Get an API key** — Sign up at [agentmail.to](https://agentmail.to) and copy your key from the dashboard
  2. **Add credentials in n8n** — Go to Credentials > New > **AgentMail API** > paste your key > click Test
  3. **Create an inbox** — Add an AgentMail node > Inbox > Create > type a username > Execute
  4. **Send an email** — Add another AgentMail node > Message > Send > pick your inbox from the dropdown > fill in the recipient, subject, and message > Execute
  5. **Receive emails** — Add an AgentMail Trigger > pick an event > activate the workflow

  ## Example Workflows

  | Example | Description | Integrations |
  |---------|-------------|--------------|
  | [Smart Inbox Filter](docs/examples/07-smart-inbox-filter.md) | AI-powered email triage with promo digests | OpenAI, Google Sheets |

  <details>
  <summary>More examples</summary>

  | Example | Description | Integrations |
  |---------|-------------|--------------|
  | [AI Auto-Reply](docs/examples/01-ai-auto-reply.md) | Automatically respond to emails using GPT-4 | OpenAI |
  | [Email Classification](docs/examples/02-email-classification.md) | Route emails based on AI-detected categories | OpenAI |
  | [Lead Capture](docs/examples/03-lead-capture.md) | Extract contact info and save to spreadsheet | OpenAI, Google Sheets |
  | [Slack Notifications](docs/examples/04-slack-notifications.md) | Get notified of important emails in Slack | Slack |
  | [Daily Summary](docs/examples/05-daily-summary.md) | AI-generated daily email digest | OpenAI, Slack |
  | [Support Tickets](docs/examples/06-support-tickets.md) | Auto-create tickets and send confirmations | OpenAI, HTTP/Webhooks |

  </details>

  Importable JSON files are in the [`examples/`](examples/) directory.

  ## Node Reference

  ### Inbox Operations

  | Operation | Description |
  |-----------|-------------|
  | Create | Create a new inbox with a unique email address |
  | Get | Retrieve inbox details |
  | List | List all inboxes in your account |
  | Delete | Delete an inbox permanently |

  ### Message Operations

  | Operation | Description |
  |-----------|-------------|
  | Send | Send an email from an inbox |
  | Reply | Reply to an existing message |
  | Get | Retrieve a specific message |
  | List | List messages in an inbox |

  ### Thread Operations

  | Operation | Description |
  |-----------|-------------|
  | Get | Retrieve a thread with all messages |
  | List | List threads in an inbox |

  ### Webhook Operations

  | Operation | Description |
  |-----------|-------------|
  | Create | Register a new webhook URL |
  | List | List all registered webhooks |
  | Delete | Remove a webhook |

  ## Trigger Output

  When the trigger fires, you receive:

  ```json
  {
    "event": "message.received",
    "eventId": "evt_123",
    "timestamp": "2024-01-25T10:30:00Z",
    "messageId": "msg_456",
    "inboxId": "inbox_789",
    "threadId": "thread_012",
    "from": "sender@example.com",
    "to": ["agent@agentmail.to"],
    "subject": "Hello Agent",
    "text": "Plain text content",
    "html": "<p>HTML content</p>",
    "labels": ["received"],
    "attachments": []
  }
  ```

  ## Resources

  - [Getting Started Guide](docs/getting-started.md)
  - [AgentMail Documentation](https://docs.agentmail.to)
  - [AgentMail API Reference](https://docs.agentmail.to/api-reference)
  - [n8n Community Forum](https://community.n8n.io)

  ## License

  [MIT](LICENSE.md)

  ## Author

  Created by Joseph Maregn

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows automatically when email events occur (received, sent, delivered, or bounced) via the AgentMail API, enabling AI agents to autonomously manage email inboxes.","capabilities":["Triggers on email received events","Triggers on email sent events","Triggers on email delivered events","Triggers on email bounced events","Fetches full email metadata including sender, subject, text, HTML, and attachments","Supports inbox dropdown selection for user-friendly configuration","Compatible with n8n AI Agent workflows as a tool"],"authentication":"API key required (obtained from AgentMail dashboard)","commonUseCases":["AI-powered email triage and filtering","Automated email responses using LLMs","Email classification and routing","Lead capture from email inboxes","Daily email digest generation"],"limitations":["Community node (not official n8n node)","Requires separate AgentMail account and API key","Limited to AgentMail-supported events and features"],"relatedNodes":["AgentMail Action Node","HTTP Request","AI Agent Tool Node","Webhook"]}


node_type: @eleapis-n8n/n8n-nodes-eleapis.eleapis
package_name: @eleapis-n8n/n8n-nodes-eleapis
display_name: EleAPIs
description: Create contacts
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: eleapis2026
author_github_url: https://github.com/eleapis/n8n-nodes-eleapis.git
npm_package_name: @eleapis-n8n/n8n-nodes-eleapis
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.166Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "createContact",
      "options": [
        {
          "name": "Add Contact",
          "value": "createContact",
          "action": "Add contact",
          "description": "Create a contact"
        },
        {
          "name": "Update Contact Attributes",
          "value": "updateAttributes",
          "action": "Update contact attributes",
          "description": "Update a contact attribute"
        },
        {
          "name": "Send Session Message",
          "value": "sendSessionMessage",
          "action": "Send session message",
          "description": "Send a session message"
        },
        {
          "name": "Send Template Message",
          "value": "sendTemplateMessage",
          "action": "Send template message",
          "description": "Send a WhatsApp template message"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Add Contact",
      "value": "createContact",
      "action": "Add contact",
      "description": "Create a contact"
    },
    {
      "name": "Update Contact Attributes",
      "value": "updateAttributes",
      "action": "Update contact attributes",
      "description": "Update a contact attribute"
    },
    {
      "name": "Send Session Message",
      "value": "sendSessionMessage",
      "action": "Send session message",
      "description": "Send a session message"
    },
    {
      "name": "Send Template Message",
      "value": "sendTemplateMessage",
      "action": "Send template message",
      "description": "Send a WhatsApp template message"
    }
  ]

npm_readme:
  # @eleapis-n8n/n8n-nodes-eleapis

  This is an n8n community node for EleAPIs. It lets you manage contacts, send messages, and trigger workflows from EleAPIs events inside n8n.


  [Installation](#installation)  
  [Operations](#operations)  
  [Triggers](#triggers)  
  [Credentials](#credentials)  
  [Usage Notes](#usage-notes)  
  [Development](#development)  
  [Resources](#resources)

  ## Installation

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

  Package name:

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

  You can also install it from the n8n UI through `Settings -> Community Nodes`.

  ## Operations

  The `EleAPIs` node currently supports these actions:

  - `Add a Contact`
  - `Update Contact Attributes`
  - `Send Session Message`
  - `Send Template Message`

  ## Triggers

  The `EleAPIs Trigger` node currently supports:

  - `New Contact Created`
  - `Incoming Message`
  - `WhatsApp Order Created`

  The trigger subscribes to EleAPIs webhook events and emits normalized n8n output with:

  - `event`
  - `app`
  - `botId`
  - `platform`
  - event-specific payload data
  - `timestamp`


  ## Credentials

  The `EleAPIs API` credential requires:

  - `API Key`
  - `Bot ID`
  - `Platform`

  Supported platform options in the credential:

  - `WhatsApp`
  - `Instagram`
  - `Facebook`
  - `Telegram`
  - `Website`
  - `SMS`

  ## Usage Notes

  - `Send Template Message` is WhatsApp-only.
  - `Send Session Message` uses the `Platform` selected in the credentials.
  - For trigger nodes, your n8n instance must be reachable by EleAPIs so webhook registration can work correctly.
  - For phone-based searches, use the full number with country code where the field description asks for it.

  ## Development

  Available scripts:

  ```bash
  npm run dev
  npm run build
  npm run lint
  npm run lint:fix
  npm run release
  ```


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

  ## License

  [MIT](./LICENSE.md)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables management of contacts, sending messages, and triggering workflows based on EleAPIs events.","capabilities":["Add a Contact","Update Contact Attributes","Send Session Message","Send Template Message","Trigger on New Contact Created","Trigger on Incoming Message","Trigger on WhatsApp Order Created"],"authentication":"API Key required (along with Bot ID and Platform)","commonUseCases":["Automated contact management in n8n","Sending WhatsApp template messages","Reacting to incoming messages via webhooks","Processing WhatsApp orders"],"limitations":["Send Template Message is WhatsApp-only","Send Session Message depends on the Platform selected in credentials","n8n instance must be reachable by EleAPIs for webhook triggers to function"],"relatedNodes":["EleAPIs Trigger","EleAPIs API"]}


node_type: @eleapis-n8n/n8n-nodes-eleapis.eleapisTrigger
package_name: @eleapis-n8n/n8n-nodes-eleapis
display_name: EleAPIs Trigger
description: Starts the workflow when events occur
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: eleapis2026
author_github_url: https://github.com/eleapis/n8n-nodes-eleapis.git
npm_package_name: @eleapis-n8n/n8n-nodes-eleapis
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.167Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # @eleapis-n8n/n8n-nodes-eleapis

  This is an n8n community node for EleAPIs. It lets you manage contacts, send messages, and trigger workflows from EleAPIs events inside n8n.


  [Installation](#installation)  
  [Operations](#operations)  
  [Triggers](#triggers)  
  [Credentials](#credentials)  
  [Usage Notes](#usage-notes)  
  [Development](#development)  
  [Resources](#resources)

  ## Installation

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

  Package name:

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

  You can also install it from the n8n UI through `Settings -> Community Nodes`.

  ## Operations

  The `EleAPIs` node currently supports these actions:

  - `Add a Contact`
  - `Update Contact Attributes`
  - `Send Session Message`
  - `Send Template Message`

  ## Triggers

  The `EleAPIs Trigger` node currently supports:

  - `New Contact Created`
  - `Incoming Message`
  - `WhatsApp Order Created`

  The trigger subscribes to EleAPIs webhook events and emits normalized n8n output with:

  - `event`
  - `app`
  - `botId`
  - `platform`
  - event-specific payload data
  - `timestamp`


  ## Credentials

  The `EleAPIs API` credential requires:

  - `API Key`
  - `Bot ID`
  - `Platform`

  Supported platform options in the credential:

  - `WhatsApp`
  - `Instagram`
  - `Facebook`
  - `Telegram`
  - `Website`
  - `SMS`

  ## Usage Notes

  - `Send Template Message` is WhatsApp-only.
  - `Send Session Message` uses the `Platform` selected in the credentials.
  - For trigger nodes, your n8n instance must be reachable by EleAPIs so webhook registration can work correctly.
  - For phone-based searches, use the full number with country code where the field description asks for it.

  ## Development

  Available scripts:

  ```bash
  npm run dev
  npm run build
  npm run lint
  npm run lint:fix
  npm run release
  ```


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

  ## License

  [MIT](./LICENSE.md)

ai_documentation_summary:
  {"purpose":"The EleAPIs Trigger node starts an n8n workflow when specific events occur from EleAPIs platforms like WhatsApp, Instagram, Facebook, Telegram, SMS, or Website.","capabilities":["Subscribe to webhook events from EleAPIs","Emit normalized n8n output with event metadata and payload","Support multiple platforms (WhatsApp, Instagram, Facebook, Telegram, SMS, Website)","Trigger workflow execution on new contact creation","Trigger workflow execution on incoming messages","Trigger workflow execution on WhatsApp order creation"],"authentication":"API Key required (along with Bot ID and Platform selection)","commonUseCases":["Automate responses when new contacts are added via WhatsApp or Instagram","Process incoming customer messages through a unified workflow","Handle WhatsApp order creation events automatically","Centralize multi-platform messaging logic in n8n"],"limitations":["Send Template Message operation is WhatsApp-only","Send Session Message depends on the Platform selected in credentials","n8n instance must be publicly reachable for webhook registration to work","Phone-based searches require full numbers with country codes"],"relatedNodes":["EleAPIs API","EleAPIs Contact","EleAPIs Message"]}


node_type: n8n-nodes-alphaloops-freight.alphaLoops
package_name: n8n-nodes-alphaloops-freight
display_name: AlphaLoops Freight API
description: FMCSA carrier data — profiles, fleet, inspections, crashes, authority, news, contacts
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: alphaloops
author_github_url: https://github.com/RunAlphaLoop/
npm_package_name: n8n-nodes-alphaloops-freight
npm_version: 0.1.18
community_fetched_at: 2026-07-14T14:40:34.168Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "carrier",
      "options": [
        {
          "name": "Carrier",
          "value": "carrier"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Crash",
          "value": "crash"
        },
        {
          "name": "Fleet",
          "value": "fleet"
        },
        {
          "name": "Inspection",
          "value": "inspection"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get by DOT",
          "value": "get",
          "action": "Get carrier by DOT number",
          "description": "Get carrier profile by USDOT number"
        },
        {
          "name": "Get by MC",
          "value": "getByMc",
          "action": "Get carrier by MC number",
          "description": "Get carrier profile by MC/MX docket number"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search carriers by name",
          "description": "Fuzzy search carriers by name"
        },
        {
          "name": "Filtered Query",
          "value": "filteredQuery",
          "action": "Query carriers with filters",
          "description": "Query carriers with include/exclude filters"
        },
        {
          "name": "Get Authority",
          "value": "authority",
          "action": "Get carrier authority history",
          "description": "Get authority history for a carrier"
        },
        {
          "name": "Get News",
          "value": "news",
          "action": "Get carrier news",
          "description": "Get news articles about a carrier"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "carrier"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "trucks",
      "options": [
        {
          "name": "Get Trucks",
          "value": "trucks",
          "action": "Get carrier trucks",
          "description": "Get registered trucks for a carrier"
        },
        {
          "name": "Get Trailers",
          "value": "trailers",
          "action": "Get carrier trailers",
          "description": "Get registered trailers for a carrier"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "fleet"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List carrier inspections",
          "description": "List roadside inspections for a carrier"
        },
        {
          "name": "Get Violations",
          "value": "violations",
          "action": "Get inspection violations",
          "description": "Get violations for a specific inspection"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "inspection"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List carrier crashes",
          "description": "List crash records for a carrier"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "crash"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search contacts",
          "description": "Find people at a carrier or company"
        },
        {
          "name": "Enrich",
          "value": "enrich",
          "action": "Enrich a contact",
          "description": "Get verified emails and phones for a contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get by DOT",
      "value": "get",
      "action": "Get carrier by DOT number",
      "description": "Get carrier profile by USDOT number",
      "resource": "carrier"
    },
    {
      "name": "Get by MC",
      "value": "getByMc",
      "action": "Get carrier by MC number",
      "description": "Get carrier profile by MC/MX docket number",
      "resource": "carrier"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search carriers by name",
      "description": "Fuzzy search carriers by name",
      "resource": "carrier"
    },
    {
      "name": "Filtered Query",
      "value": "filteredQuery",
      "action": "Query carriers with filters",
      "description": "Query carriers with include/exclude filters",
      "resource": "carrier"
    },
    {
      "name": "Get Authority",
      "value": "authority",
      "action": "Get carrier authority history",
      "description": "Get authority history for a carrier",
      "resource": "carrier"
    },
    {
      "name": "Get News",
      "value": "news",
      "action": "Get carrier news",
      "description": "Get news articles about a carrier",
      "resource": "carrier"
    },
    {
      "name": "Get Trucks",
      "value": "trucks",
      "action": "Get carrier trucks",
      "description": "Get registered trucks for a carrier",
      "resource": "fleet"
    },
    {
      "name": "Get Trailers",
      "value": "trailers",
      "action": "Get carrier trailers",
      "description": "Get registered trailers for a carrier",
      "resource": "fleet"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List carrier inspections",
      "description": "List roadside inspections for a carrier",
      "resource": "inspection"
    },
    {
      "name": "Get Violations",
      "value": "violations",
      "action": "Get inspection violations",
      "description": "Get violations for a specific inspection",
      "resource": "inspection"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List carrier crashes",
      "description": "List crash records for a carrier",
      "resource": "crash"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search contacts",
      "description": "Find people at a carrier or company",
      "resource": "contact"
    },
    {
      "name": "Enrich",
      "value": "enrich",
      "action": "Enrich a contact",
      "description": "Get verified emails and phones for a contact",
      "resource": "contact"
    }
  ]

npm_readme:
  # n8n-nodes-alphaloops-freight

  This is an [n8n](https://n8n.io/) community node for the [AlphaLoops FMCSA API](https://runalphaloops.com/fmcsa-api/docs). It lets you access US trucking carrier data — profiles, fleet, inspections, crashes, authority history, news, and contacts — directly inside your n8n workflows.

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

  ## Prerequisites

  You need an AlphaLoops API key. Sign up at [runalphaloops.com](https://runalphaloops.com) to get one, regardless of which installation path you take.

  ## Installation (n8n Hosted)

  The hosted n8n does not allow installation of arbitrary third-party packages. We have submitted this package to n8n for review and will update this README when it is approved.

  ## Installation (Self Hosted n8n)

  Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation. There are two approaches, one for Docker and one for non-Docker; but both boil down to 

  `npm install n8n-nodes-alphaloops-freight`

  Once you've restarted n8n with the `n8n-nodes-alphaloops-freight` package installed:

  1. Open your desired workflow and go to the `Credentials` tab:

  <p>
      <img src="https://raw.githubusercontent.com/RunAlphaLoop/n8n-nodes-alphaloops-freight/main/images/alphaloops-n8n-ss-1.png" width="50%"/>
  </p>

  2. You'll see `AlphaLoops` as an option, click the triple dots to `open`:

  <p>
      <img src="https://raw.githubusercontent.com/RunAlphaLoop/n8n-nodes-alphaloops-freight/main/images/alphaloops-n8n-ss-2.png" width="50%"/>
  </p>

  3. Enter your API key and save it.

  4. At this point, you can inset AlphaLoops calls into your n8n workflows:

  <p>
      <img src="https://raw.githubusercontent.com/RunAlphaLoop/n8n-nodes-alphaloops-freight/main/images/alphaloops-n8n-ss-3.png" width="50%"/>
  </p>


  ## Resources and Operations

  ### Carrier

  | Operation | Description |
  |---|---|
  | **Get by DOT** | Get a carrier profile by USDOT number (200+ fields, optional field projection) |
  | **Get by MC** | Get a carrier profile by MC/MX docket number |
  | **Search** | Fuzzy search carriers by name, with optional state/city/domain filters |
  | **Filtered Query** | Query carriers with include/exclude JSON filters (supports range, boolean, array, geo-radius) |
  | **Get Authority** | Get operating authority history for a carrier |
  | **Get News** | Get news articles about a carrier, with optional date filters |

  ### Fleet

  | Operation | Description |
  |---|---|
  | **Get Trucks** | List registered trucks for a carrier by DOT number |
  | **Get Trailers** | List registered trailers for a carrier by DOT number |

  ### Inspection

  | Operation | Description |
  |---|---|
  | **List** | List roadside inspection records for a carrier |
  | **Get Violations** | Get violations for a specific inspection by ID |

  ### Crash

  | Operation | Description |
  |---|---|
  | **List** | List crash records for a carrier, with optional severity and date filters |

  ### Contact

  | Operation | Description |
  |---|---|
  | **Search** | Find people at a carrier or company (by DOT, company name, job title, seniority level) |
  | **Enrich** | Get verified emails and phone numbers for a contact (1 credit per new lookup, cached free) |

  ## Example Usage

  ### Look up a carrier and get their fleet

  1. Add an **AlphaLoops** node, set Resource to **Carrier**, Operation to **Get by DOT**, and enter a DOT number (e.g. `80806`)
  2. Chain a second **AlphaLoops** node, set Resource to **Fleet**, Operation to **Get Trucks**, and wire the DOT number from the first node's output

  ### Find carriers in Texas with 5+ trucks

  1. Add an **AlphaLoops** node, set Resource to **Carrier**, Operation to **Filtered Query**
  2. In the Include Filters field, enter:
     ```json
     {
       "state": "TX",
       "has_common_authority": true,
       "power_units": { "min": 5 }
     }
     ```

  ### Search for contacts at a carrier

  1. Add an **AlphaLoops** node, set Resource to **Contact**, Operation to **Search**
  2. Enter a DOT number and optionally filter by job title or seniority level
  3. Chain an **Enrich** operation to get verified contact details

  ## API Documentation

  Full API docs: [runalphaloops.com/fmcsa-api/docs](https://runalphaloops.com/fmcsa-api/docs)

  ## License

  [MIT](https://github.com/RunAlphaLoop/n8n-nodes-alphaloops-freight/blob/main/LICENSE)

ai_documentation_summary:
  {"purpose":"This n8n community node provides access to US FMCSA trucking carrier data, enabling workflow automation for retrieving carrier profiles, fleet information, inspection records, crash history, authority details, news, and contact information.","capabilities":["Retrieve carrier profiles by USDOT number","Retrieve carrier profiles by MC/MX docket number","Search carriers by name with optional state/city/domain filters","Query carriers with JSON filters (range, boolean, array, geo-radius)","Get operating authority history for a carrier","Get news articles about a carrier with date filters","List registered trucks for a carrier by DOT number","List registered trailers for a carrier by DOT number","List roadside inspection records for a carrier","Get violations for a specific inspection by ID"],"authentication":"API key required","commonUseCases":["Verify trucking carrier legitimacy and safety records","Automate fleet size verification for carrier qualification","Monitor carrier inspection violations and crash history","Search and enrich contact information for logistics partners","Track carrier authority history and compliance status"],"limitations":["Hosted n8n installations do not allow arbitrary third-party package installation; requires self-hosted setup","Contact enrichment requires API credits for new lookups (cached free)","Full API documentation is external to the node"],"relatedNodes":["n8n-nodes-alphaloops-freight","n8n-nodes-alphaloops-freight.alphaLoops"]}


node_type: n8n-nodes-smenso.smenso
package_name: n8n-nodes-smenso
display_name: Smenso
description: Interact with the smenso project management API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: smenso-flaetchen
author_github_url: https://github.com/smenso/
npm_package_name: n8n-nodes-smenso
npm_version: 1.2.3
community_fetched_at: 2026-07-14T14:40:34.169Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "project",
      "options": [
        {
          "name": "Absence",
          "value": "absence"
        },
        {
          "name": "Attachment",
          "value": "attachment"
        },
        {
          "name": "Comment",
          "value": "comment"
        },
        {
          "name": "Flavor",
          "value": "flavor"
        },
        {
          "name": "Folder",
          "value": "folder"
        },
        {
          "name": "Permissions",
          "value": "permissions"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Reporting (Export)",
          "value": "reporting"
        },
        {
          "name": "Settings / Utilities",
          "value": "settings"
        },
        {
          "name": "Status Report",
          "value": "statusReport"
        },
        {
          "name": "Task",
          "value": "task"
        },
        {
          "name": "Time Record",
          "value": "timeRecord"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many projects",
          "description": "Get projects from the workspace"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project",
          "description": "Get a single project by ID"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a project",
          "description": "Create one or more projects (async – returns ticketId)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a project",
          "description": "Update one or more projects (async – returns ticketId)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a project",
          "description": "Delete a project"
        },
        {
          "name": "Archive",
          "value": "archive",
          "action": "Archive a project",
          "description": "Archive a project (async – returns ticketId)"
        },
        {
          "name": "Unarchive",
          "value": "unarchive",
          "action": "Unarchive a project",
          "description": "Restore an archived project (async – returns ticketId)"
        },
        {
          "name": "Create From Template",
          "value": "createFromTemplate",
          "action": "Create a project from template",
          "description": "Create a project based on a template"
        },
        {
          "name": "Update Master Data From Template",
          "value": "updateMasterDataFromTemplate",
          "action": "Update project master data from template",
          "description": "Apply template master data to an existing project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many tasks",
          "description": "Get tasks for a project"
        },
        {
          "name": "Get Tree",
          "value": "getTree",
          "action": "Get task tree",
          "description": "Get a task with all its subtasks"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a task",
          "description": "Create tasks (async – returns ticketId)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a task",
          "description": "Update tasks (async – returns ticketId)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a task",
          "description": "Delete a task"
        },
        {
          "name": "Create From Template",
          "value": "createFromTemplate",
          "action": "Create task from template",
          "description": "Create a task from a task template"
        },
        {
          "name": "Update Dependencies",
          "value": "updateDependencies",
          "action": "Update task dependencies",
          "description": "Add or modify task dependencies (PATCH)"
        },
        {
          "name": "Remove Dependencies",
          "value": "removeDependencies",
          "action": "Remove task dependencies",
          "description": "Remove task dependencies"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many absences",
          "description": "Get all absences from the workspace"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create an absence",
          "description": "Create absences (async – returns ticketId)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an absence",
          "description": "Update absences (async – returns ticketId)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an absence",
          "description": "Delete an absence"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "absence"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many time records",
          "description": "Get time records for a project"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a time record",
          "description": "Create time records (async – returns ticketId)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a time record",
          "description": "Update time records (async – returns ticketId)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a time record",
          "description": "Delete a time record"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "timeRecord"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a status report",
          "description": "Create status reports (async – returns ticketId)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a status report",
          "description": "Update status reports (async – returns ticketId)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a status report",
          "description": "Delete a status report"
        },
        {
          "name": "Create From Template",
          "value": "createFromTemplate",
          "action": "Create status report from template",
          "description": "Create a status report from a template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "statusReport"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getManyTask",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a comment",
          "description": "Get a comment by ID"
        },
        {
          "name": "Get Many (Task)",
          "value": "getManyTask",
          "action": "Get task comments",
          "description": "Get all comments for a task"
        },
        {
          "name": "Get Many (Status Report)",
          "value": "getManyStatusReport",
          "action": "Get status report comments",
          "description": "Get all comments for a status report"
        },
        {
          "name": "Create (Task)",
          "value": "createTask",
          "action": "Create task comment",
          "description": "Create comments on tasks (async – returns ticketId)"
        },
        {
          "name": "Create (Status Report)",
          "value": "createStatusReport",
          "action": "Create status report comment",
          "description": "Create comments on status reports (async – returns ticketId)"
        },
        {
          "name": "Update (Task)",
          "value": "updateTask",
          "action": "Update task comment",
          "description": "Update task comments (async – returns ticketId)"
        },
        {
          "name": "Update (Status Report)",
          "value": "updateStatusReport",
          "action": "Update status report comment",
          "description": "Update status report comments (async – returns ticketId)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a comment",
          "description": "Delete a comment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "comment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many folders",
          "description": "Get folders for a project"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a folder",
          "description": "Create folders (async – returns ticketId)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a folder",
          "description": "Update folders (async – returns ticketId)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a folder",
          "description": "Delete a folder"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "folder"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getProject",
      "options": [
        {
          "name": "Download",
          "value": "download",
          "action": "Download an attachment",
          "description": "Download an attachment by ID"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an attachment",
          "description": "Delete an attachment"
        },
        {
          "name": "Get Project Attachments",
          "value": "getProject",
          "action": "Get project attachments",
          "description": "List attachments for a project"
        },
        {
          "name": "Get Task Attachments",
          "value": "getTask",
          "action": "Get task attachments",
          "description": "List attachments for a task"
        },
        {
          "name": "Get Status Report Attachments",
          "value": "getStatusReport",
          "action": "Get status report attachments",
          "description": "List attachments for a status report"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "attachment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many flavors",
          "description": "Get all flavors (custom fields) from the workspace"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a flavor",
          "description": "Delete a flavor by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "flavor"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getProject",
      "options": [
        {
          "name": "Get Project Permissions",
          "value": "getProject",
          "action": "Get project permissions",
          "description": "Get project permission/privacy settings"
        },
        {
          "name": "Set Project Access",
          "value": "setProjectAccess",
          "action": "Set project access",
          "description": "Add or remove project access for users/teams"
        },
        {
          "name": "Delete Project Access",
          "value": "deleteProjectAccess",
          "action": "Delete project access",
          "description": "Remove all project access restrictions"
        },
        {
          "name": "Set Project Privacy",
          "value": "setProjectPrivacy",
          "action": "Set project privacy",
          "description": "Add or remove private access for users/teams"
        },
        {
          "name": "Delete Project Privacy",
          "value": "deleteProjectPrivacy",
          "action": "Delete project privacy",
          "description": "Remove project privacy restrictions"
        },
        {
          "name": "Get Task Permissions",
          "value": "getTask",
          "action": "Get task permissions",
          "description": "Get task permission/privacy settings"
        },
        {
          "name": "Set Task Access",
          "value": "setTaskAccess",
          "action": "Set task access",
          "description": "Add or remove task access for users/teams"
        },
        {
          "name": "Delete Task Access",
          "value": "deleteTaskAccess",
          "action": "Delete task access",
          "description": "Remove all task access restrictions"
        },
        {
          "name": "Set Task Privacy",
          "value": "setTaskPrivacy",
          "action": "Set task privacy",
          "description": "Set task as private with user/team access"
        },
        {
          "name": "Delete Task Privacy",
          "value": "deleteTaskPrivacy",
          "action": "Delete task privacy",
          "description": "Remove task privacy restrictions"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "permissions"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTimezones",
      "options": [
        {
          "name": "Get Timezones",
          "value": "getTimezones",
          "action": "Get timezones",
          "description": "Get all supported timezone IDs"
        },
        {
          "name": "Get Status Ticket",
          "value": "getStatusTicket",
          "action": "Get status ticket",
          "description": "Poll the result of an async operation by ticket ID"
        },
        {
          "name": "Get Members",
          "value": "getMembers",
          "action": "Get member settings",
          "description": "Get member settings for the workspace"
        },
        {
          "name": "Update Member",
          "value": "updateMember",
          "action": "Update member",
          "description": "Update member settings / flavors (async)"
        },
        {
          "name": "Get Absence Types",
          "value": "getAbsenceTypes",
          "action": "Get absence types",
          "description": "Get all absence types"
        },
        {
          "name": "Get Absence Type",
          "value": "getAbsenceType",
          "action": "Get absence type",
          "description": "Get a single absence type by ID"
        },
        {
          "name": "Create Absence Types",
          "value": "createAbsenceType",
          "action": "Create absence type",
          "description": "Create absence types (async)"
        },
        {
          "name": "Update Absence Types",
          "value": "updateAbsenceType",
          "action": "Update absence type",
          "description": "Update absence types (async)"
        },
        {
          "name": "Delete Absence Type",
          "value": "deleteAbsenceType",
          "action": "Delete absence type",
          "description": "Delete an absence type"
        },
        {
          "name": "Get Working Times (All)",
          "value": "getAllWorkingTimes",
          "action": "Get all working times",
          "description": "Get working time records for all members"
        },
        {
          "name": "Get Working Times (User)",
          "value": "getUserWorkingTimes",
          "action": "Get user working times",
          "description": "Get working time records for a specific user"
        },
        {
          "name": "Create Working Times",
          "value": "createWorkingTime",
          "action": "Create working time",
          "description": "Create working time records (async)"
        },
        {
          "name": "Update Working Times",
          "value": "updateWorkingTime",
          "action": "Update working time",
          "description": "Update working time records (async)"
        },
        {
          "name": "Delete Working Time",
          "value": "deleteWorkingTime",
          "action": "Delete working time",
          "description": "Delete a working time record"
        },
        {
          "name": "Invite Members",
          "value": "inviteMembers",
          "action": "Invite members",
          "description": "Invite users to the workspace"
        },
        {
          "name": "Invite Guests",
          "value": "inviteGuests",
          "action": "Invite guests",
          "description": "Invite guests to the workspace"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "settings"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getProjects",
      "options": [
        {
          "name": "Get Projects",
          "value": "getProjects",
          "action": "Report: Get projects",
          "description": "Export all projects (CSV/JSON)"
        },
        {
          "name": "Get Project",
          "value": "getProject",
          "action": "Report: Get project",
          "description": "Export a single project"
        },
        {
          "name": "Get Tasks for Project",
          "value": "getTasks",
          "action": "Report: Get tasks",
          "description": "Export tasks for a project (CSV/JSON)"
        },
        {
          "name": "Get Tasks by Filter",
          "value": "getTasksFiltered",
          "action": "Report: Get tasks by filter",
          "description": "Export tasks across projects by filter"
        },
        {
          "name": "Get Time Records",
          "value": "getTimeRecords",
          "action": "Report: Get time records",
          "description": "Export time records (CSV/JSON)"
        },
        {
          "name": "Get Absences",
          "value": "getAbsences",
          "action": "Report: Get absences",
          "description": "Export absence records (CSV/JSON)"
        },
        {
          "name": "Get Teams",
          "value": "getTeams",
          "action": "Report: Get teams",
          "description": "Export all teams"
        },
        {
          "name": "Get Flavors",
          "value": "getFlavors",
          "action": "Report: Get flavors",
          "description": "Export all flavors"
        },
        {
          "name": "Get Member Settings",
          "value": "getMemberSettings",
          "action": "Report: Get member settings",
          "description": "Export member settings"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reporting"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many projects",
      "description": "Get projects from the workspace",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "description": "Get a single project by ID",
      "resource": "project"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a project",
      "description": "Create one or more projects (async – returns ticketId)",
      "resource": "project"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a project",
      "description": "Update one or more projects (async – returns ticketId)",
      "resource": "project"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a project",
      "description": "Delete a project",
      "resource": "project"
    },
    {
      "name": "Archive",
      "value": "archive",
      "action": "Archive a project",
      "description": "Archive a project (async – returns ticketId)",
      "resource": "project"
    },
    {
      "name": "Unarchive",
      "value": "unarchive",
      "action": "Unarchive a project",
      "description": "Restore an archived project (async – returns ticketId)",
      "resource": "project"
    },
    {
      "name": "Create From Template",
      "value": "createFromTemplate",
      "action": "Create a project from template",
      "description": "Create a project based on a template",
      "resource": "project"
    },
    {
      "name": "Update Master Data From Template",
      "value": "updateMasterDataFromTemplate",
      "action": "Update project master data from template",
      "description": "Apply template master data to an existing project",
      "resource": "project"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many tasks",
      "description": "Get tasks for a project",
      "resource": "task"
    },
    {
      "name": "Get Tree",
      "value": "getTree",
      "action": "Get task tree",
      "description": "Get a task with all its subtasks",
      "resource": "task"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a task",
      "description": "Create tasks (async – returns ticketId)",
      "resource": "task"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a task",
      "description": "Update tasks (async – returns ticketId)",
      "resource": "task"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a task",
      "description": "Delete a task",
      "resource": "task"
    },
    {
      "name": "Create From Template",
      "value": "createFromTemplate",
      "action": "Create task from template",
      "description": "Create a task from a task template",
      "resource": "task"
    },
    {
      "name": "Update Dependencies",
      "value": "updateDependencies",
      "action": "Update task dependencies",
      "description": "Add or modify task dependencies (PATCH)",
      "resource": "task"
    },
    {
      "name": "Remove Dependencies",
      "value": "removeDependencies",
      "action": "Remove task dependencies",
      "description": "Remove task dependencies",
      "resource": "task"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many absences",
      "description": "Get all absences from the workspace",
      "resource": "absence"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an absence",
      "description": "Create absences (async – returns ticketId)",
      "resource": "absence"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an absence",
      "description": "Update absences (async – returns ticketId)",
      "resource": "absence"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an absence",
      "description": "Delete an absence",
      "resource": "absence"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many time records",
      "description": "Get time records for a project",
      "resource": "timeRecord"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a time record",
      "description": "Create time records (async – returns ticketId)",
      "resource": "timeRecord"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a time record",
      "description": "Update time records (async – returns ticketId)",
      "resource": "timeRecord"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a time record",
      "description": "Delete a time record",
      "resource": "timeRecord"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a status report",
      "description": "Create status reports (async – returns ticketId)",
      "resource": "statusReport"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a status report",
      "description": "Update status reports (async – returns ticketId)",
      "resource": "statusReport"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a status report",
      "description": "Delete a status report",
      "resource": "statusReport"
    },
    {
      "name": "Create From Template",
      "value": "createFromTemplate",
      "action": "Create status report from template",
      "description": "Create a status report from a template",
      "resource": "statusReport"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a comment",
      "description": "Get a comment by ID",
      "resource": "comment"
    },
    {
      "name": "Get Many (Task)",
      "value": "getManyTask",
      "action": "Get task comments",
      "description": "Get all comments for a task",
      "resource": "comment"
    },
    {
      "name": "Get Many (Status Report)",
      "value": "getManyStatusReport",
      "action": "Get status report comments",
      "description": "Get all comments for a status report",
      "resource": "comment"
    },
    {
      "name": "Create (Task)",
      "value": "createTask",
      "action": "Create task comment",
      "description": "Create comments on tasks (async – returns ticketId)",
      "resource": "comment"
    },
    {
      "name": "Create (Status Report)",
      "value": "createStatusReport",
      "action": "Create status report comment",
      "description": "Create comments on status reports (async – returns ticketId)",
      "resource": "comment"
    },
    {
      "name": "Update (Task)",
      "value": "updateTask",
      "action": "Update task comment",
      "description": "Update task comments (async – returns ticketId)",
      "resource": "comment"
    },
    {
      "name": "Update (Status Report)",
      "value": "updateStatusReport",
      "action": "Update status report comment",
      "description": "Update status report comments (async – returns ticketId)",
      "resource": "comment"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a comment",
      "description": "Delete a comment",
      "resource": "comment"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many folders",
      "description": "Get folders for a project",
      "resource": "folder"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a folder",
      "description": "Create folders (async – returns ticketId)",
      "resource": "folder"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a folder",
      "description": "Update folders (async – returns ticketId)",
      "resource": "folder"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a folder",
      "description": "Delete a folder",
      "resource": "folder"
    },
    {
      "name": "Download",
      "value": "download",
      "action": "Download an attachment",
      "description": "Download an attachment by ID",
      "resource": "attachment"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an attachment",
      "description": "Delete an attachment",
      "resource": "attachment"
    },
    {
      "name": "Get Project Attachments",
      "value": "getProject",
      "action": "Get project attachments",
      "description": "List attachments for a project",
      "resource": "attachment"
    },
    {
      "name": "Get Task Attachments",
      "value": "getTask",
      "action": "Get task attachments",
      "description": "List attachments for a task",
      "resource": "attachment"
    },
    {
      "name": "Get Status Report Attachments",
      "value": "getStatusReport",
      "action": "Get status report attachments",
      "description": "List attachments for a status report",
      "resource": "attachment"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many flavors",
      "description": "Get all flavors (custom fields) from the workspace",
      "resource": "flavor"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a flavor",
      "description": "Delete a flavor by ID",
      "resource": "flavor"
    },
    {
      "name": "Get Project Permissions",
      "value": "getProject",
      "action": "Get project permissions",
      "description": "Get project permission/privacy settings",
      "resource": "permissions"
    },
    {
      "name": "Set Project Access",
      "value": "setProjectAccess",
      "action": "Set project access",
      "description": "Add or remove project access for users/teams",
      "resource": "permissions"
    },
    {
      "name": "Delete Project Access",
      "value": "deleteProjectAccess",
      "action": "Delete project access",
      "description": "Remove all project access restrictions",
      "resource": "permissions"
    },
    {
      "name": "Set Project Privacy",
      "value": "setProjectPrivacy",
      "action": "Set project privacy",
      "description": "Add or remove private access for users/teams",
      "resource": "permissions"
    },
    {
      "name": "Delete Project Privacy",
      "value": "deleteProjectPrivacy",
      "action": "Delete project privacy",
      "description": "Remove project privacy restrictions",
      "resource": "permissions"
    },
    {
      "name": "Get Task Permissions",
      "value": "getTask",
      "action": "Get task permissions",
      "description": "Get task permission/privacy settings",
      "resource": "permissions"
    },
    {
      "name": "Set Task Access",
      "value": "setTaskAccess",
      "action": "Set task access",
      "description": "Add or remove task access for users/teams",
      "resource": "permissions"
    },
    {
      "name": "Delete Task Access",
      "value": "deleteTaskAccess",
      "action": "Delete task access",
      "description": "Remove all task access restrictions",
      "resource": "permissions"
    },
    {
      "name": "Set Task Privacy",
      "value": "setTaskPrivacy",
      "action": "Set task privacy",
      "description": "Set task as private with user/team access",
      "resource": "permissions"
    },
    {
      "name": "Delete Task Privacy",
      "value": "deleteTaskPrivacy",
      "action": "Delete task privacy",
      "description": "Remove task privacy restrictions",
      "resource": "permissions"
    },
    {
      "name": "Get Timezones",
      "value": "getTimezones",
      "action": "Get timezones",
      "description": "Get all supported timezone IDs",
      "resource": "settings"
    },
    {
      "name": "Get Status Ticket",
      "value": "getStatusTicket",
      "action": "Get status ticket",
      "description": "Poll the result of an async operation by ticket ID",
      "resource": "settings"
    },
    {
      "name": "Get Members",
      "value": "getMembers",
      "action": "Get member settings",
      "description": "Get member settings for the workspace",
      "resource": "settings"
    },
    {
      "name": "Update Member",
      "value": "updateMember",
      "action": "Update member",
      "description": "Update member settings / flavors (async)",
      "resource": "settings"
    },
    {
      "name": "Get Absence Types",
      "value": "getAbsenceTypes",
      "action": "Get absence types",
      "description": "Get all absence types",
      "resource": "settings"
    },
    {
      "name": "Get Absence Type",
      "value": "getAbsenceType",
      "action": "Get absence type",
      "description": "Get a single absence type by ID",
      "resource": "settings"
    },
    {
      "name": "Create Absence Types",
      "value": "createAbsenceType",
      "action": "Create absence type",
      "description": "Create absence types (async)",
      "resource": "settings"
    },
    {
      "name": "Update Absence Types",
      "value": "updateAbsenceType",
      "action": "Update absence type",
      "description": "Update absence types (async)",
      "resource": "settings"
    },
    {
      "name": "Delete Absence Type",
      "value": "deleteAbsenceType",
      "action": "Delete absence type",
      "description": "Delete an absence type",
      "resource": "settings"
    },
    {
      "name": "Get Working Times (All)",
      "value": "getAllWorkingTimes",
      "action": "Get all working times",
      "description": "Get working time records for all members",
      "resource": "settings"
    },
    {
      "name": "Get Working Times (User)",
      "value": "getUserWorkingTimes",
      "action": "Get user working times",
      "description": "Get working time records for a specific user",
      "resource": "settings"
    },
    {
      "name": "Create Working Times",
      "value": "createWorkingTime",
      "action": "Create working time",
      "description": "Create working time records (async)",
      "resource": "settings"
    },
    {
      "name": "Update Working Times",
      "value": "updateWorkingTime",
      "action": "Update working time",
      "description": "Update working time records (async)",
      "resource": "settings"
    },
    {
      "name": "Delete Working Time",
      "value": "deleteWorkingTime",
      "action": "Delete working time",
      "description": "Delete a working time record",
      "resource": "settings"
    },
    {
      "name": "Invite Members",
      "value": "inviteMembers",
      "action": "Invite members",
      "description": "Invite users to the workspace",
      "resource": "settings"
    },
    {
      "name": "Invite Guests",
      "value": "inviteGuests",
      "action": "Invite guests",
      "description": "Invite guests to the workspace",
      "resource": "settings"
    },
    {
      "name": "Get Projects",
      "value": "getProjects",
      "action": "Report: Get projects",
      "description": "Export all projects (CSV/JSON)",
      "resource": "reporting"
    },
    {
      "name": "Get Project",
      "value": "getProject",
      "action": "Report: Get project",
      "description": "Export a single project",
      "resource": "reporting"
    },
    {
      "name": "Get Tasks for Project",
      "value": "getTasks",
      "action": "Report: Get tasks",
      "description": "Export tasks for a project (CSV/JSON)",
      "resource": "reporting"
    },
    {
      "name": "Get Tasks by Filter",
      "value": "getTasksFiltered",
      "action": "Report: Get tasks by filter",
      "description": "Export tasks across projects by filter",
      "resource": "reporting"
    },
    {
      "name": "Get Time Records",
      "value": "getTimeRecords",
      "action": "Report: Get time records",
      "description": "Export time records (CSV/JSON)",
      "resource": "reporting"
    },
    {
      "name": "Get Absences",
      "value": "getAbsences",
      "action": "Report: Get absences",
      "description": "Export absence records (CSV/JSON)",
      "resource": "reporting"
    },
    {
      "name": "Get Teams",
      "value": "getTeams",
      "action": "Report: Get teams",
      "description": "Export all teams",
      "resource": "reporting"
    },
    {
      "name": "Get Flavors",
      "value": "getFlavors",
      "action": "Report: Get flavors",
      "description": "Export all flavors",
      "resource": "reporting"
    },
    {
      "name": "Get Member Settings",
      "value": "getMemberSettings",
      "action": "Report: Get member settings",
      "description": "Export member settings",
      "resource": "reporting"
    }
  ]

npm_readme:
  # n8n-nodes-smenso

  Official n8n community node for [smenso](https://smenso.de) – the project management platform for teams and enterprises.

  This node gives you full access to the smenso API directly from your n8n workflows: manage projects, tasks, time records, absences, status reports, permissions, and much more — without writing a single line of code.

  ---

  ## Prerequisites

  Before you can use this node, your smenso workspace needs the **Enterprise Add-on "smenso Integration API"** enabled. Contact your smenso account manager if you're unsure whether this is active.

  ---

  ## Authentication

  This node uses a personal API token from the smenso Admin Center.

  ### Step 1 — Generate an API Token

  1. Open [admin.smenso.cloud](https://admin.smenso.cloud)
  2. Navigate to **API Token**
  3. Click **Create API Token**
  4. Select the workspace and set a validity period
  5. Give the token a name (e.g. `n8n integration`)
  6. Click **Create**
  7. **Copy the token immediately** — it is only shown once

  ### Step 2 — Find your Workspace Subdomain

  Your workspace subdomain is the part before `.smenso.cloud` in your smenso URL.

  > Example: if your URL is `mycompany.smenso.cloud`, your subdomain is `mycompany`

  ### Step 3 — Set up the Credential in n8n

  1. In n8n, open any workflow and add the **smenso** node
  2. Click **Credential for smenso API → Create New**
  3. Enter your **Workspace** subdomain (e.g. `mycompany`)
  4. Paste your **API Token**
  5. Click **Save** — n8n will verify the connection automatically

  ---

  ## Important: Async Operations & Ticket Polling

  Many write operations in smenso are **asynchronous**. Instead of returning the created/updated record immediately, the API returns a **Ticket ID**. Use the **Settings / Utilities → Get Status Ticket** operation to poll for the result.

  Ticket status values:

  | Status | Meaning |
  |---|---|
  | `Started` | Still processing — poll again after a short wait |
  | `Success` | Operation completed successfully |
  | `Success with Errors` | Partially completed — check details |
  | `Failed` | Operation failed — check error details |

  **Tip:** Add a **Wait** node (2–3 seconds) between the write operation and the ticket poll.

  ---

  ## What this node can do

  ### Resource: Project

  | Operation | Description |
  |---|---|
  | **Get Many** | Retrieve all projects in the workspace. Optional filters: Project IDs, Language, Timezone, View ID. |
  | **Get** | Retrieve a single project by its GUID. |
  | **Create** | Create a new project (async). Required: Title, Phase ID, Type ID. |
  | **Update** | Update an existing project (async). Required: Project ID. |
  | **Delete** | Permanently delete a project. |
  | **Archive** | Archive a project (async). |
  | **Unarchive** | Restore an archived project (async). |
  | **Create From Template** | Create a new project based on a template. Required: Template ID, Title, Folder, Project Type. |
  | **Update Master Data From Template** | Apply template master data to an existing project. Required: Template ID, Project ID. |

  ---

  ### Resource: Task

  | Operation | Description |
  |---|---|
  | **Get Many** | Retrieve all tasks for a project. Required: Project ID. |
  | **Get Tree** | Retrieve a task together with all its subtasks. Required: Project ID, Task ID. |
  | **Create** | Create one or more tasks (async). Required: Project ID, Title. |
  | **Update** | Update an existing task (async). Required: Task ID. |
  | **Delete** | Permanently delete a task. Required: Task ID. |
  | **Create From Template** | Create a task from a task template. Required: Template ID, Project ID. |
  | **Update Dependencies** | Add or modify predecessor dependencies (PATCH). Required: Project ID, Task ID, dependencies JSON array. |
  | **Remove Dependencies** | Remove predecessor dependencies. Required: Project ID, Task ID, predecessor Task IDs. |

  ---

  ### Resource: Absence

  | Operation | Description |
  |---|---|
  | **Get Many** | Retrieve all absences in the workspace. Optional: Language, Timezone. |
  | **Create** | Create one or more absences (async). Required: User ID/Email, Absence Type ID/Name, Start Date, End Date, Status. |
  | **Update** | Update an existing absence (async). Required: Absence ID. Supports External ID lookup. |
  | **Delete** | Permanently delete an absence. Required: Absence ID. |

  ---

  ### Resource: Time Record

  | Operation | Description |
  |---|---|
  | **Get Many** | Retrieve all time records for a project. Required: Project ID. |
  | **Create** | Create one or more time records (async). Required: Project ID, Task ID, User ID/Email, Date. |
  | **Update** | Update an existing time record (async). Required: Time Record ID, Project ID. Supports External ID lookup. |
  | **Delete** | Permanently delete a time record. Required: Time Record ID. |

  ---

  ### Resource: Status Report

  | Operation | Description |
  |---|---|
  | **Create** | Create a new status report (async). Required: Project ID, Title, Status Date, Overall Status ID (1–7). |
  | **Update** | Update an existing status report (async). Required: Status Report ID, Project ID. |
  | **Delete** | Permanently delete a status report. Required: Status Report ID. |
  | **Create From Template** | Create a status report from a template. Required: Template ID, Project ID, Title, Progress (0–100). |

  ---

  ### Resource: Comment

  | Operation | Description |
  |---|---|
  | **Get** | Retrieve a single comment by its ID. |
  | **Get Many (Task)** | Retrieve all comments for a task. Required: Task ID. |
  | **Get Many (Status Report)** | Retrieve all comments for a status report. Required: Status Report ID. |
  | **Create (Task)** | Create a comment on a task (async). Required: Task ID, Text. |
  | **Create (Status Report)** | Create a comment on a status report (async). Required: Status Report ID, Text. |
  | **Update (Task)** | Update a task comment (async). Required: Comment ID, Text. |
  | **Update (Status Report)** | Update a status report comment (async). Required: Comment ID, Text. |
  | **Delete** | Permanently delete a comment. Required: Comment ID. |

  ---

  ### Resource: Folder

  | Operation | Description |
  |---|---|
  | **Get Many** | Retrieve all folders for a project. Required: Project ID. |
  | **Create** | Create one or more folders in a project (async). Required: Project ID, Name. |
  | **Update** | Update an existing folder (async). Required: Project ID, Folder ID. |
  | **Delete** | Permanently delete a folder. Required: Project ID, Folder ID. |

  ---

  ### Resource: Attachment

  | Operation | Description |
  |---|---|
  | **Download** | Download an attachment by ID. Required: Attachment ID. |
  | **Delete** | Permanently delete an attachment. Required: Attachment ID. |
  | **Get Project Attachments** | List all attachments for a project. Required: Project ID. |
  | **Get Task Attachments** | List all attachments for a task. Required: Task ID. |
  | **Get Status Report Attachments** | List all attachments for a status report. Required: Status Report ID. |

  ---

  ### Resource: Flavor

  Flavors are smenso's custom fields — configurable additional data fields on projects, tasks, and time records.

  | Operation | Description |
  |---|---|
  | **Get Many** | Retrieve all flavor definitions in the workspace. |
  | **Delete** | Permanently delete a flavor definition. Required: Flavor ID. |

  ---

  ### Resource: Permissions

  | Operation | Description |
  |---|---|
  | **Get Project Permissions** | Retrieve access and privacy settings for a project. Required: Project ID. |
  | **Set Project Access** | Add or remove access restrictions for a project. Required: Project ID. |
  | **Delete Project Access** | Remove all access restrictions from a project. Required: Project ID. |
  | **Set Project Privacy** | Set a project as private with specific user/team access. Required: Project ID. |
  | **Delete Project Privacy** | Remove privacy restrictions from a project. Required: Project ID. |
  | **Get Task Permissions** | Retrieve access and privacy settings for a task. Required: Task ID. |
  | **Set Task Access** | Add or remove access restrictions on a task. Required: Task ID. |
  | **Delete Task Access** | Remove all access restrictions from a task. Required: Task ID. |
  | **Set Task Privacy** | Set a task as private with specific user/team access. Required: Task ID. |
  | **Delete Task Privacy** | Remove privacy restrictions from a task. Required: Task ID. |

  ---

  ### Resource: Settings / Utilities

  #### Utilities

  | Operation | Description |
  |---|---|
  | **Get Timezones** | Retrieve all supported timezone identifiers for use in other operations. |
  | **Get Status Ticket** | Poll the processing result of any async operation. Required: Ticket ID. |

  #### Members

  | Operation | Description |
  |---|---|
  | **Get Members** | Retrieve member settings for all workspace members. |
  | **Update Member** | Update flavor values for a specific member (async). Required: Member ID/Email, Flavors JSON. |

  #### Absence Types

  | Operation | Description |
  |---|---|
  | **Get Absence Types** | Retrieve all absence type definitions. |
  | **Get Absence Type** | Retrieve a single absence type by ID. Required: Absence Type ID. |
  | **Create Absence Types** | Create one or more absence type definitions (async). Required: Title, Type (limited/unlimited). |
  | **Update Absence Types** | Update an absence type definition (async). Required: Absence Type ID. |
  | **Delete Absence Type** | Permanently delete an absence type. Required: Absence Type ID. |

  #### Working Times

  | Operation | Description |
  |---|---|
  | **Get Working Times (All)** | Retrieve working time records for all workspace members. |
  | **Get Working Times (User)** | Retrieve working time records for a specific user. Required: User ID/Email. |
  | **Create Working Times** | Create a working time record for a user (async). Required: User ID/Email, Start Date. |
  | **Update Working Times** | Update a working time record (async). Required: Daily Capacity ID. |
  | **Delete Working Time** | Delete a working time record. Required: Daily Capacity ID. |

  #### Workspace Invitations

  | Operation | Description |
  |---|---|
  | **Invite Members** | Send an invitation to a new workspace member. Required: Email, Role. |
  | **Invite Guests** | Send an invitation to a guest. Required: Email, Role. |

  ---

  ### Resource: Reporting (Export)

  Uses the smenso Reporting API. Supports JSON and CSV output. Timezone uses IANA format (e.g. `Europe/Berlin`).

  | Operation | Description |
  |---|---|
  | **Get Projects** | Export all visible projects. Optional: View ID, Project Filter, Column Headers, Format. |
  | **Get Project** | Export a single project report. Required: Project ID. |
  | **Get Tasks for Project** | Export all tasks for a specific project. Required: Project ID. |
  | **Get Tasks by Filter** | Export tasks across all projects by filter. Optional: Project Filter. |
  | **Get Time Records** | Export time records. Required: Mode (all/my). |
  | **Get Absences** | Export absence records. Required: Mode (all/my). |
  | **Get Teams** | Export all teams in the workspace. |
  | **Get Flavors** | Export all flavor definitions. |
  | **Get Member Settings** | Export member settings including flavor values. |

  ---

  ## Example Use Cases

  - **CRM → smenso:** When a deal is won in HubSpot, automatically create a smenso project from a template
  - **HR → smenso:** Sync approved absences from your HR system to smenso automatically
  - **Form → Task:** Turn incoming contact form submissions into smenso tasks instantly
  - **Daily export:** Pull all time records each morning and write them to Google Sheets or your ERP
  - **Auto status reports:** Create and publish weekly status reports for all active projects on a schedule
  - **Onboarding:** When a new employee is added in HR, create their smenso account, set working times, and assign projects

  ---

  ## Resources

  - [smenso API Documentation](https://developers.smenso.de)
  - [smenso Integration API Swagger](https://dev.smenso.app/skyisland/swagger/integration-json.json)
  - [smenso Reporting API Swagger](https://dev.smenso.app/skyisland/swagger/report.json)
  - [smenso Help Center](https://help.smenso.de)
  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)

  ---

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"This n8n node enables full interaction with the Smenso project management API, allowing users to manage projects, tasks, time records, absences, status reports, and comments without writing code.","capabilities":["Retrieve and create projects with optional templates","Manage tasks including dependencies and templates","Handle absence records","Create and update time records","Generate and update status reports","Manage comments on tasks and status reports","Archive and unarchive projects","Poll async operation tickets for status updates"],"authentication":"Personal API Token from Smenso Admin Center (admin.smenso.cloud)","commonUseCases":["Automating project creation and task assignment","Tracking time records for billing or reporting","Generating automated status reports","Managing team absences and leave requests","Polling for completion status of asynchronous operations"],"limitations":["Write operations are asynchronous and require polling via 'Get Status Ticket' to confirm completion","Requires the Enterprise Add-on 'smenso Integration API' to be enabled in the workspace","API Token must be generated and configured manually in n8n credentials"],"relatedNodes":["n8n Wait node","n8n HTTP Request node (for custom polling if needed)"]}


node_type: n8n-nodes-one-hub.oneHub
package_name: n8n-nodes-one-hub
display_name: One-Hub
description: Interact with the One-Hub API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: forstner_software_solutions
author_github_url: https://github.com/ForstnerSoftwareSolutions/
npm_package_name: n8n-nodes-one-hub
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.170Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "response",
      "options": [
        {
          "name": "Response",
          "value": "response"
        },
        {
          "name": "File",
          "value": "file"
        },
        {
          "name": "Sync",
          "value": "sync"
        },
        {
          "name": "Folder",
          "value": "folder"
        }
      ],
      "description": "Choose which One-Hub endpoint to call",
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send Question",
          "value": "send",
          "action": "Send question to AI",
          "description": "Send a prompt to the AI and receive a non-streaming response with sources"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "response"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload file",
          "description": "Upload a file for a chat"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete file",
          "description": "Delete a file from chat storage"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "trigger",
      "options": [
        {
          "name": "Trigger Sync",
          "value": "trigger",
          "action": "Trigger sync",
          "description": "Sync all files and connectors of a chat and create a summary"
        },
        {
          "name": "Get Job Status",
          "value": "getStatus",
          "action": "Get sync job status",
          "description": "Retrieve the status of a previously enqueued sync job"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sync"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create folder",
          "description": "Create a new folder in chat storage"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete folder",
          "description": "Delete a folder from chat storage"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "folder"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Question",
      "value": "send",
      "action": "Send question to AI",
      "description": "Send a prompt to the AI and receive a non-streaming response with sources",
      "resource": "response"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload file",
      "description": "Upload a file for a chat",
      "resource": "file"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete file",
      "description": "Delete a file from chat storage",
      "resource": "file"
    },
    {
      "name": "Trigger Sync",
      "value": "trigger",
      "action": "Trigger sync",
      "description": "Sync all files and connectors of a chat and create a summary",
      "resource": "sync"
    },
    {
      "name": "Get Job Status",
      "value": "getStatus",
      "action": "Get sync job status",
      "description": "Retrieve the status of a previously enqueued sync job",
      "resource": "sync"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create folder",
      "description": "Create a new folder in chat storage",
      "resource": "folder"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete folder",
      "description": "Delete a folder from chat storage",
      "resource": "folder"
    }
  ]

npm_readme:
  # n8n-nodes-one-hub

  This is an n8n community node for One-Hub, a trusted enterprise knowledge interface that connects systems like Jira, SharePoint, Confluence, and files to deliver precise, source-backed answers in seconds.

  One-Hub is designed for secure company use with GDPR-compliant operation, Austrian hosting, and on-premise readiness.

  [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)
  [Version history](#version-history)

  ## Installation

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

  ## Operations

  The node supports the following operations:

  * **Response**
  * Send Question: Sends a question to One-Hub and returns a non-streaming response including sources.
  * **File**
  * Upload: Uploads (and optionally creates intermediate folders if the API key also has role FolderCreate) and stores a file for a chat.
  * Delete: Deletes a file from the chat's file storage.
  * **Sync**
  * Trigger Sync: Starts embedding synchronization for all files and connectors in a chat and creates a summary.
  * Get Job Status: Retrieves the status of a previously started sync job.
  * **Folder**
  * Create: Creates a new folder in the chat's file storage.
  * Delete: Deletes a folder from the chat's file storage.

  ## Credentials

  To use this node, an API key must be created in One-Hub.

  * Cloud: Create an API key at [app.one-hub.at/developer](https://app.one-hub.at/developer).
  * On-Premise: Create an API key in your own One-Hub instance.
  * Store the API key in the node credentials in n8n.

  Optional for On-Premise:

  * Set Deployment Type to On-Premise.
  * Enter your own Chat API Base URL and File API Base URL.

  ## Compatibility

  The node should work with every n8n version.

  ## Usage

  ### Example: Send Question

  Use this operation to ask One-Hub a question and receive a grounded answer with sources.

  Expected **Chat ID** format:

  * UUID/GUID string, for example: `123e4567-e89b-12d3-a456-426614174000`

  Sample node configuration:

  * Resource: `Response`
  * Operation: `Send Question`
  * Chat ID: `123e4567-e89b-12d3-a456-426614174000`
  * Input: `Which Jira issues have the status "In Progress"?`

  What the response includes:

  * The generated answer text from One-Hub

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [One-Hub Developer Documentation (Cloud)](https://app.one-hub.at/developer)
  * In your On-Premise instance, the developer documentation is also available and describes the available parameters and node capabilities.

  ## Version history

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the One-Hub API to ask questions, manage files, and synchronize data for enterprise knowledge retrieval.","capabilities":["Send questions to One-Hub and receive grounded answers with sources","Upload files to One-Hub chat storage (with folder creation support)","Delete files from One-Hub chat storage","Create new folders in One-Hub chat storage","Delete folders from One-Hub chat storage","Trigger embedding synchronization for files and connectors","Retrieve status of ongoing synchronization jobs"],"authentication":"API key required (Cloud: from app.one-hub.at/developer; On-Premise: from local instance)","commonUseCases":["Enterprise knowledge retrieval with source-backed answers","Connecting Jira, SharePoint, Confluence, and file systems to One-Hub","GDPR-compliant company knowledge management","On-premise knowledge interface deployment"],"limitations":["Non-streaming responses only for question operations","Folder creation requires API key with FolderCreate role","Chat ID must be a valid UUID/GUID string"],"relatedNodes":["n8n-nodes-core-credentials","n8n-nodes-core-code"]}


node_type: n8n-nodes-cloudbeaver.cloudBeaver
package_name: n8n-nodes-cloudbeaver
display_name: CloudBeaver
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: daelynum
author_github_url: https://github.com/dbeaver/cloudbeaver
npm_package_name: n8n-nodes-cloudbeaver
npm_version: 0.4.1
community_fetched_at: 2026-07-14T14:40:34.171Z
ai_summary_generated_at: 2026-05-22 10:26:01
description:
  Interact with databases via CloudBeaver: execute SQL queries, select, insert, update, and delete rows

properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "executeQuery",
      "options": [
        {
          "name": "Execute SQL Query",
          "value": "executeQuery",
          "action": "Execute a SQL query",
          "description": "Execute a raw SQL query"
        },
        {
          "name": "Select Rows",
          "value": "select",
          "action": "Select rows from a table",
          "description": "Retrieve rows from a table"
        },
        {
          "name": "Insert Rows",
          "value": "insert",
          "action": "Insert rows in a table",
          "description": "Insert new rows into a table"
        },
        {
          "name": "Update Rows",
          "value": "update",
          "action": "Update rows in a table",
          "description": "Update existing rows in a table"
        },
        {
          "name": "Delete",
          "value": "deleteTable",
          "action": "Delete table or rows",
          "description": "Delete rows, truncate, or drop a table"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Execute SQL Query",
      "value": "executeQuery",
      "action": "Execute a SQL query",
      "description": "Execute a raw SQL query"
    },
    {
      "name": "Select Rows",
      "value": "select",
      "action": "Select rows from a table",
      "description": "Retrieve rows from a table"
    },
    {
      "name": "Insert Rows",
      "value": "insert",
      "action": "Insert rows in a table",
      "description": "Insert new rows into a table"
    },
    {
      "name": "Update Rows",
      "value": "update",
      "action": "Update rows in a table",
      "description": "Update existing rows in a table"
    },
    {
      "name": "Delete",
      "value": "deleteTable",
      "action": "Delete table or rows",
      "description": "Delete rows, truncate, or drop a table"
    }
  ]

npm_readme:
  # n8n-nodes-cloudbeaver

  This is an n8n community node for [CloudBeaver](https://dbeaver.com/docs/cloudbeaver/) - a web-based database management
  tool. It lets you interact with any database connected to your CloudBeaver server directly from n8n workflows.

  [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)

  ## Installation

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

  ## Operations

  - **Execute SQL Query** - run any SQL query with support for limit, offset, `ORDER BY`, and `WHERE` filters
  - **Select Rows** - retrieve rows from a table with optional `WHERE`, `ORDER BY`, limit, and offset
  - **Insert Rows** - insert a new row by specifying column/value pairs
  - **Update Rows** - update rows by specifying column/value pairs and a WHERE condition
  - **Delete** - delete rows (with optional `WHERE`), truncate, or drop a table

  > **Note:** Only connections from the **Shared project** in CloudBeaver are supported.

  ## Credentials

  Create a **CloudBeaver API** credential with:

  | Field               | Description                                                                                                                  |
  |---------------------|------------------------------------------------------------------------------------------------------------------------------|
  | Server URL          | Base URL of your CloudBeaver server, e.g. `https://cloudbeaver.example.com`                                                  |
  | Authentication Type | `API Token` (for Enterprise or AWS Edition only) or `Local access` (Username/Password)                                       |
  | API Token           | Token generated by Admin in CloudBeaver - [how to generate](https://dbeaver.com/docs/cloudbeaver/Generate-API-access-token/) |
  | Username / Password | Local Access credentials - [docs](https://dbeaver.com/docs/cloudbeaver/Local-Access-Authentication/)                         |

  ## Compatibility

  Requires n8n 1.0.0 or later. Designed for self-hosted CloudBeaver instances (Community, Enterprise or AWS Edition).

  ## Usage

  ### Finding the Connection ID

  Right-click a database in CloudBeaver's **Database Navigator -> Open** -> copy the ID from the connection window (e.g.
  `postgres-jdbc-19d5ca3a223-2f46e1a321049b15`).

  ### Default Database

  The **Default Database** field lets you specify which database or catalog to use when executing SQL. Leave it empty to
  use the connection's default. Useful when a single CloudBeaver connection has access to multiple databases and you want
  to target a specific one.

  ### Database Type

  The **Database Type** field (Select, Insert, Update, Delete operations) controls identifier quoting style:

  | Database Type | Use for                                                                      |
  |---------------|------------------------------------------------------------------------------|
  | PostgreSQL    | PostgreSQL, SQLite, Oracle, Redshift, Greenplum and other ANSI SQL databases |
  | MySQL         | MySQL, MariaDB, TiDB                                                         |
  | SQL Server    | SQL Server, Azure SQL, Sybase                                                |

  For databases not listed, **PostgreSQL** is a safe default - ANSI double-quote quoting works with most SQL databases.

  ### Execute SQL Query

  The **Where** and **Order By** fields are applied on top of your SQL query:

  **SQL Query:**

  ```sql
  SELECT id, name, email
  FROM users
  ```

  **Where:** `status = 'active'`  
  **Order By:** `created_at DESC`  
  **Limit:** `50`

  Executes as:

  ```sql
  SELECT *
  FROM (SELECT id, name, email FROM users) AS _q
  WHERE status = 'active'
  ORDER BY created_at DESC LIMIT 50
  ```

  ### Insert / Update value types

  Insert and Update operations let you choose how each value is formatted in the generated SQL query.

  | Value type | SQL output example |
  |------------|--------------------|
  | String     | `'Alice'`          |
  | Number     | `42`               |
  | Boolean    | `TRUE`             |
  | Null       | `NULL`             |
  | Raw SQL    | `NOW()`            |

  Use **Raw SQL** for database-specific expressions, casts, functions, or complex values, such as `NOW()`,
  `CAST('42' AS INTEGER)`, or `'{"a":1}'::jsonb`.

  > **Warning**: Use Raw SQL only with trusted values. Raw SQL is inserted into the query without escaping.

  ## Getting Started (Local Testing)

  1. Start CloudBeaver:

      ```bash
      docker run -d -p 8978:8978 dbeaver/cloudbeaver:latest
      ```

      Or follow
      the [full installation guide](https://github.com/dbeaver/cloudbeaver-deploy?tab=readme-ov-file#installation-with-docker-image).

  2. Configure authentication - follow
     the [Local Access Authentication guide](https://dbeaver.com/docs/cloudbeaver/Local-Access-Authentication/). Create a
     user (login/password) or use admin credentials.

  3. Create a database connection - follow
     the [Create Connection guide](https://dbeaver.com/docs/cloudbeaver/Create-Connection/).

  4. Get the Connection ID - open [Database Navigator](https://dbeaver.com/docs/cloudbeaver/Database-Navigator/),
     right-click a database -> **Open**, and copy the connection ID from the opened window.

  5. In n8n:
      - Create **CloudBeaver** credentials (Local auth: login/password)
      - Add the **CloudBeaver** node to your workflow
      - Set the **Connection ID**
      - Choose an operation and configure its fields
      - Execute the node

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [CloudBeaver documentation](https://dbeaver.com/docs/cloudbeaver/)
  - [CloudBeaver API token guide](https://dbeaver.com/docs/cloudbeaver/Generate-API-access-token/)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables database interactions via CloudBeaver, allowing users to execute SQL queries, perform CRUD operations, and manage rows on supported databases.","capabilities":["Execute arbitrary SQL queries with WHERE, ORDER BY, LIMIT, and OFFSET support","Select rows from tables with filtering and sorting","Insert new rows with column/value pairs","Update existing rows using WHERE conditions","Delete rows, truncate tables, or drop tables","Support for PostgreSQL, MySQL, SQL Server, SQLite, Oracle, Redshift, and Greenplum","Value type formatting (String, Number, Boolean, Null, Raw SQL)","Connection ID-based authentication"],"authentication":"API Token (Enterprise/AWS Edition) or Local Access (Username/Password)","commonUseCases":["Automated data extraction and reporting from databases","Batch data insertion and synchronization","Dynamic SQL execution in workflow automation","Data cleanup and table management"],"limitations":["Only connections from the Shared project in CloudBeaver are supported","Raw SQL values are inserted without escaping, requiring careful handling to prevent injection","Requires n8n 1.0.0 or later","Designed primarily for self-hosted CloudBeaver instances"],"relatedNodes":["n8n-nodes-base.code","n8n-nodes-base.httpRequest","n8n-nodes-base.set"]}


node_type: @waapi/n8n-nodes-waalaxy-tools.waalaxyTools
package_name: @waapi/n8n-nodes-waalaxy-tools
display_name: Waalaxy Tools
description: Consume tools from the Waalaxy API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: fabazad74
author_github_url: https://github.com/Waapi-Pro/n8n-nodes-waalaxy-tools.git
npm_package_name: @waapi/n8n-nodes-waalaxy-tools
npm_version: 1.1.3
community_fetched_at: 2026-07-14T14:40:34.173Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "findLinkedinUrl",
      "options": [
        {
          "name": "Find LinkedIn URL",
          "value": "findLinkedinUrl",
          "action": "Find LinkedIn profile URL",
          "description": "Find a LinkedIn profile URL by first name, last name, and company"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Find LinkedIn URL",
      "value": "findLinkedinUrl",
      "action": "Find LinkedIn profile URL",
      "description": "Find a LinkedIn profile URL by first name, last name, and company"
    }
  ]

npm_readme:
  # n8n-nodes-waalaxy-tools

  This is an n8n community node. It lets you use [Waalaxy](https://www.waalaxy.com/) Tools in your n8n workflows.

  [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)

  ## Installation

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

  ## Operations

  ### Find LinkedIn URL

  Find a LinkedIn profile URL by providing a first name, last name, and company.

  | Parameter  | Type   | Required | Description                          |
  | ---------- | ------ | -------- | ------------------------------------ |
  | First Name | string | Yes      | The first name of the person         |
  | Last Name  | string | Yes      | The last name of the person          |
  | Company    | string | Yes      | The company the person is working at |

  ## Credentials

  This node authenticates via **OAuth2** using the Waalaxy Tools API.

  1. In n8n, go to **Credentials** > **New Credential**.
  2. Search for **Waalaxy Tools OAuth2 API**.
  3. Enter your **Client ID** and **Client Secret** (provided by Waalaxy).
  4. Click **Connect my account** to complete the OAuth2 authorization flow.

  The authorization and token endpoints are pre-configured — no additional setup is needed.

  ## Compatibility

  Tested with n8n >= 1.60.0.

  ## Usage

  ### Single lookup

  1. Add the **Waalaxy Tools** node to your workflow.
  2. Select the **Find LinkedIn URL** operation.
  3. Fill in the **First Name**, **Last Name**, and **Company** fields.
  4. Execute the node.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Waalaxy website](https://www.waalaxy.com/)

ai_documentation_summary:
  {"purpose":"This n8n community node enables users to search for LinkedIn profile URLs using the Waalaxy Tools API.","capabilities":["Search for LinkedIn profiles by first name, last name, and company","Return LinkedIn profile URLs based on provided search criteria"],"authentication":"OAuth2","commonUseCases":["Automating LinkedIn lead discovery","Integrating with recruitment or sales workflows to find candidate profiles"],"limitations":["Limited to single lookup operations (no batch or advanced filtering mentioned)","Requires valid OAuth2 credentials from Waalaxy"],"relatedNodes":["Waalaxy Tools","LinkedIn","Search"]}


node_type: n8n-nodes-scavio.scavio
package_name: n8n-nodes-scavio
display_name: Scavio
description: Real-time search across Google, Amazon, Walmart, YouTube, Reddit, TikTok, and Instagram
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: scavio
author_github_url: https://github.com/scavio-ai/
npm_package_name: n8n-nodes-scavio
npm_version: 0.3.1
community_fetched_at: 2026-07-14T14:40:34.173Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "google",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Amazon",
          "value": "amazon"
        },
        {
          "name": "Google",
          "value": "google"
        },
        {
          "name": "Instagram",
          "value": "instagram"
        },
        {
          "name": "Reddit",
          "value": "reddit"
        },
        {
          "name": "TikTok",
          "value": "tiktok"
        },
        {
          "name": "Walmart",
          "value": "walmart"
        },
        {
          "name": "YouTube",
          "value": "youtube"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search google",
          "routing": {
            "request": {
              "url": "/api/v1/google",
              "method": "POST"
            }
          },
          "description": "Search Google and return organic results, knowledge graph, news, and more"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "google"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search Products",
          "value": "search",
          "action": "Search amazon products",
          "routing": {
            "request": {
              "url": "/api/v1/amazon/search",
              "method": "POST"
            }
          },
          "description": "Search Amazon and return product listings"
        },
        {
          "name": "Get Product",
          "value": "product",
          "action": "Get an amazon product",
          "routing": {
            "request": {
              "url": "/api/v1/amazon/product",
              "method": "POST"
            }
          },
          "description": "Get detailed information for an Amazon product by ASIN"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "amazon"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search Products",
          "value": "search",
          "action": "Search walmart products",
          "routing": {
            "request": {
              "url": "/api/v1/walmart/search",
              "method": "POST"
            }
          },
          "description": "Search Walmart and return product listings"
        },
        {
          "name": "Get Product",
          "value": "product",
          "action": "Get a walmart product",
          "routing": {
            "request": {
              "url": "/api/v1/walmart/product",
              "method": "POST"
            }
          },
          "description": "Get detailed information for a Walmart product by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "walmart"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search you tube",
          "routing": {
            "request": {
              "url": "/api/v1/youtube/search",
              "method": "POST"
            }
          },
          "description": "Search YouTube and return videos, channels, or playlists"
        },
        {
          "name": "Get Metadata",
          "value": "metadata",
          "action": "Get you tube video metadata",
          "routing": {
            "request": {
              "url": "/api/v1/youtube/metadata",
              "method": "POST"
            }
          },
          "description": "Get full metadata for a YouTube video by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "youtube"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search Posts",
          "value": "search",
          "action": "Search reddit posts",
          "routing": {
            "request": {
              "url": "/api/v1/reddit/search",
              "method": "POST"
            }
          },
          "description": "Search Reddit and return matching posts or comments"
        },
        {
          "name": "Get Post",
          "value": "post",
          "action": "Get a reddit post",
          "routing": {
            "request": {
              "url": "/api/v1/reddit/post",
              "method": "POST"
            }
          },
          "description": "Fetch a Reddit post's metadata and full comment thread"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reddit"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getProfile",
      "options": [
        {
          "name": "Get Comment Replies",
          "value": "getCommentReplies",
          "action": "Get tiktok comment replies",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/video/comments/replies",
              "method": "POST"
            }
          },
          "description": "Get replies to a TikTok comment"
        },
        {
          "name": "Get Hashtag",
          "value": "getHashtag",
          "action": "Get a tiktok hashtag",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/hashtag",
              "method": "POST"
            }
          },
          "description": "Get TikTok hashtag info by name or ID"
        },
        {
          "name": "Get Hashtag Videos",
          "value": "getHashtagVideos",
          "action": "Get tiktok hashtag videos",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/hashtag/videos",
              "method": "POST"
            }
          },
          "description": "List videos under a TikTok hashtag"
        },
        {
          "name": "Get Profile",
          "value": "getProfile",
          "action": "Get a tiktok profile",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/profile",
              "method": "POST"
            }
          },
          "description": "Get a TikTok user profile by username or sec_user_id"
        },
        {
          "name": "Get User Followers",
          "value": "getUserFollowers",
          "action": "Get tiktok user followers",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/user/followers",
              "method": "POST"
            }
          },
          "description": "Get a TikTok user's followers"
        },
        {
          "name": "Get User Followings",
          "value": "getUserFollowings",
          "action": "Get tiktok user followings",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/user/followings",
              "method": "POST"
            }
          },
          "description": "List a TikTok user's followings"
        },
        {
          "name": "Get User Posts",
          "value": "getUserPosts",
          "action": "Get tiktok user posts",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/user/posts",
              "method": "POST"
            }
          },
          "description": "List a TikTok user's videos"
        },
        {
          "name": "Get Video",
          "value": "getVideo",
          "action": "Get a tiktok video",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/video",
              "method": "POST"
            }
          },
          "description": "Fetch details for a single TikTok video"
        },
        {
          "name": "Get Video Comments",
          "value": "getVideoComments",
          "action": "Get tiktok video comments",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/video/comments",
              "method": "POST"
            }
          },
          "description": "Get comments on a TikTok video"
        },
        {
          "name": "Search Users",
          "value": "searchUsers",
          "action": "Search tiktok users",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/search/users",
              "method": "POST"
            }
          },
          "description": "Search TikTok users by keyword"
        },
        {
          "name": "Search Videos",
          "value": "searchVideos",
          "action": "Search tiktok videos",
          "routing": {
            "request": {
              "url": "/api/v1/tiktok/search/videos",
              "method": "POST"
            }
          },
          "description": "Search TikTok videos by keyword"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tiktok"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "profile",
      "options": [
        {
          "name": "Get Comment Replies",
          "value": "commentReplies",
          "action": "Get instagram comment replies",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/post/comments/replies",
              "method": "POST"
            }
          },
          "description": "Get replies to an Instagram comment"
        },
        {
          "name": "Get Post",
          "value": "post",
          "action": "Get an instagram post",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/post",
              "method": "POST"
            }
          },
          "description": "Fetch details for a single Instagram post by URL, media ID, or shortcode"
        },
        {
          "name": "Get Post Comments",
          "value": "postComments",
          "action": "Get instagram post comments",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/post/comments",
              "method": "POST"
            }
          },
          "description": "Get comments on an Instagram post"
        },
        {
          "name": "Get Profile",
          "value": "profile",
          "action": "Get an instagram profile",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/profile",
              "method": "POST"
            }
          },
          "description": "Get an Instagram user profile by username or user ID"
        },
        {
          "name": "Get User Followers",
          "value": "userFollowers",
          "action": "Get instagram user followers",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/user/followers",
              "method": "POST"
            }
          },
          "description": "Get an Instagram user's followers"
        },
        {
          "name": "Get User Followings",
          "value": "userFollowings",
          "action": "Get instagram user followings",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/user/followings",
              "method": "POST"
            }
          },
          "description": "List an Instagram user's followings"
        },
        {
          "name": "Get User Posts",
          "value": "userPosts",
          "action": "Get instagram user posts",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/user/posts",
              "method": "POST"
            }
          },
          "description": "List an Instagram user's posts"
        },
        {
          "name": "Get User Reels",
          "value": "userReels",
          "action": "Get instagram user reels",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/user/reels",
              "method": "POST"
            }
          },
          "description": "List an Instagram user's reels"
        },
        {
          "name": "Get User Stories",
          "value": "userStories",
          "action": "Get instagram user stories",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/user/stories",
              "method": "POST"
            }
          },
          "description": "Get an Instagram user's stories"
        },
        {
          "name": "Get User Tagged",
          "value": "userTagged",
          "action": "Get instagram user tagged posts",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/user/tagged",
              "method": "POST"
            }
          },
          "description": "List posts an Instagram user is tagged in"
        },
        {
          "name": "Search Hashtags",
          "value": "searchHashtags",
          "action": "Search instagram hashtags",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/search/hashtags",
              "method": "POST"
            }
          },
          "description": "Search Instagram hashtags by keyword"
        },
        {
          "name": "Search Users",
          "value": "searchUsers",
          "action": "Search instagram users",
          "routing": {
            "request": {
              "url": "/api/v1/instagram/search/users",
              "method": "POST"
            }
          },
          "description": "Search Instagram users by keyword"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "instagram"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "usage",
      "options": [
        {
          "name": "Get Usage",
          "value": "usage",
          "action": "Get account usage",
          "routing": {
            "request": {
              "url": "/api/v1/usage",
              "method": "GET"
            }
          },
          "description": "Return current plan, credit balance, usage count, and auto-recharge settings"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Search",
      "value": "search",
      "action": "Search google",
      "routing": {
        "request": {
          "url": "/api/v1/google",
          "method": "POST"
        }
      },
      "description": "Search Google and return organic results, knowledge graph, news, and more",
      "resource": "google"
    },
    {
      "name": "Search Products",
      "value": "search",
      "action": "Search amazon products",
      "routing": {
        "request": {
          "url": "/api/v1/amazon/search",
          "method": "POST"
        }
      },
      "description": "Search Amazon and return product listings",
      "resource": "amazon"
    },
    {
      "name": "Get Product",
      "value": "product",
      "action": "Get an amazon product",
      "routing": {
        "request": {
          "url": "/api/v1/amazon/product",
          "method": "POST"
        }
      },
      "description": "Get detailed information for an Amazon product by ASIN",
      "resource": "amazon"
    },
    {
      "name": "Search Products",
      "value": "search",
      "action": "Search walmart products",
      "routing": {
        "request": {
          "url": "/api/v1/walmart/search",
          "method": "POST"
        }
      },
      "description": "Search Walmart and return product listings",
      "resource": "walmart"
    },
    {
      "name": "Get Product",
      "value": "product",
      "action": "Get a walmart product",
      "routing": {
        "request": {
          "url": "/api/v1/walmart/product",
          "method": "POST"
        }
      },
      "description": "Get detailed information for a Walmart product by ID",
      "resource": "walmart"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search you tube",
      "routing": {
        "request": {
          "url": "/api/v1/youtube/search",
          "method": "POST"
        }
      },
      "description": "Search YouTube and return videos, channels, or playlists",
      "resource": "youtube"
    },
    {
      "name": "Get Metadata",
      "value": "metadata",
      "action": "Get you tube video metadata",
      "routing": {
        "request": {
          "url": "/api/v1/youtube/metadata",
          "method": "POST"
        }
      },
      "description": "Get full metadata for a YouTube video by ID",
      "resource": "youtube"
    },
    {
      "name": "Search Posts",
      "value": "search",
      "action": "Search reddit posts",
      "routing": {
        "request": {
          "url": "/api/v1/reddit/search",
          "method": "POST"
        }
      },
      "description": "Search Reddit and return matching posts or comments",
      "resource": "reddit"
    },
    {
      "name": "Get Post",
      "value": "post",
      "action": "Get a reddit post",
      "routing": {
        "request": {
          "url": "/api/v1/reddit/post",
          "method": "POST"
        }
      },
      "description": "Fetch a Reddit post's metadata and full comment thread",
      "resource": "reddit"
    },
    {
      "name": "Get Comment Replies",
      "value": "getCommentReplies",
      "action": "Get tiktok comment replies",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/video/comments/replies",
          "method": "POST"
        }
      },
      "description": "Get replies to a TikTok comment",
      "resource": "tiktok"
    },
    {
      "name": "Get Hashtag",
      "value": "getHashtag",
      "action": "Get a tiktok hashtag",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/hashtag",
          "method": "POST"
        }
      },
      "description": "Get TikTok hashtag info by name or ID",
      "resource": "tiktok"
    },
    {
      "name": "Get Hashtag Videos",
      "value": "getHashtagVideos",
      "action": "Get tiktok hashtag videos",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/hashtag/videos",
          "method": "POST"
        }
      },
      "description": "List videos under a TikTok hashtag",
      "resource": "tiktok"
    },
    {
      "name": "Get Profile",
      "value": "getProfile",
      "action": "Get a tiktok profile",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/profile",
          "method": "POST"
        }
      },
      "description": "Get a TikTok user profile by username or sec_user_id",
      "resource": "tiktok"
    },
    {
      "name": "Get User Followers",
      "value": "getUserFollowers",
      "action": "Get tiktok user followers",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/user/followers",
          "method": "POST"
        }
      },
      "description": "Get a TikTok user's followers",
      "resource": "tiktok"
    },
    {
      "name": "Get User Followings",
      "value": "getUserFollowings",
      "action": "Get tiktok user followings",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/user/followings",
          "method": "POST"
        }
      },
      "description": "List a TikTok user's followings",
      "resource": "tiktok"
    },
    {
      "name": "Get User Posts",
      "value": "getUserPosts",
      "action": "Get tiktok user posts",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/user/posts",
          "method": "POST"
        }
      },
      "description": "List a TikTok user's videos",
      "resource": "tiktok"
    },
    {
      "name": "Get Video",
      "value": "getVideo",
      "action": "Get a tiktok video",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/video",
          "method": "POST"
        }
      },
      "description": "Fetch details for a single TikTok video",
      "resource": "tiktok"
    },
    {
      "name": "Get Video Comments",
      "value": "getVideoComments",
      "action": "Get tiktok video comments",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/video/comments",
          "method": "POST"
        }
      },
      "description": "Get comments on a TikTok video",
      "resource": "tiktok"
    },
    {
      "name": "Search Users",
      "value": "searchUsers",
      "action": "Search tiktok users",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/search/users",
          "method": "POST"
        }
      },
      "description": "Search TikTok users by keyword",
      "resource": "tiktok"
    },
    {
      "name": "Search Videos",
      "value": "searchVideos",
      "action": "Search tiktok videos",
      "routing": {
        "request": {
          "url": "/api/v1/tiktok/search/videos",
          "method": "POST"
        }
      },
      "description": "Search TikTok videos by keyword",
      "resource": "tiktok"
    },
    {
      "name": "Get Comment Replies",
      "value": "commentReplies",
      "action": "Get instagram comment replies",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/post/comments/replies",
          "method": "POST"
        }
      },
      "description": "Get replies to an Instagram comment",
      "resource": "instagram"
    },
    {
      "name": "Get Post",
      "value": "post",
      "action": "Get an instagram post",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/post",
          "method": "POST"
        }
      },
      "description": "Fetch details for a single Instagram post by URL, media ID, or shortcode",
      "resource": "instagram"
    },
    {
      "name": "Get Post Comments",
      "value": "postComments",
      "action": "Get instagram post comments",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/post/comments",
          "method": "POST"
        }
      },
      "description": "Get comments on an Instagram post",
      "resource": "instagram"
    },
    {
      "name": "Get Profile",
      "value": "profile",
      "action": "Get an instagram profile",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/profile",
          "method": "POST"
        }
      },
      "description": "Get an Instagram user profile by username or user ID",
      "resource": "instagram"
    },
    {
      "name": "Get User Followers",
      "value": "userFollowers",
      "action": "Get instagram user followers",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/user/followers",
          "method": "POST"
        }
      },
      "description": "Get an Instagram user's followers",
      "resource": "instagram"
    },
    {
      "name": "Get User Followings",
      "value": "userFollowings",
      "action": "Get instagram user followings",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/user/followings",
          "method": "POST"
        }
      },
      "description": "List an Instagram user's followings",
      "resource": "instagram"
    },
    {
      "name": "Get User Posts",
      "value": "userPosts",
      "action": "Get instagram user posts",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/user/posts",
          "method": "POST"
        }
      },
      "description": "List an Instagram user's posts",
      "resource": "instagram"
    },
    {
      "name": "Get User Reels",
      "value": "userReels",
      "action": "Get instagram user reels",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/user/reels",
          "method": "POST"
        }
      },
      "description": "List an Instagram user's reels",
      "resource": "instagram"
    },
    {
      "name": "Get User Stories",
      "value": "userStories",
      "action": "Get instagram user stories",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/user/stories",
          "method": "POST"
        }
      },
      "description": "Get an Instagram user's stories",
      "resource": "instagram"
    },
    {
      "name": "Get User Tagged",
      "value": "userTagged",
      "action": "Get instagram user tagged posts",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/user/tagged",
          "method": "POST"
        }
      },
      "description": "List posts an Instagram user is tagged in",
      "resource": "instagram"
    },
    {
      "name": "Search Hashtags",
      "value": "searchHashtags",
      "action": "Search instagram hashtags",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/search/hashtags",
          "method": "POST"
        }
      },
      "description": "Search Instagram hashtags by keyword",
      "resource": "instagram"
    },
    {
      "name": "Search Users",
      "value": "searchUsers",
      "action": "Search instagram users",
      "routing": {
        "request": {
          "url": "/api/v1/instagram/search/users",
          "method": "POST"
        }
      },
      "description": "Search Instagram users by keyword",
      "resource": "instagram"
    },
    {
      "name": "Get Usage",
      "value": "usage",
      "action": "Get account usage",
      "routing": {
        "request": {
          "url": "/api/v1/usage",
          "method": "GET"
        }
      },
      "description": "Return current plan, credit balance, usage count, and auto-recharge settings",
      "resource": "account"
    }
  ]

npm_readme:
  # n8n-nodes-scavio

  This is an n8n community node. It lets you use [Scavio](https://scavio.dev) — a real-time search API for Google, Amazon, Walmart, YouTube, Reddit, TikTok, and Instagram — in your n8n workflows.

  Scavio returns clean, structured JSON from organic search across the major discovery surfaces. Use it to power product research, sentiment monitoring, AI agent retrieval, lead enrichment, and content workflows.

  [Installation](#installation) - [Operations](#operations) - [Credentials](#credentials) - [Compatibility](#compatibility) - [Resources](#resources)

  ## Installation

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

  In n8n: **Settings -> Community Nodes -> Install** -> enter `n8n-nodes-scavio`.

  ## Operations

  | Resource | Operations |
  | --- | --- |
  | Google | Search |
  | Amazon | Search Products, Get Product |
  | Walmart | Search Products, Get Product |
  | YouTube | Search, Get Metadata |
  | Reddit | Search Posts, Get Post |
  | TikTok | Get Profile, Get User Posts, Get Video, Get Video Comments, Get Comment Replies, Search Videos, Search Users, Get Hashtag, Get Hashtag Videos, Get User Followers, Get User Followings |
  | Instagram | Get Profile, Get User Posts, Get User Reels, Get User Tagged, Get User Stories, Get Post, Get Post Comments, Get Comment Replies, Search Users, Search Hashtags, Get User Followers, Get User Followings |
  | Account | Get Usage |

  ## Credentials

  You need a Scavio API key. Sign up at [scavio.dev](https://scavio.dev), grab your key from the dashboard, and paste it into the `Scavio API` credential in n8n.

  The credential test calls `GET /api/v1/usage` (free) so you get instant feedback that your key works.

  ## Compatibility

  - Requires n8n version 1.0 or later.
  - Tested against Scavio API v1 (`https://api.scavio.dev`).

  ## Resources

  - [Scavio docs](https://scavio.dev/docs/introduction)
  - [Scavio dashboard](https://dashboard.scavio.dev)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)


  ## About Scavio

  [Scavio](https://scavio.dev) is a unified [search API](https://scavio.dev/docs/search-api) built for AI agents — one API key, structured JSON, no scraping or proxies. A real-time [Tavily alternative](https://scavio.dev) and [SerpAPI alternative](https://scavio.dev) with data from:

  - [Google Search API](https://scavio.dev/docs/search-api) — SERP results, news, images, maps, and knowledge graph
  - [Amazon Product API](https://scavio.dev/docs/amazon-api) and [Walmart API](https://scavio.dev/docs/walmart-api) — product search and details
  - [YouTube API](https://scavio.dev/docs/youtube-api), [TikTok API](https://scavio.dev/docs/tiktok-api), and [Instagram API](https://scavio.dev/docs/instagram-api) — video and social media data
  - [Reddit API](https://scavio.dev/docs/reddit-api) — posts and threaded comments

  Get a free [API key](https://dashboard.scavio.dev) and explore the [documentation](https://scavio.dev/docs/introduction).

ai_documentation_summary:
  {"purpose":"A community n8n node that enables real-time organic search across Google, Amazon, Walmart, YouTube, Reddit, and TikTok using the Scavio API.","capabilities":["Google Search","Amazon Product Search","Amazon Product Details","Walmart Product Search","Walmart Product Details","YouTube Search","YouTube Metadata Retrieval","Reddit Post Search","Reddit Post Retrieval","TikTok Profile Retrieval"],"authentication":"API key required (Scavio API key from scavio.dev dashboard)","commonUseCases":["Product research","Sentiment monitoring","AI agent retrieval","Lead enrichment","Content workflows"],"limitations":["Community node (not official n8n node)","Requires external API key subscription"],"relatedNodes":["Scavio API","Community Nodes"]}


node_type: n8n-nodes-taboola.taboola
package_name: n8n-nodes-taboola
display_name: Taboola
description: Interact with the Taboola Backstage 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-taboola
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:34.175Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "campaign",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Campaign",
          "value": "campaign"
        },
        {
          "name": "Campaign Item",
          "value": "campaignItem"
        },
        {
          "name": "Report",
          "value": "report"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many accounts",
          "description": "Get many allowed accounts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a campaign",
          "description": "Create a campaign"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a campaign",
          "description": "Delete a campaign"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a campaign",
          "description": "Get a campaign"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many campaigns",
          "description": "Get many campaigns"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a campaign",
          "description": "Update a campaign"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "campaign"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a campaign item",
          "description": "Create a campaign item"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a campaign item",
          "description": "Delete a campaign item"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many campaign items",
          "description": "Get many campaign items"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a campaign item",
          "description": "Update a campaign item"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "campaignItem"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "campaignSummary",
      "options": [
        {
          "name": "Campaign History",
          "value": "campaignHistory",
          "action": "Get campaign history report",
          "description": "Get campaign history/audit log report"
        },
        {
          "name": "Campaign Summary",
          "value": "campaignSummary",
          "action": "Get campaign summary report",
          "description": "Get campaign summary report"
        },
        {
          "name": "Top Campaign Content",
          "value": "topCampaignContent",
          "action": "Get top campaign content report",
          "description": "Get top campaign content report"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "report"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many accounts",
      "description": "Get many allowed accounts",
      "resource": "account"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a campaign",
      "description": "Create a campaign",
      "resource": "campaign"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a campaign",
      "description": "Delete a campaign",
      "resource": "campaign"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a campaign",
      "description": "Get a campaign",
      "resource": "campaign"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many campaigns",
      "description": "Get many campaigns",
      "resource": "campaign"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a campaign",
      "description": "Update a campaign",
      "resource": "campaign"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a campaign item",
      "description": "Create a campaign item",
      "resource": "campaignItem"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a campaign item",
      "description": "Delete a campaign item",
      "resource": "campaignItem"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many campaign items",
      "description": "Get many campaign items",
      "resource": "campaignItem"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a campaign item",
      "description": "Update a campaign item",
      "resource": "campaignItem"
    },
    {
      "name": "Campaign History",
      "value": "campaignHistory",
      "action": "Get campaign history report",
      "description": "Get campaign history/audit log report",
      "resource": "report"
    },
    {
      "name": "Campaign Summary",
      "value": "campaignSummary",
      "action": "Get campaign summary report",
      "description": "Get campaign summary report",
      "resource": "report"
    },
    {
      "name": "Top Campaign Content",
      "value": "topCampaignContent",
      "action": "Get top campaign content report",
      "description": "Get top campaign content report",
      "resource": "report"
    }
  ]

npm_readme:
  # n8n-nodes-taboola

  This is an [n8n](https://n8n.io/) community node that integrates with the [Taboola Backstage API](https://developers.taboola.com/backstage-api/reference/welcome). It allows you to manage your Taboola advertising campaigns, campaign items, accounts, and reports directly from n8n workflows.

  ## Table of Contents

  - [Installation](#installation)
  - [Credentials](#credentials)
  - [Resources & Operations](#resources--operations)
  - [Usage](#usage)
  - [Compatibility](#compatibility)
  - [License](#license)

  ## Installation

  ### Community Node (Recommended)

  1. Open your n8n instance
  2. Go to **Settings > Community Nodes**
  3. Select **Install a community node**
  4. Enter `n8n-nodes-taboola`
  5. Confirm the installation

  ### Manual Installation

  1. Clone this repository:
     ```bash
     git clone https://github.com/your-repo/n8n-nodes-taboola.git
     cd n8n-nodes-taboola
     ```
  2. Install dependencies:
     ```bash
     npm install
     ```
  3. Build the project:
     ```bash
     npm run build
     ```
  4. Link to your n8n installation:
     ```bash
     npm link
     cd /path/to/your/n8n
     npm link n8n-nodes-taboola
     ```
  5. Restart n8n. The **Taboola** node will appear in the node list.

  ### Docker

  If you are running n8n with Docker, add the following to your `docker-compose.yml` environment:

  ```yaml
  environment:
    - N8N_COMMUNITY_PACKAGES=n8n-nodes-taboola
  ```

  ## Credentials

  This node uses the **Taboola Backstage API** OAuth2 Client Credentials flow for authentication.

  You will need:

  | Field | Description |
  |---|---|
  | **Client ID** | Provided by your Taboola account manager |
  | **Client Secret** | Provided by your Taboola account manager |

  The node automatically requests an access token from `https://backstage.taboola.com/backstage/oauth/token` using your credentials. Tokens are valid for 12 hours.

  To set up credentials in n8n:

  1. Go to **Credentials** in the n8n sidebar
  2. Click **Add Credential**
  3. Search for **Taboola API**
  4. Enter your Client ID and Client Secret
  5. Click **Save**

  ## Resources & Operations

  ### Account

  | Operation | Description |
  |---|---|
  | **Get All** | Retrieve all advertiser/publisher accounts you have access to |

  ### Campaign

  | Operation | Description |
  |---|---|
  | **Create** | Create a new campaign with name, branding text, CPC, spending limit, and optional targeting |
  | **Get** | Retrieve a single campaign by ID |
  | **Get All** | Retrieve all campaigns for an account |
  | **Update** | Update an existing campaign (name, CPC, spending limit, status, dates, delivery model) |
  | **Delete** | Delete a campaign by ID |

  **Campaign creation fields:**

  - Campaign Name (required)
  - Brand Text (required)
  - CPC - Cost Per Click (required)
  - Spending Limit
  - Spending Limit Model (Entire / Monthly / Daily)
  - Start Date / End Date
  - Active status
  - Daily Ad Delivery Model (Accelerated / Balanced / Strict)
  - Marketing Objective (Brand Awareness / Drive Website Traffic / Online Purchases / Lead Generation)
  - Country Targeting (comma-separated country codes)
  - Platform Targeting (Desktop / Mobile / Tablet)

  ### Campaign Item

  | Operation | Description |
  |---|---|
  | **Create** | Create a new campaign item (ad) with a landing page URL, title, and thumbnail |
  | **Get All** | Retrieve all items for a campaign |
  | **Update** | Update an existing item (title, URL, thumbnail, active status) |
  | **Delete** | Delete a campaign item by ID |

  ### Report

  | Operation | Description |
  |---|---|
  | **Campaign Summary** | Get a campaign summary report grouped by day, week, or month |
  | **Top Campaign Content** | Get the top campaign content report (top 1,000 items) |

  **Report parameters:**

  - Dimension (Day / Week / Month)
  - Start Date (required, YYYY-MM-DD)
  - End Date (required, YYYY-MM-DD)
  - Campaign ID (optional filter)

  ## Usage

  ### Example: Get All Campaigns

  1. Add a **Taboola** node to your workflow
  2. Select your Taboola API credentials
  3. Set **Resource** to `Campaign`
  4. Set **Operation** to `Get All`
  5. Enter your **Account ID**
  6. Execute the node

  ### Example: Create a Campaign

  1. Add a **Taboola** node to your workflow
  2. Select your Taboola API credentials
  3. Set **Resource** to `Campaign`
  4. Set **Operation** to `Create`
  5. Enter your **Account ID**
  6. Fill in the campaign name, brand text, and CPC
  7. Optionally configure spending limits, dates, and targeting
  8. Execute the node

  ### Example: Generate a Report

  1. Add a **Taboola** node to your workflow
  2. Select your Taboola API credentials
  3. Set **Resource** to `Report`
  4. Set **Operation** to `Campaign Summary`
  5. Enter your **Account ID**, start date, end date, and dimension
  6. Execute the node

  ## Compatibility

  - **n8n version:** 1.0.0 or later
  - **Node.js version:** 22 or later

  ## API Reference

  This node is built on the [Taboola Backstage API v1.0](https://developers.taboola.com/backstage-api/reference/welcome).

  - Base URL: `https://backstage.taboola.com/backstage/api/1.0`
  - Authentication: [Client Credentials Flow](https://developers.taboola.com/backstage-api/reference/client-credentials-flow)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables management of Taboola advertising campaigns, items, accounts, and reports via the Taboola Backstage API.","capabilities":["Retrieve all advertiser/publisher accounts","Create, read, update, and delete campaigns","Create, read, update, and delete campaign items (ads)","Generate campaign summary reports by day, week, or month","Retrieve top campaign content reports","Configure campaign targeting (country, platform) and delivery models","Set spending limits and marketing objectives"],"authentication":"OAuth2 Client Credentials flow using Client ID and Client Secret","commonUseCases":["Automated creation and management of digital ad campaigns","Real-time monitoring and reporting of campaign performance","Dynamic ad item updates based on performance data","Automated campaign budget management"],"limitations":["Requires manual installation or Docker configuration for non-standard setups","OAuth2 tokens expire after 12 hours","Requires n8n version 1.0.0 or later and Node.js version 22 or later","Client credentials must be provided by Taboola account manager"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.credentialManager"]}


node_type: @pir-ahsan-raza/n8n-nodes-plausible.plausible
package_name: @pir-ahsan-raza/n8n-nodes-plausible
display_name: Plausible
description: Interact with Plausible Analytics API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: pir-ahsan-raza
author_github_url: https://github.com/pir-ahsan-raza/n8n-nodes-plausible.git
npm_package_name: @pir-ahsan-raza/n8n-nodes-plausible
npm_version: 0.1.7
community_fetched_at: 2026-07-14T14:40:34.176Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "realtimeVisitors",
      "options": [
        {
          "name": "Get Aggregate Stats",
          "value": "aggregate",
          "action": "Get aggregate stats",
          "description": "Get aggregate stats for pageviews, visits, and bounce rate"
        },
        {
          "name": "Get Breakdown",
          "value": "breakdown",
          "action": "Get breakdown",
          "description": "Get stats broken down by a property such as page or country"
        },
        {
          "name": "Get Realtime Visitors",
          "value": "realtimeVisitors",
          "action": "Get realtime visitors",
          "description": "Get number of current visitors on your site"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Aggregate Stats",
      "value": "aggregate",
      "action": "Get aggregate stats",
      "description": "Get aggregate stats for pageviews, visits, and bounce rate"
    },
    {
      "name": "Get Breakdown",
      "value": "breakdown",
      "action": "Get breakdown",
      "description": "Get stats broken down by a property such as page or country"
    },
    {
      "name": "Get Realtime Visitors",
      "value": "realtimeVisitors",
      "action": "Get realtime visitors",
      "description": "Get number of current visitors on your site"
    }
  ]

npm_readme:
  # n8n-nodes-plausible

  This is an n8n community node for [Plausible Analytics](https://plausible.io/).

  Plausible is a lightweight, open-source, privacy-friendly web analytics tool. This node lets you query your Plausible stats directly inside n8n workflows.

  ## Operations

  - **Get Realtime Visitors** — Get the number of current visitors on your site
  - **Get Aggregate Stats** — Get pageviews, visits, bounce rate, and visit duration for a time period
  - **Get Breakdown** — Get stats broken down by page, country, browser, device, or source

  ## Credentials

  You need a Plausible API key:
  1. Log in to your Plausible account
  2. Go to Settings → API Keys
  3. Generate a new key and copy it
  4. In n8n, add a new Plausible credential and paste the key

  ## Compatibility

  Tested with n8n version 1.x and Plausible Cloud (plausible.io).
  For self-hosted Plausible instances, update the Base URL in the credential settings.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Plausible API documentation](https://plausible.io/docs/stats-api)

ai_documentation_summary:
  {"purpose":"This n8n community node enables querying Plausible Analytics API to retrieve website statistics directly within n8n workflows.","capabilities":["Get realtime visitor count","Get aggregate stats (pageviews, visits, bounce rate, visit duration) for a time period","Get breakdown stats by page, country, browser, device, or source"],"authentication":"API key required (Plausible API key)","commonUseCases":["Monitor current website traffic in real-time","Analyze historical pageview and visit metrics","Segment analytics data by location, device, or traffic source"],"limitations":["Tested only with Plausible Cloud (plausible.io); self-hosted instances require manual Base URL configuration","Community node (not official n8n integration)"],"relatedNodes":["Webhook","HTTP Request","Function"]}


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

updated_at: 2026-07-14 14:40:34
author_name: 0xminik
author_github_url: https://github.com/fynk-com/
npm_package_name: n8n-nodes-fynk
npm_version: 0.1.5
community_fetched_at: 2026-07-14T14:40:34.177Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createFromTemplate",
      "options": [
        {
          "name": "Create From Template",
          "value": "createFromTemplate",
          "action": "Create a document from a template",
          "description": "Create a new fynk document from a template. Ensure all dynamic field values, party details, and signatory information are confirmed before proceeding — do not create a document with missing or placeholder data."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create From Template",
      "value": "createFromTemplate",
      "action": "Create a document from a template",
      "description": "Create a new fynk document from a template. Ensure all dynamic field values, party details, and signatory information are confirmed before proceeding — do not create a document with missing or placeholder data.",
      "resource": "document"
    }
  ]

npm_readme:
  # n8n-nodes-fynk

  This is an n8n community node for [fynk](https://fynk.com) — an AI contract management platform for creating, sending, and legally signing documents. It helps legal, finance, sales, and operations teams automate document workflows and capture legally binding e-signatures (SES, AES, QES) with a full audit trail.

  [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) |
  [Version history](#version-history)

  ## Installation

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

  ## Operations

  ### Document

  - **Create From Template** — Create a new document from a fynk template. Supports setting dynamic field values, parties, signatories, and moving the document directly to signing.

  ## Credentials

  You need a fynk API access token to use this node.

  1. Log in to your fynk account at [app.fynk.com](https://app.fynk.com)
  2. Navigate to **Account Settings → API Integrations → fynk API**
  3. Generate an API token — make sure it has the required capabilities (e.g. **Document Manager** for document creation)
  4. In n8n, create a new **fynk API** credential and paste the token

  ## Compatibility

  Tested against n8n 2.18. Minimum required version is not yet established — please open an issue if you encounter compatibility problems.

  ## Usage

  - Automatically generate and send **sales contracts**, **proposals**, and **offers** when a deal reaches a certain stage in your CRM
  - Create **NDAs**, **data privacy agreements (DPA)**, and **service agreements** from templates without manual effort
  - Trigger document signing workflows for **purchase agreements** and **sales purchase agreements** directly from your ERP or CRM
  - Capture legally binding signatures — **Simple (SES)**, **Advanced (AES)**, or **Qualified (QES)** — with a tamper-proof audit trail
  - Automate document generation for high-volume, repetitive contracts like onboarding agreements or subscription renewals

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [fynk API reference](https://app.fynk.com/v1/docs#/)

  ## Version history

  ### 0.1.0

  Initial release. Supports creating documents from templates.

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of document creation and e-signature capture by interacting with the fynk API, a platform for legally binding contracts.","capabilities":["Create documents from fynk templates","Set dynamic field values in documents","Configure document parties and signatories","Move documents directly to signing workflow","Capture Simple (SES), Advanced (AES), and Qualified (QES) e-signatures","Generate sales contracts, proposals, offers, NDAs, and service agreements","Trigger document workflows from CRM or ERP systems"],"authentication":"API token required (fynk API access token with Document Manager capability)","commonUseCases":["Automating sales contract generation and signing","Creating NDAs and data privacy agreements from templates","Triggering purchase agreement workflows from CRM/ERP","Automating onboarding and subscription renewal documents"],"limitations":["Minimum required n8n version not yet established","Only supports document creation from templates (no other operations listed)"],"relatedNodes":["n8n-nodes-fynk.fynk","CRM integration nodes","ERP integration nodes"]}


node_type: n8n-nodes-wanotifier.wANotifier
package_name: n8n-nodes-wanotifier
display_name: WANotifier
description: Create or update WANotifier contacts and send WhatsApp messages
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: wanotifier
author_github_url: https://github.com/wanotifier-inc/wanotifier-n8n.git
npm_package_name: n8n-nodes-wanotifier
npm_version: 1.0.3
community_fetched_at: 2026-07-14T14:40:34.178Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "contact",
      "options": [
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Message",
          "value": "message"
        },
        {
          "name": "Message Template",
          "value": "messageTemplate"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upsert",
      "options": [
        {
          "name": "Create or Update",
          "value": "upsert",
          "action": "Create or update a contact",
          "description": "Create a new record, or update the current one if it already exists (upsert)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendText",
      "options": [
        {
          "name": "Send Text Message",
          "value": "sendText",
          "action": "Send a text message",
          "description": "Send a plain text WhatsApp message"
        },
        {
          "name": "Send Media Message",
          "value": "sendMedia",
          "action": "Send a media message",
          "description": "Send an image, video, document, audio, or sticker"
        },
        {
          "name": "Send Location",
          "value": "sendLocation",
          "action": "Send a location",
          "description": "Send a location pin"
        },
        {
          "name": "Send Interactive Message",
          "value": "sendInteractive",
          "action": "Send an interactive message",
          "description": "Send a message with up to 3 reply buttons"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send Message Template (Via a Notification)",
          "value": "send",
          "action": "Send a message template via a notification",
          "description": "Send message template from a pre-configured transactional notification"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "messageTemplate"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create or Update",
      "value": "upsert",
      "action": "Create or update a contact",
      "description": "Create a new record, or update the current one if it already exists (upsert)",
      "resource": "contact"
    },
    {
      "name": "Send Text Message",
      "value": "sendText",
      "action": "Send a text message",
      "description": "Send a plain text WhatsApp message",
      "resource": "message"
    },
    {
      "name": "Send Media Message",
      "value": "sendMedia",
      "action": "Send a media message",
      "description": "Send an image, video, document, audio, or sticker",
      "resource": "message"
    },
    {
      "name": "Send Location",
      "value": "sendLocation",
      "action": "Send a location",
      "description": "Send a location pin",
      "resource": "message"
    },
    {
      "name": "Send Interactive Message",
      "value": "sendInteractive",
      "action": "Send an interactive message",
      "description": "Send a message with up to 3 reply buttons",
      "resource": "message"
    },
    {
      "name": "Send Message Template (Via a Notification)",
      "value": "send",
      "action": "Send a message template via a notification",
      "description": "Send message template from a pre-configured transactional notification",
      "resource": "messageTemplate"
    }
  ]

npm_readme:
  # n8n-nodes-wanotifier

  This is an n8n community node. It lets you connect [WANotifier](https://wanotifier.com) — a WhatsApp marketing and automation platform built on the official WhatsApp Business API — to your n8n workflows.

  Use it to keep your contact list in sync with other tools, send free-form WhatsApp messages during an active 24-hour conversation window, and fire pre-configured transactional WhatsApp message templates from any workflow trigger.

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

  [Installation](#installation) · [Credentials](#credentials) · [Operations](#operations) · [Compatibility](#compatibility) · [Resources](#resources)

  ## Installation

  Follow the [n8n community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/). On a self-hosted n8n instance, go to **Settings → Community Nodes → Install** and enter:

  ```
  n8n-nodes-wanotifier
  ```

  ## Credentials

  You'll need a WANotifier account and an API key.

  1. Sign up at [wanotifier.com](https://wanotifier.com).
  2. Open **Integrations → API Integration → API Keys** and copy your default key (or click **Add New Key** to create a dedicated key for n8n).
  3. In n8n, when you add the WANotifier node, click the credentials field and create a new **WANotifier API** credential. Paste the API key and save. n8n will verify the key against WANotifier's `/verify_api` endpoint.

  ## Operations

  The node exposes three resources, each with one or more operations.

  ### Contact

  - **Create or Update** — create a contact or update an existing one (matched by WhatsApp number). Optionally set first/last name, subscription status, tags, lists, and custom attributes. Tags, lists, and attributes are loaded as dropdowns from your WANotifier account.

  ### Message *(send during an active 24-hour conversation window)*

  - **Send Text Message** — plain text body.
  - **Send Media Message** — image, video, document, audio, or sticker via public URL. Document supports filename. Image/video/document support an optional caption.
  - **Send Location** — latitude, longitude, place name, and address.
  - **Send Interactive Message** — message body plus up to 3 reply buttons. Button IDs are auto-generated from the button text.

  ### Message Template

  - **Send Message Template** — fire a pre-configured Transactional Notification by webhook key. Pick the notification from a dropdown; n8n then fetches the template's variable schema and renders an input field for each variable (`header_image_url`, `body_variables_0`, etc.). Variables are sent in the format WANotifier expects, with `body_variables_*` and `button_variables_*` collapsed into arrays.

  ## Compatibility

  Tested against n8n 1.94.0+. Built with `@n8n/node-cli`.

  ## Resources

  - [WANotifier](https://wanotifier.com)
  - [WANotifier × n8n setup guide](https://help.wanotifier.com/en/article/how-to-integrate-wanotifier-with-500-apps-using-n8n-1wb9ic3/)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node connects to WANotifier to manage WhatsApp contacts and send various types of WhatsApp messages, including free-form text, media, locations, interactive messages, and transactional templates.","capabilities":["Create or update WhatsApp contacts with custom attributes","Send plain text messages","Send media messages (images, videos, documents, audio, stickers) via public URLs","Send location messages with coordinates and place details","Send interactive messages with up to 3 reply buttons","Send pre-configured transactional message templates via webhook keys","Manage contact tags, lists, and subscription status"],"authentication":"API key required","commonUseCases":["Automated WhatsApp marketing campaigns","Customer support notifications via WhatsApp","Order confirmations and transactional alerts","Synchronizing contact lists with other CRM or marketing tools"],"limitations":["Message sending is restricted to an active 24-hour conversation window","Media must be provided via public URLs","Interactive messages support a maximum of 3 reply buttons","Transactional templates require pre-configuration in WANotifier"],"relatedNodes":["WANotifier webhook","WANotifier contact","WANotifier message","WANotifier template"]}


node_type: @leadtributor/n8n-nodes-leadtributor.leadtributor
package_name: @leadtributor/n8n-nodes-leadtributor
display_name: leadtributor.cloud
description: Interact with the leadtributor.cloud API for lead management
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: marcell.kehmstedt
author_github_url: https://github.com/leadtributor/n8n-nodes-leadtributor.git
npm_package_name: @leadtributor/n8n-nodes-leadtributor
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.179Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "lead",
      "options": [
        {
          "name": "Form",
          "value": "form"
        },
        {
          "name": "Lead",
          "value": "lead"
        },
        {
          "name": "Market",
          "value": "market"
        },
        {
          "name": "Note",
          "value": "note"
        },
        {
          "name": "Sales Partner",
          "value": "salesPartner"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many forms",
          "description": "List all forms defined by your company"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "form"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Assign to Sales Partner",
          "value": "assignToSalesPartner",
          "action": "Assign a lead to a sales partner",
          "description": "Directly assign a lead to a sales partner"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a lead",
          "description": "Create a new lead"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a lead",
          "description": "Get a lead by ID"
        },
        {
          "name": "Get Duplicates",
          "value": "getLeadDuplicates",
          "action": "Get lead duplicates",
          "description": "Get potential duplicate candidates for a lead"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many leads",
          "description": "List leads with optional filters"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a lead",
          "description": "Update the field lists of a lead"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "lead"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "offerLead",
      "options": [
        {
          "name": "Offer Lead",
          "value": "offerLead",
          "action": "Offer a lead on a market",
          "description": "Offer a lead on a market for distribution to sales partners"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "market"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Add to Lead",
          "value": "create",
          "action": "Add a note to a lead",
          "description": "Add a note to a lead"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many notes",
          "description": "List notes across all leads"
        },
        {
          "name": "Get Many for Lead",
          "value": "getManyByLead",
          "action": "Get many notes for a lead",
          "description": "List notes of a specific lead"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "note"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a sales partner",
          "description": "Delete a sales partner (only allowed when ENDED, PENDING or DECLINED)"
        },
        {
          "name": "End",
          "value": "end",
          "action": "End a sales partner relationship",
          "description": "End an active sales partner relationship"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a sales partner",
          "description": "Get a sales partner by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many sales partners",
          "description": "List sales partners"
        },
        {
          "name": "Invite",
          "value": "invite",
          "action": "Invite a sales partner",
          "description": "Send an email invitation to a potential sales partner"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a sales partner",
          "description": "Update tags and attributes of a sales partner"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "salesPartner"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "subscribe",
      "options": [
        {
          "name": "Subscribe",
          "value": "subscribe",
          "action": "Subscribe to a webhook event",
          "description": "Subscribe to a webhook event"
        },
        {
          "name": "Unsubscribe",
          "value": "unsubscribe",
          "action": "Unsubscribe from a webhook",
          "description": "Unsubscribe from a webhook event by hook ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many forms",
      "description": "List all forms defined by your company",
      "resource": "form"
    },
    {
      "name": "Assign to Sales Partner",
      "value": "assignToSalesPartner",
      "action": "Assign a lead to a sales partner",
      "description": "Directly assign a lead to a sales partner",
      "resource": "lead"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a lead",
      "description": "Create a new lead",
      "resource": "lead"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a lead",
      "description": "Get a lead by ID",
      "resource": "lead"
    },
    {
      "name": "Get Duplicates",
      "value": "getLeadDuplicates",
      "action": "Get lead duplicates",
      "description": "Get potential duplicate candidates for a lead",
      "resource": "lead"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many leads",
      "description": "List leads with optional filters",
      "resource": "lead"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a lead",
      "description": "Update the field lists of a lead",
      "resource": "lead"
    },
    {
      "name": "Offer Lead",
      "value": "offerLead",
      "action": "Offer a lead on a market",
      "description": "Offer a lead on a market for distribution to sales partners",
      "resource": "market"
    },
    {
      "name": "Add to Lead",
      "value": "create",
      "action": "Add a note to a lead",
      "description": "Add a note to a lead",
      "resource": "note"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many notes",
      "description": "List notes across all leads",
      "resource": "note"
    },
    {
      "name": "Get Many for Lead",
      "value": "getManyByLead",
      "action": "Get many notes for a lead",
      "description": "List notes of a specific lead",
      "resource": "note"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a sales partner",
      "description": "Delete a sales partner (only allowed when ENDED, PENDING or DECLINED)",
      "resource": "salesPartner"
    },
    {
      "name": "End",
      "value": "end",
      "action": "End a sales partner relationship",
      "description": "End an active sales partner relationship",
      "resource": "salesPartner"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a sales partner",
      "description": "Get a sales partner by ID",
      "resource": "salesPartner"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many sales partners",
      "description": "List sales partners",
      "resource": "salesPartner"
    },
    {
      "name": "Invite",
      "value": "invite",
      "action": "Invite a sales partner",
      "description": "Send an email invitation to a potential sales partner",
      "resource": "salesPartner"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a sales partner",
      "description": "Update tags and attributes of a sales partner",
      "resource": "salesPartner"
    },
    {
      "name": "Subscribe",
      "value": "subscribe",
      "action": "Subscribe to a webhook event",
      "description": "Subscribe to a webhook event",
      "resource": "webhook"
    },
    {
      "name": "Unsubscribe",
      "value": "unsubscribe",
      "action": "Unsubscribe from a webhook",
      "description": "Unsubscribe from a webhook event by hook ID",
      "resource": "webhook"
    }
  ]

npm_readme:
  # n8n-nodes-leadtributor

  This is an n8n community node that lets you integrate [leadtributor.cloud](https://leadtributor.cloud) into your n8n workflows.

  [leadtributor.cloud](https://leadtributor.cloud) is a B2B SaaS platform for lead distribution and partner relationship management (PRM), helping companies route inbound leads to the right sales partners and track them through the funnel.

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

  [Installation](#installation) · [Operations](#operations) · [Credentials](#credentials) · [Compatibility](#compatibility) · [Usage](#usage) · [Resources](#resources)

  ## Installation

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

  In n8n, install the package:

  ```
  @leadtributor/n8n-nodes-leadtributor
  ```

  ## Operations

  The node exposes the following resources and operations.

  ### Lead

  | Operation | Description |
  |-----------|-------------|
  | Assign to Sales Partner | Directly assign a lead to a sales partner |
  | Create | Create a new lead |
  | Get | Get a lead by ID |
  | Get Duplicates | Get potential duplicate candidates for a lead |
  | Get Many | List leads with optional filters |
  | Update | Update the field lists of a lead |

  For **Create** and **Update**, the input can be provided in two modes:

  - **Form Mapper** — pick fields dynamically from a leadtributor form (recommended for visual mapping in n8n)
  - **Raw JSON** — provide prospect/interest fields as a raw JSON object (advanced)

  ### Form

  | Operation | Description |
  |-----------|-------------|
  | Get Many | List all forms defined by your company |

  ### Sales Partner

  | Operation | Description |
  |-----------|-------------|
  | Get | Get a sales partner by ID |
  | Get Many | List sales partners |
  | Invite | Send an email invitation to a potential sales partner |
  | Update | Update tags and attributes of a sales partner |
  | End | End an active sales partner relationship |
  | Delete | Delete a sales partner (only allowed when ENDED, PENDING or DECLINED) |

  ### Note

  | Operation | Description |
  |-----------|-------------|
  | Add to Lead | Add a note to a lead |
  | Get Many | List notes across all leads |
  | Get Many for Lead | List notes of a specific lead |

  ### Market

  | Operation | Description |
  |-----------|-------------|
  | Offer Lead | Offer a lead on a market for distribution to sales partners |

  ### Webhook

  | Operation | Description |
  |-----------|-------------|
  | Subscribe | Subscribe to a webhook event |
  | Unsubscribe | Unsubscribe from a webhook event by hook ID |

  ## Credentials

  To use this node, you need a **leadtributor API Key**:

  1. Log in to your [leadtributor.cloud](https://leadtributor.cloud) account.
  2. Navigate to your account settings and generate an API Key.
  3. In n8n, add new credentials of type **Leadtributor API**.
  4. Enter your API Key and (optionally) override the base URL.

  | Field    | Description                                                                  | Default                          |
  |----------|------------------------------------------------------------------------------|----------------------------------|
  | API Key  | Your leadtributor API Key. Sent as the value of the `Authorization` header.  | –                                |
  | Base URL | Base URL of the leadtributor API. Use `https://api.demo.leadtributor.cloud` for the demo environment. | `https://api.leadtributor.cloud` |

  The credential includes a built-in connection test against `GET /test`.

  ## Compatibility

  - Requires **n8n 1.0** or later.
  - Tested against **n8n 1.x**.
  - Requires **Node.js 20** or later.

  ## Usage

  A typical lead-intake workflow:

  1. **Trigger** — receive a lead from a website form, CRM, or messaging channel.
  2. **leadtributor — Lead → Create** — create the lead in leadtributor using the Form Mapper to map your incoming fields to a form.
  3. *(Optional)* **leadtributor — Market → Offer Lead** — offer the new lead on a market for sales-partner distribution.
  4. *(Optional)* **leadtributor — Note → Add to Lead** — attach context, source attribution, or follow-up info as a note.

  For real-time integrations, use **Webhook → Subscribe** to receive lead status changes directly into n8n.

  ### AI Agent compatible

  This node can be used as a tool by n8n's [AI Agent](https://docs.n8n.io/advanced-ai/examples/agent-chat/). The agent can autonomously decide which leadtributor operation to call based on the conversation context — for example, creating a lead from a chat message or looking up potential duplicates before deduplication.

  See the [leadtributor API reference](https://developer.leadtributor.cloud) for the full schema of each resource.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [leadtributor.cloud](https://leadtributor.cloud)
  - [leadtributor API documentation](https://developer.leadtributor.cloud)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with leadtributor.cloud, a B2B SaaS platform for lead distribution and partner relationship management (PRM), allowing users to manage leads, sales partners, forms, and notes within n8n workflows.","capabilities":["Create new leads","Get lead by ID","List leads with optional filters","Update lead field lists","Assign leads to sales partners","Get potential duplicate candidates for leads","List all defined forms","List sales partners","Invite sales partners via email","Update sales partner tags and attributes"],"authentication":"API Key required (Leadtributor API Key sent as Authorization header)","commonUseCases":["Automating lead intake from websites or CRMs","Distributing leads to sales partners via markets","Tracking lead status changes through webhooks","Managing partner relationships and invitations","Deduplicating leads before assignment"],"limitations":["Sales partner deletion is only allowed when relationship status is ENDED, PENDING, or DECLINED","Requires Node.js 20 or later","Requires n8n 1.0 or later"],"relatedNodes":["n8n Webhook Node","n8n AI Agent Node","n8n Form Node (for Form Mapper input)"]}


