# nodes

node_type: n8n-nodes-chainstream.chainstream
package_name: n8n-nodes-chainstream
display_name: Chainstream
description: Consume Chainstream API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  {
  "type": "main"
  }
  ]

updated_at: 2026-07-14 14:40:33
author_name: quantum01io
author_github_url: https://github.com/chainstream-io/
npm_package_name: n8n-nodes-chainstream
npm_version: 0.0.92
community_fetched_at: 2026-07-14T14:40:33.437Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "token",
      "options": [
        {
          "name": "Token",
          "value": "token"
        },
        {
          "name": "Wallet",
          "value": "wallet"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Candles",
          "value": "candles",
          "action": "Get token price candles",
          "description": "Get token price candles"
        },
        {
          "name": "Creation",
          "value": "creation",
          "action": "Get token creation information",
          "description": "Get token creation information"
        },
        {
          "name": "Detail",
          "value": "detail",
          "action": "Get detail of token",
          "description": "Get detail of token"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a token",
          "description": "Get a token"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many tokens",
          "description": "Get many tokens"
        },
        {
          "name": "Holders",
          "value": "holders",
          "action": "Get holders of a token",
          "description": "Get holders of a token"
        },
        {
          "name": "Liquidity",
          "value": "liquidity",
          "action": "Get all pools containing this token",
          "description": "Get all pools containing this token"
        },
        {
          "name": "Market Data",
          "value": "marketData",
          "action": "Get token market data",
          "description": "Get token market data"
        },
        {
          "name": "Metadata",
          "value": "metadata",
          "action": "Get metadata of token",
          "description": "Get metadata of token"
        },
        {
          "name": "Mint And Burn",
          "value": "mintAndBurn",
          "action": "Get mint and burn information for a token",
          "description": "Get mint and burn information for a token"
        },
        {
          "name": "Price by Time",
          "value": "price",
          "action": "Get token price at a specific timestamp",
          "description": "Get token price at a specific timestamp"
        },
        {
          "name": "Prices",
          "value": "prices",
          "action": "Get historical price data for a token",
          "description": "Get historical price data for a token"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search token informaton by criteria",
          "description": "Search token information by criteria"
        },
        {
          "name": "Security",
          "value": "security",
          "action": "Get token security information",
          "description": "Get token security information"
        },
        {
          "name": "Stats",
          "value": "stats",
          "action": "Get token statistics",
          "description": "Get token statistics"
        },
        {
          "name": "Top Holders",
          "value": "topHolders",
          "action": "Get the top 20 holders for a token",
          "description": "Get the top 20 holders for a token"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "token"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "balance",
      "options": [
        {
          "name": "Balance",
          "value": "balance",
          "action": "Get wallet balance",
          "description": "Get wallet balance"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "wallet"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Candles",
      "value": "candles",
      "action": "Get token price candles",
      "description": "Get token price candles",
      "resource": "token"
    },
    {
      "name": "Creation",
      "value": "creation",
      "action": "Get token creation information",
      "description": "Get token creation information",
      "resource": "token"
    },
    {
      "name": "Detail",
      "value": "detail",
      "action": "Get detail of token",
      "description": "Get detail of token",
      "resource": "token"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a token",
      "description": "Get a token",
      "resource": "token"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many tokens",
      "description": "Get many tokens",
      "resource": "token"
    },
    {
      "name": "Holders",
      "value": "holders",
      "action": "Get holders of a token",
      "description": "Get holders of a token",
      "resource": "token"
    },
    {
      "name": "Liquidity",
      "value": "liquidity",
      "action": "Get all pools containing this token",
      "description": "Get all pools containing this token",
      "resource": "token"
    },
    {
      "name": "Market Data",
      "value": "marketData",
      "action": "Get token market data",
      "description": "Get token market data",
      "resource": "token"
    },
    {
      "name": "Metadata",
      "value": "metadata",
      "action": "Get metadata of token",
      "description": "Get metadata of token",
      "resource": "token"
    },
    {
      "name": "Mint And Burn",
      "value": "mintAndBurn",
      "action": "Get mint and burn information for a token",
      "description": "Get mint and burn information for a token",
      "resource": "token"
    },
    {
      "name": "Price by Time",
      "value": "price",
      "action": "Get token price at a specific timestamp",
      "description": "Get token price at a specific timestamp",
      "resource": "token"
    },
    {
      "name": "Prices",
      "value": "prices",
      "action": "Get historical price data for a token",
      "description": "Get historical price data for a token",
      "resource": "token"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search token informaton by criteria",
      "description": "Search token information by criteria",
      "resource": "token"
    },
    {
      "name": "Security",
      "value": "security",
      "action": "Get token security information",
      "description": "Get token security information",
      "resource": "token"
    },
    {
      "name": "Stats",
      "value": "stats",
      "action": "Get token statistics",
      "description": "Get token statistics",
      "resource": "token"
    },
    {
      "name": "Top Holders",
      "value": "topHolders",
      "action": "Get the top 20 holders for a token",
      "description": "Get the top 20 holders for a token",
      "resource": "token"
    },
    {
      "name": "Balance",
      "value": "balance",
      "action": "Get wallet balance",
      "description": "Get wallet balance",
      "resource": "wallet"
    }
  ]

npm_readme:
  **Version:** 0.0.92
  **Status:** Submitted to Creator Portal, awaiting approval  
  **Compatible with:** n8n v1.0.0+ (tested on v1.113.0)

  # n8n-nodes-chainstream

  [![Verified on MseeP](https://mseep.ai/badge.svg)](https://mseep.ai/app/bd76f121-1c8f-4f5d-9c65-1eac5d81b6af)

  `n8n-nodes-chainstream` is an n8n community node that enables workflows to access real-time blockchain data via [Chainstream](https://chainstream.io). It supports token, wallet, and trade queries across multiple chains, and is designed for reuse, easy extension, and straightforward review.

  ---

  ## 🚀 Installation

  ```bash
  npm install n8n-nodes-chainstream
  ```

  - Restart n8n to load the new community node.
  - Add the Chainstream node to your workflow and configure credentials.

  ---

  ## 🔐 Credentials

  Create a new credential in n8n:

  - **API Client ID** — Chainstream public key
  - **API Client Secret** — Chainstream private key

  ⚠️ Do not commit real keys to your repository or exported workflows. Use placeholders in templates and bind credentials after import.

  ---

  ## ⚡ Quickstart

  1. Go to **Workflows → Import** in n8n and upload `/templates/workflow.json` from this repo.
  2. Run:

     ```bash
     npm install n8n-nodes-chainstream
     ```

  3. Create and bind your Chainstream credential.
  4. Configure a trigger (e.g., Telegram, webhook, cron).
  5. Run the workflow and inspect the Chainstream node output.

  > Note: `/templates/workflow.json` uses credential placeholders. Replace them after import.

  ---

  ## 🧪 Example Node Configuration

  **Node:** Chainstream

  - **Credentials:** ChainstreamApi
  - **Resource:** token
  - **Operation:** get
  - **Chain ID:** 137
  - **Token Address:** `0x1234...abcd`
  - **Options:** (leave default)

  **Example output:**

  ```json
  {
  	"symbol": "ABC",
  	"name": "Token ABC",
  	"decimals": 18,
  	"address": "0x..."
  }
  ```

  For batch runs, use expressions or upstream nodes to supply dynamic parameters.

  ---

  ## 📚 Supported Resources

  Short summary of supported resources (full mapping in `DEVELOPER.md`):

  - **token** — metadata, prices, holders, liquidity, security, mint/burn
  - **trade** — listings, activities, leaderboards
  - **wallet** — balance queries

  ---

  ## 🧑‍💻 Developer Notes

  The `execute` method builds requests dynamically:

  1. Reads `resource` and `operation` per item
  2. Calls `buildRequest()` to map to `{ method, path, qs }`
  3. Sends request via `chainstreamApiRequest()`
  4. Wraps response with `constructExecutionMetaData()`
  5. Handles errors via `NodeOperationError`, respects `continueOnFail`

  Full handler mapping and endpoint patterns are in `DEVELOPER.md`.

  ---

  ## 🛠️ Troubleshooting

  - **Invalid resource/operation** → check for typos
  - **Bad parameters** → test with single item before batching
  - **API errors** → inspect node output, verify credentials
  - **Batch runs** → enable `Continue On Fail` to capture per-item errors

  Debug tips:

  - Use **Executions** view to inspect inputs/outputs
  - Add a **Set** node to test static parameters
  - Start with one item to simplify debugging

  ---

  ## 🧪 Contributing & CI

  ```bash
  npm run build   # Compile TypeScript
  npm run lint    # Run ESLint
  npm run test    # Run Jest tests
  ```

  - `prepublishOnly` runs build + lint before publishing
  - Use GitHub Actions to automate lint/build/test
  - Keep TypeScript strict and ESLint green

  To add a new operation:

  1. Add handler in `buildRequest()`
  2. Extract parameters via `getNodeParameter(..., i)`
  3. Return `{ method, path, qs? }`
  4. Add tests and update `DEVELOPER.md`

  ---

  ## 📦 Templates & Reviewer Guidance

  - `/templates/workflow.json` — example workflow
  - `/templates/README-template.md` — import instructions
  - If reviewers lack production keys, provide:
    - mock API
    - test account
    - recorded executions

  When submitting:

  - Include repo link, npm package name/version
  - Provide install steps and sample outputs
  - Add screenshots if possible

  ---

  ## 📬 Contact & Support

  - Maintainer: Chainstream Team – [ai@chainstream.io](mailto:ai@chainstream.io)
  - Issues & PRs: [GitHub Issues](https://github.com/chainstream-io/n8n-nodes-chainstream/issues)

  ---

  ## 📄 License

  MIT

  ---

ai_documentation_summary:
  {"purpose":"This n8n community node enables workflows to consume the Chainstream API for real-time blockchain data, supporting queries for tokens, wallets, and trades across multiple chains.","capabilities":["Token metadata retrieval (prices, holders, liquidity, security, mint/burn)","Trade activity queries (listings, activities, leaderboards)","Wallet balance queries","Multi-chain support","Batch processing with error continuation"],"authentication":"API key required (API Client ID and API Client Secret)","commonUseCases":["Real-time token price monitoring","Wallet balance tracking across chains","Trade activity and leaderboard analysis","Liquidity and security monitoring for DeFi tokens"],"limitations":["Node status is awaiting approval in the Creator Portal","Requires manual credential binding after import","Full endpoint mapping documentation is in a separate DEVELOPER.md file"],"relatedNodes":["n8n-nodes-base.webhook","n8n-nodes-base.set","n8n-nodes-base.code"]}


node_type: n8n-nodes-atriomail-email.atriomail
package_name: n8n-nodes-atriomail-email
display_name: Atriomail
description: Manage email domains, mailboxes, forwarders, and catch-all configurations with Atriomail
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: atriomail
author_github_url: https://github.com/Atriomail/n8n-atriomail.git
npm_package_name: n8n-nodes-atriomail-email
npm_version: 0.2.1
community_fetched_at: 2026-07-14T14:40:33.442Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "domain",
      "options": [
        {
          "name": "Catch-All",
          "value": "catchAll"
        },
        {
          "name": "Domain",
          "value": "domain"
        },
        {
          "name": "Forwarder",
          "value": "forwarder"
        },
        {
          "name": "Mailbox",
          "value": "mailbox"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a domain",
          "description": "Create a new domain"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a domain",
          "description": "Delete a domain"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a domain",
          "description": "Get a domain by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many domains",
          "description": "Get many domains"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a domain",
          "description": "Update a domain"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "domain"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a mailbox",
          "description": "Create a new mailbox"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a mailbox",
          "description": "Delete a mailbox"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a mailbox",
          "description": "Get a mailbox by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many mailboxes",
          "description": "Get many mailboxes"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a mailbox",
          "description": "Update a mailbox"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "mailbox"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a forwarder",
          "description": "Create a new forwarder"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a forwarder",
          "description": "Delete a forwarder"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a forwarder",
          "description": "Get a forwarder by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many forwarders",
          "description": "Get many forwarders"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a forwarder",
          "description": "Update a forwarder"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "forwarder"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a catch all",
          "description": "Create a new catch-all configuration"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a catch all",
          "description": "Delete a catch-all configuration"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a catch all",
          "description": "Get a catch-all configuration by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many catch alls",
          "description": "Get many catch-all configurations"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a catch all",
          "description": "Update a catch-all configuration"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "catchAll"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a domain",
      "description": "Create a new domain",
      "resource": "domain"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a domain",
      "description": "Delete a domain",
      "resource": "domain"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a domain",
      "description": "Get a domain by ID",
      "resource": "domain"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many domains",
      "description": "Get many domains",
      "resource": "domain"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a domain",
      "description": "Update a domain",
      "resource": "domain"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a mailbox",
      "description": "Create a new mailbox",
      "resource": "mailbox"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a mailbox",
      "description": "Delete a mailbox",
      "resource": "mailbox"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a mailbox",
      "description": "Get a mailbox by ID",
      "resource": "mailbox"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many mailboxes",
      "description": "Get many mailboxes",
      "resource": "mailbox"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a mailbox",
      "description": "Update a mailbox",
      "resource": "mailbox"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a forwarder",
      "description": "Create a new forwarder",
      "resource": "forwarder"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a forwarder",
      "description": "Delete a forwarder",
      "resource": "forwarder"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a forwarder",
      "description": "Get a forwarder by ID",
      "resource": "forwarder"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many forwarders",
      "description": "Get many forwarders",
      "resource": "forwarder"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a forwarder",
      "description": "Update a forwarder",
      "resource": "forwarder"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a catch all",
      "description": "Create a new catch-all configuration",
      "resource": "catchAll"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a catch all",
      "description": "Delete a catch-all configuration",
      "resource": "catchAll"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a catch all",
      "description": "Get a catch-all configuration by ID",
      "resource": "catchAll"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many catch alls",
      "description": "Get many catch-all configurations",
      "resource": "catchAll"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a catch all",
      "description": "Update a catch-all configuration",
      "resource": "catchAll"
    }
  ]

npm_readme:
  # n8n-nodes-atriomail

  This is an n8n community node for [Atriomail](https://system.atriomail.com) - an Email System Management API for managing domains, mailboxes, forwarders, and catch-all configurations.

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

  ## Operations

  ### Domain
  - **Create** - Create a new email domain
  - **Delete** - Delete an existing domain
  - **Get** - Retrieve a specific domain by ID
  - **Get Many** - List all domains
  - **Update** - Update domain settings (active status, description)

  ### Mailbox
  - **Create** - Create a new mailbox with email address and password
  - **Delete** - Delete an existing mailbox
  - **Get** - Retrieve a specific mailbox by ID
  - **Get Many** - List all mailboxes
  - **Update** - Update mailbox settings (name, password, quota, active status)

  ### Forwarder
  - **Create** - Create a new email forwarder
  - **Delete** - Delete an existing forwarder
  - **Get** - Retrieve a specific forwarder by ID
  - **Get Many** - List all forwarders
  - **Update** - Update forwarder settings (forward-to addresses, active status)

  ### Catch-All
  - **Create** - Create a new catch-all configuration for a domain
  - **Delete** - Delete an existing catch-all configuration
  - **Get** - Retrieve a specific catch-all by ID
  - **Get Many** - List all catch-all configurations
  - **Update** - Update catch-all settings (forward-to addresses, active status)

  ## Credentials

  To use this node, you need to configure the Atriomail API credentials:

  1. **API URL**: Your Atriomail instance URL (default: `https://system.atriomail.com`)
  2. **API Token**: Your API token generated from the Atriomail dashboard

  ### Getting your API Token

  1. Log in to your Atriomail dashboard
  2. Navigate to your account settings
  3. Generate a new API token
  4. Copy the token and use it in the n8n credentials

  ## Compatibility

  - Tested with n8n version 1.0.0 and above
  - Requires Node.js 18.10 or higher

  ## Usage

  ### Create a Domain

  1. Add the Atriomail node to your workflow
  2. Select **Domain** as the resource
  3. Select **Create** as the operation
  4. Enter the domain name (e.g., `example.com`)
  5. Optionally set the domain as active and add a description

  ### Create a Mailbox

  1. Select **Mailbox** as the resource
  2. Select **Create** as the operation
  3. Choose the domain from the dropdown (domains are loaded dynamically)
  4. Enter the local part (e.g., `john` for `john@example.com`)
  5. Set a password for the mailbox
  6. Optionally set display name and quota

  ### Create a Forwarder

  1. Select **Forwarder** as the resource
  2. Select **Create** as the operation
  3. Choose the domain from the dropdown
  4. Enter the local part (e.g., `sales` for `sales@example.com`)
  5. Enter comma-separated email addresses to forward to

  ### Create a Catch-All

  1. Select **Catch-All** as the resource
  2. Select **Create** as the operation
  3. Choose the domain from the dropdown
  4. Enter comma-separated email addresses to receive catch-all emails

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [Atriomail API Documentation](https://system.atriomail.com/api/documentation)

  ## License

  [MIT](LICENSE)

  ## More Information

  [Atriomail](https://atriomail.com)

ai_documentation_summary:
  {"purpose":"This n8n community node manages email domain configurations, mailboxes, forwarders, and catch-all settings via the Atriomail API.","capabilities":["Create email domains","Delete email domains","Retrieve specific or list all domains","Update domain settings (active status, description)","Create mailboxes with custom email addresses and passwords","Delete mailboxes","Retrieve specific or list all mailboxes","Update mailbox settings (name, password, quota, active status)","Create email forwarders","Delete forwarders"],"authentication":"API Token required","commonUseCases":["Automating email domain registration in n8n workflows","Managing mailbox creation and password resets","Setting up email forwarding rules dynamically","Configuring catch-all email addresses for domain-wide forwarding"],"limitations":["Community node (not official n8n node)","Requires manual API token generation from Atriomail dashboard","Requires Node.js 18.10 or higher"],"relatedNodes":["n8n-nodes-base-httpRequest","n8n-nodes-base-set"]}


node_type: n8n-nodes-aimfox.aimfox
package_name: n8n-nodes-aimfox
display_name: Aimfox
description: Interact with Aimfox application
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: mihailozepina
author_github_url: https://github.com/mihailozepina/
npm_package_name: n8n-nodes-aimfox
npm_version: 1.0.19
community_fetched_at: 2026-07-14T14:40:33.443Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "account",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Blacklist",
          "value": "blacklist"
        },
        {
          "name": "Campaign",
          "value": "campaign"
        },
        {
          "name": "Conversation",
          "value": "conversation"
        },
        {
          "name": "Custom Variable",
          "value": "customVariable"
        },
        {
          "name": "Label",
          "value": "label"
        },
        {
          "name": "Lead",
          "value": "lead"
        },
        {
          "name": "Template",
          "value": "template"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listAccounts",
      "options": [
        {
          "name": "Get Account Limits",
          "value": "getAccountLimits",
          "action": "Get account limits",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/limits",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get the interaction limits for a specific account"
        },
        {
          "name": "List Accounts",
          "value": "listAccounts",
          "action": "List accounts",
          "routing": {
            "request": {
              "url": "/accounts",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all accounts in the workspace"
        },
        {
          "name": "Set Account Limits",
          "value": "setAccountLimits",
          "action": "Set account limits",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/limits",
              "body": {
                "inmail": "={{$parameter[\"inmailLimit\"]}}",
                "connect": "={{$parameter[\"connectLimit\"]}}",
                "message_request": "={{$parameter[\"messageRequestLimit\"]}}"
              },
              "method": "PATCH",
              "headers": {}
            }
          },
          "description": "Update the weekly interaction limits for an account"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listBlacklist",
      "options": [
        {
          "name": "Add Companies to Blacklist",
          "value": "addCompaniesToBlacklist",
          "action": "Add companies to blacklist",
          "routing": {
            "request": {
              "url": "/blacklist-companies",
              "body": {
                "companies": "={{$parameter[\"companyUrls\"].split(\",\").map(url => url.trim())}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add multiple LinkedIn companies to the blacklist"
        },
        {
          "name": "Add Profile to Blacklist",
          "value": "addProfileToBlacklist",
          "action": "Add profile to blacklist",
          "routing": {
            "request": {
              "url": "=/blacklist/{{$parameter[\"profileUrn\"]}}",
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add profile to the blacklist using the profile URN"
        },
        {
          "name": "List Blacklisted Companies",
          "value": "listBlacklistedCompanies",
          "action": "List blacklisted companies",
          "routing": {
            "request": {
              "url": "/blacklist-companies",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all blacklisted LinkedIn companies in the workspace"
        },
        {
          "name": "List Blacklisted Profiles",
          "value": "listBlacklist",
          "action": "List blacklisted profiles",
          "routing": {
            "request": {
              "url": "/blacklist",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all blacklisted profiles in the workspace"
        },
        {
          "name": "Remove Company From Blacklist",
          "value": "removeCompanyFromBlacklist",
          "action": "Remove company from blacklist",
          "routing": {
            "request": {
              "url": "=/blacklist-companies/{{$parameter[\"companyUrn\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Remove a LinkedIn company from the blacklist using the company URN"
        },
        {
          "name": "Remove Profile From Blacklist",
          "value": "removeProfileFromBlacklist",
          "action": "Remove profile from blacklist",
          "routing": {
            "request": {
              "url": "=/blacklist/{{$parameter[\"profileUrn\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Remove profile from the blacklist using the profile URN"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "blacklist"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listConversations",
      "options": [
        {
          "name": "Get Conversation",
          "value": "getConversation",
          "action": "Get conversation",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations/{{$parameter[\"conversationUrn\"]}}",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get a specific conversation by URN"
        },
        {
          "name": "Get Lead Conversation",
          "value": "getLeadConversation",
          "action": "Get lead conversation",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/leads/{{$parameter[\"leadId\"]}}/conversation",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get a specific lead conversation URN"
        },
        {
          "name": "List Conversations",
          "value": "listConversations",
          "action": "List conversations",
          "routing": {
            "request": {
              "url": "/conversations",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all conversations for the selected workspace"
        },
        {
          "name": "Mark Conversation As Read",
          "value": "markConversationAsRead",
          "action": "Mark conversation as read",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations/{{$parameter[\"conversationUrn\"]}}/mark-as-read",
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Mark an existing conversation as read"
        },
        {
          "name": "Send Message To Conversation",
          "value": "sendMessageToConversation",
          "action": "Send message to conversation",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations/{{$parameter[\"conversationUrn\"]}}",
              "body": {
                "message": "={{$parameter[\"conversationMessage\"]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Send a message to an existing conversation"
        },
        {
          "name": "Start Conversation",
          "value": "startConversation",
          "action": "Start conversation",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations",
              "body": {
                "message": "={{$parameter[\"conversationMessage\"]}}",
                "recipients": [
                  "={{$parameter[\"leadId\"]}}"
                ]
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Start a new conversation with the lead"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "conversation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listCampaigns",
      "options": [
        {
          "name": "Add Profile to Campaign",
          "value": "addProfileToCampaign",
          "action": "Add profile to campaign",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/audience",
              "body": {
                "profile_url": "={{$parameter[\"profileUrl\"]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add profile to the selected campaign"
        },
        {
          "name": "Add Profile to Campaign with Custom Variables",
          "value": "addProfileToCampaignWithCustomVariables",
          "action": "Add profile to campaign with custom variables",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/audience/multiple",
              "body": {
                "type": "profile_url",
                "profiles": [
                  {
                    "profile_url": "={{$parameter[\"profileUrl\"]}}",
                    "custom_variables": "={{JSON.parse($parameter[\"customVariables\"])}}"
                  }
                ]
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add profile to the selected campaign with custom variables"
        },
        {
          "name": "Create Campaign",
          "value": "createCampaign",
          "action": "Create a campaign",
          "routing": {
            "request": {
              "url": "/campaigns",
              "body": {
                "name": "={{$parameter[\"campaignName\"]}}",
                "type": "={{$parameter[\"campaignType\"]}}",
                "account_ids": "={{$parameter[\"accountIds\"].split(\",\").map(id => id.trim())}}",
                "audience_size": "={{$parameter[\"audienceSize\"]}}",
                "outreach_type": "={{$parameter[\"outreachType\"]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Create a new Aimfox campaign"
        },
        {
          "name": "Get Campaign",
          "value": "getCampaign",
          "action": "Get a campaign",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get a specific campaign by ID"
        },
        {
          "name": "List Campaigns",
          "value": "listCampaigns",
          "action": "List campaigns",
          "routing": {
            "request": {
              "url": "/campaigns",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all campaigns in the workspace"
        },
        {
          "name": "Pause",
          "value": "pauseCampaign",
          "action": "Pause a campaign",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}",
              "body": {
                "state": "PAUSED"
              },
              "method": "PATCH",
              "headers": {}
            }
          },
          "description": "Pause a running campaign"
        },
        {
          "name": "Remove Profile From Campaign",
          "value": "removeProfileFromCampaign",
          "action": "Remove profile from campaign",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/audience/{{$parameter[\"profileUrnOrIdentifier\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Remove a profile from the selected campaign using URN or public identifier"
        },
        {
          "name": "Resume",
          "value": "resumeCampaign",
          "action": "Resume a campaign",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}",
              "body": {
                "state": "ACTIVE"
              },
              "method": "PATCH",
              "headers": {}
            }
          },
          "description": "Resume a paused campaign"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "campaign"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getCampaignCustomVariables",
      "options": [
        {
          "name": "Add Custom Variables to Target",
          "value": "addCustomVariablesToTarget",
          "action": "Add custom variables to target",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/custom-variables",
              "body": {
                "custom_variables": "={{[{ target_urn: $parameter[\"targetUrn\"], variables: JSON.parse($parameter[\"variables\"]) }]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add custom variables to a specific target in a campaign"
        },
        {
          "name": "Get Campaign Custom Variables",
          "value": "getCampaignCustomVariables",
          "action": "Get campaign custom variables",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/custom-variables",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get all custom variables for a specific campaign"
        },
        {
          "name": "Get Target Custom Variables",
          "value": "getTargetCustomVariables",
          "action": "Get target custom variables",
          "routing": {
            "request": {
              "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/custom-variables/{{$parameter[\"targetUrn\"]}}",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get custom variables for a specific target in a campaign"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customVariable"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listLabels",
      "options": [
        {
          "name": "Add Label",
          "value": "addLabel",
          "action": "Add label",
          "routing": {
            "request": {
              "url": "/labels",
              "body": {
                "name": "={{$parameter[\"labelName\"]}}",
                "color": "={{$parameter[\"labelColor\"]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add a new label to the selected workspace"
        },
        {
          "name": "Delete Label",
          "value": "deleteLabel",
          "action": "Delete label",
          "routing": {
            "request": {
              "url": "=/labels/{{$parameter[\"workspaceLabelId\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Delete a label from the workspace"
        },
        {
          "name": "Edit Label",
          "value": "editLabel",
          "action": "Edit label",
          "routing": {
            "request": {
              "url": "=/labels/{{$parameter[\"workspaceLabelId\"]}}",
              "body": {
                "name": "={{$parameter[\"labelName\"]}}",
                "color": "={{$parameter[\"labelColor\"]}}"
              },
              "method": "PATCH",
              "headers": {}
            }
          },
          "description": "Edit an existing label in the workspace"
        },
        {
          "name": "List Labels",
          "value": "listLabels",
          "action": "List labels",
          "routing": {
            "request": {
              "url": "/labels",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all labels for the selected workspace"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "label"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listRecentLeads",
      "options": [
        {
          "name": "Add Label To Lead",
          "value": "addLabelToLead",
          "action": "Add label to lead",
          "routing": {
            "request": {
              "url": "=/leads/{{$parameter[\"leadId\"]}}/labels/{{$parameter[\"labelId\"]}}",
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add a new label to the selected lead"
        },
        {
          "name": "Add Note To Lead",
          "value": "addNoteToLead",
          "action": "Add note to lead",
          "routing": {
            "request": {
              "url": "=/leads/{{$parameter[\"leadId\"]}}/notes",
              "body": {
                "text": "={{$parameter[\"noteText\"]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Add a new note to the selected lead"
        },
        {
          "name": "Delete Note From Lead",
          "value": "deleteNoteFromLead",
          "action": "Delete note from lead",
          "routing": {
            "request": {
              "url": "=/leads/{{$parameter[\"leadId\"]}}/notes/{{$parameter[\"noteId\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Delete a note from the selected lead"
        },
        {
          "name": "Get Lead",
          "value": "getLead",
          "action": "Get lead",
          "routing": {
            "request": {
              "url": "=/leads/{{$parameter[\"leadId\"]}}",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get a specific lead by ID"
        },
        {
          "name": "Get Lead Custom Variables",
          "value": "getLeadCustomVariables",
          "action": "Get lead custom variables",
          "routing": {
            "request": {
              "url": "=/accounts/{{$parameter[\"accountId\"]}}/leads/{{$parameter[\"leadUrn\"]}}/custom-variables",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get custom variables for a specific lead"
        },
        {
          "name": "List Lead Notes",
          "value": "listLeadNotes",
          "action": "List lead notes",
          "routing": {
            "request": {
              "url": "=/leads/{{$parameter[\"leadId\"]}}/notes",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all notes for the selected lead"
        },
        {
          "name": "List Recent Leads",
          "value": "listRecentLeads",
          "action": "List recent leads",
          "routing": {
            "request": {
              "url": "/analytics/recent-leads",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List recent leads for the selected workspace"
        },
        {
          "name": "Remove Label From Lead",
          "value": "removeLabelFromLead",
          "action": "Remove label from lead",
          "routing": {
            "request": {
              "url": "=/leads/{{$parameter[\"leadId\"]}}/labels/{{$parameter[\"labelId\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Remove a label from the selected lead"
        },
        {
          "name": "Search Leads",
          "value": "searchLeads",
          "action": "Search leads",
          "routing": {
            "request": {
              "qs": {
                "count": "={{$parameter[\"count\"]}}",
                "start": "={{$parameter[\"start\"]}}"
              },
              "url": "/leads:search",
              "body": {
                "labels": "={{$parameter[\"additionalFilters\"]?.filterLabels ? $parameter[\"additionalFilters\"].filterLabels.split(\",\").map(l => l.trim()) : []}}",
                "skills": "={{$parameter[\"additionalFilters\"]?.skills ? $parameter[\"additionalFilters\"].skills.split(\",\").map(s => s.trim()) : []}}",
                "lead_of": "={{$parameter[\"additionalFilters\"]?.leadOf ? $parameter[\"additionalFilters\"].leadOf.split(\",\").map(l => l.trim()) : []}}",
                "origins": "={{$parameter[\"additionalFilters\"]?.origins ? $parameter[\"additionalFilters\"].origins.split(\",\").map(o => o.trim()) : []}}",
                "keywords": "={{$parameter[\"keywords\"] || \"\"}}",
                "optimize": "={{$parameter[\"optimize\"]}}",
                "education": "={{$parameter[\"additionalFilters\"]?.education ? $parameter[\"additionalFilters\"].education.split(\",\").map(e => e.trim()) : []}}",
                "interests": "={{$parameter[\"additionalFilters\"]?.interests ? $parameter[\"additionalFilters\"].interests.split(\",\").map(i => i.trim()) : []}}",
                "languages": "={{$parameter[\"additionalFilters\"]?.languages ? $parameter[\"additionalFilters\"].languages.split(\",\").map(l => l.trim()) : []}}",
                "locations": "={{$parameter[\"additionalFilters\"]?.locations ? $parameter[\"additionalFilters\"].locations.split(\",\").map(l => l.trim()) : []}}",
                "past_companies": "={{$parameter[\"additionalFilters\"]?.pastCompanies ? $parameter[\"additionalFilters\"].pastCompanies.split(\",\").map(c => c.trim()) : []}}",
                "current_companies": "={{$parameter[\"additionalFilters\"]?.currentCompanies ? $parameter[\"additionalFilters\"].currentCompanies.split(\",\").map(c => c.trim()) : []}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Search through all leads in the workspace"
        },
        {
          "name": "Update Note",
          "value": "updateNote",
          "action": "Update note",
          "routing": {
            "request": {
              "url": "=/leads/{{$parameter[\"leadId\"]}}/notes/{{$parameter[\"noteId\"]}}",
              "body": {
                "text": "={{$parameter[\"noteText\"]}}"
              },
              "method": "PATCH",
              "headers": {}
            }
          },
          "description": "Update a note for the selected lead"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "lead"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listTemplates",
      "options": [
        {
          "name": "List Templates",
          "value": "listTemplates",
          "action": "List templates",
          "routing": {
            "request": {
              "url": "/templates",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all templates in the selected workspace"
        },
        {
          "name": "Get Template",
          "value": "getTemplate",
          "action": "Get template",
          "routing": {
            "request": {
              "url": "=/templates/{{$parameter[\"templateId\"]}}",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "Get a specific template by ID"
        },
        {
          "name": "Create Template",
          "value": "createTemplate",
          "action": "Create template",
          "routing": {
            "request": {
              "url": "/templates",
              "body": {
                "ai": "={{$parameter[\"templateAi\"]}}",
                "name": "={{$parameter[\"templateName\"]}}",
                "type": "={{$parameter[\"templateType\"]}}",
                "message": "={{$parameter[\"templateMessage\"]}}",
                "subject": "={{$parameter[\"templateSubject\"]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Create a new template in the selected workspace"
        },
        {
          "name": "Remove Template",
          "value": "removeTemplate",
          "action": "Remove template",
          "routing": {
            "request": {
              "url": "=/templates/{{$parameter[\"templateId\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Remove a template from the workspace"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listWebhooks",
      "options": [
        {
          "name": "List Webhooks",
          "value": "listWebhooks",
          "action": "List webhooks",
          "routing": {
            "request": {
              "url": "/webhooks",
              "method": "GET",
              "headers": {}
            }
          },
          "description": "List all webhooks in the selected workspace"
        },
        {
          "name": "Create Webhook",
          "value": "createWebhook",
          "action": "Create webhook",
          "routing": {
            "request": {
              "url": "/webhooks",
              "body": {
                "url": "={{$parameter[\"webhookUrl\"]}}",
                "name": "={{$parameter[\"webhookName\"]}}",
                "events": "={{$parameter[\"webhookEvents\"]}}",
                "integration": "={{$parameter[\"webhookIntegration\"]}}"
              },
              "method": "POST",
              "headers": {}
            }
          },
          "description": "Create a new webhook in the selected workspace"
        },
        {
          "name": "Edit Webhook",
          "value": "editWebhook",
          "action": "Edit webhook",
          "routing": {
            "request": {
              "url": "=/webhooks/{{$parameter[\"webhookId\"]}}",
              "body": {
                "url": "={{$parameter[\"webhookUrl\"]}}",
                "name": "={{$parameter[\"webhookName\"]}}",
                "events": "={{$parameter[\"webhookEvents\"]}}"
              },
              "method": "PATCH",
              "headers": {}
            }
          },
          "description": "Edit an existing webhook in the workspace"
        },
        {
          "name": "Delete Webhook",
          "value": "deleteWebhook",
          "action": "Delete webhook",
          "routing": {
            "request": {
              "url": "=/webhooks/{{$parameter[\"webhookId\"]}}",
              "method": "DELETE",
              "headers": {}
            }
          },
          "description": "Delete a webhook from the workspace"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Account Limits",
      "value": "getAccountLimits",
      "action": "Get account limits",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/limits",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get the interaction limits for a specific account",
      "resource": "account"
    },
    {
      "name": "List Accounts",
      "value": "listAccounts",
      "action": "List accounts",
      "routing": {
        "request": {
          "url": "/accounts",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all accounts in the workspace",
      "resource": "account"
    },
    {
      "name": "Set Account Limits",
      "value": "setAccountLimits",
      "action": "Set account limits",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/limits",
          "body": {
            "inmail": "={{$parameter[\"inmailLimit\"]}}",
            "connect": "={{$parameter[\"connectLimit\"]}}",
            "message_request": "={{$parameter[\"messageRequestLimit\"]}}"
          },
          "method": "PATCH",
          "headers": {}
        }
      },
      "description": "Update the weekly interaction limits for an account",
      "resource": "account"
    },
    {
      "name": "Add Companies to Blacklist",
      "value": "addCompaniesToBlacklist",
      "action": "Add companies to blacklist",
      "routing": {
        "request": {
          "url": "/blacklist-companies",
          "body": {
            "companies": "={{$parameter[\"companyUrls\"].split(\",\").map(url => url.trim())}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add multiple LinkedIn companies to the blacklist",
      "resource": "blacklist"
    },
    {
      "name": "Add Profile to Blacklist",
      "value": "addProfileToBlacklist",
      "action": "Add profile to blacklist",
      "routing": {
        "request": {
          "url": "=/blacklist/{{$parameter[\"profileUrn\"]}}",
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add profile to the blacklist using the profile URN",
      "resource": "blacklist"
    },
    {
      "name": "List Blacklisted Companies",
      "value": "listBlacklistedCompanies",
      "action": "List blacklisted companies",
      "routing": {
        "request": {
          "url": "/blacklist-companies",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all blacklisted LinkedIn companies in the workspace",
      "resource": "blacklist"
    },
    {
      "name": "List Blacklisted Profiles",
      "value": "listBlacklist",
      "action": "List blacklisted profiles",
      "routing": {
        "request": {
          "url": "/blacklist",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all blacklisted profiles in the workspace",
      "resource": "blacklist"
    },
    {
      "name": "Remove Company From Blacklist",
      "value": "removeCompanyFromBlacklist",
      "action": "Remove company from blacklist",
      "routing": {
        "request": {
          "url": "=/blacklist-companies/{{$parameter[\"companyUrn\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Remove a LinkedIn company from the blacklist using the company URN",
      "resource": "blacklist"
    },
    {
      "name": "Remove Profile From Blacklist",
      "value": "removeProfileFromBlacklist",
      "action": "Remove profile from blacklist",
      "routing": {
        "request": {
          "url": "=/blacklist/{{$parameter[\"profileUrn\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Remove profile from the blacklist using the profile URN",
      "resource": "blacklist"
    },
    {
      "name": "Get Conversation",
      "value": "getConversation",
      "action": "Get conversation",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations/{{$parameter[\"conversationUrn\"]}}",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get a specific conversation by URN",
      "resource": "conversation"
    },
    {
      "name": "Get Lead Conversation",
      "value": "getLeadConversation",
      "action": "Get lead conversation",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/leads/{{$parameter[\"leadId\"]}}/conversation",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get a specific lead conversation URN",
      "resource": "conversation"
    },
    {
      "name": "List Conversations",
      "value": "listConversations",
      "action": "List conversations",
      "routing": {
        "request": {
          "url": "/conversations",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all conversations for the selected workspace",
      "resource": "conversation"
    },
    {
      "name": "Mark Conversation As Read",
      "value": "markConversationAsRead",
      "action": "Mark conversation as read",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations/{{$parameter[\"conversationUrn\"]}}/mark-as-read",
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Mark an existing conversation as read",
      "resource": "conversation"
    },
    {
      "name": "Send Message To Conversation",
      "value": "sendMessageToConversation",
      "action": "Send message to conversation",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations/{{$parameter[\"conversationUrn\"]}}",
          "body": {
            "message": "={{$parameter[\"conversationMessage\"]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Send a message to an existing conversation",
      "resource": "conversation"
    },
    {
      "name": "Start Conversation",
      "value": "startConversation",
      "action": "Start conversation",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/conversations",
          "body": {
            "message": "={{$parameter[\"conversationMessage\"]}}",
            "recipients": [
              "={{$parameter[\"leadId\"]}}"
            ]
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Start a new conversation with the lead",
      "resource": "conversation"
    },
    {
      "name": "Add Profile to Campaign",
      "value": "addProfileToCampaign",
      "action": "Add profile to campaign",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/audience",
          "body": {
            "profile_url": "={{$parameter[\"profileUrl\"]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add profile to the selected campaign",
      "resource": "campaign"
    },
    {
      "name": "Add Profile to Campaign with Custom Variables",
      "value": "addProfileToCampaignWithCustomVariables",
      "action": "Add profile to campaign with custom variables",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/audience/multiple",
          "body": {
            "type": "profile_url",
            "profiles": [
              {
                "profile_url": "={{$parameter[\"profileUrl\"]}}",
                "custom_variables": "={{JSON.parse($parameter[\"customVariables\"])}}"
              }
            ]
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add profile to the selected campaign with custom variables",
      "resource": "campaign"
    },
    {
      "name": "Create Campaign",
      "value": "createCampaign",
      "action": "Create a campaign",
      "routing": {
        "request": {
          "url": "/campaigns",
          "body": {
            "name": "={{$parameter[\"campaignName\"]}}",
            "type": "={{$parameter[\"campaignType\"]}}",
            "account_ids": "={{$parameter[\"accountIds\"].split(\",\").map(id => id.trim())}}",
            "audience_size": "={{$parameter[\"audienceSize\"]}}",
            "outreach_type": "={{$parameter[\"outreachType\"]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Create a new Aimfox campaign",
      "resource": "campaign"
    },
    {
      "name": "Get Campaign",
      "value": "getCampaign",
      "action": "Get a campaign",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get a specific campaign by ID",
      "resource": "campaign"
    },
    {
      "name": "List Campaigns",
      "value": "listCampaigns",
      "action": "List campaigns",
      "routing": {
        "request": {
          "url": "/campaigns",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all campaigns in the workspace",
      "resource": "campaign"
    },
    {
      "name": "Pause",
      "value": "pauseCampaign",
      "action": "Pause a campaign",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}",
          "body": {
            "state": "PAUSED"
          },
          "method": "PATCH",
          "headers": {}
        }
      },
      "description": "Pause a running campaign",
      "resource": "campaign"
    },
    {
      "name": "Remove Profile From Campaign",
      "value": "removeProfileFromCampaign",
      "action": "Remove profile from campaign",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/audience/{{$parameter[\"profileUrnOrIdentifier\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Remove a profile from the selected campaign using URN or public identifier",
      "resource": "campaign"
    },
    {
      "name": "Resume",
      "value": "resumeCampaign",
      "action": "Resume a campaign",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}",
          "body": {
            "state": "ACTIVE"
          },
          "method": "PATCH",
          "headers": {}
        }
      },
      "description": "Resume a paused campaign",
      "resource": "campaign"
    },
    {
      "name": "Add Custom Variables to Target",
      "value": "addCustomVariablesToTarget",
      "action": "Add custom variables to target",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/custom-variables",
          "body": {
            "custom_variables": "={{[{ target_urn: $parameter[\"targetUrn\"], variables: JSON.parse($parameter[\"variables\"]) }]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add custom variables to a specific target in a campaign",
      "resource": "customVariable"
    },
    {
      "name": "Get Campaign Custom Variables",
      "value": "getCampaignCustomVariables",
      "action": "Get campaign custom variables",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/custom-variables",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get all custom variables for a specific campaign",
      "resource": "customVariable"
    },
    {
      "name": "Get Target Custom Variables",
      "value": "getTargetCustomVariables",
      "action": "Get target custom variables",
      "routing": {
        "request": {
          "url": "=/campaigns/{{$parameter[\"campaignId\"]}}/custom-variables/{{$parameter[\"targetUrn\"]}}",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get custom variables for a specific target in a campaign",
      "resource": "customVariable"
    },
    {
      "name": "Add Label",
      "value": "addLabel",
      "action": "Add label",
      "routing": {
        "request": {
          "url": "/labels",
          "body": {
            "name": "={{$parameter[\"labelName\"]}}",
            "color": "={{$parameter[\"labelColor\"]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add a new label to the selected workspace",
      "resource": "label"
    },
    {
      "name": "Delete Label",
      "value": "deleteLabel",
      "action": "Delete label",
      "routing": {
        "request": {
          "url": "=/labels/{{$parameter[\"workspaceLabelId\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Delete a label from the workspace",
      "resource": "label"
    },
    {
      "name": "Edit Label",
      "value": "editLabel",
      "action": "Edit label",
      "routing": {
        "request": {
          "url": "=/labels/{{$parameter[\"workspaceLabelId\"]}}",
          "body": {
            "name": "={{$parameter[\"labelName\"]}}",
            "color": "={{$parameter[\"labelColor\"]}}"
          },
          "method": "PATCH",
          "headers": {}
        }
      },
      "description": "Edit an existing label in the workspace",
      "resource": "label"
    },
    {
      "name": "List Labels",
      "value": "listLabels",
      "action": "List labels",
      "routing": {
        "request": {
          "url": "/labels",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all labels for the selected workspace",
      "resource": "label"
    },
    {
      "name": "Add Label To Lead",
      "value": "addLabelToLead",
      "action": "Add label to lead",
      "routing": {
        "request": {
          "url": "=/leads/{{$parameter[\"leadId\"]}}/labels/{{$parameter[\"labelId\"]}}",
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add a new label to the selected lead",
      "resource": "lead"
    },
    {
      "name": "Add Note To Lead",
      "value": "addNoteToLead",
      "action": "Add note to lead",
      "routing": {
        "request": {
          "url": "=/leads/{{$parameter[\"leadId\"]}}/notes",
          "body": {
            "text": "={{$parameter[\"noteText\"]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Add a new note to the selected lead",
      "resource": "lead"
    },
    {
      "name": "Delete Note From Lead",
      "value": "deleteNoteFromLead",
      "action": "Delete note from lead",
      "routing": {
        "request": {
          "url": "=/leads/{{$parameter[\"leadId\"]}}/notes/{{$parameter[\"noteId\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Delete a note from the selected lead",
      "resource": "lead"
    },
    {
      "name": "Get Lead",
      "value": "getLead",
      "action": "Get lead",
      "routing": {
        "request": {
          "url": "=/leads/{{$parameter[\"leadId\"]}}",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get a specific lead by ID",
      "resource": "lead"
    },
    {
      "name": "Get Lead Custom Variables",
      "value": "getLeadCustomVariables",
      "action": "Get lead custom variables",
      "routing": {
        "request": {
          "url": "=/accounts/{{$parameter[\"accountId\"]}}/leads/{{$parameter[\"leadUrn\"]}}/custom-variables",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get custom variables for a specific lead",
      "resource": "lead"
    },
    {
      "name": "List Lead Notes",
      "value": "listLeadNotes",
      "action": "List lead notes",
      "routing": {
        "request": {
          "url": "=/leads/{{$parameter[\"leadId\"]}}/notes",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all notes for the selected lead",
      "resource": "lead"
    },
    {
      "name": "List Recent Leads",
      "value": "listRecentLeads",
      "action": "List recent leads",
      "routing": {
        "request": {
          "url": "/analytics/recent-leads",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List recent leads for the selected workspace",
      "resource": "lead"
    },
    {
      "name": "Remove Label From Lead",
      "value": "removeLabelFromLead",
      "action": "Remove label from lead",
      "routing": {
        "request": {
          "url": "=/leads/{{$parameter[\"leadId\"]}}/labels/{{$parameter[\"labelId\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Remove a label from the selected lead",
      "resource": "lead"
    },
    {
      "name": "Search Leads",
      "value": "searchLeads",
      "action": "Search leads",
      "routing": {
        "request": {
          "qs": {
            "count": "={{$parameter[\"count\"]}}",
            "start": "={{$parameter[\"start\"]}}"
          },
          "url": "/leads:search",
          "body": {
            "labels": "={{$parameter[\"additionalFilters\"]?.filterLabels ? $parameter[\"additionalFilters\"].filterLabels.split(\",\").map(l => l.trim()) : []}}",
            "skills": "={{$parameter[\"additionalFilters\"]?.skills ? $parameter[\"additionalFilters\"].skills.split(\",\").map(s => s.trim()) : []}}",
            "lead_of": "={{$parameter[\"additionalFilters\"]?.leadOf ? $parameter[\"additionalFilters\"].leadOf.split(\",\").map(l => l.trim()) : []}}",
            "origins": "={{$parameter[\"additionalFilters\"]?.origins ? $parameter[\"additionalFilters\"].origins.split(\",\").map(o => o.trim()) : []}}",
            "keywords": "={{$parameter[\"keywords\"] || \"\"}}",
            "optimize": "={{$parameter[\"optimize\"]}}",
            "education": "={{$parameter[\"additionalFilters\"]?.education ? $parameter[\"additionalFilters\"].education.split(\",\").map(e => e.trim()) : []}}",
            "interests": "={{$parameter[\"additionalFilters\"]?.interests ? $parameter[\"additionalFilters\"].interests.split(\",\").map(i => i.trim()) : []}}",
            "languages": "={{$parameter[\"additionalFilters\"]?.languages ? $parameter[\"additionalFilters\"].languages.split(\",\").map(l => l.trim()) : []}}",
            "locations": "={{$parameter[\"additionalFilters\"]?.locations ? $parameter[\"additionalFilters\"].locations.split(\",\").map(l => l.trim()) : []}}",
            "past_companies": "={{$parameter[\"additionalFilters\"]?.pastCompanies ? $parameter[\"additionalFilters\"].pastCompanies.split(\",\").map(c => c.trim()) : []}}",
            "current_companies": "={{$parameter[\"additionalFilters\"]?.currentCompanies ? $parameter[\"additionalFilters\"].currentCompanies.split(\",\").map(c => c.trim()) : []}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Search through all leads in the workspace",
      "resource": "lead"
    },
    {
      "name": "Update Note",
      "value": "updateNote",
      "action": "Update note",
      "routing": {
        "request": {
          "url": "=/leads/{{$parameter[\"leadId\"]}}/notes/{{$parameter[\"noteId\"]}}",
          "body": {
            "text": "={{$parameter[\"noteText\"]}}"
          },
          "method": "PATCH",
          "headers": {}
        }
      },
      "description": "Update a note for the selected lead",
      "resource": "lead"
    },
    {
      "name": "List Templates",
      "value": "listTemplates",
      "action": "List templates",
      "routing": {
        "request": {
          "url": "/templates",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all templates in the selected workspace",
      "resource": "template"
    },
    {
      "name": "Get Template",
      "value": "getTemplate",
      "action": "Get template",
      "routing": {
        "request": {
          "url": "=/templates/{{$parameter[\"templateId\"]}}",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "Get a specific template by ID",
      "resource": "template"
    },
    {
      "name": "Create Template",
      "value": "createTemplate",
      "action": "Create template",
      "routing": {
        "request": {
          "url": "/templates",
          "body": {
            "ai": "={{$parameter[\"templateAi\"]}}",
            "name": "={{$parameter[\"templateName\"]}}",
            "type": "={{$parameter[\"templateType\"]}}",
            "message": "={{$parameter[\"templateMessage\"]}}",
            "subject": "={{$parameter[\"templateSubject\"]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Create a new template in the selected workspace",
      "resource": "template"
    },
    {
      "name": "Remove Template",
      "value": "removeTemplate",
      "action": "Remove template",
      "routing": {
        "request": {
          "url": "=/templates/{{$parameter[\"templateId\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Remove a template from the workspace",
      "resource": "template"
    },
    {
      "name": "List Webhooks",
      "value": "listWebhooks",
      "action": "List webhooks",
      "routing": {
        "request": {
          "url": "/webhooks",
          "method": "GET",
          "headers": {}
        }
      },
      "description": "List all webhooks in the selected workspace",
      "resource": "webhook"
    },
    {
      "name": "Create Webhook",
      "value": "createWebhook",
      "action": "Create webhook",
      "routing": {
        "request": {
          "url": "/webhooks",
          "body": {
            "url": "={{$parameter[\"webhookUrl\"]}}",
            "name": "={{$parameter[\"webhookName\"]}}",
            "events": "={{$parameter[\"webhookEvents\"]}}",
            "integration": "={{$parameter[\"webhookIntegration\"]}}"
          },
          "method": "POST",
          "headers": {}
        }
      },
      "description": "Create a new webhook in the selected workspace",
      "resource": "webhook"
    },
    {
      "name": "Edit Webhook",
      "value": "editWebhook",
      "action": "Edit webhook",
      "routing": {
        "request": {
          "url": "=/webhooks/{{$parameter[\"webhookId\"]}}",
          "body": {
            "url": "={{$parameter[\"webhookUrl\"]}}",
            "name": "={{$parameter[\"webhookName\"]}}",
            "events": "={{$parameter[\"webhookEvents\"]}}"
          },
          "method": "PATCH",
          "headers": {}
        }
      },
      "description": "Edit an existing webhook in the workspace",
      "resource": "webhook"
    },
    {
      "name": "Delete Webhook",
      "value": "deleteWebhook",
      "action": "Delete webhook",
      "routing": {
        "request": {
          "url": "=/webhooks/{{$parameter[\"webhookId\"]}}",
          "method": "DELETE",
          "headers": {}
        }
      },
      "description": "Delete a webhook from the workspace",
      "resource": "webhook"
    }
  ]

npm_readme:
  ![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)

  # n8n-nodes-aimfox

  This is an n8n community node. It lets you use Aimfox in your n8n workflows.

  Aimfox is a LinkedIn automation platform that helps businesses automate their LinkedIn outreach, lead generation, and social selling activities.

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

  ## Operations

  This node supports the following operations:

  ### Account
  - **Get Account Limits**: Get the interaction limits for a specific account
  - **List Accounts**: List all accounts in the workspace
  - **Set Account Limits**: Update the weekly interaction limits for an account

  ### Blacklist
  - **Add Companies to Blacklist**: Add multiple LinkedIn companies to the blacklist
  - **Add Profile to Blacklist**: Add profile to the blacklist using the profile URN
  - **List Blacklisted Companies**: List all blacklisted LinkedIn companies in the workspace
  - **List Blacklisted Profiles**: List all blacklisted profiles in the workspace
  - **Remove Company From Blacklist**: Remove a LinkedIn company from the blacklist using the company URN
  - **Remove Profile From Blacklist**: Remove profile from the blacklist using the profile URN

  ### Campaign
  - **Add Profile to Campaign**: Add profile to the selected campaign
  - **Add Profile to Campaign with Custom Variables**: Add profile to the selected campaign with custom variables
  - **Create Campaign**: Create a new Aimfox campaign
  - **Get Campaign**: Get a specific campaign by ID
  - **List Campaigns**: List all campaigns in the workspace
  - **Pause**: Pause a running campaign
  - **Remove Profile From Campaign**: Remove a profile from the selected campaign using URN or public identifier
  - **Resume**: Resume a paused campaign

  ### Conversation
  - **Get Conversation**: Get a specific conversation by URN
  - **Get Lead Conversation**: Get a specific lead conversation URN
  - **List Conversations**: List all conversations for the selected workspace
  - **Mark Conversation As Read**: Mark an existing conversation as read
  - **Send Message To Conversation**: Send a message to an existing conversation
  - **Start Conversation**: Start a new conversation with the lead

  ### Custom Variable
  - **Add Custom Variables to Target**: Add custom variables to a specific target in a campaign
  - **Get Campaign Custom Variables**: Get all custom variables for a specific campaign
  - **Get Target Custom Variables**: Get custom variables for a specific target in a campaign

  ### Label
  - **Add Label**: Add a new label to the selected workspace
  - **Delete Label**: Delete a label from the workspace
  - **Edit Label**: Edit an existing label in the workspace
  - **List Labels**: List all labels for the selected workspace

  ### Lead
  - **Add Label To Lead**: Add a new label to the selected lead
  - **Add Note To Lead**: Add a new note to the selected lead
  - **Delete Note From Lead**: Delete a note from the selected lead
  - **Get Lead**: Get a specific lead by ID
  - **Get Lead Custom Variables**: Get custom variables for a specific lead
  - **List Lead Notes**: List all notes for the selected lead
  - **List Recent Leads**: List recent leads for the selected workspace
  - **Remove Label From Lead**: Remove a label from the selected lead
  - **Search Leads**: Search for leads in the workspace with advanced filters
  - **Update Note**: Update a note for the selected lead

  ### Template
  - **Create Template**: Create a new template in the selected workspace
  - **Get Template**: Get a specific template by ID
  - **List Templates**: List all templates in the selected workspace
  - **Remove Template**: Remove a template from the workspace

  ### Webhook
  - **Create Webhook**: Create a new webhook in the selected workspace
  - **Delete Webhook**: Delete a webhook from the workspace
  - **Edit Webhook**: Edit an existing webhook in the workspace
  - **List Webhooks**: List all webhooks in the selected workspace

  ## Triggers

  This node supports the following triggers:
  - **Account Logged In**: This event triggers when a LinkedIn profile successfully logs into the system.
  - **Account Logged Out**: This event triggers when a LinkedIn profile is logged out of the system.
  - **Campaign Created**: This event triggers when a new campaign is created in the workspace.
  - **Campaign Ended**: This event triggers when a campaign has ended.
  - **Campaign Reply**: This event triggers when a reply is received from a campaign.
  - **Campaign Started**: This event triggers when a campaign has started running.
  - **Connect Accepted**: This event triggers when a LinkedIn connection request is accepted, establishing a new connection between profiles.
  - **Connect Sent**: This event triggers when a LinkedIn connection request is successfully sent.
  - **Inbox Event**: This event triggers for inbox-related events.
  - **Inmail**: This event triggers when a LinkedIn Inmail message is successfully sent.
  - **Inmail Reply**: This event triggers when a user replies to a LinkedIn Inmail message, initiating a conversation.
  - **Lead Label Added**: This event triggers when a label is added to a lead.
  - **Message Request**: This event triggers when a message request is sent.
  - **Message Sent**: This event triggers when a message is successfully sent to a LinkedIn profile.
  - **New Connection**: This event triggers when a new connection is acquired through Aimfox, indicating the successful addition of a LinkedIn connection.
  - **New Reply**: This event triggers when a user replies to a LinkedIn message, initiating a conversation.
  - **Profile Viewed**: This event triggers when a LinkedIn profile is viewed.
  - **Reply**: This event triggers when a reply is received.

  ## Credentials

  To use this node, you need to authenticate with Aimfox using an API key.

  ### Prerequisites
  1. Sign up for an Aimfox account at [https://aimfox.com](https://aimfox.com)
  2. Generate an API key from your Aimfox dashboard

  ### Setup
  1. In n8n, go to **Settings** > **Credentials**
  2. Click **Create New Credential**
  3. Search for "Aimfox API" and select it
  4. Enter your Aimfox API key
  5. Click **Save**

  The API key will be used to authenticate all requests to the Aimfox API with Bearer token authentication.

  ## Compatibility

  - Minimum n8n version: 0.198.0
  - Tested with n8n versions: 0.198.0+

  ## Usage

  ### Basic Workflow Example
  1. Start with a **Manual Trigger** or **Schedule Trigger**
  2. Add the **Aimfox** node
  3. Select your workspace first (required for most operations)
  4. Choose your desired operation (Account, Campaign, Profile, or Workspace)
  5. Configure the specific operation parameters

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Aimfox API documentation](https://docs.aimfox.com)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of LinkedIn outreach, lead generation, and social selling activities through the Aimfox platform.","capabilities":["Manage account limits and list accounts","Manage blacklist of companies and profiles","Create, pause, resume, and manage campaigns","Start, list, and manage conversations with leads","Add custom variables to targets and leads","Manage labels and notes for leads","Create and manage templates","Trigger on LinkedIn events like connection requests, Inmails, and profile views"],"authentication":"API key required (Bearer token)","commonUseCases":["Automated LinkedIn lead generation","Social selling campaigns","LinkedIn outreach automation","Lead management and labeling","Conversation tracking and messaging"],"limitations":["Requires a paid Aimfox account","Requires manual setup of API credentials in n8n"],"relatedNodes":["n8n-nodes-aimfox.aimfox","n8n-nodes-aimfox.aimfox.account","n8n-nodes-aimfox.aimfox.campaign","n8n-nodes-aimfox.aimfox.lead","n8n-nodes-aimfox.aimfox.conversation"]}


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

updated_at: 2026-07-14 14:40:33
author_name: dust-dev
author_github_url: https://github.com/dust-tt/dust-n8n-node.git
npm_package_name: n8n-nodes-dust
npm_version: 0.1.70
community_fetched_at: 2026-07-14T14:40:33.444Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "agent",
      "options": [
        {
          "name": "Agent",
          "value": "agent"
        },
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "talkToAssistant",
      "options": [
        {
          "name": "Talk To",
          "value": "talkToAssistant",
          "action": "Talk to an agent",
          "description": "Send a message to an agent"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "agent"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "uploadDocument",
      "options": [
        {
          "name": "Upload",
          "value": "uploadDocument",
          "action": "Upload a document",
          "description": "Upload a document to a data source"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Talk To",
      "value": "talkToAssistant",
      "action": "Talk to an agent",
      "description": "Send a message to an agent",
      "resource": "agent"
    },
    {
      "name": "Upload",
      "value": "uploadDocument",
      "action": "Upload a document",
      "description": "Upload a document to a data source",
      "resource": "document"
    }
  ]

npm_readme:
  # n8n-nodes-dust

  This is an n8n community node. It lets you use Dust agents in your n8n workflows.

  Dust is a platform for creating custom AI agents that combine leading AI models with company knowledge to help teams work better, leveraging RAG technology for accurate, contextual responses.

  [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)  
  [Example Workflow](#example-workflow)  
  [Authentication](#authentication)  
  [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

  - Talk to an Agent
  - Upload a Document

  ## Credentials

  - Dust Workspace ID
  - Dust API Key
  - Dust Region

  ## Compatibility

  - n8n 1.1.1

  ## Usage

  1. **Add the Dust node to your workflow.**
  2. **Select the operation:**
     - _Talk to an Agent_: Send a message to a Dust agent and receive a response.
     - _Upload a Document_: Upload a document to a Dust data source.
  3. **Configure the required parameters:**
     - For "Talk to an Agent": Provide the message and select the agent.
     - For "Upload a Document": Provide Space ID, Data Source Name, Document ID, and Document Content.
  4. **(Optional) Fill in additional fields** for more control (e.g., username, email, timezone, tags, etc.).
  5. **Execute the workflow** to interact with Dust.

  ## Example Workflow

  ### Talk to an Agent

  - **Operation:** Talk to an Agent
  - **Parameters:**
    - Message: `What is the latest update on project X?`
    - Agent: (Select from dropdown)
    - Additional Fields (optional): Username, Email, Timezone

  **Output:**

  ```
  {
    "agentMessage": "Project X is on track for delivery next week.",
    "conversationUrl": "https://dust.tt/w/{workspaceId}/assistant/{conversationId}",
    "userMessage": { ... }
  }
  ```

  ### Upload a Document

  - **Operation:** Upload a Document
  - **Parameters:**
    - Space ID: `your_space_id`
    - Data Source Name: `your_data_source`
    - Document ID: `doc-123`
    - Document Content: `This is the content of the document.`
    - Additional Fields (optional): Title, MIME Type, Source URL, Tags, Async, Light Document Output

  **Output:**

  ```
  {
    "documentId": "doc-123",
    "status": "uploaded"
  }
  ```

  ## Authentication

  To use this node, you need to set up Dust API credentials in n8n:

  - **API Key:** Get your API key from your [Dust account settings](https://dust.tt/settings/api).
  - **Workspace ID:** Find your workspace ID in the Dust dashboard URL or settings.
  - **Region:** Select `EU` or `US` depending on your workspace location.

  Add these credentials in n8n under the "Dust API" credential type and reference them in the node.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Dust API Documentation](https://docs.dust.tt/reference/api)

  ## Version history

  - 0.1.1
    - Add SkipToolsValidation + rename assitant to agent
  - 0.1.0
    - Initial release

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with Dust AI agents, allowing users to send messages to agents and upload documents to Dust data sources.","capabilities":["Send messages to Dust agents and receive contextual responses","Upload documents to Dust data sources with RAG technology","Configure agent interactions with optional fields like username, email, timezone, and tags","Support for async document uploads and light document output"],"authentication":"API Key required (Dust API Key, Workspace ID, and Region)","commonUseCases":["Integrating custom AI agents with company knowledge into n8n workflows","Automating document ingestion into Dust for RAG-based responses","Creating chatbots that leverage specific organizational data"],"limitations":["Compatible only with n8n version 1.1.1","Community node status (not official n8n product)"],"relatedNodes":["n8n-nodes-core.httpRequest","n8n-nodes-core.code"]}


node_type: @nalpeiron/n8n-nodes-nalpeiron.nalpeironZentitle2
package_name: @nalpeiron/n8n-nodes-nalpeiron
display_name: Nalpeiron Zentitle2
description: Interact with Nalpeiron Zentitle2 API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: tszturmaj-nalpeiron
author_github_url: https://github.com/Nalpeiron/integrations-n8n.git
npm_package_name: @nalpeiron/n8n-nodes-nalpeiron
npm_version: 1.1.1
community_fetched_at: 2026-07-14T14:40:33.445Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Attribute",
          "value": "attribute",
          "description": "Manage global attributes"
        },
        {
          "name": "Customer",
          "value": "customer",
          "description": "Manage customer general operations"
        },
        {
          "name": "Entitlement",
          "value": "entitlement",
          "description": "Manage entitlement general operations"
        },
        {
          "name": "Feature",
          "value": "feature",
          "description": "Manage global features"
        },
        {
          "name": "Offering",
          "value": "offering",
          "description": "Manage offerings"
        },
        {
          "name": "Plan",
          "value": "plan",
          "description": "Manage plans"
        },
        {
          "name": "Product",
          "value": "product",
          "description": "Manage product general operations"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Global Attribute",
          "value": "create",
          "action": "Create global attribute",
          "description": "Create a global attribute that will be included in all entitlements. Default value can be overridden in product or edition level."
        },
        {
          "name": "Get Global Attribute",
          "value": "get",
          "action": "Get global attribute",
          "description": "This method returns selected global attribute"
        },
        {
          "name": "Get Global Attributes List",
          "value": "list",
          "action": "Get global attributes list",
          "description": "This method returns list of all attributes"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "attribute"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Customer",
          "value": "create",
          "action": "Create customer",
          "description": "Creates new customer"
        },
        {
          "name": "Create Customer Contact",
          "value": "createContacts",
          "action": "Create customer contact",
          "description": "This method creates a new customer contact. The contact must have a unique email address for the customer."
        },
        {
          "name": "Create Customer Note",
          "value": "createNotes",
          "action": "Create customer note",
          "description": "Creates new customer note"
        },
        {
          "name": "Disable Customer",
          "value": "updateDisable",
          "action": "Disable customer",
          "description": "This method disables customer and it's entitlements"
        },
        {
          "name": "Enable Customer",
          "value": "updateEnable",
          "action": "Enable customer",
          "description": "This method re-enables customer and it's entitlements"
        },
        {
          "name": "Get a Customer Contact List",
          "value": "listContacts",
          "action": "Get a customer contact list",
          "description": "This method returns a list of customer contacts"
        },
        {
          "name": "Get Contact Credentials",
          "value": "listContactsCredentials",
          "action": "Get contact credentials",
          "description": "Return the credentials for a contact. If contact does not have credentials, Authentication field will be null."
        },
        {
          "name": "Get Customer",
          "value": "get",
          "action": "Get customer",
          "description": "This method returns the selected customer"
        },
        {
          "name": "Get Customer Contact",
          "value": "getContacts",
          "action": "Get customer contact",
          "description": "This method returns selected customer contact details"
        },
        {
          "name": "Get Customer End User Portal URL",
          "value": "listEup",
          "action": "Get customer end user portal url",
          "description": "This method returns customer End User Portal URL"
        },
        {
          "name": "Get Customer List",
          "value": "list",
          "action": "Get customer list",
          "description": "This method returns list of customers"
        },
        {
          "name": "Get Customer Note",
          "value": "getNotes",
          "action": "Get customer note",
          "description": "This method returns customer note"
        },
        {
          "name": "Get Customer Note List",
          "value": "listNotes",
          "action": "Get customer note list",
          "description": "This method returns list of customer notes"
        },
        {
          "name": "Get Customer Zentitle Statistic",
          "value": "listStats",
          "action": "Get customer zentitle statistic",
          "description": "Return zentitle statistic for a given customer"
        },
        {
          "name": "Request Password Action",
          "value": "createContactsCredentialsPasswordAction",
          "action": "Request password action",
          "description": "This method allows to request setup password or reset password for selected contact. If the contact does not have credentials set up, the action will return an error. If the action is \"setup\", the contact will receive an email with a link t..."
        },
        {
          "name": "Search Contacts",
          "value": "listContactsSearch",
          "action": "Search contacts",
          "description": "This method search for customer contacts by email and returns paginated list of matching contacts"
        },
        {
          "name": "Update Contact Credentials",
          "value": "updateContactsCredentials",
          "action": "Update contact credentials",
          "description": "Creates or updates credentials for a contact. Two types of authentication are supported: password and OpenID. When using OpenID authentication, the unique claim value is required. When using password, email will be sent to the contact's em..."
        },
        {
          "name": "Update Customer Contact",
          "value": "updateContacts",
          "action": "Update customer contact",
          "description": "This method updates the selected customer contact details. At least one property must be provided."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customer"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Activate Entitlement",
          "value": "updateActivate",
          "action": "Activate entitlement",
          "description": "This method change state of entitlement that seats can be activated. Depending of offering configuration entitlement can be activated during entitlement creation."
        },
        {
          "name": "Add Activation Codes",
          "value": "updateGroupsActivationCodesAdd",
          "action": "Add activation codes",
          "description": "This method will add activation codes to the entitlement group"
        },
        {
          "name": "Assign Contact to Entitlement Group",
          "value": "createGroupsAuthorizedContacts",
          "action": "Assign contact to entitlement group",
          "description": "This method assigns a contact (with ABL credentials) to the entitlement group. If contact is already part of the entitlement group, the request will be ignored and complete successfully. Adding a contact which does not have ABL credentials ..."
        },
        {
          "name": "Change Entitlement Offering",
          "value": "updateChangeOffering",
          "action": "Change entitlement offering",
          "description": "This method allows the change of an entitlement offering. This method can only modify the entitlement to a different offering if the new offering belongs to the same product. If the new offering has a lower seat count than the seats current..."
        },
        {
          "name": "Checkout Activation Feature",
          "value": "updateActivationsFeaturesCheckout",
          "action": "Checkout activation feature",
          "description": "This method checkouts some amount feature. Feature can be used permanently (usage count) or can be returned (element pool) using return feature method."
        },
        {
          "name": "Create Activation",
          "value": "createActivations",
          "action": "Create activation",
          "description": "Activate entitlement for provided seat ID and create activation that can be used feature management This method will work only when entitlement was created before create activation is called"
        },
        {
          "name": "Create an Entitlement Group",
          "value": "createGroups",
          "action": "Create an entitlement group",
          "description": "Create an entitlement group providing a list of product SKUs. For each SKU provided an entitlement will be created within the entitlement group. All other parameters are optional. Activation code is also optional, and if not provided, it wi..."
        },
        {
          "name": "Create Entitlement Note",
          "value": "createNotes",
          "action": "Create entitlement note",
          "description": "Creates new entitlement note"
        },
        {
          "name": "Disable Entitlement",
          "value": "updateDisable",
          "action": "Disable entitlement",
          "description": "This method disables entitlement. Disabled entitlement cannot be activated."
        },
        {
          "name": "Enable Entitlement",
          "value": "updateEnable",
          "action": "Enable entitlement",
          "description": "This method re-enables entitlement. Enabled entitlement can be used normally."
        },
        {
          "name": "Extend Entitlement Group",
          "value": "createGroupsExtend",
          "action": "Extend entitlement group",
          "description": "Extend an existing entitlement group by adding new entitlements based on the provided SKUs. This will add additional entitlements to the existing entitlement group."
        },
        {
          "name": "Find Entitlement Group by Activation Code",
          "value": "createGroupsFind",
          "action": "Find entitlement group by activation code",
          "description": "This endpoint looks up an entitlement group using an activation code and product identifier"
        },
        {
          "name": "Generate Activation Codes",
          "value": "updateGroupsActivationCodesGenerate",
          "action": "Generate activation codes",
          "description": "This method will generate new codes and add them to the entitlement group"
        },
        {
          "name": "Get Activation State",
          "value": "getActivations",
          "action": "Get activation state",
          "description": "This method returns activation details including information about attributes and available features"
        },
        {
          "name": "Get an Entitlement Group",
          "value": "getGroups",
          "action": "Get an entitlement group",
          "description": "This method returns entitlement group details. The amount of data returned can be adjusted by using query expand parameter configuration."
        },
        {
          "name": "Get Entitlement",
          "value": "get",
          "action": "Get entitlement",
          "description": "This method returns entitlement details"
        },
        {
          "name": "Get Entitlement Group Authorized Contacts",
          "value": "listGroupsAuthorizedContacts",
          "action": "Get entitlement group authorized contacts",
          "description": "This method returns list of contacts (with ABL credentials) authorized for the entitlement group"
        },
        {
          "name": "Get Entitlement Group List",
          "value": "listGroups",
          "action": "Get entitlement group list",
          "description": "This method returns entitlement group list. Amount of data returned can be adjusted by using query expand parameter configuration."
        },
        {
          "name": "Get Entitlement List",
          "value": "list",
          "action": "Get entitlement list",
          "description": "This method returns list of entitlements that can be filtered by following query parameters"
        },
        {
          "name": "Get Entitlement Note",
          "value": "getNotes",
          "action": "Get entitlement note",
          "description": "This method returns entitlement note"
        },
        {
          "name": "Get Entitlement Note List",
          "value": "listNotes",
          "action": "Get entitlement note list",
          "description": "This method returns list of entitlement notes"
        },
        {
          "name": "List of Entitlement Activations",
          "value": "listActivations",
          "action": "List of entitlement activations",
          "description": "This method returns list of entitlement activation that can be filtered by following query parameters"
        },
        {
          "name": "Log of Activations Activity",
          "value": "listActivationsLog",
          "action": "Log of activations activity",
          "description": "This method returns log of activations activity on the entitlement"
        },
        {
          "name": "Refresh Activation",
          "value": "updateActivations",
          "action": "Refresh activation",
          "description": "Refresh lease time of provided seat activation When activation lease expiry already equals entitlement expiry, next and any subsequent refreshes will fail since the activation cannot be extended beyond the entitlement expiry"
        },
        {
          "name": "Remove Activation Codes",
          "value": "updateGroupsActivationCodesRemove",
          "action": "Remove activation codes",
          "description": "This method will remove activation codes from the entitlement group"
        },
        {
          "name": "Renew Entitlement",
          "value": "updateRenew",
          "action": "Renew entitlement",
          "description": "Renews a subscription entitlement. This method is specially designed for renewal of previously activated subscription entitlements. The new expiry date is determined using following rules: * If the expiration date has passed but the grace p..."
        },
        {
          "name": "Reset Entitlement Overrides",
          "value": "updateResetOverrides",
          "action": "Reset entitlement overrides",
          "description": "This method allows to reset entitlement overrides to match current product configuration. Each field can be reset individually by setting corresponding field to true. This method can also to restore current configuration for features and at..."
        },
        {
          "name": "Reset Usage Count of a Feature",
          "value": "updateFeatureReset",
          "action": "Reset usage count of a feature",
          "description": "Only usage count features can be reset"
        },
        {
          "name": "Return Activation Feature",
          "value": "updateActivationsFeaturesReturn",
          "action": "Return activation feature",
          "description": "This method returns amount of feature. Only element pool features are allowed to be returned."
        },
        {
          "name": "Trigger Provision Event",
          "value": "createProvision",
          "action": "Trigger provision event",
          "description": "This method triggers provision webhook event for the entitlement"
        },
        {
          "name": "Update Entitlement",
          "value": "update",
          "action": "Update entitlement",
          "description": "Allows to change settings of selected entitlement, including attributes and features. Only provided features and attributes will be processed. If the caller has no intentions to update features or attributes those field can be sent as null ..."
        },
        {
          "name": "Update Entitlement Group",
          "value": "updateGroups",
          "action": "Update entitlement group",
          "description": "Entitlement group update"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "entitlement"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Global Feature",
          "value": "create",
          "action": "Create global feature",
          "description": "Create a global feature that will be included in all entitlements. Default value can be overridden in product or edition level."
        },
        {
          "name": "Get Global Feature",
          "value": "get",
          "action": "Get global feature",
          "description": "This method returns selected global feature"
        },
        {
          "name": "Get Global Features List",
          "value": "list",
          "action": "Get global features list",
          "description": "This method returns list of all global features"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "feature"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Offering",
          "value": "create",
          "action": "Create offering",
          "description": "Creates new offering"
        },
        {
          "name": "Get Offering",
          "value": "get",
          "action": "Get offering",
          "description": "This method returns offering details"
        },
        {
          "name": "Get Offering List",
          "value": "list",
          "action": "Get offering list",
          "description": "This method returns list of offering that can be filtered by the following query parameters"
        },
        {
          "name": "Update Offering",
          "value": "update",
          "action": "Update offering",
          "description": "This method allows changing selected offering attributes without providing the full payload"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "offering"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Plan",
          "value": "create",
          "action": "Create plan",
          "description": "Creates new plan"
        },
        {
          "name": "Get Plan",
          "value": "get",
          "action": "Get plan",
          "description": "This method returns plan details"
        },
        {
          "name": "Get Plan List",
          "value": "list",
          "action": "Get plan list",
          "description": "This method returns list of plans that can be filtered by following query parameters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "plan"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Edition",
          "value": "createEditions",
          "action": "Create edition",
          "description": "Creates new product edition"
        },
        {
          "name": "Create Product",
          "value": "create",
          "action": "Create product",
          "description": "Creates a new product with default settings"
        },
        {
          "name": "Create Product Attribute",
          "value": "createAttributes",
          "action": "Create product attribute",
          "description": "Create new product attribute. Value defined for this attribute can be overridden in each edition if required."
        },
        {
          "name": "Create Product Feature",
          "value": "createFeatures",
          "action": "Create product feature",
          "description": "Create new product feature. Value defined for this feature can be overridden in each edition if required."
        },
        {
          "name": "Get a Product List",
          "value": "list",
          "action": "Get a product list",
          "description": "This method returns a list of products that can be filtered by following query parameters"
        },
        {
          "name": "Get Edition",
          "value": "getEditions",
          "action": "Get edition",
          "description": "This method returns product edition details"
        },
        {
          "name": "Get Edition Attribute",
          "value": "getEditionsAttributes",
          "action": "Get edition attribute",
          "description": "This method returns selected attribute with value defined in edition level (in case of override). If no value is defined in edition level, value defined in higher level is returned."
        },
        {
          "name": "Get Edition Attributes List",
          "value": "listEditionsAttributes",
          "action": "Get edition attributes list",
          "description": "This method returns list of all attributes for selected edition"
        },
        {
          "name": "Get Edition Feature",
          "value": "getEditionsFeatures",
          "action": "Get edition feature",
          "description": "This method returns selected feature with value defined in edition level (in case of override). If no value is defined in edition level, value defined in higher level is returned."
        },
        {
          "name": "Get Edition Feature List",
          "value": "listEditionsFeatures",
          "action": "Get edition feature list",
          "description": "This method returns list of all features for selected edition"
        },
        {
          "name": "Get Edition List",
          "value": "listEditions",
          "action": "Get edition list",
          "description": "This method returns list of editions that can be filtered by following query parameters"
        },
        {
          "name": "Get Product",
          "value": "get",
          "action": "Get product",
          "description": "This method returns product details"
        },
        {
          "name": "Get Product Attribute",
          "value": "getAttributes",
          "action": "Get product attribute",
          "description": "This method returns selected attribute. In case of global attribute, if overridden value exists on product level, it will be returned, otherwise global value will be returned."
        },
        {
          "name": "Get Product Attributes List",
          "value": "listAttributes",
          "action": "Get product attributes list",
          "description": "This method returns list of all attributes for selected product"
        },
        {
          "name": "Get Product Feature",
          "value": "getFeatures",
          "action": "Get product feature",
          "description": "This method returns selected feature. In case of global feature, if overridden value exists on product level, it will be returned, otherwise global value will be returned."
        },
        {
          "name": "Get Product Features List",
          "value": "listFeatures",
          "action": "Get product features list",
          "description": "This method returns list of all features for selected product"
        },
        {
          "name": "Update Edition Attribute",
          "value": "updateEditionsAttributes",
          "action": "Update edition attribute",
          "description": "This method allows to change value of selected attribute for specific edition. This method can be used to override default value of global and products attributes."
        },
        {
          "name": "Update Product",
          "value": "update",
          "action": "Update product",
          "description": "This method allows updating selected product properties. At least one property has to be provided, otherwise the request will be rejected."
        },
        {
          "name": "Update Product Attribute Value",
          "value": "updateAttributes",
          "action": "Update product attribute value",
          "description": "This method can be used to change value of selected product attribute. This method can be used to override default value of global attributes for each product separately."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "product"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Global Attribute",
      "value": "create",
      "action": "Create global attribute",
      "description": "Create a global attribute that will be included in all entitlements. Default value can be overridden in product or edition level.",
      "resource": "attribute"
    },
    {
      "name": "Get Global Attribute",
      "value": "get",
      "action": "Get global attribute",
      "description": "This method returns selected global attribute",
      "resource": "attribute"
    },
    {
      "name": "Get Global Attributes List",
      "value": "list",
      "action": "Get global attributes list",
      "description": "This method returns list of all attributes",
      "resource": "attribute"
    },
    {
      "name": "Create Customer",
      "value": "create",
      "action": "Create customer",
      "description": "Creates new customer",
      "resource": "customer"
    },
    {
      "name": "Create Customer Contact",
      "value": "createContacts",
      "action": "Create customer contact",
      "description": "This method creates a new customer contact. The contact must have a unique email address for the customer.",
      "resource": "customer"
    },
    {
      "name": "Create Customer Note",
      "value": "createNotes",
      "action": "Create customer note",
      "description": "Creates new customer note",
      "resource": "customer"
    },
    {
      "name": "Disable Customer",
      "value": "updateDisable",
      "action": "Disable customer",
      "description": "This method disables customer and it's entitlements",
      "resource": "customer"
    },
    {
      "name": "Enable Customer",
      "value": "updateEnable",
      "action": "Enable customer",
      "description": "This method re-enables customer and it's entitlements",
      "resource": "customer"
    },
    {
      "name": "Get a Customer Contact List",
      "value": "listContacts",
      "action": "Get a customer contact list",
      "description": "This method returns a list of customer contacts",
      "resource": "customer"
    },
    {
      "name": "Get Contact Credentials",
      "value": "listContactsCredentials",
      "action": "Get contact credentials",
      "description": "Return the credentials for a contact. If contact does not have credentials, Authentication field will be null.",
      "resource": "customer"
    },
    {
      "name": "Get Customer",
      "value": "get",
      "action": "Get customer",
      "description": "This method returns the selected customer",
      "resource": "customer"
    },
    {
      "name": "Get Customer Contact",
      "value": "getContacts",
      "action": "Get customer contact",
      "description": "This method returns selected customer contact details",
      "resource": "customer"
    },
    {
      "name": "Get Customer End User Portal URL",
      "value": "listEup",
      "action": "Get customer end user portal url",
      "description": "This method returns customer End User Portal URL",
      "resource": "customer"
    },
    {
      "name": "Get Customer List",
      "value": "list",
      "action": "Get customer list",
      "description": "This method returns list of customers",
      "resource": "customer"
    },
    {
      "name": "Get Customer Note",
      "value": "getNotes",
      "action": "Get customer note",
      "description": "This method returns customer note",
      "resource": "customer"
    },
    {
      "name": "Get Customer Note List",
      "value": "listNotes",
      "action": "Get customer note list",
      "description": "This method returns list of customer notes",
      "resource": "customer"
    },
    {
      "name": "Get Customer Zentitle Statistic",
      "value": "listStats",
      "action": "Get customer zentitle statistic",
      "description": "Return zentitle statistic for a given customer",
      "resource": "customer"
    },
    {
      "name": "Request Password Action",
      "value": "createContactsCredentialsPasswordAction",
      "action": "Request password action",
      "description": "This method allows to request setup password or reset password for selected contact. If the contact does not have credentials set up, the action will return an error. If the action is \"setup\", the contact will receive an email with a link t...",
      "resource": "customer"
    },
    {
      "name": "Search Contacts",
      "value": "listContactsSearch",
      "action": "Search contacts",
      "description": "This method search for customer contacts by email and returns paginated list of matching contacts",
      "resource": "customer"
    },
    {
      "name": "Update Contact Credentials",
      "value": "updateContactsCredentials",
      "action": "Update contact credentials",
      "description": "Creates or updates credentials for a contact. Two types of authentication are supported: password and OpenID. When using OpenID authentication, the unique claim value is required. When using password, email will be sent to the contact's em...",
      "resource": "customer"
    },
    {
      "name": "Update Customer Contact",
      "value": "updateContacts",
      "action": "Update customer contact",
      "description": "This method updates the selected customer contact details. At least one property must be provided.",
      "resource": "customer"
    },
    {
      "name": "Activate Entitlement",
      "value": "updateActivate",
      "action": "Activate entitlement",
      "description": "This method change state of entitlement that seats can be activated. Depending of offering configuration entitlement can be activated during entitlement creation.",
      "resource": "entitlement"
    },
    {
      "name": "Add Activation Codes",
      "value": "updateGroupsActivationCodesAdd",
      "action": "Add activation codes",
      "description": "This method will add activation codes to the entitlement group",
      "resource": "entitlement"
    },
    {
      "name": "Assign Contact to Entitlement Group",
      "value": "createGroupsAuthorizedContacts",
      "action": "Assign contact to entitlement group",
      "description": "This method assigns a contact (with ABL credentials) to the entitlement group. If contact is already part of the entitlement group, the request will be ignored and complete successfully. Adding a contact which does not have ABL credentials ...",
      "resource": "entitlement"
    },
    {
      "name": "Change Entitlement Offering",
      "value": "updateChangeOffering",
      "action": "Change entitlement offering",
      "description": "This method allows the change of an entitlement offering. This method can only modify the entitlement to a different offering if the new offering belongs to the same product. If the new offering has a lower seat count than the seats current...",
      "resource": "entitlement"
    },
    {
      "name": "Checkout Activation Feature",
      "value": "updateActivationsFeaturesCheckout",
      "action": "Checkout activation feature",
      "description": "This method checkouts some amount feature. Feature can be used permanently (usage count) or can be returned (element pool) using return feature method.",
      "resource": "entitlement"
    },
    {
      "name": "Create Activation",
      "value": "createActivations",
      "action": "Create activation",
      "description": "Activate entitlement for provided seat ID and create activation that can be used feature management This method will work only when entitlement was created before create activation is called",
      "resource": "entitlement"
    },
    {
      "name": "Create an Entitlement Group",
      "value": "createGroups",
      "action": "Create an entitlement group",
      "description": "Create an entitlement group providing a list of product SKUs. For each SKU provided an entitlement will be created within the entitlement group. All other parameters are optional. Activation code is also optional, and if not provided, it wi...",
      "resource": "entitlement"
    },
    {
      "name": "Create Entitlement Note",
      "value": "createNotes",
      "action": "Create entitlement note",
      "description": "Creates new entitlement note",
      "resource": "entitlement"
    },
    {
      "name": "Disable Entitlement",
      "value": "updateDisable",
      "action": "Disable entitlement",
      "description": "This method disables entitlement. Disabled entitlement cannot be activated.",
      "resource": "entitlement"
    },
    {
      "name": "Enable Entitlement",
      "value": "updateEnable",
      "action": "Enable entitlement",
      "description": "This method re-enables entitlement. Enabled entitlement can be used normally.",
      "resource": "entitlement"
    },
    {
      "name": "Extend Entitlement Group",
      "value": "createGroupsExtend",
      "action": "Extend entitlement group",
      "description": "Extend an existing entitlement group by adding new entitlements based on the provided SKUs. This will add additional entitlements to the existing entitlement group.",
      "resource": "entitlement"
    },
    {
      "name": "Find Entitlement Group by Activation Code",
      "value": "createGroupsFind",
      "action": "Find entitlement group by activation code",
      "description": "This endpoint looks up an entitlement group using an activation code and product identifier",
      "resource": "entitlement"
    },
    {
      "name": "Generate Activation Codes",
      "value": "updateGroupsActivationCodesGenerate",
      "action": "Generate activation codes",
      "description": "This method will generate new codes and add them to the entitlement group",
      "resource": "entitlement"
    },
    {
      "name": "Get Activation State",
      "value": "getActivations",
      "action": "Get activation state",
      "description": "This method returns activation details including information about attributes and available features",
      "resource": "entitlement"
    },
    {
      "name": "Get an Entitlement Group",
      "value": "getGroups",
      "action": "Get an entitlement group",
      "description": "This method returns entitlement group details. The amount of data returned can be adjusted by using query expand parameter configuration.",
      "resource": "entitlement"
    },
    {
      "name": "Get Entitlement",
      "value": "get",
      "action": "Get entitlement",
      "description": "This method returns entitlement details",
      "resource": "entitlement"
    },
    {
      "name": "Get Entitlement Group Authorized Contacts",
      "value": "listGroupsAuthorizedContacts",
      "action": "Get entitlement group authorized contacts",
      "description": "This method returns list of contacts (with ABL credentials) authorized for the entitlement group",
      "resource": "entitlement"
    },
    {
      "name": "Get Entitlement Group List",
      "value": "listGroups",
      "action": "Get entitlement group list",
      "description": "This method returns entitlement group list. Amount of data returned can be adjusted by using query expand parameter configuration.",
      "resource": "entitlement"
    },
    {
      "name": "Get Entitlement List",
      "value": "list",
      "action": "Get entitlement list",
      "description": "This method returns list of entitlements that can be filtered by following query parameters",
      "resource": "entitlement"
    },
    {
      "name": "Get Entitlement Note",
      "value": "getNotes",
      "action": "Get entitlement note",
      "description": "This method returns entitlement note",
      "resource": "entitlement"
    },
    {
      "name": "Get Entitlement Note List",
      "value": "listNotes",
      "action": "Get entitlement note list",
      "description": "This method returns list of entitlement notes",
      "resource": "entitlement"
    },
    {
      "name": "List of Entitlement Activations",
      "value": "listActivations",
      "action": "List of entitlement activations",
      "description": "This method returns list of entitlement activation that can be filtered by following query parameters",
      "resource": "entitlement"
    },
    {
      "name": "Log of Activations Activity",
      "value": "listActivationsLog",
      "action": "Log of activations activity",
      "description": "This method returns log of activations activity on the entitlement",
      "resource": "entitlement"
    },
    {
      "name": "Refresh Activation",
      "value": "updateActivations",
      "action": "Refresh activation",
      "description": "Refresh lease time of provided seat activation When activation lease expiry already equals entitlement expiry, next and any subsequent refreshes will fail since the activation cannot be extended beyond the entitlement expiry",
      "resource": "entitlement"
    },
    {
      "name": "Remove Activation Codes",
      "value": "updateGroupsActivationCodesRemove",
      "action": "Remove activation codes",
      "description": "This method will remove activation codes from the entitlement group",
      "resource": "entitlement"
    },
    {
      "name": "Renew Entitlement",
      "value": "updateRenew",
      "action": "Renew entitlement",
      "description": "Renews a subscription entitlement. This method is specially designed for renewal of previously activated subscription entitlements. The new expiry date is determined using following rules: * If the expiration date has passed but the grace p...",
      "resource": "entitlement"
    },
    {
      "name": "Reset Entitlement Overrides",
      "value": "updateResetOverrides",
      "action": "Reset entitlement overrides",
      "description": "This method allows to reset entitlement overrides to match current product configuration. Each field can be reset individually by setting corresponding field to true. This method can also to restore current configuration for features and at...",
      "resource": "entitlement"
    },
    {
      "name": "Reset Usage Count of a Feature",
      "value": "updateFeatureReset",
      "action": "Reset usage count of a feature",
      "description": "Only usage count features can be reset",
      "resource": "entitlement"
    },
    {
      "name": "Return Activation Feature",
      "value": "updateActivationsFeaturesReturn",
      "action": "Return activation feature",
      "description": "This method returns amount of feature. Only element pool features are allowed to be returned.",
      "resource": "entitlement"
    },
    {
      "name": "Trigger Provision Event",
      "value": "createProvision",
      "action": "Trigger provision event",
      "description": "This method triggers provision webhook event for the entitlement",
      "resource": "entitlement"
    },
    {
      "name": "Update Entitlement",
      "value": "update",
      "action": "Update entitlement",
      "description": "Allows to change settings of selected entitlement, including attributes and features. Only provided features and attributes will be processed. If the caller has no intentions to update features or attributes those field can be sent as null ...",
      "resource": "entitlement"
    },
    {
      "name": "Update Entitlement Group",
      "value": "updateGroups",
      "action": "Update entitlement group",
      "description": "Entitlement group update",
      "resource": "entitlement"
    },
    {
      "name": "Create Global Feature",
      "value": "create",
      "action": "Create global feature",
      "description": "Create a global feature that will be included in all entitlements. Default value can be overridden in product or edition level.",
      "resource": "feature"
    },
    {
      "name": "Get Global Feature",
      "value": "get",
      "action": "Get global feature",
      "description": "This method returns selected global feature",
      "resource": "feature"
    },
    {
      "name": "Get Global Features List",
      "value": "list",
      "action": "Get global features list",
      "description": "This method returns list of all global features",
      "resource": "feature"
    },
    {
      "name": "Create Offering",
      "value": "create",
      "action": "Create offering",
      "description": "Creates new offering",
      "resource": "offering"
    },
    {
      "name": "Get Offering",
      "value": "get",
      "action": "Get offering",
      "description": "This method returns offering details",
      "resource": "offering"
    },
    {
      "name": "Get Offering List",
      "value": "list",
      "action": "Get offering list",
      "description": "This method returns list of offering that can be filtered by the following query parameters",
      "resource": "offering"
    },
    {
      "name": "Update Offering",
      "value": "update",
      "action": "Update offering",
      "description": "This method allows changing selected offering attributes without providing the full payload",
      "resource": "offering"
    },
    {
      "name": "Create Plan",
      "value": "create",
      "action": "Create plan",
      "description": "Creates new plan",
      "resource": "plan"
    },
    {
      "name": "Get Plan",
      "value": "get",
      "action": "Get plan",
      "description": "This method returns plan details",
      "resource": "plan"
    },
    {
      "name": "Get Plan List",
      "value": "list",
      "action": "Get plan list",
      "description": "This method returns list of plans that can be filtered by following query parameters",
      "resource": "plan"
    },
    {
      "name": "Create Edition",
      "value": "createEditions",
      "action": "Create edition",
      "description": "Creates new product edition",
      "resource": "product"
    },
    {
      "name": "Create Product",
      "value": "create",
      "action": "Create product",
      "description": "Creates a new product with default settings",
      "resource": "product"
    },
    {
      "name": "Create Product Attribute",
      "value": "createAttributes",
      "action": "Create product attribute",
      "description": "Create new product attribute. Value defined for this attribute can be overridden in each edition if required.",
      "resource": "product"
    },
    {
      "name": "Create Product Feature",
      "value": "createFeatures",
      "action": "Create product feature",
      "description": "Create new product feature. Value defined for this feature can be overridden in each edition if required.",
      "resource": "product"
    },
    {
      "name": "Get a Product List",
      "value": "list",
      "action": "Get a product list",
      "description": "This method returns a list of products that can be filtered by following query parameters",
      "resource": "product"
    },
    {
      "name": "Get Edition",
      "value": "getEditions",
      "action": "Get edition",
      "description": "This method returns product edition details",
      "resource": "product"
    },
    {
      "name": "Get Edition Attribute",
      "value": "getEditionsAttributes",
      "action": "Get edition attribute",
      "description": "This method returns selected attribute with value defined in edition level (in case of override). If no value is defined in edition level, value defined in higher level is returned.",
      "resource": "product"
    },
    {
      "name": "Get Edition Attributes List",
      "value": "listEditionsAttributes",
      "action": "Get edition attributes list",
      "description": "This method returns list of all attributes for selected edition",
      "resource": "product"
    },
    {
      "name": "Get Edition Feature",
      "value": "getEditionsFeatures",
      "action": "Get edition feature",
      "description": "This method returns selected feature with value defined in edition level (in case of override). If no value is defined in edition level, value defined in higher level is returned.",
      "resource": "product"
    },
    {
      "name": "Get Edition Feature List",
      "value": "listEditionsFeatures",
      "action": "Get edition feature list",
      "description": "This method returns list of all features for selected edition",
      "resource": "product"
    },
    {
      "name": "Get Edition List",
      "value": "listEditions",
      "action": "Get edition list",
      "description": "This method returns list of editions that can be filtered by following query parameters",
      "resource": "product"
    },
    {
      "name": "Get Product",
      "value": "get",
      "action": "Get product",
      "description": "This method returns product details",
      "resource": "product"
    },
    {
      "name": "Get Product Attribute",
      "value": "getAttributes",
      "action": "Get product attribute",
      "description": "This method returns selected attribute. In case of global attribute, if overridden value exists on product level, it will be returned, otherwise global value will be returned.",
      "resource": "product"
    },
    {
      "name": "Get Product Attributes List",
      "value": "listAttributes",
      "action": "Get product attributes list",
      "description": "This method returns list of all attributes for selected product",
      "resource": "product"
    },
    {
      "name": "Get Product Feature",
      "value": "getFeatures",
      "action": "Get product feature",
      "description": "This method returns selected feature. In case of global feature, if overridden value exists on product level, it will be returned, otherwise global value will be returned.",
      "resource": "product"
    },
    {
      "name": "Get Product Features List",
      "value": "listFeatures",
      "action": "Get product features list",
      "description": "This method returns list of all features for selected product",
      "resource": "product"
    },
    {
      "name": "Update Edition Attribute",
      "value": "updateEditionsAttributes",
      "action": "Update edition attribute",
      "description": "This method allows to change value of selected attribute for specific edition. This method can be used to override default value of global and products attributes.",
      "resource": "product"
    },
    {
      "name": "Update Product",
      "value": "update",
      "action": "Update product",
      "description": "This method allows updating selected product properties. At least one property has to be provided, otherwise the request will be rejected.",
      "resource": "product"
    },
    {
      "name": "Update Product Attribute Value",
      "value": "updateAttributes",
      "action": "Update product attribute value",
      "description": "This method can be used to change value of selected product attribute. This method can be used to override default value of global attributes for each product separately.",
      "resource": "product"
    }
  ]

npm_readme:
  # @nalpeiron/n8n-nodes-nalpeiron

  Automate your license management and customer success workflows with the [Nalpeiron Growth Platform](https://nalpeiron.com). This n8n community node lets you integrate both Zentitle2 (license operations) and Zengain (customer lifecycle management) components with real-time notifications into your automation workflows.

  In addition to retrieval operations, action nodes support creating and updating records (POST/PATCH) for supported resources.

  ![Version](https://img.shields.io/npm/v/@nalpeiron/n8n-nodes-nalpeiron)
  ![Downloads](https://img.shields.io/npm/dm/@nalpeiron/n8n-nodes-nalpeiron)
  ![License](https://img.shields.io/npm/l/@nalpeiron/n8n-nodes-nalpeiron)

  ## What You Can Do

  ### 📊 License Data & Reporting

  - Retrieve license details and status information
  - List and filter licenses by various criteria
  - Track license usage and seat assignments
  - Monitor license expiration dates

  ### 👥 Customer Information

  - Get customer records and contact details
  - List customers with filtering options
  - Access customer-specific license information
  - Handle multi-tenant customer scenarios

  ### 📦 Product & Feature Insights

  - Retrieve product configurations and details
  - List available features and capabilities
  - Access product offerings and packages
  - Query custom attributes and configurations

  ### 🔔 Real-Time Notifications

  Listen for webhook events from both Growth Platform components:

  **Zentitle2 Component Events**:

  - License creation, activation, and expiration
  - Customer lifecycle events
  - Seat management notifications
  - Renewal and maintenance alerts

  **Zengain Component Events**:

  - Customer lifecycle changes (creation and updates) for revenue optimization and proactive customer success

  ## Use Cases

  Perfect for automating:

  **License Management (Zentitle2 Component):**

  - **License Monitoring**: Track license status and expiration dates across your organization
  - **Renewal Alerts**: Set up notifications for upcoming license expirations
  - **Usage Reporting**: Generate reports on license utilization and seat assignments
  - **Compliance Tracking**: Monitor license compliance and usage patterns

  **Customer Success & Revenue Growth (Zengain Component):**

  - **Revenue Optimization**: Identify upsell opportunities and at-risk accounts
  - **Proactive Customer Success**: Automate engagement based on customer lifecycle insights
  - **Sales Intelligence**: Sync customer behavior data to CRM systems for prioritized outreach
  - **Churn Prevention**: Set up automated workflows to address customer health signals

  **Integrated Growth Platform Workflows:**

  - **Data Synchronization**: Keep external systems updated with both license and customer success information from the Growth Platform
  - **Unified Customer View**: Combine Zentitle2 licensing data with Zengain customer success insights for complete customer intelligence

  ## Installation

  ### Community Nodes (Recommended)

  1. Go to **Settings > Community Nodes** in n8n
  2. Select **Install**
  3. Enter `@nalpeiron/n8n-nodes-nalpeiron` as the package name
  4. Click **Install**

  ### npm

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

  ## Setup Guide

  ### Step 1: Installation

  Install via Community Nodes (recommended) or npm as shown above.

  ### Step 2: Create API Credentials

  1. Log into your Nalpeiron Growth Platform account
  2. Go to the API credentials section
  3. Create new OAuth2 credentials
  4. Note down your Client ID, Client Secret, and OAuth URL

  ### Step 3: Configure Credentials in n8n

  1. In n8n, go to **Settings** > **Credentials**
  2. Click **Add Credential** and select **Nalpeiron account**
  3. Configure the following fields:
     - **Base URL**: Your Nalpeiron API endpoint (e.g., https://api.nalpeiron.com)
     - **Tenant ID**: Your Nalpeiron tenant identifier
     - **Client ID**: Your OAuth2 Client ID from Nalpeiron admin panel
     - **Client Secret**: Your OAuth2 Client Secret from Nalpeiron admin panel
     - **Access Token URL**: The OAuth2 Token endpoint URL (e.g., https://auth.nalpeiron.com/protocol/openid-connect/token)

  ### Step 4: Test Your Credentials

  The credentials include a built-in test function:

  1. Fill in your credential fields in the n8n UI
  2. Click the **"Test"** button
  3. Get immediate validation of your OAuth2 configuration

  **What Gets Tested:**

  - OAuth2 Token Request validation
  - Access Token format verification
  - Tenant-specific API access
  - Error diagnosis with specific guidance for common issues

  ## Getting Started

  After installation, you'll find four new nodes in your n8n palette:

  **Zentitle2 Nodes** (License Management Component):

  - **📊 Nalpeiron Zentitle2** - Retrieve license data (get licenses, customers, products, usage information)
  - **🔔 Nalpeiron Zentitle2 Trigger** - Listen for real-time events (license expiration, customer updates, renewals)

  **Zengain Nodes** (Customer Success Component):

  - **📊 Nalpeiron Zengain** - Access customer lifecycle data and account insights for revenue optimization
  - **🔔 Nalpeiron Zengain Trigger** - Listen for customer success events to drive proactive engagement

  **Note:** All Nalpeiron nodes are also available as AI tools for enhanced automation and intelligent workflows.

  ### Example Workflows

  **License Renewal Alert (Zentitle2 Component):**

  ```
  Nalpeiron Zentitle2 Trigger (license expires in 7 days) → Get Customer Details → Send Renewal Notice
  ```

  **Customer Success Automation (Zengain Component):**

  ```
  Nalpeiron Zengain Trigger (customer created) → Get Customer Insights → Update CRM with Revenue Opportunities
  ```

  ## Resources

  The node provides access to these Nalpeiron Growth Platform resources

  ## Webhook Events

  The trigger node supports webhook events for real-time automation

  ## Webhook Setup

  ### Basic Setup

  1. Add either the **Nalpeiron Zentitle2 Trigger** or **Nalpeiron Zengain Trigger** node to your workflow
  2. Select the events you want to listen for (supports multiple selection)
  3. Webhooks are automatically registered
  4. The webhook URL is automatically configured

  ### Authentication

  **Note:** RSA signature verification has been removed from this community package to ensure compatibility with n8n Cloud verification requirements. All webhook requests are accepted without signature verification.

  For production deployments requiring webhook authentication, consider implementing verification in your external systems or using n8n self-hosted with custom authentication logic.

  ### Auto-Setup Feature

  The trigger node automatically manage webhooks:

  - **Auto-Create**: Creates webhooks when the trigger activates
  - **Auto-Update**: Updates webhook subscriptions when events change
  - **Auto-Delete**: Removes webhooks when the trigger is deactivated

  ### Webhook Payload Structure

  All webhooks follow this structure:

  ```json
  {
  	"eventId": "event_NsqUHwSXC0S4f4vuNkegSg",
  	"eventDate": "2025-06-06T11:39:22.739326Z",
  	"eventCode": "customer.created",
  	"resourceId": "cust_ILLqMyx3UUy_n5cZqui7NQ",
  	"callAttempt": 1,
  	"payload": {
  		// Event-specific data
  	}
  }
  ```

  ### Accessing Webhook Data in n8n

  | Data          | Access Path                   | Example                  |
  | ------------- | ----------------------------- | ------------------------ |
  | Event Type    | `{{ $json.data.eventCode }}`  | `"customer.created"`     |
  | Resource ID   | `{{ $json.data.resourceId }}` | `"cust_abc123"`          |
  | Event Payload | `{{ $json.data.payload }}`    | Event-specific data      |
  | Event Date    | `{{ $json.data.eventDate }}`  | `"2025-06-06T11:39:22Z"` |

  ## Troubleshooting

  ### Webhook Not Triggering

  1. Check webhook URL is correctly registered in Nalpeiron Growth Platform
  2. Verify selected events match the events being sent
  3. Review n8n execution logs for errors
  4. Test webhook manually using the "Test URL" feature

  ### API Calls Failing

  1. Verify OAuth2 credentials are correct and have proper permissions
  2. Check the base URL points to the correct environment

  ## License

  MIT

  ## Support

  For Nalpeiron Growth Platform API questions, please contact [Nalpeiron Support](https://nalpeiron.com/support).

  ## Links

  - [n8n](https://n8n.io)
  - [Nalpeiron Growth Platform](https://nalpeiron.com)
  - [API Documentation](https://api.nalpeiron.io/docs)

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with the Nalpeiron Growth Platform to automate license management (Zentitle2) and customer lifecycle management (Zengain) workflows.","capabilities":["Retrieve license details and status information","List and filter licenses by criteria","Track license usage and seat assignments","Monitor license expiration dates","Get customer records and contact details","Access customer-specific license information","Retrieve product configurations and details","Query available features and capabilities","Listen for real-time license events (creation, activation, expiration, renewal)","Listen for real-time customer lifecycle events"],"authentication":"OAuth2 (Client ID, Client Secret, Base URL, Tenant ID, Access Token URL)","commonUseCases":["Automated license renewal alerts and expiration tracking","License compliance monitoring and usage reporting","Revenue optimization through customer lifecycle insights","Proactive customer success automation","CRM synchronization with customer and license data"],"limitations":["Read-only access to data (no modification capabilities mentioned)","Requires manual OAuth2 credential setup in n8n","Webhook event selection may require manual configuration"],"relatedNodes":["Nalpeiron Zentitle2 Trigger","Nalpeiron Zengain Trigger","Nalpeiron Zengain","Nalpeiron Zentitle2"]}


node_type: n8n-nodes-mfr.mfr
package_name: n8n-nodes-mfr
display_name: mfr - Field Service Management
description: Field service management app for scheduling technicians.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: apps_makeitfuture
author_github_url: https://github.com/anemesMakeitfuture/mfr-field-service-management.git
npm_package_name: n8n-nodes-mfr
npm_version: 0.1.13
community_fetched_at: 2026-07-14T14:40:33.446Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "company",
      "options": [
        {
          "name": "Company",
          "value": "company"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Appointment",
          "value": "appointment"
        },
        {
          "name": "Item Type",
          "value": "itemType"
        },
        {
          "name": "Service Object",
          "value": "serviceObject"
        },
        {
          "name": "Service Request",
          "value": "serviceRequest"
        },
        {
          "name": "Document",
          "value": "document"
        },
        {
          "name": "User",
          "value": "user"
        },
        {
          "name": "Report",
          "value": "report"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a company",
          "description": "Get a company"
        },
        {
          "name": "Get Many",
          "value": "listCompanies",
          "action": "List companies",
          "description": "List Companies"
        },
        {
          "name": "Create One",
          "value": "createCompany",
          "action": "Create a company",
          "description": "Create a Company"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "company"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listContacts",
      "options": [
        {
          "name": "Get Many",
          "value": "listContacts",
          "action": "List contacts",
          "description": "List Contacts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createAppointment",
      "options": [
        {
          "name": "Create One",
          "value": "createAppointment",
          "action": "Create an appointment",
          "description": "Create an Appointment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "appointment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createItemType",
      "options": [
        {
          "name": "Create One",
          "value": "createItemType",
          "action": "Create an item type",
          "description": "Create an Item Type"
        },
        {
          "name": "Get One",
          "value": "getItemType",
          "action": "Get an item type",
          "description": "Get an Item Type"
        },
        {
          "name": "Get Many",
          "value": "listItemTypes",
          "action": "List item types",
          "description": "List Item Types"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "itemType"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createServiceObject",
      "options": [
        {
          "name": "Create One",
          "value": "createServiceObject",
          "action": "Create a service object",
          "description": "Create a Service Object"
        },
        {
          "name": "Get One Service Object",
          "value": "getServiceObject",
          "action": "Get a service object by id",
          "description": "Get a Service Object by ID"
        },
        {
          "name": "Get Many Service Objects",
          "value": "listServiceObjects",
          "action": "Get all service objects",
          "description": "Get all Service Objects"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "serviceObject"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createServiceRequest",
      "options": [
        {
          "name": "Create One",
          "value": "createServiceRequest",
          "action": "Create a service request",
          "description": "Create a Service Request"
        },
        {
          "name": "Get One",
          "value": "getServiceRequest",
          "action": "Get a service request by id",
          "description": "Get a Service Request by ID"
        },
        {
          "name": "Delete One",
          "value": "deleteServiceRequest",
          "action": "Delete a service request",
          "description": "Delete a Service Request"
        },
        {
          "name": "Add Tags to Service Request",
          "value": "addTagsToServiceRequest",
          "action": "Add a tag to a service request",
          "description": "Add a tag to a service request"
        },
        {
          "name": "Remove Tag From Service Request",
          "value": "removeTagFromServiceRequest",
          "action": "Remove a tag from service request",
          "description": "Remove a tag from service request"
        },
        {
          "name": "Get Many Service Requests",
          "value": "listServiceRequests",
          "action": "Get a list of all service requests",
          "description": "Get a list of all service requests, with Service Objects and Products, Steps, Reports, Appointments and Items expanded"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "serviceRequest"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "uploadDocument",
      "options": [
        {
          "name": "Upload One",
          "value": "uploadDocument",
          "action": "Upload document",
          "description": "Upload Document"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listUsers",
      "options": [
        {
          "name": "Get Many Users",
          "value": "listUsers",
          "action": "Get all users",
          "description": "Get all Users"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateReportFromReportDefinition",
      "options": [
        {
          "name": "Generate Report",
          "value": "generateReportFromReportDefinition",
          "action": "Generate report from report definition",
          "description": "Generate Report from Report Definition"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "report"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get",
      "value": "get",
      "action": "Get a company",
      "description": "Get a company",
      "resource": "company"
    },
    {
      "name": "Get Many",
      "value": "listCompanies",
      "action": "List companies",
      "description": "List Companies",
      "resource": "company"
    },
    {
      "name": "Create One",
      "value": "createCompany",
      "action": "Create a company",
      "description": "Create a Company",
      "resource": "company"
    },
    {
      "name": "Get Many",
      "value": "listContacts",
      "action": "List contacts",
      "description": "List Contacts",
      "resource": "contact"
    },
    {
      "name": "Create One",
      "value": "createAppointment",
      "action": "Create an appointment",
      "description": "Create an Appointment",
      "resource": "appointment"
    },
    {
      "name": "Create One",
      "value": "createItemType",
      "action": "Create an item type",
      "description": "Create an Item Type",
      "resource": "itemType"
    },
    {
      "name": "Get One",
      "value": "getItemType",
      "action": "Get an item type",
      "description": "Get an Item Type",
      "resource": "itemType"
    },
    {
      "name": "Get Many",
      "value": "listItemTypes",
      "action": "List item types",
      "description": "List Item Types",
      "resource": "itemType"
    },
    {
      "name": "Create One",
      "value": "createServiceObject",
      "action": "Create a service object",
      "description": "Create a Service Object",
      "resource": "serviceObject"
    },
    {
      "name": "Get One Service Object",
      "value": "getServiceObject",
      "action": "Get a service object by id",
      "description": "Get a Service Object by ID",
      "resource": "serviceObject"
    },
    {
      "name": "Get Many Service Objects",
      "value": "listServiceObjects",
      "action": "Get all service objects",
      "description": "Get all Service Objects",
      "resource": "serviceObject"
    },
    {
      "name": "Create One",
      "value": "createServiceRequest",
      "action": "Create a service request",
      "description": "Create a Service Request",
      "resource": "serviceRequest"
    },
    {
      "name": "Get One",
      "value": "getServiceRequest",
      "action": "Get a service request by id",
      "description": "Get a Service Request by ID",
      "resource": "serviceRequest"
    },
    {
      "name": "Delete One",
      "value": "deleteServiceRequest",
      "action": "Delete a service request",
      "description": "Delete a Service Request",
      "resource": "serviceRequest"
    },
    {
      "name": "Add Tags to Service Request",
      "value": "addTagsToServiceRequest",
      "action": "Add a tag to a service request",
      "description": "Add a tag to a service request",
      "resource": "serviceRequest"
    },
    {
      "name": "Remove Tag From Service Request",
      "value": "removeTagFromServiceRequest",
      "action": "Remove a tag from service request",
      "description": "Remove a tag from service request",
      "resource": "serviceRequest"
    },
    {
      "name": "Get Many Service Requests",
      "value": "listServiceRequests",
      "action": "Get a list of all service requests",
      "description": "Get a list of all service requests, with Service Objects and Products, Steps, Reports, Appointments and Items expanded",
      "resource": "serviceRequest"
    },
    {
      "name": "Upload One",
      "value": "uploadDocument",
      "action": "Upload document",
      "description": "Upload Document",
      "resource": "document"
    },
    {
      "name": "Get Many Users",
      "value": "listUsers",
      "action": "Get all users",
      "description": "Get all Users",
      "resource": "user"
    },
    {
      "name": "Generate Report",
      "value": "generateReportFromReportDefinition",
      "action": "Generate report from report definition",
      "description": "Generate Report from Report Definition",
      "resource": "report"
    }
  ]

npm_readme:
  # n8n-nodes-mfr

  This is an n8n community node. It lets you use mfr – Field Service Management in your n8n workflows.

  mfr – Field Service Management is a cloud platform for creating, scheduling and tracking service requests, assets, appointments, technicians, reports and related documents.


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

  [Installation](#installation)  
  [Operations](#operations)  
  [Credentials](#credentials)  <!-- delete if no auth needed -->  
  [Compatibility](#compatibility)  
  [Usage](#usage)  <!-- delete if not using this section -->  
  [Resources](#resources)  

  ## Installation

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

  ## Operations


  - Get a Company
  - Create a Company
  - List Companies
  - Create a Service Request
  - Get a Service Request
  - List Service Requests
  - Delete a Service Request
  - Generate Report
  - Add Tags to Service Request
  - Remove Tag from Service Request
  - Upload Document
  - Appointment
  - Create an Appointment
  - Create an Item Type
  - Get an Item Type
  - List Item Types
  - Create a Service Object
  - Get a Service Object
  - List Service Objects
  - List Users
  - Watch Events Trigger – subscribe to real‑time change events from mfr

  ## Credentials

  The basic auth method is used for the requests.

  ## Compatibility

  1.98.0

  ## Usage

  Add the mfr Field Service node to your workflow and choose a Resource and Operation from the dropdown. Map the required fields using n8n data‑pinning or expressions.

  Example ideas:

  Create a Service Request when a support ticket is opened

  Trigger: Zendesk, Freshdesk, etc.

  Node: Create a Company (if customer doesn’t exist)

  Node: Create a Service Request

  Node: Slack / Email → notify dispatcher.

  Generate a PDF report nightly for completed service requests

  Trigger: Cron (daily 02:00)

  Node: List Service Requests (filter status = completed, updatedYesterday)

  Loop: Generate Report → store in S3 / email to customer.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [mfr API Documentation and Auth](https://documenter.getpostman.com/view/3999268/TVYCAzpK#intro)

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with mfr – Field Service Management to automate scheduling, tracking, and reporting for service requests, technicians, and assets.","capabilities":["Create and manage companies","Create, retrieve, list, and delete service requests","Generate reports","Manage tags on service requests","Upload documents","Create and manage appointments","Manage item types","Manage service objects","List users","Subscribe to real-time change events"],"authentication":"Basic auth","commonUseCases":["Automatically create service requests when support tickets are opened from Zendesk or Freshdesk","Generate nightly PDF reports for completed service requests and store them in cloud storage","Notify dispatchers via Slack or email when new service requests are created"],"limitations":["Community node (may not be maintained by n8n core team)","Requires external API documentation for detailed field mapping"],"relatedNodes":["Cron Trigger","Slack","Email","S3","Zendesk"]}


node_type: n8n-nodes-unstract.llmWhisperer
package_name: n8n-nodes-unstract
display_name: LLMWhisperer
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: arun-unstract
author_github_url: https://github.com/Zipstack/n8n-nodes.git
npm_package_name: n8n-nodes-unstract
npm_version: 0.5.7
community_fetched_at: 2026-07-14T14:40:33.448Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Extract text from PDFs, images, and scanned documents using OCR. Preserves layout and formatting for accurate text extraction from any document type

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "extractText",
      "options": [
        {
          "name": "Extract Text",
          "value": "extractText",
          "action": "Extract text from document",
          "description": "Extract text from PDFs and images using OCR"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Extract Text",
      "value": "extractText",
      "action": "Extract text from document",
      "description": "Extract text from PDFs and images using OCR",
      "resource": "document"
    }
  ]

npm_readme:
  # n8n-nodes-unstract
  <div align="center">

  ![n8n-node-codechat-wapi](https://img.shields.io/npm/v/n8n-nodes-unstract?label=n8n-nodes-unstract&logo=unstract)
  ![License](https://img.shields.io/npm/l/n8n-nodes-unstract)
  [![n8n](https://img.shields.io/badge/n8n-community-F94B72)](https://community.n8n.io/)
  ![dt](https://img.shields.io/npm/dt/n8n-nodes-unstract)
  ![dw](https://img.shields.io/npm/dw/n8n-nodes-unstract)

  </div>
  This is an n8n community node package that provides integrations with Unstract services, including LLMWhisperer and the Unstract API. These nodes enable seamless document processing and text extraction workflows within your n8n automations.

  ## What is Unstract?

  [Unstract](https://unstract.com) is a platform that helps extract structured data from unstructured documents using AI. It provides powerful APIs for document processing, including:

  - **LLMWhisperer**: Convert documents to layout-preserved plain text
  - **Unstract API**: Extract structured data from documents using custom workflows

  ## Features

  This package includes following main nodes:

  ### 🔤 LLMWhisperer Node
  - Convert documents (PDF, images, etc.) to layout-preserved plain text
  - Maintain document structure and formatting
  - Support for various document formats
  - Configurable processing modes

  ### 🤖 Unstract Node
  - Process documents using Unstract's AI-powered extraction
  - Extract structured data from unstructured documents
  - Support for custom API deployments
  - Seamless integration with Unstract workflows

  ### 📤 Unstract HITL Push Node
  - Push documents to Human-in-the-Loop (HITL) processing queues
  - Configure timeout, metrics, metadata, and queue targeting
  - Support for various document types and queue configurations
  - Error handling for upload and processing issues

  ### 📥 Unstract HITL Fetch Node
  - Retrieve approved results from HITL processing queues
  - Poll for completed processing with configurable intervals
  - Optional queue name parameter for targeted fetching
  - Proper error handling for "No approved items available" responses

  ## Installation

  ### Community Nodes (Recommended)

  1. Go to **Settings > Community Nodes** in your n8n instance
  2. Select **Install a community node**
  3. Enter the npm package name: `n8n-nodes-unstract`
  4. Click **Install**

  ### Manual Installation

  You can install this node package in your n8n instance using npm:

  ```bash
  npm install n8n-nodes-unstract
  ```

  For Docker installations, add the package to your n8n container:

  ```bash
  # Replace <your-path-to-n8n-custom-nodes> with the path to n8n
  N8N_CUSTOM_EXTENSIONS="<your-path-to-n8n-custom-nodes>" npx n8n start
  ```

  ## Configuration

  ### Prerequisites

  Before using these nodes, you'll need:

  1. **API Credentials**: Get your API keys from:
     - [LLMWhisperer API - Follow the doc](https://docs.unstract.com/llmwhisperer/llm_whisperer/getting_started/llm_whisperer_registering/)
     - [Unstract Platform - Follow the doc](https://docs.unstract.com/unstract/unstract_platform/api_deployment/unstract_api_deployment_intro/)

  2. **Node.js**: Version 20 or above is required

  ### Setting up Credentials

  1. **LLMWhisperer API Credentials**:
     - Go to your n8n credentials settings
     - Create new credentials of type "LLMWhisperer API"
     - Enter your LLMWhisperer API key

  2. **Unstract API Credentials**:
     - Go to your n8n credentials settings
     - Create new credentials of type "Unstract API"
     - Enter your Unstract API key and endpoint details

  3. **Unstract HITL Credentials**:
     - Go to your n8n credentials settings
     - Create new credentials of type "Unstract HITL"
     - Enter your HITL API key for Human-in-the-Loop processing

  ## Usage Examples

  ### LLMWhisperer Node

  Use the LLMWhisperer node to convert documents to text while preserving layout:

  1. Add the LLMWhisperer node to your workflow
  2. Configure your API credentials
  3. Set the input file (binary data)
  4. Choose processing mode and options
  5. Execute to get layout-preserved text output

  ### Unstract Node

  Use the Unstract node to extract structured data:

  1. Add the Unstract node to your workflow
  2. Configure your API credentials and deployment
  3. Set the input document (binary data)
  4. Specify your API deployment name
  5. Execute to get structured data output

  ### Unstract HITL Push Node

  Use the HITL Push node to send documents for human review:

  1. Add the Unstract HITL Push node to your workflow
  2. Configure your HITL API credentials
  3. Set the input document (binary data)
  4. Configure queue name, timeout, and metadata options
  5. Execute to push document to HITL processing queue

  ### Unstract HITL Fetch Node

  Use the HITL Fetch node to retrieve approved results:

  1. Add the Unstract HITL Fetch node to your workflow
  2. Configure your HITL API credentials
  3. Optionally specify a queue name to target specific queues
  4. Configure polling interval and retry settings
  5. Execute to fetch approved results from HITL queue

  ## Screenshots

  ### Node Integration Examples

  Visual guides for integrating Unstract nodes in your n8n workflows:

  #### LLMWhisperer Node Configuration
  ![LLMWhisperer node setup and configuration](screenshots/llmwhisperer-node-config.png)

  #### Unstract Node Configuration  
  ![Unstract API node setup and configuration](screenshots/unstract-node-config.png)

  #### HITL Push Node Configuration
  ![HITL Push node setup with queue configuration and document upload](screenshots/hitl-push-node-config.png)

  #### HITL Fetch Node Configuration
  ![HITL Fetch node setup with polling configuration](screenshots/hitl-fetch-node-config.png)

  These screenshots help developers understand the visual setup and configuration of each node type for seamless integration into n8n workflows.

  ## API Documentation

  For detailed API documentation and advanced configuration options:

  - [LLMWhisperer Documentation](https://docs.unstract.com/llm_whisperer/)
  - [Unstract Platform Documentation](https://docs.unstract.com/unstract/)

  ## Development

  ### Prerequisites

  - Node.js 20 or above
  - npm or yarn

  ### Setup

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

  # Install dependencies
  npm install

  # Build the project
  npm run build

  # Run linting
  npm run lint
  ```

  ### Running n8n with Custom Nodes

  For development and testing:

  ```bash
  # Set the custom extensions path and start n8n
  N8N_CUSTOM_EXTENSIONS="/path/to/n8n-nodes" npx n8n start
  ```

  ## Support

  - **Documentation**: [docs.unstract.com](https://docs.unstract.com)
  - **Issues**: [GitHub Issues](https://github.com/Zipstack/n8n-nodes/issues)
  - **Community**: [Join our community discussions](https://join.slack.com/t/unstract/shared_invite/zt-372jed537-bYz99iZnfXnhqyjbU8lPLg)
  - **Email**: support@unstract.com

  ## License

  This project is licensed under the MIT License - see the package.json file for details.

  ## Contributing

  We welcome contributions! Please feel free to submit issues, feature requests, or pull requests.

  ---

  **Made with ❤️ by the Unstract team**

ai_documentation_summary:
  {"purpose":"The LLMWhisperer node extracts text from PDFs, images, and scanned documents using OCR while preserving layout and formatting for accurate text extraction.","capabilities":["Convert documents to layout-preserved plain text","Maintain document structure and formatting","Support for various document formats (PDF, images, etc.)","Configurable processing modes"],"authentication":"API key required (LLMWhisperer API key)","commonUseCases":["Converting scanned documents to editable text","Extracting text from PDFs while maintaining layout","Processing images and documents for text analysis workflows"],"limitations":["Requires Node.js version 20 or above","Requires separate API credentials setup in n8n"],"relatedNodes":["Unstract Node","Unstract HITL Push Node","Unstract HITL Fetch Node"]}


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

updated_at: 2026-07-14 14:40:33
author_name: robfigroam
author_github_url: https://github.com/WonderInventions/
npm_package_name: n8n-nodes-roam
npm_version: 0.1.14
community_fetched_at: 2026-07-14T14:40:33.448Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Meeting",
          "value": "meeting"
        },
        {
          "name": "Message",
          "value": "message"
        },
        {
          "name": "Transcript",
          "value": "transcript"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send Message",
          "value": "send",
          "action": "Send a message",
          "description": "Send a message to a Roam group"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Meeting Link",
          "value": "create",
          "action": "Create a meeting link",
          "description": "Create a meeting link"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "meeting"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Get Transcript Info",
          "value": "info",
          "action": "Get transcript info",
          "description": "Get detailed information about a specific transcript"
        },
        {
          "name": "List Transcripts",
          "value": "list",
          "action": "List transcripts",
          "description": "List transcripts with optional date filtering"
        },
        {
          "name": "Prompt Transcript",
          "value": "prompt",
          "action": "Prompt a transcript",
          "description": "Ask a question about a transcript using AI"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transcript"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Message",
      "value": "send",
      "action": "Send a message",
      "description": "Send a message to a Roam group",
      "resource": "message"
    },
    {
      "name": "Create Meeting Link",
      "value": "create",
      "action": "Create a meeting link",
      "description": "Create a meeting link",
      "resource": "meeting"
    },
    {
      "name": "Get Transcript Info",
      "value": "info",
      "action": "Get transcript info",
      "description": "Get detailed information about a specific transcript",
      "resource": "transcript"
    },
    {
      "name": "List Transcripts",
      "value": "list",
      "action": "List transcripts",
      "description": "List transcripts with optional date filtering",
      "resource": "transcript"
    },
    {
      "name": "Prompt Transcript",
      "value": "prompt",
      "action": "Prompt a transcript",
      "description": "Ask a question about a transcript using AI",
      "resource": "transcript"
    }
  ]

npm_readme:
  # n8n-nodes-roam

  This is an n8n community node. It lets you use Roam in your n8n workflows.

  Roam is a video conferencing and messaging platform that enables teams to connect, collaborate, and communicate effectively through video meetings, messaging, and integrations.

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

  ## Installation

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

  ## Operations

  ### Roam Node
  - **Send Message**: Send messages to Roam groups
  - **Create Meeting Link**: Create new video meeting links

  ### Roam Trigger Node
  - **Webhook Events**: Trigger workflows when webhook events are received from Roam

  ## Credentials

  To use this node, you need to authenticate with Roam's API using OAuth2.

  1. Go to your Roam developer account at [developer.ro.am](https://developer.ro.am)
  2. Create an API Key application
  3. Enable permissions corresponding to what you want it to do: 
    - Actions
      - Send chat message: `chat:send_message`, `groups:read`
      - Create meeting link: `meetinglink:write`
    - Webhooks: `webhook:write`
      - New Recording: `recordings:read`
      - New Transcript: `transcript:read`
  3. In n8n, create a new credential of type "Roam API Key"
  4. Fill in your secret key

  ## Compatibility

  - n8n version: 1.0.0+
  - Node.js version: 18.0.0+
  - Tested with n8n versions: 1.0.x, 1.1.x

  ## Usage

  ### Basic Setup
  1. Install the community node
  2. Set up your Roam OAuth2 credentials
  3. Use the Roam node to send messages or create meetings
  4. Use the Roam Trigger node to respond to webhook events

  ### Example Workflow
  1. **Trigger**: HTTP Request (when a form is submitted)
  2. **Action**: Roam - Send Message (notify team about the submission)
  3. **Action**: Roam - Create Meeting Link (schedule a follow-up meeting)

  ## Development

  To run n8n locally: 

  - Run `ngrok http 5678` to support incoming webhooks. Set `WEBHOOK_URL` to the ngrok URL.
  - Run `npm run dev`

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Roam API Documentation](https://developer.ro.am/)
  * [Roam Developer Portal](https://developer.ro.am)

  ## Version history

  ### 0.1.1
  - Initial release
  - Roam node with meeting and messaging operations
  - Roam Trigger node for webhook events
  - Basic transport layer for API communication
  - OAuth2 authentication

ai_documentation_summary:
  {"purpose":"A community node that enables n8n workflows to interact with Roam, a video conferencing and messaging platform, for sending messages and creating meeting links.","capabilities":["Send messages to Roam groups","Create new video meeting links","Trigger workflows on webhook events (new recordings, new transcripts)","Read recordings and transcripts via webhooks"],"authentication":"OAuth2","commonUseCases":["Notifying teams about form submissions via group messages","Scheduling follow-up meetings automatically after events","Automated responses to new Roam recordings or transcripts"],"limitations":["Community node (not official n8n node)","Requires manual setup of OAuth2 credentials via Roam developer portal","Requires n8n version 1.0.0+ and Node.js 18.0.0+"],"relatedNodes":["HTTP Request","Webhook"]}


node_type: n8n-nodes-medullar.medullar
package_name: n8n-nodes-medullar
display_name: Medullar
description: AI-powered discovery & insight platform that acts as your extended digital mind.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: medullar_solutions
author_github_url: https://github.com/medullar/n8n-node.git
npm_package_name: n8n-nodes-medullar
npm_version: 1.0.5
community_fetched_at: 2026-07-14T14:40:33.449Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "space",
      "options": [
        {
          "name": "Space",
          "value": "space"
        }
      ],
      "required": true,
      "description": "Interact with a Medullar Space",
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list-space",
      "options": [
        {
          "name": "Add Space Record",
          "value": "add-record",
          "action": "Add record to space",
          "description": "Adds a Record into a Space"
        },
        {
          "name": "Ask Space",
          "value": "ask-space",
          "action": "Ask a question to a space",
          "description": "Ask anything to a Space"
        },
        {
          "name": "Create Space",
          "value": "create-new-space",
          "action": "Create new space",
          "description": "Create a new Space"
        },
        {
          "name": "Delete Space",
          "value": "delete-space",
          "action": "Delete a space",
          "description": "Delete a Space"
        },
        {
          "name": "List Spaces",
          "value": "list-space",
          "action": "List all spaces",
          "description": "List all user Spaces"
        },
        {
          "name": "Rename Space",
          "value": "rename-space",
          "action": "Rename a space",
          "description": "Rename a Space"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "space"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Add Space Record",
      "value": "add-record",
      "action": "Add record to space",
      "description": "Adds a Record into a Space",
      "resource": "space"
    },
    {
      "name": "Ask Space",
      "value": "ask-space",
      "action": "Ask a question to a space",
      "description": "Ask anything to a Space",
      "resource": "space"
    },
    {
      "name": "Create Space",
      "value": "create-new-space",
      "action": "Create new space",
      "description": "Create a new Space",
      "resource": "space"
    },
    {
      "name": "Delete Space",
      "value": "delete-space",
      "action": "Delete a space",
      "description": "Delete a Space",
      "resource": "space"
    },
    {
      "name": "List Spaces",
      "value": "list-space",
      "action": "List all spaces",
      "description": "List all user Spaces",
      "resource": "space"
    },
    {
      "name": "Rename Space",
      "value": "rename-space",
      "action": "Rename a space",
      "description": "Rename a Space",
      "resource": "space"
    }
  ]

npm_readme:
  ![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)

  # n8n-nodes-medullar

  ![Icon image](https://cdn.medullar.com/images/web/logo/medullar_favicon_128x128.png)

  This is an [n8n](https://n8n.io) community node that lets you integrate seamlessly with Medullar’s collaborative knowledge platform in your n8n workflows [Medullar](https://medullar.com).

  **Medullar** is an AI-powered workspace for actionable team intelligence—capturing insights, connecting conversations, and automating knowledge sharing across your daily tools. With this node, you can connect to your Medullar Spaces, fetch key insights, trigger knowledge actions, and weave Medullar’s contextual smarts directly into your workflow automation.

  Use this node to unify scattered information, automate knowledge handoffs, and bridge project data—so your workflows become not just automated, but genuinely intelligent.

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

  ## Features
  - **List Spaces**: Retrieve all your Medullar Spaces to keep track of your collaborative environments.
  - **Create Space**: Easily create new Spaces to organize your projects and knowledge.
  - **Add Space Record**: Add various types of content to your Spaces including text, URLs, images, and files to build your knowledge base.
  - **Ask Space**: Interact with your Medullar Spaces using multiple AI modes:
    - MedullaryAI Agent (OpenAI and xAI Grok variants)
    - MedullaryAI Fact Check for verification
    - MedullaryAI Researcher for in-depth analysis
    - MedullaryAI Sales Researcher for sales intelligence
    - MedullaryAI Search Agent for targeted searches
    - Optional Deep Analysis for more accurate but slower responses
  - **Rename Space**: Update the name of existing Spaces to better reflect their purpose.
  - **Delete Space**: Remove Spaces that are no longer needed to keep your workspace organized.

  ## Credentials

  To use this node, you need to set up credentials for Medullar. You can find your API key in your Medullar account settings.

  ## Compatibility

  - Requires n8n version 1.0.0 or later
  - Requires Medullar paid plan

  ## Resources
  - [n8n Documentation](https://docs.n8n.io)
  - [Medullar](https://www.medullar.com)

  ## License

  [MIT](https://github.com/n8n-io/n8n-nodes-starter/blob/master/LICENSE.md)

ai_documentation_summary:
  {"purpose":"Integrates Medullar's AI-powered collaborative knowledge platform into n8n workflows to manage spaces, retrieve insights, and trigger knowledge-based actions.","capabilities":["List Medullar Spaces","Create new Spaces","Add content to Spaces (text, URLs, images, files)","Rename Spaces","Delete Spaces","Query Spaces using MedullaryAI Agent","Verify facts using MedullaryAI Fact Check","Conduct in-depth analysis using MedullaryAI Researcher","Gather sales intelligence using MedullaryAI Sales Researcher","Perform targeted searches using MedullaryAI Search Agent"],"authentication":"API key required","commonUseCases":["Automating knowledge sharing across team tools","Unifying scattered information into centralized Spaces","Integrating AI-driven insights into workflow automation","Conducting sales research and fact-checking within workflows"],"limitations":["Requires a Medullar paid plan subscription","Requires n8n version 1.0.0 or later"],"relatedNodes":["Medullar","OpenAI","xAI Grok"]}


node_type: n8n-nodes-jetapi.jetapi
package_name: n8n-nodes-jetapi
display_name: JetAPI
description: Integrate with JetAPI for Telegram and WhatsApp messaging
category: Community
development_style: declarative
version: 6
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: jetapi
author_github_url: https://github.com/jetapi/
npm_package_name: n8n-nodes-jetapi
npm_version: 1.3.1
community_fetched_at: 2026-07-14T14:40:33.450Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "sendText",
      "options": [
        {
          "name": "Send Text Message",
          "value": "sendText",
          "action": "Send a text message"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Text Message",
      "value": "sendText",
      "action": "Send a text message"
    }
  ]

npm_readme:
  # n8n-nodes-jetapi
  This is an n8n community node for [JetAPI](https://jetapi.io/login?referral=n8n&subs_slug=jtp_individ&subs_type=temp) - send messages via Telegram and WhatsApp.

  ## Installation
  ```bash
  npm install n8n-nodes-jetapi

  ## 🎉 Get 10 Days Free Trial!

  [Sign up for JetAPI](https://jetapi.io/login?referral=n8n&subs_slug=jtp_individ&subs_type=temp) and get **10 days free trial** to test all messaging features.

  ## Usage

  Get your API credentials from [JetAPI Dashboard](https://jetapi.io/login?referral=n8n&subs_slug=jtp_individ&subs_type=temp) (10 days free!)
  Create JetAPI credentials in n8n with your Bearer Token
  Add JetAPI node to your workflow
  Configure the message parameters

  ## Features

  WhatsApp messaging - Send messages via phone number
  Telegram messaging - Send via phone number, username, user ID or group ID

  License
  MIT

ai_documentation_summary:
  {"purpose":"A community n8n node that enables sending messages via Telegram and WhatsApp using JetAPI.","capabilities":["Send WhatsApp messages via phone number","Send Telegram messages via phone number","Send Telegram messages via username","Send Telegram messages via user ID","Send Telegram messages via group ID"],"authentication":"API key required (Bearer Token)","commonUseCases":["Automated customer support notifications","Marketing campaigns via WhatsApp","Community updates via Telegram","Two-factor authentication codes delivery"],"limitations":["Requires external API key from JetAPI dashboard","Free tier includes 10-day trial period","No built-in support for media attachments mentioned in README"],"relatedNodes":["n8n-nodes-whatsapp","n8n-nodes-telegram"]}


node_type: n8n-nodes-itop.iTop
package_name: n8n-nodes-itop
display_name: iTop
description: Interact with iTop CMDB via REST API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: larhip
author_github_url: https://github.com/itomig-de/
npm_package_name: n8n-nodes-itop
npm_version: 1.0.3
community_fetched_at: 2026-07-14T14:40:33.451Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "object",
      "options": [
        {
          "name": "Object",
          "value": "object"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Apply Stimulus",
          "value": "apply_stimulus",
          "action": "Apply stimulus to an object",
          "description": "Update fields and apply a stimulus on a single iTop object"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new object",
          "description": "Create a new object in iTop"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an object",
          "description": "Delete an existing object in iTop"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get objects",
          "description": "Search for and retrieve iTop objects"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an object",
          "description": "Update a single iTop object"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "object"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Apply Stimulus",
      "value": "apply_stimulus",
      "action": "Apply stimulus to an object",
      "description": "Update fields and apply a stimulus on a single iTop object",
      "resource": "object"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new object",
      "description": "Create a new object in iTop",
      "resource": "object"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an object",
      "description": "Delete an existing object in iTop",
      "resource": "object"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get objects",
      "description": "Search for and retrieve iTop objects",
      "resource": "object"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an object",
      "description": "Update a single iTop object",
      "resource": "object"
    }
  ]

npm_readme:
  # n8n-nodes-itop

  This is an n8n community node. It lets you use iTop CMDB 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)
  [Resources](#resources)

  ## Preview

  https://github.com/user-attachments/assets/6524dc6b-c6c9-4a39-ae8f-218ec982d13b


  ## Installation

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

  ## Operations

  - **Get**: Search for and retrieve iTop objects using OQL queries or object IDs
  - **Update**: Update a single iTop object with new field values

  ## Credentials

  You can use either username/password or token-based authentication to use this node.

  ### Setting up credentials in n8n

  1. In n8n, go to **Credentials** and create a new **iTop API** credential
  2. Enter your **iTop URL** (e.g., `https://your-itop-instance.com`)
  3. Select your **Authentication Method**:

  ### Username and Password

  1. Select **Username and Password** as the authentication method
  2. Enter your iTop **Username**
  3. Enter your iTop **Password**
  4. Optionally adjust the **API Version** (default: 1.3)

  ### Token

  1. Select **Token** as the authentication method
  2. Enter your iTop **Auth Token**
     - To generate a token in iTop, go to **User Account** > **Personal Tokens**
  3. Optionally adjust the **API Version** (default: 1.3)

  ### Required iTop Permissions

  Users need the following permissions in iTop:
  - **REST Services User** profile
  - **Write access** on the classes they want to modify
  - **Bulk write** permissions on the classes they want to modify

  Note: Standard administrator accounts do not have REST access by default unless the REST Services User profile is explicitly granted.

  ## Compatibility

  Compatible with n8n@1.60.0 or later

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [iTop REST/JSON API documentation](https://www.itophub.io/wiki/page?id=latest:advancedtopics:rest_json)

ai_documentation_summary:
  {"purpose":"Allows n8n workflows to interact with iTop CMDB through its REST API for retrieving and updating objects.","capabilities":["Search and retrieve iTop objects using OQL queries","Retrieve iTop objects using object IDs","Update single iTop objects with new field values"],"authentication":"Username and Password or Token-based authentication","commonUseCases":["Automating CMDB data retrieval in n8n workflows","Synchronizing IT asset information between systems","Updating CMDB records based on workflow triggers"],"limitations":["Standard administrator accounts do not have REST access by default; explicit REST Services User profile is required","Requires specific permissions: REST Services User profile, write access on target classes, and bulk write permissions","Compatible only with n8n version 1.60.0 or later"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


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

updated_at: 2026-07-14 14:40:33
author_name: wix-ci
author_github_url: https://github.com/wix-incubator/n8n-nodes-wix.git
npm_package_name: @wix/n8n-nodes-wix
npm_version: 1.0.4
community_fetched_at: 2026-07-14T14:40:33.453Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "order",
      "options": [
        {
          "name": "Order",
          "value": "order"
        },
        {
          "name": "Product",
          "value": "product"
        }
      ],
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Cancel",
          "value": "cancel",
          "action": "Cancel an order",
          "routing": {
            "request": {
              "url": "=/ecom/v1/orders/{{$parameter.orderId}}/cancel",
              "method": "POST"
            }
          },
          "description": "Cancel an existing order"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create an order",
          "routing": {
            "request": {
              "url": "/ecom/v1/orders",
              "method": "POST"
            }
          },
          "description": "Create a new order"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an order",
          "routing": {
            "request": {
              "url": "=/ecom/v1/orders/{{$parameter.orderId}}",
              "method": "GET"
            }
          },
          "description": "Get a single order by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many orders",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/ecom/v1/orders/search",
              "method": "POST"
            }
          },
          "description": "Query and list orders"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an order",
          "routing": {
            "request": {
              "url": "=/ecom/v1/orders/{{$parameter.orderId}}",
              "method": "PATCH"
            }
          },
          "description": "Update an existing order"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "order"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a product",
          "routing": {
            "request": {
              "url": "/stores/v3/products-with-inventory",
              "method": "POST"
            }
          },
          "description": "Create a new product with inventory"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a product",
          "routing": {
            "request": {
              "url": "=/stores/v3/products/{{$parameter.productId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete an existing product"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a product",
          "routing": {
            "request": {
              "url": "=/stores/v3/products/{{$parameter.productId}}",
              "method": "GET"
            }
          },
          "description": "Get a single product by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many products",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/stores/v3/products/search",
              "method": "POST"
            }
          },
          "description": "Query and list products"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a product",
          "routing": {
            "request": {
              "url": "=/stores/v3/products-with-inventory/{{$parameter.productId}}",
              "method": "PATCH"
            }
          },
          "description": "Update an existing product with inventory"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "product"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Cancel",
      "value": "cancel",
      "action": "Cancel an order",
      "routing": {
        "request": {
          "url": "=/ecom/v1/orders/{{$parameter.orderId}}/cancel",
          "method": "POST"
        }
      },
      "description": "Cancel an existing order",
      "resource": "order"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an order",
      "routing": {
        "request": {
          "url": "/ecom/v1/orders",
          "method": "POST"
        }
      },
      "description": "Create a new order",
      "resource": "order"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an order",
      "routing": {
        "request": {
          "url": "=/ecom/v1/orders/{{$parameter.orderId}}",
          "method": "GET"
        }
      },
      "description": "Get a single order by ID",
      "resource": "order"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many orders",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/ecom/v1/orders/search",
          "method": "POST"
        }
      },
      "description": "Query and list orders",
      "resource": "order"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an order",
      "routing": {
        "request": {
          "url": "=/ecom/v1/orders/{{$parameter.orderId}}",
          "method": "PATCH"
        }
      },
      "description": "Update an existing order",
      "resource": "order"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a product",
      "routing": {
        "request": {
          "url": "/stores/v3/products-with-inventory",
          "method": "POST"
        }
      },
      "description": "Create a new product with inventory",
      "resource": "product"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a product",
      "routing": {
        "request": {
          "url": "=/stores/v3/products/{{$parameter.productId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete an existing product",
      "resource": "product"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a product",
      "routing": {
        "request": {
          "url": "=/stores/v3/products/{{$parameter.productId}}",
          "method": "GET"
        }
      },
      "description": "Get a single product by ID",
      "resource": "product"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many products",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/stores/v3/products/search",
          "method": "POST"
        }
      },
      "description": "Query and list products",
      "resource": "product"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a product",
      "routing": {
        "request": {
          "url": "=/stores/v3/products-with-inventory/{{$parameter.productId}}",
          "method": "PATCH"
        }
      },
      "description": "Update an existing product with inventory",
      "resource": "product"
    }
  ]

npm_readme:
  # @wix/n8n-nodes-wix

  This is an n8n community node that lets you use **Wix** in your n8n workflows.

  [Wix](https://www.wix.com/) is a leading cloud-based website development platform that enables users to create professional websites, online stores, bookings, and more. This node allows you to automate workflows by integrating with Wix's eCommerce, CRM, and other services.

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

  - [Installation](#installation)
  - [Operations](#operations)
  - [Triggers](#triggers)
  - [Credentials](#credentials)
  - [Resources](#resources)

  ## Installation

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

  ## Operations

  This node provides actions for managing Products and Orders in your Wix store.

  ### Product

  | Operation | Description |
  |-----------|-------------|
  | **Create** | Create a new product with inventory |
  | **Delete** | Delete an existing product |
  | **Get** | Get a single product by ID |
  | **Get Many** | Query and list products |
  | **Update** | Update an existing product with inventory |

  > **Note**: Product operations use **Catalog V3** and are not compatible with Catalog V1 sites.

  📚 [Wix Stores Products API Documentation](https://dev.wix.com/docs/rest/business-solutions/stores/catalog/products/introduction)

  ### Order

  | Operation | Description |
  |-----------|-------------|
  | **Cancel** | Cancel an existing order |
  | **Create** | Create a new order |
  | **Get** | Get a single order by ID |
  | **Get Many** | Query and list orders |
  | **Update** | Update an existing order |

  📚 [Wix eCommerce Orders API Documentation](https://dev.wix.com/docs/rest/business-solutions/e-commerce/orders/order-object)

  ## Triggers

  The **Wix Trigger** node allows you to start workflows based on events happening in your Wix site. Triggers are powered by [Wix Automations](https://dev.wix.com/docs/rest/business-management/automations/automations/introduction).

  ### Available Triggers

  <details>
  <summary><strong>Back in Stock</strong></summary>

  - Back in stock request created
  - Product back in stock

  </details>

  <details>
  <summary><strong>Bookings</strong></summary>

  - Appointment request approved
  - Appointment request declined
  - Appointment requested
  - Appointment or class updated
  - Booking canceled
  - Client checks in
  - Client checked in X times
  - Client marked as "no-show"
  - Course updated
  - Failed to apply booking fee
  - Failed to collect applied booking fees
  - No sessions left
  - Session booked
  - Session double-booked
  - Session ends
  - Session starts

  </details>

  <details>
  <summary><strong>Blog</strong></summary>

  - Blog post liked
  - Blog post new comment
  - New blog post published

  </details>

  <details>
  <summary><strong>Chat & Inbox</strong></summary>

  - Chat message received
  - Chat message sent
  - Message received (Wix Chat or Inbox preset email)
  - Pre-chat form submitted
  - Visitor on site

  </details>

  <details>
  <summary><strong>CMS</strong></summary>

  - CMS form submitted

  </details>

  <details>
  <summary><strong>Contacts & Segments</strong></summary>

  - Contact Assigned
  - Contact enters segment
  - Contact leaves segment
  - Label added to contact
  - Label removed from contact
  - New contact created

  </details>

  <details>
  <summary><strong>Donations</strong></summary>

  - Donation is made
  - Recurring donation is canceled
  - Recurring donation is charged

  </details>

  <details>
  <summary><strong>Events & Tickets</strong></summary>

  - Daily report
  - Daily RSVP report
  - Event canceled
  - Event ends
  - Event published
  - Event reminder date has arrived
  - Event starts
  - Guest checked in
  - Guest registers to waitlist
  - Guest RSVPd NO email
  - Guest RSVPd YES email
  - Guest RSVPs
  - New spot opened for waitlist guests
  - Order confirmed but ticket couldn't be generated
  - Order placed
  - RSVP confirmed
  - Ticket order email
  - Ticket ordered
  - Ticket sale ended
  - Ticket sale started

  </details>

  <details>
  <summary><strong>File Share</strong></summary>

  - Folder access given
  - Folder access requested

  </details>

  <details>
  <summary><strong>Forms</strong></summary>

  - Form submitted

  </details>

  <details>
  <summary><strong>Forum</strong></summary>

  - Forum comment deleted
  - Forum comment published
  - Forum post published
  - Reacted to Forum comment
  - Reacted to Forum post
  - Removed reaction from Forum comment
  - Removed reaction from Forum post

  </details>

  <details>
  <summary><strong>Groups</strong></summary>

  - Group create request declined
  - Group has new member generic update
  - Group Updated
  - Member comments on a post
  - Member creates a post
  - Member invited to group
  - Member joins a group
  - Member leaves a group
  - Member mentioned someone
  - Member mentions someone
  - Member pays for a group
  - Member reacts to a comment
  - Member reacts to a post
  - Member removed as payment plan expired
  - Member request to join a group approved
  - Member request to join a group declined
  - Member requests to create a group
  - Member requests to join a group
  - Member role updated
  - Members create posts
  - Members join a group
  - New group created
  - Person invited to group
  - Reminder to create group
  - Reminder to invite members
  - Someone you follow creates a post
  - Weekly Digest

  </details>

  <details>
  <summary><strong>Invoices</strong></summary>

  - Invoice overdue
  - Invoice paid
  - Invoice payment received
  - Invoice sent

  </details>

  <details>
  <summary><strong>Loyalty Program</strong></summary>

  - Customer earns points
  - Customer enters tier
  - Customer has enough points for rewards
  - Points balance adjusted manually
  - Points expire in 14 days
  - Social media profile followed

  </details>

  <details>
  <summary><strong>Members</strong></summary>

  - Member approved
  - Member blocked
  - Member deleted
  - Member email confirmation required
  - Member logs in
  - Set contact as member
  - Site member asks to reset password
  - Visitor signs up to your site

  </details>

  <details>
  <summary><strong>Online Programs</strong></summary>

  - Certificate available to download
  - Member invited to join a program
  - Member joins a program
  - Member pays for a program
  - Member's join request approved
  - Member's join request declined
  - Offline payment declined
  - Offline program payment received
  - Participant access denied
  - Participant completes a program
  - Participant completes a step
  - Participant data exported
  - Participant leaves a program
  - Participant manually added to program
  - Payment failed
  - Program end date has passed
  - Program ended without all steps completed
  - Program join request received
  - Reminder to complete scheduled steps
  - Visitor access denied

  </details>

  <details>
  <summary><strong>Pay Links</strong></summary>

  - Payment received
  - Send a pay link

  </details>

  <details>
  <summary><strong>Portfolio</strong></summary>

  - New project created

  </details>

  <details>
  <summary><strong>Price Quotes</strong></summary>

  - Price quote accepted
  - Price quote expired
  - Price quote sent

  </details>

  <details>
  <summary><strong>Pricing Plans</strong></summary>

  - Plan canceled
  - Plan ordered

  </details>

  <details>
  <summary><strong>Proposals</strong></summary>

  - Proposal accepted
  - Proposal sent

  </details>

  <details>
  <summary><strong>Recurring Invoices</strong></summary>

  - Recurring payment canceled
  - Recurring payment starts

  </details>

  <details>
  <summary><strong>Restaurants</strong></summary>

  - Delivery order ready
  - Future order due by
  - Order accepted
  - Order canceled
  - Order created
  - Order edited
  - Order fulfilled
  - Order out for Delivery
  - Pickup order ready
  - Restaurant order placed

  </details>

  <details>
  <summary><strong>Reviews</strong></summary>

  - Review created
  - Review deleted
  - Review moderation status changed
  - Review request created

  </details>

  <details>
  <summary><strong>Stores (eCommerce)</strong></summary>

  - Checkout abandoned
  - Credit card is charged
  - Order placed
  - Payment Added to Order
  - Store order placed

  </details>

  <details>
  <summary><strong>Subscriptions</strong></summary>

  - Customer's payment method updated
  - Payment fails - grace period starts
  - Payment successful - grace period ends
  - Subscription's billing date updated
  - Subscription's item price updated

  </details>

  <details>
  <summary><strong>Table Reservations</strong></summary>

  - Table reservation added manually
  - Table reservation canceled
  - Table reservation starts
  - Table reservation time updated
  - Table reserved by guest

  </details>

  <details>
  <summary><strong>Tasks</strong></summary>

  - Task overdue

  </details>

  <details>
  <summary><strong>Workflows</strong></summary>

  - Card added or moved

  </details>

  📚 [Wix Automations API Documentation](https://dev.wix.com/docs/rest/business-management/automations/automations/introduction)

  ## Credentials

  To use this node, you need to set up Wix API credentials:

  ### Prerequisites

  1. A [Wix](https://www.wix.com/) account with a published website

  ### Setup

  1. Go to the [API Keys Manager](https://manage.wix.com/account/api-keys) to create a new API key
  2. Assign the appropriate permissions for the APIs you want to access
  3. Copy your API key and store it securely
  4. Get your **Site ID** from your site's dashboard URL (it appears after `/dashboard/` in the URL)
  5. In n8n, create new credentials for **Wix API** and enter:
     - **API Key**: Your Wix API key
     - **Site ID**: Your Wix site ID

  > **Important**: Store your API keys securely and use them only in server-side code.

  📚 [How to Generate an API Key](https://dev.wix.com/docs/go-headless/develop-your-project/admin-operations/generate-an-api-key)

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Wix REST API Documentation](https://dev.wix.com/docs/api-reference)
  - [Wix Developer Center](https://dev.wix.com/)
  - [Wix Stores API](https://dev.wix.com/docs/rest/business-solutions/stores/catalog/products/introduction)
  - [Wix eCommerce Orders API](https://dev.wix.com/docs/rest/business-solutions/e-commerce/orders/order-object)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables automation by interacting with Wix's eCommerce, CRM, and other services through its API.","capabilities":["Create products with inventory","Delete products","Get single product by ID","List all products","Update product inventory","Cancel orders","Create orders","Get single order by ID","List all orders","Update orders"],"authentication":"API key required","commonUseCases":["Automate product inventory management","Process and track customer orders","React to Wix form submissions","Monitor booking and appointment changes","Sync customer data between Wix and other systems"],"limitations":["Product operations require Catalog V3 and are not compatible with Catalog V1 sites"],"relatedNodes":["Wix Trigger","Wix Order","Wix Product"]}


node_type: n8n-nodes-opnform.opnformTrigger
package_name: n8n-nodes-opnform
display_name: OpnForm Trigger
description: Triggers when a new submission is created in OpnForm
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: jhumanj
author_github_url: https://github.com/OpnForm/
npm_package_name: n8n-nodes-opnform
npm_version: 0.1.7
community_fetched_at: 2026-07-14T14:40:33.454Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # OpnForm n8n Trigger (Community Node)

  A custom n8n node that triggers workflows when new form submissions are received in OpnForm.

  ## What is OpnForm?

  OpnForm is an open-source form builder that allows you to create and manage forms, collect submissions, and integrate with various tools. This n8n integration enables you to automate workflows based on form submissions.

  **API Documentation**: [https://docs.opnform.com/api-reference/introduction](https://docs.opnform.com/api-reference/introduction)

  ## What this integration does

  This n8n trigger node automatically receives OpnForm submissions as webhook events in your n8n workflows. When a form is submitted in OpnForm, the integration sends the submission data to your n8n workflow, allowing you to:

  - Process form submissions automatically
  - Integrate with other services and tools
  - Transform and route submission data
  - Trigger complex multi-step workflows

  ## API Endpoints Used

  This integration uses the following OpnForm API endpoints:

  - `GET /open/workspaces` - Lists available workspaces for dropdown selection
  - `GET /open/workspaces/{workspaceId}/forms` - Lists forms in a workspace for dropdown selection
  - `GET /open/forms/{formId}/integrations` - Checks if an integration already exists
  - `POST /open/forms/{formId}/integrations` - Creates a webhook integration subscription
  - `DELETE /open/forms/{formId}/integrations/{integrationId}` - Removes the webhook integration

  ## Install (local development)

  ```bash
  # From this directory
  npm install
  npm run build
  ```

  Then in your n8n instance, install this package or load it as a local custom node per n8n docs.

  ## Release your node

  To publish your node to npm, run the `release` command in your project directory:

  ```bash
  n8n-node release
  ```

  Or using npm:

  ```bash
  npm run release
  ```

  Before running the release command, you must be logged into npm:

  ```bash
  npm login
  ```

  When you run the `release` command, `n8n-node` will perform the following actions:

  - Build the node
  - Run lint checks against your files
  - Update the changelog
  - Create git tags
  - Create a GitHub release
  - Publish the package to npm

  For more details, see the [n8n-node release documentation](https://docs.n8n.io/integrations/creating-nodes/build/n8n-node/#release-your-node).

  ## Authentication

  ### Creating a Personal Access Token

  To use this integration, you need a Personal Access Token from OpnForm with the `manage-integrations` ability.

  1. Sign in to your OpnForm account at [https://opnform.com](https://opnform.com)
  2. Navigate to **Settings → Access Tokens** (`/home?user-settings=access-tokens`)
  3. Click **Create new token**
  4. Enter a descriptive name (e.g., "n8n Integration")
  5. Select the `manage-integrations` ability (and any other abilities you need)
  6. Click **Create** and **copy the token immediately** - you won't be able to see it again

  For detailed instructions, see the [OpnForm API Keys documentation](https://docs.opnform.com/api-reference/api-keys).

  ### Required Abilities

  | Ability               | Required For                                              |
  | --------------------- | --------------------------------------------------------- |
  | `manage-integrations` | **Required** - Creating and managing webhook integrations |
  | `workspaces-read`     | **Required** - Listing workspaces for dropdown selection  |
  | `forms-read`          | **Required** - Listing forms for dropdown selection       |

  ### Configuring Credentials in n8n

  1. In your n8n workflow, add the OpnForm Trigger node
  2. Click on **Credentials** and select **Create New**
  3. Enter:
     - **Name**: `OpnForm API` (or any descriptive name)
     - **Base URL**: `https://api.opnform.com` (or your self-hosted OpnForm instance URL)
     - **API Key**: Your Personal Access Token
  4. Click **Save** and select this credential in the OpnForm Trigger node

  ## Usage Instructions

  ### Setting Up the Trigger

  1. **Add the OpnForm Trigger node** to your n8n workflow
  2. **Select your credentials** (or create new ones as described above)
  3. **Choose a Workspace** from the dropdown menu
  4. **Choose a Form** from the dropdown menu (forms will load after selecting a workspace)
  5. **Activate the workflow** - The node will automatically:
     - Create a webhook integration in OpnForm
     - Configure the webhook URL to receive submissions
     - Start listening for new form submissions

  ### Workflow Activation

  When you activate your n8n workflow:

  - The OpnForm Trigger node will create a webhook integration subscription
  - OpnForm will send a POST request to your n8n webhook URL whenever the form receives a submission
  - The submission data will be available in subsequent workflow nodes

  ### Workflow Deactivation

  When you deactivate your n8n workflow:

  - The OpnForm Trigger node will automatically delete the webhook integration
  - No further submissions will be sent to your workflow

  ## Example Workflows

  ### Example 1: Send Form Submission to Slack

  ```
  OpnForm Trigger → Set Node (format message) → Slack Node (send message)
  ```

  **Workflow Steps:**

  1. **OpnForm Trigger** - Receives form submission
  2. **Set Node** - Format the submission data into a Slack-friendly message:
     ```json
     {
     	"text": "New form submission received!",
     	"fields": [
     		{
     			"title": "From",
     			"value": "{{ $json.submitter_email }}",
     			"short": true
     		},
     		{
     			"title": "Submission ID",
     			"value": "{{ $json.id }}",
     			"short": true
     		}
     	]
     }
     ```
  3. **Slack Node** - Send the formatted message to a Slack channel

  ### Example 2: Save Submissions to Google Sheets

  ```
  OpnForm Trigger → Transform Data → Google Sheets Node (append row)
  ```

  **Workflow Steps:**

  1. **OpnForm Trigger** - Receives form submission
  2. **Code Node** - Transform submission data to match your Google Sheets columns:
     ```javascript
     const submission = $input.item.json;
     return {
     	json: {
     		timestamp: submission.created_at,
     		email: submission.data.email || '',
     		name: submission.data.name || '',
     		message: submission.data.message || '',
     	},
     };
     ```
  3. **Google Sheets Node** - Append the transformed data as a new row

  ### Example 3: Conditional Email Notifications

  ```
  OpnForm Trigger → IF Node (check condition) → Email Node (send notification)
  ```

  **Workflow Steps:**

  1. **OpnForm Trigger** - Receives form submission
  2. **IF Node** - Check if submission meets certain criteria (e.g., `{{ $json.data.urgency }} === 'high'`)
  3. **Email Node** - Send an email notification only for high-priority submissions

  ## How it works

  1. **Load Options**: When configuring the node, it fetches Workspaces and Forms via `/open/workspaces` and `/open/workspaces/{workspaceId}/forms` to populate dropdown menus.
  2. **On Enable**: The node subscribes by creating a form integration with `integration_id: 'n8n'` and your n8n webhook URL via `POST /open/forms/{formId}/integrations`.
  3. **On Disable**: The node automatically deletes the created integration via `DELETE /open/forms/{formId}/integrations/{integrationId}`.
  4. **Webhook Receipt**: When a form submission occurs, OpnForm sends the submission data to your n8n webhook URL, and the payload is forwarded as JSON to the workflow.

  ## License

  Licensed under the MIT License. See [LICENSE](./LICENSE) for details.

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows automatically when new form submissions are received in an OpnForm instance by creating and managing webhook integrations.","capabilities":["Receive real-time form submission data via webhooks","Automatically process form submissions","Integrate with other services and tools","Transform and route submission data","Trigger complex multi-step workflows","Create webhook integration subscriptions","Delete webhook integration subscriptions when workflow is deactivated","List available workspaces and forms for configuration"],"authentication":"Personal Access Token (API Key) with specific abilities required","commonUseCases":["Send form submission data to Slack or other messaging platforms","Save form submissions to Google Sheets or databases","Automate follow-up emails based on form responses","Route submissions to different internal systems based on form fields","Create automated reports from form data"],"limitations":["Requires OpnForm Personal Access Token with 'manage-integrations', 'workspaces-read', and 'forms-read' abilities","Webhook integration is created/destroyed based on workflow activation state","Requires OpnForm instance access (self-hosted or cloud)","Community node status (may not be officially maintained)"],"relatedNodes":["OpnForm Form","OpnForm Form Fields","OpnForm Form Actions","OpnForm Form Templates","OpnForm Form Submissions"]}


node_type: @sendpulse/n8n-nodes-sendpulse.sendPulseA360
package_name: @sendpulse/n8n-nodes-sendpulse
display_name: SendPulse Automation360
description: Interact with SendPulse API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: sendpulse.com
author_github_url: https://github.com/sendpulse/n8n-nodes-sendpulse.git
npm_package_name: @sendpulse/n8n-nodes-sendpulse
npm_version: 0.0.3
community_fetched_at: 2026-07-14T14:40:33.455Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "flow",
      "options": [
        {
          "name": "Flow",
          "value": "flow"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many automation flows",
          "routing": {
            "request": {
              "qs": {
                "limit": "={{ $parameter.additionalFields.limit }}",
                "offset": "={{ $parameter.additionalFields.offset }}"
              },
              "url": "=/autoresponders/list",
              "method": "GET"
            }
          },
          "description": "Get a list of automation flows"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a automation flow",
          "routing": {
            "request": {
              "url": "=/autoresponders/{{ $parameter.flowId }}",
              "method": "GET"
            }
          },
          "description": "Get a automation flow by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "flow"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many automation flows",
      "routing": {
        "request": {
          "qs": {
            "limit": "={{ $parameter.additionalFields.limit }}",
            "offset": "={{ $parameter.additionalFields.offset }}"
          },
          "url": "=/autoresponders/list",
          "method": "GET"
        }
      },
      "description": "Get a list of automation flows",
      "resource": "flow"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a automation flow",
      "routing": {
        "request": {
          "url": "=/autoresponders/{{ $parameter.flowId }}",
          "method": "GET"
        }
      },
      "description": "Get a automation flow by ID",
      "resource": "flow"
    }
  ]

npm_readme:
  # 🚀 n8n-nodes-sendpulse

  ![SendPulse Logo](icons/sendpulse.svg)

  Official [SendPulse](https://sendpulse.com) integration for [n8n](https://n8n.io).

  SendPulse is an all-in-one multichannel marketing and communication platform.
  It combines email campaigns, SMS, web push, and chatbots with CRM, automation flows, and transactional messaging.
  Using the n8n integration, teams can sync customer data, trigger personalized journeys from any app, and centralize product and growth experiments in one flexible workflow.

  This repo contains SendPulse Automation360, SendPulse Chatbots, SendPulse CRM, SendPulse Email, SendPulse FileManager,
  SendPulse Pop-ups, SendPulse SMS, SendPulse SMTP, SendPulse Verifier and SendPulse Web Push community nodes for n8n.

  These nodes currently only supports the most popular SendPulse APIs.
  If there's an API missing that you would like to use, please let us know.
  In the meantime, you can also use the generic [HTTP Request](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/) node to construct your requests.

  ## 📚 Table of Contents

  * [Installation](#installation)
  * [Credentials](#credentials)
  * [Usage](#usage)
  * [Operations](#operations)
  * [Workflow Examples](#workflow-examples)
  * [Compatibility](#compatibility)
  * [Resources](#resources)
  * [License](#license)

  ## 📦 Installation

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

  ## 🔐 Credentials

  ### Client ID & Client Secret

  1. Log in to your **[SendPulse account](https://sendpulse.com)**
  2. Navigate to **Account settings > API**
  3. Copy your **Client ID**
  4. Copy your **Client Secret**

  ### Access Token

  The authorization process requires an access token for signing each further API request.

  The necessary parameters to obtain an access token can be found in the private account settings page found on the following URL in the [API tab](https://login.sendpulse.com/settings/#api).

  To get an access token you have to send a POST request to:

  ```
  https://api.sendpulse.com/oauth/access_token
  ```

  Request parameters:

  | Parameter     | Type   | Description                             |
  |---------------|--------|-----------------------------------------|
  | grant_type    | string | Has to be equal to `client_credentials` |
  | client_id     | string | Your ID                                 |
  | client_secret | string | Your Secret                             |

  ## 🧩 Usage

  Add any SendPulse node to a workflow:

  ![Add SendPulse to Workflow](images/node.png)

  Configure a basic query and hit "Execute step" to execute the query:

  ![Test a Google Search through SerpApi](images/mailing-list-operation.png)

  ## 🛠️ Operations

  All operations are documented in the [SendPulse REST API Documentation](https://sendpulse.com/integrations/api).

  ### 🔄 SendPulse Automation360 Node

  | Resource | Operation                                                        |
  |----------|------------------------------------------------------------------|
  | Flow     | [Get Many](https://sendpulse.com/integrations/api/a360#get-flows) |
  | Flow     | [Get](https://sendpulse.com/integrations/api/a360#get-info-flow)  |

  ### 🤖 SendPulse Chatbots Node

  | Resource | Operation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
  |----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  | Bot      | [Get Many](https://sendpulse.com/integrations/api/chatbot#/bots/get_bots)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
  | Dialog   | [Get Many](https://sendpulse.com/integrations/api/chatbot#/dialogs/get_dialogs)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
  | Contact  | Get ([Telegram](https://sendpulse.com/integrations/api/chatbot/telegram#/contacts/get_contacts_get), [Facebook Messenger](https://sendpulse.com/integrations/api/chatbot/facebook#/contacts/get_contacts_get), [WhatsApp](https://sendpulse.com/integrations/api/chatbot/whatsapp#/contacts/get_contacts_get), [LiveChat](https://sendpulse.com/integrations/api/chatbot/live-chat#/contacts/get_contacts_get), [Instagram](https://sendpulse.com/integrations/api/chatbot/instagram#/contacts/get_contacts_get), [Viber](https://sendpulse.com/integrations/api/chatbot/viber#/contacts/get_contacts_get), [TikTok](https://sendpulse.com/integrations/api/chatbot/tiktok#/contacts/get_contacts_get))                        |
  | Contact  | Send Message ([Telegram](https://sendpulse.com/integrations/api/chatbot/telegram#/contacts/post_contacts_send), [Facebook Messenger](https://sendpulse.com/integrations/api/chatbot/facebook#/contacts/post_contacts_send), [WhatsApp](https://sendpulse.com/integrations/api/chatbot/whatsapp#/contacts/post_contacts_send), [LiveChat](https://sendpulse.com/integrations/api/chatbot/live-chat#/contacts/post_contacts_send), [Instagram](https://sendpulse.com/integrations/api/chatbot/instagram#/contacts/post_contacts_send), [Viber](https://sendpulse.com/integrations/api/chatbot/viber#/contacts/post_contacts_send), [TikTok](https://sendpulse.com/integrations/api/chatbot/tiktok#/contacts/post_contacts_send)) |
  | Flow     | Run ([Telegram](https://sendpulse.com/integrations/api/chatbot/telegram#/flows/post_flows_run), [Facebook Messenger](https://sendpulse.com/integrations/api/chatbot/facebook#/flows/post_flows_run), [WhatsApp](https://sendpulse.com/integrations/api/chatbot/whatsapp#/flows/post_flows_run), [LiveChat](https://sendpulse.com/integrations/api/chatbot/live-chat#/flows/post_flows_run), [Instagram](https://sendpulse.com/integrations/api/chatbot/instagram#/flows/post_flows_run), [Viber](https://sendpulse.com/integrations/api/chatbot/viber#/flows/post_flows_run), [TikTok](https://sendpulse.com/integrations/api/chatbot/tiktok#/flows/post_flows_run))                                                           |

  ### 📇 SendPulse CRM Node

  | Resource | Operation                                                                                                           |
  |----------|---------------------------------------------------------------------------------------------------------------------|
  | Contact  | [Get Many](https://sendpulse.com/integrations/api/crm#/Contacts/post_contacts_get_list)                              |
  | Contact  | [Get](https://sendpulse.com/integrations/api/crm#/Contacts/get_contacts__contactId_)                                 |
  | Contact  | [Get by External ID](https://sendpulse.com/integrations/api/crm#/Contacts/get_contacts_external__externalContactId_) |
  | Contact  | [Create](https://sendpulse.com/integrations/api/crm#/Contacts/post_contacts_create)                                  |
  | Deal     | [Get Many](https://sendpulse.com/integrations/api/crm#/Deals/post_deals_get_list)                                    |
  | Deal     | [Get](https://sendpulse.com/integrations/api/crm#/Deals/get_deals__dealId_)                                          |
  | Deal     | [Create](https://sendpulse.com/integrations/api/crm#/Deals/post_deals)                                               |
  | Pipeline | [Get Many](https://sendpulse.com/integrations/api/crm#/Pipelines/get_pipelines)                                      |
  | Pipeline | [Get](https://sendpulse.com/integrations/api/crm#/Pipelines/get_pipelines__pipelineId_)                              |
  | Pipeline | [Create](https://sendpulse.com/integrations/api/crm#/Pipelines/post_pipelines)                                       |

  ### ✉️ SendPulse Email Node

  | Resource     | Operation                                                                                                                                                                   |
  |--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  | Mailing List | [Get Many](https://sendpulse.com/integrations/api/bulk-email#lists-list)                                                                                                     |
  | Mailing List | [Get](https://sendpulse.com/integrations/api/bulk-email#list-info)                                                                                                           |
  | Mailing List | [Create](https://sendpulse.com/integrations/api/bulk-email#create-list)                                                                                                      |
  | Email        | Add to List ([single-opt-in](https://sendpulse.com/integrations/api/bulk-email#add-email), [double-opt-in)](https://sendpulse.com/integrations/api/bulk-email#double-opt-in)) |
  | Campaign | [Get Many](https://sendpulse.com/integrations/api/bulk-email#campaigns-list)                                                                                                     |
  | Campaign | [Get](https://sendpulse.com/integrations/api/bulk-email#campaign-info)                                                                                                           |
  | Campaign | [Create](https://sendpulse.com/integrations/api/bulk-email#create-campaign)                                                                                                      |

  ### 📁 SendPulse FileManager Node

  | Resource | Operation                                                                    |
  |----------|------------------------------------------------------------------------------|
  | File     | [Upload](https://sendpulse.com/integrations/api/file-manager#/File/post_file) |


  ### 🪄 SendPulse Pop-ups Node

  | Resource | Operation                                                                                              |
  |----------|--------------------------------------------------------------------------------------------------------|
  | Project  | [Get Many](https://sendpulse.com/integrations/api/pop-up#/Project/get_public_api_widgets_list)          |
  | Pop-Up   | [Get Many](https://sendpulse.com/integrations/api/pop-up#/Popup/get_public_api_popups_list__projectId_) |

  ### 📱 SendPulse SMS Node

  | Resource     | Operation                                                                                 |
  |--------------|-------------------------------------------------------------------------------------------|
  | Phone Number | [Add to Mailing List](https://sendpulse.com/integrations/api/bulk-sms#add-telephone)       |
  | Campaign     | [Create](https://sendpulse.com/integrations/api/bulk-sms#create-campaign-for-mailing-list) |

  ### 📨 SendPulse SMTP Node

  | Resource | Operation                                                                   |
  | -------- |-----------------------------------------------------------------------------|
  | Email    | [Get Many](https://sendpulse.com/integrations/api/smtp#get-emails-list-smtp) |
  | Email    | [Get](https://sendpulse.com/integrations/api/smtp#email-info-smtp)           |
  | Email    | [Send](https://sendpulse.com/integrations/api/smtp#send-email-smtp)          |

  ### ✔️ SendPulse Verifier Node

  | Resource     | Operation                                                                                 |
  | ------------ |-------------------------------------------------------------------------------------------|
  | Mailing List | [Verify](https://sendpulse.com/integrations/api/verifier#verify-mailing-list)              |
  | Mailing List | [Get Verified Lists](https://sendpulse.com/integrations/api/verifier#get-verified-lists)   |
  | Mailing List | [Get Verification Results](https://sendpulse.com/integrations/api/verifier#get-results-ml) |

  ### 🔔 SendPulse Web Push Node

  | Resource | Operation                                                                    |
  | -------- |------------------------------------------------------------------------------|
  | Website  | [Get Many](https://sendpulse.com/integrations/api/web-push#get-websites-list) |
  | Website  | [Get](https://sendpulse.com/integrations/api/web-push#site_info)              |
  | Campaign | [Create](https://sendpulse.com/integrations/api/web-push#create-push)         |

  ## 🧪 Workflow Examples

  #### Workflow 1: Create an email campaign

  ![Workflow 1](images/workflow1.png)

  **Steps:**
  1. Get mailing lists
  2. Combine results into one variable
  3. Set sender's name, sender's email, subject, base64 encoded message content and mailing list ID
  4. Send a campaign

  <details>
  <summary>JSON</summary>

  ```json
  {
    "name": "Creating an email campaign",
    "nodes": [
      {
        "parameters": {},
        "type": "n8n-nodes-base.manualTrigger",
        "typeVersion": 1,
        "position": [
          0,
          0
        ],
        "id": "162576dc-89ec-4f80-902c-1a048995caa3",
        "name": "When clicking ‘Execute workflow’"
      },
      {
        "parameters": {
          "authentication": "accessToken",
          "resource": "campaign",
          "operation": "create",
          "senderName": "={{ $json.senderName }}",
          "senderEmail": "={{ $json.senderEmail }}",
          "subject": "={{ $json.subject }}",
          "htmlBody": "={{ $json.htmlBodyBase64 }}",
          "listIds": "={{ $json.mailingListId }}",
          "name": "=Black Friday",
          "additionalFields": {},
          "requestOptions": {}
        },
        "type": "CUSTOM.sendPulseEmail",
        "typeVersion": 1,
        "position": [
          832,
          0
        ],
        "id": "f0486554-11b2-4ef4-ac58-1e4c287f189b",
        "name": "Create email campaign"
      },
      {
        "parameters": {
          "assignments": {
            "assignments": [
              {
                "id": "3f41524f-412d-4a70-8871-a23c615786d6",
                "name": "senderName",
                "value": "<sender_name>",
                "type": "string"
              },
              {
                "id": "c86c494a-73cd-4ea2-b6eb-4d9190fea113",
                "name": "senderEmail",
                "value": "<sender_email>",
                "type": "string"
              },
              {
                "id": "f0b4bbee-1556-43b5-9da4-f3c1833ffb84",
                "name": "subject",
                "value": "<subject>",
                "type": "string"
              },
              {
                "id": "e0f6b188-867e-4e95-b638-b007151cf3da",
                "name": "htmlBodyBase64",
                "value": "<html_body_base_64>",
                "type": "string"
              },
              {
                "id": "82042391-f675-46be-af47-0bde90057de5",
                "name": "=mailingListId",
                "value": "=<mailing_list_id>",
                "type": "number"
              }
            ]
          },
          "options": {}
        },
        "type": "n8n-nodes-base.set",
        "typeVersion": 3.4,
        "position": [
          624,
          0
        ],
        "id": "1dffd9a3-fb32-40e1-aebd-f7346aa985f2",
        "name": "Workflow Configuration"
      },
      {
        "parameters": {
          "additionalFields": {},
          "requestOptions": {}
        },
        "type": "CUSTOM.sendPulseEmail",
        "typeVersion": 1,
        "position": [
          208,
          0
        ],
        "id": "0e1b317f-acaf-4852-bf7d-535aebbcaab3",
        "name": "Get many mailing lists"
      },
      {
        "parameters": {
          "aggregate": "aggregateAllItemData",
          "destinationFieldName": "mailingLists",
          "options": {}
        },
        "id": "7bd43960-7cae-420d-9146-130310dc0efb",
        "name": "Combine Items",
        "type": "n8n-nodes-base.aggregate",
        "typeVersion": 1,
        "position": [
          416,
          0
        ]
      }
    ],
    "pinData": {},
    "connections": {
      "When clicking ‘Execute workflow’": {
        "main": [
          [
            {
              "node": "Get many mailing lists",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Create email campaign": {
        "main": [
          []
        ]
      },
      "Workflow Configuration": {
        "main": [
          [
            {
              "node": "Create email campaign",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Get many mailing lists": {
        "main": [
          [
            {
              "node": "Combine Items",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Combine Items": {
        "main": [
          [
            {
              "node": "Workflow Configuration",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "active": false,
    "settings": {
      "executionOrder": "v1"
    },
    "versionId": "59ed90df-5927-4019-bfd2-5ce67858d0ee",
    "meta": {
      "templateCredsSetupCompleted": true,
      "instanceId": "791011c5d912fa3910b1b3f0a58e52e888701c971bd92f7e7fc8373a23481dcb"
    },
    "id": "JB4pgZqZbQmUT76u",
    "tags": []
  }
  ```
  </details> 

  ---

  #### Workflow 2: Verify a mailing list and get verification results

  ![Workflow 2](images/workflow2.png)

  **Steps:**
  1. Start with mailing list ID input
  2. Verify mailing list
  3. Wait 5 seconds
  4. Get mailing list verification results

  <details>
  <summary>JSON</summary>

  ```json
  {
    "name": "Verify a mailing list and get verification results",
    "nodes": [
      {
        "parameters": {},
        "type": "n8n-nodes-base.manualTrigger",
        "typeVersion": 1,
        "position": [
          -80,
          144
        ],
        "id": "e6f335fe-9185-4e2a-b15b-6aaeab5151d7",
        "name": "When clicking ‘Execute workflow’"
      },
      {
        "parameters": {
          "authentication": "accessToken",
          "operation": "verify",
          "mailingListId": "={{ $json.mailingListId }}",
          "requestOptions": {}
        },
        "type": "CUSTOM.sendPulseVerifier",
        "typeVersion": 1,
        "position": [
          336,
          144
        ],
        "id": "d646a9b4-d672-4098-b243-8a0a802e0b19",
        "name": "Verify a mailing list"
      },
      {
        "parameters": {},
        "type": "n8n-nodes-base.wait",
        "typeVersion": 1.1,
        "position": [
          960,
          128
        ],
        "id": "f08cd010-c410-4140-aa7d-996e95afac04",
        "name": "Wait",
        "webhookId": "d3afa9c8-b36f-45e3-8ef5-b956a98b79c5"
      },
      {
        "parameters": {
          "conditions": {
            "options": {
              "caseSensitive": true,
              "leftValue": "",
              "typeValidation": "strict",
              "version": 3
            },
            "conditions": [
              {
                "id": "a3932ac8-334e-4d13-88d1-bb7921cb5852",
                "leftValue": "={{ $json.status }}",
                "rightValue": 0,
                "operator": {
                  "type": "number",
                  "operation": "equals"
                }
              }
            ],
            "combinator": "and"
          },
          "options": {}
        },
        "type": "n8n-nodes-base.if",
        "typeVersion": 2.3,
        "position": [
          752,
          144
        ],
        "id": "49a7edbc-ffd7-4126-b3e4-8078a2a0886c",
        "name": "If"
      },
      {
        "parameters": {
          "authentication": "accessToken",
          "operation": "getVerificationResults",
          "mailingListId": "={{ $('Workflow Configuration').item.json.mailingListId }}",
          "additionalFields": {},
          "requestOptions": {}
        },
        "type": "CUSTOM.sendPulseVerifier",
        "typeVersion": 1,
        "position": [
          544,
          144
        ],
        "id": "1565c302-b889-4b1e-aebb-1541da25d966",
        "name": "Get mailing list verification results",
        "credentials": {
          "sendPulseApi": {
            "id": "SguuezBTI7kLeYfQ",
            "name": "SendPulse account"
          }
        }
      },
      {
        "parameters": {
          "assignments": {
            "assignments": [
              {
                "id": "3f41524f-412d-4a70-8871-a23c615786d6",
                "name": "mailingListId",
                "value": 498261,
                "type": "number"
              }
            ]
          },
          "options": {}
        },
        "type": "n8n-nodes-base.set",
        "typeVersion": 3.4,
        "position": [
          128,
          144
        ],
        "id": "c7aa188a-7c99-44c0-b666-fb5c9c4e4c92",
        "name": "Workflow Configuration"
      }
    ],
    "pinData": {},
    "connections": {
      "When clicking ‘Execute workflow’": {
        "main": [
          [
            {
              "node": "Workflow Configuration",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Wait": {
        "main": [
          [
            {
              "node": "Get mailing list verification results",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Verify a mailing list": {
        "main": [
          [
            {
              "node": "Get mailing list verification results",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Get mailing list verification results": {
        "main": [
          [
            {
              "node": "If",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "If": {
        "main": [
          [
            {
              "node": "Wait",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Workflow Configuration": {
        "main": [
          [
            {
              "node": "Verify a mailing list",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "active": false,
    "settings": {
      "executionOrder": "v1"
    },
    "versionId": "5f24f95a-2d59-4650-a899-c68663a47d85",
    "meta": {
      "templateCredsSetupCompleted": true,
      "instanceId": "791011c5d912fa3910b1b3f0a58e52e888701c971bd92f7e7fc8373a23481dcb"
    },
    "id": "S04LSCXtbAoNxzY3",
    "tags": []
  }
  ```
  </details> 

  ---

  #### Workflow 3: Create a deal

  ![Workflow 3](images/workflow3.png)

  **Steps:**
  1. Get pipelines
  2. Get contacts
  3. Set pipeline ID, step ID, deal name, contact ID, currency and price
  4. Create a deal

  <details>
  <summary>JSON</summary>

  ```json
  {
    "name": "Create a deal",
    "nodes": [
      {
        "parameters": {},
        "type": "n8n-nodes-base.manualTrigger",
        "typeVersion": 1,
        "position": [
          0,
          0
        ],
        "id": "20331738-50ec-47c4-892f-015a0eccc636",
        "name": "When clicking ‘Execute workflow’"
      },
      {
        "parameters": {
          "assignments": {
            "assignments": [
              {
                "id": "444749f2-d83c-4a93-bfed-ba587dc2d16a",
                "name": "pipelineId",
                "value": "={{ $('Get many pipelines').item.json.data[0].id }}",
                "type": "number"
              },
              {
                "id": "c8e19849-6952-4440-bcfe-587b4910d5f1",
                "name": "stepId",
                "value": "={{ $('Get many pipelines').item.json.data[0].steps[0].id }}",
                "type": "number"
              },
              {
                "id": "3f41524f-412d-4a70-8871-a23c615786d6",
                "name": "dealName",
                "value": "Purchase of Electronic Equipment",
                "type": "string"
              },
              {
                "id": "9612e468-854a-4fa6-8e63-9ccddc0a247d",
                "name": "contactId",
                "value": "={{ $json.data.list[0].id }}",
                "type": "number"
              },
              {
                "id": "8d89b9f5-517a-4a97-8f22-ec683387a26e",
                "name": "currency",
                "value": "EUR",
                "type": "string"
              },
              {
                "id": "3cdbfd58-33b3-4ca2-9689-5215ba6aff7f",
                "name": "price",
                "value": 5000,
                "type": "number"
              }
            ]
          },
          "options": {}
        },
        "type": "n8n-nodes-base.set",
        "typeVersion": 3.4,
        "position": [
          624,
          0
        ],
        "id": "21c95abb-3aa6-4dac-ae9f-0a05c3c62cf5",
        "name": "Workflow Configuration"
      },
      {
        "parameters": {
          "authentication": "accessToken",
          "resource": "deal",
          "operation": "create",
          "pipelineId": "={{ $json.pipelineId }}",
          "stepId": "={{ $json.stepId }}",
          "name": "={{ $json.dealName }}",
          "additionalFields": {
            "contactIds": [
              "={{ $json.contactId }}"
            ],
            "currency": "={{ $json.currency }}",
            "price": "={{ $json.price }}"
          },
          "requestOptions": {}
        },
        "type": "CUSTOM.sendPulseCrm",
        "typeVersion": 1,
        "position": [
          832,
          0
        ],
        "id": "68c9ba9b-515e-4294-b202-cdeada51551f",
        "name": "Create a deal",
        "credentials": {
          "sendPulseApi": {
            "id": "vgJTBLhnSy833qmE",
            "name": "SendPulse account"
          }
        }
      },
      {
        "parameters": {
          "authentication": "accessToken",
          "additionalFields": {},
          "requestOptions": {}
        },
        "type": "CUSTOM.sendPulseCrm",
        "typeVersion": 1,
        "position": [
          416,
          0
        ],
        "id": "c8f0757b-e21e-43f0-b025-10db61dc6841",
        "name": "Get many contacts",
        "credentials": {
          "sendPulseApi": {
            "id": "vgJTBLhnSy833qmE",
            "name": "SendPulse account"
          }
        }
      },
      {
        "parameters": {
          "authentication": "accessToken",
          "resource": "pipeline",
          "requestOptions": {}
        },
        "type": "CUSTOM.sendPulseCrm",
        "typeVersion": 1,
        "position": [
          208,
          0
        ],
        "id": "6ef77dd7-c0bb-47c1-9653-77f19b6a3950",
        "name": "Get many pipelines"
      }
    ],
    "pinData": {},
    "connections": {
      "When clicking ‘Execute workflow’": {
        "main": [
          [
            {
              "node": "Get many pipelines",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Workflow Configuration": {
        "main": [
          [
            {
              "node": "Create a deal",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Create a deal": {
        "main": [
          []
        ]
      },
      "Get many contacts": {
        "main": [
          [
            {
              "node": "Workflow Configuration",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Get many pipelines": {
        "main": [
          [
            {
              "node": "Get many contacts",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "active": false,
    "settings": {
      "executionOrder": "v1"
    },
    "versionId": "789d96b0-448e-4496-a469-f96951fca290",
    "meta": {
      "templateCredsSetupCompleted": true,
      "instanceId": "791011c5d912fa3910b1b3f0a58e52e888701c971bd92f7e7fc8373a23481dcb"
    },
    "id": "IQryYdrRhRkFQQf7",
    "tags": []
  }
  ```
  </details> 

  ## 🧬 Compatibility

  Tested with n8n version 1.123.4.

  ## 📖 Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [SendPulse Website](https://sendpulse.com)
  * [SendPulse REST API Documentation](https://sendpulse.com/integrations/api)
  * [SendPulse Knowledge Base](https://sendpulse.com/knowledge-base)
  * [SendPulse Community](https://community.sendpulse.com)
  * [SendPulse Blog](https://sendpulse.com/blog)

  ## 📄 License

  [MIT](LICENSE.md)

  Copyright © 2025 SendPulse

ai_documentation_summary:
  {"purpose":"The SendPulse Automation360 node enables interaction with the SendPulse API to manage marketing automation flows, including retrieving flow lists and individual flow details.","capabilities":["Retrieve multiple automation flows","Retrieve a single automation flow by ID","Integrate SendPulse CRM, Email, SMS, and Chatbot features via n8n workflows"],"authentication":"OAuth2 (Client ID and Client Secret required to obtain an access token)","commonUseCases":["Automating customer journey triggers from external apps","Syncing customer data between n8n and SendPulse CRM","Centralizing marketing experiments and growth tracking"],"limitations":["Only supports the most popular SendPulse APIs; some API endpoints may be missing","Missing API endpoints can be bypassed using the generic HTTP Request node"],"relatedNodes":["n8n-nodes-base.httprequest","SendPulse Email","SendPulse CRM","SendPulse SMS","SendPulse Chatbots"]}


node_type: n8n-nodes-chartmogul.chartmogul
package_name: n8n-nodes-chartmogul
display_name: ChartMogul
description: Interact with ChartMogul API
category: Community
development_style: declarative
version: 2
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: gef-chartmogul
author_github_url: https://github.com/chartmogul/
npm_package_name: n8n-nodes-chartmogul
npm_version: 3.0.1
community_fetched_at: 2026-07-14T14:40:33.456Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "account",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Activity",
          "value": "activities"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Customer",
          "value": "customer"
        },
        {
          "name": "Enrichment",
          "value": "enrichment"
        },
        {
          "name": "Event",
          "value": "event"
        },
        {
          "name": "Invoice",
          "value": "invoice"
        },
        {
          "name": "Line Item",
          "value": "line_item"
        },
        {
          "name": "Metric",
          "value": "metric"
        },
        {
          "name": "Note and Call Log",
          "value": "note"
        },
        {
          "name": "Opportunity",
          "value": "opportunity"
        },
        {
          "name": "Plan",
          "value": "plan"
        },
        {
          "name": "Plan Group",
          "value": "planGroup"
        },
        {
          "name": "Source",
          "value": "source"
        },
        {
          "name": "Subscription",
          "value": "subscription"
        },
        {
          "name": "Task",
          "value": "task"
        },
        {
          "name": "Transaction",
          "value": "transaction"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Account Details",
          "value": "get",
          "action": "Get account details",
          "routing": {
            "request": {
              "url": "/account",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create an Activities Export",
          "value": "create",
          "action": "Create an activities export",
          "routing": {
            "request": {
              "url": "/activities_export",
              "method": "POST"
            }
          }
        },
        {
          "name": "List Activities",
          "value": "list",
          "action": "List activities",
          "routing": {
            "request": {
              "qs": {
                "type": "={{$parameter.filterOptions?.type || undefined}}",
                "order": "={{$parameter.filterOptions?.order || undefined}}",
                "end-date": "={{$parameter.filterOptions?.endDate || undefined}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "start-date": "={{$parameter.filterOptions?.startDate || undefined}}"
              },
              "url": "/activities",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "type": "={{$parameter.filterOptions?.type || undefined}}",
                      "order": "={{$parameter.filterOptions?.order || undefined}}",
                      "cursor": "={{$response.body.cursor}}",
                      "end-date": "={{$parameter.filterOptions?.endDate || undefined}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "start-date": "={{$parameter.filterOptions?.startDate || undefined}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve an Activities Export",
          "value": "get",
          "action": "Retrieve an activities export",
          "routing": {
            "request": {
              "url": "=/activities_export/{{$parameter.id}}",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "activities"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create a Contact",
          "value": "create",
          "action": "Create a contact",
          "routing": {
            "request": {
              "url": "/contacts",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Contact",
          "value": "delete",
          "action": "Delete a contact",
          "routing": {
            "request": {
              "url": "=/contacts/{{$parameter.contact_uuid}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "List Contacts",
          "value": "list",
          "action": "List contacts",
          "routing": {
            "request": {
              "qs": {
                "email": "={{$parameter.filterOptions?.email || undefined}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}",
                "customer_external_id": "={{$parameter.filterOptions?.customer_external_id || undefined}}"
              },
              "url": "/contacts",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "email": "={{$parameter.filterOptions?.email || undefined}}",
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                      "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}",
                      "customer_external_id": "={{$parameter.filterOptions?.customer_external_id || undefined}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve a Contact",
          "value": "get",
          "action": "Retrieve a contact",
          "routing": {
            "request": {
              "url": "=/contacts/{{$parameter.contact_uuid}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update a Contact",
          "value": "update",
          "action": "Update a contact",
          "routing": {
            "request": {
              "url": "=/contacts/{{$parameter.contact_uuid}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Add Contact to Customer",
          "value": "add_contact",
          "action": "Add a contact to a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/contacts",
              "method": "POST"
            }
          }
        },
        {
          "name": "Create a Customer",
          "value": "create",
          "action": "Create a customer",
          "routing": {
            "request": {
              "url": "/customers",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Customer",
          "value": "delete",
          "action": "Delete a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "List Customer's Activities",
          "value": "list_activities",
          "action": "List activities of a customer",
          "routing": {
            "request": {
              "qs": {
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
              },
              "url": "=/customers/{{$parameter.customerUUID}}/activities",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "List Customer's Invoices",
          "value": "list_invoices",
          "action": "List invoices of a customer",
          "routing": {
            "request": {
              "qs": {
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "validation_type": "={{$parameter.validationType}}"
              },
              "url": "=/import/customers/{{$parameter.customerUUID}}/invoices",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "validation_type": "={{$parameter.validationType}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "List Customers",
          "value": "list",
          "action": "List customers",
          "routing": {
            "request": {
              "qs": {
                "status": "={{$parameter.status}}",
                "system": "={{$parameter.billingSystem}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "external_id": "={{$parameter.externalId}}",
                "data_source_uuid": "={{$parameter.dataSourceUUID}}"
              },
              "url": "/customers",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "status": "={{$parameter.status}}",
                      "system": "={{$parameter.billingSystem}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "external_id": "={{$parameter.externalId}}",
                      "data_source_uuid": "={{$parameter.dataSourceUUID}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "List Customers by Email",
          "value": "list_by_email",
          "action": "List customers by email",
          "routing": {
            "request": {
              "qs": {
                "email": "={{$parameter.email}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "with_associated_emails": "={{$parameter.includeAssociatedEmails}}"
              },
              "url": "/customers/search",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "email": "={{$parameter.email}}",
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "with_associated_emails": "={{$parameter.includeAssociatedEmails}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Merge Customers",
          "value": "merge",
          "action": "Merge customers",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "set",
                  "properties": {
                    "value": "={{ { merged: true } }}"
                  }
                }
              ]
            },
            "request": {
              "url": "/customers/merges",
              "method": "POST"
            }
          }
        },
        {
          "name": "Retrieve a Customer",
          "value": "get",
          "action": "Retrieve a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Unmerge Customers",
          "value": "unmerge",
          "action": "Unmerge customers",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "set",
                  "properties": {
                    "value": "={{ { unmerged: true } }}"
                  }
                }
              ]
            },
            "request": {
              "url": "/customers/unmerges",
              "body": {
                "customer_uuid": "={{$parameter.customerUUID}}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update a Customer",
          "value": "update",
          "action": "Update a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customer"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Add Custom Attributes to a Customer",
          "value": "add_attributes",
          "action": "Add custom attributes to a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/attributes/custom",
              "method": "POST"
            }
          }
        },
        {
          "name": "Add Custom Attributes to a Customer by Email",
          "value": "add_attributes_by_email",
          "action": "Add custom attributes to a customer by email",
          "routing": {
            "request": {
              "url": "/customers/attributes/custom",
              "method": "POST"
            }
          }
        },
        {
          "name": "Add Tags to a Customer",
          "value": "add_tags",
          "action": "Add tags to a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/attributes/tags",
              "method": "POST"
            }
          }
        },
        {
          "name": "Add Tags to a Customer by Email",
          "value": "add_tags_by_email",
          "action": "Add tags to a customer by email",
          "routing": {
            "request": {
              "url": "/customers/attributes/tags",
              "method": "POST"
            }
          }
        },
        {
          "name": "Remove Custom Attributes From a Customer",
          "value": "remove_attributes",
          "action": "Remove custom attributes from a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/attributes/custom",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Remove Tags From a Customer",
          "value": "remove_tags",
          "action": "Remove tags from a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/attributes/tags",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Retrieve Customer's Tags and Attributes",
          "value": "get",
          "action": "Retrieve tags and attributes of a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/attributes",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "enrichment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create a Subscription Event",
          "value": "create",
          "action": "Create a subscription event",
          "routing": {
            "request": {
              "url": "/subscription_events",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Subscription Event",
          "value": "delete",
          "action": "Delete a subscription event",
          "routing": {
            "request": {
              "url": "/subscription_events",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Disable a Subscription Event",
          "value": "disable",
          "action": "Disable a subscription event",
          "routing": {
            "request": {
              "url": "={{ $parameter.disableUsing === \"eventId\" ? \"/subscription_events/\" + $parameter.eventId + \"/disabled_state\" : \"/subscription_events/disabled_state\" }}",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "List Subscription Events",
          "value": "list",
          "action": "List subscription events",
          "routing": {
            "request": {
              "qs": {
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "event_date": "={{$parameter.event_date}}",
                "event_type": "={{$parameter.event_type}}",
                "external_id": "={{$parameter.external_id}}",
                "with_disabled": "={{$parameter.with_disabled}}",
                "effective_date": "={{$parameter.effective_date}}",
                "data_source_uuid": "={{$parameter.data_source_uuid}}",
                "plan_external_id": "={{$parameter.plan_external_id}}",
                "customer_external_id": "={{$parameter.customer_external_id}}",
                "include_edit_histories": "={{$parameter.include_edit_histories}}",
                "subscription_external_id": "={{$parameter.subscription_external_id}}"
              },
              "url": "/subscription_events",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "event_date": "={{$parameter.event_date}}",
                      "event_type": "={{$parameter.event_type}}",
                      "external_id": "={{$parameter.external_id}}",
                      "with_disabled": "={{$parameter.with_disabled}}",
                      "effective_date": "={{$parameter.effective_date}}",
                      "data_source_uuid": "={{$parameter.data_source_uuid}}",
                      "plan_external_id": "={{$parameter.plan_external_id}}",
                      "customer_external_id": "={{$parameter.customer_external_id}}",
                      "include_edit_histories": "={{$parameter.include_edit_histories}}",
                      "subscription_external_id": "={{$parameter.subscription_external_id}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Update a Subscription Event",
          "value": "update",
          "action": "Update a subscription event",
          "routing": {
            "request": {
              "url": "/subscription_events",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create an Invoice",
          "value": "create",
          "action": "Create an invoice",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "invoices"
                  }
                }
              ]
            },
            "request": {
              "url": "=/import/customers/{{$parameter.customerUUID}}/invoices",
              "body": "={{ (() => {\n\t\t\t\t\t\t\tconst clean = (v) => {\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\tconst arr = v.map(clean).filter(x => x != null && x !== '');\n\t\t\t\t\t\t\t\treturn arr.length ? arr : undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (v && typeof v === 'object') {\n\t\t\t\t\t\t\t\tconst o = Object.fromEntries(\n\t\t\t\t\t\t\t\t\tObject.entries(v)\n\t\t\t\t\t\t\t\t\t.map(([k, val]) => [k, clean(val)])\n\t\t\t\t\t\t\t\t\t.filter(([, val]) => val !== undefined && val !== null && val !== '')\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn Object.keys(o).length ? o : undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn (v === '' || v == null) ? undefined : v;\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tconst inv = { ...($parameter.invoice ?? {}) };\n\n\t\t\t\t\t\t\tinv.external_id = $parameter.externalId;\n\t\t\t\t\t\t\tinv.date = $parameter.date;\n\t\t\t\t\t\t\tinv.currency = $parameter.currency;\n\n\t\t\t\t\t\t\tconst li = $parameter.line_items || {};\n\t\t\t\t\t\t\tconst oneTime = Array.isArray(li.one_time) ? li.one_time : [];\n\t\t\t\t\t\t\tconst subscription = Array.isArray(li.subscription) ? li.subscription : [];\n\t\t\t\t\t\t\tconst trial = Array.isArray(li.trial) ? li.trial : [];\n\n\t\t\t\t\t\t\tinv.line_items = clean([...oneTime, ...subscription, ...trial]) ?? [];\n\n\t\t\t\t\t\t\tconst tx = $parameter.transactions || {};\n\t\t\t\t\t\t\tconst transactions = Array.isArray(tx.transaction) ? tx.transaction : [];\n\n\t\t\t\t\t\t\tinv.transactions = clean(transactions) ?? [];\n\n\t\t\t\t\t\t\tconst cleanedInv = clean(inv);\n\t\t\t\t\t\t\treturn { invoices: cleanedInv ? [cleanedInv] : [] };\n\t\t\t\t\t\t})() }}",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete All Invoices of a Customer",
          "value": "deleteAll",
          "action": "Delete all invoices of a customer",
          "routing": {
            "request": {
              "url": "=/data_sources/{{$parameter.dataSourceUUID}}/customers/{{$parameter.customerUUID}}/invoices",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Delete an Invoice",
          "value": "delete",
          "action": "Delete an invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter.invoiceUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Disable an Invoice",
          "value": "disable",
          "action": "Disable an invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter.invoiceUUID}}/disabled_state",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "List Invoices",
          "value": "list",
          "action": "List invoices",
          "routing": {
            "request": {
              "qs": {
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "external_id": "={{$parameter.externalId}}",
                "customer_uuid": "={{$parameter.customerUUID}}",
                "with_disabled": "={{$parameter.with_disabled}}",
                "validation_type": "={{$parameter.validationType}}",
                "data_source_uuid": "={{$parameter.dataSourceUUID}}",
                "include_edit_histories": "={{$parameter.include_edit_histories}}"
              },
              "url": "/invoices",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "external_id": "={{$parameter.externalId}}",
                      "customer_uuid": "={{$parameter.customerUUID}}",
                      "with_disabled": "={{$parameter.with_disabled}}",
                      "validation_type": "={{$parameter.validationType}}",
                      "data_source_uuid": "={{$parameter.dataSourceUUID}}",
                      "include_edit_histories": "={{$parameter.include_edit_histories}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve an Invoice",
          "value": "get",
          "action": "Retrieve an invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter.invoiceUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update an Invoice",
          "value": "update",
          "action": "Update an invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter.invoiceUUID}}",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Update Invoice Status",
          "value": "updateStatus",
          "action": "Update invoice status",
          "routing": {
            "request": {
              "url": "=/data_sources/{{$parameter.dataSourceUUID}}/invoices/{{$parameter.externalId}}/status",
              "method": "PUT"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invoice"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create a Line Item",
          "value": "create",
          "action": "Create a line item",
          "routing": {
            "request": {
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Line Item",
          "value": "delete",
          "action": "Delete a line item",
          "routing": {
            "request": {
              "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Disable a Line Item",
          "value": "disable",
          "action": "Disable a line item",
          "routing": {
            "request": {
              "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}/disabled_state",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Retrieve a Line Item",
          "value": "get",
          "action": "Retrieve a line item",
          "routing": {
            "request": {
              "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update a Line Item",
          "value": "update",
          "action": "Update a line item",
          "routing": {
            "request": {
              "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "line_item"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "all",
      "options": [
        {
          "name": "All Key Metrics",
          "value": "all",
          "action": "Get all key metrics",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/all",
              "method": "GET"
            }
          }
        },
        {
          "name": "Annual Run Rate (ARR)",
          "value": "arr",
          "action": "Get ARR",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/arr",
              "method": "GET"
            }
          }
        },
        {
          "name": "Average Revenue per Account (ARPA)",
          "value": "arpa",
          "action": "Get ARPA",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/arpa",
              "method": "GET"
            }
          }
        },
        {
          "name": "Average Sale Price (ASP)",
          "value": "asp",
          "action": "Get ASP",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/asp",
              "method": "GET"
            }
          }
        },
        {
          "name": "Customer Churn Rate",
          "value": "customer-churn-rate",
          "action": "Get customer churn rate",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/customer-churn-rate",
              "method": "GET"
            }
          }
        },
        {
          "name": "Customer Count",
          "value": "customer-count",
          "action": "Get customer count",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/customer-count",
              "method": "GET"
            }
          }
        },
        {
          "name": "Customer Lifetime Value (LTV)",
          "value": "ltv",
          "action": "Get LTV",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/ltv",
              "method": "GET"
            }
          }
        },
        {
          "name": "Monthly Recurring Revenue (MRR)",
          "value": "mrr",
          "action": "Get MRR",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/mrr",
              "method": "GET"
            }
          }
        },
        {
          "name": "MRR Churn Rate",
          "value": "mrr-churn-rate",
          "action": "Get MRR churn rate",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "entries"
                  }
                }
              ]
            },
            "request": {
              "url": "/metrics/mrr-churn-rate",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "metric"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create a Note or Call Log",
          "value": "create",
          "action": "Create a note or call log",
          "routing": {
            "request": {
              "url": "/customer_notes",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Note or Call Log",
          "value": "delete",
          "action": "Delete a note or call log",
          "routing": {
            "request": {
              "url": "=/customer_notes/{{$parameter.noteUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "List Notes and Call Logs",
          "value": "list",
          "action": "List notes and call logs",
          "routing": {
            "request": {
              "qs": {
                "type": "={{$parameter.filterOptions?.type || undefined}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "author_email": "={{$parameter.filterOptions?.author_email || undefined}}",
                "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}"
              },
              "url": "/customer_notes",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "type": "={{$parameter.filterOptions?.type || undefined}}",
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "author_email": "={{$parameter.filterOptions?.author_email || undefined}}",
                      "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve a Note or Call Log",
          "value": "get",
          "action": "Retrieve a note or call log",
          "routing": {
            "request": {
              "url": "=/customer_notes/{{$parameter.noteUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update a Note or Call Log",
          "value": "update",
          "action": "Update a note or call log",
          "routing": {
            "request": {
              "url": "=/customer_notes/{{$parameter.noteUUID}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "note"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create an Opportunity",
          "value": "create",
          "action": "Create an opportunity",
          "routing": {
            "request": {
              "url": "/opportunities",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete an Opportunity",
          "value": "delete",
          "action": "Delete an opportunity",
          "routing": {
            "request": {
              "url": "=/opportunities/{{$parameter.opportunityUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "List Opportunities",
          "value": "list",
          "action": "List opportunities",
          "routing": {
            "request": {
              "qs": {
                "owner": "={{$parameter.filterOptions?.owner || undefined}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "pipeline": "={{$parameter.filterOptions?.pipeline || undefined}}",
                "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                "pipeline_stage": "={{$parameter.filterOptions?.pipelineStage || undefined}}",
                "estimated_close_date_on_or_after": "={{$parameter.filterOptions?.estimatedCloseDateOnOrAfter || undefined}}",
                "estimated_close_date_on_or_before": "={{$parameter.filterOptions?.estimatedCloseDateOnOrBefore || undefined}}"
              },
              "url": "/opportunities",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "owner": "={{$parameter.filterOptions?.owner || undefined}}",
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "pipeline": "={{$parameter.filterOptions?.pipeline || undefined}}",
                      "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                      "pipeline_stage": "={{$parameter.filterOptions?.pipelineStage || undefined}}",
                      "estimated_close_date_on_or_after": "={{$parameter.filterOptions?.estimatedCloseDateOnOrAfter || undefined}}",
                      "estimated_close_date_on_or_before": "={{$parameter.filterOptions?.estimatedCloseDateOnOrBefore || undefined}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve an Opportunity",
          "value": "get",
          "action": "Retrieve an opportunity",
          "routing": {
            "request": {
              "url": "=/opportunities/{{$parameter.opportunityUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update an Opportunity",
          "value": "update",
          "action": "Update an opportunity",
          "routing": {
            "request": {
              "url": "=/opportunities/{{$parameter.opportunityUUID}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "opportunity"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create a Plan",
          "value": "create",
          "action": "Create a plan",
          "routing": {
            "request": {
              "url": "/plans",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Plan",
          "value": "delete",
          "action": "Delete a plan",
          "routing": {
            "request": {
              "url": "=/plans/{{$parameter.planUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "List Plans",
          "value": "list",
          "action": "List plans",
          "routing": {
            "request": {
              "qs": {
                "system": "={{$parameter.filterOptions?.billingSystem || undefined}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "external_id": "={{$parameter.filterOptions?.externalId || undefined}}",
                "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}"
              },
              "url": "/plans",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "system": "={{$parameter.filterOptions?.billingSystem || undefined}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "external_id": "={{$parameter.filterOptions?.externalId || undefined}}",
                      "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve a Plan",
          "value": "get",
          "action": "Retrieve a plan",
          "routing": {
            "request": {
              "url": "=/plans/{{$parameter.planUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update a Plan",
          "value": "update",
          "action": "Update a plan",
          "routing": {
            "request": {
              "url": "=/plans/{{$parameter.planUUID}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "plan"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create a Plan Group",
          "value": "create",
          "action": "Create a plan group",
          "routing": {
            "request": {
              "url": "/plan_groups",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Plan Group",
          "value": "delete",
          "action": "Delete a plan group",
          "routing": {
            "request": {
              "url": "=/plan_groups/{{$parameter.planGroupUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "List Plan Groups",
          "value": "list",
          "action": "List plan groups",
          "routing": {
            "request": {
              "url": "/plan_groups",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "List Plans in a Plan Group",
          "value": "listContents",
          "action": "List plans in a plan group",
          "routing": {
            "request": {
              "url": "=/plan_groups/{{$parameter.planGroupUUID}}/plans",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve a Plan Group",
          "value": "get",
          "action": "Retrieve a plan group",
          "routing": {
            "request": {
              "url": "=/plan_groups/{{$parameter.planGroupUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update a Plan Group",
          "value": "update",
          "action": "Update a plan group",
          "routing": {
            "request": {
              "url": "=/plan_groups/{{$parameter.planGroupUUID}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "planGroup"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create a Source",
          "value": "create",
          "action": "Create a source",
          "routing": {
            "request": {
              "url": "/data_sources",
              "method": "POST"
            }
          }
        },
        {
          "name": "List Sources",
          "value": "list",
          "action": "List all sources",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data_sources"
                  }
                }
              ]
            },
            "request": {
              "url": "/data_sources",
              "method": "GET"
            }
          }
        },
        {
          "name": "Retrieve a Source",
          "value": "get",
          "action": "Retrieve a source",
          "routing": {
            "request": {
              "url": "=/data_sources/{{$parameter.dataSourceUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Delete a Source",
          "value": "delete",
          "action": "Delete a source",
          "routing": {
            "request": {
              "url": "=/data_sources/{{$parameter.dataSourceUUID}}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "source"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List Customer's Subscriptions",
          "value": "list",
          "action": "List subscriptions for a customer",
          "routing": {
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/subscriptions",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Connect Subscriptions",
          "value": "connect",
          "action": "Connect subscriptions of a customer",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "set",
                  "properties": {
                    "value": "={{ { connected: true } }}"
                  }
                }
              ]
            },
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/connect_subscriptions",
              "method": "POST"
            }
          }
        },
        {
          "name": "Disconnect Subscriptions",
          "value": "disconnect",
          "action": "Disconnect subscriptions of a customer",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "set",
                  "properties": {
                    "value": "={{ { disconnected: true } }}"
                  }
                }
              ]
            },
            "request": {
              "url": "=/customers/{{$parameter.customerUUID}}/disconnect_subscriptions",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "subscription"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create a Task",
          "value": "create",
          "action": "Create a task",
          "routing": {
            "request": {
              "url": "/tasks",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Task",
          "value": "delete",
          "action": "Delete a task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "List Tasks",
          "value": "list",
          "action": "List tasks",
          "routing": {
            "request": {
              "qs": {
                "assignee": "={{$parameter.filterOptions?.assignee || undefined}}",
                "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                "completed": "={{$parameter.filterOptions?.completed || undefined}}",
                "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                "due_date_on_or_after": "={{$parameter.filterOptions?.due_date_on_or_after || undefined}}",
                "due_date_on_or_before": "={{$parameter.filterOptions?.due_date_on_or_before || undefined}}"
              },
              "url": "/tasks",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "cursor": "={{$response.body.cursor}}",
                      "assignee": "={{$parameter.filterOptions?.assignee || undefined}}",
                      "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                      "completed": "={{$parameter.filterOptions?.completed || undefined}}",
                      "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                      "due_date_on_or_after": "={{$parameter.filterOptions?.due_date_on_or_after || undefined}}",
                      "due_date_on_or_before": "={{$parameter.filterOptions?.due_date_on_or_before || undefined}}"
                    }
                  },
                  "continue": "={{ $response.body.has_more === true }}"
                }
              }
            }
          }
        },
        {
          "name": "Retrieve a Task",
          "value": "get",
          "action": "Retrieve a task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update a Task",
          "value": "update",
          "action": "Update a task",
          "routing": {
            "request": {
              "url": "=/tasks/{{$parameter.taskUUID}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create a Transaction",
          "value": "create",
          "action": "Create a transaction",
          "routing": {
            "request": {
              "url": "=/import/invoices/{{$parameter.invoiceUUID}}/transactions",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete a Transaction",
          "value": "delete",
          "action": "Delete a transaction",
          "routing": {
            "request": {
              "url": "=/transactions/{{$parameter.transactionUUID}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Disable a Transaction",
          "value": "disable",
          "action": "Disable a transaction",
          "routing": {
            "request": {
              "url": "=/transactions/{{$parameter.transactionUUID}}/disabled_state",
              "method": "PATCH"
            }
          }
        },
        {
          "name": "Retrieve a Transaction",
          "value": "get",
          "action": "Retrieve a transaction",
          "routing": {
            "request": {
              "url": "=/transactions/{{$parameter.transactionUUID}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update a Transaction",
          "value": "update",
          "action": "Update a transaction",
          "routing": {
            "request": {
              "url": "=/transactions/{{$parameter.transactionUUID}}",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transaction"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Account Details",
      "value": "get",
      "action": "Get account details",
      "routing": {
        "request": {
          "url": "/account",
          "method": "GET"
        }
      },
      "resource": "account"
    },
    {
      "name": "Create an Activities Export",
      "value": "create",
      "action": "Create an activities export",
      "routing": {
        "request": {
          "url": "/activities_export",
          "method": "POST"
        }
      },
      "resource": "activities"
    },
    {
      "name": "List Activities",
      "value": "list",
      "action": "List activities",
      "routing": {
        "request": {
          "qs": {
            "type": "={{$parameter.filterOptions?.type || undefined}}",
            "order": "={{$parameter.filterOptions?.order || undefined}}",
            "end-date": "={{$parameter.filterOptions?.endDate || undefined}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "start-date": "={{$parameter.filterOptions?.startDate || undefined}}"
          },
          "url": "/activities",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "type": "={{$parameter.filterOptions?.type || undefined}}",
                  "order": "={{$parameter.filterOptions?.order || undefined}}",
                  "cursor": "={{$response.body.cursor}}",
                  "end-date": "={{$parameter.filterOptions?.endDate || undefined}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "start-date": "={{$parameter.filterOptions?.startDate || undefined}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "activities"
    },
    {
      "name": "Retrieve an Activities Export",
      "value": "get",
      "action": "Retrieve an activities export",
      "routing": {
        "request": {
          "url": "=/activities_export/{{$parameter.id}}",
          "method": "GET"
        }
      },
      "resource": "activities"
    },
    {
      "name": "Create a Contact",
      "value": "create",
      "action": "Create a contact",
      "routing": {
        "request": {
          "url": "/contacts",
          "method": "POST"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Delete a Contact",
      "value": "delete",
      "action": "Delete a contact",
      "routing": {
        "request": {
          "url": "=/contacts/{{$parameter.contact_uuid}}",
          "method": "DELETE"
        }
      },
      "resource": "contact"
    },
    {
      "name": "List Contacts",
      "value": "list",
      "action": "List contacts",
      "routing": {
        "request": {
          "qs": {
            "email": "={{$parameter.filterOptions?.email || undefined}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
            "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}",
            "customer_external_id": "={{$parameter.filterOptions?.customer_external_id || undefined}}"
          },
          "url": "/contacts",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "email": "={{$parameter.filterOptions?.email || undefined}}",
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                  "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}",
                  "customer_external_id": "={{$parameter.filterOptions?.customer_external_id || undefined}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "contact"
    },
    {
      "name": "Retrieve a Contact",
      "value": "get",
      "action": "Retrieve a contact",
      "routing": {
        "request": {
          "url": "=/contacts/{{$parameter.contact_uuid}}",
          "method": "GET"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Update a Contact",
      "value": "update",
      "action": "Update a contact",
      "routing": {
        "request": {
          "url": "=/contacts/{{$parameter.contact_uuid}}",
          "method": "PATCH"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Add Contact to Customer",
      "value": "add_contact",
      "action": "Add a contact to a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/contacts",
          "method": "POST"
        }
      },
      "resource": "customer"
    },
    {
      "name": "Create a Customer",
      "value": "create",
      "action": "Create a customer",
      "routing": {
        "request": {
          "url": "/customers",
          "method": "POST"
        }
      },
      "resource": "customer"
    },
    {
      "name": "Delete a Customer",
      "value": "delete",
      "action": "Delete a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "customer"
    },
    {
      "name": "List Customer's Activities",
      "value": "list_activities",
      "action": "List activities of a customer",
      "routing": {
        "request": {
          "qs": {
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
          },
          "url": "=/customers/{{$parameter.customerUUID}}/activities",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "customer"
    },
    {
      "name": "List Customer's Invoices",
      "value": "list_invoices",
      "action": "List invoices of a customer",
      "routing": {
        "request": {
          "qs": {
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "validation_type": "={{$parameter.validationType}}"
          },
          "url": "=/import/customers/{{$parameter.customerUUID}}/invoices",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "validation_type": "={{$parameter.validationType}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "customer"
    },
    {
      "name": "List Customers",
      "value": "list",
      "action": "List customers",
      "routing": {
        "request": {
          "qs": {
            "status": "={{$parameter.status}}",
            "system": "={{$parameter.billingSystem}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "external_id": "={{$parameter.externalId}}",
            "data_source_uuid": "={{$parameter.dataSourceUUID}}"
          },
          "url": "/customers",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "status": "={{$parameter.status}}",
                  "system": "={{$parameter.billingSystem}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "external_id": "={{$parameter.externalId}}",
                  "data_source_uuid": "={{$parameter.dataSourceUUID}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "customer"
    },
    {
      "name": "List Customers by Email",
      "value": "list_by_email",
      "action": "List customers by email",
      "routing": {
        "request": {
          "qs": {
            "email": "={{$parameter.email}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "with_associated_emails": "={{$parameter.includeAssociatedEmails}}"
          },
          "url": "/customers/search",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "email": "={{$parameter.email}}",
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "with_associated_emails": "={{$parameter.includeAssociatedEmails}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "customer"
    },
    {
      "name": "Merge Customers",
      "value": "merge",
      "action": "Merge customers",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "set",
              "properties": {
                "value": "={{ { merged: true } }}"
              }
            }
          ]
        },
        "request": {
          "url": "/customers/merges",
          "method": "POST"
        }
      },
      "resource": "customer"
    },
    {
      "name": "Retrieve a Customer",
      "value": "get",
      "action": "Retrieve a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}",
          "method": "GET"
        }
      },
      "resource": "customer"
    },
    {
      "name": "Unmerge Customers",
      "value": "unmerge",
      "action": "Unmerge customers",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "set",
              "properties": {
                "value": "={{ { unmerged: true } }}"
              }
            }
          ]
        },
        "request": {
          "url": "/customers/unmerges",
          "body": {
            "customer_uuid": "={{$parameter.customerUUID}}"
          },
          "method": "POST"
        }
      },
      "resource": "customer"
    },
    {
      "name": "Update a Customer",
      "value": "update",
      "action": "Update a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "customer"
    },
    {
      "name": "Add Custom Attributes to a Customer",
      "value": "add_attributes",
      "action": "Add custom attributes to a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/attributes/custom",
          "method": "POST"
        }
      },
      "resource": "enrichment"
    },
    {
      "name": "Add Custom Attributes to a Customer by Email",
      "value": "add_attributes_by_email",
      "action": "Add custom attributes to a customer by email",
      "routing": {
        "request": {
          "url": "/customers/attributes/custom",
          "method": "POST"
        }
      },
      "resource": "enrichment"
    },
    {
      "name": "Add Tags to a Customer",
      "value": "add_tags",
      "action": "Add tags to a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/attributes/tags",
          "method": "POST"
        }
      },
      "resource": "enrichment"
    },
    {
      "name": "Add Tags to a Customer by Email",
      "value": "add_tags_by_email",
      "action": "Add tags to a customer by email",
      "routing": {
        "request": {
          "url": "/customers/attributes/tags",
          "method": "POST"
        }
      },
      "resource": "enrichment"
    },
    {
      "name": "Remove Custom Attributes From a Customer",
      "value": "remove_attributes",
      "action": "Remove custom attributes from a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/attributes/custom",
          "method": "DELETE"
        }
      },
      "resource": "enrichment"
    },
    {
      "name": "Remove Tags From a Customer",
      "value": "remove_tags",
      "action": "Remove tags from a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/attributes/tags",
          "method": "DELETE"
        }
      },
      "resource": "enrichment"
    },
    {
      "name": "Retrieve Customer's Tags and Attributes",
      "value": "get",
      "action": "Retrieve tags and attributes of a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/attributes",
          "method": "GET"
        }
      },
      "resource": "enrichment"
    },
    {
      "name": "Create a Subscription Event",
      "value": "create",
      "action": "Create a subscription event",
      "routing": {
        "request": {
          "url": "/subscription_events",
          "method": "POST"
        }
      },
      "resource": "event"
    },
    {
      "name": "Delete a Subscription Event",
      "value": "delete",
      "action": "Delete a subscription event",
      "routing": {
        "request": {
          "url": "/subscription_events",
          "method": "DELETE"
        }
      },
      "resource": "event"
    },
    {
      "name": "Disable a Subscription Event",
      "value": "disable",
      "action": "Disable a subscription event",
      "routing": {
        "request": {
          "url": "={{ $parameter.disableUsing === \"eventId\" ? \"/subscription_events/\" + $parameter.eventId + \"/disabled_state\" : \"/subscription_events/disabled_state\" }}",
          "method": "PATCH"
        }
      },
      "resource": "event"
    },
    {
      "name": "List Subscription Events",
      "value": "list",
      "action": "List subscription events",
      "routing": {
        "request": {
          "qs": {
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "event_date": "={{$parameter.event_date}}",
            "event_type": "={{$parameter.event_type}}",
            "external_id": "={{$parameter.external_id}}",
            "with_disabled": "={{$parameter.with_disabled}}",
            "effective_date": "={{$parameter.effective_date}}",
            "data_source_uuid": "={{$parameter.data_source_uuid}}",
            "plan_external_id": "={{$parameter.plan_external_id}}",
            "customer_external_id": "={{$parameter.customer_external_id}}",
            "include_edit_histories": "={{$parameter.include_edit_histories}}",
            "subscription_external_id": "={{$parameter.subscription_external_id}}"
          },
          "url": "/subscription_events",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "event_date": "={{$parameter.event_date}}",
                  "event_type": "={{$parameter.event_type}}",
                  "external_id": "={{$parameter.external_id}}",
                  "with_disabled": "={{$parameter.with_disabled}}",
                  "effective_date": "={{$parameter.effective_date}}",
                  "data_source_uuid": "={{$parameter.data_source_uuid}}",
                  "plan_external_id": "={{$parameter.plan_external_id}}",
                  "customer_external_id": "={{$parameter.customer_external_id}}",
                  "include_edit_histories": "={{$parameter.include_edit_histories}}",
                  "subscription_external_id": "={{$parameter.subscription_external_id}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "event"
    },
    {
      "name": "Update a Subscription Event",
      "value": "update",
      "action": "Update a subscription event",
      "routing": {
        "request": {
          "url": "/subscription_events",
          "method": "PATCH"
        }
      },
      "resource": "event"
    },
    {
      "name": "Create an Invoice",
      "value": "create",
      "action": "Create an invoice",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "invoices"
              }
            }
          ]
        },
        "request": {
          "url": "=/import/customers/{{$parameter.customerUUID}}/invoices",
          "body": "={{ (() => {\n\t\t\t\t\t\t\tconst clean = (v) => {\n\t\t\t\t\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\t\t\t\tconst arr = v.map(clean).filter(x => x != null && x !== '');\n\t\t\t\t\t\t\t\treturn arr.length ? arr : undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (v && typeof v === 'object') {\n\t\t\t\t\t\t\t\tconst o = Object.fromEntries(\n\t\t\t\t\t\t\t\t\tObject.entries(v)\n\t\t\t\t\t\t\t\t\t.map(([k, val]) => [k, clean(val)])\n\t\t\t\t\t\t\t\t\t.filter(([, val]) => val !== undefined && val !== null && val !== '')\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn Object.keys(o).length ? o : undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn (v === '' || v == null) ? undefined : v;\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tconst inv = { ...($parameter.invoice ?? {}) };\n\n\t\t\t\t\t\t\tinv.external_id = $parameter.externalId;\n\t\t\t\t\t\t\tinv.date = $parameter.date;\n\t\t\t\t\t\t\tinv.currency = $parameter.currency;\n\n\t\t\t\t\t\t\tconst li = $parameter.line_items || {};\n\t\t\t\t\t\t\tconst oneTime = Array.isArray(li.one_time) ? li.one_time : [];\n\t\t\t\t\t\t\tconst subscription = Array.isArray(li.subscription) ? li.subscription : [];\n\t\t\t\t\t\t\tconst trial = Array.isArray(li.trial) ? li.trial : [];\n\n\t\t\t\t\t\t\tinv.line_items = clean([...oneTime, ...subscription, ...trial]) ?? [];\n\n\t\t\t\t\t\t\tconst tx = $parameter.transactions || {};\n\t\t\t\t\t\t\tconst transactions = Array.isArray(tx.transaction) ? tx.transaction : [];\n\n\t\t\t\t\t\t\tinv.transactions = clean(transactions) ?? [];\n\n\t\t\t\t\t\t\tconst cleanedInv = clean(inv);\n\t\t\t\t\t\t\treturn { invoices: cleanedInv ? [cleanedInv] : [] };\n\t\t\t\t\t\t})() }}",
          "method": "POST"
        }
      },
      "resource": "invoice"
    },
    {
      "name": "Delete All Invoices of a Customer",
      "value": "deleteAll",
      "action": "Delete all invoices of a customer",
      "routing": {
        "request": {
          "url": "=/data_sources/{{$parameter.dataSourceUUID}}/customers/{{$parameter.customerUUID}}/invoices",
          "method": "DELETE"
        }
      },
      "resource": "invoice"
    },
    {
      "name": "Delete an Invoice",
      "value": "delete",
      "action": "Delete an invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter.invoiceUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "invoice"
    },
    {
      "name": "Disable an Invoice",
      "value": "disable",
      "action": "Disable an invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter.invoiceUUID}}/disabled_state",
          "method": "PATCH"
        }
      },
      "resource": "invoice"
    },
    {
      "name": "List Invoices",
      "value": "list",
      "action": "List invoices",
      "routing": {
        "request": {
          "qs": {
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "external_id": "={{$parameter.externalId}}",
            "customer_uuid": "={{$parameter.customerUUID}}",
            "with_disabled": "={{$parameter.with_disabled}}",
            "validation_type": "={{$parameter.validationType}}",
            "data_source_uuid": "={{$parameter.dataSourceUUID}}",
            "include_edit_histories": "={{$parameter.include_edit_histories}}"
          },
          "url": "/invoices",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "external_id": "={{$parameter.externalId}}",
                  "customer_uuid": "={{$parameter.customerUUID}}",
                  "with_disabled": "={{$parameter.with_disabled}}",
                  "validation_type": "={{$parameter.validationType}}",
                  "data_source_uuid": "={{$parameter.dataSourceUUID}}",
                  "include_edit_histories": "={{$parameter.include_edit_histories}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "invoice"
    },
    {
      "name": "Retrieve an Invoice",
      "value": "get",
      "action": "Retrieve an invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter.invoiceUUID}}",
          "method": "GET"
        }
      },
      "resource": "invoice"
    },
    {
      "name": "Update an Invoice",
      "value": "update",
      "action": "Update an invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter.invoiceUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "invoice"
    },
    {
      "name": "Update Invoice Status",
      "value": "updateStatus",
      "action": "Update invoice status",
      "routing": {
        "request": {
          "url": "=/data_sources/{{$parameter.dataSourceUUID}}/invoices/{{$parameter.externalId}}/status",
          "method": "PUT"
        }
      },
      "resource": "invoice"
    },
    {
      "name": "Create a Line Item",
      "value": "create",
      "action": "Create a line item",
      "routing": {
        "request": {
          "method": "POST"
        }
      },
      "resource": "line_item"
    },
    {
      "name": "Delete a Line Item",
      "value": "delete",
      "action": "Delete a line item",
      "routing": {
        "request": {
          "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}",
          "method": "DELETE"
        }
      },
      "resource": "line_item"
    },
    {
      "name": "Disable a Line Item",
      "value": "disable",
      "action": "Disable a line item",
      "routing": {
        "request": {
          "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}/disabled_state",
          "method": "PATCH"
        }
      },
      "resource": "line_item"
    },
    {
      "name": "Retrieve a Line Item",
      "value": "get",
      "action": "Retrieve a line item",
      "routing": {
        "request": {
          "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}",
          "method": "GET"
        }
      },
      "resource": "line_item"
    },
    {
      "name": "Update a Line Item",
      "value": "update",
      "action": "Update a line item",
      "routing": {
        "request": {
          "url": "=/line_items/{{$parameter[\"lineItemUUID\"]}}",
          "method": "PATCH"
        }
      },
      "resource": "line_item"
    },
    {
      "name": "All Key Metrics",
      "value": "all",
      "action": "Get all key metrics",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/all",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Annual Run Rate (ARR)",
      "value": "arr",
      "action": "Get ARR",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/arr",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Average Revenue per Account (ARPA)",
      "value": "arpa",
      "action": "Get ARPA",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/arpa",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Average Sale Price (ASP)",
      "value": "asp",
      "action": "Get ASP",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/asp",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Customer Churn Rate",
      "value": "customer-churn-rate",
      "action": "Get customer churn rate",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/customer-churn-rate",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Customer Count",
      "value": "customer-count",
      "action": "Get customer count",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/customer-count",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Customer Lifetime Value (LTV)",
      "value": "ltv",
      "action": "Get LTV",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/ltv",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Monthly Recurring Revenue (MRR)",
      "value": "mrr",
      "action": "Get MRR",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/mrr",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "MRR Churn Rate",
      "value": "mrr-churn-rate",
      "action": "Get MRR churn rate",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "entries"
              }
            }
          ]
        },
        "request": {
          "url": "/metrics/mrr-churn-rate",
          "method": "GET"
        }
      },
      "resource": "metric"
    },
    {
      "name": "Create a Note or Call Log",
      "value": "create",
      "action": "Create a note or call log",
      "routing": {
        "request": {
          "url": "/customer_notes",
          "method": "POST"
        }
      },
      "resource": "note"
    },
    {
      "name": "Delete a Note or Call Log",
      "value": "delete",
      "action": "Delete a note or call log",
      "routing": {
        "request": {
          "url": "=/customer_notes/{{$parameter.noteUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "note"
    },
    {
      "name": "List Notes and Call Logs",
      "value": "list",
      "action": "List notes and call logs",
      "routing": {
        "request": {
          "qs": {
            "type": "={{$parameter.filterOptions?.type || undefined}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "author_email": "={{$parameter.filterOptions?.author_email || undefined}}",
            "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}"
          },
          "url": "/customer_notes",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "type": "={{$parameter.filterOptions?.type || undefined}}",
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "author_email": "={{$parameter.filterOptions?.author_email || undefined}}",
                  "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "note"
    },
    {
      "name": "Retrieve a Note or Call Log",
      "value": "get",
      "action": "Retrieve a note or call log",
      "routing": {
        "request": {
          "url": "=/customer_notes/{{$parameter.noteUUID}}",
          "method": "GET"
        }
      },
      "resource": "note"
    },
    {
      "name": "Update a Note or Call Log",
      "value": "update",
      "action": "Update a note or call log",
      "routing": {
        "request": {
          "url": "=/customer_notes/{{$parameter.noteUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "note"
    },
    {
      "name": "Create an Opportunity",
      "value": "create",
      "action": "Create an opportunity",
      "routing": {
        "request": {
          "url": "/opportunities",
          "method": "POST"
        }
      },
      "resource": "opportunity"
    },
    {
      "name": "Delete an Opportunity",
      "value": "delete",
      "action": "Delete an opportunity",
      "routing": {
        "request": {
          "url": "=/opportunities/{{$parameter.opportunityUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "opportunity"
    },
    {
      "name": "List Opportunities",
      "value": "list",
      "action": "List opportunities",
      "routing": {
        "request": {
          "qs": {
            "owner": "={{$parameter.filterOptions?.owner || undefined}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "pipeline": "={{$parameter.filterOptions?.pipeline || undefined}}",
            "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
            "pipeline_stage": "={{$parameter.filterOptions?.pipelineStage || undefined}}",
            "estimated_close_date_on_or_after": "={{$parameter.filterOptions?.estimatedCloseDateOnOrAfter || undefined}}",
            "estimated_close_date_on_or_before": "={{$parameter.filterOptions?.estimatedCloseDateOnOrBefore || undefined}}"
          },
          "url": "/opportunities",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "owner": "={{$parameter.filterOptions?.owner || undefined}}",
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "pipeline": "={{$parameter.filterOptions?.pipeline || undefined}}",
                  "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                  "pipeline_stage": "={{$parameter.filterOptions?.pipelineStage || undefined}}",
                  "estimated_close_date_on_or_after": "={{$parameter.filterOptions?.estimatedCloseDateOnOrAfter || undefined}}",
                  "estimated_close_date_on_or_before": "={{$parameter.filterOptions?.estimatedCloseDateOnOrBefore || undefined}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "opportunity"
    },
    {
      "name": "Retrieve an Opportunity",
      "value": "get",
      "action": "Retrieve an opportunity",
      "routing": {
        "request": {
          "url": "=/opportunities/{{$parameter.opportunityUUID}}",
          "method": "GET"
        }
      },
      "resource": "opportunity"
    },
    {
      "name": "Update an Opportunity",
      "value": "update",
      "action": "Update an opportunity",
      "routing": {
        "request": {
          "url": "=/opportunities/{{$parameter.opportunityUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "opportunity"
    },
    {
      "name": "Create a Plan",
      "value": "create",
      "action": "Create a plan",
      "routing": {
        "request": {
          "url": "/plans",
          "method": "POST"
        }
      },
      "resource": "plan"
    },
    {
      "name": "Delete a Plan",
      "value": "delete",
      "action": "Delete a plan",
      "routing": {
        "request": {
          "url": "=/plans/{{$parameter.planUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "plan"
    },
    {
      "name": "List Plans",
      "value": "list",
      "action": "List plans",
      "routing": {
        "request": {
          "qs": {
            "system": "={{$parameter.filterOptions?.billingSystem || undefined}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "external_id": "={{$parameter.filterOptions?.externalId || undefined}}",
            "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}"
          },
          "url": "/plans",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "system": "={{$parameter.filterOptions?.billingSystem || undefined}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "external_id": "={{$parameter.filterOptions?.externalId || undefined}}",
                  "data_source_uuid": "={{$parameter.filterOptions?.data_source_uuid || undefined}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "plan"
    },
    {
      "name": "Retrieve a Plan",
      "value": "get",
      "action": "Retrieve a plan",
      "routing": {
        "request": {
          "url": "=/plans/{{$parameter.planUUID}}",
          "method": "GET"
        }
      },
      "resource": "plan"
    },
    {
      "name": "Update a Plan",
      "value": "update",
      "action": "Update a plan",
      "routing": {
        "request": {
          "url": "=/plans/{{$parameter.planUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "plan"
    },
    {
      "name": "Create a Plan Group",
      "value": "create",
      "action": "Create a plan group",
      "routing": {
        "request": {
          "url": "/plan_groups",
          "method": "POST"
        }
      },
      "resource": "planGroup"
    },
    {
      "name": "Delete a Plan Group",
      "value": "delete",
      "action": "Delete a plan group",
      "routing": {
        "request": {
          "url": "=/plan_groups/{{$parameter.planGroupUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "planGroup"
    },
    {
      "name": "List Plan Groups",
      "value": "list",
      "action": "List plan groups",
      "routing": {
        "request": {
          "url": "/plan_groups",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "planGroup"
    },
    {
      "name": "List Plans in a Plan Group",
      "value": "listContents",
      "action": "List plans in a plan group",
      "routing": {
        "request": {
          "url": "=/plan_groups/{{$parameter.planGroupUUID}}/plans",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "planGroup"
    },
    {
      "name": "Retrieve a Plan Group",
      "value": "get",
      "action": "Retrieve a plan group",
      "routing": {
        "request": {
          "url": "=/plan_groups/{{$parameter.planGroupUUID}}",
          "method": "GET"
        }
      },
      "resource": "planGroup"
    },
    {
      "name": "Update a Plan Group",
      "value": "update",
      "action": "Update a plan group",
      "routing": {
        "request": {
          "url": "=/plan_groups/{{$parameter.planGroupUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "planGroup"
    },
    {
      "name": "Create a Source",
      "value": "create",
      "action": "Create a source",
      "routing": {
        "request": {
          "url": "/data_sources",
          "method": "POST"
        }
      },
      "resource": "source"
    },
    {
      "name": "List Sources",
      "value": "list",
      "action": "List all sources",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data_sources"
              }
            }
          ]
        },
        "request": {
          "url": "/data_sources",
          "method": "GET"
        }
      },
      "resource": "source"
    },
    {
      "name": "Retrieve a Source",
      "value": "get",
      "action": "Retrieve a source",
      "routing": {
        "request": {
          "url": "=/data_sources/{{$parameter.dataSourceUUID}}",
          "method": "GET"
        }
      },
      "resource": "source"
    },
    {
      "name": "Delete a Source",
      "value": "delete",
      "action": "Delete a source",
      "routing": {
        "request": {
          "url": "=/data_sources/{{$parameter.dataSourceUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "source"
    },
    {
      "name": "List Customer's Subscriptions",
      "value": "list",
      "action": "List subscriptions for a customer",
      "routing": {
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/subscriptions",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "subscription"
    },
    {
      "name": "Connect Subscriptions",
      "value": "connect",
      "action": "Connect subscriptions of a customer",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "set",
              "properties": {
                "value": "={{ { connected: true } }}"
              }
            }
          ]
        },
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/connect_subscriptions",
          "method": "POST"
        }
      },
      "resource": "subscription"
    },
    {
      "name": "Disconnect Subscriptions",
      "value": "disconnect",
      "action": "Disconnect subscriptions of a customer",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "set",
              "properties": {
                "value": "={{ { disconnected: true } }}"
              }
            }
          ]
        },
        "request": {
          "url": "=/customers/{{$parameter.customerUUID}}/disconnect_subscriptions",
          "method": "POST"
        }
      },
      "resource": "subscription"
    },
    {
      "name": "Create a Task",
      "value": "create",
      "action": "Create a task",
      "routing": {
        "request": {
          "url": "/tasks",
          "method": "POST"
        }
      },
      "resource": "task"
    },
    {
      "name": "Delete a Task",
      "value": "delete",
      "action": "Delete a task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "task"
    },
    {
      "name": "List Tasks",
      "value": "list",
      "action": "List tasks",
      "routing": {
        "request": {
          "qs": {
            "assignee": "={{$parameter.filterOptions?.assignee || undefined}}",
            "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
            "completed": "={{$parameter.filterOptions?.completed || undefined}}",
            "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
            "due_date_on_or_after": "={{$parameter.filterOptions?.due_date_on_or_after || undefined}}",
            "due_date_on_or_before": "={{$parameter.filterOptions?.due_date_on_or_before || undefined}}"
          },
          "url": "/tasks",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "cursor": "={{$response.body.cursor}}",
                  "assignee": "={{$parameter.filterOptions?.assignee || undefined}}",
                  "per_page": "={{$parameter.returnAll ? 200 : ($parameter.limit ?? 50)}}",
                  "completed": "={{$parameter.filterOptions?.completed || undefined}}",
                  "customer_uuid": "={{$parameter.filterOptions?.customerUUID || undefined}}",
                  "due_date_on_or_after": "={{$parameter.filterOptions?.due_date_on_or_after || undefined}}",
                  "due_date_on_or_before": "={{$parameter.filterOptions?.due_date_on_or_before || undefined}}"
                }
              },
              "continue": "={{ $response.body.has_more === true }}"
            }
          }
        }
      },
      "resource": "task"
    },
    {
      "name": "Retrieve a Task",
      "value": "get",
      "action": "Retrieve a task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskUUID}}",
          "method": "GET"
        }
      },
      "resource": "task"
    },
    {
      "name": "Update a Task",
      "value": "update",
      "action": "Update a task",
      "routing": {
        "request": {
          "url": "=/tasks/{{$parameter.taskUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "task"
    },
    {
      "name": "Create a Transaction",
      "value": "create",
      "action": "Create a transaction",
      "routing": {
        "request": {
          "url": "=/import/invoices/{{$parameter.invoiceUUID}}/transactions",
          "method": "POST"
        }
      },
      "resource": "transaction"
    },
    {
      "name": "Delete a Transaction",
      "value": "delete",
      "action": "Delete a transaction",
      "routing": {
        "request": {
          "url": "=/transactions/{{$parameter.transactionUUID}}",
          "method": "DELETE"
        }
      },
      "resource": "transaction"
    },
    {
      "name": "Disable a Transaction",
      "value": "disable",
      "action": "Disable a transaction",
      "routing": {
        "request": {
          "url": "=/transactions/{{$parameter.transactionUUID}}/disabled_state",
          "method": "PATCH"
        }
      },
      "resource": "transaction"
    },
    {
      "name": "Retrieve a Transaction",
      "value": "get",
      "action": "Retrieve a transaction",
      "routing": {
        "request": {
          "url": "=/transactions/{{$parameter.transactionUUID}}",
          "method": "GET"
        }
      },
      "resource": "transaction"
    },
    {
      "name": "Update a Transaction",
      "value": "update",
      "action": "Update a transaction",
      "routing": {
        "request": {
          "url": "=/transactions/{{$parameter.transactionUUID}}",
          "method": "PATCH"
        }
      },
      "resource": "transaction"
    }
  ]

npm_readme:
  # n8n-nodes-chartmogul

  This is an n8n community node. It lets you interact with the ChartMogul API in your n8n workflows. 

  [ChartMogul](https://www.chartmogul.com/) is a subscription analytics platform that helps SaaS (Software-as-a-Service) and recurring revenue businesses understand, measure, and grow their revenue. ChartMogul CRM is a customer relationship management platform built specifically for B2B SaaS companies that unifies sales pipeline tracking with subscription analytics, enabling teams to manage leads, opportunities, and recurring revenue in a single integrated system.

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

  ## Installation
  ### Community Nodes (Recommended)
  1. Go to **Settings > Community Nodes**.
  2. Select **Install**.
  3. Enter `n8n-nodes-chartmogul` in **Enter npm package name**.
  4. Agree to the [risks](https://docs.n8n.io/integrations/community-nodes/risks/) of using community nodes: select **I understand the risks of installing unverified code from a public source**.
  5. Select **Install**.

  After installing the node, you can use it like any other node. n8n displays the node in search results in the **Nodes** panel.

  ## Operations

  As of **v3**, the node provides full coverage of the publicly documented ChartMogul API ([dev.chartmogul.com](https://dev.chartmogul.com/)), grouped into the resources below. Each resource exposes its standard create / retrieve / list / update / delete operations where the API supports them.

  **CRM**
  - **Account** — Get account details
  - **Customer** — Create, Retrieve, List, List by email, Update, Delete, Merge, Unmerge, Add a contact, List a customer's activities, List a customer's invoices
  - **Contact** — Create, Retrieve, List, Update, Delete
  - **Enrichment** — Add/remove custom attributes (by UUID or email), Add/remove tags (by UUID or email), Retrieve tags and attributes
  - **Note and Call Log** — Create, Retrieve, List, Update, Delete
  - **Opportunity** — Create, Retrieve, List, Update, Delete
  - **Task** — Create, Retrieve, List, Update, Delete
  - **Activity** — List activities, Create an activities export, Retrieve an activities export

  **Subscription & billing data**
  - **Source** — Create, Retrieve, List, Delete
  - **Plan** — Create, Retrieve, List, Update, Delete
  - **Plan Group** — Create, Retrieve, List, Update, Delete, List plans in a group
  - **Customer Subscription** — List, Connect, Disconnect
  - **Invoice** — Create, Retrieve, List, Update, Update status, Disable, Delete, Delete all of a customer
  - **Line Item** — Create, Retrieve, Update, Disable, Delete
  - **Transaction** — Create, Retrieve, Update, Disable, Delete
  - **Subscription Event** — Create, List, Update, Disable, Delete

  **Metrics**
  - **Metric** — All key metrics, MRR, ARR, ARPA, ASP, Customer count, Customer churn rate, MRR churn rate, LTV

  List operations support **Return All** (auto-paginates through every page) or a **Limit** to cap results.

  ## Credentials

  You need to have a ChartMogul account to interact with this node.

  In ChartMogul, create an API key by navigating to **Profile > View Profile > API keys**. Then:
  1. Click **Add API Key**.
  2. Enter a unique name for the key in the **Name** field.
  3. A **Read & Write** key is required for this node.
  4. Click **Add** to create the key.
  5. Copy your newly created key and create a ChartMogul credential in N8N
  <img width="776" height="370" alt="image" src="https://github.com/user-attachments/assets/6443c18e-fe9e-4146-a3e1-b4e62862b774" />

  ## Compatibility

  This node was developed and tested using N8N version 1.116.2.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [ChartMogul Help Center](https://help.chartmogul.com)
  * [ChartMogul Developer Reference](https://dev.chartmogul.com)
    
  ## Versioning

  This node implements n8n's versioning system to support future updates while maintaining backwards compatibility. The current node version is **v3**.

  For detailed information about the versioning structure and how to add new versions, see [VERSIONING.md](VERSIONING.md).

  ## Version history

  **v3.0.0** (Current)
  - Rewritten as a declarative node for faster, more maintainable API coverage
  - Full coverage of the documented ChartMogul API across all resources (Account, Activity, Contact, Customer, Enrichment, Note and Call Log, Opportunity, Task, Source, Plan, Plan Group, Customer Subscription, Invoice, Line Item, Transaction, Subscription Event, Metrics)
  - Cursor-based pagination on list operations via **Return All** / **Limit**
  - Published as a verified community node via GitHub Actions with npm provenance
  - **Breaking:** operation and parameter names were reorganized — workflows built on v1 may need to be updated

  **v1.0.4**
  - Implemented full versioning structure
  - Reorganized codebase with v1 directory for future version support

  **v1.0.0**
  - Initial Release

ai_documentation_summary:
  {"purpose":"This n8n community node enables workflow automation by interacting with the ChartMogul API for SaaS subscription analytics and CRM management.","capabilities":["Retrieve and manage customer data","Access contact information","Perform data enrichment with custom attributes and tags","Manage notes and call logs","Track and manage sales opportunities","Create and assign tasks"],"authentication":"API Key (Read & Write required)","commonUseCases":["Automating SaaS revenue tracking workflows","Syncing customer data between ChartMogul and other tools","Enriching lead records with custom attributes","Automating sales pipeline management"],"limitations":["Limited to ChartMogul CRM endpoints (not all ChartMogul API features)","Community node status may lack official support","Requires a paid ChartMogul account with API key access"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: n8n-nodes-avatartalk.avatarTalk
package_name: n8n-nodes-avatartalk
display_name: AvatarTalk
description: Generate AI avatar videos using AvatarTalk API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: avatartalk
author_github_url: https://github.com/avatartalk-ai/
npm_package_name: n8n-nodes-avatartalk
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:33.458Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "hidden",
      "default": "video",
      "options": [
        {
          "name": "Video",
          "value": "video"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "standard",
      "options": [
        {
          "name": "Standard Inference",
          "value": "standard",
          "action": "Generate video with standard inference",
          "description": "Generate avatar video immediately and return complete metadata"
        },
        {
          "name": "Streaming Inference",
          "value": "streaming",
          "action": "Generate video with streaming inference",
          "description": "Stream video chunks as they are generated in real-time"
        },
        {
          "name": "Delayed Inference",
          "value": "delayed",
          "action": "Generate video with delayed inference",
          "description": "Defer video processing until the URL is accessed"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Standard Inference",
      "value": "standard",
      "action": "Generate video with standard inference",
      "description": "Generate avatar video immediately and return complete metadata"
    },
    {
      "name": "Streaming Inference",
      "value": "streaming",
      "action": "Generate video with streaming inference",
      "description": "Stream video chunks as they are generated in real-time"
    },
    {
      "name": "Delayed Inference",
      "value": "delayed",
      "action": "Generate video with delayed inference",
      "description": "Defer video processing until the URL is accessed"
    }
  ]

npm_readme:
  # n8n-nodes-avatartalk

  This is an n8n community node. It lets you use AvatarTalk AI in your n8n workflows.

  AvatarTalk is an AI-powered service that generates realistic avatar videos with text-to-speech capabilities, supporting multiple languages, avatars, and emotions.

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

  ## Operations

  The AvatarTalk node supports three inference modes:

  - **Standard Inference** - Generate avatar video immediately and return complete metadata with the video URL
  - **Streaming Inference** - Stream video in real-time and return it as binary data in n8n
  - **Delayed Inference** - Defer video processing until the URL is accessed (lazy generation)

  ## Credentials

  To use this node, you need an AvatarTalk API key:

  1. Go to [https://avatartalk.ai](https://avatartalk.ai)
  2. Create an account or sign in
  3. Navigate to your dashboard
  4. Copy your API Key
  5. In n8n, create new AvatarTalk API credentials and paste your API key

  ## Compatibility

  This node is compatible with n8n version 1.0.0 and above. It has been tested with the latest n8n versions.

  ## Usage

  ### Choosing the Right Operation Mode

  The AvatarTalk node offers three different operation modes to suit different use cases:

  #### Standard Inference
  Use this mode when you need the video URL and metadata immediately. The API processes the video synchronously and returns a complete response with:
  - Video URL
  - Duration
  - File size
  - Other metadata

  Best for: Simple workflows where you need immediate results and don't need real-time streaming.

  #### Streaming Inference
  Use this mode for real-time video generation. The video is generated and streamed as it becomes available, and returned as binary data in n8n.

  The video file is stored in n8n's binary data format, making it available for:
  - Direct downloading from n8n
  - Further processing in subsequent workflow nodes
  - Storage to cloud services (S3, Google Drive, etc.)
  - Sending via email or webhooks

  Best for:
  - Workflows where you need to process or store the video file directly
  - Integration with other n8n nodes that work with binary data
  - Scenarios where you want the video content within your workflow rather than just a URL

  #### Delayed Inference
  Use this mode when you want to defer the actual video processing. The API returns a URL immediately, but the video is only generated when someone accesses that URL for the first time.

  Best for:
  - Generating many videos where not all will be viewed
  - Reducing API costs by only processing videos that are actually needed
  - Batch operations where immediate generation isn't required

  ### Avatar and Emotion Options

  The node supports 14 different avatar characters:
  - African Man, African Woman
  - Arab Man, Arab Woman
  - Colombian Woman
  - European Man, European Woman
  - Iranian Man
  - Japanese Man, Japanese Woman
  - Mexican Man, Mexican Woman
  - Old European Woman, Old Japanese Man

  Each avatar can express three emotions:
  - Happy
  - Neutral
  - Serious

  ### Language Support

  Specify a language code for speech synthesis. Supported languages include:
  - `en` - English
  - `es` - Spanish
  - `fr` - French
  - `de` - German
  - `ja` - Japanese
  - And many more

  Refer to the [AvatarTalk API documentation](https://github.com/avatartalk-ai/avatartalk-examples/blob/main/API.md) for the complete list of supported languages.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [AvatarTalk API documentation](https://github.com/avatartalk-ai/avatartalk-examples/blob/main/API.md)
  - [AvatarTalk website](https://avatartalk.ai)

ai_documentation_summary:
  {"purpose":"Generates AI avatar videos with text-to-speech capabilities using the AvatarTalk API, supporting multiple languages, avatars, and emotions.","capabilities":["Standard inference mode for immediate video URL and metadata","Streaming inference mode for real-time binary video data","Delayed inference mode for lazy video generation","Support for 14 diverse avatar characters","Support for 3 emotion expressions (Happy, Neutral, Serious)","Multi-language text-to-speech synthesis","Video metadata extraction (duration, file size)","Binary video data handling for downstream processing"],"authentication":"API key required","commonUseCases":["Automated video content generation for marketing","Real-time video streaming workflows","Cost-efficient batch video generation","Multi-language video localization","Video asset integration with other n8n nodes"],"limitations":["Requires external API key from AvatarTalk service","Delayed inference only generates video upon first URL access","Streaming mode returns binary data rather than direct URL"],"relatedNodes":["HTTP Request","Binary File","Code","HTTP Response"]}


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

updated_at: 2026-07-14 14:40:33
author_name: zachperigon
author_github_url: https://github.com/goperigon/n8n-nodes-perigon.git
npm_package_name: @goperigon/n8n-nodes-perigon
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:33.463Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "articles",
      "options": [
        {
          "name": "Article",
          "value": "articles",
          "description": "Search and filter news articles"
        },
        {
          "name": "Company",
          "value": "companies",
          "description": "Search for companies in the Perigon database"
        },
        {
          "name": "Journalist",
          "value": "journalists",
          "description": "Search journalists and reporters"
        },
        {
          "name": "Person",
          "value": "people",
          "description": "Search for public figures and newsworthy individuals"
        },
        {
          "name": "Source",
          "value": "sources",
          "description": "Search media sources and publications"
        },
        {
          "name": "Story",
          "value": "stories",
          "description": "Track evolving narratives and news story clusters"
        },
        {
          "name": "Summarize",
          "value": "summarize",
          "description": "Generate AI-powered summaries of search results"
        },
        {
          "name": "Topic",
          "value": "topics",
          "description": "Browse available topics"
        },
        {
          "name": "Wikipedia",
          "value": "wikipedia",
          "description": "Search Wikipedia articles"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search articles using keywords",
          "routing": {
            "request": {
              "url": "/articles/all",
              "method": "GET"
            }
          },
          "description": "Search articles using keyword queries with Boolean operators"
        },
        {
          "name": "Vector Search",
          "value": "vectorSearch",
          "action": "Search articles using vector similarity",
          "routing": {
            "request": {
              "url": "/vector/news/all",
              "method": "POST"
            }
          },
          "description": "Search articles using semantic similarity with natural language queries (best for LLM workflows)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "articles"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search news stories",
          "routing": {
            "request": {
              "url": "/stories/all",
              "method": "GET"
            }
          },
          "description": "Track evolving narratives and top news headlines with story clusters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "stories"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search people",
          "routing": {
            "request": {
              "url": "/people/all",
              "method": "GET"
            }
          },
          "description": "Search for public figures, politicians, celebrities, and newsworthy individuals"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "people"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search sources",
          "routing": {
            "request": {
              "url": "/sources/all",
              "method": "GET"
            }
          },
          "description": "Search and filter 142,000+ media sources available via the Perigon API"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sources"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Get by ID",
          "value": "getById",
          "action": "Get journalist by ID",
          "routing": {
            "request": {
              "url": "=/journalists/{{$parameter.journalistId}}",
              "method": "GET"
            }
          },
          "description": "Find additional details on a journalist by their unique ID"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search journalists",
          "routing": {
            "request": {
              "url": "/journalists/all",
              "method": "GET"
            }
          },
          "description": "Search 230,000+ journalists from around the world"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "journalists"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search companies",
          "routing": {
            "request": {
              "url": "/companies/all",
              "method": "GET"
            }
          },
          "description": "Browse or search for companies Perigon tracks by name, domain, ticker, and more"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "companies"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search topics",
          "routing": {
            "request": {
              "url": "/topics/all",
              "method": "GET"
            }
          },
          "description": "Search through all available topics in the Perigon database"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "topics"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search wikipedia using keywords",
          "routing": {
            "request": {
              "url": "/wikipedia/all",
              "method": "GET"
            }
          },
          "description": "Search Wikipedia articles using keyword queries with Boolean operators"
        },
        {
          "name": "Vector Search",
          "value": "vectorSearch",
          "action": "Search wikipedia using vector similarity",
          "routing": {
            "request": {
              "url": "/vector/wikipedia/all",
              "method": "POST"
            }
          },
          "description": "Search Wikipedia articles using semantic similarity with natural language queries (best for LLM workflows)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "wikipedia"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "summarize",
      "options": [
        {
          "name": "Summarize",
          "value": "summarize",
          "action": "Summarize search results",
          "routing": {
            "request": {
              "url": "/summarize",
              "method": "POST"
            }
          },
          "description": "Produce a concise AI-powered summary over articles matching your filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "summarize"
          ]
        }
      },
      "credentialTypes": [
        "has:authenticate"
      ],
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Search",
      "value": "search",
      "action": "Search articles using keywords",
      "routing": {
        "request": {
          "url": "/articles/all",
          "method": "GET"
        }
      },
      "description": "Search articles using keyword queries with Boolean operators",
      "resource": "articles"
    },
    {
      "name": "Vector Search",
      "value": "vectorSearch",
      "action": "Search articles using vector similarity",
      "routing": {
        "request": {
          "url": "/vector/news/all",
          "method": "POST"
        }
      },
      "description": "Search articles using semantic similarity with natural language queries (best for LLM workflows)",
      "resource": "articles"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search news stories",
      "routing": {
        "request": {
          "url": "/stories/all",
          "method": "GET"
        }
      },
      "description": "Track evolving narratives and top news headlines with story clusters",
      "resource": "stories"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search people",
      "routing": {
        "request": {
          "url": "/people/all",
          "method": "GET"
        }
      },
      "description": "Search for public figures, politicians, celebrities, and newsworthy individuals",
      "resource": "people"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search sources",
      "routing": {
        "request": {
          "url": "/sources/all",
          "method": "GET"
        }
      },
      "description": "Search and filter 142,000+ media sources available via the Perigon API",
      "resource": "sources"
    },
    {
      "name": "Get by ID",
      "value": "getById",
      "action": "Get journalist by ID",
      "routing": {
        "request": {
          "url": "=/journalists/{{$parameter.journalistId}}",
          "method": "GET"
        }
      },
      "description": "Find additional details on a journalist by their unique ID",
      "resource": "journalists"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search journalists",
      "routing": {
        "request": {
          "url": "/journalists/all",
          "method": "GET"
        }
      },
      "description": "Search 230,000+ journalists from around the world",
      "resource": "journalists"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search companies",
      "routing": {
        "request": {
          "url": "/companies/all",
          "method": "GET"
        }
      },
      "description": "Browse or search for companies Perigon tracks by name, domain, ticker, and more",
      "resource": "companies"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search topics",
      "routing": {
        "request": {
          "url": "/topics/all",
          "method": "GET"
        }
      },
      "description": "Search through all available topics in the Perigon database",
      "resource": "topics"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search wikipedia using keywords",
      "routing": {
        "request": {
          "url": "/wikipedia/all",
          "method": "GET"
        }
      },
      "description": "Search Wikipedia articles using keyword queries with Boolean operators",
      "resource": "wikipedia"
    },
    {
      "name": "Vector Search",
      "value": "vectorSearch",
      "action": "Search wikipedia using vector similarity",
      "routing": {
        "request": {
          "url": "/vector/wikipedia/all",
          "method": "POST"
        }
      },
      "description": "Search Wikipedia articles using semantic similarity with natural language queries (best for LLM workflows)",
      "resource": "wikipedia"
    },
    {
      "name": "Summarize",
      "value": "summarize",
      "action": "Summarize search results",
      "routing": {
        "request": {
          "url": "/summarize",
          "method": "POST"
        }
      },
      "description": "Produce a concise AI-powered summary over articles matching your filters",
      "resource": "summarize"
    }
  ]

npm_readme:
  # n8n-nodes-perigon

  This is the official n8n community node for the Perigon API. It provides comprehensive access to news intelligence APIs, including news articles, story clusters, companies, public figures, journalists, media sources, topics, Wikipedia data, and AI-powered summarization capabilities.

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

  [Perigon](https://www.perigon.io/) provides contextual news intelligence APIs trusted by leading organizations for real-time news monitoring, media analysis, and AI-powered insights.

  ## Installation

  Follow these steps to install this node in your n8n instance:

  1. Go to **Settings > Community Nodes**
  2. Select **Install Another Node**
  3. Enter `@goperigon/n8n-nodes-perigon`
  4. Click **Install**

  Alternatively, you can install it using npm:

  ```bash
  npm install @goperigon/n8n-nodes-perigon
  ```

  ## Documentation

  For complete documentation about the Perigon API and its capabilities, visit:

  - **[API Documentation](https://perigon.io/docs)** - Comprehensive guides and tutorials
  - **[API Reference](https://perigon.io/reference)** - Detailed endpoint documentation
  - **[Perigon Website](https://www.perigon.io/)** - Product information and use cases

  ## Credentials

  To use this node, you need a Perigon API key.

  ### Getting Your API Key

  1. Visit [Perigon's website](https://www.perigon.io)
  2. Sign up for an account or log in
  3. Navigate to your dashboard to retrieve your API key

  ### Adding Credentials to n8n

  1. In n8n, go to **Credentials > New Credential**
  2. Search for "Perigon API"
  3. Enter your API key
  4. Save the credential

  Your credentials will be securely stored and automatically used for all Perigon node operations.

  ## Resources and Operations

  The Perigon node supports the following resources:

  ### 📰 Article

  Search and filter news articles from over 140,000 sources worldwide with comprehensive filtering capabilities.

  **Operations:**

  - **Search**: Keyword-based article search with advanced Boolean operators (AND, OR, NOT)
  - **Vector Search**: Semantic similarity search using natural language queries (optimized for AI and LLM workflows)

  **Key Features:**

  - **Query Filtering**: Full Boolean operator support with exact phrase matching using quotes
  - **Content Filtering**: Search within article titles, descriptions, and full content
  - **Categorical Filtering**: Filter by categories (Tech, Business, Politics, etc.) and granular topics
  - **Geographic Filtering**: Filter by country, state, or city
  - **Temporal Filtering**: Date range filtering with `from` and `to` parameters
  - **Source Filtering**: Filter by specific publisher domains (supports wildcards)
  - **Language Support**: Multi-language article filtering
  - **Sorting Options**: Sort by date, relevance, publication date, refresh date, or add date
  - **Pagination**: Retrieve up to 1,000 results per page with 0-based pagination
  - **Result Count**: Optional total result count display

  **Common Use Cases:**

  - Real-time news monitoring and alerting
  - Media analysis and trend detection
  - Competitive intelligence gathering
  - Content aggregation for research
  - AI-powered news summarization pipelines

  ### 📚 Story

  Track evolving news narratives through automatically clustered headlines from multiple sources.

  **Operations:**

  - **Search**: Discover and monitor story clusters to understand how news narratives develop over time

  **Key Features:**

  - **Query Filtering**: Search within story names, summaries, and key points using Boolean operators
  - **Cluster Configuration**: Set minimum cluster size and required number of unique sources
  - **Categorical Filtering**: Filter by categories, countries, and topics
  - **Temporal Filtering**: Date range filtering to track story evolution
  - **Source Filtering**: Filter by specific publisher domains
  - **Sorting Options**: Sort by article count, creation date, relevance, total count, or last update
  - **Pagination**: Navigate through results with configurable page size
  - **Result Count**: Optional display of total matching stories

  **Common Use Cases:**

  - Breaking news monitoring and narrative tracking
  - Understanding media coverage patterns across sources
  - Crisis communications and reputation management
  - Competitive intelligence on industry developments
  - Research on how stories evolve in the media

  ### 🌐 Wikipedia

  Search and analyze Wikipedia articles with advanced filtering and semantic capabilities.

  **Operations:**

  - **Search**: Keyword-based Wikipedia search with Boolean operators
  - **Vector Search**: Semantic similarity search using natural language queries

  **Key Features:**

  - **Multi-Field Search**: Search across article queries, titles, summaries, full text, and references
  - **Category Filtering**: Filter by Wikipedia categories
  - **Wikidata Integration**: Filter by Wikidata entity IDs and instance types
  - **Popularity Metrics**: Filter by page view statistics (minimum and maximum)
  - **Wiki Project Filtering**: Filter by wiki codes (currently supports English Wikipedia - `enwiki`)
  - **Sorting Options**: Sort by relevance, creation date, or last update date
  - **Pagination**: Navigate results with configurable page size
  - **Pageview Statistics**: Option to include only pages with viewership data

  **Common Use Cases:**

  - Knowledge base enrichment and fact-checking
  - Entity disambiguation and research
  - Background information gathering for news stories
  - Educational content creation
  - Semantic search for related topics and concepts

  ### 👤 Person

  Search for public figures, politicians, celebrities, business leaders, and other newsworthy individuals.

  **Operations:**

  - **Search**: Discover people by name, occupation, or unique identifiers

  **Key Features:**

  - **Name Search**: Search by person name with full Boolean operator support and wildcards
  - **Occupation Filtering**: Filter by occupation label (e.g., "politician", "CEO", "actor") or Wikidata occupation IDs
  - **Wikidata Integration**: Filter by Wikidata entity IDs for precise identification
  - **Pagination**: Navigate results with configurable page size

  **Common Use Cases:**

  - Media monitoring for specific individuals
  - Building contact databases for PR and outreach
  - Research on public figures and their activities
  - Identifying experts and thought leaders in specific fields
  - Enriching CRM data with public figure information

  ### 🏢 Company

  Search and discover companies with detailed business information and filtering options.

  **Operations:**

  - **Search**: Find companies by name, domain, ticker symbol, industry, and various business attributes

  **Key Features:**

  - **Query Search**: Search across company names, alternative names, domains, and ticker symbols
  - **Name-Specific Search**: Direct filtering by company name with Boolean operator support
  - **Geographic Filtering**: Filter by headquarters country
  - **Domain Filtering**: Filter by company website domains
  - **Stock Market Data**: Filter by stock exchange (NASDAQ, NYSE, etc.) and ticker symbols
  - **Industry Classification**: Filter by industry and sector with Boolean operators
  - **Company Size**: Filter by employee count ranges
  - **Direct ID Lookup**: Filter by specific company IDs
  - **Pagination**: Navigate results with configurable page size

  **Common Use Cases:**

  - Competitive intelligence and market research
  - Lead generation and prospecting
  - Investment research and due diligence
  - Building company databases for sales and marketing
  - Monitoring industry trends and company developments

  ### ✍️ Journalist

  Search through over 230,000 journalists and reporters from around the world.

  **Operations:**

  - **Search**: Find journalists by name, publication, coverage area, or activity level
  - **Get by ID**: Retrieve comprehensive details about a specific journalist using their unique identifier

  **Key Features:**

  - **Query Search**: Search across journalist names, titles, and Twitter biographies with Boolean operators
  - **Name-Specific Search**: Direct filtering by journalist name
  - **Coverage Filtering**: Filter by categories (Tech, Business, Politics, etc.) and granular topics
  - **Geographic Focus**: Filter by countries they commonly cover in their reporting
  - **Publication Filtering**: Filter by publisher domains and news sources
  - **Activity Metrics**: Filter by monthly posting activity (minimum and maximum thresholds)
  - **Direct ID Lookup**: Find specific journalists by their unique IDs
  - **Result Count**: Optional display of total matching journalists
  - **Pagination**: Navigate results with configurable page size (up to 1,000 per page)

  **Common Use Cases:**

  - Building media lists and PR contact databases
  - Finding subject matter experts for interviews
  - Monitoring journalist coverage and beats
  - Analyzing media landscape and journalist activity
  - Targeted outreach for press releases and stories

  ### 📡 Source

  Discover and analyze over 140,000 media sources and publications worldwide.

  **Operations:**

  - **Search**: Search and filter news sources with comprehensive criteria

  **Key Features:**

  - **Name Search**: Search by source name with full Boolean operator support
  - **Domain Filtering**: Filter by publisher domains with wildcard support (e.g., `*.cnn.com`)
  - **Category Filtering**: Filter by primary content categories
  - **Geographic Filtering**: Filter by country coverage
  - **Traffic Metrics**: Filter by monthly visit ranges (minimum and maximum)
  - **Paywall Status**: Filter sources by paywall presence
  - **Source Groups**: Filter by predefined publisher bundles (e.g., "top100")
  - **Sorting Options**: Sort by relevance, global rank, monthly visits, or average monthly posts
  - **Result Count**: Optional display of total matching sources
  - **Pagination**: Navigate results with configurable page size

  **Common Use Cases:**

  - Building media monitoring source lists
  - Analyzing media landscape and publication reach
  - Identifying authoritative sources for specific topics
  - Filtering sources by audience size and engagement
  - Creating custom news feeds from trusted publications

  ### 🏷️ Topic

  Browse and discover topics available in the Perigon database for precise content filtering.

  **Operations:**

  - **Search**: Search through all available topics with hierarchical filtering

  **Key Features:**

  - **Name Search**: Search topics by exact name or partial text match
  - **Category Filtering**: Filter topics by broad article categories (Tech, Business, Politics, etc.)
  - **Subcategory Filtering**: Filter by specific subcategories for granular topic discovery
  - **Pagination**: Navigate results with configurable page size

  **Common Use Cases:**

  - Discovering available topics for content filtering
  - Understanding topic taxonomy and structure
  - Building topic-based content categorization systems
  - Exploring related topics within categories
  - Creating targeted news feeds by topic

  ### 🤖 Summarize

  Generate AI-powered summaries of news articles using state-of-the-art language models.

  **Operations:**

  - **Summarize**: Produce intelligent, concise summaries from articles matching your search criteria

  **Key Features:**

  - **Query Filtering**: Filter articles using Boolean operators before summarization
  - **Custom Prompts**: Provide detailed instructions (up to 2,048 characters) to guide summary generation
  - **Model Selection**: Choose from multiple leading AI models:
    - GPT-4.1, GPT-4.1 Mini, GPT-4.1 Nano
    - GPT-4o, GPT-4o Mini
    - Llama 3.3 70B Versatile
    - DeepSeek R1 Distill Llama 70B
  - **Article Limits**: Control the number of articles to include (max 100) and return
  - **Summarization Methods**:
    - **ARTICLES**: Include all matching articles
    - **CLUSTERS**: Select one representative article per story cluster
  - **Field Selection**: Choose which article fields to summarize (title, content, summary)
  - **Token Control**: Set maximum token limits for generated summaries
  - **Article Filtering**: Apply all standard filters (category, country, source, date range)

  **Common Use Cases:**

  - Automated news briefings and digests
  - Competitive intelligence reports
  - Market research summaries
  - Crisis monitoring and alerts
  - Content curation for newsletters
  - AI-powered research assistance

  ## Example Usage

  ### Search Recent Tech News

  1. Add the Perigon node to your workflow
  2. Select **Article** as the resource
  3. Select **Search** as the operation
  4. Enter your search query: `"artificial intelligence" AND technology`
  5. In Additional Options:
     - Category: `Tech`
     - From Date: `2024-01-01`
     - Size: `20`
  6. Run the workflow

  ### Find News Stories About Climate Change

  1. Add the Perigon node
  2. Select **Story** as the resource
  3. Select **Search** as the operation
  4. Enter query: `climate change`
  5. Set minimum unique sources: `3`
  6. Run the workflow

  ### Search for Journalists Covering Finance

  1. Add the Perigon node
  2. Select **Journalist** as the resource
  3. Select **Search** as the operation
  4. Enter query: `finance`
  5. In Additional Options:
     - Category: `Business,Finance`
     - Min Monthly Posts: `10`
  6. Run the workflow

  ### Semantic Search for Similar Articles (LLM Workflows)

  1. Add the Perigon node
  2. Select **Article** as the resource
  3. Select **Vector Search** as the operation
  4. Enter natural language query: `Articles about renewable energy innovations and their impact on climate policy`
  5. Set size to desired number of results
  6. Run the workflow

  ### Generate AI Summary of News

  1. Add the Perigon node
  2. Select **Summarize** as the resource
  3. Select **Summarize** as the operation
  4. Enter query: `electric vehicles`
  5. Customize the prompt field with your summary instructions
  6. In Additional Options:
     - Category: `Tech,Business`
     - Max Article Count: `20`
     - Model: `gpt-4.1`
  7. Run the workflow

  ### Search Companies by Industry

  1. Add the Perigon node
  2. Select **Company** as the resource
  3. Select **Search** as the operation
  4. Enter query: `Tesla OR Apple OR Microsoft`
  5. In Additional Options:
     - Industry: `Technology OR Auto Manufacturers`
     - Num Employees From: `1000`
  6. Run the workflow

  ### Find Journalist Contacts for PR Campaign

  1. Add the Perigon node
  2. Select **Journalist** as the resource
  3. Select **Search** as the operation
  4. Enter query: `technology reporter`
  5. In Additional Options:
     - Category: `Tech`
     - Min Monthly Posts: `5`
     - Source: `techcrunch.com,theverge.com,wired.com`
  6. Run the workflow

  ### Get Detailed Journalist Information

  1. Add the Perigon node
  2. Select **Journalist** as the resource
  3. Select **Get by ID** as the operation
  4. Enter the journalist ID (obtained from a previous search)
  5. Run the workflow to retrieve full profile details

  ## AI Agent Compatibility

  This node is compatible with n8n's AI agent functionality (`usableAsTool: true`), allowing it to be used as a tool within AI agent workflows. This enables:

  - Dynamic news retrieval based on agent decisions
  - Automated research and fact-checking
  - Context-aware content generation
  - Multi-step information gathering workflows

  ## Advanced Features

  ### Boolean Search Syntax

  Many search fields support advanced Boolean operators for precise querying:

  - **AND**: Both terms must be present (e.g., `climate AND policy`)
  - **OR**: Either term can be present (e.g., `Biden OR Trump`)
  - **NOT**: Exclude terms (e.g., `energy NOT fossil`)
  - **Wildcards**: Use `*` for multiple characters, `?` for single character (e.g., `climat*`, `wom?n`)
  - **Grouping**: Use parentheses to group terms (e.g., `(renewable OR clean) AND energy`)
  - **Exact Phrases**: Use double quotes for exact matching (e.g., `"climate change"`)

  **Example Complex Query:**

  ```
  ("artificial intelligence" OR AI OR "machine learning") AND (healthcare OR medical) NOT cryptocurrency
  ```

  ### Semantic Vector Search

  Both Article and Wikipedia resources support vector search for semantic similarity matching:

  - Use natural language queries instead of keywords
  - Find conceptually related content even without exact keyword matches
  - Ideal for AI/LLM workflows and exploratory research
  - Better results for complex, multi-faceted queries

  ## Resources

  - **[Perigon Website](https://www.perigon.io/)** - Product information and pricing
  - **[API Documentation](https://www.perigon.io/docs)** - Complete API guides
  - **[API Reference](https://www.perigon.io/reference)** - Endpoint documentation
  - **[n8n Documentation](https://docs.n8n.io/)** - Learn about n8n workflows
  - **[Community Nodes](https://docs.n8n.io/integrations/community-nodes/)** - n8n community node information

  ## Support

  For issues, questions, or feature requests:

  - **GitHub Issues**: [Report bugs or request features](https://github.com/goperigon/n8n-nodes-perigon/issues)
  - **Perigon Support**: Contact support@perigon.io
  - **n8n Community**: [Join the n8n community](https://community.n8n.io/)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows to interact with the Perigon API for accessing news intelligence, including articles, story clusters, Wikipedia data, and public figures.","capabilities":["Search and filter news articles from 140,000+ sources","Vector search for semantic similarity on news articles","Track evolving news narratives through story clusters","Search and analyze Wikipedia articles","Search for public figures, politicians, and celebrities","AI-powered summarization capabilities","Boolean operator support (AND, OR, NOT)","Advanced filtering by category, geography, language, and source","Temporal filtering with date ranges","Pagination support"],"authentication":"API key required","commonUseCases":["Real-time news monitoring and alerting","Media analysis and trend detection","Competitive intelligence gathering","Crisis communications and reputation management","Knowledge base enrichment and fact-checking"],"limitations":[],"relatedNodes":["n8n HTTP Request","n8n Webhook","n8n Code"]}


