# nodes

node_type: @conciso/n8n-nodes-confluence-cloud.confluencecloud
package_name: @conciso/n8n-nodes-confluence-cloud
display_name: confluencecloud
description: n8n node for Confluence Cloud REST API integration
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: npm_conciso_thorsten
author_github_url: git+https://github.com/conciso/n8n-nodes-confluence-cloud.git
npm_package_name: @conciso/n8n-nodes-confluence-cloud
npm_version: 1.3.1
community_fetched_at: 2026-07-14T14:40:36.025Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  # 🚀 n8n-nodes-confluence-cloud

  A powerful n8n Community Node for seamless integration with Confluence Cloud REST API. This node provides comprehensive access to Confluence Cloud's capabilities with automatic API validation, deprecation detection, and intelligent error handling.

  [![npm version](https://img.shields.io/npm/v/@conciso/n8n-nodes-confluence-cloud.svg)](https://www.npmjs.com/package/@conciso/n8n-nodes-confluence-cloud)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

  ## ✨ Features

  ### 🔄 **Confluence Cloud Node**
  - **Spaces Management**: Create, read, update, and delete Confluence spaces
  - **Pages Management**: Full CRUD operations for Confluence pages
  - **Automatic API Version Detection**: Seamlessly uses V2 API with V1 fallback for legacy operations
  - **Built-in Error Handling**: Comprehensive error messages with actionable solutions
  - **OpenAPI-Generated**: Automatically generated from official Confluence API specifications

  ### 🛡️ **Quality Assurance**
  - **Deprecated API Detection**: Build fails if deprecated APIs are detected
  - **Missing Route Validation**: Automatic validation of API route configurations
  - **Professional Error Messages**: Clear, actionable error messages with documentation links

  ## 📦 Installation

  Install the node using n8n's Community Nodes feature:

  1. **Via n8n Interface:**
     - Go to **Settings** → **Community Nodes**
     - Install package: `@conciso/n8n-nodes-confluence-cloud`

  2. **Via npm (for self-hosted n8n):**
     ```bash
     npm install @conciso/n8n-nodes-confluence-cloud
     ```

  For detailed installation instructions, see the [n8n Community Nodes documentation](https://docs.n8n.io/integrations/community-nodes/installation/).

  ## 🔐 Credentials Setup

  ### Required Credentials

  Create a **Confluence Cloud API** credential with:

  | Field | Description | Example |
  |-------|-------------|---------|
  | **Domain** | Your Confluence Cloud URL | `https://your-company.atlassian.net` |
  | **Email** | Your Atlassian account email | `user@company.com` |
  | **API Token** | Generated API token | `ATATT3xFfGF0T...` |

  ### 🔑 Creating an API Token

  1. Go to [Atlassian Account Security](https://id.atlassian.com/manage-profile/security/api-tokens)
  2. Click **"Create API token"**
  3. Enter a label (e.g., "n8n Integration")
  4. Copy the generated token (⚠️ **Save it immediately - you won't see it again!**)

  ## 🏗️ Supported Operations

  ### 📁 **Space Operations**

  | Operation | Method | API Version | Documentation |
  |-----------|--------|-------------|---------------|
  | **Get Spaces** | `GET /spaces` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-space/#api--spaces-get) |
  | **Get Space By Id** | `GET /spaces/{id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-space/#api--spaces-id-get) |
  | **Create Space** | `POST /space` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/api-group-space/#api--space-post) |
  | **Update Space** | `PUT /space/{spaceKey}` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/api-group-space/#api--space-spaceKey-put) |
  | **Delete Space** | `DELETE /space/{spaceKey}` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/api-group-space/#api--space-spaceKey-delete) |

  ### 📄 **Page Operations**

  | Operation | Method | API Version | Documentation |
  |-----------|--------|-------------|---------------|
  | **Get Pages** | `GET /pages` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-get) |
  | **Create Page** | `POST /pages` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-post) |
  | **Get Page By Id** | `GET /pages/{id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-id-get) |
  | **Update Page** | `PUT /pages/{id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-id-put) |
  | **Delete Page** | `DELETE /pages/{id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-id-delete) |
  | **Get Pages In Space** | `GET /spaces/{id}/pages` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-space/#api--spaces-id-pages-get) |
  | **Get Label Pages** | `GET /labels/{id}/pages` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--labels-id-pages-get) |

  ### 📄 **Template Operations**

  | Operation | Method | API Version | Documentation |
  |-----------|--------|-------------|---------------|
  | **Get Content Templates** | `GET /template/page` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/intro/#api--template-page-get) |
  | **Get Blueprint Templates** | `GET /template/blueprint` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/intro/#api--template-blueprint-get) |
  | **Create Content Template** | `POST /template` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/intro/#api--template-post) |
  | **Update Content Template** | `PUT /template` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/intro/#api--template-put) |
  | **Get Content Template** | `GET /template/{contentTemplateId}` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/intro/#api--template-contentTemplateId-get) |
  | **Remove Template** | `DELETE /template/{contentTemplateId}` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/intro/#api--template-contentTemplateId-delete) |

  ### 📄 **Search Operations**

  | Operation | Method | API Version | Documentation |
  |-----------|--------|-------------|---------------|
  | **Search Content By C Q L** | `GET /content/search` | V1 (Legacy) | [📖 V1 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v1/api-group-content/#api--content-search-get) |

  ### 📄 **Comment Operations**

  | Operation | Method | API Version | Documentation |
  |-----------|--------|-------------|---------------|
  | **Get Page Footer Comments** | `GET /pages/{id}/footer-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-id-footer-comments-get) |
  | **Get Page Inline Comments** | `GET /pages/{id}/inline-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-id-inline-comments-get) |
  | **Get Blog Post Footer Comments** | `GET /blogposts/{id}/footer-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--blogposts-id-footer-comments-get) |
  | **Get Blog Post Inline Comments** | `GET /blogposts/{id}/inline-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--blogposts-id-inline-comments-get) |
  | **Get Custom Content Comments** | `GET /custom-content/{id}/footer-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--custom-content-id-footer-comments-get) |
  | **Get Footer Comments** | `GET /footer-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--footer-comments-get) |
  | **Create Footer Comment** | `POST /footer-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--footer-comments-post) |
  | **Get Footer Comment By Id** | `GET /footer-comments/{comment-id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--footer-comments-comment-id-get) |
  | **Update Footer Comment** | `PUT /footer-comments/{comment-id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--footer-comments-comment-id-put) |
  | **Delete Footer Comment** | `DELETE /footer-comments/{comment-id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--footer-comments-comment-id-delete) |
  | **Get Footer Comment Children** | `GET /footer-comments/{id}/children` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--footer-comments-id-children-get) |
  | **Get Inline Comments** | `GET /inline-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--inline-comments-get) |
  | **Create Inline Comment** | `POST /inline-comments` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--inline-comments-post) |
  | **Get Inline Comment By Id** | `GET /inline-comments/{comment-id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--inline-comments-comment-id-get) |
  | **Update Inline Comment** | `PUT /inline-comments/{comment-id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--inline-comments-comment-id-put) |
  | **Delete Inline Comment** | `DELETE /inline-comments/{comment-id}` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--inline-comments-comment-id-delete) |
  | **Get Inline Comment Children** | `GET /inline-comments/{id}/children` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--inline-comments-id-children-get) |

  ### 📄 **Label Operations**

  | Operation | Method | API Version | Documentation |
  |-----------|--------|-------------|---------------|
  | **Get Attachment Labels** | `GET /attachments/{id}/labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--attachments-id-labels-get) |
  | **Get Blog Post Labels** | `GET /blogposts/{id}/labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--blogposts-id-labels-get) |
  | **Get Custom Content Labels** | `GET /custom-content/{id}/labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--custom-content-id-labels-get) |
  | **Get Labels** | `GET /labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/#api--labels-get) |
  | **Get Page Labels** | `GET /pages/{id}/labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-id-labels-get) |
  | **Get Space Labels** | `GET /spaces/{id}/labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-space/#api--spaces-id-labels-get) |
  | **Get Space Content Labels** | `GET /spaces/{id}/content/labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-space/#api--spaces-id-content-labels-get) |
  | **Get Page Labels** | `GET /pages/{id}/labels` | V2 | [📖 V2 API Docs](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api--pages-id-labels-get) |



  ## 💡 Usage Examples

  ### Example 1: Create a New Page

  ```javascript
  // Input Data
  {
    "resource": "page",
    "operation": "create",
    "spaceId": "123456",
    "title": "My New Page",
    "body": {
      "storage": {
        "value": "<p>This is my page content.</p>",
        "representation": "storage"
      }
    }
  }
  ```

  ### Example 2: List All Spaces

  ```javascript
  // Simple space listing
  {
    "resource": "space",
    "operation": "getAll"
  }
  ```

  ## 🔧 Development

  ### Prerequisites

  - Node.js 18+ 
  - npm 8+
  - n8n development environment

  ### Setup

  ```bash
  # Clone the repository
  git clone https://github.com/your-username/n8n-nodes-confluence-cloud.git
  cd n8n-nodes-confluence-cloud

  # Install dependencies
  npm install

  # Build the project
  npm run build

  # Build and run in dev mode
  npm run dev # then open browser with http://localhost:5678
  ```

  ### Architecture

  This node uses a sophisticated build system:

  - **OpenAPI Code Generation**: Automatically generates operations from Confluence API specifications
  - **Dual API Version Support**: Seamlessly handles both V1 (legacy) and V2 APIs
  - **Quality Validation**: Build fails on deprecated APIs or missing routes
  - **Type Safety**: Full TypeScript support with generated types

  ### Build System Features

  - 📥 **Automatic API Spec Download**: Latest Confluence API specifications
  - 🔍 **Deprecated API Detection**: Prevents using outdated endpoints
  - ⚠️ **Missing Route Validation**: Ensures all configured routes exist
  - 🎯 **Smart Error Messages**: Actionable feedback for configuration issues

  ## 🤝 Contributing

  We welcome contributions! Fork the repository, make your changes, and submit a pull request. For new Confluence API endpoints, add them to `config/confluence-routes.json` and run `npm run dev` to generate operations.

  **Found a bug or have a feature request?** Open an issue with clear details and steps to reproduce.

  ### Adding New Routes

  1. Edit `config/confluence-routes.json`
  2. Add your route configuration:
     ```json
     {
       "path": "/your-endpoint",
       "methods": ["get", "post"],
       "legacy": false
     }
     ```
  3. Run `npm run dev` to generate operations
  4. Test your changes

  ## 📋 API Compatibility

  | Confluence Cloud API | Support Status | Notes |
  |---------------------|----------------|-------|
  | **REST API v2** | ✅ Full Support | Primary API version |
  | **REST API v1** | 🟡 Legacy Support | For operations not yet in V2 |

  ## 🐛 Troubleshooting

  ### Common Issues

  **❌ "API PATH NOT FOUND" Error**
  - Solution: Check if the route needs `"legacy": true` flag
  - Documentation: [API Migration Guide](https://developer.atlassian.com/cloud/confluence/rest/v2/)

  **❌ "DEPRECATED API DETECTED" Error**  
  - Solution: Update to the V2 API equivalent
  - Check: [Confluence API Deprecation Notices](https://developer.atlassian.com/cloud/confluence/deprecation-notice/)

  **❌ "CQL Parse Error" in Trigger**
  - Solution: Check your CQL syntax
  - Reference: [CQL Documentation](https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/)

  **❌ Authentication Issues**
  - Verify your API token is valid
  - Ensure your email address is correct
  - Check domain format: `https://your-domain.atlassian.net`

  ## 📚 Resources

  - [Confluence Cloud REST API Documentation](https://developer.atlassian.com/cloud/confluence/rest/v2/)
  - [Confluence Query Language (CQL)](https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)
  - [Atlassian API Tokens](https://id.atlassian.com/manage-profile/security/api-tokens)

  ## 📄 License

  This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

  ## 🙏 Acknowledgments

  - Built for the [n8n](https://n8n.io) automation platform
  - Uses official [Confluence Cloud API](https://developer.atlassian.com/cloud/confluence/) specifications
  - Inspired by the n8n community's need for robust Confluence integration

  ---

  **Made with ❤️ for the n8n community**

ai_documentation_summary:
  {"purpose":"Integrates n8n with the Confluence Cloud REST API to manage spaces, pages, and templates. It supports both current V2 endpoints and legacy V1 endpoints with automatic API version detection and enhanced error handling.","capabilities":["List, retrieve, create, update, and delete Confluence spaces","List, create, retrieve, update, and delete Confluence pages","Retrieve pages within a space and pages associated with a label","Manage content templates and blueprint templates","Automatic V2 API usage with V1 fallback for legacy operations","Built-in validation, deprecated API detection, and route checking","OpenAPI-generated operations based on Confluence API specifications"],"authentication":"Confluence Cloud API credential using Domain, Atlassian email, and API token (basic/API token authentication)","commonUseCases":["Synchronizing Confluence content with other systems","Automatically creating or updating documentation pages","Managing Confluence spaces and templates from workflows","Fetching pages for reporting, indexing, or AI knowledge base ingestion"],"limitations":["Some operations rely on legacy V1 APIs","README is truncated, so the full set of search and other operations may not be visible"],"relatedNodes":[]}


node_type: @devlikeapro/n8n-nodes-waha.waha
package_name: @devlikeapro/n8n-nodes-waha
display_name: waha
description: n8n to connect with WAHA (Whatsapp HTTP API)
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: devlikeapro
author_github_url: git+https://github.com/devlikeapro/n8n-nodes-waha.git
npm_package_name: @devlikeapro/n8n-nodes-waha
npm_version: 2025.2.9
community_fetched_at: 2026-07-14T14:40:36.026Z
ai_summary_generated_at: 2026-03-25 22:47:20
npm_readme:
  # @devlikeapro/n8n-nodes-waha
  <p align="center">
    <img src="https://github.com/devlikeapro/n8n-nodes-waha/blob/master/WAHA+n8n.png?raw=true" width='300'/>
  </p>

  This is a n8n community node. 
  It lets you use [WAHA - WhatsApp HTTP API](https://waha.devlike.pro) in your n8n workflows.

  - [**WAHA**](https://waha.devlike.pro) - **WhatsApp API** that you can run in a click!
  - [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.

  👉 Generated from
  [**WAHA OpenAPI**](https://waha.devlike.pro/swagger/)
  using [**devlikeapro/n8n-openapi-node**](https://github.com/devlikeapro/n8n-openapi-node)

  ![NPM Version](https://img.shields.io/npm/v/%40devlikeapro%2Fn8n-nodes-waha)

  <!-- toc -->

  - [Install WAHA n8n node](#install-waha-n8n-node)
  - [Links](#links)
  - [Workflow Examples](#workflow-examples)

  <!-- tocstop -->

  ![WAHA Workflow Example Screenshot](./waha-n8n-workflow-example.png)

  ## Install WAHA n8n node
  Go to your **n8n** => **Settings** => **Community nodes** and install:

  ```
  @devlikeapro/n8n-nodes-waha
  ```

  If you need help with that, check the
  [**Install community nodes**](https://docs.n8n.io/integrations/community-nodes/installation/gui-install/)

  ## Links
  - [**WAHA + n8n: No Code Low Code WhatsApp Automation Step-By-Step Guide**](https://waha/devlike.pro/blog/waha-n8n/)
  - [**🧩 WAHA + n8n Integration**](https://waha.devlike.pro/docs/integrations/n8n/)
  - [**WAHA n8n Workflow Templates**](http://waha-n8n-templates.devlike.pro/)

  ## Workflow Examples
  👉 Check out [**n8n-workflows**](http://waha-n8n-templates.devlike.pro/) folder for examples.

ai_documentation_summary:
  {"purpose":"This n8n community node enables workflow automation by connecting to WAHA (WhatsApp HTTP API) for managing WhatsApp communications.","capabilities":["Send WhatsApp messages","Receive WhatsApp messages","Manage WhatsApp contacts","Create WhatsApp groups","Manage WhatsApp media","Integrate with WAHA OpenAPI specifications"],"authentication":"API key required (via WAHA credentials)","commonUseCases":["Automated customer support via WhatsApp","Order status notifications","Appointment reminders","Marketing campaigns"],"limitations":["Requires WAHA API account and credentials","Limited to WhatsApp HTTP API functionality","Community node (may lack official support)"],"relatedNodes":["n8n-openapi-node","WAHA API node","WhatsApp integration nodes"]}


node_type: n8n-nodes-deepseek.deepseek
package_name: n8n-nodes-deepseek
display_name: deepseek
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: rubickecho
author_github_url: git+https://github.com/rubickecho/n8n-deepseek.git
npm_package_name: n8n-nodes-deepseek
npm_version: 1.0.6
community_fetched_at: 2026-07-14T14:40:36.027Z
ai_summary_generated_at: 2026-03-25 22:47:20
description:
  A user-friendly DeepSeek AI node, similar to OpenAI, designed to enhance your workflow. npm link: https://www.npmjs.com/package/n8n-nodes-deepseek

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

  # n8n-nodes-deepseek

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

  DeepSeek-V2 delivers impressive results on current major large model leaderboards.

  DeepSeek WebSite: https://www.deepseek.com/en


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

  - [Installation](#installation)  
  - [Credentials](#credentials)
  - [Usage](#usage)
  - [Resources](#resources)  

  ## Installation

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

  Use the package at [here](https://www.npmjs.com/package/n8n-nodes-deepseek).

  ## Credentials
  Add your Api Key and store securely

  ![Add Credentials](images/credentials.jpg)

  ## Usage

  Add a DeepSeek node to your workflow, select the action you want to perform, and enter the required fields.

  ![Workflow](images/workflow.jpg)

  Run the workflow, and the result will be displayed in the Run Result node.

  ![Run Result](images/run-result.jpg)

  ### A Simple Demo

  ```json
  {
    "meta": {
      "instanceId": "8419fa436e34f85077f6eb7f63a9c97687d9df6ed55cfc53d58b3b86ab6d8e61"
    },
    "nodes": [
      {
        "parameters": {},
        "id": "a8c5f656-680b-4e43-b626-d3c85b1e21a1",
        "name": "When clicking ‘Test workflow’",
        "type": "n8n-nodes-base.manualTrigger",
        "typeVersion": 1,
        "position": [
          920,
          480
        ]
      },
      {
        "parameters": {
          "model": "deepseek-chat",
          "prompt": {
            "messages": [
              {
                "role": "system",
                "content": "I want you to act as a etymologist. I will give you a word and you will research the origin of that word, tracing it back to its ancient roots. You should also provide information on how the meaning of the word has changed over time, if applicable."
              },
              {
                "content": "={{ $json.prompt }}"
              }
            ]
          },
          "options": {},
          "requestOptions": {}
        },
        "id": "4841b428-7848-42d1-a0c6-f28c01a07010",
        "name": "DeepSeek",
        "type": "n8n-nodes-deepseek.deepSeek",
        "typeVersion": 1,
        "position": [
          1380,
          480
        ],
        "credentials": {
          "deepSeekApi": {
            "id": "WWBInhkKqwf808n4",
            "name": "DeepSeek account"
          }
        }
      },
      {
        "parameters": {
          "assignments": {
            "assignments": [
              {
                "id": "1b94a0dc-9b9b-4302-a1fd-2ac41b876740",
                "name": "prompt",
                "value": "My word is \"pizza\"",
                "type": "string"
              }
            ]
          },
          "options": {}
        },
        "id": "6e6054b0-bcb4-4fe3-83be-01cd7da39d93",
        "name": "Edit Fields",
        "type": "n8n-nodes-base.set",
        "typeVersion": 3.4,
        "position": [
          1160,
          480
        ]
      }
    ],
    "connections": {
      "When clicking ‘Test workflow’": {
        "main": [
          [
            {
              "node": "Edit Fields",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Edit Fields": {
        "main": [
          [
            {
              "node": "DeepSeek",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "pinData": {}
  }
  ```

  ## Resources

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


  ## License

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

ai_documentation_summary:
  {"purpose":"A community n8n node that integrates with the DeepSeek AI API to perform text generation and other LLM tasks within workflow automation.","capabilities":["Text generation via chat models (e.g., deepseek-chat)","Support for system prompts and multi-turn conversations","Dynamic prompt injection using n8n expressions","Integration with DeepSeek API for large model inference"],"authentication":"API key required (stored in node credentials)","commonUseCases":["Automated customer support responses","Content generation and summarization","Data analysis and text processing","Workflow automation with natural language understanding"],"limitations":["Community node (may lack official support compared to n8n core nodes)","Dependent on DeepSeek API availability and rate limits","Requires manual installation via npm package"],"relatedNodes":["n8n-nodes-base.manualTrigger","n8n-nodes-base.set","n8n-nodes-base.runResult","n8n-nodes-base.if"]}


node_type: n8n-nodes-firecrawl-scraper.firecrawlscraper
package_name: n8n-nodes-firecrawl-scraper
display_name: firecrawlscraper
description: A custom n8n node based off of firecrawl.
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: leonardogrig
author_github_url: git+https://github.com/leonardogrig/n8n-nodes-firecrawl-scraper.git
npm_package_name: n8n-nodes-firecrawl-scraper
npm_version: 1.1.7
community_fetched_at: 2026-07-14T14:40:36.028Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  # n8n-nodes-firecrawl-scraper

  This package contains n8n nodes for working with the Firecrawl API, allowing you to scrape, crawl, and map websites directly within your n8n workflows. It serves as a wrapper around the [Firecrawl npm SDK](https://www.npmjs.com/package/@mendable/firecrawl-js), primarily focusing on the extract feature.

  > **Note:** This project is still in development. Features and functionality may change.

  ## Support and Feedback

  For support, feedback, or to contribute to this project:

  - GitHub Repository: [n8n-nodes-firecrawl-scraper](https://github.com/leonardogrig/n8n-nodes-firecrawl-scraper)
  - Tutorial Video: [Watch on YouTube](https://youtu.be/j19nN38cIXI)

  ## Prerequisites

  - A Firecrawl API key (get one from [firecrawl.dev](https://firecrawl.dev))
  - n8n instance (v1.0.0 or later)

  ## Installation

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

  ### In an existing n8n instance

  1. Go to **Settings > Community Nodes**
  2. Select **Install**
  3. Enter `n8n-nodes-firecrawl-scraper` in the **Name** field
  4. Agree to the risks of using community nodes
  5. Click **Install**

  ### Manually (Development)

  1. Clone this repository
  2. Navigate to the directory: `cd n8n-nodes-firecrawl-scraper`
  3. Install dependencies: `npm install`
  4. Build the code: `npm run build`
  5. Link to your n8n installation: `npm link`
  6. In your n8n installation directory, run: `npm link n8n-nodes-firecrawl-scraper`

  ## Nodes

  This package includes a single Firecrawl node with multiple operations:

  ### Firecrawl

  A unified node that provides various operations to interact with the Firecrawl API:

  **Operations:**

  - **Scrape**: Scrape content from a single URL in Markdown format
  - **Crawl**: Crawl multiple pages of a website and retrieve content in Markdown format
  - **Map**: Generate a list of URLs from a website
  - **Extract**: Extract structured data from URLs using simple extraction or schema-based extraction

  **Common Parameters:**

  - **URL**: Required for all operations - specifies the target URL(s)
  - **Enable Debug Logs**: Available for Scrape and Extract operations - enables detailed logging

  **Operation-Specific Parameters:**

  - **Crawl**:

    - Limit: Maximum number of pages to crawl (default: 50)

  - **Extract**:
    - Extraction Method: Simple extraction or Schema-based extraction
    - Extraction Prompt: Guide the extraction process
    - Schema Definition Type (for schema-based extraction): Generate from JSON example or define manually
    - JSON Example or Schema Definition: Define the data structure

  ## Credentials

  You'll need to set up your Firecrawl API key in the **Firecrawl API** credential type:

  1. In your n8n workflow, add any Firecrawl node
  2. Click the **Create new credential** button
  3. Enter your Firecrawl API key
  4. Save the credential

  ## Examples

  ### Basic Web Scraping

  1. Add a **Firecrawl** node
  2. Select the **Scrape** operation
  3. Set the URL to the webpage you want to scrape
  4. Connect to nodes like ChatGPT or Text processors to analyze the scraped content

  ### Website Crawling for Data Extraction

  1. Add a **Firecrawl** node
  2. Select the **Crawl** operation
  3. Set the URL to the website you want to crawl
  4. Set a limit (e.g., 10 pages)
  5. Connect to database nodes to store the extracted data

  ### Website Mapping for SEO Analysis

  1. Add a **Firecrawl** node
  2. Select the **Map** operation
  3. Set the URL to the website you want to map
  4. Connect to spreadsheet or visualization nodes to analyze the site structure

  ### Structured Data Extraction

  1. Add a **Firecrawl** node
  2. Select the **Extract** operation
  3. Set the URL(s) to extract data from
  4. Choose the extraction method (Simple or Schema-based)
  5. If using Schema-based extraction, define your schema or provide a JSON example
  6. Use the extracted structured data in your workflow

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This node provides a unified interface to the Firecrawl API for scraping, crawling, mapping, and extracting website data inside n8n workflows. It is primarily focused on extracting structured data from web pages.","capabilities":["Scrape a single URL and return content in Markdown format","Crawl multiple pages from a website and retrieve Markdown content","Map a website to generate a list of discovered URLs","Extract structured data from URLs using simple extraction or schema-based extraction","Support extraction prompts to guide the extraction process","Generate schemas from a JSON example or define them manually","Enable debug logs for Scrape and Extract operations","Set a crawl limit for the number of pages to process"],"authentication":"Firecrawl API key required via the Firecrawl API credential type","commonUseCases":["Scraping webpage content for analysis or summarization","Crawling a website to collect content across multiple pages","Mapping site URLs for SEO or site structure analysis","Extracting structured data from web pages into downstream workflows"],"limitations":["Project is still in development and features/functionality may change","Debug logs are only available for Scrape and Extract operations","Crawl operation includes a page limit parameter with a default of 50"],"relatedNodes":["ChatGPT","Text processors","database nodes","spreadsheet nodes","visualization nodes"]}


node_type: n8n-nodes-clickhouse.clickhouse
package_name: n8n-nodes-clickhouse
display_name: clickhouse
description: Query and ingest into your ClickHouse instance
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: jkaflik
author_github_url: git+https://github.com/jkaflik/n8n-nodes-clickhouse.git
npm_package_name: n8n-nodes-clickhouse
npm_version: 0.0.1
community_fetched_at: 2026-07-14T14:40:36.029Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  # n8n-nodes-clickhouse

  This is an n8n community node. It lets you use [ClickHouse](https://clickhouse.com/) in your n8n workflows.

  ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries.

  [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)  
  [Version history](#version-history)  <!-- delete if not using this section -->

  ## Installation

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

  ## Operations

  ### Query

  Query SQL has to be provided. Rows are return as items.

  ### Insert

  Items are insert batch into user-specified table.

  ## Credentials

  In order to connect to ClickHouse, you have to configure credentials with HTTP URL (only HTTP protocol is supported) and user credentials.

  ## Compatibility

  Tested with 0.219.x.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [ClickHouse](https://clickhouse.com/)
  * [ClickHouse HTTP interface](https://clickhouse.com/docs/en/interfaces/http/)

  ## TODOs

  - [ ] [ClickHouse settings](https://clickhouse.com/docs/en/operations/settings/settings/) ([it's possible to set settings for SELECT query](https://clickhouse.com/docs/en/sql-reference/statements/select/#settings-in-select-query))
  - [ ] [query parameters](https://clickhouse.com/docs/en/interfaces/http/#cli-queries-with-parameters)

ai_documentation_summary:
  {"purpose":"This n8n community node lets you query and ingest data in a ClickHouse database from workflows. It supports SQL queries and batch inserts into a specified table.","capabilities":["Run SQL queries against ClickHouse and return rows as items","Batch insert workflow items into a user-specified ClickHouse table","Use ClickHouse HTTP interface for database communication"],"authentication":"HTTP URL (HTTP protocol only) plus user credentials","commonUseCases":["Fetch analytical data from ClickHouse for downstream workflow processing","Insert batches of n8n items into ClickHouse tables","Use ClickHouse as a data source or sink in automated reporting workflows"],"limitations":["Only the HTTP protocol is supported","Tested with n8n 0.219.x","Query parameters and ClickHouse settings are noted as TODOs/not yet implemented"],"relatedNodes":["n8n community nodes","ClickHouse HTTP interface"]}


node_type: @verificaremails/n8n-nodes-verificaremails.verificaremails
package_name: @verificaremails/n8n-nodes-verificaremails
display_name: verificaremails
description: Official n8n community node for VerificarEmails.com
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: verificaremails
author_github_url: git+https://github.com/apousb/verificaremails-n8n-community-node.git
npm_package_name: @verificaremails/n8n-nodes-verificaremails
npm_version: 1.0.13
community_fetched_at: 2026-07-14T14:40:36.030Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  # VerificarEmails — n8n Community Node

  Official n8n node for [VerificarEmails.com](https://www.verificaremails.com).  
  Validate **emails**, **phone numbers** (HLR / MNP / Syntax), **names**, and **postal addresses**.

  ---

  ## Installation (Community Nodes)

  1. In n8n, go to **Settings → Community nodes → Install a community node**.  
  2. Enter the package name:
     ```bash
     @verificaremails/n8n-nodes-verificaremails
     ```
  3. Accept the security warning and confirm.

  ---

  ## Supported Services

  - Email validation  
  - Phone validation — HLR Lookup  
  - Phone validation — MNP  
  - Phone validation — Syntax  
  - Postal address validation  
  - Name / Surname / Gender validation  
  - Name / Surname correction (JSON term)  
  - Name / Surname autocomplete (JSON term)  

  > For *Name correction* and *Name autocomplete*, the node automatically builds the required JSON and encodes it into the `term` parameter.

  ---

  ## Development

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

  The icon must be available at build time in:
  ```
  dist/nodes/Verificaremails/verificaremails2.svg
  ```

  ---

  ## Credentials

  To use the VerificarEmails API, you must first [create an account](https://dashboard.verificaremails.com/app/public/register).  
  Once registered, you can activate the services you need:  
  - Email verification  
  - Phone verification  
  - Postal address verification  
  - Name, surname, and gender detection  

  When creating your account, select your preferred language. All API messages will use this language setting.

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/Dashboard_paso_1.png)](https://dashboard.verificaremails.com/app/public/register)

  After activating your account, choose the service you want to use. You can navigate between services using the top-left logo or the banners.

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/Dashboard_paso_2.png)](https://dashboard.verificaremails.com/)

  Next, go to the API section of the chosen service.

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/Dashboard_paso_3.png)](https://dashboard.verificaremails.com/)

  Click on the **"+ Create new API"** button (top right). Give the API a name and optionally set a credit limit.

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/Dashboard_paso_4_1.png)](https://dashboard.verificaremails.com/)

  Once saved, an API token will be generated. This token must be added to the n8n credentials for the VerificarEmails node.

  ---

  ## Using the Node in n8n

  In n8n, search for **VerificarEmails** in the Community Nodes section and add it to your workflow.

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/n8n_paso_1.png)](https://dashboard.verificaremails.com/)

  If you plan to use multiple validation services, it’s recommended to use the same API key for all of them.  
  To do this, open the **gear icon** in the credentials, select the active token, and reuse it across services.

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/n8n_paso_2.png)](https://dashboard.verificaremails.com/)

  When configuring the node, select the specific service you want to use (Email, Phone, Name/Surname, Postal address, etc.).

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/n8n_paso_3.png)](https://dashboard.verificaremails.com/)

  Each service not only validates the data but also provides additional details. Check the **Result Guide** section in our documentation to better understand and use the results.

  [![Dashboard Verificaremails](https://www.verificaremails.com/docs/assets/n8n_paso_4.png)](https://dashboard.verificaremails.com/)

  The API also includes error handling for incorrect queries. Errors are rare, but we recommend implementing controls.  
  Error messages will always be returned in the account’s selected language.

  ---

  ## Documentation

  - [Email Verification API](https://www.verificaremails.com/docs/en/)  
  - [Phone Verification API](https://www.verificaremails.com/docs/en/index_telefonos.html)  
  - [Name / Surname / Gender API](https://www.verificaremails.com/docs/en/index_nombres.html)  
  - [Postal Address API](https://www.verificaremails.com/docs/en/index_direcciones.html)  
  - [Swagger Quick Start Guide](https://dashboard.verificaremails.com/documentation/index.html?v=8)  

  If you need assistance setting up your environment, use the support chat (bottom right widget) on our dashboard.

  ---

  ## License

  MIT © Skeyon Lab S.L.

ai_documentation_summary:
  {"purpose":"Official n8n community node for VerificarEmails.com that validates contact and identity data. It supports email, phone, name/surname/gender, and postal address checks, returning additional result details for each service.","capabilities":["Email validation","Phone validation with HLR Lookup","Phone validation with MNP","Phone validation with Syntax checks","Postal address validation","Name / surname / gender validation","Name / surname correction using JSON term input","Name / surname autocomplete using JSON term input","Automatic construction and encoding of JSON term parameters for name correction and autocomplete"],"authentication":"API token required; create an account on VerificarEmails.com, generate an API token in the dashboard, and add it to n8n credentials.","commonUseCases":["Verifying email addresses before sending campaigns or creating user accounts","Validating phone numbers and enriching them with HLR/MNP data","Checking postal addresses for correctness and deliverability","Detecting or correcting names/surnames/gender data in forms or CRM workflows"],"limitations":["Users must activate the specific verification services in their VerificarEmails account before using them","Error handling is available, but workflows should still implement controls for incorrect queries","Name correction and autocomplete require JSON term-based requests, though the node auto-builds these payloads"],"relatedNodes":[]}


node_type: n8n-nodes-exif-data.exifdata
package_name: n8n-nodes-exif-data
display_name: exifdata
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: geckse
author_github_url: git+https://github.com/geckse/n8n-nodes-exif-data.git
npm_package_name: n8n-nodes-exif-data
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:36.030Z
ai_summary_generated_at: 2026-05-22 10:26:01
description:
  A n8n Node to Read and Write EXIF-Data from and to Image Files utilizing a vendoered version of Exiftool

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

  # Work with EXIF / IPTC / XMP Data from Image Files within n8n

  This community package contains a node to work with EXIF Data from Images.


  That enables you to:
  * Add and embed custom keywords inside the image file
  * Strip specific metadata from the image file
  * Add copyright information
  * Extract "Made with AI" Information
  * Set "Made with AI" Information
  * Extract lens information
  * Modify date and time tag
  * Geo-tag images using GPS coordinates
  * Work with embedded Geo-tag Information
  * Identify which camera was used to take the photo
  * Set the image orientation parameter
  * Retrieve image resolution details
  * Extract and manipulate IPTC and XMP metadata

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

  [Supported Operations](#supported-operations)  
  [Installation](#installation)  
  [Compatibility](#compatibility)  
  [About](#about)  
  [Version History](#version-history)  

  ## Supported Operations

  | Operation  | Description | Options |
  | ------------- |  ------------- |  ------------- | 
  | Read  | Read all the embedded metadata of an Image | Read Raw (without any transformation / validation) |
  | Write  | Extend or override metadata of a given Image | Parse Input Fields (Transform Input to match desired Datatypes of known EXIF Fields) |
  | Repair  | Could help woth corrupted files. It will re-apply all existing valid EXIF Metadata to the file. | - |
  | Delete  | Removes All EXIF Metadata from the Image. With the additional field you can keep fields. | Optional: A list of field names to keep |
  | Send Custom Exiftool Command | Send a custom Exiftool Command. (At this moment only read operations possible) | - |

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

  Additionally the exiftool-vendored.js library requires **perl** to be installed on your system.
  On most systems perl is already installed. If not (most likely for Docker), you can install it via your package manager.
  Add this to your Dockerfile:
  ```bash
  RUN apk add perl
  ```

  Or manually install in your docker container: (not so recommended)
  ```bash
  docker exec -u root -it n8n-container-id apk add perl
  ```

  More information regarding possible installation steps can be found in the [exiftool-vendored.js repository](https://github.com/photostructure/exiftool-vendored.js).

  For a quickstart I've prepared an [example workflow](https://cloud.let-the-work-flow.com/workflows/exif-node.json).

  This node essentially wraps **Exiftool** as node vendored variant to work with the metadata.
  Possible by this great [repository](https://github.com/photostructure/exiftool-vendored.js) by photostructure. Huge Shoutout to the contributors to that repo. 
  That also makes it super easy to install and work within n8n – no extra headaches by installing exiftool inside the Docker / on the Server. 

  ## Approach

  **exiftool-vendored** launches a Child-Process with a Vendored variant of Exiftool. This extra instance consumes apeox. 70mb extra RAM. <br>
  <br>⚠️ This node writes temporary files to the n8n default storage path for custom nodes (.n8n/custom/storage/n8n-nodes-exif-data.exifData/). It was necessary to build it this way to make the file accessible for the child process. This means that for this node to work, this path needs to be writable. The node will also instantly remove the files from this temporary storage once they have been processed. Path traversal is prohibited by the node.

  ## Troubleshooting

  If you encounter any issues, please check the following:

  1. **Perl is missing**:
  - The depency inside this node requires perl to be installed on your system. Check the [Installation](#installation) section for more information.

  2. **Storage Path not writable**:
  - The node writes temporary files to the n8n default storage path for custom nodes (.n8n/custom/storage/)
  That may be missing on your system. Possible Solution: Create the directory manually (for example `mkdir .n8n/custom/storage/`)
  Note: This could vary for your system, there is an ENV Variable to change the storage path. Also make sure that n8n can write to this path.

  3. **Temporary file not deleted**:
  - Especially the *_exiftool_tmp might be blocking further write operations. This happens when exiftool runs into an bad error. Further Write Operations will fail with that error.
  - Possible Solution: Restart n8n. If the problem persists, check solutions for this within the exiftool community. It's a known issue, apperantly often caused by antivirus software.

  ## Compatibility

  The Latest Version of n8n. If you encounter any problem, feel free to [open an issue](https://github.com/geckse/n8n-nodes-exif-data) on Github. 

  ## About

  <img src="https://cloud.let-the-work-flow.com/logo-64.png" align="left" height="64" width="64"> 
  <br>
  Hi I'm geckse and I let your work flow! 👋 
  I hope you are enjoying these nodes. If you are in need of a smooth automation, steady integration or custom code check my offering: https://let-the-work-flow.com

  ## Version History
  ### 0.1.2
  - small fixes and Installation Notes added
  ### 0.1.1
  - fix issue with non-existing storage path
  ### 0.1.0
  - initial release

ai_documentation_summary:
  {"purpose":"A n8n node that reads, writes, and manipulates EXIF, IPTC, and XMP metadata from image files using a vendored Exiftool.","capabilities":["Read all embedded image metadata","Add and embed custom keywords to images","Strip specific metadata from images","Add or set copyright information","Extract and set 'Made with AI' information","Extract lens information","Modify date and time tags","Geo-tag images using GPS coordinates","Work with embedded Geo-tag information","Identify the camera used to take a photo"],"authentication":"None","commonUseCases":["Automating image metadata extraction for cataloging","Adding copyright or ownership tags to uploaded images","Removing unwanted metadata from images before sharing","Geo-tagging photos automatically based on location","Verifying or modifying 'Made with AI' claims on images"],"limitations":["Requires Perl to be installed on the system (e.g., in Docker containers)","Consumes approximately 70MB of additional RAM due to the child process","Writes temporary files to the n8n custom storage path, which must be writable","Path traversal is prohibited","Temporary files may persist and block further operations if errors occur (requires restart)"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code","n8n-nodes-base.file"]}


node_type: @mixpeek/n8n-nodes-mixpeek.mixpeek
package_name: @mixpeek/n8n-nodes-mixpeek
display_name: mixpeek
description: n8n community node for Mixpeek - multimodal data processing and semantic search API
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: esteininger
author_github_url: git+https://github.com/mixpeek/connectors.git
npm_package_name: @mixpeek/n8n-nodes-mixpeek
npm_version: 1.0.79
community_fetched_at: 2026-07-14T14:40:36.031Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # @mixpeek/n8n-nodes-mixpeek

  Turn URLs, text, images, and video into structured signals inside n8n.

  Mixpeek is a multimodal processing API that lets you classify, search, cluster, and run ML inference on unstructured data — directly from n8n workflows.

  ```
  Input → Mixpeek → Structured signals → Any system
  ```

  **[Full docs & examples → mixpeek.com/connectors](https://mixpeek.com/connectors)**

  ---

  ## What you can build in minutes

  - Auto-tag content from URLs or files
  - Semantic search across documents, images, or video
  - Content moderation & safety signals
  - Dataset enrichment before indexing
  - Trigger workflows based on semantic similarity

  ## Supported modalities

  - Text
  - Web pages (HTML)
  - Images
  - Video
  - Files (via upload)

  ## Quick example

  **Input:** A URL or file

  **Output:**
  ```json
  {
    "categories": ["technology", "ai"],
    "keywords": ["machine learning", "automation"],
    "sentiment": 0.72,
    "embeddings": [0.023, -0.041, ...]
  }
  ```

  ---

  ## Installation

  ### In n8n

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

  ### Manual

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

  ## Credentials

  Get your API key from [app.mixpeek.com](https://app.mixpeek.com).

  1. In n8n: **Credentials** > **Add Credential**
  2. Search "Mixpeek API"
  3. Enter your API key

  ---

  ## All Resources & Operations

  ### Retriever
  Multi-stage search pipelines with auto-optimization.
  - Create, Get, List, Update, Delete
  - **Execute** - Run a semantic search query
  - **Explain** - Get execution plan

  ### Inference
  Direct ML model execution.
  - **Execute** - Run inference with OpenAI, Anthropic, Google, or custom models

  ### Collection
  Transform objects into searchable documents using ML extractors.
  - Create, Get, List, Update, Delete

  ### Document
  Query-ready outputs with full lifecycle management.
  - Create, Get, List, Update, Delete

  ### Upload
  File upload management with presigned URLs.
  - Create Presigned URL, Get, List, Delete
  - **Confirm** - Verify upload completion

  ### Bucket
  Schema-backed containers for objects/blobs.
  - Create, Get, List, Update, Delete

  ### Namespace
  Manage tenant isolation and environments.
  - Create, Get, List, Update, Delete

  ### Taxonomy
  Similarity-based document classification.
  - Create, Get, List, Update, Delete

  ### Cluster
  Semantic grouping with triggers.
  - Create, Get, List, Delete
  - **Execute** - Run clustering

  ### Task
  Async job tracking and monitoring.
  - Get, List

  ### Webhook
  Event-driven automation.
  - Create, Get, List, Update, Delete

  ---

  ## Example Workflows

  ### Semantic Search

  1. Add a **Mixpeek** node
  2. Resource: **Retriever** → Operation: **Execute**
  3. Enter Retriever ID and query
  4. Connect to any downstream node

  ### Upload & Process a File

  1. **Mixpeek** node → Upload → Create Presigned URL
  2. HTTP node → PUT file to presigned URL
  3. **Mixpeek** node → Upload → Confirm

  ### Run Inference

  1. **Mixpeek** node → Inference → Execute
  2. Model: `openai/gpt-4` or `anthropic/claude-3`
  3. Input: your JSON payload

  ---

  ## Development

  ### Setup

  ```bash
  cd n8n
  npm install
  npm run build
  ```

  ### Test

  ```bash
  npm test

  # Integration tests
  MIXPEEK_API_KEY=your_key npm run test:integration
  ```

  ### Local dev with n8n

  ```bash
  npm link
  cd ~/.n8n/custom && npm link @mixpeek/n8n-nodes-mixpeek
  n8n start
  ```

  ---

  ## Resources

  - [Mixpeek Documentation](https://docs.mixpeek.com)
  - [API Reference](https://docs.mixpeek.com/api-reference)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  MIT

  ## Support

  - [GitHub Issues](https://github.com/mixpeek/connectors/issues)
  - [info@mixpeek.com](mailto:info@mixpeek.com)

ai_documentation_summary:
  {"purpose":"Provides n8n integration with Mixpeek, a multimodal processing and semantic search API for turning URLs, text, images, video, and files into structured signals. Supports classification, semantic search, clustering, ML inference, dataset enrichment, and event-driven workflows.","capabilities":["Create, get, list, update, delete, execute, and explain Retrievers for semantic search pipelines","Execute ML inference using OpenAI, Anthropic, Google, or custom models","Create, get, list, update, and delete Collections for transforming objects into searchable documents","Create, get, list, update, and delete Documents","Create presigned upload URLs, get/list/delete uploads, and confirm upload completion","Create, get, list, update, and delete Buckets for schema-backed object/blob containers","Create, get, list, update, and delete Namespaces for tenant isolation and environments","Create, get, list, update, and delete Taxonomies for similarity-based document classification","Create, get, list, delete, and execute Clusters for semantic grouping","Get and list Tasks for async job tracking and monitoring"],"authentication":"API key required; create Mixpeek API credentials in n8n using an API key from app.mixpeek.com.","commonUseCases":["Auto-tagging content from URLs or files","Semantic search across documents, images, or video","Content moderation and safety signal generation","Dataset enrichment before indexing","Triggering workflows based on semantic similarity"],"limitations":[],"relatedNodes":["HTTP Request"]}


node_type: @digital-boss/n8n-nodes-odoo-trigger.odootrigger
package_name: @digital-boss/n8n-nodes-odoo-trigger
display_name: odootrigger
description: Odoo-trigger support for n8n
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: feelgood-interface
author_github_url: git+https://github.com/digital-boss/n8n-nodes-odoo-trigger.git
npm_package_name: @digital-boss/n8n-nodes-odoo-trigger
npm_version: 1.1.3
community_fetched_at: 2026-07-14T14:40:36.033Z
ai_summary_generated_at: 2026-06-26 10:27:23
npm_readme:
  # n8n-nodes-odoo-trigger

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

  # If you have n8n installed: Install custom nodes module

  Install it to the n8n root folder. This is the node_modules folder on the same level of n8n and n8n-core. This differs when you used the -g flag on n8n initial installation. From there do:

  ```
  npm install @digital-boss/n8n-nodes-odoo-trigger
  ```

  # IFresh install n8n

  Navigate to desired folder, create a package json and install n8n like so:

  ```
  cd /var/www/vhosts/

  mkdir my-n8n && cd my-n8n

  npm init --yes

  npm install n8n

  npm install @digital-boss/n8n-nodes-odoo-trigger
  ```

  # Start n8n

  Directly:

  ```
  n8n
  ```

  Plesk or C-Panel:

  ```
  node /var/www/vhosts/n8n/bin/n8n
  ```

  [comment]: <> (# Latest functionality)

  [comment]: <> (# Contribution)

  [comment]: <> (To make this node even better, please let us know, [how you use it]&#40;mailto:info@digital-north-consulting.com&#41;. Commits are always welcome. )

  [comment]: <> (# Issues)

  [comment]: <> (If you have any issues, please [let us know on GitHub]&#40;https://github.com/digital-boss/n8n-nodes-odoo-trigger/issues&#41;.)

  [comment]: <> (# About)

  [comment]: <> (Special thanks to [N8n nodemation]&#40;https://n8n.io&#41; workflow automation by Jan Oberhauser.)

  [comment]: <> (Nodes by [digital-north-consulting.com]&#40;https://digital-north-consulting.com&#41;. For productive use and consulting on this, [contact us please]&#40;mailto:info@digital-north-consulting.com&#41;.)

  [comment]: <> (This node was updated with ❤️ by Valentina Lilova [valentina98]&#40;https://github.com/valentina98&#41;)

  # License

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

ai_documentation_summary:
  {"purpose":"This node provides Odoo trigger support for n8n, allowing workflows to start when events or changes occur in Odoo. The README mainly covers installation and setup rather than detailed trigger behavior.","capabilities":["Acts as an Odoo trigger node for n8n workflows","Supports installation as a custom n8n community node","Can be added to an existing n8n installation via npm","Can be installed into a fresh n8n project setup"],"authentication":"Not specified in the README","commonUseCases":["Starting a workflow when an Odoo event occurs","Integrating Odoo-driven automation into n8n","Connecting Odoo to downstream n8n nodes for process automation"],"limitations":["README does not document specific trigger events, filters, or node parameters","README does not describe authentication or connection configuration details"],"relatedNodes":[]}


node_type: n8n-nodes-deepseek-fix.deepseekfix
package_name: n8n-nodes-deepseek-fix
display_name: deepseekfix
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: raevon
author_github_url: git+https://github.com/Zekabr2023/n8n-nodes-deepseek-v4-thinking-fix.git
npm_package_name: n8n-nodes-deepseek-fix
npm_version: 0.2.20
community_fetched_at: 2026-07-14T14:40:36.033Z
ai_summary_generated_at: 2026-07-06 09:55:11
description:
  n8n community node for DeepSeek V4 models (deepseek-v4-flash, deepseek-v4-pro) with thinking mode control

npm_readme:
  # n8n-nodes-deepseek-v4

  Nó comunitário do n8n para os modelos **DeepSeek V4** (`deepseek-v4-flash` e `deepseek-v4-pro`), com controle completo do **Thinking Mode**.

  ## Modelos suportados

  | Model ID | Alias legado | Thinking |
  |---|---|---|
  | `deepseek-v4-flash` | `deepseek-chat` | Opcional |
  | `deepseek-v4-pro` | `deepseek-reasoner` | Opcional |
  | `deepseek-chat` | — | Sem thinking por padrão |
  | `deepseek-reasoner` | — | Com thinking por padrão |

  ## Features

  - ✅ **Thinking Mode toggle** — Desabilite, habilite com `high` ou `max` effort
  - ✅ Retorna `reasoning_content` separado do `content` (opcional)
  - ✅ Parâmetros `temperature`, `top_p`, `presence_penalty`, `frequency_penalty` são automaticamente omitidos quando thinking está ativo (evita conflito com a API)
  - ✅ Suporte a JSON Output Mode (`response_format: json_object`)
  - ✅ Stop sequences configuráveis
  - ✅ Custom Base URL (útil para proxies OpenAI-compatible)

  ## Instalação

  ### Via npm (produção)
  ```bash
  npm install n8n-nodes-deepseek-v4
  ```

  ### Via n8n UI
  Vá em **Settings → Community Nodes → Install** e busque `n8n-nodes-deepseek-v4`.

  ### Desenvolvimento local
  ```bash
  cd n8n-nodes-deepseek-v4
  npm install
  npm run build
  # Copie a pasta para ~/.n8n/custom/ ou use npm link
  ```

  ## Configuração da Credencial

  1. Acesse [platform.deepseek.com](https://platform.deepseek.com/) e gere uma API Key
  2. No n8n, vá em **Credentials → New → DeepSeek API**
  3. Insira a API Key e salve

  ## Parâmetros do Nó

  | Parâmetro | Descrição |
  |---|---|
  | **Model** | Modelo a usar (v4-flash, v4-pro, etc.) |
  | **System Message** | Prompt de sistema (opcional) |
  | **User Message** | Prompt do usuário |
  | **Thinking Mode** | `Disabled` / `Enabled – High` / `Enabled – Max` |
  | **Return Thinking Content** | Incluir `reasoning_content` no output |
  | **Temperature** | Temperatura (ignorada com thinking ativo) |
  | **Max Tokens** | Máximo de tokens gerados |
  | **JSON Output Mode** | Força output como JSON válido |
  | **Stop Sequences** | Sequências de parada (vírgula separadas) |

  ## Saída

  ```json
  {
    "content": "Resposta final do modelo",
    "reasoning_content": "Chain-of-thought (apenas se thinking ativo e Return habilitado)",
    "model": "deepseek-v4-flash",
    "usage": {
      "prompt_tokens": 100,
      "completion_tokens": 200,
      "total_tokens": 300
    },
    "finish_reason": "stop"
  }
  ```

  ## Por que desabilitar o Thinking?

  O Thinking Mode **consome mais tokens** e é mais lento. Para tarefas simples (classificação, extração, tradução, geração de texto direto), desabilitá-lo é mais eficiente e barato. O nó envia explicitamente `{"thinking": {"type": "disabled"}}` para garantir que o modelo não use reasoning mesmo quando o default da API for `enabled`.

  ## Licença

  MIT

ai_documentation_summary:
  {"purpose":"n8n community node for interacting with DeepSeek V4 chat models, with explicit control over Thinking Mode and optional separation of reasoning output from the final response. It is designed for OpenAI-compatible DeepSeek API usage, including proxy/base URL support.","capabilities":["Send prompts to DeepSeek V4 models (deepseek-v4-flash, deepseek-v4-pro) and legacy aliases (deepseek-chat, deepseek-reasoner)","Enable, disable, or set Thinking Mode effort to high/max","Return reasoning_content separately from content when enabled","Support JSON output mode via response_format=json_object","Configure stop sequences","Set a custom base URL for OpenAI-compatible proxies","Use conversation parameters such as system message, user message, temperature, max tokens, top_p, presence_penalty, and frequency_penalty","Automatically omit certain sampling parameters when Thinking Mode is active to avoid API conflicts"],"authentication":"DeepSeek API key required (DeepSeek API credential in n8n, generated from platform.deepseek.com)","commonUseCases":["Text generation and assistant-style chat with DeepSeek V4 models","Structured JSON generation for downstream automation","Classification, extraction, translation, and other low-reasoning tasks with Thinking Mode disabled","Reasoning-heavy tasks where Thinking Mode is enabled for higher effort output"],"limitations":["Thinking Mode increases token usage and response latency","When Thinking Mode is active, temperature/top_p/presence_penalty/frequency_penalty are omitted to avoid API conflicts","reasoning_content is only returned when Thinking Mode is active and Return Thinking Content is enabled"],"relatedNodes":[]}


node_type: n8n-nodes-instagram-integrations.instagramintegrations
package_name: n8n-nodes-instagram-integrations
display_name: instagramintegrations
description: N8N nodes for Instagram API integration with OAuth2 authentication
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: msameim181
author_github_url: git+https://github.com/Msameim181/n8n-nodes-instagram-integrations.git
npm_package_name: n8n-nodes-instagram-integrations
npm_version: 1.6.0
community_fetched_at: 2026-07-14T14:40:36.035Z
ai_summary_generated_at: 2026-03-25 22:47:20
npm_readme:
  # n8n-nodes-instagram-integrations

  ![Instagram Banner](https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white)
  [![npm version](https://img.shields.io/npm/v/n8n-nodes-instagram-integrations.svg)](https://www.npmjs.com/package/n8n-nodes-instagram-integrations)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
  [![n8n](https://img.shields.io/badge/n8n-community-FF6D5A?logo=n8n)](https://n8n.io)
  [![Downloads](https://img.shields.io/npm/dt/n8n-nodes-instagram-integrations.svg)](https://www.npmjs.com/package/n8n-nodes-instagram-integrations)

  Professional N8N community nodes for seamless Instagram Messaging API integration with OAuth2 authentication.

  [Installation](#installation) • [Features](#features) • [Prerequisites](#prerequisites) • [Quick Start](#quick-start) • [Documentation](#documentation) • [Support](#support)

  ---

  ## 📖 Overview

  This package provides comprehensive Instagram integration for n8n workflows, enabling automated messaging, media management, and webhook-based event handling through the official Instagram Graph API.

  **Perfect for:**
  - 🤖 Automated customer support via Instagram DM
  - 📢 Marketing campaigns and notifications
  - 🎯 Lead generation and engagement
  - 📊 Customer interaction tracking
  - 🔄 Multi-platform messaging automation

  ---

  ## ✨ Features

  ### 🔐 OAuth2 Authentication
  - **One-click authentication** - Secure OAuth2 flow similar to Google Drive
  - **🆕 Automatic long-lived tokens** - Short-lived tokens (1 hour) automatically exchanged for long-lived tokens (60 days)
  - **🆕 Automatic token refresh** - Tokens refresh automatically before expiration (zero configuration)
  - **🆕 No more "refreshToken is required" errors** - Smart token lifecycle management prevents expiration issues
  - **Multiple credential types** - OAuth2 or manual access token
  - **Auto-discovery** - Automatically fetches Instagram Business Account ID

  ### 📬 Instagram Messaging Node

  **Message Types:**
  - 💬 **Text Messages** - Send formatted text with up to 1000 characters
  - 🖼️ **Image Messages** - Share images via public HTTPS URLs
  - 🎵 **Audio Messages** - Send voice messages and audio files
  - 🎬 **Video Messages** - Share video content
  - 📤 **Media Upload** - Upload and publish photos, videos, reels, and stories

  **Interactive Templates:**
  - 🔘 **Button Templates** - Up to 3 action buttons (web links or postbacks)
  - 🎴 **Generic Templates** - Carousel cards with images and buttons
  - ⚡ **Quick Replies** - Up to 13 quick response options

  **User Management:**
  - 👤 **Get User Profile** - Retrieve user information (name, username, profile picture)

  ### 💬 Comment Management (NEW in v1.6.0!)

  **Comment Moderation:**
  - 📜 **Get Comments** - Retrieve all comments on your media posts with pagination
  - 💬 **Get Replies** - Fetch replies to specific comments
  - ↩️ **Reply to Comment** - Post public replies to comments on your media
  - 🔒 **Send Private Reply** - Send a DM to users who commented (7-day window)
  - 🗑️ **Delete Comment** - Remove unwanted comments from your posts
  - 👁️ **Hide/Unhide Comment** - Toggle comment visibility without deletion

  **Perfect for:**
  - 🤝 Engaging with your audience through comment replies
  - 📧 Sending exclusive offers via private DM to commenters
  - 🛡️ Moderating spam and unwanted comments
  - 🔄 Automating comment response workflows (Manychat alternative!)

  ### � Instagram Content Publishing (NEW!)

  **Post Creation:**
  - 📷 **Single Posts** - Create image or video feed posts
  - 🎞️ **Carousel Posts** - Multi-media posts (2-10 images/videos)
  - 🎬 **Reels** - Short-form videos up to 60 seconds
  - 📋 **Stories** - 24-hour temporary content

  **Advanced Features:**
  - 🏷️ **User Tagging** - Tag up to 20 users with precise positioning
  - 🛍️ **Product Tagging** - Tag products from Facebook catalog
  - 🤝 **Collaborators** - Tag other accounts as collaborators
  - 📍 **Location Tagging** - Add location stickers to posts
  - 🎨 **Custom Thumbnails** - Set video thumbnail positions
  - 🎵 **Audio Attribution** - Name audio tracks in reels

  **Media Management:**
  - 📊 **List Media** - Get paginated list of your media
  - 🔍 **Get Media Details** - Retrieve specific media information
  - 👶 **Get Carousel Children** - Access individual carousel items

  ###  Instagram Trigger Node

  **Webhook Events:**
  - 💬 **New Messages** - Trigger on incoming messages
  - 🔘 **Postback Events** - Handle button clicks and interactions
  - ✅ **Opt-in Events** - Process user consent actions
  - 💭 **Comments** (NEW!) - Trigger when someone comments on your media
  - 🏷️ **Mentions** (NEW!) - Trigger when someone mentions you in comments or stories

  **Dual Output System:**
  - **Output 1** (Messages/Postbacks/Opt-ins) - Direct messaging events
  - **Output 2** (Comments/Mentions) - Content engagement events

  **Security Features:**
  - 🔒 Webhook signature validation (X-Hub-Signature-256)
  - ✓ Verify token authentication
  - 🛡️ HMAC SHA256 cryptographic verification

  ---

  ## 📋 Prerequisites

  ### Required Accounts
  1. **Facebook Page** - Active Facebook page
  2. **Instagram Business Account** - Connected to your Facebook page
  3. **Meta Developer Account** - Access to Facebook Developer Console
  4. **n8n Instance** - Self-hosted or cloud (version 0.196.0+)

  ### Required Permissions

  **For Messaging:**
  - `instagram_basic` - Basic profile access
  - `instagram_manage_messages` - Send and receive messages
  - `pages_manage_metadata` - Webhook subscriptions
  - `pages_read_engagement` - Read engagement data

  **For Content Publishing (NEW):**
  - `instagram_content_publish` - Create and publish posts, reels, and stories
  - `pages_show_list` - List Facebook pages
  - `catalog_management` - Product tagging (optional, for Instagram Shopping)

  ### Technical Requirements
  - Node.js 18.15+ or 20.10+
  - n8n version 0.196.0 or higher
  - HTTPS webhook endpoint (for trigger node)

  ---

  ## 🚀 Installation

  ### Option 1: n8n Community Nodes (Recommended)

  1. Open n8n
  2. Go to **Settings** → **Community Nodes**
  3. Search for `n8n-nodes-instagram-integrations`
  4. Click **Install**
  5. Restart n8n

  ### Option 2: npm Installation

  ```bash
  cd ~/.n8n/nodes
  npm install n8n-nodes-instagram-integrations
  ```

  ### Option 3: Docker

  Add to your `docker-compose.yml`:

  ```yaml
  services:
    n8n:
      environment:
        - N8N_COMMUNITY_PACKAGES=n8n-nodes-instagram-integrations
  ```

  ---

  ## 🎯 Quick Start

  ### Step 1: Create Meta App

  1. Visit [Meta for Developers](https://developers.facebook.com/apps/)
  2. Click **Create App**
  3. Select **Business** type
  4. Add **Instagram** product
  5. Note your **App ID** and **App Secret**

  ### Step 2: Connect Facebook Page

  1. In App Dashboard → **Instagram** → **Basic Display**
  2. Add your Instagram Business Account
  3. Generate a **Page Access Token** with required permissions
  4. Copy the **Instagram Business Account ID**

  ### Step 3: Configure n8n Credentials

  **Using OAuth2 (Recommended):**

  1. In n8n: **Credentials** → **New** → **Instagram OAuth2 API**
  2. Enter:
     - **Client ID**: Your App ID
     - **Client Secret**: Your App Secret
  3. Click **Connect my account**
  4. Authorize in popup window
  5. ✅ Connection established!

  **Using Access Token:**

  1. In n8n: **Credentials** → **New** → **Instagram Access Token API**
  2. Enter:
     - **Access Token**: Your Page Access Token
  3. Click **Save**
  4. ✅ Account ID auto-discovered!

  ### Step 4: Build Your First Workflow

  1. Create new workflow
  2. Add **Instagram** node
  3. Select **Message** → **Send Text Message**
  4. Configure:
     - **Credential**: Your Instagram credential
     - **Recipient ID**: Target user's Instagram-scoped ID
     - **Message**: Your text content
  5. Execute!

  ---

  ## 📚 Documentation

  ### Core Guides
  - 📘 [**CHANGELOG.md**](./CHANGELOG.md) - Version history and updates
  - 🔧 [**IMPLEMENTATION_GUIDE.md**](./IMPLEMENTATION_GUIDE.md) - Developer documentation
  - � [**AUTHENTICATION_GUIDE.md**](./AUTHENTICATION_GUIDE.md) - Setup and OAuth guide
  - �📋 [**Instruction Files**](./.github/instructions/) - Technical specifications

  ### Content Publishing Guides (NEW!)
  - 🚀 [**QUICKSTART.md**](./QUICKSTART.md) - Get started in 5 minutes
  - 📸 [**POST_STORY_GUIDE.md**](./POST_STORY_GUIDE.md) - Complete post/story creation guide
  - 💡 [**EXAMPLES.md**](./EXAMPLES.md) - Code examples and workflow patterns
  - 📊 [**FEATURE_SUMMARY.md**](./FEATURE_SUMMARY.md) - Technical implementation details

  ### Example Workflows

  **Messaging:**
  - Auto-Reply to Messages
  - Daily Announcements
  - Customer Support Bot

  **Content Publishing:**
  - Scheduled Daily Posts
  - Automated Carousels
  - Story Automation
  - Product Showcase Reels

  ### API Reference

  **Message Operations:**
  - `sendTextMessage` - Send text content
  - `sendImageMessage` - Send image via URL
  - `sendAudioMessage` - Send audio file
  - `sendVideoMessage` - Send video content
  - `sendButtonTemplate` - Interactive buttons
  - `sendGenericTemplate` - Carousel cards
  - `sendQuickReplies` - Quick response options
  - `uploadMedia` - Upload media files

  **Post Operations (NEW):**
  - `createSinglePost` - Create image/video posts
  - `createCarouselPost` - Multi-media carousels
  - `createReel` - Short-form videos
  - `publishPost` - Publish created content

  **Story Operations (NEW):**
  - `createStory` - Create and publish stories

  **Media Operations (NEW):**
  - `listMedia` - Get your media list
  - `getMedia` - Get media details
  - `getMediaChildren` - Get carousel children

  **User Operations:**
  - `getUserProfile` - Fetch user information
  - `getMyProfile` - Get authenticated account info

  **Comment Operations (NEW in v1.6.0):**
  - `getComments` - Get all comments on media
  - `getReplies` - Get replies to a comment
  - `replyToComment` - Post public reply
  - `sendPrivateReply` - Send DM to commenter
  - `deleteComment` - Remove a comment
  - `toggleVisibility` - Hide/unhide comment

  **Webhook Events:**
  - `messages` - Incoming messages
  - `messaging_postbacks` - Button interactions
  - `messaging_optins` - Consent events

  ---

  ## � Token Management (v1.5.0+)

  ### Automatic Long-Lived Token System

  Instagram uses a two-tier token system that this package **automatically manages** for you:

  | Token Type | Validity | Management |
  |------------|----------|------------|
  | Short-lived | 1 hour | Received from OAuth |
  | Long-lived | 60 days | **Auto-exchanged** on first use |
  | Refreshed | 60 days | **Auto-refreshed** before expiration |

  ### How It Works

  ```
  OAuth Authentication (User action)
           ↓
  Short-lived Token (1 hour)
           ↓
  First API Call (automatic)
           ↓
  Long-lived Token Exchange (automatic)
           ↓
  Token Valid for 60 Days
           ↓
  Auto-refresh at 53 Days (automatic)
           ↓
  Another 60 Days of Validity
  ```

  ### Key Features

  ✅ **Zero Configuration** - Everything happens automatically  
  ✅ **No More Errors** - "refreshToken is required" error is eliminated  
  ✅ **Smart Refresh** - Tokens refresh when at least 24 hours old and expiring within 7 days  
  ✅ **Fallback Protection** - If refresh fails, attempts to exchange current OAuth token  
  ✅ **Secure Storage** - All tokens encrypted in N8N credential system  

  ### Best Practices

  1. **Keep Workflows Active**: Run at least once every 50 days to maintain token validity
  2. **Monitor Health**: Create a weekly health-check workflow (optional)
  3. **Handle Errors Gracefully**: Use `continueOnFail` for robust error handling

  ### Token Lifecycle Example

  ```typescript
  // Day 1: OAuth authentication
  User authenticates → Short-lived token (expires in 1 hour)

  // Day 1: First workflow run
  First API call → Automatic exchange → Long-lived token (expires in 60 days)

  // Day 53: Automatic refresh (7 days before expiry)
  API call → Token check → Auto-refresh → New long-lived token (expires in 60 days)

  // Repeat cycle every ~53 days as long as workflows are active
  ```

  ### What If Token Expires?

  If a workflow is inactive for 60+ days:
  1. Token expires and cannot be refreshed
  2. Workflow shows error: "Instagram access token has expired"
  3. **Solution**: Reconnect your Instagram OAuth2 credential (takes 30 seconds)

  ### Learn More

  📘 [**TOKEN_MANAGEMENT.md**](./docs/TOKEN_MANAGEMENT.md) - Comprehensive token management guide  
  🔧 [**TOKEN_MANAGEMENT_IMPLEMENTATION.md**](./docs/TOKEN_MANAGEMENT_IMPLEMENTATION.md) - Technical implementation details

  ---

  ## �🔧 Configuration

  ### Webhook Setup

  1. In Meta App Dashboard → **Instagram** → **Webhooks**
  2. Subscribe to `messages` field
  3. Callback URL: Your n8n webhook URL
     ```
     https://your-n8n.com/webhook/instagram
     ```
  4. Verify Token: Enter in both Meta and n8n credentials
  5. Click **Verify and Save**

  ### Rate Limits

  - **API Calls**: 200 requests per hour per user
  - **Messages**: 1000 characters max
  - **Buttons**: 3 per template, 20 characters per title
  - **Quick Replies**: 13 max per message
  - **Webhook Response**: Must respond within 20 seconds

  ---

  ## 🛠️ Troubleshooting

  ### Common Issues

  **"Invalid OAuth Access Token"**
  - Verify token hasn't expired
  - Check required permissions are granted
  - Regenerate token in Meta Developer Console

  **"Webhook Verification Failed"**
  - Ensure verify token matches in both Meta and n8n
  - Check n8n webhook is publicly accessible via HTTPS
  - Verify firewall allows Meta's IP ranges

  **"User Cannot Receive Messages"**
  - User must initiate conversation first (24-hour window)
  - Use message tags for out-of-window messaging
  - Verify Instagram Business Account is active

  **"Rate Limit Exceeded"**
  - Implement exponential backoff
  - Reduce request frequency
  - Use batch operations where possible

  ### Debug Mode

  Enable n8n debug logging:
  ```bash
  export N8N_LOG_LEVEL=debug
  n8n start
  ```

  ---

  ## 🤝 Support

  ### Resources
  - 📖 [Instagram Graph API Documentation](https://developers.facebook.com/docs/instagram-api)
  - 💬 [n8n Community Forum](https://community.n8n.io)
  - 🐛 [Issue Tracker](https://github.com/Msameim181/n8n-nodes-instagram-integrations/issues)
  - 📧 Email: 9259samei@gmail.com

  ### Contributing

  Contributions are welcome! Please:
  1. Fork the repository
  2. Create a feature branch
  3. Follow existing code style
  4. Add tests for new features
  5. Submit a pull request

  See [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md) for guidelines.

  ---

  ## 📄 License

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

  Copyright © 2025 Mohammad Mahdi Samei

  ---

  ## 🙏 Acknowledgments

  - Built with [n8n](https://n8n.io) - Fair-code workflow automation
  - Powered by [Instagram Graph API](https://developers.facebook.com/docs/instagram-api)
  - Icons by [Instagram Brand Guidelines](https://en.instagram-brand.com/)

  ---

  ## 📊 Stats

  ![npm](https://img.shields.io/npm/v/n8n-nodes-instagram-integrations)
  ![downloads](https://img.shields.io/npm/dt/n8n-nodes-instagram-integrations)
  ![license](https://img.shields.io/npm/l/n8n-nodes-instagram-integrations)
  ![node version](https://img.shields.io/node/v/n8n-nodes-instagram-integrations)

  ---

  **Made with ❤️ for the n8n community** | [GitHub](https://github.com/Msameim181/n8n-nodes-instagram-integrations) | [npm](https://www.npmjs.com/package/n8n-nodes-instagram-integrations)

ai_documentation_summary:
  {"purpose":"This n8n community node package provides comprehensive Instagram API integration for automated messaging, content publishing, and comment management via OAuth2 authentication.","capabilities":["Send text, image, audio, and video messages","Upload and publish photos, videos, reels, and stories","Create carousel posts with 2-10 media items","Tag users, products, and collaborators in posts","Retrieve and moderate comments with public replies and private DMs","Handle Instagram webhooks for messages, postbacks, and mentions","Get user profiles and media details","Automatic token refresh and long-lived token management"],"authentication":"OAuth2","commonUseCases":["Automated customer support via Instagram DM","Marketing campaigns and notifications","Lead generation and engagement tracking","Comment moderation and automated replies","Social media content publishing and scheduling"],"limitations":["Requires n8n version 0.196.0 or higher","Requires active Facebook Page and connected Instagram Business Account","Requires Meta Developer Account access","Webhook trigger node requires HTTPS endpoint","Product tagging requires catalog_management permission"],"relatedNodes":["n8n-nodes-webhook","n8n-nodes-oauth2","n8n-nodes-instagram-messaging","n8n-nodes-instagram-content-publishing"]}


node_type: @winth03/n8n-nodes-minio.minio
package_name: @winth03/n8n-nodes-minio
display_name: minio
description: n8n node wrapper for the official MinIO JavaScript SDK
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: winth03
author_github_url: git+https://github.com/winth03/n8n-nodes-minio.git
npm_package_name: @winth03/n8n-nodes-minio
npm_version: 1.3.0
community_fetched_at: 2026-07-14T14:40:36.036Z
ai_summary_generated_at: 2026-06-26 10:27:23
npm_readme:
  # @winth03/n8n-nodes-minio

  [![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/winth03/n8n-nodes-minio/npm-publish.yml)](https://github.com/winth03/n8n-nodes-minio/actions)
  [![NPM Version](https://img.shields.io/npm/v/%40winth03%2Fn8n-nodes-minio)](https://www.npmjs.com/package/@winth03/n8n-nodes-minio)
  [![NPM Downloads](https://img.shields.io/npm/dm/%40winth03%2Fn8n-nodes-minio)](https://www.npmjs.com/package/@winth03/n8n-nodes-minio)
  [![NPM License](https://img.shields.io/npm/l/%40winth03%2Fn8n-nodes-minio)](https://github.com/winth03/n8n-nodes-minio/blob/master/LICENSE.md)
  [![NPM Last Update](https://img.shields.io/npm/last-update/%40winth03%2Fn8n-nodes-minio)](https://www.npmjs.com/package/@winth03/n8n-nodes-minio)
  [![MinIO Dependency](https://img.shields.io/npm/dependency-version/%40winth03%2Fn8n-nodes-minio/minio)](https://www.npmjs.com/package/@winth03/n8n-nodes-minio)

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

  [MinIO](https://github.com/minio/minio) is a high-performance, S3-compatible object storage system designed for large scale AI/ML, data lake and database workloads.

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

  Or install it manually:

  ```bash
  npm install @winth03/n8n-nodes-minio
  ```

  ## Operations

  The MinIO node supports the following operations:

  ### Bucket Operations
  - **List** - List all buckets owned by the authenticated user
  - **Make** - Create a new bucket with the specified name
  - **Remove** - Remove an empty bucket
  - **Exists** - Check if a bucket exists and is accessible

  ### Object Operations
  - **List** - List all objects in a bucket
  - **Get** - Download an object from a bucket as binary data
  - **Put** - Upload an object to a bucket from binary data
  - **Remove** - Remove an object from a bucket
  - **Stat** - Retrieves metadata about an object in the specified bucket

  ### Presigned URL Operations
  - **Get** - Generate a presigned URL for downloading an object (7-day expiry)
  - **Put** - Generate a presigned URL for uploading an object (7-day expiry)

  ## Credentials

  To use this node, you need to set up MinIO API credentials with the following information:

  ### Prerequisites
  - Access to a MinIO server (self-hosted or cloud service)
  - Valid access key and secret key with appropriate permissions

  ### Required Credential Fields
  - **Endpoint** - The MinIO server endpoint (e.g., `localhost` or `play.min.io`)
  - **Port** - The port number (typically `9000` for MinIO)
  - **Use SSL** - Whether to use HTTPS/SSL connection
  - **Access Key** - Your MinIO access key
  - **Secret Key** - Your MinIO secret key

  ### Setting Up Credentials
  1. In n8n, go to **Credentials** and click **Add Credential**
  2. Search for "MinIO API" and select it
  3. Fill in your MinIO server details
  4. Test the connection to ensure it works
  5. Save the credential

  ## Compatibility

  - **Minimum n8n version**: 0.174.0
  - **Node.js version**: >= 20.15.0
  - **Tested with n8n versions**: 1.0.0+

  This node uses the official MinIO JavaScript SDK and is compatible with:
  - MinIO servers (any version)
  - Amazon S3 (due to S3 compatibility)
  - Any S3-compatible storage service

  ## Usage

  ### Basic Workflow Examples

  #### Listing Buckets
  1. Add the MinIO node to your workflow
  2. Select **Bucket** as the resource
  3. Select **List** as the operation
  4. Configure your MinIO credentials
  5. Execute to get a list of all buckets

  #### Uploading a File
  1. Use an input node to provide binary file data
  2. Add the MinIO node
  3. Select **Object** as the resource
  4. Select **Put** as the operation
  5. Specify the bucket name and object name
  6. Configure the field name containing your binary data

  #### Downloading a File
  1. Add the MinIO node
  2. Select **Object** as the resource
  3. Select **Get** as the operation
  4. Specify the bucket name and object name
  5. The file content will be available as binary data in the specified field

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [MinIO Documentation](https://min.io/docs/)
  * [MinIO JavaScript SDK](https://github.com/minio/minio-js/blob/master/docs/API.md)
  * [GitHub Repository](https://github.com/winth03/n8n-nodes-minio)

ai_documentation_summary:
  {"purpose":"This node provides MinIO object storage integration for n8n workflows using the official MinIO JavaScript SDK. It allows workflows to manage buckets and objects, as well as generate presigned URLs.","capabilities":["List, create, remove, and check existence of buckets","List, download, upload, remove, and inspect object metadata","Generate presigned download URLs with 7-day expiry","Generate presigned upload URLs with 7-day expiry","Work with MinIO servers and other S3-compatible storage services"],"authentication":"MinIO API credentials required: endpoint, port, SSL setting, access key, and secret key","commonUseCases":["Listing buckets in a MinIO account","Uploading binary files to a bucket","Downloading objects as binary data","Creating presigned URLs for temporary upload or download access"],"limitations":["Bucket removal only works for empty buckets","Presigned URL expiry is fixed at 7 days"],"relatedNodes":["S3-compatible storage nodes","MinIO API"]}


node_type: @mazix/n8n-nodes-converter-documents.converterdocuments
package_name: @mazix/n8n-nodes-converter-documents
display_name: converterdocuments
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: mzxs
author_github_url: git+https://github.com/mazixs/n8n-node-converter-documents.git
npm_package_name: @mazix/n8n-nodes-converter-documents
npm_version: 1.2.2
community_fetched_at: 2026-07-14T14:40:36.037Z
ai_summary_generated_at: 2026-03-25 22:47:20
description:
  n8n node to convert various document formats (DOCX, DOC, XML, YML, XLSX, CSV, PDF, TXT, PPT, PPTX, HTML, JSON, ODT, ODP, ODS) to JSON or text format

npm_readme:
  # n8n Document Converter Node

  [![npm version](https://img.shields.io/npm/v/@mazix/n8n-nodes-converter-documents.svg)](https://www.npmjs.com/package/@mazix/n8n-nodes-converter-documents)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
  [![Tests](https://img.shields.io/badge/tests-57%20passing-brightgreen.svg)](https://github.com/mazixs/n8n-node-converter-documents)
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.8-blue.svg)](https://www.typescriptlang.org/)
  [![n8n](https://img.shields.io/badge/n8n-2.7.0-orange.svg)](https://n8n.io/)

  > **n8n community node** for converting documents to JSON/text. Supports 15+ formats with AI-friendly output.

  ---

  ## Table of Contents

  - [Supported Formats](#supported-formats)
  - [Features](#features)
  - [Installation](#installation)
  - [Usage](#usage)
  - [Output Examples](#output-examples)
  - [Architecture](#architecture)
  - [Development](#development)
  - [License](#license)

  ---

  ## Supported Formats

  | Category | Formats | Details |
  |----------|---------|---------|
  | **Documents** | DOCX, DOC, ODT, TXT, PDF | Text, HTML, or Markdown output for DOCX |
  | **Spreadsheets** | XLSX, ODS, CSV | Multi-sheet parsing for XLSX/ODS and CSV |
  | **Presentations** | PPTX, PPT, ODP | Text extraction |
  | **Web & Data** | HTML, HTM, XML, JSON | Structure-aware parsing |
  | **E-commerce** | YML (Yandex Market) | Specialized shop/offers/categories parsing |

  ---

  ## Features

  **Core**
  - Automatic file type detection via magic bytes
  - Strategy pattern: each format has its own processing pipeline
  - DOCX output: plain text (default), HTML, or **Markdown** (GFM tables, headings, bold/italic)
  - DOCX → Markdown ideal for AI/LLM/RAG pipelines
  - XLSX multi-sheet processing with Excel-style column names (A, B, C...)
  - JSON flattening for nested structures
  - YML (Yandex Market) specialized parser
  - `usableAsTool: true` for n8n AI Agent integration

  **Reliability**
  - Concurrency control via promise pool (Set-based, no race conditions)
  - Fallback chains: DOCX uses officeparser -> mammoth, DOC/PPT uses CFB signature check + officeparser
  - File name sanitization (path traversal protection)
  - Configurable file size limits (up to 100MB)
  - Custom error classes with descriptive messages

  ---

  ## Installation

  ### Via n8n UI (recommended)

  ```
  Settings -> Community nodes -> Install
  Package name: @mazix/n8n-nodes-converter-documents
  ```

  ### Via CLI

  ```bash
  cd ~/.n8n
  npm install @mazix/n8n-nodes-converter-documents
  # Restart n8n
  ```

  ### Manual

  ```bash
  git clone https://github.com/mazixs/n8n-node-converter-documents.git
  cd n8n-node-converter-documents
  npm install
  npm run build
  # Copy dist/ and package.json to ~/.n8n/custom-nodes/n8n-node-converter-documents/
  ```

  ---

  ## Usage

  1. Add **"Convert File to JSON"** node to your workflow
  2. Connect a node that provides binary data (e.g., Read Binary File, HTTP Request)
  3. Configure parameters:

  | Parameter | Default | Description |
  |-----------|---------|-------------|
  | **Binary Property** | `data` | Name of the binary property with the file |
  | **Output Format (DOCX)** | `text` | `text`, `html`, or `markdown` (GFM with tables) |
  | **Max File Size (MB)** | `50` | File size limit |
  | **Max Concurrency** | `4` | Parallel file processing |

  ---

  ## Output Examples

  ### Text document (DOCX, PDF, TXT, etc.)

  ```json
  {
    "text": "Extracted document content...",
    "metadata": {
      "fileName": "report.docx",
      "fileSize": 12345,
      "fileType": "docx",
      "processedAt": "2026-02-08T00:00:00.000Z"
    }
  }
  ```

  ### DOCX with HTML output

  ```json
  {
    "text": "<p>Introduction</p><table><tr><td>Name</td><td>Value</td></tr>...</table>",
    "metadata": { "fileName": "data.docx", "fileType": "docx" }
  }
  ```

  ### DOCX with Markdown output

  ```json
  {
    "text": "# Introduction\n\n| Name | Value |\n| --- | --- |\n| Item | 100 |\n\n**Bold text** and _italic_",
    "metadata": { "fileName": "data.docx", "fileType": "docx" }
  }
  ```

  ### XLSX (multi-sheet)

  ```json
  {
    "sheets": {
      "Products": [
        { "A": "ID", "B": "Name", "C": "Price" },
        { "A": 1, "B": "Apple", "C": 100 }
      ],
      "Orders": [
        { "A": "Order", "B": "Qty" },
        { "A": 101, "B": 5 }
      ]
    },
    "metadata": { "fileName": "data.xlsx", "fileType": "xlsx" }
  }
  ```

  ### JSON (flattened)

  ```json
  {
    "text": "{\n  \"user.name\": \"John\",\n  \"user.address.city\": \"London\"\n}",
    "warning": "Multi-level JSON structure was converted to flat object"
  }
  ```

  ### YML (Yandex Market)

  ```json
  {
    "text": "{ \"shop\": { \"name\": \"MyShop\" }, \"currencies\": [...], \"categories\": [...], \"offers\": [...] }"
  }
  ```

  ---

  ## Architecture

  ### Project Structure

  ```
  src/
  ├── FileToJsonNode.node.ts   # Node class (~220 lines)
  ├── types.ts                 # Interfaces (JsonResult, StrategyFn, YML types)
  ├── errors.ts                # Custom error classes
  ├── helpers.ts               # extractViaOfficeParser, limitExcelSheet
  ├── strategies/
  │   └── index.ts             # All format strategies
  ├── processors/
  │   └── yml.ts               # Yandex Market YML processor
  └── utils/
      ├── sanitize.ts          # File name sanitization
      ├── promisePool.ts       # Concurrency control (Set-based)
      ├── columns.ts           # numberToColumn (1→A, 27→AA)
      ├── flatten.ts           # JSON flattening
      └── index.ts             # Barrel export
  ```

  ### Processing Flow

  ```
  Input binary → detect file type (magic bytes) → select strategy → process → output JSON
                                                        │
                                ┌────────────────────────┼────────────────────┐
                                │                        │                    │
                           Text formats            Spreadsheets         Special
                       (DOCX, PDF, TXT,          (XLSX, CSV, ODS)    (XML, JSON,
                        PPTX, HTML, ODT,                               YML, HTML)
                        ODP, DOC, PPT)
  ```

  ### Technology Stack

  | Component | Library | Version |
  |-----------|---------|---------|
  | DOCX/PDF/PPTX/OD* | officeparser | ^6.0.4 |
  | DOCX (HTML/MD) | mammoth | ^1.11.0 |
  | HTML → Markdown | node-html-markdown | ^2.0.0 |
  | XLSX | read-excel-file | ^6.0.3 |
  | CSV | papaparse | ^5.5.3 |
  | XML/YML | fast-xml-parser | ^5.3.4 |
  | HTML | node-html-parser | ^7.0.2 |
  | Encoding | chardet | ^2.1.1 |
  | File type | file-type | 16.5.4 |
  | n8n SDK | n8n-workflow | ^2.7.0 |
  | Runtime | Node.js | 22.x |
  | Language | TypeScript | 5.8 (strict) |
  | Tests | Jest | 30.x |

  ---

  ## Development

  ```bash
  npm install          # Install dependencies
  npm run build        # Compile TypeScript
  npm test             # Run 57 tests (13 suites)
  npm run lint         # ESLint check
  npm run dev          # Watch mode
  npm run test:coverage # Coverage report
  ```

  ### CI/CD

  - **CI** (`ci.yml`): lint -> build -> test -> security audit on push/PR to main/develop
  - **Auto Release** (`auto-release.yml`): creates GitHub Release + git tag on version bump in main
  - **npm publish**: manual (`npm publish --access public`)

  ---

  ## Limitations

  | Limitation | Details |
  |------------|---------|
  | **Legacy XLS** | Binary Excel not supported, convert to XLSX |
  | **file-type** | Pinned to v16.5.4 (last CJS version, v17+ is ESM-only) |
  | **Scanned PDFs** | Image-based PDFs return empty text (no OCR) |
  | **Large files** | PDF/XLSX load into RAM; use Max File Size to control |

  ---

  ## License

  [MIT](LICENSE) © mazix

  ---

  ## Links

  - [npm](https://www.npmjs.com/package/@mazix/n8n-nodes-converter-documents)
  - [GitHub](https://github.com/mazixs/n8n-node-converter-documents)
  - [Changelog](CHANGELOG.md)

ai_documentation_summary:
  {"purpose":"A n8n community node that converts various document formats (DOCX, PDF, XLSX, CSV, PPTX, HTML, JSON, YML, etc.) into JSON or text formats, including specialized parsing for Yandex Market YML files.","capabilities":["Convert DOCX to text, HTML, or Markdown (with GFM tables and formatting)","Convert PDF, TXT, ODT, ODP, PPT, PPTX to text","Parse XLSX and ODS with multi-sheet support and Excel-style column names","Parse CSV files","Parse HTML and XML with structure-aware parsing","Parse JSON with automatic flattening of nested structures","Specialized parsing for Yandex Market YML files (shops, offers, categories)","Automatic file type detection via magic bytes","Configurable file size limits (up to 100MB)","Concurrency control via promise pool"],"authentication":"None","commonUseCases":["Extracting document content for AI/LLM/RAG pipelines","Parsing spreadsheets for data analysis workflows","Converting uploaded files to structured JSON for downstream processing","Handling e-commerce data from Yandex Market","Preparing document content for chatbot or agent workflows"],"limitations":["Requires n8n 2.7.0 or higher","Not all formats support all output types (e.g., DOCX Markdown is specific)","File size limit of 100MB","Community node (may require manual installation via npm or UI)","Some formats rely on external libraries (officeparser, mammoth) which may have dependencies"],"relatedNodes":["Read Binary File","HTTP Request","AI Agent","JSON to Text","Text to JSON"]}


node_type: n8n-nodes-docx-converter.docxconverter
package_name: n8n-nodes-docx-converter
display_name: docxconverter
description: A node to convert Docx to Text
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: cre8tiv
author_github_url: git+https://github.com/cre8tiv/n8n-docx-converter.git
npm_package_name: n8n-nodes-docx-converter
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:36.038Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-docx-converter

  This is an n8n community node. It lets you use DOCX to Text conversion in your n8n workflows.

  DOCX to Text is a node that converts DOCX files to plain text.

  [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

  - Convert DOCX file to plain text

  ## Credentials

  No credentials are required for this node.

  ## Compatibility

  This node requires n8n version 1.0.0 or higher. It has been tested with the latest version of n8n.

  ## Usage

  To use this node, provide the path to the DOCX file that you want to convert to text. The node will output the path to the generated text file.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [Mammoth documentation](https://github.com/mwilliamson/mammoth.js)

  ## Version history

  ### 0.1.0
  - Initial release

  ### 0.1.3 
  - Use input and output destinations

ai_documentation_summary:
  {"purpose":"Converts DOCX files to plain text within n8n workflows. It takes a DOCX file path as input and outputs the generated text file path.","capabilities":["Convert DOCX file to plain text","Accept input DOCX file path","Output generated text file path"],"authentication":"None","commonUseCases":["Extracting text from Word documents for downstream processing","Converting DOCX uploads into plain text for automation workflows"],"limitations":["Requires n8n version 1.0.0 or higher","Only supports DOCX to plain text conversion"],"relatedNodes":["n8n community nodes","Mammoth documentation"]}


node_type: n8n-nodes-deepseek-chat-model.deepseekchatmodel
package_name: n8n-nodes-deepseek-chat-model
display_name: deepseekchatmodel
description: n8n community node for DeepSeek Chat Model with reasoning content preservation
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: nguyenthieutoan
author_github_url: git+https://github.com/nguyenthieutoan/n8n-nodes-deepseek-chat-model.git
npm_package_name: n8n-nodes-deepseek-chat-model
npm_version: 1.4.3
community_fetched_at: 2026-07-14T14:40:36.039Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-deepseek-chat-model

  Developed and maintained by **[Jay Nguyen (Nguyễn Thiệu Toàn)](https://nguyenthieutoan.com)**.

  🛡️ **[Verified n8n Creator](https://n8n.io/creators/nguyenthieutoan)** | 💼 CEO/Founder of **[GenStaff](https://genstaff.net)**

  **Connect with me:**  
  [![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=flat&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/nguyenthieutoan) [![Facebook](https://img.shields.io/badge/Facebook-1877F2?style=flat&logo=facebook&logoColor=white)](https://www.facebook.com/nguyenthieutoan) [![Website](https://img.shields.io/badge/Website-nguyenthieutoan.com-brightgreen?style=flat)](https://nguyenthieutoan.com) [![Email](https://img.shields.io/badge/Email-me%40nguyenthieutoan.com-blue?style=flat)](mailto:me@nguyenthieutoan.com)


  ---

  An optimized, community-verified n8n Chat Model node for **DeepSeek** (`deepseek-chat`, `deepseek-reasoner`, etc.) that solves the reasoning content tool-calling bug in n8n AI Agents and LangChain workflows.

  ## Features

  * **Corrected Reasoning Logic**: Automatically preserves and passes back the `reasoning_content` field in multi-turn tool-calling loops, preventing `400 Bad Request` API errors.
  * **Thinking Mode Control**: Easily toggle DeepSeek's thinking/reasoning process (Enabled/Disabled) and configure its thinking effort (`high` / `max`).
  * **AI Agent & LangChain Integration**: Fully compatible with n8n AI Agent and Advanced AI nodes.
  * **Fully Custom model names**: Support for standard models (`deepseek-chat`, `deepseek-reasoner`) as well as custom/self-hosted deployment models.

  ## Installation

  Go to **Settings > Community Nodes** in your n8n instance and install:

  ```bash
  n8n-nodes-deepseek-chat-model
  ```

  ## Credentials Configuration

  1. Get your API Key from the [DeepSeek Console](https://platform.deepseek.com/).
  2. In n8n, set up a new **DeepSeek API** credential:
     * **API Key**: Enter your DeepSeek API key.
     * **Base URL Override**: Default is `https://api.deepseek.com`, but can be replaced if using a proxy or local inference model (e.g. Ollama).

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"An n8n chat model node for DeepSeek that preserves reasoning content during multi-turn tool-calling, helping avoid 400 Bad Request errors in AI Agent and LangChain workflows.","capabilities":["Supports DeepSeek chat models such as deepseek-chat and deepseek-reasoner","Preserves and forwards reasoning_content across tool-calling loops","Allows enabling or disabling DeepSeek thinking/reasoning mode","Lets users configure thinking effort (high or max)","Supports custom model names including self-hosted or proxy-backed deployments","Integrates with n8n AI Agent and Advanced AI nodes"],"authentication":"DeepSeek API key required via DeepSeek API credential; optional Base URL override supported for proxy or local inference endpoints.","commonUseCases":["Using DeepSeek as the chat model in n8n AI Agent workflows","Running LangChain-based workflows with DeepSeek while preserving reasoning content","Connecting to custom or self-hosted DeepSeek-compatible endpoints","Toggling reasoning/thinking behavior for different assistant responses"],"limitations":["Designed specifically for DeepSeek chat models","Base URL override is needed for non-default endpoints or local/proxy deployments"],"relatedNodes":["n8n AI Agent","Advanced AI nodes","LangChain workflows"]}


node_type: @mbakgun/n8n-nodes-slack-socket-mode.slacksocketmode
package_name: @mbakgun/n8n-nodes-slack-socket-mode
display_name: slacksocketmode
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: mbakgun
author_github_url: git+https://github.com/mbakgun/n8n-slack-socket-mode.git
npm_package_name: @mbakgun/n8n-nodes-slack-socket-mode
npm_version: 1.7.1
community_fetched_at: 2026-07-14T14:40:36.040Z
ai_summary_generated_at: 2026-03-25 22:47:20
description:
  Slack Socket Mode Node for n8n that allows you to use +100 Slack events in your n8n instance with proxy mode

npm_readme:
  # @mbakgun/n8n-nodes-slack-socket-mode

  <div align="center">
    <img src="https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png" width="200" alt="n8n logo">
    <h3>+</h3>
    <img src="https://cdn.worldvectorlogo.com/logos/slack-new-logo.svg" width="100" alt="Slack logo">
  </div>

  This is an n8n community node that lets you use Slack Socket Mode in your n8n workflows. It enables real-time event processing from Slack without requiring public URLs for webhooks.

  Since the current integration of Slack in n8n only supports webhooks, this node allows you to use the Slack Socket Mode to listen to events in your Slack workspace in real-time, even in local development environments.

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

  ## Table of Contents
  - [Installation](#installation)
  - [Slack App Setup](#slack-app-setup)
  - [Credentials](#credentials)
  - [Node Configuration](#node-configuration)
  - [Supported Events](#supported-events)
  - [Usage Examples](#usage-examples)
  - [Example Workflow](#example-workflow)
  - [Compatibility](#compatibility)
  - [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.

  Using Bun (recommended):
  ```bash
  bun add @mbakgun/n8n-nodes-slack-socket-mode
  ```

  Using npm:
  ```bash
  npm install @mbakgun/n8n-nodes-slack-socket-mode
  ```

  After installation, restart n8n and the node will be available in the nodes panel.

  ### Development Setup

  This project uses [Bun](https://bun.sh) as its package manager. To set up your development environment:

  1. Install Bun:
     ```bash
     curl -fsSL https://bun.sh/install | bash
     ```
     
  2. Install dependencies:
     ```bash
     bun install
     ```
     
  3. Build the project:
     ```bash
     bun run build
     ```

  ## Slack App Setup

  Before using this node, you need to create a Slack app with Socket Mode enabled:

  1. Go to [https://api.slack.com/apps](https://api.slack.com/apps) and create a new app
  2. Navigate to "Socket Mode" in the left sidebar and enable it
  3. Generate an 'App-Level Token' with the `connections:write` scope
  4. Go to "OAuth & Permissions" and add the following Bot Token Scopes:
     - `app_mentions:read`
     - `channels:history`
     - `channels:read`
     - `chat:write`
     - `commands`
     - `reactions:read`
     - `team:read`
     - (Add any other scopes required for your use case)
  5. Install the app to your workspace (This will generate a 'Bot User OAuth Token')
  6. Copy the Bot User OAuth Token, App-Level Token, and Signing Secret(from the 'Basic Information' section) for credential setup
  7. Go to 'Event Subscriptions' and enable 'Socket Mode'
  8. Subscribe to the events you want to listen to (e.g. `app_mention`, `message`, `reaction_removed`, `reaction_added`)

  ## Credentials

  To use this node, you need to set up credentials with the following information:

  - **Bot Token**: Your Slack Bot User OAuth Token (starts with `xoxb-`)
  - **App-Level Token**: Your Slack App-Level Token for Socket Mode (starts with `xapp-`)
  - **Signing Secret**: Your Slack App Signing Secret

  These values can be found in your Slack App configuration.

  ## Node Configuration

  The Slack Socket Trigger node can be configured with the following options:

  - **Trigger On**: Select which Slack events should trigger your workflow:
    - All Slack events are now supported (app_mention, message, reaction events, channel events, etc.)
    - See the Supported Events section below for a complete list of available events

  - **Regex Pattern**: Optional regular expression to match against the entire event JSON structure (not just message text). This allows matching on any field in the event, such as subtypes, attachment colors, user IDs, etc.
    - Example: `(?=.*bot_message)(?=.*#FF0000)` matches events that contain both `bot_message` and the color `#FF0000`
    - Example: `help|assist|support` matches events containing any of these words anywhere in the event data
  - **Regex Flags**: Flags for the regular expression (e.g., `g` for global, `i` for case-insensitive)
  - **Slash Commands**: Comma-separated list of slash commands to listen for (e.g., `deploy, status, help`). Leave empty to listen for all slash commands. Do not include the leading slash.
  - **Channels to Watch**: Optional list of channels to filter events. Click **Add Channel** to add channels. Each channel can be selected from the dropdown or entered by ID (e.g., `C1234567890`, `G1234567890`)
  - **Legacy Channel to Watch**: Preserved single-channel selector for workflows created before version 1.4.2

  This node supports using an HTTP or HTTPS proxy by reading the following environment variables:

  ```bash
  export HTTP_PROXY=http://proxy.example.com:3128
  # or
  export HTTPS_PROXY=http://proxy.example.com:3128
  ```

  ## Supported Events

  The node currently supports the following Slack events:

  - `app_mention`: When your bot is mentioned in a channel
  - `block_actions`: When a user interacts with buttons, including NPS-style ratings
  - `message`: When a message is posted to a channel the app is added to
  - `channel_created`: When a new public channel is created
  - `team_join`: When a new user is added to Slack
  - `reaction_added`: When a reaction is added to a message
  - `reaction_removed`: When a reaction is removed from a message
  - `app_deleted`: User has deleted an app
  - `app_home_opened`: User clicked into your App Home
  - `app_installed`: User has installed an app
  - `app_mention`: Subscribe to only the message events that mention your app or bot
  - `app_rate_limited`: Indicates your app's event subscriptions are being rate limited
  - `app_requested`: User requested an app
  - `app_uninstalled`: Your Slack app was uninstalled
  - `app_uninstalled_team`: User has uninstalled an app
  - `assistant_thread_context_changed`: The context changed while an AI assistant thread was visible
  - `assistant_thread_started`: An AI assistant thread was started
  - `bot_added`: A bot user was added
  - `bot_changed`: A bot user was changed
  - `call_rejected`: A Call was rejected
  - `channel_archive`: A channel was archived
  - `channel_created`: A channel was created
  - `channel_deleted`: A channel was deleted
  - `channel_history_changed`: Bulk updates were made to a channel's history
  - `channel_id_changed`: A channel ID changed
  - `channel_joined`: You joined a channel
  - `channel_left`: You left a channel
  - `channel_marked`: Your channel read marker was updated
  - `channel_rename`: A channel was renamed
  - `channel_shared`: A channel has been shared with an external workspace
  - `channel_unarchive`: A channel was unarchived
  - `channel_unshared`: A channel has been unshared with an external workspace
  - `commands_changed`: A slash command has been added or changed
  - `dnd_updated`: Do not Disturb settings changed for the current user
  - `dnd_updated_user`: Do not Disturb settings changed for a member
  - `email_domain_changed`: The workspace email domain has changed
  - `emoji_changed`: A custom emoji has been added or changed
  - `external_org_migration_finished`: An enterprise grid migration has finished on an external workspace
  - `external_org_migration_started`: An enterprise grid migration has started on an external workspace
  - `file_change`: A file was changed
  - `file_comment_added`: A file comment was added
  - `file_comment_deleted`: A file comment was deleted
  - `file_comment_edited`: A file comment was edited
  - `file_created`: A file was created
  - `file_deleted`: A file was deleted
  - `file_public`: A file was made public
  - `file_shared`: A file was shared
  - `file_unshared`: A file was unshared
  - `function_executed`: Your app function is executed as a step in a workflow
  - `goodbye`: The server intends to close the connection soon
  - `grid_migration_finished`: An enterprise grid migration has finished on this workspace
  - `grid_migration_started`: An enterprise grid migration has started on this workspace
  - `group_archive`: A private channel was archived
  - `group_close`: You closed a private channel
  - `group_deleted`: A private channel was deleted
  - `group_history_changed`: Bulk updates were made to a private channel's history
  - `group_joined`: You joined a private channel
  - `group_left`: You left a private channel
  - `group_marked`: A private channel read marker was updated
  - `group_open`: You created a group DM
  - `group_rename`: A private channel was renamed
  - `group_unarchive`: A private channel was unarchived
  - `hello`: The client has successfully connected to the server
  - `im_close`: You closed a DM
  - `im_created`: A DM was created
  - `im_history_changed`: Bulk updates were made to a DM's history
  - `im_marked`: A direct message read marker was updated
  - `im_open`: You opened a DM
  - `invite_requested`: User requested an invite
  - `link_shared`: A message was posted containing one or more links relevant to your application
  - `manual_presence_change`: You manually updated your presence
  - `member_joined_channel`: A user joined a public channel, private channel or MPDM
  - `member_left_channel`: A user left a public or private channel
  - `message`: A message was sent to a channel
  - `message.app_home`: A user sent a message to your Slack app
  - `message.channels`: A message was posted to a channel
  - `message.groups`: A message was posted to a private channel
  - `message.im`: A message was posted in a direct message channel
  - `message.mpim`: A message was posted in a multiparty direct message channel
  - `message_metadata_deleted`: Message metadata was deleted
  - `message_metadata_posted`: Message metadata was posted
  - `message_metadata_updated`: Message metadata was updated
  - `pin_added`: A pin was added to a channel
  - `pin_removed`: A pin was removed from a channel
  - `pref_change`: You have updated your preferences
  - `presence_change`: A member's presence changed
  - `presence_query`: Determine the current presence status for a list of users
  - `presence_sub`: Subscribe to presence events for the specified users
  - `reaction_added`: A member has added an emoji reaction to an item
  - `reaction_removed`: A member removed an emoji reaction
  - `reconnect_url`: Experimental
  - `resources_added`: Access to a set of resources was granted for your app
  - `resources_removed`: Access to a set of resources was removed for your app
  - `scope_denied`: OAuth scopes were denied to your app
  - `scope_granted`: OAuth scopes were granted to your app
  - `shared_channel_invite_accepted`: A shared channel invite was accepted
  - `shared_channel_invite_approved`: A shared channel invite was approved
  - `shared_channel_invite_declined`: A shared channel invite was declined
  - `shared_channel_invite_received`: A shared channel invite was sent to a Slack user
  - `shared_channel_invite_requested`: A shared channel invite was requested
  - `star_added`: A member has saved an item for later or starred an item
  - `star_removed`: A member has removed an item saved for later or starred an item
  - `subteam_created`: A User Group has been added to the workspace
  - `subteam_members_changed`: The membership of an existing User Group has changed
  - `subteam_self_added`: You have been added to a User Group
  - `subteam_self_removed`: You have been removed from a User Group
  - `subteam_updated`: An existing User Group has been updated or its members changed
  - `team_access_granted`: Access to a set of teams was granted to your org app
  - `team_access_revoked`: Access to a set of teams was revoked from your org app
  - `team_domain_change`: The workspace domain has changed
  - `team_join`: A new member has joined
  - `team_migration_started`: The workspace is being migrated between servers
  - `team_plan_change`: The account billing plan has changed
  - `team_pref_change`: A preference has been updated
  - `team_profile_change`: The workspace profile fields have been updated
  - `team_profile_delete`: The workspace profile fields have been deleted
  - `team_profile_reorder`: The workspace profile fields have been reordered
  - `team_rename`: The workspace name has changed
  - `tokens_revoked`: API tokens for your app were revoked
  - `url_verification`: Verifies ownership of an Events API Request URL
  - `user_change`: A member's data has changed
  - `user_resource_denied`: User resource was denied to your app
  - `user_resource_granted`: User resource was granted to your app
  - `user_resource_removed`: User resource was removed from your app
  - `user_typing`: A channel member is typing a message
  - `view_submission`: When a modal view is submitted 
  - `view_closed`: When a modal view is closed
  - `workflow_deleted`: A workflow that contains a step supported by your app was deleted
  - `workflow_published`: A workflow that contains a step supported by your app was published
  - `workflow_step_deleted`: A workflow step supported by your app was removed from a workflow
  - `workflow_step_execute`: A workflow step supported by your app should execute
  - `workflow_unpublished`: A workflow that contains a step supported by your app was unpublished
  - `slash_command`: When a user invokes a slash command

  ## Usage Examples

  ### Respond to mentions

  Configure the node to trigger on `app_mention` events to make your workflow respond when someone mentions your bot.

  ### Process messages matching a pattern

  Use the Regex Pattern field to only trigger on messages that match a specific pattern:
  - Pattern: `help|assist|support`
  - Flags: `i`

  This will trigger the workflow only when messages containing "help", "assist", or "support" (case-insensitive) are posted.

  ### Monitor channel creation

  Set the trigger to `channel_created` to run workflows whenever a new channel is created in your workspace.

  ## Example Workflow

  Here's an example of a simple workflow that responds to Slack mentions:

  ```
  [Slack Socket Trigger] → [JSON Parse] → [IF] → [HTTP Request] → [Slack]
  ```

  1. **Slack Socket Trigger**: Configured to trigger on app mentions
  2. **JSON Parse**: Extracts the message text and channel from the event data
  3. **IF**: Checks if the message contains certain keywords
  4. **HTTP Request**: Fetches relevant data based on the message
  5. **Slack**: Sends a response back to the channel

  This workflow allows you to create a Slack bot that responds to mentions with data from external APIs, all without needing to expose your n8n instance to the internet.

  ## Compatibility

  - Requires n8n version 1.6.0 or later
  - Tested against n8n versions 1.91.3
  - Uses Bun as package manager for improved performance

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Slack API Documentation](https://api.slack.com/apis)
  - [Slack Socket Mode Documentation](https://api.slack.com/apis/connections/socket)
  - [Slack Events API Documentation](https://api.slack.com/events)
  - [Bun Documentation](https://bun.sh/docs)

  ### Workflow Building Tools

  - [n8n Builder](https://n8nbuilder.dev/) - AI-powered workflow generator. Great for quickly prototyping Socket Mode workflows with natural language.

  ## Contributors

  We appreciate all contributions to this project! 🎉

  ### How to Contribute

  1. Fork the repository
  2. Create a feature branch (`git checkout -b feature/amazing-feature`)
  3. Make your changes
  4. Run tests and ensure build passes (`bun run build`)
  5. Commit your changes (`git commit -m 'Add some amazing feature'`)
  6. Push to the branch (`git push origin feature/amazing-feature`)
  7. Open a Pull Request

  Special thanks to all contributors who help improve this project!

  ## Version History

  - **1.6.5**: Reverted trigger lifecycle guard changes from [PR #10](https://github.com/mbakgun/n8n-slack-socket-mode/pull/10)
  - **1.6.3**: Socket Mode reliability by **[@ziyaozclk](https://github.com/ziyaozclk)** and trigger lifecycle by **[@Ilexpwh](https://github.com/Ilexpwh)**
    - Increased Socket Mode client/server ping timeouts via `SocketModeReceiver` to reduce false disconnects when Slack recycles backends ([PR #11](https://github.com/mbakgun/n8n-slack-socket-mode/pull/11))
    - Guarded the socket trigger with an `isStopped` flag and handler checks so events do not emit after workflow deactivate/save; mitigates stale workflow runs ([PR #10](https://github.com/mbakgun/n8n-slack-socket-mode/pull/10))
  - **1.6.1**: Added slash command trigger support by **[@ydogukan-yd](https://github.com/ydogukan-yd)**
    - Added `slash_command` event listener for handling slash commands
    - Added configurable slash commands field to filter specific commands
    - Enables building interactive Slack workflows with custom slash commands in n8n
  - **1.6.0**: Upgraded @slack/bolt to v4.6.0
    - Fixed dependency resolution issues that caused `ENOENT` errors during installation
    - Resolved nested dependency conflicts with `@slack/logger` and other Slack packages
    - If you experienced installation errors, please upgrade to 1.6.0
  - **1.5.1**: Added modal view event support by **[@unbalanced](https://github.com/unbalanced)**
    - Added `view_submission` event listener for handling modal form submissions
    - Added `view_closed` event listener for detecting when modals are dismissed
    - Enables building interactive Slack workflows with modal forms in n8n
  - **1.5.0**: Enhanced regex pattern matching for entire event structure
    - Changed regex matching to work against the entire event JSON instead of just the text field
    - Enables matching on any event property including subtypes, attachment colors, metadata, etc.
    - Supports complex patterns like `(?=.*bot_message)(?=.*#FF0000)` to match multiple conditions
    - Provides more flexible event filtering for advanced use cases
  - **1.4.2**: Fixed multi-channel selector implementation
    - Each channel entry now properly supports both dropdown selection and manual ID input
    - Maintained backward compatibility with legacy single-channel selector
  - **1.3.6**: Production release with enhanced event handler architecture
    - Stable release of message event handler improvements from 1.3.5
    - Production-ready named function handlers for all message events
    - Verified event capture and processing reliability
    - Ready for enterprise deployments with improved debugging capabilities
  - **1.3.5**: Enhanced message event handler architecture for better app event handling
    - Refactored message event handlers into named functions (handleMessageEvent, handleMessageSubtypeEvent)
    - Fixed event capture and processing by separating handler definition from registration
    - Improved app.event() listener registration to properly catch all message events
    - Enhanced code maintainability and debugging with named function handlers
    - Better event handling reliability for message and message subtype events
  - **1.3.3**: Improved message event handling
    - Refactored message event listeners to use app.event() instead of app.message()
    - Fixed regex state management by resetting lastIndex for global regex flags
    - Enhanced null safety with explicit event and text validation
    - Reduced code duplication in message subtype handling
    - Improved early return pattern for better code readability
  - **1.3.2**: Fixed block actions acknowledgement by **[@keenlim](https://github.com/keenlim)**
    - Added proper acknowledgement for block actions interactions
    - Fixed socket to Slack communication for button interactions
  - **1.3.1**: Enhanced channel filtering for all event types
    - Fixed channel filtering for events like `reaction_added`, `pin_added`, `file_shared`, etc.
    - Added comprehensive channel ID extraction from multiple event properties (`event.channel`, `event.item.channel`, `event.item.channel_id`, `event.file.channels`)
  - **1.3.0**: Channel filtering feature by **[@tongshengng](https://github.com/tongshengng)**
    - Added "Channel to watch" field similar to official Slack trigger node
    - Implemented optional channel ID parameter to filter incoming Slack events
    - Added searchable dropdown with channel selection via Slack API
    - Improved event targeting by filtering events from specific channels only
    - Added channel ID format validation for manual entry
  - **1.2.5**: Added proxy support by **[@minimorph223](https://github.com/minimorph223)**
    - Added `http-proxy-agent` dependency for HTTP/HTTPS proxy support
    - Enhanced connectivity options for enterprise environments
  - **1.2.3**: Enhanced message filtering by **[@macchiang](https://github.com/macchiang)**
    - Fixed invalid `message.im` event type with proper channel_type filtering
    - Added support for filtering Slack messages by channel type (channels, groups, im, mpim, app_home)
    - Improved message filtering capabilities using Slack Bolt framework best practices
    - Resolved TypeScript typing issues
  - **1.2.0**: Added support for all Slack events
    - Updated to include all events from the Slack Events API
    - Improved event descriptions and documentation
  - **1.0.0**: Initial release - Project initialized with Socket Mode support for Slack events
    - Support for app_mention, message, reaction events
    - Added button interaction support

  ## License

  MIT License

  Copyright (c) 2025 Mehmet Burak Akgün

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.

ai_documentation_summary:
  {"purpose":"A n8n community node that enables real-time Slack Socket Mode integration, allowing workflows to listen to and process over 100 Slack events without requiring public webhook URLs.","capabilities":["Real-time event processing from Slack","Support for 100+ Slack event types including messages, reactions, and channel events","Regex pattern matching on entire event JSON structures","Regex flag configuration for flexible filtering","Slash command listening","Channel filtering by ID","HTTP/HTTPS proxy support for local development","No public webhook URL requirement"],"authentication":"None (uses Slack App-Level Token, Bot User OAuth Token, and Signing Secret via credentials)","commonUseCases":["Real-time monitoring of Slack messages and reactions","Automated responses to specific message patterns or subtypes","Local development environments without exposing public webhooks","Slash command automation","Event-based workflow triggers based on channel or user activity"],"limitations":["Requires manual Slack App setup with Socket Mode enabled","Requires specific token scopes and permissions to be configured in Slack","Proxy configuration requires environment variables (HTTP_PROXY or HTTPS_PROXY)","Legacy channel selector may not work in newer workflows (version 1.4.2+)"],"relatedNodes":["Slack Webhook Trigger","Slack Webhook Response","Slack Webhook Trigger (Community)","Slack Webhook Response (Community)"]}


node_type: n8n-nodes-odoo-enhanced.odooenhanced
package_name: n8n-nodes-odoo-enhanced
display_name: odooenhanced
description: Enhanced Odoo node for n8n with features from PR #15676
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: jumox_8
author_github_url: git+https://github.com/votre-username/n8n-nodes-odoo-enhanced.git
npm_package_name: n8n-nodes-odoo-enhanced
npm_version: 1.0.0
community_fetched_at: 2026-07-14T14:40:36.041Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-odoo-enhanced

  Enhanced Odoo node for n8n with advanced features from PR #15676

  ## Description

  This community node extends n8n's Odoo integration with enhanced capabilities including:

  - Enhanced method execution
  - Improved error handling  
  - Better field mapping
  - All features from n8n PR #15676

  ## Installation

  ### In n8n (Recommended)

  1. Go to **Settings** > **Community Nodes**
  2. Click **Install**
  3. Enter: \
  8n-nodes-odoo-enhanced\
  4. Click **Install**

  ### Manual Installation

  \\\ash
  npm install n8n-nodes-odoo-enhanced
  \\\

  ## Usage

  After installation, you'll find "Odoo Enhanced (PR15676)" in your n8n nodes panel under the Transform category.

  ## Features

  - **Create** records with enhanced validation
  - **Read** records with improved filtering
  - **Update** records with better field handling
  - **Delete** records safely
  - **Execute Method** with advanced parameter handling

  ## Requirements

  - n8n version 1.0.0 or higher
  - Odoo 12.0 or higher

  ## License

  MIT

  ## Contributing

  This node is based on the official n8n Odoo node with enhancements from PR #15676.

ai_documentation_summary:
  {"purpose":"An enhanced Odoo integration node for n8n that provides advanced CRUD operations, improved error handling, and better field mapping capabilities.","capabilities":["Create Odoo records with enhanced validation","Read Odoo records with improved filtering","Update Odoo records with better field handling","Delete Odoo records safely","Execute Odoo methods with advanced parameter handling"],"authentication":"None (uses standard Odoo authentication via credentials)","commonUseCases":["Automated data synchronization between n8n and Odoo","Enhanced error recovery in Odoo workflow integrations","Advanced Odoo method execution for custom business logic"],"limitations":["Requires n8n version 1.0.0 or higher","Requires Odoo 12.0 or higher"],"relatedNodes":["n8n-nodes-odoo.odoo"]}


node_type: n8n-nodes-docx-to-md.docxtomd
package_name: n8n-nodes-docx-to-md
display_name: docxtomd
description: n8n node to convert Docx files to Markdown
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: sfrangulov
author_github_url: git+https://github.com/sfrangulov/n8n-nodes-docx-to-md.git
npm_package_name: n8n-nodes-docx-to-md
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:36.042Z
ai_summary_generated_at: 2026-03-25 22:47:20
npm_readme:
  <div align="center">

  # n8n-nodes-docx-to-md

  **Convert Microsoft Word documents (`.docx`) to clean, GitHub-flavored Markdown — right inside your n8n workflows.**

  [![npm version](https://img.shields.io/npm/v/n8n-nodes-docx-to-md.svg?color=brightgreen)](https://www.npmjs.com/package/n8n-nodes-docx-to-md)
  [![npm downloads](https://img.shields.io/npm/dm/n8n-nodes-docx-to-md.svg)](https://www.npmjs.com/package/n8n-nodes-docx-to-md)
  [![CI](https://github.com/sfrangulov/n8n-nodes-docx-to-md/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/sfrangulov/n8n-nodes-docx-to-md/actions/workflows/ci.yml)
  [![codecov](https://codecov.io/gh/sfrangulov/n8n-nodes-docx-to-md/branch/master/graph/badge.svg)](https://codecov.io/gh/sfrangulov/n8n-nodes-docx-to-md)
  [![License: MIT](https://img.shields.io/npm/l/n8n-nodes-docx-to-md.svg)](https://github.com/sfrangulov/n8n-nodes-docx-to-md/blob/master/LICENSE.md)
  [![Node Version](https://img.shields.io/node/v/n8n-nodes-docx-to-md.svg)](https://nodejs.org)
  [![n8n community node](https://img.shields.io/badge/n8n-community%20node-FF6D5A)](https://docs.n8n.io/integrations/community-nodes/)
  [![AI Agent Tool](https://img.shields.io/badge/AI%20Agent-tool%20ready-8A2BE2)](https://docs.n8n.io/advanced-ai/examples/understand-tools/)

  </div>

  This n8n community node provides seamless conversion of Word documents to clean, GitHub-flavored Markdown with automatic formatting correction and linting.

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

  ## Table of Contents

  - [Installation](#installation)
  - [Operations](#operations)
  - [Compatibility](#compatibility)
  - [Usage](#usage)
  - [Resources](#resources)
  - [Author](#author)
  - [License](#license)

  ## Installation

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

  ## Operations

  The Docx to Markdown node supports the following operation:

  - **Convert**: Converts a Microsoft Word document (.docx) from binary data to clean Markdown format

  ### Features

  - Converts Word documents to GitHub-flavored Markdown
  - Automatically converts tables with proper headers
  - Applies markdown linting and formatting corrections
  - Preserves document structure and formatting
  - Supports headings, lists, tables, and basic text formatting
  - **Option to remove images** from the converted Markdown output

  ## Compatibility

  - Minimum n8n version: 1.0.0
  - Tested with n8n versions: 1.0.0+
  - Compatible with all n8n deployment methods (self-hosted, cloud, desktop)

  ## Usage

  ### Basic Setup

  1. Add the "Docx to Markdown" node to your workflow
  2. Configure the **Input Binary Field** parameter with the name of the field containing your Word document binary data (default: "data")
  3. Configure the **Destination Output Field** parameter with the name where you want the converted Markdown text to be stored (default: "text")
  4. Optionally, enable **Remove Images** if you want to exclude all images from the converted Markdown (default: false)

  ### Configuration Options

  | Parameter | Type | Default | Description |
  |-----------|------|---------|-------------|
  | Input Binary Field | String | "data" | Name of the field containing the Word document binary data |
  | Destination Output Field | String | "text" | Name of the field where converted Markdown will be stored |
  | Remove Images | Boolean | false | Whether to remove all images from the converted Markdown |

  ### Example Workflow

  1. Use an HTTP Request node or file input to get a .docx file
  2. Connect it to the Docx to Markdown node
  3. The converted Markdown will be available in the specified output field
  4. Use the Markdown output in subsequent nodes (e.g., save to file, send via email, etc.)

  ### Tips

  - The node automatically handles table formatting by converting the first row to headers
  - All markdown output is linted and formatted for consistency
  - Binary data should be in proper .docx format for best results
  - Use the "Remove Images" option when you need clean text-only output without image references
  - Images in Word documents are typically converted to markdown image syntax (`![alt](src)`) unless the Remove Images option is enabled

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Mammoth.js documentation](https://github.com/mwilliamson/mammoth.js/) (underlying conversion library)
  - [Turndown documentation](https://github.com/mixmark-io/turndown) (HTML to Markdown converter)
  - [GitHub Flavored Markdown Spec](https://github.github.com/gfm/)

  ## Author

  Built by **[Sergei Frangulov](https://github.com/sfrangulov)** · [LinkedIn](https://www.linkedin.com/in/sfrangulov/)

  ## License

  [MIT](https://github.com/sfrangulov/n8n-nodes-docx-to-md/blob/master/LICENSE.md)

ai_documentation_summary:
  {"purpose":"Converts Microsoft Word (.docx) files to GitHub-flavored Markdown with automatic formatting correction and linting.","capabilities":["Converts .docx files to Markdown","Automatically converts tables with proper headers","Applies markdown linting and formatting corrections","Preserves document structure and formatting","Supports headings, lists, tables, and basic text formatting","Option to remove images from output"],"authentication":"None","commonUseCases":["Converting uploaded Word documents to Markdown for documentation","Preparing Word content for GitHub repositories","Extracting text-only content from Word files by removing images","Formatting Word documents for web publishing"],"limitations":["Requires binary .docx file input","Images are converted to markdown syntax unless explicitly removed","Depends on Mammoth.js and Turndown libraries for conversion"],"relatedNodes":["HTTP Request","File Input","Save to File","Send Email","GitHub Webhook"]}


node_type: n8n-nodes-actual.actual
package_name: n8n-nodes-actual
display_name: actual
description: Interact with your Actual Budget instance
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: GitHub Actions
author_github_url: git+https://github.com/TheFehr/n8n-nodes-actual.git
npm_package_name: n8n-nodes-actual
npm_version: 26.7.15
community_fetched_at: 2026-07-14T14:40:36.043Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # n8n-nodes-actual

  This is a n8n community node. It lets you use Actual in your n8n workflows.

  Actual is a local-first personal finance tool. It is 100% free and open-source, written in NodeJS, it has a synchronization element so that all your changes can move between devices without any heavy lifting.

  [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)  
  [Resources](#resources)  
  [License](#license)

  ## Installation

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

  ## Operations

  - **Get Budget Month** — retrieve budget data (income, spending, balances per category) for a given month
  - **Get Transactions** — fetch transactions from an account within a date range
  - **Import Transactions** — import a list of transactions into an account
  - **Set Budget Amount** — set the budgeted amount for a category in a given month


  ## Credentials
  The URL and the password of your actual server.
  E2E budgets are currently **not** supported.


  ## Compatibility

  This was developed for version 2.29.10 of n8n and version 26.7.0 of Actual.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [Actual Budget Website](https://actualbudget.org/)

  ## License

  MIT, see [LICENSE.md](LICENSE.md).

  Community node packages can't declare native-addon or shared-library runtime
  dependencies, so a few third-party packages (`@actual-app/api`, `better-sqlite3`,
  `detect-libc`, and their own dependencies) are bundled directly into this package's
  build output rather than installed normally — see
  [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) for their license terms.

ai_documentation_summary:
  {"purpose":"Interact with an Actual Budget server from n8n workflows to retrieve budget data, manage budget amounts, and fetch or import transactions.","capabilities":["Retrieve budget month data including income, spending, and balances per category","Fetch transactions from an account within a date range","Import a list of transactions into an account","Set the budgeted amount for a category in a given month"],"authentication":"Actual server URL and password required","commonUseCases":["Sync or analyze Actual Budget transaction data in automated workflows","Import transactions from external systems into an Actual account","Generate monthly budget reports from Actual data","Automatically update category budget amounts for a specific month"],"limitations":["End-to-end encrypted budgets are not supported","Developed for n8n 2.29.10 and Actual 26.7.0"],"relatedNodes":[]}


node_type: n8n-nodes-tesseractjs.tesseractjs
package_name: n8n-nodes-tesseractjs
display_name: tesseractjs
description: A n8n module that exposes Tesseract.js, an OCR library that can detect text on images
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: jreyesr
author_github_url: git+https://github.com/jreyesr/n8n-nodes-tesseractjs.git
npm_package_name: n8n-nodes-tesseractjs
npm_version: 1.5.1
community_fetched_at: 2026-07-14T14:40:36.043Z
ai_summary_generated_at: 2026-03-25 22:47:20
npm_readme:
  # n8n-nodes-tesseractjs

  This is a n8n community node. It lets you use [Tesseract.js](https://tesseract.projectnaptha.com/) in your n8n
  workflows.

  [Tesseract](https://github.com/tesseract-ocr/tesseract?tab=readme-ov-file#about) is an open source OCR (Optical
  Character Recognition) engine that can recognize text (machine/typed/printed text, not handwritten) in images (e.g. PNG
  or JPEG) or images embedded in PDF files.

  To read text from PDFs directly (not from images), you may want
  [the **Extract from PDF** operation of the built-in **Extract from file** node
  ](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.extractfromfile/#operations)

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

  [Installation](#installation)  
  [Operations](#operations)  
  [Compatibility](#compatibility)  
  [Usage](#usage)  <!-- delete if not using this section -->  
  [Resources](#resources)  
  [Version history](#version-history)  <!-- delete if not using this section -->

  ## Installation

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

  You can quickly get started by importing [the sample playbook](./sample_workflow.json).

  ## Operations

  Note: both operations will output a new binary field, called `ocr`, which contains the image that was actually OCR'd.
  For input images, this will be the same image. For input PDFs, this will be each image in the PDF.

  ### Extract text

  This operation reads the text of the entire image. It outputs a JSON item containing the entire recognized text, and a "
  confidence value" indicating how likely the generated text is to match the source image, as a percentage:

  ```json
  {
  	"text": "...",
  	"confidence": 94
  }
  ```

  If passed a PDF instead of an image, the node may output several items, one for each image in the PDF. Each item will
  have the format described above.

  ### Extract boxes

  This operation also reads text, but returns more information about the bounding box of each detected block, and the
  detected
  language if available.

  The "granularity" of the detections can be controlled: you can split on paragraphs, lines, words or individual
  characters.

  ```json
  {
  	"blocks": [
  		{
  			"text": "This",
  			"confidence": 95.15690612792969,
  			"bbox": {
  				"x0": 36,
  				"y0": 92,
  				"x1": 96,
  				"y1": 116
  			},
  			"language": "eng"
  		},
  		{
  			"text": "is",
  			"confidence": 95.15690612792969,
  			"bbox": {
  				"x0": 109,
  				"y0": 92,
  				"x1": 129,
  				"y1": 116
  			},
  			"language": "eng"
  		},
  		...
  	]
  }
  ```

  ![an image of some text with Tesseract detections overlaid. Each word is surrounded in a light red box, and each box also has text on top indicating the detected word and confidence percentage](imgs/words.png)

  Entire paragraphs:

  ![an image of the same text with Tesseract per-paragraph detections overlaid as one red box covering each paragraph](imgs/paragraphs.png)

  Per-line statistics:

  ![an image of the same text with Tesseract per-line detections overlaid as one red box covering each line](imgs/lines.png)

  If passed a PDF instead of an image, the node may output several items, one for each image in the PDF. Each item will
  have the format described above.

  ## Compatibility

  This node has been tested on n8n v1.68.0, but should also work on older versions. If you encounter an issue with an
  older version, please [raise an issue](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues).

  ## Usage

  ### Input Image Field Name

  All Operations of this node have a field **Input Image Field Name**, where the _name_ of a Binary item should be
  provided:

  ![a screenshot of the node UI showing an input item with Binary data](imgs/iifn.png)

  The Binary file with that name will be read and processed. It should be an image or a PDF document. If a PDF, all images
  inside the PDF will be extracted and processed separately.

  ### Detect on Entire Image?

  It's possible to limit the OCR to a certain segment of an image, by toggling the **Detect on Entire Image?** switch
  to Off. When doing so, it's necessary to provide the top and left coordinates of the desired bounding box, and the width
  and height of the box. For example:

  ![a screenshot of the node settings showing that when the Detect on Entire Image switch is Off, there are fields to provide the top, left, width and height of the desired bounding box](imgs/bbox.png)

  This could delineate a region like this:

  ![an image with some text and a light green box that covers only part of it](imgs/bbox_vis.png)

  When performing OCR on that region, it'd only return the text that was contained in that box, even truncating words of
  they lie halfway across the bounding box's borders:

  ![an image with some text and the OCR detections overlaid, showing that only text that lies inside the area of interest has been recognized](imgs/bbox_ocr.png)

  ### Force Resolution

  This option can be used if Tesseract can't autodetect the image's resolution, such as a PNG that doesn't carry that
  information.

  ### Minimum Confidence

  Each recognized block of text (the entire image in the Extract Text operation, or a block such as a paragraph, word or
  letter in the Extract Boxes operation) has a `confidence` value
  that [correlates with the likelihood of the recognized text being correct](https://groups.google.com/g/tesseract-ocr/c/SN8L0IA_0D4/m/sFG8cvitAQAJ).
  Lower confidences are more likely to contain wrong characters or be junk (such as the OCR engine "recognizing" text in
  an image that has none).

  > In my experience values below 95 are usually unusable. Above 99 is usually correct. I would set the threshold
  > somewhere between 97.5 and 98.5 depending on your requirements.
  >
  > The lowest value I have ever seen is 75 but anything below 90 is extremely rare, even below 95 is rare.

  Set the Minimum Confidence option to filter low-confidence results. Ony results that have a confidence _greater than or
  equal to_ this value will be returned. By default, or if not provided, it'll be 0, meaning that no filtering will be
  performed (because confidence is an integer between 0 and 100, so all confidences are greater than or equal to zero).

  ### Timeout

  If you'd like to abort OCR when a certain image takes too long to process, set the Timeout option (in milliseconds).

  Any items that take longer than that time to process will be interrupted and raise an error.
  Set [On Error](https://community.n8n.io/t/issue-with-continue-using-error-output-never-any-output/57194) on the node's
  Settings if you want execution to continue.

  Items that time out will have the `error` or `timeout` key set in the JSON output, so they can be extracted later if
  desired. Items that have a `confidence` were successfully processed.

  ### Controlling which characters can and can't be recognized

  If you know that the source image can only have certain characters (e.g. license plates that can only have uppercase
  letters, numbers or a dash) or can't have certain characters (e.g. if Tesseract is inserting question marks when there
  aren't any), you can explicitly specify which characters will be allowed or which characters will be ignored.

  For example, when only the digits 0-9 are allowed, and splitting on words:

  ![a screenshot of text where only a number 12 has been detected. All other characters, which are letters, are ignored](imgs/whitelist.png)

  Or, when disallowing all uppercase characters:

  ![a screenshot of text where the capital letters that start each sentence have been ignored](imgs/blacklist.png)

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [Tesseract.js's docs](https://github.com/naptha/tesseract.js/tree/master/docs)

  ## Version history

  ### v1.0.0

  Initial version, contains the **Extract text** and **Extract boxes** operations.

  ### v1.0.1

  * Fix the installation on N8N instances from NPM
  * Add the toggle switch for specifying a bounding box

  ### v1.1.0

  * Add the ability to control the Tesseract PSM (block, column, single line, single word, sparse text)
  * Add a setting to override the detected DPI of the image
  * Add the ability to specify the whitelist and blacklist

  ### v1.2.0

  * Update the Tesseract.JS version to v6.0.0. No user-facing changes.
  	Please [report any issues that you find](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues)!

  ### v1.3.0

  * Add a Timeout option to control the max processing time
  	(closes [#3](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues/3))

  ### v1.4.0

  * Add the ability to extract all images from a PDF and process them, in addition to single images
  	(closes [#4](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues/4))

  ### v1.4.1

  * Add proper handling for images that are repeated across pages (e.g. logo on header, page background,
  	image that was copy-pasted on several pages), which are stored separately from page-specific images

  ### v1.4.2

  * Add options to resize the images before OCR and to not return binary data (solves Invalid string length error on large
  	images)

  ### v1.5.0

  * Add option to filter low confidence results (closes [#4](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues/4))
  * Downgrade `pdfjs-dist` to v5.3.31 to match N8N's own copy, because otherwise this node conflicted with the Extract
  	From File node (closes [#5](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues/5))

  ### v1.5.1

  No user-facing changes, should work exactly like v1.5.0.
  Please [raise an issue](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues) if anything breaks when upgrading from
  v1.5.0 to v1.5.1!

  * Changes the PDF library (added in v1.4.0) from `pdfjs-dist` to `pdf-lib` due to unexplained crashes (e.g. in Synology
  	devices and some virtualized environments) ([#7](https://github.com/jreyesr/n8n-nodes-tesseractjs/issues/7))

  ## Developer info

  ```bash
  npm i
  ```

  To add this node to a local N8N install:

  ```shell
  npm link
  npm run dev # or npm build the first time or when adding assets, such as the node's logo

  # in ~/.n8n/custom
  npm link n8n-nodes-tesseractjs
  ```

  ### Releasing changes

  1. Bump the version in package.json. We use SemVer.
  2. Add an entry on the [Version History](#version-history) section above describing the changes.
  3. Push changes, open a PR and merge it to master branch (if developing on another branch)
  4. Create a release. This will kick off the CI which will build and publish the package on NPM

ai_documentation_summary:
  {"purpose":"A n8n community node that integrates Tesseract.js to perform Optical Character Recognition (OCR) on images and PDFs, extracting text with confidence scores and optional bounding box coordinates.","capabilities":["Extract text from entire images or PDFs","Extract text with bounding box coordinates (words, lines, paragraphs, characters)","Detect recognized language","Filter text by minimum confidence threshold","Process specific image regions via bounding box coordinates","Handle images embedded in PDF files","Output confidence percentages for recognized text"],"authentication":"None","commonUseCases":["Digitizing scanned documents","Extracting text from image-based invoices or forms","Processing PDFs containing embedded images","Filtering low-quality OCR results using confidence thresholds"],"limitations":["Cannot recognize handwritten text","Cannot read text directly from PDFs without extracting images first","May output multiple items when processing PDFs with multiple images","Text truncation may occur if words cross bounding box boundaries"],"relatedNodes":["Extract from file","Binary","Code","HTTP Request"]}


node_type: n8n-nodes-better-ai-agent.betteraiagent
package_name: n8n-nodes-better-ai-agent
display_name: betteraiagent
description: A better AI Agent node for n8n with improved memory management and modern AI SDK integration
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: fjrdomingues
npm_package_name: n8n-nodes-better-ai-agent
npm_version: 1.6.16
community_fetched_at: 2026-07-14T14:40:36.045Z
ai_summary_generated_at: 2026-03-25 22:47:20
npm_readme:
  # Better AI Agent for n8n

  An improved AI Agent node for n8n that provides better memory management, modern AI SDK integration and a webhook option to push intermediate messages as they happen.

  ## Features

  - **Conversation Memory that includes Tools** – every user message, tool call and tool result is stored.
  - **Modern AI SDK Providers** – wraps OpenAI (including GPT-5), Gemini and Anthropic through stable Vercel AI SDK v4.
  - **Live Streaming Updates**: Intermediate Webhook URL lets you push each agent step in real-time

  ## Installation

  ```bash
  npm install n8n-nodes-better-ai-agent
  ```

  ## Compatibility

  This node is designed to be a drop-in replacement for the existing AI Agent node while providing enhanced functionality:

  - ✅ Works with existing Language Model nodes
  - ✅ Works with existing Memory nodes  
  - ✅ Works with existing Tool nodes
  - ✅ Works with existing Output Parser nodes
  - ✅ Maintains same input/output interface

  ## Key Improvements Over Standard Agent

  ### 1. Memory Management
  - **Problem**: Original agent doesn't save tool calls to memory
  - **Solution**: Every interaction (human messages, AI responses, tool calls, tool results) is properly saved

  ### 2. Modern AI SDK
  - **Problem**: Uses deprecated LangChain patterns
  - **Solution**: Built on Vercel AI SDK for better performance and reliability

  ### 3. Simplified Configuration
  - **Problem**: Complex agent type selection with lots of conditional logic
  - **Solution**: Single, powerful agent that adapts to your needs

  ## Usage

  ### Basic Setup

  1. **Add the node** to your workflow
  2. **Connect a Language Model** (OpenAI, Anthropic, etc.)
  3. **Optionally connect**:
     - Memory node for conversation persistence
     - Tool nodes for enhanced capabilities
     - Output Parser for structured responses

  ### Input Sources

  Choose how to provide the user prompt:

  - **Connected Chat Trigger Node**: Automatically uses `chatInput` from chat triggers
  - **Define below**: Use expressions or static text

  ### Configuration Options

  - **System Message**: Define the agent's behavior and personality
  - **Max Tool Calls**: Limit the number of tool interaction rounds
  - **Intermediate Webhook URL**: Send each partial reply/tool-call to an external workflow in real-time
  - **Verbose Logs**: Enable/disable detailed console logging
  - **Temperature**: Control response creativity (0.0 = deterministic, 1.0 = creative)
  - **Max Tokens**: Set response length limits

  ### Example Workflow

  ```
  Chat Trigger → Better AI Agent → Response
                ↗ OpenAI Model
                ↗ Buffer Memory
                ↗ Calculator Tool
                ↗ Web Search Tool
  ```

  ## Technical Details

  ### Tool Call Memory

  Unlike the original agent, this node ensures that all tool interactions are preserved in memory:

  ```
  User: "What's 25 * 47 and then search for that number"
  Assistant: [calls calculator tool]
  Tool: "1175"
  Assistant: [calls web search tool with "1175"]
  Tool: [search results]
  Assistant: "The result is 1175. Here's what I found about it..."
  ```

  All of these interactions are saved to memory for future reference.

  ### AI SDK Integration

  Uses modern patterns from Vercel AI SDK:

  - Built-in tool calling support
  - Automatic conversation management
  - Better error handling
  - Real-time step streaming via `onStepFinish`

  ### Known Limitations

  | Limitation | Work-around |
  |------------|------------|
  | n8n UI does not highlight the attached model or tool nodes because only the Agent executes code | Rely on the Agent output or streamed webhook messages for visibility |
  | Tool nodes without an explicit Zod/JSON schema (e.g. raw HTTP Request) may receive incorrect argument keys | Wrap such tools in a **Custom Code Tool** and define a schema, or add few-shot examples |
  | Streaming is step-level, not token-level; the n8n node outputs only when the Agent finishes | Use the Intermediate Webhook to push interim messages to a Chat, Slack, etc. |
  | The node's dependencies must be available next to `~/.n8n/custom/BetterAiAgent.node.js` | Run `npm run deploy-local` (copies `package.json` and installs runtime deps) |

  ## Development

  ### Building from Source

  ```bash
  git clone <repository>
  cd better-ai-agent
  npm install
  npm run build
  ```

  ### Testing

  ```bash
  npm test
  ```

  ### Publishing

  ```bash
  npm run package
  npm publish
  ```

  ## Troubleshooting

  ### Common Issues

  1. **"No language model connected"**: Ensure you've connected a language model node
  2. **Tool calls not working**: Verify your tools are properly configured and connected
  3. **Memory not persisting**: Check that your memory node is correctly connected

  ### Debug Information

  The node outputs additional debug information:

  - `usage`: Token usage statistics
  - `finishReason`: Why the generation stopped
  - `toolCalls`: List of tools that were called
  - `toolResults`: Results from tool executions

  ## Contributing

  We welcome contributions! Please see our contributing guidelines for more information.

  ## License

  MIT License - see LICENSE file for details.

  ## Support

  - Create an issue for bugs or feature requests
  - Join the n8n community for general support
  - Check the documentation for detailed usage examples 

ai_documentation_summary:
  {"purpose":"A n8n node that provides an improved AI Agent with enhanced memory management for tool calls, modern Vercel AI SDK integration, and real-time streaming updates.","capabilities":["Stores conversation history including tool calls and results","Integrates with OpenAI, Gemini, and Anthropic via Vercel AI SDK v4","Supports live streaming of intermediate agent steps via webhook","Adapts to different agent needs with a single powerful agent configuration","Outputs debug information including token usage, finish reason, tool calls, and tool results","Supports custom system messages and temperature control"],"authentication":"None","commonUseCases":["Replacing the standard AI Agent node with enhanced memory features","Building chatbots that need to track tool interactions across conversations","Streaming partial agent responses to external channels like Slack or Chat","Integrating with existing Language Model, Memory, and Tool nodes"],"limitations":["n8n UI does not highlight attached model or tool nodes (only the Agent executes code)","Tool nodes without explicit Zod/JSON schemas may receive incorrect argument keys","Streaming is step-level rather than token-level","Node dependencies must be installed locally using npm run deploy-local"],"relatedNodes":["Language Model","Memory","Tool","Output Parser","Chat Trigger"]}


node_type: n8n-nodes-orchestrator-agent.orchestratoragent
package_name: n8n-nodes-orchestrator-agent
display_name: orchestratoragent
description: Orchestrator Agent Node for n8n — intelligent multi-output classifier with LLM routing
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: growsalesai
author_github_url: git+https://github.com/growsales-ai/n8n-nodes-orchestrator-agent.git
npm_package_name: n8n-nodes-orchestrator-agent
npm_version: 1.2.3
community_fetched_at: 2026-07-14T14:40:36.046Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-orchestrator-agent

  > **Intelligent multi-agent routing node for n8n** — classifies incoming messages and routes them to the correct sub-agent using LLM, Embeddings, Vector Store (RAG), or a Hybrid approach.

  [![npm version](https://img.shields.io/npm/v/n8n-nodes-orchestrator-agent)](https://www.npmjs.com/package/n8n-nodes-orchestrator-agent)
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

  ---

  ## What it does

  The **Orchestrator Agent** sits at the top of your multi-agent system. It receives a user message, decides which specialized sub-agent should handle it, and routes the execution to the correct output branch — all in a single node.

  ```
  User message → [Orchestrator Agent] → Branch 0 (Sales Agent)
                                      → Branch 1 (Support Agent)
                                      → Branch 2 (Scheduling Agent)
                                      → Branch 3 (FAQ Agent)
                                      → ... up to N agents
                                      → Fallback (optional)
  ```

  Each branch connects to its own sub-agent workflow. The orchestrator never processes the message itself — it only routes.

  ---

  ## Installation

  In n8n, go to **Settings → Community Nodes → Install** and enter:

  ```
  n8n-nodes-orchestrator-agent
  ```

  ---

  ## Routing Methods

  ### 1. LLM Classification (default)
  Uses a Chat Model (GPT-4, Claude, Gemini, etc.) with structured output to classify the message. Best accuracy. Requires a **Chat Model** sub-node.

  ### 2. Semantic Similarity (Embeddings)
  Embeds the user message and computes cosine similarity against pre-computed embeddings for each agent's description. Fastest and cheapest. Requires an **Embeddings** sub-node.

  ### 3. Vector Store (RAG)
  Queries a pre-indexed vector database (Supabase, Pinecone, Qdrant, etc.) to find the best matching agent. Good for large agent sets. Requires a **Vector Store** sub-node.

  ### 4. Hybrid — Vector Store + LLM *(Most Accurate)*
  The vector store narrows down the top N candidate agents → the LLM picks the winner from those candidates. Combines the precision of semantic indexing with the reasoning depth of an LLM. Requires both a **Vector Store** and a **Chat Model** sub-node.

  ### 5. Contextual Hybrid — Session-Aware Routing *(Best for Multi-turn Conversations)*
  Extends Hybrid with full session awareness: reads the user's current agent from memory history, includes the last N routing turns in the LLM prompt, and supports per-scenario routing rules ("observations") embedded in the vector store metadata. Requires a **Vector Store**, a **Chat Model**, and a **Memory** sub-node.

  ---

  ## Routing Strategies — Detailed Guide

  ### 1. LLM Classification

  **When to use:** Messages with complex intent, ambiguity between agents, or when you need Extended Analysis fields (emotion, intent, etc.) extracted in the same call.

  **Required sub-nodes:** Chat Model

  **How it works:**
  1. Builds a structured output schema from your agent list
  2. Sends system prompt + conversation history + user message to the LLM
  3. LLM returns the agent index + confidence + reasoning in a single JSON response

  **Configuration:**
  - No vector store needed — the LLM sees all agent names and descriptions directly
  - Use **System Prompt Prefix** to inject business rules that override LLM behavior
  - Use **Extended Analysis Schema** to extract extra fields (emotion, intent, urgency) in the same LLM call

  **Best for:** 2–8 agents, complex messages, when accuracy matters more than cost.

  ---

  ### 2. Semantic Similarity (Embeddings)

  **When to use:** High-volume routing where cost and speed are critical. Works well when agent descriptions are distinct enough.

  **Required sub-nodes:** Embeddings

  **How it works:**
  1. Embeds the user message using the connected Embeddings model
  2. Computes cosine similarity against pre-computed embeddings for each agent's **description + example phrases**
  3. Routes to the highest-scoring agent

  **Configuration:**
  - Add **Example Phrases** to each agent (one per line) — the more phrases, the better the embedding coverage
  - No vector store or LLM needed

  **Best for:** Speed-critical flows, simple intent separation, cost optimization.

  ---

  ### 3. Vector Store (RAG)

  **When to use:** Large agent sets (8+), when you have many example phrases per agent that don't fit in a prompt, or when you want semantic search over a curated knowledge base.

  **Required sub-nodes:** Vector Store

  **How it works:**
  1. Queries the vector store with the user message
  2. Retrieves the top-K most similar documents
  3. Identifies the agent via the `agentName` metadata field of the best-scoring document

  **Configuration:**

  | Parameter | Description | Default |
  |---|---|---|
  | Agent Field in Vector Store | Metadata field that identifies the agent (`agentName`) | `agentName` |
  | Vector Search Depth | Number of documents retrieved per query | `10` |
  | Relevance Score Mode | `Similarity` (Supabase, Pinecone, Qdrant) or `Distance` (Chroma, FAISS) | `similarity` |

  **Document format:**
  ```
  content:  "quero cancelar minha assinatura"
  metadata: { "agentName": "Cancelamento Agent" }
  ```

  **Best for:** 8+ agents, pre-indexed phrase libraries, when LLM cost is a concern.

  ---

  ### 4. Hybrid — Vector Store + LLM

  **When to use:** When you need the accuracy of semantic search combined with the reasoning depth of an LLM. The most accurate strategy for static routing scenarios.

  **Required sub-nodes:** Vector Store + Chat Model

  **How it works:**
  1. Vector store retrieves the top N candidate agents (default: 3)
  2. LLM receives only those N candidates (not the full agent list) and picks the winner
  3. The LLM sees each candidate's name, description, semantic score, and matched phrase

  **Configuration:**

  | Parameter | Description | Default |
  |---|---|---|
  | Agent Field in Vector Store | Metadata field that identifies the agent | `agentName` |
  | Vector Search Depth | Documents retrieved from VS per query | `10` |
  | Relevance Score Mode | Similarity or Distance | `similarity` |
  | Finalist Agents for LLM | How many top candidates are passed to the LLM | `3` |

  **Document format:** same as Vector Store (RAG).

  **Output includes:**
  ```json
  "vectorStoreCandidates": [
    { "name": "Cancelamento Agent", "score": 0.912 },
    { "name": "FAQ Agent",          "score": 0.641 }
  ]
  ```

  **Best for:** Production flows where routing accuracy is critical and the agent set is stable.

  ---

  ### 5. Contextual Hybrid — Session-Aware Routing

  **When to use:** Multi-turn conversations where the user moves between agents across messages. When a user in the middle of a scheduling flow asks something that sounds like general support, the router should know they're already in scheduling and keep them there (unless a routing rule says otherwise).

  **Required sub-nodes:** Vector Store + Chat Model + Memory (Postgres or Redis)

  **How it works:**
  1. Reads the last N routing decisions from memory → builds session history
  2. Extracts the current agent from the last `[routed to: X]` memory entry
  3. Vector store retrieves top N candidates — each document can carry an `observation` routing rule in its metadata
  4. LLM receives: session history + current agent context + candidates + routing rules
  5. LLM makes a context-aware decision, treating routing rules as mandatory overrides
  6. Memory is updated with `[routed to: X | confidence: 0.94]` for the next turn

  **Configuration:**

  | Parameter | Description | Default |
  |---|---|---|
  | Agent Field in Vector Store | Metadata field that identifies the agent | `agentName` |
  | Vector Search Depth | Documents retrieved per query | `10` |
  | Relevance Score Mode | Similarity or Distance | `similarity` |
  | Finalist Agents for LLM | Candidates passed to the LLM | `3` |
  | Observation Field in Vector Store | Metadata field containing routing rules | `observation` |

  **Output includes `sessionContext`:**
  ```json
  "orchestrator": {
    "routedTo": "Agendamento",
    "sessionContext": "Agendamento",
    "confidence": 0.94,
    "vectorStoreCandidates": [...]
  }
  ```

  **Memory format after each turn:**
  ```
  human: "Qual horário tem disponível?"
  ai:    "[routed to: Agendamento | confidence: 0.94]"
  ```

  **Session history shown to LLM:**
  ```
  === SESSION HISTORY (last 3 interactions) ===
  Turn -3: [Atendimento Inicial] — "oi" (91%)
  Turn -2: [Agendamento] — "quero marcar consulta" (97%)
  Turn -1: [Agendamento] — "qual horário?" (89%)
  === END SESSION HISTORY ===
  ```

  **Best for:** WhatsApp/chatbot flows with multiple stages, pipelines where the user progresses through agents, any scenario requiring flow persistence.

  > **Note:** The Memory sub-node does not show visual execution in the n8n UI for community nodes — this is a known n8n SDK limitation. The session history IS being read and used. Check `$json.orchestrator.sessionContext` to confirm.

  ---

  ## Importing Documents for Contextual Hybrid

  The Contextual Hybrid strategy uses the same vector store as Hybrid, but each document can optionally carry an **`observation`** field in its metadata. This field contains a routing rule that the LLM treats as a mandatory override when deciding between candidates.

  ### Document format

  ```
  content:  "Qual horário ainda tem disponível?"
  metadata: {
    "agentName": "Agendamento",
    "observation": "Se o usuário está no fluxo de Agendamento, mantenha aqui mesmo que a pergunta pareça de Atendimento Inicial."
  }
  ```

  The `observation` field is **optional**. Documents without it work exactly like regular Hybrid documents. Only add an observation when you want to enforce a specific routing behavior for a given scenario.

  ### How to write good observations

  Observations should describe **when to override the default semantic match**. Write them as conditional rules:

  | Situation | Example observation |
  |---|---|
  | Keep user in current flow | `"Se o usuário está em Agendamento, mantenha aqui mesmo que a pergunta pareça geral."` |
  | Redirect from one agent to another | `"Se o usuário mencionou agendamento anteriormente, priorize o Agente de Agendamento."` |
  | Prevent wrong routing | `"Não redirecione para Atendimento Inicial se o usuário já está em um sub-agente especializado."` |
  | Handle ambiguous cases | `"Perguntas sobre preço durante o fluxo de vendas devem permanecer no Agente de Vendas."` |

  ### Rules for observations

  - Write in the **same language** the LLM understands (match your system prompt language)
  - Be specific — vague observations are ignored
  - One observation per document — focus it on the context of that specific phrase
  - Not every document needs an observation — use only where default semantic routing fails

  ### n8n workflow to insert Contextual Hybrid documents

  Use a **Code node** to generate the documents and a **Supabase Vector Store node** in Insert mode:

  ```javascript
  const documents = [
    // === Agendamento Agent — without observation (standard routing) ===
    {
      content: "quero marcar uma consulta",
      agentName: "Agendamento",
    },
    {
      content: "como agendar um horário",
      agentName: "Agendamento",
    },

    // === Agendamento Agent — with observation (session-aware routing) ===
    {
      content: "qual horário ainda tem disponível?",
      agentName: "Agendamento",
      observation: "Se o usuário já está no fluxo de Agendamento, mantenha aqui mesmo que a pergunta pareça de Atendimento Inicial.",
    },
    {
      content: "posso remarcar para outro dia?",
      agentName: "Agendamento",
      observation: "Se o usuário está em Agendamento, não redirecione para Suporte — remarcar é parte do fluxo de agendamento.",
    },

    // === Atendimento Inicial Agent ===
    {
      content: "oi, boa tarde",
      agentName: "Atendimento Inicial",
    },
    {
      content: "olá, tudo bem?",
      agentName: "Atendimento Inicial",
      observation: "Se o usuário já está em qualquer sub-agente especializado, não redirecione para cá por uma saudação.",
    },

    // === Suporte Agent ===
    {
      content: "estou com um problema",
      agentName: "Suporte",
    },
    {
      content: "não está funcionando",
      agentName: "Suporte",
    },
  ];

  return documents.map(doc => ({
    json: {
      pageContent: doc.content,
      metadata: {
        agentName: doc.agentName,
        ...(doc.observation ? { observation: doc.observation } : {}),
      },
    },
  }));
  ```

  **Supabase Vector Store node configuration:**
  - Mode: `Insert Documents`
  - Table Name: `agent_routes`
  - Query Name: `match_agent_routes`
  - Connect an **Embeddings** sub-node

  > The `observation` field is stored as part of the `metadata` JSONB column — no schema changes required if you already have the `agent_routes` table from the setup SQL above.

  ### Verifying observations are stored

  After inserting, check in the Supabase SQL Editor:

  ```sql
  select content, metadata->>'agentName' as agent, metadata->>'observation' as observation
  from agent_routes
  where metadata->>'observation' is not null
  order by id desc
  limit 10;
  ```

  ---

  ## Sub-node Connections

  | Sub-node | Used by | Required? |
  |---|---|---|
  | Chat Model | LLM, Hybrid, Contextual Hybrid | Yes (for those modes) |
  | Embeddings | Embeddings mode | Yes |
  | Vector Store | Vector Store, Hybrid, Contextual Hybrid | Yes (for those modes) |
  | Memory | LLM, Hybrid, Contextual Hybrid | Optional (required for session context in Contextual Hybrid) |
  | Tools | LLM | Optional |
  | Output Parser | LLM, Hybrid, Contextual Hybrid | Optional |

  ---

  ## Configuring Sub-Agents

  In the node panel, add each sub-agent with:

  - **Name** — must match the `agentName` value in your vector store documents exactly (case-sensitive)
  - **Description** — what types of messages this agent handles
  - **Example Phrases** *(optional)* — one phrase per line; helps the LLM and embeddings make better decisions

  Example:
  ```
  Name:        Cancelamento Agent
  Description: Handles subscription cancellations, refund requests, and churn prevention
  Phrases:     quero cancelar minha assinatura
               como peço reembolso
               não quero mais o plano
  ```

  ---

  ## Output Data

  Each output branch receives the original input fields plus routing metadata:

  ```json
  {
    "action": "sendMessage",
    "sessionId": "abc123",
    "chatInput": "quero cancelar meu plano",
    "orchestrator": {
      "routedTo": "Cancelamento Agent",
      "routedIndex": 2,
      "confidence": 0.97,
      "reasoning": "User explicitly requests cancellation.",
      "inputText": "quero cancelar meu plano",
      "latencyMs": 1243
    }
  }
  ```

  ---

  ## Extended Analysis Schema

  With LLM or Hybrid routing, you can instruct the LLM to extract **additional analysis fields** in the same call as routing — no extra LLM request needed.

  In the **Extended Analysis Schema** field, paste a JSON Schema with the fields you want:

  ```json
  {
    "required": ["perfil_emocional", "intencao_detectada"],
    "properties": {
      "perfil_emocional": {
        "type": "string",
        "enum": ["frustrado", "ansioso", "curioso", "vulneravel", "neutro"],
        "description": "Emotional profile detected in the message"
      },
      "intencao_detectada": {
        "type": "string",
        "enum": ["novo_agendamento", "cancelamento", "duvida_servico", "indefinida"],
        "description": "Primary intent detected"
      },
      "urgencia": {
        "type": "string",
        "enum": ["alta", "media", "baixa"]
      }
    }
  }
  ```

  The fields appear at the top level of `$json` alongside the routing metadata:

  ```json
  {
    "chatInput": "preciso cancelar urgente, estou muito insatisfeito",
    "perfil_emocional": "frustrado",
    "intencao_detectada": "cancelamento",
    "urgencia": "alta",
    "orchestrator": { ... }
  }
  ```

  ---

  ## Supabase Vector Store Setup

  Acesse seu projeto no Supabase → **SQL Editor**, cole o bloco abaixo e clique em **Run**. Isso cria tudo que o n8n precisa para funcionar.

  > **Atenção ao modelo de embedding:** o SQL abaixo usa dimensão `1536`, compatível com OpenAI `text-embedding-ada-002` e `text-embedding-3-small`. Se usar outro modelo, ajuste `vector(1536)` e o parâmetro `query_embedding vector(1536)` na função antes de rodar.
  >
  > | Modelo | Dimensão |
  > |---|---|
  > | OpenAI `text-embedding-ada-002` | `1536` |
  > | OpenAI `text-embedding-3-small` | `1536` |
  > | OpenAI `text-embedding-3-large` | `3072` |
  > | Google `text-embedding-004` | `768` |
  > | Cohere `embed-v3` | `1024` |

  ---

  ```sql
  -- =====================================================
  -- Orchestrator Agent — Supabase Vector Store Setup
  -- Cole tudo isso no SQL Editor e clique em Run.
  -- =====================================================

  -- 1. Habilitar a extensão pgvector
  create extension if not exists vector;

  -- 2. Criar a tabela de documentos
  create table if not exists agent_routes (
    id        bigserial    primary key,
    content   text         not null,
    metadata  jsonb        not null default '{}',
    embedding vector(1536)
  );

  -- 3. Índice HNSW para busca vetorial rápida (melhor recall que IVFFlat)
  create index if not exists agent_routes_embedding_hnsw_idx
    on agent_routes
    using hnsw (embedding vector_cosine_ops)
    with (m = 16, ef_construction = 64);

  -- 4. Índice GIN para filtros por metadata (agentName)
  create index if not exists agent_routes_metadata_gin_idx
    on agent_routes using gin (metadata);

  -- 5. Índice direto no campo agentName para lookups exatos
  create index if not exists agent_routes_metadata_agent_idx
    on agent_routes ((metadata->>'agentName'));

  -- 6. Função de busca — configure o campo "Query Name" no nó Supabase Vector Store do n8n para "match_agent_routes"
  create or replace function match_agent_routes (
    query_embedding  vector(1536),
    match_count      int    default null,
    filter           jsonb  default '{}'
  )
  returns table (
    id         bigint,
    content    text,
    metadata   jsonb,
    similarity float
  )
  language plpgsql volatile
  as $$
  #variable_conflict use_column
  begin
    set local hnsw.ef_search = 40;

    return query
    select
      id,
      content,
      metadata,
      1 - (agent_routes.embedding <=> query_embedding) as similarity
    from agent_routes
    where metadata @> filter
    order by agent_routes.embedding <=> query_embedding
    limit match_count;
  end;
  $$;
  ```

  ---

  ### Verificar se funcionou

  Após rodar o SQL acima, execute este bloco para confirmar que tudo foi criado corretamente:

  ```sql
  -- Inserir uma linha de teste
  insert into agent_routes (content, metadata, embedding)
  values ('teste', '{"agentName": "Teste"}', array_fill(0.1, array[1536])::vector);

  -- Buscar e verificar (deve retornar 1 linha com similarity ≈ 1.0)
  select content, metadata, similarity
  from match_agent_routes(array_fill(0.1, array[1536])::vector, 1, '{}');

  -- Limpar
  delete from agent_routes where content = 'teste';
  ```

  ---

  ## Other Vector Store Providers

  ---

  ### PostgreSQL (pgvector direto)

  Se você tem um PostgreSQL próprio (sem Supabase), o setup é idêntico — só muda a conexão no n8n.

  **1. Instale a extensão pgvector no seu Postgres:**
  ```sql
  create extension if not exists vector;
  ```

  **2. Rode o mesmo SQL do Supabase** (tabela `agent_routes`, índices e função `match_agent_routes`) na sua instância PostgreSQL.

  **3. Configure o nó no n8n:**
  - Nó: **Supabase Vector Store** (funciona com qualquer Postgres + pgvector)
  - Credencial: aponte para sua URL PostgreSQL
  - Table Name: `agent_routes`
  - Query Name: `match_agent_routes`
  - Score Type: `Similarity`

  > O nó Supabase Vector Store do n8n usa pgvector internamente — funciona com qualquer Postgres que tenha a extensão instalada, não só com o Supabase.

  ---

  ### Qdrant

  Qdrant é um banco vetorial dedicado, mais rápido que pgvector para grandes volumes.

  **1. Suba o Qdrant** (Docker ou Qdrant Cloud):
  ```bash
  docker run -d --name qdrant -p 6333:6333 -p 6334:6334 qdrant/qdrant
  ```

  **2. Crie a collection via API REST:**
  ```bash
  curl -X PUT http://localhost:6333/collections/agent_routes \
    -H 'Content-Type: application/json' \
    -d '{
      "vectors": {
        "size": 1536,
        "distance": "Cosine"
      }
    }'
  ```

  > Ajuste `"size"` conforme o modelo de embedding usado:
  > - OpenAI `text-embedding-ada-002` / `3-small` → `1536`
  > - OpenAI `text-embedding-3-large` → `3072`
  > - Google `text-embedding-004` → `768`

  **3. Configure o nó no n8n:**
  - Nó: **Qdrant Vector Store**
  - Credencial: URL do Qdrant + API Key (se configurada)
  - Collection Name: `agent_routes`
  - Score Type: `Similarity`

  **4. Para inserir documentos**, use o nó Qdrant Vector Store em modo `Insert Documents` com um sub-nó de Embeddings conectado — o n8n cria os pontos automaticamente com o campo `agentName` no payload.

  ---

  ### Redis (Redis Stack)

  Redis com Redis Stack inclui busca vetorial via módulo RediSearch. Boa opção se já usa Redis na infraestrutura.

  **1. Suba o Redis Stack** (Docker ou Redis Cloud):
  ```bash
  docker run -d --name redis-stack \
    -p 6379:6379 \
    -p 8001:8001 \
    redis/redis-stack:latest
  ```

  > `redis/redis-stack` já inclui RediSearch. O `redis` simples **não tem** busca vetorial.

  **2. Nenhuma criação de schema manual** — o n8n cria o índice automaticamente na primeira inserção.

  **3. Configure o nó no n8n:**
  - Nó: **Redis Vector Store**
  - Credencial: host + porta do Redis Stack
  - Index Name: `agent_routes`
  - Score Type: `Similarity`

  **4. Para inserir documentos**, use o nó Redis Vector Store em modo `Insert Documents` com um sub-nó de Embeddings conectado.

  > **Score Type no Redis:** Redis usa distância coseno e retorna similaridade (0–1, maior = melhor). Use `Similarity`.

  ---

  ### Comparativo de providers

  | Provider | Melhor para | Score Type | Schema manual? |
  |---|---|---|---|
  | Supabase / PostgreSQL | Projetos já no Postgres, SQL familiar | Similarity | Sim (SQL acima) |
  | Qdrant | Alto volume, busca mais rápida, filtros avançados | Similarity | Sim (API REST) |
  | Redis Stack | Infraestrutura já com Redis, baixa latência | Similarity | Não |
  | Pinecone | Escala massiva, serverless | Similarity | Não |
  | Chroma | Local/dev, sem infraestrutura | Distance | Não |

  ---

  ## Importing Content to the Vector Store

  Cada linha inserida na tabela `agent_routes` representa um **exemplo de frase** que deve rotear para um agente específico. O Vector Store aprende a associar mensagens similares ao agente correto com base nesses exemplos.

  ### Formato obrigatório

  Cada documento precisa ter exatamente dois campos:

  | Campo | Tipo | O que colocar |
  |---|---|---|
  | `content` | `text` | Uma frase de exemplo que deve rotear para esse agente |
  | `metadata.agentName` | `text` (dentro do JSONB) | O nome **exato** do sub-agente configurado no node (case-sensitive) |

  > O campo `embedding` é preenchido automaticamente pelo n8n quando você usa o nó Supabase Vector Store em modo Insert — você **não precisa** gerar o vetor manualmente.

  ---

  ### Regras críticas

  **✅ Correto**
  ```
  content:  "quero cancelar minha assinatura"
  metadata: { "agentName": "Cancelamento Agent" }
  ```

  **❌ Errado — agentName não bate com o nome no node**
  ```
  content:  "quero cancelar minha assinatura"
  metadata: { "agentName": "cancelamento" }   ← minúsculo, diferente do node
  ```

  **❌ Errado — metadata sem o campo agentName**
  ```
  content:  "quero cancelar minha assinatura"
  metadata: { "agent": "Cancelamento Agent" }  ← campo errado
  ```

  **❌ Errado — content vazio ou genérico demais**
  ```
  content:  "ajuda"    ← muito vago, confunde o modelo
  metadata: { "agentName": "Cancelamento Agent" }
  ```

  ---

  ### Quantas frases por agente?

  | Agentes | Frases por agente | Total |
  |---|---|---|
  | 4–6 | 10–20 | 40–120 |
  | 7–10 | 15–25 | 105–250 |
  | 10+ | 20–30 | 200–300+ |

  **Dicas para melhor precisão:**
  - Use frases reais dos seus usuários (mais eficaz)
  - Varie o estilo — formal, informal, abreviado, com erros de digitação
  - Inclua casos ambíguos entre agentes (o modelo aprende os limites)
  - Nunca repita a mesma frase para dois agentes diferentes

  ---

  ### Document Structure

  | Field | Purpose |
  |---|---|
  | `content` | A phrase or example message that should route to this agent |
  | `metadata.agentName` | Exact name of the sub-agent (must match node config) |

  ### Method 1 — n8n Workflow (Recommended)

  Create a separate n8n workflow to insert your routing documents. Here is the node setup:

  **Nodes in the workflow:**
  1. **Manual Trigger** or **Schedule Trigger**
  2. **Code node** — generates the documents array
  3. **Supabase Vector Store node** (Insert mode) — inserts with embeddings

  **Code node example:**

  ```javascript
  // Returns all routing documents for your agents
  const documents = [
    // === Cancelamento Agent ===
    { content: "quero cancelar minha assinatura",        agentName: "Cancelamento Agent" },
    { content: "como faço para cancelar meu plano",      agentName: "Cancelamento Agent" },
    { content: "quero pedir reembolso",                  agentName: "Cancelamento Agent" },
    { content: "não quero mais renovar",                 agentName: "Cancelamento Agent" },
    { content: "como encerro minha conta",               agentName: "Cancelamento Agent" },

    // === Agendamento Agent ===
    { content: "quero marcar uma consulta",              agentName: "Agendamento Agent" },
    { content: "como agendar um horário",                agentName: "Agendamento Agent" },
    { content: "preciso remarcar meu agendamento",       agentName: "Agendamento Agent" },
    { content: "qual o próximo horário disponível",      agentName: "Agendamento Agent" },
    { content: "quero agendar para amanhã",              agentName: "Agendamento Agent" },

    // === FAQ Agent ===
    { content: "quais são os horários de funcionamento", agentName: "FAQ Agent" },
    { content: "como funciona o serviço",                agentName: "FAQ Agent" },
    { content: "quais planos vocês oferecem",            agentName: "FAQ Agent" },
    { content: "qual é o preço",                         agentName: "FAQ Agent" },
    { content: "vocês aceitam cartão de crédito",        agentName: "FAQ Agent" },

    // === Suporte Agent ===
    { content: "estou com problema técnico",             agentName: "Suporte Agent" },
    { content: "o sistema não está funcionando",         agentName: "Suporte Agent" },
    { content: "não consigo fazer login",                agentName: "Suporte Agent" },
    { content: "minha senha não funciona",               agentName: "Suporte Agent" },
    { content: "o aplicativo travou",                    agentName: "Suporte Agent" },
  ];

  return documents.map(doc => ({
    json: {
      pageContent: doc.content,
      metadata: { agentName: doc.agentName }
    }
  }));
  ```

  **Supabase Vector Store node configuration:**
  - Mode: `Insert Documents`
  - Table Name: `agent_routes`
  - Query Name: `match_agent_routes`
  - Content Column: `content`
  - Metadata Column: `metadata`
  - Connect an **Embeddings** sub-node (OpenAI, Cohere, etc.)

  ### Method 2 — Direct SQL with Pre-computed Embeddings

  If you already have embeddings, insert directly via SQL:

  ```sql
  insert into agent_routes (content, metadata, embedding)
  values
    (
      'quero cancelar minha assinatura',
      '{"agentName": "Cancelamento Agent"}',
      '[0.021, -0.013, ...]'  -- your 1536-dimension vector
    );
  ```

  ### Method 3 — Bulk Insert via Supabase API

  Use the Supabase REST API or client library to batch insert:

  ```javascript
  const { createClient } = require('@supabase/supabase-js');

  const supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_KEY);

  const rows = [
    { content: 'quero cancelar', metadata: { agentName: 'Cancelamento Agent' }, embedding: [...] },
    // ...
  ];

  const { error } = await supabase.from('agent_routes').insert(rows);
  ```

  ---

  ## n8n Node Configuration Reference

  ### Routing Method: LLM Classification

  | Parameter | Description | Default |
  |---|---|---|
  | System Prompt Prefix | Business rules injected before the routing prompt — the LLM treats these as mandatory | — |
  | Extended Analysis Schema | JSON Schema for extra fields to extract alongside the routing decision | — |
  | Retry on Parse Failure | Retries with stricter JSON instructions if LLM output fails to parse | `true` |

  ---

  ### Routing Method: Vector Store (RAG)

  | Parameter | Description | Default |
  |---|---|---|
  | Agent Field in Vector Store | Metadata field that identifies the agent (`agentName`) | `agentName` |
  | Vector Search Depth | Documents retrieved per query | `10` |
  | Relevance Score Mode | `Similarity` or `Distance` | `similarity` |

  ---

  ### Routing Method: Hybrid

  | Parameter | Description | Default |
  |---|---|---|
  | Agent Field in Vector Store | Metadata field used to identify the agent | `agentName` |
  | Vector Search Depth | How many documents to retrieve from vector store per query | `10` |
  | Relevance Score Mode | How your vector store reports relevance scores | `similarity` |
  | Finalist Agents for LLM | How many top candidates the vector store selects for the LLM | `3` |

  ---

  ### Routing Method: Contextual Hybrid

  | Parameter | Description | Default |
  |---|---|---|
  | Agent Field in Vector Store | Metadata field that identifies the agent | `agentName` |
  | Vector Search Depth | Documents retrieved per query | `10` |
  | Relevance Score Mode | Similarity or Distance | `similarity` |
  | Finalist Agents for LLM | Candidates passed to the LLM | `3` |
  | Observation Field in Vector Store | Metadata field containing per-scenario routing rules | `observation` |

  **Score Type by provider:**
  - **Similarity** (higher = better): Supabase/pgvector, Pinecone, Qdrant
  - **Distance** (lower = better): Chroma, FAISS (L2 distance)

  ### Output Options

  | Parameter | Description |
  |---|---|
  | Include Routing Metadata | Adds `$json.orchestrator` with routing details, confidence, and latency |
  | Extended Analysis Schema | JSON Schema for extra fields the LLM populates in the same call |
  | Pass Full Input to Outputs | Merges all input fields into the routed output item |
  | Retry on Parse Failure | Retries once with stricter JSON instructions if LLM output fails to parse |
  | Enable Fallback | Adds an extra output branch for low-confidence or unmatched messages |
  | Min Confidence Threshold | Routes to Fallback if confidence is below this value (0.0–1.0) |

  ---

  ## Architecture Overview

  ```
  ┌─────────────────────────────────────────────────┐
  │              Orchestrator Agent Node             │
  │                                                 │
  │  ┌──────────┐    ┌──────────────────────────┐   │
  │  │  Input   │───▶│   resolveExecuteParams   │   │
  │  │ message  │    │  (reads all parameters)  │   │
  │  └──────────┘    └──────────┬───────────────┘   │
  │                             │                   │
  │              ┌──────────────▼─────────────┐      │
  │              │      Routing Strategy       │      │
  │              │  embeddings / vectorStore   │      │
  │              │    hybrid / llm             │      │
  │              └──────────────┬─────────────┘      │
  │                             │                   │
  │         ┌───────────────────▼────────────────┐   │
  │         │         Output Branches            │   │
  │         │  [0] [1] [2] ... [N] [Fallback]    │   │
  │         └────────────────────────────────────┘   │
  └─────────────────────────────────────────────────┘
  ```

  ---

  ## Frequently Asked Questions

  **Q: The vector store sub-node doesn't show execution in n8n's UI — is it working?**

  Yes. This is an n8n SDK limitation: community nodes that call sub-nodes via `getInputConnectionData()` do not trigger the visual sub-node execution tracking panel. The vector store is being called — check `$json.orchestrator.vectorStoreCandidates` in the output item for confirmation. In Hybrid mode it shows each candidate and its score:

  ```json
  "vectorStoreCandidates": [
    { "name": "Cancelamento Agent", "score": 0.912 },
    { "name": "FAQ Agent",          "score": 0.641 },
    { "name": "Suporte Agent",      "score": 0.483 }
  ]
  ```

  **Q: How do I know which agent was chosen?**

  Check `$json.orchestrator.routedTo` (agent name), `$json.orchestrator.routedIndex` (0-based index), and `$json.orchestrator.confidence` (0.0–1.0).

  **Q: Can I use a different vector store besides Supabase?**

  Yes. Pinecone, Qdrant, Chroma, FAISS, and any other n8n-compatible vector store works. Just make sure your documents have the `agentName` field in metadata, and configure the **Score Type** to match your provider.

  **Q: How many tokens does Hybrid mode consume?**

  The LLM only sees the top N candidates (typically 3), not all agents. For a typical message with 3 candidates and brief descriptions, expect ~300–600 input tokens + ~50 output tokens per routing call.

  **Q: Can I use Extended Analysis Schema with Vector Store mode (not Hybrid)?**

  No. Extended Analysis Schema requires an LLM call. Use Hybrid mode (Vector Store + LLM) to get both RAG accuracy and extended analysis.

  ---

  ## License

  MIT © [Growsales AI](https://growsales.ai)

ai_documentation_summary:
  {"purpose":"Routes incoming user messages to the most appropriate specialized sub-agent in an n8n multi-agent workflow using LLM-based classification, embeddings, vector search, or a hybrid method. It acts only as an orchestrator and does not process the message itself.","capabilities":["Classify messages with an LLM and structured output","Route by semantic similarity using embeddings","Route by vector store / RAG search using agent metadata","Use a hybrid vector-store-plus-LLM routing strategy","Support contextual, session-aware hybrid routing with memory","Provide fallback routing when no agent matches","Extract extended analysis fields such as emotion, intent, and urgency","Use system prompt prefixes to apply routing rules","Support multiple output branches for sub-agent workflows"],"authentication":"None mentioned; routing requires connecting relevant sub-nodes such as Chat Model, Embeddings, Vector Store, and/or Memory rather than external API authentication.","commonUseCases":["Intelligent routing of customer support, sales, scheduling, or FAQ requests to separate agents","High-volume intent classification with low cost using embeddings","Large-scale multi-agent routing over a pre-indexed vector knowledge base","Multi-turn conversational workflows that preserve the current agent context","Static routing scenarios that need high accuracy via hybrid search and LLM selection"],"limitations":["The node only routes messages and does not handle the user request itself","LLM classification requires a Chat Model sub-node","Embedding-based routing requires an Embeddings sub-node","Vector-store routing requires a Vector Store sub-node","Contextual hybrid routing requires Vector Store, Chat Model, and Memory sub-nodes"],"relatedNodes":["n8n Chat Model","n8n Embeddings","n8n Vector Store","n8n Memory"]}


node_type: n8n-nodes-autotask.autotask
package_name: n8n-nodes-autotask
display_name: autotask
description: n8n node for Autotask PSA integration
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: maxs05
author_github_url: git+https://github.com/msoukhomlinov/n8n-nodes-autotask.git
npm_package_name: n8n-nodes-autotask
npm_version: 2.26.0
community_fetched_at: 2026-07-14T14:40:36.047Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-autotask

  ![n8n-nodes-autotask](https://img.shields.io/npm/v/n8n-nodes-autotask?label=n8n-nodes-autotask&color=blue)
  ![License](https://img.shields.io/badge/license-MIT-green)

  [![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-yellow.svg)](https://buymeacoffee.com/msoukhomlinov)

  > **IMPORTANT**: After updating this node to a new version, a restart of your n8n instance is highly recommended to ensure all changes are properly applied.

  This is an n8n community node for integrating with Autotask PSA. It provides a comprehensive set of operations to interact with Autotask entities through their REST API.

  ![Overview of n8n-nodes-autotask](./overview.gif)

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

  [Installation](#installation)  
  [Authentication](#authentication)  
  [Features](#features)  
  [Usage](#usage)  
  [Configuration](#configuration)  
  [Limitations](#limitations)  
  [Troubleshooting](#troubleshooting)  
  [Resources](#resources)  
  [Support](#support)  
  [License](#license)

  ## Installation

  Follow these steps to install this node:

  ```bash
  # Install with npm
  npm install n8n-nodes-autotask

  # Install with pnpm
  pnpm install n8n-nodes-autotask
  ```

  **Requirements:**
  - n8n version 1.0.0 or later
  - Node.js version 18.10 or later
  - pnpm version 9.1 or later (if using pnpm)

  **Autotask AI Tools node:** To use the Autotask AI Tools node with the AI Agent, set `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true` in your n8n environment.

  ## Authentication

  To use this node, you need to have API access to your Autotask instance. Follow these steps to set up authentication:

  1. In Autotask, go to **Admin > API User Security**
  2. Create or select an API user
  3. Note the API Integration Code, Username, and Secret
  4. In n8n, create a new credential of type **Autotask API**
  5. Enter your API Integration Code, Username, and Secret
  6. Select your Autotask zone
  7. Select your timezone (affects how dates and times are displayed and entered)
  8. Configure caching options as needed (this will cache dynamically fetched field picklists)

  **Australia/New Zealand (Sydney) datacentre:** If you are on the AUS/NZ Sydney datacentre, from 11 March 2026 select the zone **Australia / New Zealand (Sydney — from 11 Mar 2026)** (API: webservices29.autotask.net). For that zone, the URLs are: User interface ww29.autotask.net; API webservices29.autotask.net; Data Warehouse reports29.autotask.net; Performance Analytics workbooks workbooks29.autotask.net.

  ## Features

  ### Autotask AI Tools

  The **Autotask AI Tools** node exposes Autotask operations as individual tools for the AI Agent. Add one node per resource (e.g. ticket, company, contact), select the operations to expose (get, getMany, count, create, createIfNotExists, update, delete; plus whoAmI and transferOwnership for Resource, getPosted/getUnposted for Time Entry, searchByDomain for Company, slaHealthCheck for Ticket, moveConfigurationItem for Configuration Items), and connect to an AI Agent. Each configured resource becomes a single unified tool (`autotask_<resource>`) with an `operation` enum that routes to the correct handler. Available resources and operations are derived from the same entity metadata as the main Autotask node. Requires `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true` in your n8n environment.

  Key AI Tools capabilities:

  - **Name-based label resolution**: The LLM can pass human-readable names for picklist and reference fields (e.g. `resourceID: "Will Spence"` instead of `resourceID: 29683`). Resolution is transparent — successful responses include a `resolvedLabels` array showing each mapping. Ambiguous matches produce `pendingConfirmations` for user confirmation. Works for both write operations and read filter values.
  - **Required fields in descriptions**: Create operation descriptions embed a compact required-fields summary with type info, eliminating the `describeFields` prerequisite for most create workflows.
  - **OR filter logic**: List operations accept a `filter_logic` parameter (`'and'` or `'or'`) to control how filter pairs are combined.
  - **Offset pagination**: List operations accept an `offset` parameter for paginating through results (up to 500 records). Responses include `hasMore` and `nextOffset` for continuation.
  - **Impersonation name resolution**: The `impersonationResourceId` parameter accepts a name or email in addition to numeric IDs.
  - **Idempotent creation**: `createIfNotExists` operations (see below) provide find-or-create semantics with configurable dedup fields.
  - **Automatic response enrichment**: Records that reference a ticket (via `ticketID`) or task (via `taskID`) are automatically enriched with human-readable fields (`ticketNumber`, `ticketTitle`, `taskTitle`, `taskProjectNumber`, `taskProjectName`). Enrichment is transparent — it requires no configuration and applies to all list, get, and compound responses.

  ### Supported Resources

  The node supports the following Autotask resources:

  | Resource | Description |
  |----------|-------------|
  | API Threshold | Check Autotask API usage limits and current usage levels |
  | Appointment | Manage appointments (scheduled calendar work assigned to resources) |
  | Billing Code | Manage billing codes for time entries and charges |
  | Billing Items | Manage Autotask Billing Items, which represent billable items that have been approved and posted for potential invoicing |
  | Change Request Link | Manage links between Change Request tickets and Problem/Incident tickets. Includes Create If Not Exists for idempotent link creation. |
  | Checklist Library | Manage modular checklist components that can be applied to tickets or tasks |
  | Checklist Library Checklist Item | Manage individual checklist items within checklist library templates |
  | Classification Icon | Query classification icons used for categorising and visually identifying items |
  | Company | Manage organisations in Autotask. Includes Search by Domain (website/domain with optional contact-email fallback). |
  | Company Alert | Manage alerts associated with companies |
  | Company Location | Manage locations for companies |
  | Company Note | Manage notes attached to companies |
  | Company Site Configuration | Manage company site configurations and user-defined fields for customer companies |
  | Company Webhook | Manage webhooks for company events |
  | Configuration Item | Manage configuration items (CIs) for companies. Includes Move Configuration Item for cross-company CI cloning with optional notes and attachments copy. Includes Create If Not Exists for idempotent CI creation scoped by company. |
  | Configuration Item Billing Product Association | Manage product associations for configuration items |
  | Configuration Item Category | Manage categories for configuration items |
  | Configuration Item Category UDF Association | Manage UDF associations for CI categories |
  | Configuration Item DNS Record | Manage DNS records for configuration items |
  | Configuration Item Note | Manage notes for configuration items |
  | Configuration Item Related Item | Manage related items for configuration items |
  | Configuration Item SSL Subject Alternative Name | Manage SSL alternative names for configuration items |
  | Configuration Item Type | Manage types for configuration items |
  | Configuration Item Webhook | Manage webhooks for configuration item events |
  | Contact | Manage contacts associated with companies. Includes Move to Company operation for migrating contacts between companies. |
  | Contact Groups | Manage contact groups |
  | Contact Group Contacts | Manage contacts within contact groups |
  | Contact Webhook | Manage webhooks for contact events |
  | Contract | Manage contracts for companies. Includes Create If Not Exists for idempotent contract creation scoped by company. |
  | Contract Billing Rules | Manage billing rules for contracts |
  | Contract Block | Manage block hour contracts |
  | Contract Block Hour Factor | Manage hour factors for block hour contracts |
  | Contract Charge | Manage charges associated with contracts. Includes Create If Not Exists for idempotent charge creation. |
  | Contract Exclusion Billing Codes | Manage excluded billing codes for contracts |
  | Contract Exclusion Roles | Manage excluded roles for contracts |
  | Contract Exclusion Set Excluded Roles | Manage excluded roles within exclusion sets |
  | Contract Exclusion Set Excluded Work Types | Manage excluded work types within exclusion sets |
  | Contract Exclusion Sets | Manage reusable sets of excluded roles and work types for contracts |
  | Contract Milestone | Manage milestones for contracts |
  | Contract Note | Manage notes attached to contracts |
  | Contract Rate | Manage rates for contract services |
  | Contract Retainers | Manage retainers for contracts |
  | Contract Role Costs | Manage role costs for contracts |
  | Contract Service | Manage services within contracts. Includes Create If Not Exists for idempotent service assignment. |
  | Contract Service Adjustments | Manage adjustments for contract services |
  | Contract Service Bundle Adjustments | Manage adjustments for service bundles |
  | Contract Service Bundles | Manage service bundles within contracts |
  | Contract Service Bundle Units | Manage service bundle units |
  | Contract Service Unit | Manage service units for contracts |
  | Contract Ticket Purchases | Manage ticket purchases for contracts |
  | Countries | Query countries, which are used in address information for companies, contacts, and resources |
  | Domain Registrars | Manage domain registrars |
  | Holiday | Manage holiday dates |
  | Holiday Set | Manage holiday sets for resources |
  | Invoices | Manage invoices |
  | Notification History | View notification history |
  | Opportunity | Manage sales opportunities |
  | Product | Manage products in the catalogue |
  | Product Vendors | Manage vendor associations for products |
  | Project | Manage projects |
  | Project Charge | Manage charges associated with projects. Includes Create If Not Exists for idempotent charge creation. |
  | Project Note | Manage notes attached to projects |
  | Project Phase | Manage phases within projects |
  | Project Task | Manage tasks within projects |
  | Project Task Secondary Resources | Manage secondary resource assignments on project tasks |
  | Quote | Manage quotes for opportunities with pricing for products, services, and labour |
  | Quote Item | Manage line items for quotes including products, services, and labour |
  | Quote Location | Manage shipping and billing address information for quotes |
  | Quote Template | Query quote templates that define content and appearance of quotes |
  | Resource | Manage staff resources. Includes Who Am I and Transfer Ownership (companies, opportunities, tickets, tasks, projects, task/secondary and service-call assignments, appointments) with dry run and optional audit notes. |
  | Resource Role | Manage department/role relationships, service desk queues, and service desk roles |
  | Roles | Manage roles in the system |
  | Search Filter | Build advanced search filters |
  | Service | Manage services offered to clients |
  | Service Call | Manage service calls |
  | Service Call Task | Manage tasks associated with service calls |
  | Service Call Task Resource | Manage resources assigned to service call tasks |
  | Service Call Ticket | Manage tickets linked to service calls |
  | Service Call Ticket Resource | Manage resources assigned to service call tickets |
  | Service Level Agreement Result | Query SLA results tracking time and completion data for service level events |
  | Skill | Query skills used for resource competency tracking |
  | Survey | Manage customer surveys |
  | Survey Results | Manage results from customer surveys |
  | Subscription | Manage Subscriptions, which represent recurring service agreements with customers |
  | Subscription Period | Query Subscription Periods, which track billing periods and usage for subscriptions |
  | Tag | Manage ticket and article tags with unique label requirements |
  | Tag Alias | Manage alternative names for tags to improve searchability |
  | Tag Group | Organise tags into categories with display colours and system group protections |
  | Ticket | Manage service tickets. Includes SLA Health Check (SLA milestone timing and status), Summary (compact type-aware summary with filtered fields, computed values, child entity counts, and relationships), and Timeline (merged chronological event stream — notes, time entries, optional history — for escalation briefs and effort audits). |
  | Ticket Attachment | Manage files attached directly to tickets |
  | Ticket Category | Manage ticket categories with display colors and default field values |
  | Ticket Category Field Default | Query default field values for ticket categories |
  | Ticket Change Request Approval | Manage ticket change request approvals using root and ticket child endpoint scopes |
  | Ticket Charge | Manage charges associated with tickets. Includes Create If Not Exists for idempotent charge creation. |
  | Ticket Checklist Item | Manage checklist items on tickets |
  | Ticket Checklist Library | Add all items from a checklist library to a ticket |
  | Ticket History | View historical changes to tickets |
  | Ticket Note | Manage notes attached to tickets |
  | Ticket Note Attachment | Manage files attached to ticket notes |
  | Ticket Note Webhook | Manage webhooks for ticket note events |
  | Ticket Secondary Resource | Manage secondary resource assignments on tickets |
  | Ticket Webhook | Manage webhooks for ticket events |
  | Time Entry | Manage time entries for billing. Includes Get Posted and Get Unposted operations for listing labour entries by posting status with cross-entity filters. Includes Create If Not Exists for idempotent time entry creation scoped by resource. |
  | Time Entry Attachment | Manage files attached to time entries |

  ### Operations

  For most resources, the following operations are available:

  - **Create**: Add new records
  - **Read**: Retrieve a single record by ID
  - **Update**: Modify existing records
  - **Delete**: Remove records
  - **Get Many**: Retrieve multiple records with basic filtering options. This operation allows you to:
    - Filter records using simple field conditions (equals)
    - Filtering on User Defined Fields (UDFs)
    - Automatically paginate through large result sets
    - Choose to get all results or limit to a specific number (1-500)
    - Set a maximum number of records to return when not retrieving all records
    - Select specific columns to return in the response
    - Add human-readable labels for picklist and reference fields
    - Flatten User-Defined Fields for easier access in workflows
  - **Get Many Advanced**: Build complex queries with multiple filter conditions and logical operators. This operation provides:
    - Support for complex AND/OR logic in filters
    - Nested condition groups for sophisticated queries
    - Filtering on User Defined Fields (UDFs)
    - Advanced operators like contains, beginsWith, endsWith, exists, notExists
    - Support for IN and NOT IN operators with multiple values
    - Choose to get all results or limit to a specific number (1-500)
    - Set a maximum number of records to return when not retrieving all records
    - Select specific columns to return in the response
    - Add human-readable labels for picklist and reference fields
    - Flatten User-Defined Fields for easier access in workflows
    - Date-based filtering with automatic timezone handling
  - **Create If Not Exists**: Idempotent creation — checks for an existing record matching configurable dedup fields before creating. Available for Contract Charge, Ticket Charge, Project Charge, Configuration Item, Time Entry, Contract Service, and Contract. Supports:
    - Configurable dedup fields (choose which fields to match on)
    - `errorOnDuplicate` option to fail instead of silently skipping when a duplicate is found
    - Same dynamic field loading as the Create operation (resourceMapper)
    - Outcomes: `created` (new record), `skipped` (duplicate found), or scope-entity-not-found error
  - **Count**: Get the number of matching records
  - **Get Entity Info**: Retrieve metadata about the entity
  - **Get Field Info**: Retrieve field definitions for the selected entity

  For the **Time Entry** resource, additional posting-status operations are available:

  - **Get Posted**: List time entries that have been approved and posted as billing items
  - **Get Unposted**: List time entries that have not yet been posted

  Both operations cross-reference TimeEntries with BillingItems (Autotask has no posted-status field on TimeEntry itself). They support collapsible filters including Date Range (13 presets), Time Entry Type, Billable Status, Hours Worked range, Resource, Contract Type, Ticket Status, Task Status, Queue, and Account Manager. Date range resolution respects the configured credential timezone and converts to UTC for the API.

  For the **Company** resource, **Search by Domain** finds companies by website/domain (domain or full URL; operator: eq, contains, beginsWith, endsWith). If no company website matches and the option is enabled (default), it falls back to contact email domain and returns the most common company. Available on both the main Autotask node and the Autotask AI Tools node.

  For the **Ticket** resource, **SLA Health Check** accepts either Ticket ID or Ticket Number, then combines Ticket and Service Level Agreement Result data to return first-response, resolution-plan, and resolution health with a consistent unit of hours (2 decimal places). It supports **Add Picklist Labels** and **Add Reference Labels** for enriched output, includes an SLA-only fallback to resolve `companyID_label` when reference labels are enabled, and lets you choose which ticket fields to include in the ticket payload (default: `id`, `ticketNumber`, `title`, `status`, `companyID`). This operation is available in both the main Autotask node and the Autotask AI Tools node (AI parameter: `ticketFields`).

  For the **Ticket** resource, **Summary** (`ticket.summary`) produces a compact, type-aware snapshot of any Autotask ticket. It accepts either a ticket `id` or `ticketNumber`. The operation returns four blocks alongside the filtered ticket payload:

  - **`summary`** — the ticket fields after null/empty filtering and type-aware field ordering. Universal fields (id, ticketNumber, title, status, priority, companyID) lead; type-specific fields follow based on the detected type (Change Request: change-approval fields and all `changeInfoField*` aliases; Incident: assignment, role, queue, SLA milestones; Problem: assignment, role, queue, SLA milestones; Service Request: assignment, role, queue, due date, estimated hours, SLA milestones; Alert: assignment, queue, due date, first-response milestone, SLA; Unknown: assignment, queue, due date, estimated hours); remaining fields trail in natural order.
  - **`computed`** — derived values calculated from the ticket's own fields: `ageHours`, `daysSinceLastActivity`, `isAssigned`. For open tickets: `isOverdue`, plus `hoursUntilDue` (positive, when not yet overdue) or `hoursOverdue` (positive magnitude, when past due). SLA fields when an SLA is assigned: `slaStatus` (`No SLA` / `Met` / `Paused` / `Breached` / `At Risk` / `On Track` / `Pending`), `slaNextMilestoneDueHours` (hours until next upcoming unmet milestone), and `slaEarliestBreachHours` (hours since earliest unmet overdue milestone). SLA milestone status uses the same logic as `ticket.slaHealthCheck` (wall-clock comparison; no business-hours adjustment).
  - **`relationships`** — linked entities when present: `linkedProblem` (via `problemTicketId`), `project` (via `projectID`), `opportunity` (via `opportunityID`).
  - **`childCounts`** — counts fetched in parallel: `notes`, `timeEntries`, `attachments`, `additionalConfigurationItems`, `additionalContacts`, `checklistItems` (object with `total` / `completed` / `remaining`), and `changeRequestLinks` (Change Request tickets only). Zero-value counts are omitted. Count fetch errors are surfaced in `_meta.countErrors` rather than failing the whole operation. **Omitted by default** — set `includeChildCounts: true` to fetch and include this block.
  - **`_meta`** — transformation audit trail describing exactly how the summary was shaped: `detectedTicketType` + `typeDetectedBy` (`'label'` / `'numericField'` / `'fallback'`), `transformationsApplied` (ordered list — e.g. `['aliasExpansion', 'nullFiltering', 'textTruncation', 'typeAwareOrdering']`), `prioritisedFields` (fields placed in the universal or type-specific priority buckets), `excludedFieldCount` + `excludedFieldNames` (fields dropped for being null/empty), `rawIncluded` (boolean), `childCountsIncluded` (boolean — whether child-count enrichment was performed), `truncationApplied` (boolean) + `truncatedFields` detail when active, `countsPartial` (boolean) + `countErrors` detail when any count fetch failed, `aliasesApplied` + `suppressedCanonicalFields` + `aliasMap` when Change Info aliases are active, `slaDetailAvailable`, `source`, `generatedAt`.

  Reference label enrichment, picklist label enrichment, and UDF flattening are always applied — no per-operation toggles. Long text fields (`description`, `resolution`) are truncated to `summaryTextLimit` characters (default 500; set to 0 to disable). Set `includeRaw: true` to receive the full enriched payload before filtering, truncation, and alias renaming, with canonical `changeInfoField{N}` keys intact. Set `includeChildCounts: true` to fetch child entity counts (several parallel API calls; omitted by default for speed). Available in both the standard node and AI Tools.

  For the **Configuration Item** resource, **Move Configuration Item** clones a CI to another company (Autotask does not allow companyID changes in place), with optional copying of UDFs, CI attachments, notes, and note attachments. Uses API-driven writable field detection so new Autotask fields are handled automatically. Leaves customisable audit notes on both source and destination CIs with deep links and company names, supports dry-run mode, and can deactivate the source CI after completion checks. Optionally set **Impersonation Resource ID** so created records are attributed to a specific resource. Tickets/tasks/projects/contracts and other associations are explicitly not migrated by this operation.

  For webhook resources (Company Webhook, Contact Webhook, Configuration Item Webhook, Ticket Webhook, Ticket Note Webhook), the following operations are available:
  - **Get**: Retrieve a single webhook by ID
  - **Get Many**: Retrieve multiple webhooks with basic filtering
  - **Delete**: Remove a webhook

  ### Webhook Trigger

  The node includes an Autotask Trigger node that can receive webhook events from Autotask. The trigger supports:

  - Events for multiple entity types (Companies, Contacts, Tickets, Configuration Items, Ticket Notes)
  - Create, Update, and Delete events
  - Field selection for webhook payloads (specify which fields to include)
  - Resource exclusion (exclude specific resources from triggering the workflow)
  - Email notifications for webhook delivery failures
  - Threshold notifications for monitoring webhook performance
  - Automatic webhook registration and cleanup
  - Secure payload verification with HMAC signatures

  ### Advanced Features

  - **Resource Mapping**: Dynamically map fields based on entity definitions. When Mapping Column Mode is set to "Map automatically" (`autoMapInputData`), the node uses incoming item data directly and passes all fields whose keys match the selected entity's schema IDs, regardless of whether those columns are toggled off in the UI. Node parameter mappings are ignored in this mode (matching n8n's standard resource mapper behaviour). `bodyJson` still takes final precedence as an override.
  - **Advanced Filtering**: Build complex queries with multiple conditions
  - **Column Selection**: Choose specific fields to return in get operations
  - **Picklist Label Enrichment**: Automatically add human-readable labels for picklist fields
  - **Reference Label Enrichment**: Add human-readable labels for reference fields
  - **UDF Flattening**: Bring user-defined fields up to the top level of response objects for easier access
  - **File-based Caching**: Improved performance with persistent caching that can be shared between workflows and runs
  - **Timezone Handling**: Automatic conversion between local time and UTC
  - **API Usage Monitoring**: Check current API usage thresholds and limits using the API Threshold resource to help prevent hitting rate limits and ensure smooth operations
  - **Dry Run Mode**: Preview write operations (create, update, delete) without making actual changes. When enabled, returns a preview of the request that would be sent, useful for testing and validation
  - **Inactive Entity Handling**: When a create or update is rejected because a reference field (e.g. `contactID`, `createdByPersonID`) points to an inactive contact or resource, the node automatically activates the entity, retries the operation, then deactivates it again. This applies to all entities and requires no configuration

  ### API Threshold Resource

  The API Threshold resource provides a simple way to monitor your Autotask API usage limits and current consumption. This helps users:
  - Track how many API requests have been made in the current timeframe
  - See the maximum allowed requests (threshold limit)
  - View the usage as a percentage and categorized level (Normal, Moderate, High, Critical)
  - Calculate remaining available requests
  - Monitor timeframe duration for rate limits

  This is particularly useful for workflows that make many API calls, allowing you to implement conditional logic based on current usage levels to avoid hitting rate limits and ensure continuous operation.

  ### AI Agent Playbook

  > **Deprecation notice:** The *Tool* resource and *AI Helper* resource within the main Autotask node are deprecated and will be removed in a future release. Use the dedicated **Autotask AI Tools** node (see [Autotask AI Tools](#autotask-ai-tools) above) for all new AI agent integrations. The helper tools (`describeFields`, `listPicklistValues`) are built into the AI Tools node and do not require a separate aiHelper resource.

  This node is optimised for AI agents and tool-calling systems with specialised features designed for autonomous operation.

  #### Quick Start for AI Agents

  The recommended path is the **Autotask AI Tools** node (see the [Autotask AI Tools](#autotask-ai-tools) section above). Add one node per resource, connect each to your AI Agent's `Tools` input, and the agent gets a tool named `autotask_<resource>` with a unified `operation` enum.

  **1. Build the request**

  The agent calls a tool like this (the LLM emits the JSON; you don't write it manually):

  ```jsonc
  autotask_ticket({
    operation: "create",
    title: "API Integration Issue",
    description: "Customer reporting connection problems",
    priority: "Medium",         // human-readable label — resolved automatically
    status: "New",              // human-readable label — resolved automatically
    companyID: "Tech Solutions" // reference label — resolved automatically
  })
  ```

  Labels for picklist and reference fields are resolved to numeric IDs before the API call. Successful responses include `resolvedLabels` showing each mapping. Ambiguous matches produce `pendingConfirmations` for user confirmation rather than guessing.

  **2. Inspect when needed**

  Every AI Tools node instance also exposes three helper operations automatically:

  - `describeFields` — field metadata (types, required, picklist/reference, dependencies)
  - `listPicklistValues` — valid values for a picklist field
  - `describeOperation` — full documentation for one operation on the tool

  The agent will usually only need these on edge cases — most write operations embed a compact required-fields summary directly in their description.

  **3. Read the response**

  Responses use a flat shape — the top-level key tells you the response type: `records[]` (list), `record{}` (item), `id` + `record{}` (mutation), `matchCount` (count), `outcome` (compound). All responses include a plain-English `summary` field.

  **4. Recover from errors**

  Error responses include `errorType`, a `summary` prefixed with `REQUIRED NEXT STEP: ...` for actionable cases, and a `nextAction` string telling the agent what to call before retrying (e.g. `listPicklistValues`, `describeFields`).

  > **Legacy path:** The main **Autotask** node also exposes a deprecated `aiHelper` resource (`describeResource`, `listPicklistValues`, `validateParameters`) and per-operation flags like `bodyJson`, `selectColumnsJson`, `dryRun`, `outputMode`. These remain in place for existing workflows but should not be used for new AI agent integrations — use the AI Tools node instead.

  #### Tool Configuration for Maximum Effectiveness

  For optimal AI agent integration, add **one Autotask AI Tools node per resource** to your workflow and connect each one to the AI Agent's `Tools` input. Every instance becomes a single unified tool named `autotask_<resource>` (e.g. `autotask_contact`, `autotask_company`) with an `operation` enum the LLM selects at call time.

  **How to add a tool (n8n UI):**

  1. Drag an **Autotask AI Tools** node onto the canvas.
  2. Connect its `Tools` output to the `Tools` input of your AI Agent node.
  3. Configure the node:
     - **Resource Name or ID** — pick one resource (e.g. `contact`).
     - **Operations Names or IDs** — multi-select the operations you want the agent to use (e.g. `get`, `getMany`, `count`). Helper operations `describeFields`, `listPicklistValues`, and `describeOperation` are always included automatically — no need to expose them as a separate inspector tool.
     - **Allow Write Operations** — toggle on to expose `create`, `createIfNotExists`, `update`, `delete`, and resource-specific mutations. Default is off (read-only).
     - **Tool Description Appendix** — optional free-text appended to the tool description, visible to the LLM. Use this for deployment-specific guardrails (e.g. *"Only query tickets in the MSP support queue. Never create tickets for internal IT."*).
     - **Time Entry Notes Guidance** — appears only when Resource = Time Entry. Use it to enforce your house style for Summary Notes and Internal Notes.
  4. Repeat for each resource you want the agent to access. Common starting set:

  | Node instance | Resource | Typical operations | Write enabled |
  |---|---|---|---|
  | Companies | `company` | `get`, `getMany`, `count`, `searchByDomain` | usually off |
  | Contacts | `contact` | `get`, `getMany`, `create`, `update` | as needed |
  | Tickets | `ticket` | `get`, `getMany`, `count`, `create`, `update`, `slaHealthCheck`, `summary` | as needed |
  | Time entries | `timeEntry` | `getPosted`, `getUnposted`, `create`, `createIfNotExists` | as needed |
  | Resources (MSP staff) | `resource` | `getMany`, `whoAmI` | off |

  **Benefits of one-node-per-resource:**
  - **Focused schemas** — the LLM sees a tight, predictable set of operations per tool.
  - **Granular write control** — enable writes on `contact` without enabling them on `ticket`.
  - **Per-resource deployment context** — different appendix guidance for each resource.
  - **Cleaner execution view** — each tool call is labelled by resource in n8n's log.

  **Label resolution is automatic.** When the LLM passes a human-readable name to a picklist or reference field (e.g. `resourceID: "Will Spence"` or `status: "New"`), it's resolved to the numeric ID before the API call. Ambiguous matches return `pendingConfirmations` rather than guessing. No pre-configuration needed.

  #### Environment Setup

  For AI tool usage, set this environment variable:

  ```bash
  N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
  ```

  Configuration options:
  - Add to your `.env` file
  - Set in system environment variables  
  - Include in Docker/container configuration
  - Add to startup command: `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true n8n start`

  #### Example Agent Workflow

  **Scenario: Create a contact at an existing company**

  This is illustrative — the LLM picks the tool name and `operation` value, and supplies arguments matching each tool's auto-generated Zod schema. You don't write any of this code; it shows what the agent sees and does at runtime.

  ```jsonc
  // Assumes the workflow has two AI Tools node instances configured:
  //   - Resource = company  →  exposed as tool  autotask_company
  //   - Resource = contact  →  exposed as tool  autotask_contact  (Allow Write Operations = on)

  // 1. Find the company by name. Helper operation describeFields is always available
  //    if the agent needs to inspect the schema first — usually it doesn't, because
  //    required-field summaries are embedded in each create operation's description.
  autotask_company({
    operation: "getMany",
    filter_field: "companyName",
    filter_op: "contains",
    filter_value: "Tech Solutions"
  })
  // → { records: [{ id: 12345, companyName: "Tech Solutions Ltd", ... }], summary: "..." }

  // 2. Create the contact. Picklist and reference fields accept human-readable labels;
  //    they are resolved to numeric IDs automatically.
  autotask_contact({
    operation: "create",
    firstName: "John",
    lastName: "Smith",
    emailAddress: "john.smith@techsolutions.com",
    companyID: 12345,            // numeric ID returned in step 1
    title: "IT Manager"
  })
  // → { id: 67890, record: { ... }, resolvedLabels: [], summary: "Created contact 67890" }

  // 3. If the LLM had passed companyID: "Tech Solutions Ltd" instead of 12345, the
  //    response would include resolvedLabels showing the name→ID mapping. Ambiguous
  //    names produce pendingConfirmations rather than guessing.
  ```

  **Auto-included helper operations** (no configuration required, available on every AI Tools node instance):

  - `describeFields` — return field metadata for the resource (types, required, picklist/reference)
  - `listPicklistValues` — return valid values for a picklist field
  - `describeOperation` — return full documentation for a specific operation on the tool

  #### Error Self-Healing

  Errors return a flat JSON shape with structured fields the agent can act on directly:

  ```jsonc
  {
    "error": true,
    "errorType": "INVALID_PICKLIST_VALUE",
    "resource": "ticket",
    "operation": "create",
    "summary": "REQUIRED NEXT STEP: Call autotask_ticket with operation 'listPicklistValues' for field 'priority', then retry — Field 'priority' rejected value 'Urgent'",
    "nextAction": "Call autotask_ticket with operation 'listPicklistValues' for field 'priority', then retry",
    "mustRetryAfter": ["listPicklistValues"],
    "invalidField": "priority",
    "invalidValue": "Urgent"
  }
  ```

  Key fields:
  - `errorType` — stable string constant (e.g. `INVALID_PICKLIST_VALUE`, `ENTITY_NOT_FOUND`, `MISSING_REQUIRED_FIELDS`, `WRITE_OPERATION_BLOCKED`). Use this to branch in agent prompts or downstream logic.
  - `summary` — human-readable. Actionable errors are prefixed with `"REQUIRED NEXT STEP: ..."` so the recovery step is visible in the instruction register, not just buried in context.
  - `nextAction` — exact recovery step in plain English. References the unified tool name (e.g. `autotask_ticket with operation 'listPicklistValues'`).
  - `mustRetryAfter` — optional list of operations the agent must call before retrying. Surfaced by `formatFieldError`, `formatRequiredFieldsError`, `formatNotFoundError`, and picklist-related failures.
  - Context fields (`invalidField`, `filtersUsed`, `missingFields`, `pendingConfirmations`, etc.) appear at the **root** of the response — no `context` wrapper.

  #### Best Practices for Agents

  - **One node per resource** — gives the agent named, focused tools (`autotask_company`, `autotask_ticket`, etc.) with predictable schemas.
  - **Read-only by default** — leave **Allow Write Operations** off unless the agent genuinely needs to mutate data. Enable per-resource, not globally.
  - **Use the appendix for guardrails** — put deployment-specific constraints in **Tool Description Appendix** so they're visible to the LLM on every call.
  - **Trust label resolution** — let the LLM pass names like `"Will Spence"` or `"In Progress"`. Resolution is automatic, transparent (`resolvedLabels` in the response), and refuses to guess on ambiguous matches.
  - **Follow error `nextAction`** — error responses include a `nextAction` string the agent should execute before retrying (e.g. *call `describeFields`*, *call `listPicklistValues`*). Actionable error types prefix the summary with `"REQUIRED NEXT STEP: ..."`.
  - **Use `count` for sanity checks** — when listing tickets/charges/etc., call `count` first if the agent only needs a total. Cheaper than `getMany`.
  - **Use `createIfNotExists`** for idempotent operations — supported on charges, configuration items, contracts, contract services, change request links, and time entries. Configurable `dedupFields` decide what counts as a duplicate.

  #### Troubleshooting

  **Tool Not Available:** Ensure `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true` is set in your n8n environment.
  **Agent doesn't see a write operation:** Toggle **Allow Write Operations** on the corresponding AI Tools node, then save and re-execute.
  **LLM passes the wrong picklist value:** The response will include `pendingConfirmations` for ambiguous labels. The agent should surface the candidates to the user or call `listPicklistValues` to disambiguate.
  **Large responses overflowing the agent's context:** Reduce `limit`, narrow with `filter_field`/`filter_op`/`filter_value`, or use `count` first to gauge result size before fetching.

  ## Usage

  ### Basic Example: Creating a Ticket

  1. Add an **Autotask** node to your workflow
  2. Select **Ticket** as the resource
  3. Select **Create** as the operation
  4. Configure the required fields (Title, Status, etc.)
  5. Connect to a trigger or previous node
  6. Execute the workflow

  ### Intermediate Example: Querying Projects with Filters

  1. Add an **Autotask** node to your workflow
  2. Select **Project** as the resource
  3. Select **Get Many** as the operation
  4. Add filter conditions (e.g., Status equals "Active")
  5. Choose whether to retrieve all results or limit the number:
     - Toggle "Get All" to true to retrieve all matching records
     - Toggle "Get All" to false and set "Max Records" (1-500) to limit the results
  6. Connect to a trigger or previous node
  7. Execute the workflow

  ### Advanced Example: Using Column Selection and Reference Labels

  1. Add an **Autotask** node to your workflow
  2. Select **Ticket** as the resource
  3. Select **Get Many** as the operation
  4. Add filter conditions as needed
  5. Enable **Select Columns** to choose specific fields to return
  6. Select only the fields you need in the response (improves performance)
  7. Enable **Add Picklist Labels** to get human-readable values for picklist fields
  8. Enable **Add Reference Labels** to get human-readable values for reference fields
  9. Enable **Flatten User-Defined Fields** to bring UDFs to the top level of response objects
  10. Execute the workflow to get tickets with only the selected fields and human-readable labels

  ### Advanced Example: Complex Filtering with Get Many Advanced

  1. Add an **Autotask** node to your workflow
  2. Select **Ticket** as the resource
  3. Select **Get Many Advanced** as the operation
  4. Build a complex filter, for example:
     ```json
     {
        "filter": [
        {
          "op": "and",
          "items": [
            {
              "field": "status",
              "op": "noteq",
              "value": 5
            },
            {
              "op": "or",
              "items": [
                {
                  "field": "priority",
                  "op": "eq",
                  "value": 6
                },
                {
                  "field": "dueDateTime",
                  "op": "lt",
                  "value": "{{ $now.plus(3, 'days').toLocal()}}"
                }
               ]
             }
           ]
        }
      ]
     }
     ```
     [Valid filter operators and filter documentation can be found here](https://ww15.autotask.net/help/DeveloperHelp/Content/APIs/REST/API_Calls/REST_Basic_Query_Calls.htm?Highlight=filter#List2)
  5. Choose whether to retrieve all results or limit the number:
     - Toggle "Get All" to true to retrieve all matching records
     - Toggle "Get All" to false and set "Max Records" (1-500) to limit the results
  6. Enable **Select Columns** to choose specific fields to return
  7. Enable **Add Reference Labels** and **Add Picklist Labels** for human-readable values
  8. Execute the workflow to retrieve tickets that are not complete AND either have priority 6 OR are due within the next 3 days

  ### Example: Monitoring API Usage with API Threshold

  1. Add an **Autotask** node to your workflow
  2. Select **API Threshold** as the resource
  3. The operation **Get API Usage** will be automatically selected (it's the only available operation)
  4. Execute the node to receive current API usage information including:
     - Current usage count
     - Maximum threshold (limit)
     - Usage percentage
     - Usage level (Normal, Moderate, High, Critical)
     - Remaining requests
     - Timeframe duration
  5. You can use this information with IF nodes to implement conditional logic:
     - Pause workflows when usage is too high
     - Throttle requests during peak usage periods
     - Log warnings when approaching limits
     - Only execute non-critical operations when usage is below certain thresholds

  ### Advanced Example: Working with Parent-Child Relationships

  Many Autotask entities have parent-child relationships (e.g., Companies and Contacts). To work with these:

  1. First, retrieve or create the parent entity
  2. Use the parent entity's ID in the child entity operations
  3. For example, to create a Contact for a Company:
     - First node: Get or create the Company
     - Second node: Create a Contact with the Company ID

  ### Example: Setting Up a Webhook Trigger

  1. Add an **Autotask Trigger** node to your workflow
  2. Select the entity type to monitor (Companies, Contacts, Tickets, etc.)
  3. Select the events to subscribe to (Create, Update, Delete)
  4. Configure the webhook URL (n8n will handle this automatically)
  5. Optionally specify fields to include in the webhook payload
  6. Optionally exclude specific resources from triggering the workflow
  7. Configure email notifications for webhook delivery failures if needed
  8. Save and activate the workflow
  9. The node will automatically register the webhook with Autotask
  10. When events occur in Autotask, they will trigger your workflow
  11. When the workflow is deactivated, the webhook will be automatically removed

  ## Configuration

  ### Caching Options

  The node includes an enhanced file-based caching system to improve performance by reducing API calls:

  - **Enable Field Caching**: Toggle caching on/off
  - **Cache TTL**: How long to cache field values (in seconds)
  - **Cache Entity Info**: Whether to cache entity information and field definitions
  - **Entity Info TTL**: How long to cache entity information
  - **Cache Reference Fields**: Whether to cache reference field values
  - **Reference Fields TTL**: How long to cache reference field values
  - **Cache Picklists**: Whether to cache picklist values
  - **Picklists TTL**: How long to cache picklist values
  - **File-based Cache**: Cache is stored in files that can be shared between workflows and runs
  - **Cache Directory**: Optional path to a directory where cache files will be stored

  > **IMPORTANT**: This node uses dynamic picklists and field enrichers to convert numerical values into human-readable labels through dynamic lookups. It's strongly recommended to keep caching enabled to avoid excessive API calls. Without caching, each picklist and reference field lookup requires separate API calls, which can quickly consume your API rate limits, especially in workflows with many operations or large data sets.

  ### Change Info Field Aliases

  Autotask exposes five tenant-defined text fields on the Ticket entity (`changeInfoField1`..`changeInfoField5`) used on Change Request tickets to capture sections such as business impact, change steps, implementation plan, rollback plan, and risks. The labels for these fields are configured per-tenant in the Autotask UI.

  To make these fields easier to work with in workflows and AI agents, the credential supports optional alias enrichment:

  - **Enrich Ticket Output with Change Info Field Aliases**: When enabled, all Ticket read operations (`get`, `getMany`, `getManyAdvanced`, `slaHealthCheck`, `summary`) append alias-named copies of these fields alongside the originals.
  - **Change Info Field 1–5 Alias**: Alias names appended as `changeInfoField{N}_{alias}` (e.g. `changeInfoField1_issueBusinessImpact`). Defaults: `issueBusinessImpact`, `changesToBeMade`, `implementationPlan`, `reversionPlan`, `risksInvolved`.

  Original `changeInfoField1..5` fields are always preserved. Aliases are normalised to safe property-name tokens; blank aliases fall back to `field1`..`field5`; duplicate tokens are suffixed deterministically.

  ### Label Enrichment and Field Processing

  The node provides options to enrich entities with human-readable labels and simplify field access:

  - **Add Picklist Labels**: Adds "_label" fields for picklist values (e.g., Status_label: "In Progress")
  - **Add Reference Labels**: Adds "_label" fields for reference values (e.g., Company_label: "Acme Corporation")
  - **Flatten User-Defined Fields**: When enabled, brings UDFs up to the top level of each response object for easier access instead of being nested in the userDefinedFields array (maintains the original array for backward compatibility)

  ### Column Selection

  To improve performance and reduce payload size, you can select specific columns to return:

  - **Select Columns**: Choose which fields to include in the response
  - Works with all get operations (get, getMany, getManyAdvanced)
  - Compatible with label enrichment features

  ### Timezone Handling

  All dates and times in the Autotask API are in UTC. The node automatically converts between your selected timezone and UTC:

  - When creating or updating records, local times are converted to UTC
  - When retrieving records, UTC times are converted to your local timezone
  - The timezone is configured in the credentials
  - For Search Filter operations, input dates are thoroughly converted to UTC using the configured timezone, ensuring consistency with API requirements
  - Output dates from all operations are converted to the configured local timezone for easier workflow handling

  ## Limitations

  ### API Limits

  - Maximum 500 records per page in query results
  - Maximum 50 pages per query operation
  - Maximum 500 OR conditions in filters
  - Maximum 1 User Defined Field per query

  ### Entity-Specific Limitations

  - Some entities may not support all operations (e.g., Project Phases cannot be deleted)
  - Parent-child relationships require specific handling
  - Some fields may be read-only or have specific validation rules

  ### Performance Considerations

  - Large queries may be slow and should be optimised with filters
  - Column selection can significantly improve performance by reducing payload size
  - Complex workflows with many API calls may hit rate limits
  - Disabling caching when using picklist or reference label enrichment can lead to a high volume of API calls, potentially triggering rate limits. Each field being enriched requires a separate API call when cache is not available.

  ## Troubleshooting

  ### Common Issues

  - **Authentication Errors**: Verify your API credentials and ensure the API user has appropriate permissions
  - **Field Validation Errors**: Check field requirements in the Autotask API documentation
  - **Rate Limiting**: If you encounter rate limiting, reduce the frequency of API calls or implement retry logic

  ### Reporting Bugs

  If you encounter any bugs or issues with this integration:

  1. Check the [GitHub Issues](https://github.com/msoukhomlinov/n8n-nodes-autotask/issues) to see if the problem has already been reported
  2. If not, please submit a new issue with:
     - A clear description of the problem
     - Steps to reproduce the issue
     - Expected vs actual behaviour
     - Your environment details (n8n version, Node.js version)
     - Any relevant error messages or screenshots

  Bug reports should be submitted via GitHub at: https://github.com/msoukhomlinov/n8n-nodes-autotask/issues

  ## Resources

  - [Autotask API Documentation](https://ww6.autotask.net/help/developerhelp/Content/APIs/REST/REST_API_Home.htm)
  - [n8n Documentation](https://docs.n8n.io/)
  - [GitHub Repository](https://github.com/msoukhomlinov/n8n-nodes-autotask)

  ## Support

  If you find this node helpful and want to support its ongoing development, you can buy me a coffee:

  [![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-yellow.svg)](https://buymeacoffee.com/msoukhomlinov)

  Your support helps maintain this project and develop new features.

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with Autotask PSA via its REST API, supporting CRUD operations, AI tool exposure, and data enrichment for ticket, company, contact, and other PSA entities.","capabilities":["Create, read, update, and delete PSA entities","Expose Autotask operations as AI Agent tools","Support name-based label resolution for picklists and references","Implement OR filter logic for list operations","Enable offset pagination with up to 500 records","Provide idempotent createIfNotExists semantics","Automatically enrich records with related ticket and task details","Support impersonation via name or email resolution","Cache dynamically fetched field picklists"],"authentication":"API key required (API Integration Code, Username, and Secret)","commonUseCases":["Automating PSA ticket workflows","Integrating PSA data with AI agents for automated responses","Synchronizing customer and contact information","Creating and updating PSA records programmatically"],"limitations":["Requires n8n version 1.0.0 or later","Requires Node.js version 18.10 or later","Requires pnpm version 9.1 or later if using pnpm","AI Tools feature requires N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE environment variable","Instance restart recommended after updating the node package"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.credentialManager","n8n-nodes-core.aiAgent"]}


node_type: n8n-nodes-html2pdf.html2pdf
package_name: n8n-nodes-html2pdf
display_name: html2pdf
description: Convert HTML content or URLs to PDF with exact visual rendering
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: thomas_martin
npm_package_name: n8n-nodes-html2pdf
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:36.048Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-html-to-pdf

  Convert HTML content or URLs to PDF files with exact visual rendering in n8n.

  ## Features

  - ✅ **Convert HTML to PDF** - Direct HTML content conversion
  - ✅ **Convert URLs to PDF** - Capture any webpage as PDF
  - ✅ **Exact Visual Rendering** - Preserves structure, styling, fonts, colors, images
  - ✅ **Multiple Page Formats** - A4, Letter, Legal, A3
  - ✅ **Flexible Orientation** - Portrait or landscape
  - ✅ **Configurable Margins** - Custom margins with units (px, mm, cm, in)
  - ✅ **CSS Support** - Print backgrounds, colors, and images
  - ✅ **Scale Control** - Adjust rendering size (0.1x to 2.0x)
  - 🎯 **Perfect for**: Emails, invoices, reports, archiving, documentation

  ## Installation

  ### Via n8n UI (Recommended)

  1. Go to **Settings** > **Community Nodes**
  2. Click **Install**
  3. Enter: `n8n-nodes-html-to-pdf`
  4. Click **Install**
  5. **Restart n8n** (required for nodes to load)

  ### Via npm

  ```bash
  cd ~/.n8n
  npm install n8n-nodes-html-to-pdf
  # Then restart n8n
  ```

  ## Usage

  ### Convert HTML Content to PDF

  1. Add "HTML to PDF" node to your workflow
  2. Select **Source Type**: "HTML Content"
  3. Paste your HTML in the **HTML Content** field
  4. Configure PDF options (format, orientation, etc.)
  5. Execute workflow
  6. Download PDF from output

  ### Convert URL to PDF

  1. Add "HTML to PDF" node to your workflow
  2. Select **Source Type**: "URL"
  3. Enter the webpage URL
  4. Configure PDF options
  5. Execute workflow
  6. Download PDF from output

  ## Configuration Options

  | Option | Description | Default |
  |--------|-------------|---------|
  | **Source Type** | "HTML Content" or "URL" | HTML Content |
  | **HTML Content** | HTML code to convert | - |
  | **URL** | Webpage URL to convert | - |
  | **PDF File Name** | Output filename | document.pdf |
  | **Page Format** | A4, Letter, Legal, A3 | A4 |
  | **Orientation** | Portrait (false) or Landscape (true) | Portrait |
  | **Print Background** | Include CSS backgrounds/colors/images | ✅ Enabled |
  | **Scale** | Rendering scale (0.1-2.0) | 1.0 |
  | **Margins** | Top, Right, Bottom, Left (with units) | 0 |

  ## Examples

  ### Example 1: Convert HTML Email to PDF

  ```html
  <html>
    <body style="font-family: Arial; padding: 20px;">
      <h1 style="color: #2c3e50;">Invoice #12345</h1>
      <p>Date: 2025-01-15</p>
      <table style="width: 100%; border-collapse: collapse;">
        <tr style="background: #3498db; color: white;">
          <th>Item</th><th>Quantity</th><th>Price</th>
        </tr>
        <tr>
          <td>Product A</td><td>2</td><td>$50</td>
        </tr>
      </table>
    </body>
  </html>
  ```

  **Result**: Professional PDF invoice with exact styling preserved

  ### Example 2: Webpage to PDF

  ```
  Source Type: URL
  URL: https://example.com/article
  Format: A4
  Orientation: Portrait
  Print Background: ✅

  Result: Complete PDF of webpage with all styles and images
  ```

  ### Example 3: In n8n Workflow

  ```
  [HTTP Request] → [HTML to PDF] → [Email] / [Google Drive] / [Dropbox]
       ↓                ↓              ↓
    Get HTML      Convert to PDF   Send/Save
  ```

  ## Technical Details

  - **Rendering Engine**: Chromium (via html-pdf-node/Puppeteer)
  - **Output Format**: Binary PDF compatible with n8n
  - **Package Size**: ~300 MB (includes Chromium)
  - **Processing**: Server-side, private, no external API calls

  ## Requirements

  - **n8n**: Version 0.220.0 or higher
  - **Node.js**: Version 20.15 or higher
  - **Environment**: Self-hosted n8n only (not n8n Cloud)

  ## Use Cases

  - 📧 **Email Archiving** - Convert HTML emails to PDF
  - 🧾 **Invoice Generation** - HTML templates → PDF invoices
  - 📄 **Report Creation** - Web data → PDF reports
  - 📊 **Dashboard Snapshots** - Save dashboards as PDF
  - 📋 **Web Archiving** - Archive webpages as PDF documents
  - 🎨 **Marketing Materials** - Convert designs to PDF

  ## Troubleshooting

  ### Node Not Appearing

  1. **Restart n8n completely** (critical step)
  2. Clear browser cache
  3. Verify package name: `n8n-nodes-html-to-pdf`
  4. Check n8n logs for errors

  ### PDF Output Issues

  **Blank PDF**:
  - Enable **Print Background** option
  - Verify HTML content is valid
  - For URLs, check webpage is publicly accessible

  **Missing Fonts**:
  - Use web-safe fonts (Arial, Times, etc.)
  - Include font files in HTML
  - Or use web fonts (Google Fonts)

  **Missing Images**:
  - Use absolute URLs (not relative)
  - Or encode as base64 data URIs
  - Ensure images are publicly accessible

  ### Installation Issues

  **Module not found after install**:
  - **Solution**: Restart n8n (nodes load at startup)

  **Permission errors**:
  - Use `sudo npm install` if needed
  - Or fix npm permissions

  ## Development

  Built using the [n8n Custom Node Template](https://github.com/KenKaiDev/n8n-nodes-template)

  To build from source:

  ```bash
  git clone https://github.com/yourusername/n8n-nodes-html-to-pdf.git
  cd n8n-nodes-html-to-pdf
  npm install
  npm run build
  npm link
  ```

  Then link in n8n:

  ```bash
  cd ~/.n8n/custom
  npm link n8n-nodes-html-to-pdf
  ```

  ## Support

  - **Issues**: [GitHub Issues](https://github.com/yourusername/n8n-nodes-html-to-pdf/issues)
  - **Community**: [n8n Community Forum](https://community.n8n.io)
  - **Discussions**: [GitHub Discussions](https://github.com/yourusername/n8n-nodes-html-to-pdf/discussions)

  ## License

  MIT

  ## Changelog

  ### 0.1.0 (2025-01-15)

  - Initial release
  - HTML to PDF conversion
  - URL to PDF conversion
  - Configurable page formats (A4, Letter, Legal, A3)
  - Portrait/landscape orientation
  - Custom margins
  - CSS background rendering
  - Scale control
  - Chromium-based rendering for exact visual fidelity

ai_documentation_summary:
  {"purpose":"Converts HTML content or webpage URLs into PDF files with exact visual rendering inside n8n. It is designed to preserve styling, fonts, colors, images, and layout for professional-looking PDFs.","capabilities":["Convert HTML content to PDF","Convert webpage URLs to PDF","Preserve exact visual styling and layout","Select page formats such as A4, Letter, Legal, and A3","Set portrait or landscape orientation","Configure custom margins with units (px, mm, cm, in)","Enable or disable print backgrounds for CSS colors and images","Adjust rendering scale from 0.1x to 2.0x","Output PDF as binary file compatible with n8n"],"authentication":"None","commonUseCases":["Generate PDF invoices from HTML templates","Archive emails or webpages as PDFs","Create reports or document snapshots from web content","Save dashboard snapshots as PDF","Produce marketing or documentation PDFs"],"limitations":["Self-hosted n8n only; not supported on n8n Cloud","Requires restarting n8n after installation","Uses a large package size (~300 MB) because Chromium is included","For URL conversion, the webpage must be publicly accessible","Missing fonts or images may require web-safe fonts, absolute image URLs, or base64 data URIs"],"relatedNodes":["HTTP Request","Email","Google Drive","Dropbox"]}


node_type: n8n-nodes-imap.imap
package_name: n8n-nodes-imap
display_name: imap
description: This node allows you to connect to an IMAP server and retrieve emails.
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
updated_at: 2026-07-14 14:40:36
author_name: GitHub Actions
author_github_url: git+https://github.com/umanamente/n8n-nodes-imap.git
npm_package_name: n8n-nodes-imap
npm_version: 2.17.1
community_fetched_at: 2026-07-14T14:40:36.049Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # <img src="nodes/Imap/node-imap-icon.svg"  height="40"> <img src="https://gist.githubusercontent.com/umanamente/3aec0274e0d5f029ab76a16627825c67/raw/n8n-nodes-imap-coverage-badge.svg" align="right"> n8n-nodes-imap

  This is an n8n community node that adds support for [IMAP](https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol) email servers.

  * [Installation](#installation)  
  * [Operations](#operations)  
  * [Credentials](#credentials)
  * [Troubleshooting & Debug](#troubleshooting--debug)
  * [Version history](CHANGELOG.md)
  * **For Developers**: [Contributing Guide](CONTRIBUTING.md) | [Developer Quick Start](DEVELOPER.md)

  ## Installation

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

  Use `n8n-nodes-imap` in N8N settings to install the stable version.

  To install beta version, use `n8n-nodes-imap@beta`.

  NPMJS: [n8n-nodes-imap](https://www.npmjs.com/package/n8n-nodes-imap)


  ## Operations

  * Mailbox
    * Get list of mailboxes (including status information like number of messages)
    * Get status of a mailbox (number of messages, etc.)
    * Create a mailbox
    * Rename a mailbox
    * ~Delete a mailbox~ (disabled due to danger of accidental data loss and no apparent use case)
  * Email
    * Get list of emails in a mailbox (with configurable limit to prevent memory issues)
    * Download attachments from an email
    * Permanently delete an email from a mailbox
    * Move an email to another mailbox
    * Copy an email into another mailbox
    * Set/remove flags on an email ("seen", "answered", "flagged", "deleted", "draft")
    * Create email draft in a mailbox
      * Use `n8n-nodes-eml` node to create complex emails. It supports attachments and other features.

  ## Credentials

  Currently, this node supports only basic authentication (username and password).  
  OAuth2 authentication is not supported yet.  

  > NOTE: You can reuse core [N8N IMAP Trigger node](https://docs.n8n.io/integrations/builtin/credentials/imap/) credentials for this node.

  ## Troubleshooting & Debug

  If you encounter issues with the IMAP node, you can enable debug mode to get detailed logs and diagnostic information:

  ### Enable Debug Mode

  Set the following environment variable before starting n8n:

  ```bash
  N8N_NODES_DEBUG_ENABLED=true
  ```

  When debug mode is enabled:
  - The IMAP node will create an additional **"debug"** output containing detailed logs
  - Enhanced error messages and diagnostic information will be available
  - Connection and operation details will be logged for troubleshooting

  ### Getting Debug Information

  1. **Set environment variables**:
     ```bash
     N8N_LOG_LEVEL=debug
     N8N_NODES_DEBUG_ENABLED=true
     ```

  2. **Restart your n8n instance**

  3. **Execute your workflow** - the IMAP node will now provide debug output

  4. **Check the debug output** - connect the debug output to a Set node or similar to view the diagnostic information

  ### Reporting Issues

  When reporting bugs or issues:
  - Always enable debug mode first
  - Include the debug output in your issue report
  - Remove any sensitive information (passwords, email addresses, etc.) from logs
  - Use our [issue templates](.github/ISSUE_TEMPLATE/) for structured bug reports

ai_documentation_summary:
  {"purpose":"Connects n8n workflows to IMAP email servers to retrieve and manage mailboxes and emails. It supports mailbox operations, email listing, attachment downloads, message movement/copying, flag management, deletion, and draft creation.","capabilities":["List mailboxes with status information such as message counts","Get status of a specific mailbox","Create a mailbox","Rename a mailbox","List emails in a mailbox with a configurable limit","Download attachments from an email","Permanently delete an email from a mailbox","Move an email to another mailbox","Copy an email to another mailbox","Set or remove email flags including seen, answered, flagged, deleted, and draft"],"authentication":"Basic authentication with username and password. Existing core n8n IMAP Trigger credentials can be reused. OAuth2 is not supported.","commonUseCases":["Retrieve emails from an IMAP mailbox for processing in a workflow","Download email attachments for storage, parsing, or automation","Organize emails by moving or copying them between mailboxes","Mark emails as seen, answered, flagged, deleted, or draft","Create mailbox folders for email workflow organization"],"limitations":["OAuth2 authentication is not supported","Mailbox deletion is disabled to avoid accidental data loss","Complex email creation with attachments requires using the n8n-nodes-eml node"],"relatedNodes":["n8n IMAP Trigger","n8n-nodes-eml"]}


node_type: nodes-base.actionNetworkTool
package_name: n8n-nodes-base
display_name: Action Network Tool
description: Consume the Action Network API (AI Tool variant for use with AI Agents)
category: transform
development_style: programmatic
version: 1
credentials_required:
  [
  {
  "name": "actionNetworkApi",
  "required": true
  }
  ]

outputs:
  [
  {
  "type": "ai_tool",
  "displayName": "Tool"
  }
  ]

output_names:
  [
  "Tool"
  ]

updated_at: 2026-07-16 12:10:21
tool_variant_of: nodes-base.actionNetwork
documentation:
  ---
  #https://www.notion.so/n8n/Frontmatter-432c2b8dff1f43d4b1c8d20075510fe4
  title: Action Network node documentation
  description: Learn how to use the Action Network node in n8n. Follow technical documentation to integrate Action Network node into your workflows.
  contentType: [integration, reference]
  priority: medium
  ---

  # Action Network node

  Use the Action Network node to automate work in Action Network, and integrate Action Network with other applications. n8n has built-in support for a wide range of Action Network features, including creating, updating, and deleting events, people, tags, and signatures. 

  On this page, you'll find a list of operations the Action Network node supports, and links to more resources.

  /// note | Credentials
  Refer to [Action Network credentials](/integrations/builtin/credentials/actionnetwork.md) for guidance on setting up authentication. 
  ///

  --8<-- "_snippets/integrations/builtin/app-nodes/ai-tools.md"

  ## Operations

  * Attendance
      * Create
      * Get
      * Get All
  * Event
      * Create
      * Get
      * Get All
  * Person
      * Create
      * Get
      * Get All
      * Update
  * Person Tag
      * Add
      * Remove
  * Petition
      * Create
      * Get
      * Get All
      * Update
  * Signature
      * Create
      * Get
      * Get All
      * Update
  * Tag
      * Create
      * Get
      * Get All

  ## Templates and examples

  <!-- see https://www.notion.so/n8n/Pull-in-templates-for-the-integrations-pages-37c716837b804d30a33b47475f6e3780 -->
  [[ templatesWidget(page.title, 'action-network') ]]

  --8<-- "_snippets/integrations/builtin/app-nodes/operation-not-supported.md"

properties_schema:
  [
    {
      "displayName": "Tool Description",
      "name": "toolDescription",
      "type": "string",
      "default": "",
      "required": false,
      "description": "Description for the AI to understand what this tool does and when to use it",
      "typeOptions": {
        "rows": 3
      },
      "placeholder": "e.g., Use this tool to interact with Action Network"
    },
    {
      "displayName": "Resource",
      "name": "resource",
      "type": "options",
      "default": "attendance",
      "options": [
        {
          "name": "Attendance",
          "value": "attendance"
        },
        {
          "name": "Event",
          "value": "event"
        },
        {
          "name": "Person",
          "value": "person"
        },
        {
          "name": "Person Tag",
          "value": "personTag"
        },
        {
          "name": "Petition",
          "value": "petition"
        },
        {
          "name": "Signature",
          "value": "signature"
        },
        {
          "name": "Tag",
          "value": "tag"
        }
      ],
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an attendance"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an attendance"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many attendances"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to create an attendance for",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event to create an attendance for",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event whose attendance to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Attendance ID",
      "name": "attendanceId",
      "type": "string",
      "default": "",
      "description": "ID of the attendance to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event to create an attendance for",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an event"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an event"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many events"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Origin System",
      "name": "originSystem",
      "type": "string",
      "default": "",
      "description": "Source where the event originated",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Title",
      "name": "title",
      "type": "string",
      "default": "",
      "description": "Title of the event to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Browser URL",
          "name": "browser_url",
          "type": "string",
          "default": "",
          "description": "URL to this event’s page on the Action Network or a third party"
        },
        {
          "displayName": "Description",
          "name": "description",
          "type": "string",
          "default": "",
          "description": "Description of the event. HTML supported."
        },
        {
          "displayName": "End Date",
          "name": "end_date",
          "type": "dateTime",
          "default": "",
          "description": "End date and time of the event"
        },
        {
          "displayName": "Featured Image URL",
          "name": "featured_image_url",
          "type": "string",
          "default": "",
          "description": "URL to this event’s featured image on the Action Network"
        },
        {
          "displayName": "Instructions",
          "name": "instructions",
          "type": "string",
          "default": "",
          "description": "Event's instructions for activists, visible after they RSVP. HTML supported."
        },
        {
          "displayName": "Location",
          "name": "location",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Location Field",
          "typeOptions": {
            "multipleValues": false
          },
          "options": [
            {
              "displayName": "Postal Addresses Fields",
              "name": "postal_addresses_fields",
              "placeholder": "Add Postal Address Field",
              "values": [
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "boolean",
                  "default": false,
                  "description": "Whether this is the person's primary address"
                },
                {
                  "displayName": "Address Line",
                  "name": "address_lines",
                  "type": "string",
                  "default": "",
                  "description": "Line for a person's address"
                },
                {
                  "displayName": "Locality",
                  "name": "locality",
                  "type": "string",
                  "default": "",
                  "description": "City or other local administrative area. If blank, this will be filled in based on Action Network's geocoding."
                },
                {
                  "displayName": "Region",
                  "name": "region",
                  "type": "string",
                  "default": "",
                  "description": "State or subdivision code per ISO 3166-2"
                },
                {
                  "displayName": "Postal Code",
                  "name": "postal_code",
                  "type": "string",
                  "default": "",
                  "description": "Region specific postal code, such as ZIP code"
                },
                {
                  "displayName": "Country",
                  "name": "country",
                  "type": "string",
                  "default": "",
                  "description": "Country code according to ISO 3166-1 Alpha-2. Defaults to US."
                },
                {
                  "displayName": "Language",
                  "name": "language",
                  "type": "string",
                  "default": "",
                  "description": "Language in which the address is recorded, per ISO 639"
                },
                {
                  "displayName": "Location",
                  "name": "location",
                  "type": "fixedCollection",
                  "default": {},
                  "options": [
                    {
                      "displayName": "Location Fields",
                      "name": "location_fields",
                      "values": [
                        {
                          "displayName": "Latitude",
                          "name": "latitude",
                          "type": "string",
                          "default": "",
                          "description": "Latitude of the location of the address"
                        },
                        {
                          "displayName": "Longitude",
                          "name": "longitude",
                          "type": "string",
                          "default": "",
                          "description": "Longitude of the location of the address"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "Internal (not public) title of the event"
        },
        {
          "displayName": "Start Date",
          "name": "start_date",
          "type": "dateTime",
          "default": "",
          "description": "Start date and time of the event"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a person"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a person"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many people"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a person"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Email Address",
      "name": "email_addresses",
      "type": "fixedCollection",
      "default": {},
      "description": "Person’s email addresses",
      "options": [
        {
          "displayName": "Email Addresses Fields",
          "name": "email_addresses_fields",
          "values": [
            {
              "displayName": "Address",
              "name": "address",
              "type": "string",
              "default": "",
              "description": "Person's email address"
            },
            {
              "displayName": "Primary",
              "name": "primary",
              "type": "hidden",
              "default": true,
              "description": "Whether this is the person's primary email address"
            },
            {
              "displayName": "Status",
              "name": "status",
              "type": "options",
              "default": "subscribed",
              "description": "Subscription status of this email address",
              "options": [
                {
                  "name": "Bouncing",
                  "value": "bouncing"
                },
                {
                  "name": "Previous Bounce",
                  "value": "previous bounce"
                },
                {
                  "name": "Previous Spam Complaint",
                  "value": "previous spam complaint"
                },
                {
                  "name": "Spam Complaint",
                  "value": "spam complaint"
                },
                {
                  "name": "Subscribed",
                  "value": "subscribed"
                },
                {
                  "name": "Unsubscribed",
                  "value": "unsubscribed"
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Family Name",
          "name": "family_name",
          "type": "string",
          "default": "",
          "description": "Person’s last name"
        },
        {
          "displayName": "Given Name",
          "name": "given_name",
          "type": "string",
          "default": "",
          "description": "Person’s first name"
        },
        {
          "displayName": "Language Spoken",
          "name": "languages_spoken",
          "type": "options",
          "default": [],
          "description": "Language spoken by the person",
          "options": [
            {
              "name": "Danish",
              "value": "da"
            },
            {
              "name": "Dutch",
              "value": "nl"
            },
            {
              "name": "English",
              "value": "en"
            },
            {
              "name": "Finnish",
              "value": "fi"
            },
            {
              "name": "French",
              "value": "fr"
            },
            {
              "name": "German",
              "value": "de"
            },
            {
              "name": "Hungarian",
              "value": "hu"
            },
            {
              "name": "Indonesian",
              "value": "id"
            },
            {
              "name": "Japanese",
              "value": "ja"
            },
            {
              "name": "Portuguese - Portugal",
              "value": "pt"
            },
            {
              "name": "Portuguese - Brazil",
              "value": "br"
            },
            {
              "name": "Rumanian",
              "value": "ru"
            },
            {
              "name": "Spanish",
              "value": "es"
            },
            {
              "name": "Swedish",
              "value": "sv"
            },
            {
              "name": "Turkish",
              "value": "tr"
            },
            {
              "name": "Welsh",
              "value": "cy"
            }
          ]
        },
        {
          "displayName": "Phone Number",
          "name": "phone_numbers",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Phone Numbers Field",
          "options": [
            {
              "displayName": "Phone Numbers Fields",
              "name": "phone_numbers_fields",
              "placeholder": "Add Phone Number Field",
              "values": [
                {
                  "displayName": "Number",
                  "name": "number",
                  "type": "string",
                  "default": "",
                  "description": "Person's mobile number, in international format without the plus sign"
                },
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "hidden",
                  "default": true,
                  "description": "Whether this is the person's primary phone number"
                },
                {
                  "displayName": "Status",
                  "name": "status",
                  "type": "options",
                  "default": "subscribed",
                  "description": "Subscription status of this number",
                  "options": [
                    {
                      "name": "Bouncing",
                      "value": "bouncing"
                    },
                    {
                      "name": "Previous Bounce",
                      "value": "previous bounce"
                    },
                    {
                      "name": "Subscribed",
                      "value": "subscribed"
                    },
                    {
                      "name": "Unsubscribed",
                      "value": "unsubscribed"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "displayName": "Postal Addresses",
          "name": "postal_addresses",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Postal Addresses Field",
          "typeOptions": {
            "multipleValues": true
          },
          "options": [
            {
              "displayName": "Postal Addresses Fields",
              "name": "postal_addresses_fields",
              "placeholder": "Add Postal Address Field",
              "values": [
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "boolean",
                  "default": false,
                  "description": "Whether this is the person's primary address"
                },
                {
                  "displayName": "Address Line",
                  "name": "address_lines",
                  "type": "string",
                  "default": "",
                  "description": "Line for a person's address"
                },
                {
                  "displayName": "Locality",
                  "name": "locality",
                  "type": "string",
                  "default": "",
                  "description": "City or other local administrative area. If blank, this will be filled in based on Action Network's geocoding."
                },
                {
                  "displayName": "Region",
                  "name": "region",
                  "type": "string",
                  "default": "",
                  "description": "State or subdivision code per ISO 3166-2"
                },
                {
                  "displayName": "Postal Code",
                  "name": "postal_code",
                  "type": "string",
                  "default": "",
                  "description": "Region specific postal code, such as ZIP code"
                },
                {
                  "displayName": "Country",
                  "name": "country",
                  "type": "string",
                  "default": "",
                  "description": "Country code according to ISO 3166-1 Alpha-2. Defaults to US."
                },
                {
                  "displayName": "Language",
                  "name": "language",
                  "type": "string",
                  "default": "",
                  "description": "Language in which the address is recorded, per ISO 639"
                },
                {
                  "displayName": "Location",
                  "name": "location",
                  "type": "fixedCollection",
                  "default": {},
                  "options": [
                    {
                      "displayName": "Location Fields",
                      "name": "location_fields",
                      "values": [
                        {
                          "displayName": "Latitude",
                          "name": "latitude",
                          "type": "string",
                          "default": "",
                          "description": "Latitude of the location of the address"
                        },
                        {
                          "displayName": "Longitude",
                          "name": "longitude",
                          "type": "string",
                          "default": "",
                          "description": "Longitude of the location of the address"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 25,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 25
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Family Name",
          "name": "family_name",
          "type": "string",
          "default": "",
          "description": "Person’s last name"
        },
        {
          "displayName": "Given Name",
          "name": "given_name",
          "type": "string",
          "default": "",
          "description": "Person’s first name"
        },
        {
          "displayName": "Language Spoken",
          "name": "languages_spoken",
          "type": "options",
          "default": [],
          "description": "Language spoken by the person",
          "options": [
            {
              "name": "Danish",
              "value": "da"
            },
            {
              "name": "Dutch",
              "value": "nl"
            },
            {
              "name": "English",
              "value": "en"
            },
            {
              "name": "Finnish",
              "value": "fi"
            },
            {
              "name": "French",
              "value": "fr"
            },
            {
              "name": "German",
              "value": "de"
            },
            {
              "name": "Hungarian",
              "value": "hu"
            },
            {
              "name": "Indonesian",
              "value": "id"
            },
            {
              "name": "Japanese",
              "value": "ja"
            },
            {
              "name": "Portuguese - Portugal",
              "value": "pt"
            },
            {
              "name": "Portuguese - Brazil",
              "value": "br"
            },
            {
              "name": "Rumanian",
              "value": "ru"
            },
            {
              "name": "Spanish",
              "value": "es"
            },
            {
              "name": "Swedish",
              "value": "sv"
            },
            {
              "name": "Turkish",
              "value": "tr"
            },
            {
              "name": "Welsh",
              "value": "cy"
            }
          ]
        },
        {
          "displayName": "Phone Number",
          "name": "phone_numbers",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Phone Numbers Field",
          "options": [
            {
              "displayName": "Phone Numbers Fields",
              "name": "phone_numbers_fields",
              "placeholder": "Add Phone Number Field",
              "values": [
                {
                  "displayName": "Number",
                  "name": "number",
                  "type": "string",
                  "default": "",
                  "description": "Person's mobile number, in international format without the plus sign"
                },
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "hidden",
                  "default": true,
                  "description": "Whether this is the person's primary phone number"
                },
                {
                  "displayName": "Status",
                  "name": "status",
                  "type": "options",
                  "default": "subscribed",
                  "description": "Subscription status of this number",
                  "options": [
                    {
                      "name": "Bouncing",
                      "value": "bouncing"
                    },
                    {
                      "name": "Previous Bounce",
                      "value": "previous bounce"
                    },
                    {
                      "name": "Subscribed",
                      "value": "subscribed"
                    },
                    {
                      "name": "Unsubscribed",
                      "value": "unsubscribed"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "displayName": "Postal Addresses",
          "name": "postal_addresses",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Postal Addresses Field",
          "typeOptions": {
            "multipleValues": true
          },
          "options": [
            {
              "displayName": "Postal Addresses Fields",
              "name": "postal_addresses_fields",
              "placeholder": "Add Postal Address Field",
              "values": [
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "boolean",
                  "default": false,
                  "description": "Whether this is the person's primary address"
                },
                {
                  "displayName": "Address Line",
                  "name": "address_lines",
                  "type": "string",
                  "default": "",
                  "description": "Line for a person's address"
                },
                {
                  "displayName": "Locality",
                  "name": "locality",
                  "type": "string",
                  "default": "",
                  "description": "City or other local administrative area. If blank, this will be filled in based on Action Network's geocoding."
                },
                {
                  "displayName": "Region",
                  "name": "region",
                  "type": "string",
                  "default": "",
                  "description": "State or subdivision code per ISO 3166-2"
                },
                {
                  "displayName": "Postal Code",
                  "name": "postal_code",
                  "type": "string",
                  "default": "",
                  "description": "Region specific postal code, such as ZIP code"
                },
                {
                  "displayName": "Country",
                  "name": "country",
                  "type": "string",
                  "default": "",
                  "description": "Country code according to ISO 3166-1 Alpha-2. Defaults to US."
                },
                {
                  "displayName": "Language",
                  "name": "language",
                  "type": "string",
                  "default": "",
                  "description": "Language in which the address is recorded, per ISO 639"
                },
                {
                  "displayName": "Location",
                  "name": "location",
                  "type": "fixedCollection",
                  "default": {},
                  "options": [
                    {
                      "displayName": "Location Fields",
                      "name": "location_fields",
                      "values": [
                        {
                          "displayName": "Latitude",
                          "name": "latitude",
                          "type": "string",
                          "default": "",
                          "description": "Latitude of the location of the address"
                        },
                        {
                          "displayName": "Longitude",
                          "name": "longitude",
                          "type": "string",
                          "default": "",
                          "description": "Longitude of the location of the address"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a petition"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a petition"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many petitions"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Origin System",
      "name": "originSystem",
      "type": "string",
      "default": "",
      "description": "Source where the petition originated",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Title",
      "name": "title",
      "type": "string",
      "default": "",
      "description": "Title of the petition to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Browser URL",
          "name": "browser_url",
          "type": "string",
          "default": "",
          "description": "URL to this petition’s page on the Action Network or a third party"
        },
        {
          "displayName": "Featured Image URL",
          "name": "featured_image_url",
          "type": "string",
          "default": "",
          "description": "URL to this action’s featured image on the Action Network"
        },
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "Internal (not public) title of the petition"
        },
        {
          "displayName": "Petition Text",
          "name": "petition_text",
          "type": "string",
          "default": "",
          "description": "Text of the letter to the petition’s target"
        },
        {
          "displayName": "Targets",
          "name": "target",
          "type": "string",
          "default": "",
          "description": "Comma-separated names of targets for this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Browser URL",
          "name": "browser_url",
          "type": "string",
          "default": "",
          "description": "URL to this petition’s page on the Action Network or a third party"
        },
        {
          "displayName": "Featured Image URL",
          "name": "featured_image_url",
          "type": "string",
          "default": "",
          "description": "URL to this action’s featured image on the Action Network"
        },
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "Internal (not public) title of the petition"
        },
        {
          "displayName": "Petition Text",
          "name": "petition_text",
          "type": "string",
          "default": "",
          "description": "Text of the letter to the petition’s target"
        },
        {
          "displayName": "Targets",
          "name": "target",
          "type": "string",
          "default": "",
          "description": "Comma-separated names of targets for this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a signature"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a signature"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many signatures"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a signature"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition to sign",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person whose signature to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Comments",
          "name": "comments",
          "type": "string",
          "default": "",
          "description": "Comments to leave when signing this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition whose signature to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Signature ID",
      "name": "signatureId",
      "type": "string",
      "default": "",
      "description": "ID of the signature to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition whose signatures to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition whose signature to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Signature ID",
      "name": "signatureId",
      "type": "string",
      "default": "",
      "description": "ID of the signature to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Comments",
          "name": "comments",
          "type": "string",
          "default": "",
          "description": "Comments to leave when signing this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a tag"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a tag"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many tags"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Name",
      "name": "name",
      "type": "string",
      "default": "",
      "description": "Name of the tag to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Tag ID",
      "name": "tagId",
      "type": "string",
      "default": "",
      "description": "ID of the tag to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "action": "Add a person tag"
        },
        {
          "name": "Remove",
          "value": "remove",
          "action": "Remove a person tag"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Tag Name or ID",
      "name": "tagId",
      "type": "options",
      "default": [],
      "description": "ID of the tag to add. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "add"
          ]
        }
      },
      "typeOptions": {
        "loadOptionsMethod": "getTags"
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to add the tag to",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "add"
          ]
        }
      }
    },
    {
      "displayName": "Tag Name or ID",
      "name": "tagId",
      "type": "options",
      "default": [],
      "description": "ID of the tag whose tagging to delete. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "remove"
          ]
        }
      },
      "typeOptions": {
        "loadOptionsMethod": "getTags"
      }
    },
    {
      "displayName": "Tagging Name or ID",
      "name": "taggingId",
      "type": "options",
      "default": [],
      "description": "ID of the tagging to remove. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "remove"
          ]
        }
      },
      "typeOptions": {
        "loadOptionsDependsOn": [
          "tagId"
        ],
        "loadOptionsMethod": "getTaggings"
      }
    }
  ]

operations:
  [
    {
      "operation": "create",
      "name": "Create",
      "resource": "attendance"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "attendance"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "attendance"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "event"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "event"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "event"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "person"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "person"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "person"
    },
    {
      "operation": "update",
      "name": "Update",
      "resource": "person"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "petition"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "petition"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "petition"
    },
    {
      "operation": "update",
      "name": "Update",
      "resource": "petition"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "signature"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "signature"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "signature"
    },
    {
      "operation": "update",
      "name": "Update",
      "resource": "signature"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "tag"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "tag"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "tag"
    },
    {
      "operation": "add",
      "name": "Add",
      "resource": "personTag"
    },
    {
      "operation": "remove",
      "name": "Remove",
      "resource": "personTag"
    }
  ]


node_type: nodes-base.actionNetwork
package_name: n8n-nodes-base
display_name: Action Network
description: Consume the Action Network API
category: transform
development_style: programmatic
version: 1
credentials_required:
  [
  {
  "name": "actionNetworkApi",
  "required": true
  }
  ]

outputs:
  [
  "main"
  ]

updated_at: 2026-07-16 12:10:21
documentation:
  ---
  #https://www.notion.so/n8n/Frontmatter-432c2b8dff1f43d4b1c8d20075510fe4
  title: Action Network node documentation
  description: Learn how to use the Action Network node in n8n. Follow technical documentation to integrate Action Network node into your workflows.
  contentType: [integration, reference]
  priority: medium
  ---

  # Action Network node

  Use the Action Network node to automate work in Action Network, and integrate Action Network with other applications. n8n has built-in support for a wide range of Action Network features, including creating, updating, and deleting events, people, tags, and signatures. 

  On this page, you'll find a list of operations the Action Network node supports, and links to more resources.

  /// note | Credentials
  Refer to [Action Network credentials](/integrations/builtin/credentials/actionnetwork.md) for guidance on setting up authentication. 
  ///

  --8<-- "_snippets/integrations/builtin/app-nodes/ai-tools.md"

  ## Operations

  * Attendance
      * Create
      * Get
      * Get All
  * Event
      * Create
      * Get
      * Get All
  * Person
      * Create
      * Get
      * Get All
      * Update
  * Person Tag
      * Add
      * Remove
  * Petition
      * Create
      * Get
      * Get All
      * Update
  * Signature
      * Create
      * Get
      * Get All
      * Update
  * Tag
      * Create
      * Get
      * Get All

  ## Templates and examples

  <!-- see https://www.notion.so/n8n/Pull-in-templates-for-the-integrations-pages-37c716837b804d30a33b47475f6e3780 -->
  [[ templatesWidget(page.title, 'action-network') ]]

  --8<-- "_snippets/integrations/builtin/app-nodes/operation-not-supported.md"

properties_schema:
  [
    {
      "displayName": "Resource",
      "name": "resource",
      "type": "options",
      "default": "attendance",
      "options": [
        {
          "name": "Attendance",
          "value": "attendance"
        },
        {
          "name": "Event",
          "value": "event"
        },
        {
          "name": "Person",
          "value": "person"
        },
        {
          "name": "Person Tag",
          "value": "personTag"
        },
        {
          "name": "Petition",
          "value": "petition"
        },
        {
          "name": "Signature",
          "value": "signature"
        },
        {
          "name": "Tag",
          "value": "tag"
        }
      ],
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an attendance"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an attendance"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many attendances"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to create an attendance for",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event to create an attendance for",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event whose attendance to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Attendance ID",
      "name": "attendanceId",
      "type": "string",
      "default": "",
      "description": "ID of the attendance to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event to create an attendance for",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "attendance"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an event"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an event"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many events"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Origin System",
      "name": "originSystem",
      "type": "string",
      "default": "",
      "description": "Source where the event originated",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Title",
      "name": "title",
      "type": "string",
      "default": "",
      "description": "Title of the event to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Browser URL",
          "name": "browser_url",
          "type": "string",
          "default": "",
          "description": "URL to this event’s page on the Action Network or a third party"
        },
        {
          "displayName": "Description",
          "name": "description",
          "type": "string",
          "default": "",
          "description": "Description of the event. HTML supported."
        },
        {
          "displayName": "End Date",
          "name": "end_date",
          "type": "dateTime",
          "default": "",
          "description": "End date and time of the event"
        },
        {
          "displayName": "Featured Image URL",
          "name": "featured_image_url",
          "type": "string",
          "default": "",
          "description": "URL to this event’s featured image on the Action Network"
        },
        {
          "displayName": "Instructions",
          "name": "instructions",
          "type": "string",
          "default": "",
          "description": "Event's instructions for activists, visible after they RSVP. HTML supported."
        },
        {
          "displayName": "Location",
          "name": "location",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Location Field",
          "typeOptions": {
            "multipleValues": false
          },
          "options": [
            {
              "displayName": "Postal Addresses Fields",
              "name": "postal_addresses_fields",
              "placeholder": "Add Postal Address Field",
              "values": [
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "boolean",
                  "default": false,
                  "description": "Whether this is the person's primary address"
                },
                {
                  "displayName": "Address Line",
                  "name": "address_lines",
                  "type": "string",
                  "default": "",
                  "description": "Line for a person's address"
                },
                {
                  "displayName": "Locality",
                  "name": "locality",
                  "type": "string",
                  "default": "",
                  "description": "City or other local administrative area. If blank, this will be filled in based on Action Network's geocoding."
                },
                {
                  "displayName": "Region",
                  "name": "region",
                  "type": "string",
                  "default": "",
                  "description": "State or subdivision code per ISO 3166-2"
                },
                {
                  "displayName": "Postal Code",
                  "name": "postal_code",
                  "type": "string",
                  "default": "",
                  "description": "Region specific postal code, such as ZIP code"
                },
                {
                  "displayName": "Country",
                  "name": "country",
                  "type": "string",
                  "default": "",
                  "description": "Country code according to ISO 3166-1 Alpha-2. Defaults to US."
                },
                {
                  "displayName": "Language",
                  "name": "language",
                  "type": "string",
                  "default": "",
                  "description": "Language in which the address is recorded, per ISO 639"
                },
                {
                  "displayName": "Location",
                  "name": "location",
                  "type": "fixedCollection",
                  "default": {},
                  "options": [
                    {
                      "displayName": "Location Fields",
                      "name": "location_fields",
                      "values": [
                        {
                          "displayName": "Latitude",
                          "name": "latitude",
                          "type": "string",
                          "default": "",
                          "description": "Latitude of the location of the address"
                        },
                        {
                          "displayName": "Longitude",
                          "name": "longitude",
                          "type": "string",
                          "default": "",
                          "description": "Longitude of the location of the address"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "Internal (not public) title of the event"
        },
        {
          "displayName": "Start Date",
          "name": "start_date",
          "type": "dateTime",
          "default": "",
          "description": "Start date and time of the event"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Event ID",
      "name": "eventId",
      "type": "string",
      "default": "",
      "description": "ID of the event to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a person"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a person"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many people"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a person"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Email Address",
      "name": "email_addresses",
      "type": "fixedCollection",
      "default": {},
      "description": "Person’s email addresses",
      "options": [
        {
          "displayName": "Email Addresses Fields",
          "name": "email_addresses_fields",
          "values": [
            {
              "displayName": "Address",
              "name": "address",
              "type": "string",
              "default": "",
              "description": "Person's email address"
            },
            {
              "displayName": "Primary",
              "name": "primary",
              "type": "hidden",
              "default": true,
              "description": "Whether this is the person's primary email address"
            },
            {
              "displayName": "Status",
              "name": "status",
              "type": "options",
              "default": "subscribed",
              "description": "Subscription status of this email address",
              "options": [
                {
                  "name": "Bouncing",
                  "value": "bouncing"
                },
                {
                  "name": "Previous Bounce",
                  "value": "previous bounce"
                },
                {
                  "name": "Previous Spam Complaint",
                  "value": "previous spam complaint"
                },
                {
                  "name": "Spam Complaint",
                  "value": "spam complaint"
                },
                {
                  "name": "Subscribed",
                  "value": "subscribed"
                },
                {
                  "name": "Unsubscribed",
                  "value": "unsubscribed"
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Family Name",
          "name": "family_name",
          "type": "string",
          "default": "",
          "description": "Person’s last name"
        },
        {
          "displayName": "Given Name",
          "name": "given_name",
          "type": "string",
          "default": "",
          "description": "Person’s first name"
        },
        {
          "displayName": "Language Spoken",
          "name": "languages_spoken",
          "type": "options",
          "default": [],
          "description": "Language spoken by the person",
          "options": [
            {
              "name": "Danish",
              "value": "da"
            },
            {
              "name": "Dutch",
              "value": "nl"
            },
            {
              "name": "English",
              "value": "en"
            },
            {
              "name": "Finnish",
              "value": "fi"
            },
            {
              "name": "French",
              "value": "fr"
            },
            {
              "name": "German",
              "value": "de"
            },
            {
              "name": "Hungarian",
              "value": "hu"
            },
            {
              "name": "Indonesian",
              "value": "id"
            },
            {
              "name": "Japanese",
              "value": "ja"
            },
            {
              "name": "Portuguese - Portugal",
              "value": "pt"
            },
            {
              "name": "Portuguese - Brazil",
              "value": "br"
            },
            {
              "name": "Rumanian",
              "value": "ru"
            },
            {
              "name": "Spanish",
              "value": "es"
            },
            {
              "name": "Swedish",
              "value": "sv"
            },
            {
              "name": "Turkish",
              "value": "tr"
            },
            {
              "name": "Welsh",
              "value": "cy"
            }
          ]
        },
        {
          "displayName": "Phone Number",
          "name": "phone_numbers",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Phone Numbers Field",
          "options": [
            {
              "displayName": "Phone Numbers Fields",
              "name": "phone_numbers_fields",
              "placeholder": "Add Phone Number Field",
              "values": [
                {
                  "displayName": "Number",
                  "name": "number",
                  "type": "string",
                  "default": "",
                  "description": "Person's mobile number, in international format without the plus sign"
                },
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "hidden",
                  "default": true,
                  "description": "Whether this is the person's primary phone number"
                },
                {
                  "displayName": "Status",
                  "name": "status",
                  "type": "options",
                  "default": "subscribed",
                  "description": "Subscription status of this number",
                  "options": [
                    {
                      "name": "Bouncing",
                      "value": "bouncing"
                    },
                    {
                      "name": "Previous Bounce",
                      "value": "previous bounce"
                    },
                    {
                      "name": "Subscribed",
                      "value": "subscribed"
                    },
                    {
                      "name": "Unsubscribed",
                      "value": "unsubscribed"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "displayName": "Postal Addresses",
          "name": "postal_addresses",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Postal Addresses Field",
          "typeOptions": {
            "multipleValues": true
          },
          "options": [
            {
              "displayName": "Postal Addresses Fields",
              "name": "postal_addresses_fields",
              "placeholder": "Add Postal Address Field",
              "values": [
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "boolean",
                  "default": false,
                  "description": "Whether this is the person's primary address"
                },
                {
                  "displayName": "Address Line",
                  "name": "address_lines",
                  "type": "string",
                  "default": "",
                  "description": "Line for a person's address"
                },
                {
                  "displayName": "Locality",
                  "name": "locality",
                  "type": "string",
                  "default": "",
                  "description": "City or other local administrative area. If blank, this will be filled in based on Action Network's geocoding."
                },
                {
                  "displayName": "Region",
                  "name": "region",
                  "type": "string",
                  "default": "",
                  "description": "State or subdivision code per ISO 3166-2"
                },
                {
                  "displayName": "Postal Code",
                  "name": "postal_code",
                  "type": "string",
                  "default": "",
                  "description": "Region specific postal code, such as ZIP code"
                },
                {
                  "displayName": "Country",
                  "name": "country",
                  "type": "string",
                  "default": "",
                  "description": "Country code according to ISO 3166-1 Alpha-2. Defaults to US."
                },
                {
                  "displayName": "Language",
                  "name": "language",
                  "type": "string",
                  "default": "",
                  "description": "Language in which the address is recorded, per ISO 639"
                },
                {
                  "displayName": "Location",
                  "name": "location",
                  "type": "fixedCollection",
                  "default": {},
                  "options": [
                    {
                      "displayName": "Location Fields",
                      "name": "location_fields",
                      "values": [
                        {
                          "displayName": "Latitude",
                          "name": "latitude",
                          "type": "string",
                          "default": "",
                          "description": "Latitude of the location of the address"
                        },
                        {
                          "displayName": "Longitude",
                          "name": "longitude",
                          "type": "string",
                          "default": "",
                          "description": "Longitude of the location of the address"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 25,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 25
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Family Name",
          "name": "family_name",
          "type": "string",
          "default": "",
          "description": "Person’s last name"
        },
        {
          "displayName": "Given Name",
          "name": "given_name",
          "type": "string",
          "default": "",
          "description": "Person’s first name"
        },
        {
          "displayName": "Language Spoken",
          "name": "languages_spoken",
          "type": "options",
          "default": [],
          "description": "Language spoken by the person",
          "options": [
            {
              "name": "Danish",
              "value": "da"
            },
            {
              "name": "Dutch",
              "value": "nl"
            },
            {
              "name": "English",
              "value": "en"
            },
            {
              "name": "Finnish",
              "value": "fi"
            },
            {
              "name": "French",
              "value": "fr"
            },
            {
              "name": "German",
              "value": "de"
            },
            {
              "name": "Hungarian",
              "value": "hu"
            },
            {
              "name": "Indonesian",
              "value": "id"
            },
            {
              "name": "Japanese",
              "value": "ja"
            },
            {
              "name": "Portuguese - Portugal",
              "value": "pt"
            },
            {
              "name": "Portuguese - Brazil",
              "value": "br"
            },
            {
              "name": "Rumanian",
              "value": "ru"
            },
            {
              "name": "Spanish",
              "value": "es"
            },
            {
              "name": "Swedish",
              "value": "sv"
            },
            {
              "name": "Turkish",
              "value": "tr"
            },
            {
              "name": "Welsh",
              "value": "cy"
            }
          ]
        },
        {
          "displayName": "Phone Number",
          "name": "phone_numbers",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Phone Numbers Field",
          "options": [
            {
              "displayName": "Phone Numbers Fields",
              "name": "phone_numbers_fields",
              "placeholder": "Add Phone Number Field",
              "values": [
                {
                  "displayName": "Number",
                  "name": "number",
                  "type": "string",
                  "default": "",
                  "description": "Person's mobile number, in international format without the plus sign"
                },
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "hidden",
                  "default": true,
                  "description": "Whether this is the person's primary phone number"
                },
                {
                  "displayName": "Status",
                  "name": "status",
                  "type": "options",
                  "default": "subscribed",
                  "description": "Subscription status of this number",
                  "options": [
                    {
                      "name": "Bouncing",
                      "value": "bouncing"
                    },
                    {
                      "name": "Previous Bounce",
                      "value": "previous bounce"
                    },
                    {
                      "name": "Subscribed",
                      "value": "subscribed"
                    },
                    {
                      "name": "Unsubscribed",
                      "value": "unsubscribed"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "displayName": "Postal Addresses",
          "name": "postal_addresses",
          "type": "fixedCollection",
          "default": {},
          "placeholder": "Add Postal Addresses Field",
          "typeOptions": {
            "multipleValues": true
          },
          "options": [
            {
              "displayName": "Postal Addresses Fields",
              "name": "postal_addresses_fields",
              "placeholder": "Add Postal Address Field",
              "values": [
                {
                  "displayName": "Primary",
                  "name": "primary",
                  "type": "boolean",
                  "default": false,
                  "description": "Whether this is the person's primary address"
                },
                {
                  "displayName": "Address Line",
                  "name": "address_lines",
                  "type": "string",
                  "default": "",
                  "description": "Line for a person's address"
                },
                {
                  "displayName": "Locality",
                  "name": "locality",
                  "type": "string",
                  "default": "",
                  "description": "City or other local administrative area. If blank, this will be filled in based on Action Network's geocoding."
                },
                {
                  "displayName": "Region",
                  "name": "region",
                  "type": "string",
                  "default": "",
                  "description": "State or subdivision code per ISO 3166-2"
                },
                {
                  "displayName": "Postal Code",
                  "name": "postal_code",
                  "type": "string",
                  "default": "",
                  "description": "Region specific postal code, such as ZIP code"
                },
                {
                  "displayName": "Country",
                  "name": "country",
                  "type": "string",
                  "default": "",
                  "description": "Country code according to ISO 3166-1 Alpha-2. Defaults to US."
                },
                {
                  "displayName": "Language",
                  "name": "language",
                  "type": "string",
                  "default": "",
                  "description": "Language in which the address is recorded, per ISO 639"
                },
                {
                  "displayName": "Location",
                  "name": "location",
                  "type": "fixedCollection",
                  "default": {},
                  "options": [
                    {
                      "displayName": "Location Fields",
                      "name": "location_fields",
                      "values": [
                        {
                          "displayName": "Latitude",
                          "name": "latitude",
                          "type": "string",
                          "default": "",
                          "description": "Latitude of the location of the address"
                        },
                        {
                          "displayName": "Longitude",
                          "name": "longitude",
                          "type": "string",
                          "default": "",
                          "description": "Longitude of the location of the address"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a petition"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a petition"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many petitions"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Origin System",
      "name": "originSystem",
      "type": "string",
      "default": "",
      "description": "Source where the petition originated",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Title",
      "name": "title",
      "type": "string",
      "default": "",
      "description": "Title of the petition to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Browser URL",
          "name": "browser_url",
          "type": "string",
          "default": "",
          "description": "URL to this petition’s page on the Action Network or a third party"
        },
        {
          "displayName": "Featured Image URL",
          "name": "featured_image_url",
          "type": "string",
          "default": "",
          "description": "URL to this action’s featured image on the Action Network"
        },
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "Internal (not public) title of the petition"
        },
        {
          "displayName": "Petition Text",
          "name": "petition_text",
          "type": "string",
          "default": "",
          "description": "Text of the letter to the petition’s target"
        },
        {
          "displayName": "Targets",
          "name": "target",
          "type": "string",
          "default": "",
          "description": "Comma-separated names of targets for this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Browser URL",
          "name": "browser_url",
          "type": "string",
          "default": "",
          "description": "URL to this petition’s page on the Action Network or a third party"
        },
        {
          "displayName": "Featured Image URL",
          "name": "featured_image_url",
          "type": "string",
          "default": "",
          "description": "URL to this action’s featured image on the Action Network"
        },
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "Internal (not public) title of the petition"
        },
        {
          "displayName": "Petition Text",
          "name": "petition_text",
          "type": "string",
          "default": "",
          "description": "Text of the letter to the petition’s target"
        },
        {
          "displayName": "Targets",
          "name": "target",
          "type": "string",
          "default": "",
          "description": "Comma-separated names of targets for this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "petition"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a signature"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a signature"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many signatures"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a signature"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition to sign",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person whose signature to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Comments",
          "name": "comments",
          "type": "string",
          "default": "",
          "description": "Comments to leave when signing this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition whose signature to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Signature ID",
      "name": "signatureId",
      "type": "string",
      "default": "",
      "description": "ID of the signature to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition whose signatures to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Petition ID",
      "name": "petitionId",
      "type": "string",
      "default": "",
      "description": "ID of the petition whose signature to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Signature ID",
      "name": "signatureId",
      "type": "string",
      "default": "",
      "description": "ID of the signature to update",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Comments",
          "name": "comments",
          "type": "string",
          "default": "",
          "description": "Comments to leave when signing this petition"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "signature"
          ],
          "operation": [
            "update"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a tag"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a tag"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many tags"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Name",
      "name": "name",
      "type": "string",
      "default": "",
      "description": "Name of the tag to create",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "create"
          ]
        }
      }
    },
    {
      "displayName": "Tag ID",
      "name": "tagId",
      "type": "string",
      "default": "",
      "description": "ID of the tag to retrieve",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "get"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 50,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "getAll"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ],
          "operation": [
            "getAll"
          ]
        }
      }
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "action": "Add a person tag"
        },
        {
          "name": "Remove",
          "value": "remove",
          "action": "Remove a person tag"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Tag Name or ID",
      "name": "tagId",
      "type": "options",
      "default": [],
      "description": "ID of the tag to add. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "add"
          ]
        }
      },
      "typeOptions": {
        "loadOptionsMethod": "getTags"
      }
    },
    {
      "displayName": "Person ID",
      "name": "personId",
      "type": "string",
      "default": "",
      "description": "ID of the person to add the tag to",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "add"
          ]
        }
      }
    },
    {
      "displayName": "Tag Name or ID",
      "name": "tagId",
      "type": "options",
      "default": [],
      "description": "ID of the tag whose tagging to delete. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "remove"
          ]
        }
      },
      "typeOptions": {
        "loadOptionsMethod": "getTags"
      }
    },
    {
      "displayName": "Tagging Name or ID",
      "name": "taggingId",
      "type": "options",
      "default": [],
      "description": "ID of the tagging to remove. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "required": true,
      "displayOptions": {
        "show": {
          "resource": [
            "personTag"
          ],
          "operation": [
            "remove"
          ]
        }
      },
      "typeOptions": {
        "loadOptionsDependsOn": [
          "tagId"
        ],
        "loadOptionsMethod": "getTaggings"
      }
    }
  ]

operations:
  [
    {
      "operation": "create",
      "name": "Create",
      "resource": "attendance"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "attendance"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "attendance"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "event"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "event"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "event"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "person"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "person"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "person"
    },
    {
      "operation": "update",
      "name": "Update",
      "resource": "person"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "petition"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "petition"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "petition"
    },
    {
      "operation": "update",
      "name": "Update",
      "resource": "petition"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "signature"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "signature"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "signature"
    },
    {
      "operation": "update",
      "name": "Update",
      "resource": "signature"
    },
    {
      "operation": "create",
      "name": "Create",
      "resource": "tag"
    },
    {
      "operation": "get",
      "name": "Get",
      "resource": "tag"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "resource": "tag"
    },
    {
      "operation": "add",
      "name": "Add",
      "resource": "personTag"
    },
    {
      "operation": "remove",
      "name": "Remove",
      "resource": "personTag"
    }
  ]


node_type: nodes-base.activeCampaignTool
package_name: n8n-nodes-base
display_name: ActiveCampaign Tool
description: Create and edit data in ActiveCampaign (AI Tool variant for use with AI Agents)
category: transform
development_style: programmatic
version: 1
credentials_required:
  [
  {
  "name": "activeCampaignApi",
  "required": true
  }
  ]

outputs:
  [
  {
  "type": "ai_tool",
  "displayName": "Tool"
  }
  ]

output_names:
  [
  "Tool"
  ]

updated_at: 2026-07-16 12:10:21
tool_variant_of: nodes-base.activeCampaign
documentation:
  ---
  #https://www.notion.so/n8n/Frontmatter-432c2b8dff1f43d4b1c8d20075510fe4
  title: ActiveCampaign node documentation
  description: Learn how to use the ActiveCampaign node in n8n. Follow technical documentation to integrate ActiveCampaign node into your workflows.
  contentType: [integration, reference]
  priority: medium
  ---

  # ActiveCampaign node

  Use the ActiveCampaign node to automate work in ActiveCampaign, and integrate ActiveCampaign with other applications. n8n has built-in support for a wide range of ActiveCampaign features, including creating, getting, updating, and deleting accounts, contact, orders, e-commerce customers, connections, lists, tags, and deals.

  On this page, you'll find a list of operations the ActiveCampaign node supports and links to more resources.

  /// note | Credentials
  Refer to [ActiveCampaign credentials](/integrations/builtin/credentials/activecampaign.md) for guidance on setting up authentication. 
  ///

  --8<-- "_snippets/integrations/builtin/app-nodes/ai-tools.md"

  ## Operations

  * Account
      * Create an account
      * Delete an account
      * Get data of an account
      * Get data of all accounts
      * Update an account
  * Account Contact
      * Create an association
      * Delete an association
      * Update an association
  * Contact
      * Create a contact
      * Delete a contact
      * Get data of a contact
      * Get data of all contact
      * Update a contact
  * Contact List
      * Add contact to a list
      * Remove contact from a list
  * Contact Tag
      * Add a tag to a contact
      * Remove a tag from a contact
  * Connection
      * Create a connection
      * Delete a connection
      * Get data of a connection
      * Get data of all connections
      * Update a connection
  * Deal
      * Create a deal
      * Delete a deal
      * Get data of a deal
      * Get data of all deals
      * Update a deal
      * Create a deal note
      * Update a deal note
  * E-commerce Order
      * Create a order
      * Delete a order
      * Get data of a order
      * Get data of all orders
      * Update a order
  * E-Commerce Customer
      * Create a E-commerce Customer
      * Delete a E-commerce Customer
      * Get data of a E-commerce Customer
      * Get data of all E-commerce Customer
      * Update a E-commerce Customer
  * E-commerce Order Products
      * Get data of all order products
      * Get data of a ordered product
      * Get data of an order's products
  * List
      * Get all lists
  * Tag
      * Create a tag
      * Delete a tag
      * Get data of a tag
      * Get data of all tags
      * Update a tag

  ## Templates and examples

  <!-- see https://www.notion.so/n8n/Pull-in-templates-for-the-integrations-pages-37c716837b804d30a33b47475f6e3780 -->
  [[ templatesWidget(page.title, 'activecampaign') ]]

  --8<-- "_snippets/integrations/builtin/app-nodes/operation-not-supported.md"

properties_schema:
  [
    {
      "displayName": "Tool Description",
      "name": "toolDescription",
      "type": "string",
      "default": "",
      "required": false,
      "description": "Description for the AI to understand what this tool does and when to use it",
      "typeOptions": {
        "rows": 3
      },
      "placeholder": "e.g., Use this tool to interact with ActiveCampaign"
    },
    {
      "displayName": "Resource",
      "name": "resource",
      "type": "options",
      "default": "contact",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Account Contact",
          "value": "accountContact"
        },
        {
          "name": "Connection",
          "value": "connection"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Contact List",
          "value": "contactList"
        },
        {
          "name": "Contact Tag",
          "value": "contactTag"
        },
        {
          "name": "Deal",
          "value": "deal"
        },
        {
          "name": "E-Commerce Customer",
          "value": "ecommerceCustomer"
        },
        {
          "name": "E-Commerce Order",
          "value": "ecommerceOrder"
        },
        {
          "name": "E-Commerce Order Product",
          "value": "ecommerceOrderProducts"
        },
        {
          "name": "List",
          "value": "list"
        },
        {
          "name": "Tag",
          "value": "tag"
        }
      ],
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create an account",
          "action": "Create an account"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete an account",
          "action": "Delete an account"
        },
        {
          "name": "Get",
          "value": "get",
          "description": "Get data of an account",
          "action": "Get an account"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many accounts",
          "action": "Get many accounts"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update an account",
          "action": "Update an account"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create a contact",
          "action": "Create a contact"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete a contact",
          "action": "Delete a contact"
        },
        {
          "name": "Get",
          "value": "get",
          "description": "Get data of a contact",
          "action": "Get a contact"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many contacts",
          "action": "Get many contacts"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update a contact",
          "action": "Update a contact"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create an association",
          "action": "Create an account contact"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete an association",
          "action": "Delete an account contact"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update an association",
          "action": "Update an account contact"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "accountContact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "description": "Add contact to a list",
          "action": "Add a contact to a list"
        },
        {
          "name": "Remove",
          "value": "remove",
          "description": "Remove contact from a list",
          "action": "Remove a contact from a list"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "contactList"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "description": "Add a tag to a contact",
          "action": "Add a contact tag"
        },
        {
          "name": "Remove",
          "value": "remove",
          "description": "Remove a tag from a contact",
          "action": "Remove a contact tag"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "contactTag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get many lists",
          "action": "Get many lists"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "list"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create a tag",
          "action": "Create a tag"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete a tag",
          "action": "Delete a tag"
        },
        {
          "name": "Get",
          "value": "get",
          "description": "Get data of a tag",
          "action": "Get a tag"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many tags",
          "action": "Get many tags"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update a tag",
          "action": "Update a tag"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create a deal",
          "action": "Create a deal"
        },
        {
          "name": "Create Note",
          "value": "createNote",
          "description": "Create a deal note",
          "action": "Create a deal note"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete a deal",
          "action": "Delete a deal"
        },
        {
          "name": "Get",
          "value": "get",
          "description": "Get data of a deal",
          "action": "Get a deal"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many deals",
          "action": "Get many deals"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update a deal",
          "action": "Update a deal"
        },
        {
          "name": "Update Deal Note",
          "value": "updateNote",
          "description": "Update a deal note",
          "action": "Update a deal note"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "deal"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create a connection",
          "action": "Create a connection"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete a connection",
          "action": "Delete a connection"
        },
        {
          "name": "Get",
          "value": "get",
          "description": "Get data of a connection",
          "action": "Get a connection"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many connections",
          "action": "Get many connections"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update a connection",
          "action": "Update a connection"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "connection"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create a order",
          "action": "Create an e-commerce order"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete a order",
          "action": "Delete an e-commerce order"
        },
        {
          "name": "Get",
          "value": "get",
          "description": "Get data of a order",
          "action": "Get an e-commerce order"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many orders",
          "action": "Get many e-commerce orders"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update a order",
          "action": "Update an e-commerce order"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "ecommerceOrder"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "description": "Create a E-commerce Customer",
          "action": "Create an e-commerce customer"
        },
        {
          "name": "Delete",
          "value": "delete",
          "description": "Delete a E-commerce Customer",
          "action": "Delete an e-commerce customer"
        },
        {
          "name": "Get",
          "value": "get",
          "description": "Get data of a E-commerce Customer",
          "action": "Get an e-commerce customer"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many E-commerce Customers",
          "action": "Get many e-commerce customers"
        },
        {
          "name": "Update",
          "value": "update",
          "description": "Update a E-commerce Customer",
          "action": "Update an e-commerce customer"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "ecommerceCustomer"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Operation",
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "description": "Get data of many order products",
          "action": "Get many ecommerce orders"
        },
        {
          "name": "Get by Product ID",
          "value": "getByProductId",
          "description": "Get data of a ordered product",
          "action": "Get an e-commerce order product by product ID"
        },
        {
          "name": "Get by Order ID",
          "value": "getByOrderId",
          "description": "Get data of an order's products",
          "action": "Get an e-commerce order product by order ID"
        }
      ],
      "displayOptions": {
        "show": {
          "resource": [
            "ecommerceOrderProducts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "displayName": "Type",
      "name": "tagType",
      "type": "options",
      "default": "contact",
      "description": "Tag-type of the new tag",
      "options": [
        {
          "name": "Contact",
          "value": "contact",
          "description": "Tag contact"
        },
        {
          "name": "Template",
          "value": "template",
          "description": "Tag template"
        }
      ],
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Name",
      "name": "name",
      "type": "string",
      "default": "",
      "description": "Name of the new tag",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Description",
          "name": "description",
          "type": "string",
          "default": "",
          "description": "Description of the new tag"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Tag ID",
      "name": "tagId",
      "type": "number",
      "default": 0,
      "description": "ID of the tag to update",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "description": "The fields to update",
      "options": [
        {
          "displayName": "Tag",
          "name": "tag",
          "type": "string",
          "default": "",
          "description": "Name of the contact"
        },
        {
          "displayName": "Description",
          "name": "description",
          "type": "string",
          "default": "",
          "description": "Description of the tag being updated"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Tag ID",
      "name": "tagId",
      "type": "number",
      "default": 0,
      "description": "ID of the tag to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Tag ID",
      "name": "tagId",
      "type": "number",
      "default": 0,
      "description": "ID of the tag to get",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "get"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "tag"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "tag"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "list"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "list"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "list"
          ]
        }
      }
    },
    {
      "displayName": "Tag Name or ID",
      "name": "tagId",
      "type": "options",
      "default": "",
      "description": "Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "add"
          ],
          "resource": [
            "contactTag"
          ]
        }
      },
      "typeOptions": {
        "loadOptionsMethod": "getTags"
      }
    },
    {
      "displayName": "Contact ID",
      "name": "contactId",
      "type": "number",
      "default": "",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "add"
          ],
          "resource": [
            "contactTag"
          ]
        }
      }
    },
    {
      "displayName": "Contact Tag ID",
      "name": "contactTagId",
      "type": "number",
      "default": 0,
      "description": "ID of the contact tag to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "remove"
          ],
          "resource": [
            "contactTag"
          ]
        }
      }
    },
    {
      "displayName": "List ID",
      "name": "listId",
      "type": "number",
      "default": "",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "add"
          ],
          "resource": [
            "contactList"
          ]
        }
      }
    },
    {
      "displayName": "Contact ID",
      "name": "contactId",
      "type": "number",
      "default": "",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "add"
          ],
          "resource": [
            "contactList"
          ]
        }
      }
    },
    {
      "displayName": "List ID",
      "name": "listId",
      "type": "number",
      "default": "",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "remove"
          ],
          "resource": [
            "contactList"
          ]
        }
      }
    },
    {
      "displayName": "Contact ID",
      "name": "contactId",
      "type": "number",
      "default": "",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "remove"
          ],
          "resource": [
            "contactList"
          ]
        }
      }
    },
    {
      "displayName": "Name",
      "name": "name",
      "type": "string",
      "default": "",
      "description": "Account's name",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Account URL",
          "name": "accountUrl",
          "type": "string",
          "default": "",
          "description": "Account's website"
        },
        {
          "displayName": "Fields",
          "name": "fields",
          "placeholder": "Add Custom Fields",
          "description": "Adds a custom fields to set also values which have not been predefined",
          "type": "fixedCollection",
          "typeOptions": {
            "multipleValues": true
          },
          "default": {},
          "options": [
            {
              "name": "property",
              "displayName": "Field",
              "values": [
                {
                  "displayName": "Field Name or ID",
                  "name": "customFieldId",
                  "type": "options",
                  "typeOptions": {
                    "loadOptionsMethod": "getAccountCustomFields"
                  },
                  "default": "",
                  "description": "ID of the field to set. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>."
                },
                {
                  "displayName": "Field Value",
                  "name": "fieldValue",
                  "type": "string",
                  "default": "",
                  "description": "Value of the field to set"
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Account ID",
      "name": "accountId",
      "type": "number",
      "default": 0,
      "description": "ID of the account to update",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "description": "The fields to update",
      "options": [
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "Account's name"
        },
        {
          "displayName": "Account URL",
          "name": "accountUrl",
          "type": "string",
          "default": "",
          "description": "Account's website"
        },
        {
          "displayName": "Fields",
          "name": "fields",
          "placeholder": "Add Fields",
          "description": "Adds a custom fields to set also values which have not been predefined",
          "type": "fixedCollection",
          "typeOptions": {
            "multipleValues": true
          },
          "default": {},
          "options": [
            {
              "name": "property",
              "displayName": "Field",
              "values": [
                {
                  "displayName": "Field Name or ID",
                  "name": "customFieldId",
                  "type": "options",
                  "typeOptions": {
                    "loadOptionsMethod": "getAccountCustomFields"
                  },
                  "default": "",
                  "description": "ID of the field to set. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>."
                },
                {
                  "displayName": "Field Value",
                  "name": "fieldValue",
                  "type": "string",
                  "default": "",
                  "description": "Value of the field to set"
                }
              ]
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Account ID",
      "name": "accountId",
      "type": "number",
      "default": 0,
      "description": "ID of the account to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Account ID",
      "name": "accountId",
      "type": "number",
      "default": 0,
      "description": "ID of the account to get",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "get"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "account"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Filters",
      "name": "filters",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Search",
          "name": "search",
          "type": "string",
          "default": "",
          "description": "Search by name"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "account"
          ]
        }
      }
    },
    {
      "displayName": "Account ID",
      "name": "account",
      "type": "number",
      "default": "",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "accountContact"
          ]
        }
      }
    },
    {
      "displayName": "Contact ID",
      "name": "contact",
      "type": "number",
      "default": "",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "accountContact"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Job Title",
          "name": "jobTitle",
          "type": "string",
          "default": "",
          "description": "Job Title of the contact at the account"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "accountContact"
          ]
        }
      }
    },
    {
      "displayName": "Account Contact ID",
      "name": "accountContactId",
      "type": "number",
      "default": 0,
      "description": "ID of the account contact to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "accountContact"
          ]
        }
      }
    },
    {
      "displayName": "Account Contact ID",
      "name": "accountContactId",
      "type": "number",
      "default": "",
      "description": "Account ID",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "accountContact"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "description": "The fields to update",
      "options": [
        {
          "displayName": "Job Title",
          "name": "jobTitle",
          "type": "string",
          "default": "",
          "description": "Job Title of the contact at the account"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "accountContact"
          ]
        }
      }
    },
    {
      "displayName": "Email",
      "name": "email",
      "type": "string",
      "default": "",
      "description": "The email of the contact to create",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Update if Exists",
      "name": "updateIfExists",
      "type": "boolean",
      "default": false,
      "description": "Whether to update user if it exists already. If not set and user exists it will error instead.",
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Custom Fields",
          "name": "fieldValues",
          "placeholder": "Add Custom Fields",
          "description": "Adds a custom fields to set also values which have not been predefined",
          "type": "fixedCollection",
          "typeOptions": {
            "multipleValues": true
          },
          "default": {},
          "options": [
            {
              "name": "property",
              "displayName": "Custom Field",
              "values": [
                {
                  "displayName": "Field Name or ID",
                  "name": "field",
                  "type": "options",
                  "typeOptions": {
                    "loadOptionsMethod": "getContactCustomFields"
                  },
                  "default": "",
                  "description": "ID of the field to set. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>."
                },
                {
                  "displayName": "Field Value",
                  "name": "value",
                  "type": "string",
                  "default": "",
                  "description": "Value of the field to set"
                }
              ]
            }
          ]
        },
        {
          "displayName": "First Name",
          "name": "firstName",
          "type": "string",
          "default": "",
          "description": "The first name of the contact to create"
        },
        {
          "displayName": "Last Name",
          "name": "lastName",
          "type": "string",
          "default": "",
          "description": "The last name of the contact to create"
        },
        {
          "displayName": "Phone",
          "name": "phone",
          "type": "string",
          "default": "",
          "description": "Phone number of the contact"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Contact ID",
      "name": "contactId",
      "type": "number",
      "default": 0,
      "description": "ID of the contact to update",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "description": "The fields to update",
      "options": [
        {
          "displayName": "Custom Fields",
          "name": "fieldValues",
          "placeholder": "Add Custom Fields",
          "description": "Adds a custom fields to set also values which have not been predefined",
          "type": "fixedCollection",
          "typeOptions": {
            "multipleValues": true
          },
          "default": {},
          "options": [
            {
              "name": "property",
              "displayName": "Custom Field",
              "values": [
                {
                  "displayName": "Field Name or ID",
                  "name": "field",
                  "type": "options",
                  "typeOptions": {
                    "loadOptionsMethod": "getContactCustomFields"
                  },
                  "default": "",
                  "description": "ID of the field to set. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>."
                },
                {
                  "displayName": "Field Value",
                  "name": "value",
                  "type": "string",
                  "default": "",
                  "description": "Value of the field to set"
                }
              ]
            }
          ]
        },
        {
          "displayName": "Email",
          "name": "email",
          "type": "string",
          "placeholder": "name@email.com",
          "default": "",
          "description": "Email of the contact"
        },
        {
          "displayName": "First Name",
          "name": "firstName",
          "type": "string",
          "default": "",
          "description": "First name of the contact"
        },
        {
          "displayName": "Last Name",
          "name": "lastName",
          "type": "string",
          "default": "",
          "description": "Last name of the contact"
        },
        {
          "displayName": "Phone",
          "name": "phone",
          "type": "string",
          "default": "",
          "description": "Phone number of the contact"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Contact ID",
      "name": "contactId",
      "type": "number",
      "default": 0,
      "description": "ID of the contact to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Contact ID",
      "name": "contactId",
      "type": "number",
      "default": 0,
      "description": "ID of the contact to get",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "get"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "contact"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Datetime",
          "name": "datetime",
          "type": "dateTime",
          "default": "",
          "description": "Contacts created on the specified date"
        },
        {
          "displayName": "Email",
          "name": "email",
          "type": "string",
          "placeholder": "name@email.com",
          "default": "",
          "description": "Email address of the contact you want to get"
        },
        {
          "displayName": "Email Like",
          "name": "email_like",
          "type": "string",
          "default": "",
          "description": "Filter contacts that contain the given value in the email address"
        },
        {
          "displayName": "Exclude",
          "name": "exclude",
          "type": "string",
          "default": "",
          "description": "Exclude from the response the contact with the given ID"
        },
        {
          "displayName": "Form ID",
          "name": "formid",
          "type": "string",
          "default": "",
          "description": "Filter contacts associated with the given form"
        },
        {
          "displayName": "List ID",
          "name": "listid",
          "type": "string",
          "default": "",
          "description": "Filter contacts associated with the given list"
        },
        {
          "displayName": "Search",
          "name": "search",
          "type": "string",
          "default": "",
          "description": "Filter contacts that match the given value in the contact names, organization, phone or email"
        },
        {
          "displayName": "Segment ID",
          "name": "segmentid",
          "type": "string",
          "default": "",
          "description": "Return only contacts that match a list segment"
        },
        {
          "displayName": "Series ID",
          "name": "seriesid",
          "type": "string",
          "default": "",
          "description": "Filter contacts associated with the given automation"
        },
        {
          "displayName": "Status",
          "name": "status",
          "type": "options",
          "options": [
            {
              "name": "Active",
              "value": 1
            },
            {
              "name": "Any",
              "value": -1
            },
            {
              "name": "Bounced",
              "value": 3
            },
            {
              "name": "Unconfirmed",
              "value": 0
            },
            {
              "name": "Unsubscribed",
              "value": 2
            }
          ],
          "default": ""
        },
        {
          "displayName": "Tag ID",
          "name": "tagid",
          "type": "string",
          "default": "",
          "description": "Filter contacts associated with the given tag"
        },
        {
          "displayName": "Created Before",
          "name": "filters[created_before]",
          "type": "dateTime",
          "default": "",
          "description": "Filter contacts that were created prior to this date"
        },
        {
          "displayName": "Created After",
          "name": "filters[created_after]",
          "type": "dateTime",
          "default": "",
          "description": "Filter contacts that were created after this date"
        },
        {
          "displayName": "Updated Before",
          "name": "filters[updated_before]",
          "type": "dateTime",
          "default": "",
          "description": "Filter contacts that were updated before this date"
        },
        {
          "displayName": "Updated After",
          "name": "filters[updated_after]",
          "type": "dateTime",
          "default": "",
          "description": "Filter contacts that were updated after this date"
        },
        {
          "displayName": "Wait ID",
          "name": "waitid",
          "type": "string",
          "default": "",
          "description": "Filter by contacts in the wait queue of an automation block"
        },
        {
          "displayName": "Order By",
          "name": "orderBy",
          "type": "options",
          "options": [
            {
              "name": "Creation Date",
              "value": "orders[cdate]",
              "description": "Order contacts by creation date"
            },
            {
              "name": "Email",
              "value": "orders[email]",
              "description": "Order contacts by email"
            },
            {
              "name": "First Name",
              "value": "orders[first_name]",
              "description": "Order contacts by first name"
            },
            {
              "name": "Last Name",
              "value": "orders[last_name]",
              "description": "Order contacts by last name"
            },
            {
              "name": "Name",
              "value": "orders[name]",
              "description": "Order contacts by full name"
            },
            {
              "name": "Score",
              "value": "orders[score]",
              "description": "Order contacts by score"
            }
          ],
          "default": ""
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "contact"
          ]
        }
      }
    },
    {
      "displayName": "Title",
      "name": "title",
      "type": "string",
      "default": "",
      "description": "The title of the deal",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal's Contact ID",
      "name": "contact",
      "type": "number",
      "default": 0,
      "description": "The ID of the deal's contact",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal Value",
      "name": "value",
      "type": "number",
      "default": 0,
      "description": "The value of the deal in cents",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Currency",
      "name": "currency",
      "type": "options",
      "default": "eur",
      "description": "The currency of the deal in 3-character ISO format",
      "options": [
        {
          "name": "Euro",
          "value": "eur"
        },
        {
          "name": "United States Dollar",
          "value": "usd"
        },
        {
          "name": "British Pound Sterling",
          "value": "gbp"
        },
        {
          "name": "Swiss Franc",
          "value": "chf"
        },
        {
          "name": "Renminbi",
          "value": "cny"
        },
        {
          "name": "--------",
          "value": ""
        },
        {
          "name": "United Arab Emirates Dirham",
          "value": "aed"
        },
        {
          "name": "Afghan Afghani",
          "value": "afn"
        },
        {
          "name": "Albanian Lek",
          "value": "all"
        },
        {
          "name": "Armenian Dram",
          "value": "amd"
        },
        {
          "name": "Netherlands Antillean Guilder",
          "value": "ang"
        },
        {
          "name": "Angolan Kwanza",
          "value": "aoa"
        },
        {
          "name": "Argentine Peso",
          "value": "ars"
        },
        {
          "name": "Australian Dollar",
          "value": "aud"
        },
        {
          "name": "Aruban Florin",
          "value": "awg"
        },
        {
          "name": "Azerbaijani Manat",
          "value": "azn"
        },
        {
          "name": "Bosnia-Herzegovina Convertible Mark",
          "value": "bam"
        },
        {
          "name": "Barbadian Dollar",
          "value": "bbd"
        },
        {
          "name": "Bangladeshi Taka",
          "value": "bdt"
        },
        {
          "name": "Bulgarian Lev",
          "value": "bgn"
        },
        {
          "name": "Bahraini Dinar",
          "value": "bhd"
        },
        {
          "name": "Burundian Franc",
          "value": "bif"
        },
        {
          "name": "Bermudan Dollar",
          "value": "bmd"
        },
        {
          "name": "Brunei Dollar",
          "value": "bnd"
        },
        {
          "name": "Bolivian Boliviano",
          "value": "bob"
        },
        {
          "name": "Brazilian Real",
          "value": "brl"
        },
        {
          "name": "Bahamian Dollar",
          "value": "bsd"
        },
        {
          "name": "Bitcoin",
          "value": "btc"
        },
        {
          "name": "Bhutanese Ngultrum",
          "value": "btn"
        },
        {
          "name": "Botswanan Pula",
          "value": "bwp"
        },
        {
          "name": "Belarusian Ruble",
          "value": "byn"
        },
        {
          "name": "Belize Dollar",
          "value": "bzd"
        },
        {
          "name": "Canadian Dollar",
          "value": "cad"
        },
        {
          "name": "Congolese Franc",
          "value": "cdf"
        },
        {
          "name": "Chilean Unit of Account (UF)",
          "value": "clf"
        },
        {
          "name": "Chilean Peso",
          "value": "clp"
        },
        {
          "name": "Chinese Yuan (Offshore)",
          "value": "cnh"
        },
        {
          "name": "Colombian Peso",
          "value": "cop"
        },
        {
          "name": "Costa Rican Colón",
          "value": "crc"
        },
        {
          "name": "Cuban Convertible Peso",
          "value": "cuc"
        },
        {
          "name": "Cuban Peso",
          "value": "cup"
        },
        {
          "name": "Cape Verdean Escudo",
          "value": "cve"
        },
        {
          "name": "Czech Republic Koruna",
          "value": "czk"
        },
        {
          "name": "Djiboutian Franc",
          "value": "djf"
        },
        {
          "name": "Danish Krone",
          "value": "dkk"
        },
        {
          "name": "Dominican Peso",
          "value": "dop"
        },
        {
          "name": "Algerian Dinar",
          "value": "dzd"
        },
        {
          "name": "Egyptian Pound",
          "value": "egp"
        },
        {
          "name": "Eritrean Nakfa",
          "value": "ern"
        },
        {
          "name": "Ethiopian Birr",
          "value": "etb"
        },
        {
          "name": "Fijian Dollar",
          "value": "fjd"
        },
        {
          "name": "Falkland Islands Pound",
          "value": "fkp"
        },
        {
          "name": "Georgian Lari",
          "value": "gel"
        },
        {
          "name": "Guernsey Pound",
          "value": "ggp"
        },
        {
          "name": "Ghanaian Cedi",
          "value": "ghs"
        },
        {
          "name": "Gibraltar Pound",
          "value": "gip"
        },
        {
          "name": "Gambian Dalasi",
          "value": "gmd"
        },
        {
          "name": "Guinean Franc",
          "value": "gnf"
        },
        {
          "name": "Guatemalan Quetzal",
          "value": "gtq"
        },
        {
          "name": "Guyanaese Dollar",
          "value": "gyd"
        },
        {
          "name": "Hong Kong Dollar",
          "value": "hkd"
        },
        {
          "name": "Honduran Lempira",
          "value": "hnl"
        },
        {
          "name": "Croatian Kuna",
          "value": "hrk"
        },
        {
          "name": "Haitian Gourde",
          "value": "htg"
        },
        {
          "name": "Hungarian Forint",
          "value": "huf"
        },
        {
          "name": "Indonesian Rupiah",
          "value": "idr"
        },
        {
          "name": "Israeli New Sheqel",
          "value": "ils"
        },
        {
          "name": "Manx Pound",
          "value": "imp"
        },
        {
          "name": "Indian Rupee",
          "value": "inr"
        },
        {
          "name": "Iraqi Dinar",
          "value": "iqd"
        },
        {
          "name": "Iranian Rial",
          "value": "irr"
        },
        {
          "name": "Icelandic Króna",
          "value": "isk"
        },
        {
          "name": "Jersey Pound",
          "value": "jep"
        },
        {
          "name": "Jamaican Dollar",
          "value": "jmd"
        },
        {
          "name": "Jordanian Dinar",
          "value": "jod"
        },
        {
          "name": "Japanese Yen",
          "value": "jpy"
        },
        {
          "name": "Kenyan Shilling",
          "value": "kes"
        },
        {
          "name": "Kyrgystani Som",
          "value": "kgs"
        },
        {
          "name": "Cambodian Riel",
          "value": "khr"
        },
        {
          "name": "Comorian Franc",
          "value": "kmf"
        },
        {
          "name": "North Korean Won",
          "value": "kpw"
        },
        {
          "name": "South Korean Won",
          "value": "krw"
        },
        {
          "name": "Kuwaiti Dinar",
          "value": "kwd"
        },
        {
          "name": "Cayman Islands Dollar",
          "value": "kyd"
        },
        {
          "name": "Kazakhstani Tenge",
          "value": "kzt"
        },
        {
          "name": "Laotian Kip",
          "value": "lak"
        },
        {
          "name": "Lebanese Pound",
          "value": "lbp"
        },
        {
          "name": "Sri Lankan Rupee",
          "value": "lkr"
        },
        {
          "name": "Liberian Dollar",
          "value": "lrd"
        },
        {
          "name": "Lesotho Loti",
          "value": "lsl"
        },
        {
          "name": "Libyan Dinar",
          "value": "lyd"
        },
        {
          "name": "Moroccan Dirham",
          "value": "mad"
        },
        {
          "name": "Moldovan Leu",
          "value": "mdl"
        },
        {
          "name": "Malagasy Ariary",
          "value": "mga"
        },
        {
          "name": "Macedonian Denar",
          "value": "mkd"
        },
        {
          "name": "Myanma Kyat",
          "value": "mmk"
        },
        {
          "name": "Mongolian Tugrik",
          "value": "mnt"
        },
        {
          "name": "Macanese Pataca",
          "value": "mop"
        },
        {
          "name": "Mauritanian Ouguiya (Pre-2018)",
          "value": "mro"
        },
        {
          "name": "Mauritanian Ouguiya",
          "value": "mru"
        },
        {
          "name": "Mauritian Rupee",
          "value": "mur"
        },
        {
          "name": "Maldivian Rufiyaa",
          "value": "mvr"
        },
        {
          "name": "Malawian Kwacha",
          "value": "mwk"
        },
        {
          "name": "Mexican Peso",
          "value": "mxn"
        },
        {
          "name": "Malaysian Ringgit",
          "value": "myr"
        },
        {
          "name": "Mozambican Metical",
          "value": "mzn"
        },
        {
          "name": "Namibian Dollar",
          "value": "nad"
        },
        {
          "name": "Nigerian Naira",
          "value": "ngn"
        },
        {
          "name": "Nicaraguan Córdoba",
          "value": "nio"
        },
        {
          "name": "Norwegian Krone",
          "value": "nok"
        },
        {
          "name": "Nepalese Rupee",
          "value": "npr"
        },
        {
          "name": "New Zealand Dollar",
          "value": "nzd"
        },
        {
          "name": "Omani Rial",
          "value": "omr"
        },
        {
          "name": "Panamanian Balboa",
          "value": "pab"
        },
        {
          "name": "Peruvian Nuevo Sol",
          "value": "pen"
        },
        {
          "name": "Papua New Guinean Kina",
          "value": "pgk"
        },
        {
          "name": "Philippine Peso",
          "value": "php"
        },
        {
          "name": "Pakistani Rupee",
          "value": "pkr"
        },
        {
          "name": "Polish Zloty",
          "value": "pln"
        },
        {
          "name": "Paraguayan Guarani",
          "value": "pyg"
        },
        {
          "name": "Qatari Rial",
          "value": "qar"
        },
        {
          "name": "Romanian Leu",
          "value": "ron"
        },
        {
          "name": "Serbian Dinar",
          "value": "rsd"
        },
        {
          "name": "Russian Ruble",
          "value": "rub"
        },
        {
          "name": "Rwandan Franc",
          "value": "rwf"
        },
        {
          "name": "Saudi Riyal",
          "value": "sar"
        },
        {
          "name": "Solomon Islands Dollar",
          "value": "sbd"
        },
        {
          "name": "Seychellois Rupee",
          "value": "scr"
        },
        {
          "name": "Sudanese Pound",
          "value": "sdg"
        },
        {
          "name": "Swedish Krona",
          "value": "sek"
        },
        {
          "name": "Singapore Dollar",
          "value": "sgd"
        },
        {
          "name": "Saint Helena Pound",
          "value": "shp"
        },
        {
          "name": "Sierra Leonean Leone",
          "value": "sll"
        },
        {
          "name": "Somali Shilling",
          "value": "sos"
        },
        {
          "name": "Surinamese Dollar",
          "value": "srd"
        },
        {
          "name": "South Sudanese Pound",
          "value": "ssp"
        },
        {
          "name": "São Tomé and Príncipe Dobra (Pre-2018)",
          "value": "std"
        },
        {
          "name": "São Tomé and Príncipe Dobra",
          "value": "stn"
        },
        {
          "name": "Salvadoran Colón",
          "value": "svc"
        },
        {
          "name": "Syrian Pound",
          "value": "syp"
        },
        {
          "name": "Swazi Lilangeni",
          "value": "szl"
        },
        {
          "name": "Thai Baht",
          "value": "thb"
        },
        {
          "name": "Tajikistani Somoni",
          "value": "tjs"
        },
        {
          "name": "Turkmenistani Manat",
          "value": "tmt"
        },
        {
          "name": "Tunisian Dinar",
          "value": "tnd"
        },
        {
          "name": "Tongan Pa'anga",
          "value": "top"
        },
        {
          "name": "Turkish Lira",
          "value": "try"
        },
        {
          "name": "Trinidad and Tobago Dollar",
          "value": "ttd"
        },
        {
          "name": "New Taiwan Dollar",
          "value": "twd"
        },
        {
          "name": "Tanzanian Shilling",
          "value": "tzs"
        },
        {
          "name": "Ukrainian Hryvnia",
          "value": "uah"
        },
        {
          "name": "Ugandan Shilling",
          "value": "ugx"
        },
        {
          "name": "Uruguayan Peso",
          "value": "uyu"
        },
        {
          "name": "Uzbekistan Som",
          "value": "uzs"
        },
        {
          "name": "Venezuelan Bolívar Fuerte",
          "value": "vef"
        },
        {
          "name": "Vietnamese Dong",
          "value": "vnd"
        },
        {
          "name": "Vanuatu Vatu",
          "value": "vuv"
        },
        {
          "name": "Samoan Tala",
          "value": "wst"
        },
        {
          "name": "CFA Franc BEAC",
          "value": "xaf"
        },
        {
          "name": "Silver Ounce",
          "value": "xag"
        },
        {
          "name": "Gold Ounce",
          "value": "xau"
        },
        {
          "name": "East Caribbean Dollar",
          "value": "xcd"
        },
        {
          "name": "Special Drawing Rights",
          "value": "xdr"
        },
        {
          "name": "CFA Franc BCEAO",
          "value": "xof"
        },
        {
          "name": "Palladium Ounce",
          "value": "xpd"
        },
        {
          "name": "CFP Franc",
          "value": "xpf"
        },
        {
          "name": "Platinum Ounce",
          "value": "xpt"
        },
        {
          "name": "Yemeni Rial",
          "value": "yer"
        },
        {
          "name": "South African Rand",
          "value": "zar"
        },
        {
          "name": "Zambian Kwacha",
          "value": "zmw"
        },
        {
          "name": "Zimbabwean Dollar",
          "value": "zwl"
        }
      ],
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal Pipeline ID",
      "name": "group",
      "type": "string",
      "default": "",
      "description": "The pipeline ID of the deal",
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal Stage ID",
      "name": "stage",
      "type": "string",
      "default": "",
      "description": "The stage ID of the deal",
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal Owner ID",
      "name": "owner",
      "type": "string",
      "default": "",
      "description": "The owner ID of the deal",
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Description",
          "name": "description",
          "type": "string",
          "default": "",
          "description": "The description of the deal"
        },
        {
          "displayName": "Deal Percentage",
          "name": "percent",
          "type": "number",
          "default": 0,
          "description": "The percentage of the deal"
        },
        {
          "displayName": "Deal Status",
          "name": "status",
          "type": "number",
          "default": 0,
          "description": "The status of the deal"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal ID",
      "name": "dealId",
      "type": "number",
      "default": 0,
      "description": "ID of the deal to update",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "description": "The fields to update",
      "options": [
        {
          "displayName": "Title",
          "name": "title",
          "type": "string",
          "default": "",
          "description": "The title of the deal"
        },
        {
          "displayName": "Deal's Contact ID",
          "name": "contact",
          "type": "number",
          "default": 0,
          "description": "The ID of the deal's contact"
        },
        {
          "displayName": "Deal Value",
          "name": "value",
          "type": "number",
          "default": 0,
          "description": "The value of the deal in cents"
        },
        {
          "displayName": "Currency",
          "name": "currency",
          "type": "options",
          "options": [
            {
              "name": "Euro",
              "value": "eur"
            },
            {
              "name": "United States Dollar",
              "value": "usd"
            },
            {
              "name": "British Pound Sterling",
              "value": "gbp"
            },
            {
              "name": "Swiss Franc",
              "value": "chf"
            },
            {
              "name": "Renminbi",
              "value": "cny"
            },
            {
              "name": "--------",
              "value": ""
            },
            {
              "name": "United Arab Emirates Dirham",
              "value": "aed"
            },
            {
              "name": "Afghan Afghani",
              "value": "afn"
            },
            {
              "name": "Albanian Lek",
              "value": "all"
            },
            {
              "name": "Armenian Dram",
              "value": "amd"
            },
            {
              "name": "Netherlands Antillean Guilder",
              "value": "ang"
            },
            {
              "name": "Angolan Kwanza",
              "value": "aoa"
            },
            {
              "name": "Argentine Peso",
              "value": "ars"
            },
            {
              "name": "Australian Dollar",
              "value": "aud"
            },
            {
              "name": "Aruban Florin",
              "value": "awg"
            },
            {
              "name": "Azerbaijani Manat",
              "value": "azn"
            },
            {
              "name": "Bosnia-Herzegovina Convertible Mark",
              "value": "bam"
            },
            {
              "name": "Barbadian Dollar",
              "value": "bbd"
            },
            {
              "name": "Bangladeshi Taka",
              "value": "bdt"
            },
            {
              "name": "Bulgarian Lev",
              "value": "bgn"
            },
            {
              "name": "Bahraini Dinar",
              "value": "bhd"
            },
            {
              "name": "Burundian Franc",
              "value": "bif"
            },
            {
              "name": "Bermudan Dollar",
              "value": "bmd"
            },
            {
              "name": "Brunei Dollar",
              "value": "bnd"
            },
            {
              "name": "Bolivian Boliviano",
              "value": "bob"
            },
            {
              "name": "Brazilian Real",
              "value": "brl"
            },
            {
              "name": "Bahamian Dollar",
              "value": "bsd"
            },
            {
              "name": "Bitcoin",
              "value": "btc"
            },
            {
              "name": "Bhutanese Ngultrum",
              "value": "btn"
            },
            {
              "name": "Botswanan Pula",
              "value": "bwp"
            },
            {
              "name": "Belarusian Ruble",
              "value": "byn"
            },
            {
              "name": "Belize Dollar",
              "value": "bzd"
            },
            {
              "name": "Canadian Dollar",
              "value": "cad"
            },
            {
              "name": "Congolese Franc",
              "value": "cdf"
            },
            {
              "name": "Chilean Unit of Account (UF)",
              "value": "clf"
            },
            {
              "name": "Chilean Peso",
              "value": "clp"
            },
            {
              "name": "Chinese Yuan (Offshore)",
              "value": "cnh"
            },
            {
              "name": "Colombian Peso",
              "value": "cop"
            },
            {
              "name": "Costa Rican Colón",
              "value": "crc"
            },
            {
              "name": "Cuban Convertible Peso",
              "value": "cuc"
            },
            {
              "name": "Cuban Peso",
              "value": "cup"
            },
            {
              "name": "Cape Verdean Escudo",
              "value": "cve"
            },
            {
              "name": "Czech Republic Koruna",
              "value": "czk"
            },
            {
              "name": "Djiboutian Franc",
              "value": "djf"
            },
            {
              "name": "Danish Krone",
              "value": "dkk"
            },
            {
              "name": "Dominican Peso",
              "value": "dop"
            },
            {
              "name": "Algerian Dinar",
              "value": "dzd"
            },
            {
              "name": "Egyptian Pound",
              "value": "egp"
            },
            {
              "name": "Eritrean Nakfa",
              "value": "ern"
            },
            {
              "name": "Ethiopian Birr",
              "value": "etb"
            },
            {
              "name": "Fijian Dollar",
              "value": "fjd"
            },
            {
              "name": "Falkland Islands Pound",
              "value": "fkp"
            },
            {
              "name": "Georgian Lari",
              "value": "gel"
            },
            {
              "name": "Guernsey Pound",
              "value": "ggp"
            },
            {
              "name": "Ghanaian Cedi",
              "value": "ghs"
            },
            {
              "name": "Gibraltar Pound",
              "value": "gip"
            },
            {
              "name": "Gambian Dalasi",
              "value": "gmd"
            },
            {
              "name": "Guinean Franc",
              "value": "gnf"
            },
            {
              "name": "Guatemalan Quetzal",
              "value": "gtq"
            },
            {
              "name": "Guyanaese Dollar",
              "value": "gyd"
            },
            {
              "name": "Hong Kong Dollar",
              "value": "hkd"
            },
            {
              "name": "Honduran Lempira",
              "value": "hnl"
            },
            {
              "name": "Croatian Kuna",
              "value": "hrk"
            },
            {
              "name": "Haitian Gourde",
              "value": "htg"
            },
            {
              "name": "Hungarian Forint",
              "value": "huf"
            },
            {
              "name": "Indonesian Rupiah",
              "value": "idr"
            },
            {
              "name": "Israeli New Sheqel",
              "value": "ils"
            },
            {
              "name": "Manx Pound",
              "value": "imp"
            },
            {
              "name": "Indian Rupee",
              "value": "inr"
            },
            {
              "name": "Iraqi Dinar",
              "value": "iqd"
            },
            {
              "name": "Iranian Rial",
              "value": "irr"
            },
            {
              "name": "Icelandic Króna",
              "value": "isk"
            },
            {
              "name": "Jersey Pound",
              "value": "jep"
            },
            {
              "name": "Jamaican Dollar",
              "value": "jmd"
            },
            {
              "name": "Jordanian Dinar",
              "value": "jod"
            },
            {
              "name": "Japanese Yen",
              "value": "jpy"
            },
            {
              "name": "Kenyan Shilling",
              "value": "kes"
            },
            {
              "name": "Kyrgystani Som",
              "value": "kgs"
            },
            {
              "name": "Cambodian Riel",
              "value": "khr"
            },
            {
              "name": "Comorian Franc",
              "value": "kmf"
            },
            {
              "name": "North Korean Won",
              "value": "kpw"
            },
            {
              "name": "South Korean Won",
              "value": "krw"
            },
            {
              "name": "Kuwaiti Dinar",
              "value": "kwd"
            },
            {
              "name": "Cayman Islands Dollar",
              "value": "kyd"
            },
            {
              "name": "Kazakhstani Tenge",
              "value": "kzt"
            },
            {
              "name": "Laotian Kip",
              "value": "lak"
            },
            {
              "name": "Lebanese Pound",
              "value": "lbp"
            },
            {
              "name": "Sri Lankan Rupee",
              "value": "lkr"
            },
            {
              "name": "Liberian Dollar",
              "value": "lrd"
            },
            {
              "name": "Lesotho Loti",
              "value": "lsl"
            },
            {
              "name": "Libyan Dinar",
              "value": "lyd"
            },
            {
              "name": "Moroccan Dirham",
              "value": "mad"
            },
            {
              "name": "Moldovan Leu",
              "value": "mdl"
            },
            {
              "name": "Malagasy Ariary",
              "value": "mga"
            },
            {
              "name": "Macedonian Denar",
              "value": "mkd"
            },
            {
              "name": "Myanma Kyat",
              "value": "mmk"
            },
            {
              "name": "Mongolian Tugrik",
              "value": "mnt"
            },
            {
              "name": "Macanese Pataca",
              "value": "mop"
            },
            {
              "name": "Mauritanian Ouguiya (Pre-2018)",
              "value": "mro"
            },
            {
              "name": "Mauritanian Ouguiya",
              "value": "mru"
            },
            {
              "name": "Mauritian Rupee",
              "value": "mur"
            },
            {
              "name": "Maldivian Rufiyaa",
              "value": "mvr"
            },
            {
              "name": "Malawian Kwacha",
              "value": "mwk"
            },
            {
              "name": "Mexican Peso",
              "value": "mxn"
            },
            {
              "name": "Malaysian Ringgit",
              "value": "myr"
            },
            {
              "name": "Mozambican Metical",
              "value": "mzn"
            },
            {
              "name": "Namibian Dollar",
              "value": "nad"
            },
            {
              "name": "Nigerian Naira",
              "value": "ngn"
            },
            {
              "name": "Nicaraguan Córdoba",
              "value": "nio"
            },
            {
              "name": "Norwegian Krone",
              "value": "nok"
            },
            {
              "name": "Nepalese Rupee",
              "value": "npr"
            },
            {
              "name": "New Zealand Dollar",
              "value": "nzd"
            },
            {
              "name": "Omani Rial",
              "value": "omr"
            },
            {
              "name": "Panamanian Balboa",
              "value": "pab"
            },
            {
              "name": "Peruvian Nuevo Sol",
              "value": "pen"
            },
            {
              "name": "Papua New Guinean Kina",
              "value": "pgk"
            },
            {
              "name": "Philippine Peso",
              "value": "php"
            },
            {
              "name": "Pakistani Rupee",
              "value": "pkr"
            },
            {
              "name": "Polish Zloty",
              "value": "pln"
            },
            {
              "name": "Paraguayan Guarani",
              "value": "pyg"
            },
            {
              "name": "Qatari Rial",
              "value": "qar"
            },
            {
              "name": "Romanian Leu",
              "value": "ron"
            },
            {
              "name": "Serbian Dinar",
              "value": "rsd"
            },
            {
              "name": "Russian Ruble",
              "value": "rub"
            },
            {
              "name": "Rwandan Franc",
              "value": "rwf"
            },
            {
              "name": "Saudi Riyal",
              "value": "sar"
            },
            {
              "name": "Solomon Islands Dollar",
              "value": "sbd"
            },
            {
              "name": "Seychellois Rupee",
              "value": "scr"
            },
            {
              "name": "Sudanese Pound",
              "value": "sdg"
            },
            {
              "name": "Swedish Krona",
              "value": "sek"
            },
            {
              "name": "Singapore Dollar",
              "value": "sgd"
            },
            {
              "name": "Saint Helena Pound",
              "value": "shp"
            },
            {
              "name": "Sierra Leonean Leone",
              "value": "sll"
            },
            {
              "name": "Somali Shilling",
              "value": "sos"
            },
            {
              "name": "Surinamese Dollar",
              "value": "srd"
            },
            {
              "name": "South Sudanese Pound",
              "value": "ssp"
            },
            {
              "name": "São Tomé and Príncipe Dobra (Pre-2018)",
              "value": "std"
            },
            {
              "name": "São Tomé and Príncipe Dobra",
              "value": "stn"
            },
            {
              "name": "Salvadoran Colón",
              "value": "svc"
            },
            {
              "name": "Syrian Pound",
              "value": "syp"
            },
            {
              "name": "Swazi Lilangeni",
              "value": "szl"
            },
            {
              "name": "Thai Baht",
              "value": "thb"
            },
            {
              "name": "Tajikistani Somoni",
              "value": "tjs"
            },
            {
              "name": "Turkmenistani Manat",
              "value": "tmt"
            },
            {
              "name": "Tunisian Dinar",
              "value": "tnd"
            },
            {
              "name": "Tongan Pa'anga",
              "value": "top"
            },
            {
              "name": "Turkish Lira",
              "value": "try"
            },
            {
              "name": "Trinidad and Tobago Dollar",
              "value": "ttd"
            },
            {
              "name": "New Taiwan Dollar",
              "value": "twd"
            },
            {
              "name": "Tanzanian Shilling",
              "value": "tzs"
            },
            {
              "name": "Ukrainian Hryvnia",
              "value": "uah"
            },
            {
              "name": "Ugandan Shilling",
              "value": "ugx"
            },
            {
              "name": "Uruguayan Peso",
              "value": "uyu"
            },
            {
              "name": "Uzbekistan Som",
              "value": "uzs"
            },
            {
              "name": "Venezuelan Bolívar Fuerte",
              "value": "vef"
            },
            {
              "name": "Vietnamese Dong",
              "value": "vnd"
            },
            {
              "name": "Vanuatu Vatu",
              "value": "vuv"
            },
            {
              "name": "Samoan Tala",
              "value": "wst"
            },
            {
              "name": "CFA Franc BEAC",
              "value": "xaf"
            },
            {
              "name": "Silver Ounce",
              "value": "xag"
            },
            {
              "name": "Gold Ounce",
              "value": "xau"
            },
            {
              "name": "East Caribbean Dollar",
              "value": "xcd"
            },
            {
              "name": "Special Drawing Rights",
              "value": "xdr"
            },
            {
              "name": "CFA Franc BCEAO",
              "value": "xof"
            },
            {
              "name": "Palladium Ounce",
              "value": "xpd"
            },
            {
              "name": "CFP Franc",
              "value": "xpf"
            },
            {
              "name": "Platinum Ounce",
              "value": "xpt"
            },
            {
              "name": "Yemeni Rial",
              "value": "yer"
            },
            {
              "name": "South African Rand",
              "value": "zar"
            },
            {
              "name": "Zambian Kwacha",
              "value": "zmw"
            },
            {
              "name": "Zimbabwean Dollar",
              "value": "zwl"
            }
          ],
          "default": "eur",
          "description": "The currency of the deal in 3-character ISO format"
        },
        {
          "displayName": "Description",
          "name": "description",
          "type": "string",
          "default": "",
          "description": "The description of the deal"
        },
        {
          "displayName": "Deal Pipeline ID",
          "name": "group",
          "type": "string",
          "default": "",
          "description": "The pipeline ID of the deal"
        },
        {
          "displayName": "Deal Stage ID",
          "name": "stage",
          "type": "string",
          "default": "",
          "description": "The stage ID of the deal"
        },
        {
          "displayName": "Deal Owner ID",
          "name": "owner",
          "type": "string",
          "default": "",
          "description": "The owner ID of the deal"
        },
        {
          "displayName": "Deal Percentage",
          "name": "percent",
          "type": "number",
          "default": 0,
          "description": "The percentage of the deal"
        },
        {
          "displayName": "Deal Status",
          "name": "status",
          "type": "number",
          "default": 0,
          "description": "The status of the deal"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal ID",
      "name": "dealId",
      "type": "number",
      "default": 0,
      "description": "The ID of the deal to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal ID",
      "name": "dealId",
      "type": "number",
      "default": 0,
      "description": "The ID of the deal to get",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "get"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "deal"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal ID",
      "name": "dealId",
      "type": "number",
      "default": "",
      "description": "The ID of the deal note",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "createNote"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal Note",
      "name": "dealNote",
      "type": "string",
      "default": "",
      "description": "The content of the deal note",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "createNote"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal ID",
      "name": "dealId",
      "type": "number",
      "default": "",
      "description": "The ID of the deal note",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "updateNote"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal Note ID",
      "name": "dealNoteId",
      "type": "number",
      "default": "",
      "description": "The ID of the deal note",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "updateNote"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Deal Note",
      "name": "dealNote",
      "type": "string",
      "default": "",
      "description": "The content of the deal note",
      "displayOptions": {
        "show": {
          "operation": [
            "updateNote"
          ],
          "resource": [
            "deal"
          ]
        }
      }
    },
    {
      "displayName": "Service",
      "name": "service",
      "type": "string",
      "default": "",
      "description": "The name of the service",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "External Account ID",
      "name": "externalid",
      "type": "string",
      "default": "",
      "description": "The ID of the account in the external service",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Account Name",
      "name": "name",
      "type": "string",
      "default": "",
      "description": "The name associated with the account in the external service. Often this will be a company name (e.g., \"My Toystore, Inc.\").",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Logo URL",
      "name": "logoUrl",
      "type": "string",
      "default": "",
      "description": "The URL to a logo image for the external service",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Link URL",
      "name": "linkUrl",
      "type": "string",
      "default": "",
      "description": "The URL to a page where the integration with the external service can be managed in the third-party's website",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Connection ID",
      "name": "connectionId",
      "type": "number",
      "default": 0,
      "description": "ID of the connection to update",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "description": "The fields to update",
      "options": [
        {
          "displayName": "Service",
          "name": "service",
          "type": "string",
          "default": "",
          "description": "The name of the service"
        },
        {
          "displayName": "External Account ID",
          "name": "externalid",
          "type": "string",
          "default": "",
          "description": "The ID of the account in the external service"
        },
        {
          "displayName": "Account Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "The name associated with the account in the external service. Often this will be a company name (e.g., \"My Toystore, Inc.\")."
        },
        {
          "displayName": "Logo URL",
          "name": "logoUrl",
          "type": "string",
          "default": "",
          "description": "The URL to a logo image for the external service"
        },
        {
          "displayName": "Link URL",
          "name": "linkUrl",
          "type": "string",
          "default": "",
          "description": "The URL to a page where the integration with the external service can be managed in the third-party's website"
        },
        {
          "displayName": "Status",
          "name": "status",
          "type": "number",
          "default": 1,
          "description": "The status of the connection (0 = error; 1 = connected)"
        },
        {
          "displayName": "Syncronisation Status",
          "name": "syncStatus",
          "type": "number",
          "default": 1,
          "description": "The status of a sync triggered on the connection (0 = sync stopped; 1 = sync running)"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Connection ID",
      "name": "connectionId",
      "type": "number",
      "default": 0,
      "description": "ID of the connection to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Connection ID",
      "name": "connectionId",
      "type": "number",
      "default": 0,
      "description": "ID of the connection to get",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "get"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "connection"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "connection"
          ]
        }
      }
    },
    {
      "displayName": "External ID",
      "name": "externalid",
      "type": "string",
      "default": "",
      "description": "The ID of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED.",
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "External Checkout ID",
      "name": "externalcheckoutid",
      "type": "string",
      "default": "",
      "description": "The ID of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.",
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Order Source",
      "name": "source",
      "type": "number",
      "default": 0,
      "description": "The order source code (0 - will not trigger automations, 1 - will trigger automations)",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Customer Email",
      "name": "email",
      "type": "string",
      "default": "",
      "description": "The email address of the customer who placed the order",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Total Price",
      "name": "totalPrice",
      "type": "number",
      "default": 0,
      "description": "The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Order Currency",
      "name": "currency",
      "type": "options",
      "default": "eur",
      "description": "The currency of the order (3-digit ISO code, e.g., \"USD\")",
      "options": [
        {
          "name": "Euro",
          "value": "eur"
        },
        {
          "name": "United States Dollar",
          "value": "usd"
        },
        {
          "name": "British Pound Sterling",
          "value": "gbp"
        },
        {
          "name": "Swiss Franc",
          "value": "chf"
        },
        {
          "name": "Renminbi",
          "value": "cny"
        },
        {
          "name": "--------",
          "value": ""
        },
        {
          "name": "United Arab Emirates Dirham",
          "value": "aed"
        },
        {
          "name": "Afghan Afghani",
          "value": "afn"
        },
        {
          "name": "Albanian Lek",
          "value": "all"
        },
        {
          "name": "Armenian Dram",
          "value": "amd"
        },
        {
          "name": "Netherlands Antillean Guilder",
          "value": "ang"
        },
        {
          "name": "Angolan Kwanza",
          "value": "aoa"
        },
        {
          "name": "Argentine Peso",
          "value": "ars"
        },
        {
          "name": "Australian Dollar",
          "value": "aud"
        },
        {
          "name": "Aruban Florin",
          "value": "awg"
        },
        {
          "name": "Azerbaijani Manat",
          "value": "azn"
        },
        {
          "name": "Bosnia-Herzegovina Convertible Mark",
          "value": "bam"
        },
        {
          "name": "Barbadian Dollar",
          "value": "bbd"
        },
        {
          "name": "Bangladeshi Taka",
          "value": "bdt"
        },
        {
          "name": "Bulgarian Lev",
          "value": "bgn"
        },
        {
          "name": "Bahraini Dinar",
          "value": "bhd"
        },
        {
          "name": "Burundian Franc",
          "value": "bif"
        },
        {
          "name": "Bermudan Dollar",
          "value": "bmd"
        },
        {
          "name": "Brunei Dollar",
          "value": "bnd"
        },
        {
          "name": "Bolivian Boliviano",
          "value": "bob"
        },
        {
          "name": "Brazilian Real",
          "value": "brl"
        },
        {
          "name": "Bahamian Dollar",
          "value": "bsd"
        },
        {
          "name": "Bitcoin",
          "value": "btc"
        },
        {
          "name": "Bhutanese Ngultrum",
          "value": "btn"
        },
        {
          "name": "Botswanan Pula",
          "value": "bwp"
        },
        {
          "name": "Belarusian Ruble",
          "value": "byn"
        },
        {
          "name": "Belize Dollar",
          "value": "bzd"
        },
        {
          "name": "Canadian Dollar",
          "value": "cad"
        },
        {
          "name": "Congolese Franc",
          "value": "cdf"
        },
        {
          "name": "Chilean Unit of Account (UF)",
          "value": "clf"
        },
        {
          "name": "Chilean Peso",
          "value": "clp"
        },
        {
          "name": "Chinese Yuan (Offshore)",
          "value": "cnh"
        },
        {
          "name": "Colombian Peso",
          "value": "cop"
        },
        {
          "name": "Costa Rican Colón",
          "value": "crc"
        },
        {
          "name": "Cuban Convertible Peso",
          "value": "cuc"
        },
        {
          "name": "Cuban Peso",
          "value": "cup"
        },
        {
          "name": "Cape Verdean Escudo",
          "value": "cve"
        },
        {
          "name": "Czech Republic Koruna",
          "value": "czk"
        },
        {
          "name": "Djiboutian Franc",
          "value": "djf"
        },
        {
          "name": "Danish Krone",
          "value": "dkk"
        },
        {
          "name": "Dominican Peso",
          "value": "dop"
        },
        {
          "name": "Algerian Dinar",
          "value": "dzd"
        },
        {
          "name": "Egyptian Pound",
          "value": "egp"
        },
        {
          "name": "Eritrean Nakfa",
          "value": "ern"
        },
        {
          "name": "Ethiopian Birr",
          "value": "etb"
        },
        {
          "name": "Fijian Dollar",
          "value": "fjd"
        },
        {
          "name": "Falkland Islands Pound",
          "value": "fkp"
        },
        {
          "name": "Georgian Lari",
          "value": "gel"
        },
        {
          "name": "Guernsey Pound",
          "value": "ggp"
        },
        {
          "name": "Ghanaian Cedi",
          "value": "ghs"
        },
        {
          "name": "Gibraltar Pound",
          "value": "gip"
        },
        {
          "name": "Gambian Dalasi",
          "value": "gmd"
        },
        {
          "name": "Guinean Franc",
          "value": "gnf"
        },
        {
          "name": "Guatemalan Quetzal",
          "value": "gtq"
        },
        {
          "name": "Guyanaese Dollar",
          "value": "gyd"
        },
        {
          "name": "Hong Kong Dollar",
          "value": "hkd"
        },
        {
          "name": "Honduran Lempira",
          "value": "hnl"
        },
        {
          "name": "Croatian Kuna",
          "value": "hrk"
        },
        {
          "name": "Haitian Gourde",
          "value": "htg"
        },
        {
          "name": "Hungarian Forint",
          "value": "huf"
        },
        {
          "name": "Indonesian Rupiah",
          "value": "idr"
        },
        {
          "name": "Israeli New Sheqel",
          "value": "ils"
        },
        {
          "name": "Manx Pound",
          "value": "imp"
        },
        {
          "name": "Indian Rupee",
          "value": "inr"
        },
        {
          "name": "Iraqi Dinar",
          "value": "iqd"
        },
        {
          "name": "Iranian Rial",
          "value": "irr"
        },
        {
          "name": "Icelandic Króna",
          "value": "isk"
        },
        {
          "name": "Jersey Pound",
          "value": "jep"
        },
        {
          "name": "Jamaican Dollar",
          "value": "jmd"
        },
        {
          "name": "Jordanian Dinar",
          "value": "jod"
        },
        {
          "name": "Japanese Yen",
          "value": "jpy"
        },
        {
          "name": "Kenyan Shilling",
          "value": "kes"
        },
        {
          "name": "Kyrgystani Som",
          "value": "kgs"
        },
        {
          "name": "Cambodian Riel",
          "value": "khr"
        },
        {
          "name": "Comorian Franc",
          "value": "kmf"
        },
        {
          "name": "North Korean Won",
          "value": "kpw"
        },
        {
          "name": "South Korean Won",
          "value": "krw"
        },
        {
          "name": "Kuwaiti Dinar",
          "value": "kwd"
        },
        {
          "name": "Cayman Islands Dollar",
          "value": "kyd"
        },
        {
          "name": "Kazakhstani Tenge",
          "value": "kzt"
        },
        {
          "name": "Laotian Kip",
          "value": "lak"
        },
        {
          "name": "Lebanese Pound",
          "value": "lbp"
        },
        {
          "name": "Sri Lankan Rupee",
          "value": "lkr"
        },
        {
          "name": "Liberian Dollar",
          "value": "lrd"
        },
        {
          "name": "Lesotho Loti",
          "value": "lsl"
        },
        {
          "name": "Libyan Dinar",
          "value": "lyd"
        },
        {
          "name": "Moroccan Dirham",
          "value": "mad"
        },
        {
          "name": "Moldovan Leu",
          "value": "mdl"
        },
        {
          "name": "Malagasy Ariary",
          "value": "mga"
        },
        {
          "name": "Macedonian Denar",
          "value": "mkd"
        },
        {
          "name": "Myanma Kyat",
          "value": "mmk"
        },
        {
          "name": "Mongolian Tugrik",
          "value": "mnt"
        },
        {
          "name": "Macanese Pataca",
          "value": "mop"
        },
        {
          "name": "Mauritanian Ouguiya (Pre-2018)",
          "value": "mro"
        },
        {
          "name": "Mauritanian Ouguiya",
          "value": "mru"
        },
        {
          "name": "Mauritian Rupee",
          "value": "mur"
        },
        {
          "name": "Maldivian Rufiyaa",
          "value": "mvr"
        },
        {
          "name": "Malawian Kwacha",
          "value": "mwk"
        },
        {
          "name": "Mexican Peso",
          "value": "mxn"
        },
        {
          "name": "Malaysian Ringgit",
          "value": "myr"
        },
        {
          "name": "Mozambican Metical",
          "value": "mzn"
        },
        {
          "name": "Namibian Dollar",
          "value": "nad"
        },
        {
          "name": "Nigerian Naira",
          "value": "ngn"
        },
        {
          "name": "Nicaraguan Córdoba",
          "value": "nio"
        },
        {
          "name": "Norwegian Krone",
          "value": "nok"
        },
        {
          "name": "Nepalese Rupee",
          "value": "npr"
        },
        {
          "name": "New Zealand Dollar",
          "value": "nzd"
        },
        {
          "name": "Omani Rial",
          "value": "omr"
        },
        {
          "name": "Panamanian Balboa",
          "value": "pab"
        },
        {
          "name": "Peruvian Nuevo Sol",
          "value": "pen"
        },
        {
          "name": "Papua New Guinean Kina",
          "value": "pgk"
        },
        {
          "name": "Philippine Peso",
          "value": "php"
        },
        {
          "name": "Pakistani Rupee",
          "value": "pkr"
        },
        {
          "name": "Polish Zloty",
          "value": "pln"
        },
        {
          "name": "Paraguayan Guarani",
          "value": "pyg"
        },
        {
          "name": "Qatari Rial",
          "value": "qar"
        },
        {
          "name": "Romanian Leu",
          "value": "ron"
        },
        {
          "name": "Serbian Dinar",
          "value": "rsd"
        },
        {
          "name": "Russian Ruble",
          "value": "rub"
        },
        {
          "name": "Rwandan Franc",
          "value": "rwf"
        },
        {
          "name": "Saudi Riyal",
          "value": "sar"
        },
        {
          "name": "Solomon Islands Dollar",
          "value": "sbd"
        },
        {
          "name": "Seychellois Rupee",
          "value": "scr"
        },
        {
          "name": "Sudanese Pound",
          "value": "sdg"
        },
        {
          "name": "Swedish Krona",
          "value": "sek"
        },
        {
          "name": "Singapore Dollar",
          "value": "sgd"
        },
        {
          "name": "Saint Helena Pound",
          "value": "shp"
        },
        {
          "name": "Sierra Leonean Leone",
          "value": "sll"
        },
        {
          "name": "Somali Shilling",
          "value": "sos"
        },
        {
          "name": "Surinamese Dollar",
          "value": "srd"
        },
        {
          "name": "South Sudanese Pound",
          "value": "ssp"
        },
        {
          "name": "São Tomé and Príncipe Dobra (Pre-2018)",
          "value": "std"
        },
        {
          "name": "São Tomé and Príncipe Dobra",
          "value": "stn"
        },
        {
          "name": "Salvadoran Colón",
          "value": "svc"
        },
        {
          "name": "Syrian Pound",
          "value": "syp"
        },
        {
          "name": "Swazi Lilangeni",
          "value": "szl"
        },
        {
          "name": "Thai Baht",
          "value": "thb"
        },
        {
          "name": "Tajikistani Somoni",
          "value": "tjs"
        },
        {
          "name": "Turkmenistani Manat",
          "value": "tmt"
        },
        {
          "name": "Tunisian Dinar",
          "value": "tnd"
        },
        {
          "name": "Tongan Pa'anga",
          "value": "top"
        },
        {
          "name": "Turkish Lira",
          "value": "try"
        },
        {
          "name": "Trinidad and Tobago Dollar",
          "value": "ttd"
        },
        {
          "name": "New Taiwan Dollar",
          "value": "twd"
        },
        {
          "name": "Tanzanian Shilling",
          "value": "tzs"
        },
        {
          "name": "Ukrainian Hryvnia",
          "value": "uah"
        },
        {
          "name": "Ugandan Shilling",
          "value": "ugx"
        },
        {
          "name": "Uruguayan Peso",
          "value": "uyu"
        },
        {
          "name": "Uzbekistan Som",
          "value": "uzs"
        },
        {
          "name": "Venezuelan Bolívar Fuerte",
          "value": "vef"
        },
        {
          "name": "Vietnamese Dong",
          "value": "vnd"
        },
        {
          "name": "Vanuatu Vatu",
          "value": "vuv"
        },
        {
          "name": "Samoan Tala",
          "value": "wst"
        },
        {
          "name": "CFA Franc BEAC",
          "value": "xaf"
        },
        {
          "name": "Silver Ounce",
          "value": "xag"
        },
        {
          "name": "Gold Ounce",
          "value": "xau"
        },
        {
          "name": "East Caribbean Dollar",
          "value": "xcd"
        },
        {
          "name": "Special Drawing Rights",
          "value": "xdr"
        },
        {
          "name": "CFA Franc BCEAO",
          "value": "xof"
        },
        {
          "name": "Palladium Ounce",
          "value": "xpd"
        },
        {
          "name": "CFP Franc",
          "value": "xpf"
        },
        {
          "name": "Platinum Ounce",
          "value": "xpt"
        },
        {
          "name": "Yemeni Rial",
          "value": "yer"
        },
        {
          "name": "South African Rand",
          "value": "zar"
        },
        {
          "name": "Zambian Kwacha",
          "value": "zmw"
        },
        {
          "name": "Zimbabwean Dollar",
          "value": "zwl"
        }
      ],
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Connection ID",
      "name": "connectionid",
      "type": "number",
      "default": 0,
      "description": "The ID of the connection from which this order originated",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Customer ID",
      "name": "customerid",
      "type": "number",
      "default": 0,
      "description": "The ID of the customer associated with this order",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Creation Date",
      "name": "externalCreatedDate",
      "type": "dateTime",
      "default": "",
      "description": "The date the order was placed",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Abandoning Date",
      "name": "abandonedDate",
      "type": "dateTime",
      "default": "",
      "description": "The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.",
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Products",
      "name": "orderProducts",
      "type": "collection",
      "default": {},
      "description": "All ordered products",
      "options": [
        {
          "displayName": "Name",
          "name": "name",
          "type": "string",
          "default": "",
          "description": "The name of the product"
        },
        {
          "displayName": "Price",
          "name": "price",
          "type": "number",
          "default": 0,
          "description": "The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero."
        },
        {
          "displayName": "Product Quantity",
          "name": "quantity",
          "type": "number",
          "default": 0,
          "description": "The quantity ordered"
        },
        {
          "displayName": "Product External ID",
          "name": "externalid",
          "type": "string",
          "default": "",
          "description": "The ID of the product in the external service"
        },
        {
          "displayName": "Product Category",
          "name": "category",
          "type": "string",
          "default": "",
          "description": "The category of the product"
        },
        {
          "displayName": "SKU",
          "name": "sku",
          "type": "string",
          "default": "",
          "description": "The SKU for the product"
        },
        {
          "displayName": "Description",
          "name": "description",
          "type": "string",
          "default": "",
          "description": "The description of the product"
        },
        {
          "displayName": "Image URL",
          "name": "imageUrl",
          "type": "string",
          "default": "",
          "description": "An Image URL that displays an image of the product"
        },
        {
          "displayName": "Product URL",
          "name": "productUrl",
          "type": "string",
          "default": "",
          "description": "A URL linking to the product in your store"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      },
      "typeOptions": {
        "multipleValues": true,
        "multipleValueButtonText": "Add product"
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Shipping Amount",
          "name": "shippingAmount",
          "type": "number",
          "default": 0,
          "description": "The total shipping amount for the order in cents"
        },
        {
          "displayName": "Tax Amount",
          "name": "taxAmount",
          "type": "number",
          "default": 0,
          "description": "The total tax amount for the order in cents"
        },
        {
          "displayName": "Discount Amount",
          "name": "discountAmount",
          "type": "number",
          "default": 0,
          "description": "The total discount amount for the order in cents"
        },
        {
          "displayName": "Order URL",
          "name": "orderUrl",
          "type": "string",
          "default": "",
          "description": "The URL for the order in the external service"
        },
        {
          "displayName": "External Updated Date",
          "name": "externalUpdatedDate",
          "type": "dateTime",
          "default": "",
          "description": "The date the order was updated"
        },
        {
          "displayName": "Shipping Method",
          "name": "shippingMethod",
          "type": "string",
          "default": "",
          "description": "The shipping method of the order"
        },
        {
          "displayName": "Order Number",
          "name": "orderNumber",
          "type": "string",
          "default": "",
          "description": "The order number. This can be different than the externalid."
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Order ID",
      "name": "orderId",
      "type": "number",
      "default": 0,
      "description": "The ID of the e-commerce order",
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "External ID",
          "name": "externalid",
          "type": "string",
          "default": "",
          "description": "The ID of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED."
        },
        {
          "displayName": "External Checkout ID",
          "name": "externalcheckoutid",
          "type": "string",
          "default": "",
          "description": "The ID of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED."
        },
        {
          "displayName": "Order Source",
          "name": "source",
          "type": "number",
          "default": 0,
          "description": "The order source code (0 - will not trigger automations, 1 - will trigger automations)"
        },
        {
          "displayName": "Customer Email",
          "name": "email",
          "type": "string",
          "placeholder": "name@email.com",
          "default": "",
          "description": "The email address of the customer who placed the order"
        },
        {
          "displayName": "Total Price",
          "name": "totalPrice",
          "type": "number",
          "default": 0,
          "description": "The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero."
        },
        {
          "displayName": "Order Currency",
          "name": "currency",
          "type": "options",
          "default": "eur",
          "options": [
            {
              "name": "Euro",
              "value": "eur"
            },
            {
              "name": "United States Dollar",
              "value": "usd"
            },
            {
              "name": "British Pound Sterling",
              "value": "gbp"
            },
            {
              "name": "Swiss Franc",
              "value": "chf"
            },
            {
              "name": "Renminbi",
              "value": "cny"
            },
            {
              "name": "--------",
              "value": ""
            },
            {
              "name": "United Arab Emirates Dirham",
              "value": "aed"
            },
            {
              "name": "Afghan Afghani",
              "value": "afn"
            },
            {
              "name": "Albanian Lek",
              "value": "all"
            },
            {
              "name": "Armenian Dram",
              "value": "amd"
            },
            {
              "name": "Netherlands Antillean Guilder",
              "value": "ang"
            },
            {
              "name": "Angolan Kwanza",
              "value": "aoa"
            },
            {
              "name": "Argentine Peso",
              "value": "ars"
            },
            {
              "name": "Australian Dollar",
              "value": "aud"
            },
            {
              "name": "Aruban Florin",
              "value": "awg"
            },
            {
              "name": "Azerbaijani Manat",
              "value": "azn"
            },
            {
              "name": "Bosnia-Herzegovina Convertible Mark",
              "value": "bam"
            },
            {
              "name": "Barbadian Dollar",
              "value": "bbd"
            },
            {
              "name": "Bangladeshi Taka",
              "value": "bdt"
            },
            {
              "name": "Bulgarian Lev",
              "value": "bgn"
            },
            {
              "name": "Bahraini Dinar",
              "value": "bhd"
            },
            {
              "name": "Burundian Franc",
              "value": "bif"
            },
            {
              "name": "Bermudan Dollar",
              "value": "bmd"
            },
            {
              "name": "Brunei Dollar",
              "value": "bnd"
            },
            {
              "name": "Bolivian Boliviano",
              "value": "bob"
            },
            {
              "name": "Brazilian Real",
              "value": "brl"
            },
            {
              "name": "Bahamian Dollar",
              "value": "bsd"
            },
            {
              "name": "Bitcoin",
              "value": "btc"
            },
            {
              "name": "Bhutanese Ngultrum",
              "value": "btn"
            },
            {
              "name": "Botswanan Pula",
              "value": "bwp"
            },
            {
              "name": "Belarusian Ruble",
              "value": "byn"
            },
            {
              "name": "Belize Dollar",
              "value": "bzd"
            },
            {
              "name": "Canadian Dollar",
              "value": "cad"
            },
            {
              "name": "Congolese Franc",
              "value": "cdf"
            },
            {
              "name": "Chilean Unit of Account (UF)",
              "value": "clf"
            },
            {
              "name": "Chilean Peso",
              "value": "clp"
            },
            {
              "name": "Chinese Yuan (Offshore)",
              "value": "cnh"
            },
            {
              "name": "Colombian Peso",
              "value": "cop"
            },
            {
              "name": "Costa Rican Colón",
              "value": "crc"
            },
            {
              "name": "Cuban Convertible Peso",
              "value": "cuc"
            },
            {
              "name": "Cuban Peso",
              "value": "cup"
            },
            {
              "name": "Cape Verdean Escudo",
              "value": "cve"
            },
            {
              "name": "Czech Republic Koruna",
              "value": "czk"
            },
            {
              "name": "Djiboutian Franc",
              "value": "djf"
            },
            {
              "name": "Danish Krone",
              "value": "dkk"
            },
            {
              "name": "Dominican Peso",
              "value": "dop"
            },
            {
              "name": "Algerian Dinar",
              "value": "dzd"
            },
            {
              "name": "Egyptian Pound",
              "value": "egp"
            },
            {
              "name": "Eritrean Nakfa",
              "value": "ern"
            },
            {
              "name": "Ethiopian Birr",
              "value": "etb"
            },
            {
              "name": "Fijian Dollar",
              "value": "fjd"
            },
            {
              "name": "Falkland Islands Pound",
              "value": "fkp"
            },
            {
              "name": "Georgian Lari",
              "value": "gel"
            },
            {
              "name": "Guernsey Pound",
              "value": "ggp"
            },
            {
              "name": "Ghanaian Cedi",
              "value": "ghs"
            },
            {
              "name": "Gibraltar Pound",
              "value": "gip"
            },
            {
              "name": "Gambian Dalasi",
              "value": "gmd"
            },
            {
              "name": "Guinean Franc",
              "value": "gnf"
            },
            {
              "name": "Guatemalan Quetzal",
              "value": "gtq"
            },
            {
              "name": "Guyanaese Dollar",
              "value": "gyd"
            },
            {
              "name": "Hong Kong Dollar",
              "value": "hkd"
            },
            {
              "name": "Honduran Lempira",
              "value": "hnl"
            },
            {
              "name": "Croatian Kuna",
              "value": "hrk"
            },
            {
              "name": "Haitian Gourde",
              "value": "htg"
            },
            {
              "name": "Hungarian Forint",
              "value": "huf"
            },
            {
              "name": "Indonesian Rupiah",
              "value": "idr"
            },
            {
              "name": "Israeli New Sheqel",
              "value": "ils"
            },
            {
              "name": "Manx Pound",
              "value": "imp"
            },
            {
              "name": "Indian Rupee",
              "value": "inr"
            },
            {
              "name": "Iraqi Dinar",
              "value": "iqd"
            },
            {
              "name": "Iranian Rial",
              "value": "irr"
            },
            {
              "name": "Icelandic Króna",
              "value": "isk"
            },
            {
              "name": "Jersey Pound",
              "value": "jep"
            },
            {
              "name": "Jamaican Dollar",
              "value": "jmd"
            },
            {
              "name": "Jordanian Dinar",
              "value": "jod"
            },
            {
              "name": "Japanese Yen",
              "value": "jpy"
            },
            {
              "name": "Kenyan Shilling",
              "value": "kes"
            },
            {
              "name": "Kyrgystani Som",
              "value": "kgs"
            },
            {
              "name": "Cambodian Riel",
              "value": "khr"
            },
            {
              "name": "Comorian Franc",
              "value": "kmf"
            },
            {
              "name": "North Korean Won",
              "value": "kpw"
            },
            {
              "name": "South Korean Won",
              "value": "krw"
            },
            {
              "name": "Kuwaiti Dinar",
              "value": "kwd"
            },
            {
              "name": "Cayman Islands Dollar",
              "value": "kyd"
            },
            {
              "name": "Kazakhstani Tenge",
              "value": "kzt"
            },
            {
              "name": "Laotian Kip",
              "value": "lak"
            },
            {
              "name": "Lebanese Pound",
              "value": "lbp"
            },
            {
              "name": "Sri Lankan Rupee",
              "value": "lkr"
            },
            {
              "name": "Liberian Dollar",
              "value": "lrd"
            },
            {
              "name": "Lesotho Loti",
              "value": "lsl"
            },
            {
              "name": "Libyan Dinar",
              "value": "lyd"
            },
            {
              "name": "Moroccan Dirham",
              "value": "mad"
            },
            {
              "name": "Moldovan Leu",
              "value": "mdl"
            },
            {
              "name": "Malagasy Ariary",
              "value": "mga"
            },
            {
              "name": "Macedonian Denar",
              "value": "mkd"
            },
            {
              "name": "Myanma Kyat",
              "value": "mmk"
            },
            {
              "name": "Mongolian Tugrik",
              "value": "mnt"
            },
            {
              "name": "Macanese Pataca",
              "value": "mop"
            },
            {
              "name": "Mauritanian Ouguiya (Pre-2018)",
              "value": "mro"
            },
            {
              "name": "Mauritanian Ouguiya",
              "value": "mru"
            },
            {
              "name": "Mauritian Rupee",
              "value": "mur"
            },
            {
              "name": "Maldivian Rufiyaa",
              "value": "mvr"
            },
            {
              "name": "Malawian Kwacha",
              "value": "mwk"
            },
            {
              "name": "Mexican Peso",
              "value": "mxn"
            },
            {
              "name": "Malaysian Ringgit",
              "value": "myr"
            },
            {
              "name": "Mozambican Metical",
              "value": "mzn"
            },
            {
              "name": "Namibian Dollar",
              "value": "nad"
            },
            {
              "name": "Nigerian Naira",
              "value": "ngn"
            },
            {
              "name": "Nicaraguan Córdoba",
              "value": "nio"
            },
            {
              "name": "Norwegian Krone",
              "value": "nok"
            },
            {
              "name": "Nepalese Rupee",
              "value": "npr"
            },
            {
              "name": "New Zealand Dollar",
              "value": "nzd"
            },
            {
              "name": "Omani Rial",
              "value": "omr"
            },
            {
              "name": "Panamanian Balboa",
              "value": "pab"
            },
            {
              "name": "Peruvian Nuevo Sol",
              "value": "pen"
            },
            {
              "name": "Papua New Guinean Kina",
              "value": "pgk"
            },
            {
              "name": "Philippine Peso",
              "value": "php"
            },
            {
              "name": "Pakistani Rupee",
              "value": "pkr"
            },
            {
              "name": "Polish Zloty",
              "value": "pln"
            },
            {
              "name": "Paraguayan Guarani",
              "value": "pyg"
            },
            {
              "name": "Qatari Rial",
              "value": "qar"
            },
            {
              "name": "Romanian Leu",
              "value": "ron"
            },
            {
              "name": "Serbian Dinar",
              "value": "rsd"
            },
            {
              "name": "Russian Ruble",
              "value": "rub"
            },
            {
              "name": "Rwandan Franc",
              "value": "rwf"
            },
            {
              "name": "Saudi Riyal",
              "value": "sar"
            },
            {
              "name": "Solomon Islands Dollar",
              "value": "sbd"
            },
            {
              "name": "Seychellois Rupee",
              "value": "scr"
            },
            {
              "name": "Sudanese Pound",
              "value": "sdg"
            },
            {
              "name": "Swedish Krona",
              "value": "sek"
            },
            {
              "name": "Singapore Dollar",
              "value": "sgd"
            },
            {
              "name": "Saint Helena Pound",
              "value": "shp"
            },
            {
              "name": "Sierra Leonean Leone",
              "value": "sll"
            },
            {
              "name": "Somali Shilling",
              "value": "sos"
            },
            {
              "name": "Surinamese Dollar",
              "value": "srd"
            },
            {
              "name": "South Sudanese Pound",
              "value": "ssp"
            },
            {
              "name": "São Tomé and Príncipe Dobra (Pre-2018)",
              "value": "std"
            },
            {
              "name": "São Tomé and Príncipe Dobra",
              "value": "stn"
            },
            {
              "name": "Salvadoran Colón",
              "value": "svc"
            },
            {
              "name": "Syrian Pound",
              "value": "syp"
            },
            {
              "name": "Swazi Lilangeni",
              "value": "szl"
            },
            {
              "name": "Thai Baht",
              "value": "thb"
            },
            {
              "name": "Tajikistani Somoni",
              "value": "tjs"
            },
            {
              "name": "Turkmenistani Manat",
              "value": "tmt"
            },
            {
              "name": "Tunisian Dinar",
              "value": "tnd"
            },
            {
              "name": "Tongan Pa'anga",
              "value": "top"
            },
            {
              "name": "Turkish Lira",
              "value": "try"
            },
            {
              "name": "Trinidad and Tobago Dollar",
              "value": "ttd"
            },
            {
              "name": "New Taiwan Dollar",
              "value": "twd"
            },
            {
              "name": "Tanzanian Shilling",
              "value": "tzs"
            },
            {
              "name": "Ukrainian Hryvnia",
              "value": "uah"
            },
            {
              "name": "Ugandan Shilling",
              "value": "ugx"
            },
            {
              "name": "Uruguayan Peso",
              "value": "uyu"
            },
            {
              "name": "Uzbekistan Som",
              "value": "uzs"
            },
            {
              "name": "Venezuelan Bolívar Fuerte",
              "value": "vef"
            },
            {
              "name": "Vietnamese Dong",
              "value": "vnd"
            },
            {
              "name": "Vanuatu Vatu",
              "value": "vuv"
            },
            {
              "name": "Samoan Tala",
              "value": "wst"
            },
            {
              "name": "CFA Franc BEAC",
              "value": "xaf"
            },
            {
              "name": "Silver Ounce",
              "value": "xag"
            },
            {
              "name": "Gold Ounce",
              "value": "xau"
            },
            {
              "name": "East Caribbean Dollar",
              "value": "xcd"
            },
            {
              "name": "Special Drawing Rights",
              "value": "xdr"
            },
            {
              "name": "CFA Franc BCEAO",
              "value": "xof"
            },
            {
              "name": "Palladium Ounce",
              "value": "xpd"
            },
            {
              "name": "CFP Franc",
              "value": "xpf"
            },
            {
              "name": "Platinum Ounce",
              "value": "xpt"
            },
            {
              "name": "Yemeni Rial",
              "value": "yer"
            },
            {
              "name": "South African Rand",
              "value": "zar"
            },
            {
              "name": "Zambian Kwacha",
              "value": "zmw"
            },
            {
              "name": "Zimbabwean Dollar",
              "value": "zwl"
            }
          ],
          "description": "The currency of the order (3-digit ISO code, e.g., \"USD\")"
        },
        {
          "displayName": "Connection ID",
          "name": "connectionid",
          "type": "number",
          "default": 0,
          "description": "The ID of the connection from which this order originated"
        },
        {
          "displayName": "Customer ID",
          "name": "customerid",
          "type": "number",
          "default": 0,
          "description": "The ID of the customer associated with this order"
        },
        {
          "displayName": "Creation Date",
          "name": "externalupdatedDate",
          "type": "dateTime",
          "default": "",
          "description": "The date the order was placed"
        },
        {
          "displayName": "Abandoning Date",
          "name": "abandonedDate",
          "type": "dateTime",
          "default": "",
          "description": "The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID."
        },
        {
          "displayName": "Shipping Amount",
          "name": "shippingAmount",
          "type": "number",
          "default": 0,
          "description": "The total shipping amount for the order in cents"
        },
        {
          "displayName": "Tax Amount",
          "name": "taxAmount",
          "type": "number",
          "default": 0,
          "description": "The total tax amount for the order in cents"
        },
        {
          "displayName": "Discount Amount",
          "name": "discountAmount",
          "type": "number",
          "default": 0,
          "description": "The total discount amount for the order in cents"
        },
        {
          "displayName": "Order URL",
          "name": "orderUrl",
          "type": "string",
          "default": "",
          "description": "The URL for the order in the external service"
        },
        {
          "displayName": "External Updated Date",
          "name": "externalUpdatedDate",
          "type": "dateTime",
          "default": "",
          "description": "The date the order was updated"
        },
        {
          "displayName": "Shipping Method",
          "name": "shippingMethod",
          "type": "string",
          "default": "",
          "description": "The shipping method of the order"
        },
        {
          "displayName": "Order Number",
          "name": "orderNumber",
          "type": "string",
          "default": "",
          "description": "The order number. This can be different than the externalid."
        },
        {
          "displayName": "Products",
          "name": "orderProducts",
          "type": "collection",
          "typeOptions": {
            "multipleValues": true,
            "multipleValueButtonText": "Add product"
          },
          "default": {},
          "description": "All ordered products",
          "placeholder": "Add product field",
          "options": [
            {
              "displayName": "Name",
              "name": "name",
              "type": "string",
              "default": "",
              "description": "The name of the product"
            },
            {
              "displayName": "Price",
              "name": "price",
              "type": "number",
              "default": 0,
              "description": "The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero."
            },
            {
              "displayName": "Product Quantity",
              "name": "quantity",
              "type": "number",
              "default": 0,
              "description": "The quantity ordered"
            },
            {
              "displayName": "Product External ID",
              "name": "externalid",
              "type": "string",
              "default": "",
              "description": "The ID of the product in the external service"
            },
            {
              "displayName": "Product Category",
              "name": "category",
              "type": "string",
              "default": "",
              "description": "The category of the product"
            },
            {
              "displayName": "SKU",
              "name": "sku",
              "type": "string",
              "default": "",
              "description": "The SKU for the product"
            },
            {
              "displayName": "Description",
              "name": "description",
              "type": "string",
              "default": "",
              "description": "The description of the product"
            },
            {
              "displayName": "Image URL",
              "name": "imageUrl",
              "type": "string",
              "default": "",
              "description": "An Image URL that displays an image of the product"
            },
            {
              "displayName": "Product URL",
              "name": "productUrl",
              "type": "string",
              "default": "",
              "description": "A URL linking to the product in your store"
            }
          ]
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Order ID",
      "name": "orderId",
      "type": "number",
      "default": 0,
      "description": "The ID of the e-commerce order",
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Order ID",
      "name": "orderId",
      "type": "number",
      "default": 0,
      "description": "The ID of the e-commerce order",
      "displayOptions": {
        "show": {
          "operation": [
            "get"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceOrder"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceOrder"
          ]
        }
      }
    },
    {
      "displayName": "Service ID",
      "name": "connectionid",
      "type": "string",
      "default": "",
      "description": "The ID of the connection object for the service where the customer originates",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Customer ID",
      "name": "externalid",
      "type": "string",
      "default": "",
      "description": "The ID of the customer in the external service",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Customer Email",
      "name": "email",
      "type": "string",
      "default": "",
      "description": "The email address of the customer",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Additional Fields",
      "name": "additionalFields",
      "type": "collection",
      "default": {},
      "options": [
        {
          "displayName": "Accepts Marketing",
          "name": "acceptsMarketing",
          "type": "boolean",
          "default": false,
          "description": "Whether customer has opt-ed in to marketing communications"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "create"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Customer ID",
      "name": "ecommerceCustomerId",
      "type": "number",
      "default": 0,
      "description": "ID of the E-commerce customer to update",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Update Fields",
      "name": "updateFields",
      "type": "collection",
      "default": {},
      "description": "The fields to update",
      "options": [
        {
          "displayName": "Service ID",
          "name": "connectionid",
          "type": "string",
          "default": "",
          "description": "The ID of the connection object for the service where the customer originates"
        },
        {
          "displayName": "Customer ID",
          "name": "externalid",
          "type": "string",
          "default": "",
          "description": "The ID of the customer in the external service"
        },
        {
          "displayName": "Customer Email",
          "name": "email",
          "type": "string",
          "placeholder": "name@email.com",
          "default": "",
          "description": "The email address of the customer"
        },
        {
          "displayName": "Accepts Marketing",
          "name": "acceptsMarketing",
          "type": "boolean",
          "default": false,
          "description": "Whether customer has opt-ed in to marketing communications"
        }
      ],
      "displayOptions": {
        "show": {
          "operation": [
            "update"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Customer ID",
      "name": "ecommerceCustomerId",
      "type": "number",
      "default": 0,
      "description": "ID of the E-commerce customer to delete",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "delete"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Customer ID",
      "name": "ecommerceCustomerId",
      "type": "number",
      "default": 0,
      "description": "ID of the E-commerce customer to get",
      "required": true,
      "displayOptions": {
        "show": {
          "operation": [
            "get"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceCustomer"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceCustomer"
          ]
        }
      }
    },
    {
      "displayName": "Order ID",
      "name": "orderId",
      "type": "number",
      "default": 0,
      "description": "The ID of the order whose products you'd like returned",
      "displayOptions": {
        "show": {
          "operation": [
            "getByOrderId"
          ],
          "resource": [
            "ecommerceOrderProducts"
          ]
        }
      }
    },
    {
      "displayName": "Product ID",
      "name": "procuctId",
      "type": "number",
      "default": 0,
      "description": "The ID of the product you'd like returned",
      "displayOptions": {
        "show": {
          "operation": [
            "getByProductId"
          ],
          "resource": [
            "ecommerceOrderProducts"
          ]
        }
      }
    },
    {
      "displayName": "Return All",
      "name": "returnAll",
      "type": "boolean",
      "default": false,
      "description": "Whether to return all results or only up to a given limit",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceOrderProducts"
          ]
        }
      }
    },
    {
      "displayName": "Limit",
      "name": "limit",
      "type": "number",
      "default": 100,
      "description": "Max number of results to return",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceOrderProducts"
          ],
          "returnAll": [
            false
          ]
        }
      },
      "typeOptions": {
        "minValue": 1,
        "maxValue": 500
      }
    },
    {
      "displayName": "Simplify",
      "name": "simple",
      "type": "boolean",
      "default": true,
      "description": "Whether to return a simplified version of the response instead of the raw data",
      "displayOptions": {
        "show": {
          "operation": [
            "getAll"
          ],
          "resource": [
            "ecommerceOrderProducts"
          ]
        }
      }
    }
  ]

operations:
  [
    {
      "operation": "create",
      "name": "Create",
      "description": "Create an account",
      "resource": "account"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete an account",
      "resource": "account"
    },
    {
      "operation": "get",
      "name": "Get",
      "description": "Get data of an account",
      "resource": "account"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many accounts",
      "resource": "account"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update an account",
      "resource": "account"
    },
    {
      "operation": "create",
      "name": "Create",
      "description": "Create a contact",
      "resource": "contact"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete a contact",
      "resource": "contact"
    },
    {
      "operation": "get",
      "name": "Get",
      "description": "Get data of a contact",
      "resource": "contact"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many contacts",
      "resource": "contact"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update a contact",
      "resource": "contact"
    },
    {
      "operation": "create",
      "name": "Create",
      "description": "Create an association",
      "resource": "accountContact"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete an association",
      "resource": "accountContact"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update an association",
      "resource": "accountContact"
    },
    {
      "operation": "add",
      "name": "Add",
      "description": "Add contact to a list",
      "resource": "contactList"
    },
    {
      "operation": "remove",
      "name": "Remove",
      "description": "Remove contact from a list",
      "resource": "contactList"
    },
    {
      "operation": "add",
      "name": "Add",
      "description": "Add a tag to a contact",
      "resource": "contactTag"
    },
    {
      "operation": "remove",
      "name": "Remove",
      "description": "Remove a tag from a contact",
      "resource": "contactTag"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get many lists",
      "resource": "list"
    },
    {
      "operation": "create",
      "name": "Create",
      "description": "Create a tag",
      "resource": "tag"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete a tag",
      "resource": "tag"
    },
    {
      "operation": "get",
      "name": "Get",
      "description": "Get data of a tag",
      "resource": "tag"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many tags",
      "resource": "tag"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update a tag",
      "resource": "tag"
    },
    {
      "operation": "create",
      "name": "Create",
      "description": "Create a deal",
      "resource": "deal"
    },
    {
      "operation": "createNote",
      "name": "Create Note",
      "description": "Create a deal note",
      "resource": "deal"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete a deal",
      "resource": "deal"
    },
    {
      "operation": "get",
      "name": "Get",
      "description": "Get data of a deal",
      "resource": "deal"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many deals",
      "resource": "deal"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update a deal",
      "resource": "deal"
    },
    {
      "operation": "updateNote",
      "name": "Update Deal Note",
      "description": "Update a deal note",
      "resource": "deal"
    },
    {
      "operation": "create",
      "name": "Create",
      "description": "Create a connection",
      "resource": "connection"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete a connection",
      "resource": "connection"
    },
    {
      "operation": "get",
      "name": "Get",
      "description": "Get data of a connection",
      "resource": "connection"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many connections",
      "resource": "connection"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update a connection",
      "resource": "connection"
    },
    {
      "operation": "create",
      "name": "Create",
      "description": "Create a order",
      "resource": "ecommerceOrder"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete a order",
      "resource": "ecommerceOrder"
    },
    {
      "operation": "get",
      "name": "Get",
      "description": "Get data of a order",
      "resource": "ecommerceOrder"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many orders",
      "resource": "ecommerceOrder"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update a order",
      "resource": "ecommerceOrder"
    },
    {
      "operation": "create",
      "name": "Create",
      "description": "Create a E-commerce Customer",
      "resource": "ecommerceCustomer"
    },
    {
      "operation": "delete",
      "name": "Delete",
      "description": "Delete a E-commerce Customer",
      "resource": "ecommerceCustomer"
    },
    {
      "operation": "get",
      "name": "Get",
      "description": "Get data of a E-commerce Customer",
      "resource": "ecommerceCustomer"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many E-commerce Customers",
      "resource": "ecommerceCustomer"
    },
    {
      "operation": "update",
      "name": "Update",
      "description": "Update a E-commerce Customer",
      "resource": "ecommerceCustomer"
    },
    {
      "operation": "getAll",
      "name": "Get Many",
      "description": "Get data of many order products",
      "resource": "ecommerceOrderProducts"
    },
    {
      "operation": "getByProductId",
      "name": "Get by Product ID",
      "description": "Get data of a ordered product",
      "resource": "ecommerceOrderProducts"
    },
    {
      "operation": "getByOrderId",
      "name": "Get by Order ID",
      "description": "Get data of an order's products",
      "resource": "ecommerceOrderProducts"
    }
  ]


