# nodes

node_type: n8n-nodes-syncmate.whatsAuto
package_name: n8n-nodes-syncmate
display_name: WhatsApp Notifications by SyncMate
description: Send WhatsApp messages or media using SyncMate Assistro API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: heratassistro
author_github_url: https://github.com/heratshah-collab/
npm_package_name: n8n-nodes-syncmate
npm_version: 1.1.0
community_fetched_at: 2026-07-14T14:40:33.383Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Message",
          "value": "message"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "normal",
      "options": [
        {
          "name": "Send Notification",
          "value": "normal",
          "action": "Send a notification",
          "description": "Send a WhatsApp notification to a phone number"
        },
        {
          "name": "Send Group Message",
          "value": "group",
          "action": "Send a group message",
          "description": "Send a message to a WhatsApp group"
        },
        {
          "name": "Send Newsletter",
          "value": "newsletter",
          "action": "Send a newsletter",
          "description": "Send a message to a WhatsApp channel/newsletter"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Notification",
      "value": "normal",
      "action": "Send a notification",
      "description": "Send a WhatsApp notification to a phone number",
      "resource": "message"
    },
    {
      "name": "Send Group Message",
      "value": "group",
      "action": "Send a group message",
      "description": "Send a message to a WhatsApp group",
      "resource": "message"
    },
    {
      "name": "Send Newsletter",
      "value": "newsletter",
      "action": "Send a newsletter",
      "description": "Send a message to a WhatsApp channel/newsletter",
      "resource": "message"
    }
  ]

npm_readme:
  # n8n-nodes-syncmate

  Send WhatsApp messages or media using **SyncMate Assistro API** in n8n workflows.

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

  ---

  ## Features

  - Send text messages via WhatsApp
  - Send images, videos, documents, and other media
  - API Token authentication with Assistro API
  - Designed for **n8n workflows**
  - Easy to integrate into existing automation

  ---

  ## Installation

  ### Install via npm

  ```bash
  npm install n8n-nodes-syncmate

ai_documentation_summary:
  {"purpose":"Send WhatsApp messages and media files using the SyncMate Assistro API within n8n workflows.","capabilities":["Send text messages via WhatsApp","Send images via WhatsApp","Send videos via WhatsApp","Send documents via WhatsApp","Send other media types via WhatsApp"],"authentication":"OAuth2 with Assistro API","commonUseCases":["Automated customer notifications","Order status updates","Appointment reminders","Media sharing in business communication"],"limitations":[],"relatedNodes":["n8n-nodes-whatsapp","n8n-nodes-http-request","n8n-nodes-oauth2"]}


node_type: n8n-nodes-tmpfiles.tmpfiles
package_name: n8n-nodes-tmpfiles
display_name: Tmpfiles
description: Upload files to Tmpfiles and get a temporary URL
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: mookielian
author_github_url: https://github.com/MookieLian/
npm_package_name: n8n-nodes-tmpfiles
npm_version: 2.1.0
community_fetched_at: 2026-07-14T14:40:33.384Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "tmpfiles",
      "options": [
        {
          "name": "Tmpfile",
          "value": "tmpfiles"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload file to tmpfiles"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tmpfiles"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload file to tmpfiles",
      "resource": "tmpfiles"
    }
  ]

npm_readme:
  # n8n-nodes-tmpfiles

  This is an n8n community node for using the `tmpfiles.org` service in your n8n workflows. It uploads a binary file and returns a temporary download URL.

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

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

  ---

  Profile: https://gravatar.com/mookielian

  ---

  ## Installation

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

  Quick steps:

  1. In n8n UI → Settings → Community Nodes → Install a community node
  2. Package name: `n8n-nodes-tmpfiles`
  3. Click Install and restart n8n if prompted

  For self-hosted CLI:

  ```bash
  npm install n8n-nodes-tmpfiles
  ```

  ## Supported Operations

  - Upload File: Accepts a binary field, uploads it to `tmpfiles.org` API, and returns a temporary URL.

  ## Credentials

  - Not required. `tmpfiles.org` does not require authentication.

  ## Compatibility

  - n8n Nodes API Version: 1
  - Tested with current n8n versions. No known incompatibilities.

  ## Usage

  1. Add the `Tmpfiles` node to your workflow.
  2. Set `Input Data Field Name` to the name of your binary property (e.g., `data`).
  3. Execute the node; the output contains the temporary URL of the uploaded file.

  Tip: Chain this after a node that provides binary data (e.g., HTTP Request / Read Binary File).

  ## Resources

  - [n8n community nodes docs](https://docs.n8n.io/integrations/#community-nodes)
  - `tmpfiles.org` API: `https://tmpfiles.org/api/v1/upload`

  ## Version History

  - 0.1.0: Initial release

ai_documentation_summary:
  {"purpose":"Uploads binary files to the tmpfiles.org service and returns a temporary download URL for sharing or temporary storage.","capabilities":["Upload binary files to tmpfiles.org","Generate temporary download URLs","Accept binary data from input fields","Return temporary URL as output"],"authentication":"None","commonUseCases":["Temporary file sharing","Storing large files temporarily","Workflow intermediate file storage","File distribution without permanent hosting"],"limitations":["URLs are temporary and may expire","File size limits apply to tmpfiles.org service","No authentication or access control","Files are not permanently stored"],"relatedNodes":["HTTP Request","Read Binary File","Binary File","Webhook"]}


node_type: n8n-nodes-starfish.campingCare
package_name: n8n-nodes-starfish
display_name: Starfish (CampingCare/HotelCare)
description: Interact with the Starfish API for CampingCare and HotelCare
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: developerscampingcare
author_github_url: https://github.com/CampingCare/n8n-node.git
npm_package_name: n8n-nodes-starfish
npm_version: 2.0.2
community_fetched_at: 2026-07-14T14:40:33.385Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Accommodations API",
          "value": "accommodations"
        },
        {
          "name": "Administrations API",
          "value": "administrations"
        },
        {
          "name": "Availability API",
          "value": "availability"
        },
        {
          "name": "Categories API",
          "value": "categories"
        },
        {
          "name": "Contacts API",
          "value": "contacts"
        },
        {
          "name": "Exchange Rates API",
          "value": "exchangeRates"
        },
        {
          "name": "Invoices API",
          "value": "invoices"
        },
        {
          "name": "Kiosks API",
          "value": "kiosks"
        },
        {
          "name": "Ledgers API",
          "value": "ledgers"
        },
        {
          "name": "License Plates API",
          "value": "licensePlates"
        },
        {
          "name": "Logs API",
          "value": "logs"
        },
        {
          "name": "Price Calculation API",
          "value": "priceCalculation"
        },
        {
          "name": "Products API",
          "value": "products"
        },
        {
          "name": "Rates API",
          "value": "rates"
        },
        {
          "name": "Reservations API",
          "value": "reservations"
        },
        {
          "name": "Tags API",
          "value": "tags"
        },
        {
          "name": "Timezones API",
          "value": "timezones"
        },
        {
          "name": "Users API",
          "value": "users"
        },
        {
          "name": "Widgets API",
          "value": "widgets"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAccommodations",
      "options": [
        {
          "name": "Places",
          "value": "places",
          "action": "Places",
          "description": "Manage accommodation places"
        },
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage accommodation meta information"
        },
        {
          "name": "Get Accommodations",
          "value": "getAccommodations",
          "action": "Get accommodations",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
                "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "get_services": "={{ $parameter[\"get_services\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "/accommodations",
              "method": "GET"
            }
          },
          "description": "You can get your accommodations with the get accommodations method"
        },
        {
          "name": "Get Accommodation",
          "value": "getAccommodation",
          "action": "Get accommodation",
          "routing": {
            "request": {
              "qs": {
                "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
              "method": "GET"
            }
          },
          "description": "With this method you can retreive a single accommodation"
        },
        {
          "name": "Add Accommodation",
          "value": "addAccommodation",
          "action": "Add accommodation",
          "routing": {
            "request": {
              "url": "/accommodations",
              "body": {
                "name": "={{ $parameter[\"name\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "With this method you can add a new accommodation"
        },
        {
          "name": "Update Accommodation",
          "value": "updateAccommodation",
          "action": "Update accommodation",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"update_name\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
              },
              "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "With this method you can update an existing accommodation"
        },
        {
          "name": "Delete Accommodation",
          "value": "deleteAccommodation",
          "action": "Delete accommodation",
          "routing": {
            "request": {
              "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "With this method you can delete a single accommodation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "accommodations"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAdministrations",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage administration meta information"
        },
        {
          "name": "Age Tables",
          "value": "ageTables",
          "action": "Age tables",
          "description": "Get age tables for an administration"
        },
        {
          "name": "Get Places",
          "value": "getPlaces",
          "action": "Get places",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
              },
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}/places",
              "method": "GET"
            }
          },
          "description": "Get places for a specific administration"
        },
        {
          "name": "Get Administrations",
          "value": "getAdministrations",
          "action": "Get administrations",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}",
                "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
                "get_accommodations": "={{ $parameter[\"get_accommodations\"] || undefined }}"
              },
              "url": "/administrations",
              "method": "GET"
            }
          },
          "description": "You can retrieve the administrations of a specific user"
        },
        {
          "name": "Get Administration",
          "value": "getAdministration",
          "action": "Get administration",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}",
                "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
                "get_vat_tables": "={{ $parameter[\"get_vat_tables\"] || undefined }}"
              },
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single administration by id"
        },
        {
          "name": "Update Administration",
          "value": "updateAdministration",
          "action": "Update administration",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"update_name\"] || undefined }}"
              },
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update an administration by id"
        },
        {
          "name": "Add Administration",
          "value": "addAdministration",
          "action": "Add administration",
          "routing": {
            "request": {
              "url": "/administrations",
              "body": {
                "name": "={{ $parameter[\"name\"] }}",
                "type": "={{ $parameter[\"type\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new administration (full PMS or lite version)"
        },
        {
          "name": "Delete Administration",
          "value": "deleteAdministration",
          "action": "Delete administration",
          "routing": {
            "request": {
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete an administration by id"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "administrations"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStock",
      "options": [
        {
          "name": "Get Stock",
          "value": "getStock",
          "action": "Get stock",
          "routing": {
            "request": {
              "qs": {
                "from": "={{ $parameter[\"from\"] || undefined }}",
                "till": "={{ $parameter[\"till\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
              },
              "url": "/availability/stock",
              "method": "GET"
            }
          },
          "description": "Get availability stock for an accommodation"
        },
        {
          "name": "Get Places",
          "value": "getPlaces",
          "action": "Get places",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "backend": "={{ $parameter[\"backend\"] || undefined }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
              },
              "url": "/availability/places",
              "method": "GET"
            }
          },
          "description": "Get available places"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "availability"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getCategories",
      "options": [
        {
          "name": "Get Categories",
          "value": "getCategories",
          "action": "Get categories",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
                "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
                "status[2]": "={{ $parameter[\"status_2\"] || undefined }}"
              },
              "url": "/categories",
              "method": "GET"
            }
          },
          "description": "Get a list of categories from the system"
        },
        {
          "name": "Get Category",
          "value": "getCategory",
          "action": "Get category",
          "routing": {
            "request": {
              "url": "=/categories/{{$parameter[\"category_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single category by ID"
        },
        {
          "name": "Add Category",
          "value": "addCategory",
          "action": "Add category",
          "routing": {
            "request": {
              "url": "/categories",
              "body": {
                "name": "={{ $parameter[\"name\"] }}",
                "description": "={{ $parameter[\"description\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new category to the system"
        },
        {
          "name": "Update Category",
          "value": "updateCategory",
          "action": "Update category",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"update_name\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "description": "={{ $parameter[\"update_description\"] || undefined }}"
              },
              "url": "=/categories/{{$parameter[\"category_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update the category in the system"
        },
        {
          "name": "Delete Category",
          "value": "deleteCategory",
          "action": "Delete category",
          "routing": {
            "request": {
              "url": "=/categories/{{$parameter[\"category_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a category from the system"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "categories"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getContacts",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage contact meta information"
        },
        {
          "name": "Get Contacts",
          "value": "getContacts",
          "action": "Get contacts",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
              },
              "url": "/contacts",
              "method": "GET"
            }
          },
          "description": "Get a list of contacts for this administration"
        },
        {
          "name": "Get Contact",
          "value": "getContact",
          "action": "Get contact",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
              },
              "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single contact by id"
        },
        {
          "name": "Add Contact",
          "value": "addContact",
          "action": "Add contact",
          "routing": {
            "request": {
              "url": "/contacts",
              "body": {
                "city": "={{ $parameter[\"city\"] || undefined }}",
                "meta": "={{ $parameter[\"extraFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "email": "={{ $parameter[\"email\"] || undefined }}",
                "id_nr": "={{ $parameter[\"id_nr\"] || undefined }}",
                "phone": "={{ $parameter[\"phone\"] || undefined }}",
                "state": "={{ $parameter[\"state\"] || undefined }}",
                "gender": "={{ $parameter[\"gender\"] || undefined }}",
                "address": "={{ $parameter[\"address\"] || undefined }}",
                "company": "={{ $parameter[\"company\"] || undefined }}",
                "country": "={{ $parameter[\"country\"] || undefined }}",
                "id_type": "={{ $parameter[\"id_type\"] || undefined }}",
                "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
                "birthday": "={{ $parameter[\"birthday\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
                "vat_number": "={{ $parameter[\"vat_number\"] || undefined }}",
                "phone_mobile": "={{ $parameter[\"phone_mobile\"] || undefined }}",
                "address_number": "={{ $parameter[\"address_number\"] || undefined }}",
                "country_origin": "={{ $parameter[\"country_origin\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty contact or add parameters to a contact"
        },
        {
          "name": "Update Contact",
          "value": "updateContact",
          "action": "Update contact",
          "routing": {
            "request": {
              "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
              "body": {
                "city": "={{ $parameter[\"city\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "phone": "={{ $parameter[\"phone\"] || undefined }}",
                "gender": "={{ $parameter[\"gender\"] || undefined }}",
                "address": "={{ $parameter[\"address\"] || undefined }}",
                "company": "={{ $parameter[\"company\"] || undefined }}",
                "country": "={{ $parameter[\"country\"] || undefined }}",
                "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
                "address_number": "={{ $parameter[\"address_number\"] || undefined }}"
              },
              "method": "PUT"
            }
          },
          "description": "Update a contact, only provided parameters will be updated"
        },
        {
          "name": "Delete Contact",
          "value": "deleteContact",
          "action": "Delete contact",
          "routing": {
            "request": {
              "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a contact from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contacts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getExchangeRates",
      "options": [
        {
          "name": "Get Exchange Rates",
          "value": "getExchangeRates",
          "action": "Get exchange rates",
          "routing": {
            "request": {
              "qs": {
                "date": "={{ $parameter[\"date\"] || undefined }}",
                "source_currency": "={{ $parameter[\"source_currency\"] || undefined }}",
                "converted_currency": "={{ $parameter[\"converted_currency\"] || undefined }}"
              },
              "url": "/exchange_rates",
              "method": "GET"
            }
          },
          "description": "Get a list of exchange rates with optional filters"
        },
        {
          "name": "Exchange Value",
          "value": "exchangeValue",
          "action": "Exchange value",
          "routing": {
            "request": {
              "qs": {
                "value": "={{ $parameter[\"value\"] }}",
                "source_currency": "={{ $parameter[\"source_currency\"] }}",
                "converted_currency": "={{ $parameter[\"converted_currency\"] }}"
              },
              "url": "/exchange_rates/exchange_value",
              "method": "GET"
            }
          },
          "description": "Exchange a value from one currency to another"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "exchangeRates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getInvoices",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage invoice meta information"
        },
        {
          "name": "Get Invoices",
          "value": "getInvoices",
          "action": "Get invoices",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "invoice_id": "={{ $parameter[\"invoice_id_filter\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
                "create_date[0]": "={{ $parameter[\"create_date_from\"] || undefined }}",
                "create_date[1]": "={{ $parameter[\"create_date_to\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
                "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}"
              },
              "url": "/invoices",
              "method": "GET"
            }
          },
          "description": "Get a list of invoices for this administration"
        },
        {
          "name": "Get Invoice",
          "value": "getInvoice",
          "action": "Get invoice",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
                "get_vat_totals": "={{ $parameter[\"get_vat_totals\"] || undefined }}",
                "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_contact_meta": "={{ $parameter[\"get_contact_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "get_reservation_meta": "={{ $parameter[\"get_reservation_meta\"] || undefined }}"
              },
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single invoice by id"
        },
        {
          "name": "Add Invoice",
          "value": "addInvoice",
          "action": "Add invoice",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "url": "/invoices",
              "method": "POST"
            }
          },
          "description": "Add a new empty concept email to the administration"
        },
        {
          "name": "Update Invoice",
          "value": "updateInvoice",
          "action": "Update invoice",
          "routing": {
            "request": {
              "qs": {
                "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a invoice contact"
        },
        {
          "name": "Delete Invoice",
          "value": "deleteInvoice",
          "action": "Delete invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Remove a invoice from the administration"
        },
        {
          "name": "Finalize Invoice",
          "value": "finalizeInvoice",
          "action": "Finalize invoice",
          "routing": {
            "request": {
              "qs": {
                "delay": "={{ $parameter[\"delay\"] || undefined }}"
              },
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/finalize",
              "method": "POST"
            }
          },
          "description": "Invoices are started in status concept a can be changed"
        },
        {
          "name": "Cancel Delayed Finalized Invoice",
          "value": "cancelDelayedFinalizedInvoice",
          "action": "Cancel delayed finalized invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/cancel_finalize",
              "method": "POST"
            }
          },
          "description": "Invoices are started in status concept a can be changed"
        },
        {
          "name": "Create Credit",
          "value": "createCredit",
          "action": "Create credit",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/credit",
              "method": "POST"
            }
          },
          "description": "Create a credit note for an invoice"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invoices"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getKiosks",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage kiosk meta information"
        },
        {
          "name": "Get Kiosks",
          "value": "getKiosks",
          "action": "Get kiosks",
          "routing": {
            "request": {
              "url": "/kiosks",
              "method": "GET"
            }
          },
          "description": "Get a list of kiosks for this administration"
        },
        {
          "name": "Get Kiosk",
          "value": "getKiosk",
          "action": "Get kiosk",
          "routing": {
            "request": {
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single kiosk by id"
        },
        {
          "name": "Update Kiosk",
          "value": "updateKiosk",
          "action": "Update kiosk",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] || undefined }}"
              },
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a kiosk, only provided parameters will be updated"
        },
        {
          "name": "Add Kiosk",
          "value": "addKiosk",
          "action": "Add kiosk",
          "routing": {
            "request": {
              "url": "/kiosks",
              "body": {
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "brand": "={{ $parameter[\"brand\"] || undefined }}",
                "api_key_id": "={{ $parameter[\"api_key_id\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty kiosk or add parameters to a kiosk"
        },
        {
          "name": "Delete Kiosk",
          "value": "deleteKiosk",
          "action": "Delete kiosk",
          "routing": {
            "request": {
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a kiosk from the administration by ID"
        },
        {
          "name": "Install Kiosk",
          "value": "installKiosk",
          "action": "Install kiosk",
          "routing": {
            "request": {
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}/install",
              "method": "POST"
            }
          },
          "description": "Installs a kiosk from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "kiosks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getLedgers",
      "options": [
        {
          "name": "Get Ledgers",
          "value": "getLedgers",
          "action": "Get ledgers",
          "routing": {
            "request": {
              "url": "/ledgers",
              "method": "GET"
            }
          },
          "description": "Get a list of ledgers for this administration"
        },
        {
          "name": "Get Ledger",
          "value": "getLedger",
          "action": "Get ledger",
          "routing": {
            "request": {
              "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single ledger by id"
        },
        {
          "name": "Add Ledger",
          "value": "addLedger",
          "action": "Add ledger",
          "routing": {
            "request": {
              "url": "/ledgers",
              "body": {
                "name": "={{ $parameter[\"name\"] }}",
                "type": "={{ $parameter[\"type\"] }}",
                "number": "={{ $parameter[\"number\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new ledger to the administration"
        },
        {
          "name": "Update Ledger",
          "value": "updateLedger",
          "action": "Update ledger",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "number": "={{ $parameter[\"number\"] || undefined }}"
              },
              "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a ledger, only provided parameters will be updated"
        },
        {
          "name": "Delete Ledger",
          "value": "deleteLedger",
          "action": "Delete ledger",
          "routing": {
            "request": {
              "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a ledger from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ledgers"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getLicensePlates",
      "options": [
        {
          "name": "Get License Plates",
          "value": "getLicensePlates",
          "action": "Get license plates",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "force_dates": "={{ $parameter[\"force_dates\"] || undefined }}",
                "license_plate": "={{ $parameter[\"license_plate\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
                "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
                "end_date_operator": "={{ $parameter[\"end_date_operator\"] || undefined }}",
                "start_date_operator": "={{ $parameter[\"start_date_operator\"] || undefined }}"
              },
              "url": "/license_plates",
              "method": "GET"
            }
          },
          "description": "Get a list of license plates from the system"
        },
        {
          "name": "Get License Plate",
          "value": "getLicensePlate",
          "action": "Get license plate",
          "routing": {
            "request": {
              "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single license plate by ID"
        },
        {
          "name": "Check Valid License Plate",
          "value": "checkValidLicensePlate",
          "action": "Check valid license plate",
          "routing": {
            "request": {
              "qs": {
                "plate": "={{ $parameter[\"plate\"] || undefined }}"
              },
              "url": "/license_plates/check_plate",
              "method": "GET"
            }
          },
          "description": "Validate a license plate"
        },
        {
          "name": "Add License Plate",
          "value": "addLicensePlate",
          "action": "Add license plate",
          "routing": {
            "request": {
              "url": "/license_plates",
              "body": {
                "plate": "={{ $parameter[\"plate\"] }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new license plate"
        },
        {
          "name": "Update License Plate",
          "value": "updateLicensePlate",
          "action": "Update license plate",
          "routing": {
            "request": {
              "qs": {
                "plate": "={{ $parameter[\"plate\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing license plate"
        },
        {
          "name": "Delete License Plate",
          "value": "deleteLicensePlate",
          "action": "Delete license plate",
          "routing": {
            "request": {
              "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a license plate by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "licensePlates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getLogs",
      "options": [
        {
          "name": "Get Logs",
          "value": "getLogs",
          "action": "Get logs",
          "routing": {
            "request": {
              "url": "/api/logs",
              "method": "GET"
            }
          },
          "description": "Get a list of log entries"
        },
        {
          "name": "Add Log",
          "value": "addLog",
          "action": "Add log",
          "routing": {
            "request": {
              "url": "/logs",
              "body": {
                "type": "={{ $parameter[\"type\"] }}",
                "type_id": "={{ $parameter[\"type_id\"] }}",
                "severity": "={{ $parameter[\"severity\"] }}",
                "description": "={{ $parameter[\"description\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new log entry"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "logs"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "calculatePrice",
      "options": [
        {
          "name": "Price Calculation",
          "value": "calculatePrice",
          "action": "Calculate price",
          "routing": {
            "request": {
              "qs": {
                "code": "={{ $parameter[\"code\"] || undefined }}",
                "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
                "card_id": "={{ $parameter[\"card_id\"] || undefined }}",
                "persons": "={{ $parameter[\"persons\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
                "timezone": "={{ $parameter[\"timezone\"] || undefined }}",
                "departure": "={{ $parameter[\"departure\"] || undefined }}",
                "age_tables": "={{ $parameter[\"age_tables\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "get_deposit": "={{ $parameter[\"get_deposit\"] || undefined }}",
                "get_options": "={{ $parameter[\"get_options\"] || undefined }}",
                "timeslot_id": "={{ $parameter[\"timeslot_id\"] || undefined }}",
                "birth_tables": "={{ $parameter[\"birth_tables\"] || undefined }}",
                "history_date": "={{ $parameter[\"history_date\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
                "get_taxes_price": "={{ $parameter[\"get_taxes_price\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
                "get_guests_price": "={{ $parameter[\"get_guests_price\"] || undefined }}",
                "search_alternative": "={{ $parameter[\"search_alternative\"] || undefined }}",
                "get_discounts_price": "={{ $parameter[\"get_discounts_price\"] || undefined }}",
                "get_available_places": "={{ $parameter[\"get_available_places\"] || undefined }}",
                "get_required_options_price": "={{ $parameter[\"get_required_options_price\"] || undefined }}"
              },
              "url": "/price_calculation",
              "method": "GET"
            }
          },
          "description": "With the price calculation API you can calculate a price"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "priceCalculation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getProducts",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage product meta information"
        },
        {
          "name": "Get Products",
          "value": "getProducts",
          "action": "Get products",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "deal_id": "={{ $parameter[\"deal_id\"] || undefined }}",
                "category": "={{ $parameter[\"category\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "/products",
              "method": "GET"
            }
          },
          "description": "Get a list of products for this administration"
        },
        {
          "name": "Get Product",
          "value": "getProduct",
          "action": "Get product",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "=/products/{{$parameter[\"product_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single product by id"
        },
        {
          "name": "Update Product",
          "value": "updateProduct",
          "action": "Update product",
          "routing": {
            "request": {
              "qs": {
                "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "category": "={{ $parameter[\"category\"] || undefined }}",
                "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
                "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
              },
              "url": "=/products/{{$parameter[\"product_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a product, only provided parameters will be updated"
        },
        {
          "name": "Add Product",
          "value": "addProduct",
          "action": "Add product",
          "routing": {
            "request": {
              "url": "/products",
              "body": {
                "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "category": "={{ $parameter[\"category\"] || undefined }}",
                "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
                "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty product or add parameters to a product"
        },
        {
          "name": "Delete Product",
          "value": "deleteProduct",
          "action": "Delete product",
          "routing": {
            "request": {
              "url": "=/products/{{$parameter[\"product_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a product from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "products"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getRates",
      "options": [
        {
          "name": "Prices",
          "value": "prices",
          "action": "Prices",
          "description": "HTTP methods for prices of a rate"
        },
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "HTTP methods for meta of a rate"
        },
        {
          "name": "Get Rates",
          "value": "getRates",
          "action": "Get rates",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}"
              },
              "url": "/rates",
              "method": "GET"
            }
          },
          "description": "Get a list of rates"
        },
        {
          "name": "Get Rate",
          "value": "getRate",
          "action": "Get rate",
          "routing": {
            "request": {
              "url": "=/rates/{{$parameter[\"rate_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single rate by ID"
        },
        {
          "name": "Update Rate",
          "value": "updateRate",
          "action": "Update rate",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "closed": "={{ $parameter[\"closed\"] !== undefined && $parameter[\"closed\"] !== \"\" ? $parameter[\"closed\"] : undefined }}",
                "rules[0]": "={{ $parameter[\"rules\"]?.table ? ( Array.isArray($parameter[\"rules\"].table) ? JSON.stringify({ type: $parameter[\"rules\"].table[0].type, amount: String($parameter[\"rules\"].table[0].amount) }) : JSON.stringify({ type: $parameter[\"rules\"].table.type, amount: String($parameter[\"rules\"].table.amount) }) ) : undefined }}",
                "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}",
                "maximum_stay": "={{ $parameter[\"maximum_stay\"] || undefined }}",
                "minimum_stay": "={{ $parameter[\"minimum_stay\"] || undefined }}"
              },
              "url": "=/rates/{{$parameter[\"rate_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing rate"
        },
        {
          "name": "Add Rate",
          "value": "addRate",
          "action": "Add rate",
          "routing": {
            "request": {
              "url": "/rates",
              "body": "={{ Object.assign({}, ( $parameter.name ? { name: $parameter.name } : {} ), ( $parameter.status ? { status: $parameter.status } : {} ), ( $parameter.parent_id ? { parent_id: $parameter.parent_id } : {} ), ( $parameter.closed !== undefined && $parameter.closed !== \"\" ? { closed: $parameter.closed } : {} ), ( $parameter.minimum_stay ? { minimum_stay: $parameter.minimum_stay } : {} ), ( $parameter.maximum_stay ? { maximum_stay: $parameter.maximum_stay } : {} ), ($parameter.rules?.table ? { rules: (Array.isArray($parameter.rules.table) ? $parameter.rules.table.map(r => ({ type: r.type, amount: String(r.amount) })) : [{ type: $parameter.rules.table.type, amount: String($parameter.rules.table.amount) }]) } : {}) ) }}",
              "method": "POST"
            }
          },
          "description": "Create a new rate"
        },
        {
          "name": "Delete Rate",
          "value": "deleteRate",
          "action": "Delete rate",
          "routing": {
            "request": {
              "url": "=/rates/{{$parameter[\"rate_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a rate by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "rates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getReservations",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage reservation meta information"
        },
        {
          "name": "Get Reservations",
          "value": "getReservations",
          "action": "Get reservations",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
                "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "group_id": "={{ $parameter[\"group_id\"] || undefined }}",
                "meta_key": "={{ $parameter[\"meta_key\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
                "departure": "={{ $parameter[\"departure\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
                "meta_value": "={{ $parameter[\"meta_value\"] || undefined }}",
                "create_date": "={{ $parameter[\"create_date\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "last_modified": "={{ $parameter[\"last_modified\"] || undefined }}",
                "meta_operator": "={{ $parameter[\"meta_operator\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
                "arrival_operator": "={{ $parameter[\"arrival_operator\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "departure_operator": "={{ $parameter[\"departure_operator\"] || undefined }}",
                "get_invoice_payment": "={{ $parameter[\"get_invoice_payment\"] || undefined }}",
                "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "last_modified_operator": "={{ $parameter[\"last_modified_operator\"] || undefined }}"
              },
              "url": "/reservations",
              "method": "GET"
            }
          },
          "description": "You have a lot of possibilities to get information about multiple reservations"
        },
        {
          "name": "Get Reservation",
          "value": "getReservation",
          "action": "Get reservation",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "get_booker": "={{ $parameter[\"get_booker\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_co_travelers": "={{ $parameter[\"get_co_travelers\"] || undefined }}",
                "get_invoice_meta": "={{ $parameter[\"get_invoice_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "get_invoice_rowsfilter": "={{ $parameter[\"get_invoice_rowsfilter\"] || undefined }}"
              },
              "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
              "method": "GET"
            }
          },
          "description": "You also can get the individual reservation, it is possible to get extra data on the reservation when needed"
        },
        {
          "name": "Create Reservation",
          "value": "createReservation",
          "action": "Create reservation",
          "description": "Create a reservation using different methods"
        },
        {
          "name": "Delete Reservation",
          "value": "deleteReservation",
          "action": "Delete reservation",
          "routing": {
            "request": {
              "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a reservation by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reservations"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTags",
      "options": [
        {
          "name": "Get Tags",
          "value": "getTags",
          "action": "Get tags",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}"
              },
              "url": "/tags",
              "method": "GET"
            }
          },
          "description": "Get a list of tags"
        },
        {
          "name": "Get Tag",
          "value": "getTag",
          "action": "Get tag",
          "routing": {
            "request": {
              "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
              "method": "GET"
            }
          },
          "description": "Get a single tag by ID"
        },
        {
          "name": "Add Tag",
          "value": "addTag",
          "action": "Add tag",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] }}"
              },
              "url": "/tags",
              "method": "POST"
            }
          },
          "description": "Add a new tag"
        },
        {
          "name": "Delete Tag",
          "value": "deleteTag",
          "action": "Delete tag",
          "routing": {
            "request": {
              "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
              "method": "DELETE"
            }
          },
          "description": "Delete a tag by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tags"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTimezones",
      "options": [
        {
          "name": "Get Timezones",
          "value": "getTimezones",
          "action": "Get timezones",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "country_code": "={{ $parameter[\"country_code\"] || undefined }}"
              },
              "url": "/timezones",
              "method": "GET"
            }
          },
          "description": "Get a list of timezones with optional filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "timezones"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getUsers",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage user meta information"
        },
        {
          "name": "Get Users",
          "value": "getUsers",
          "action": "Get users",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
                "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
              },
              "url": "/users",
              "method": "GET"
            }
          },
          "description": "Get a list of users for this administration"
        },
        {
          "name": "Get User",
          "value": "getUser",
          "action": "Get user",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
                "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
              },
              "url": "=/users/{{$parameter[\"user_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single user by id"
        },
        {
          "name": "Update User",
          "value": "updateUser",
          "action": "Update user",
          "routing": {
            "request": {
              "qs": {
                "email": "={{ $parameter[\"email\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
              },
              "url": "=/users/{{$parameter[\"user_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a user, only provided parameters will be updated"
        },
        {
          "name": "Add User",
          "value": "addUser",
          "action": "Add user",
          "routing": {
            "request": {
              "url": "/users",
              "body": {
                "email": "={{ $parameter[\"email\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty user or add parameters to a user"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "users"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getWidgets",
      "options": [
        {
          "name": "Get Widgets",
          "value": "getWidgets",
          "action": "Get widgets",
          "routing": {
            "request": {
              "qs": {
                "area": "={{ $parameter[\"area\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
              },
              "url": "/widgets",
              "method": "GET"
            }
          },
          "description": "Get a list of widgets for this administration"
        },
        {
          "name": "Get Widget",
          "value": "getWidget",
          "action": "Get widget",
          "routing": {
            "request": {
              "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single widget by id"
        },
        {
          "name": "Add Widget",
          "value": "addWidget",
          "action": "Add widget",
          "routing": {
            "request": {
              "url": "/widgets",
              "body": {
                "url": "={{ $parameter[\"url\"] || undefined }}",
                "area": "={{ $parameter[\"area\"] || undefined }}",
                "data": "={{ $parameter[\"data\"] || undefined }}",
                "app_id": "={{ $parameter[\"app_id\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty widget or add parameters to a widget"
        },
        {
          "name": "Delete Widget",
          "value": "deleteWidget",
          "action": "Delete widget",
          "routing": {
            "request": {
              "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a widget by id"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "widgets"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Places",
      "value": "places",
      "action": "Places",
      "description": "Manage accommodation places",
      "resource": "accommodations"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage accommodation meta information",
      "resource": "accommodations"
    },
    {
      "name": "Get Accommodations",
      "value": "getAccommodations",
      "action": "Get accommodations",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
            "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "get_services": "={{ $parameter[\"get_services\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "/accommodations",
          "method": "GET"
        }
      },
      "description": "You can get your accommodations with the get accommodations method",
      "resource": "accommodations"
    },
    {
      "name": "Get Accommodation",
      "value": "getAccommodation",
      "action": "Get accommodation",
      "routing": {
        "request": {
          "qs": {
            "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
          "method": "GET"
        }
      },
      "description": "With this method you can retreive a single accommodation",
      "resource": "accommodations"
    },
    {
      "name": "Add Accommodation",
      "value": "addAccommodation",
      "action": "Add accommodation",
      "routing": {
        "request": {
          "url": "/accommodations",
          "body": {
            "name": "={{ $parameter[\"name\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "With this method you can add a new accommodation",
      "resource": "accommodations"
    },
    {
      "name": "Update Accommodation",
      "value": "updateAccommodation",
      "action": "Update accommodation",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"update_name\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
          },
          "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "With this method you can update an existing accommodation",
      "resource": "accommodations"
    },
    {
      "name": "Delete Accommodation",
      "value": "deleteAccommodation",
      "action": "Delete accommodation",
      "routing": {
        "request": {
          "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "With this method you can delete a single accommodation",
      "resource": "accommodations"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage administration meta information",
      "resource": "administrations"
    },
    {
      "name": "Age Tables",
      "value": "ageTables",
      "action": "Age tables",
      "description": "Get age tables for an administration",
      "resource": "administrations"
    },
    {
      "name": "Get Places",
      "value": "getPlaces",
      "action": "Get places",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
          },
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}/places",
          "method": "GET"
        }
      },
      "description": "Get places for a specific administration",
      "resource": "administrations"
    },
    {
      "name": "Get Administrations",
      "value": "getAdministrations",
      "action": "Get administrations",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}",
            "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
            "get_accommodations": "={{ $parameter[\"get_accommodations\"] || undefined }}"
          },
          "url": "/administrations",
          "method": "GET"
        }
      },
      "description": "You can retrieve the administrations of a specific user",
      "resource": "administrations"
    },
    {
      "name": "Get Administration",
      "value": "getAdministration",
      "action": "Get administration",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}",
            "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
            "get_vat_tables": "={{ $parameter[\"get_vat_tables\"] || undefined }}"
          },
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single administration by id",
      "resource": "administrations"
    },
    {
      "name": "Update Administration",
      "value": "updateAdministration",
      "action": "Update administration",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"update_name\"] || undefined }}"
          },
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update an administration by id",
      "resource": "administrations"
    },
    {
      "name": "Add Administration",
      "value": "addAdministration",
      "action": "Add administration",
      "routing": {
        "request": {
          "url": "/administrations",
          "body": {
            "name": "={{ $parameter[\"name\"] }}",
            "type": "={{ $parameter[\"type\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new administration (full PMS or lite version)",
      "resource": "administrations"
    },
    {
      "name": "Delete Administration",
      "value": "deleteAdministration",
      "action": "Delete administration",
      "routing": {
        "request": {
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete an administration by id",
      "resource": "administrations"
    },
    {
      "name": "Get Stock",
      "value": "getStock",
      "action": "Get stock",
      "routing": {
        "request": {
          "qs": {
            "from": "={{ $parameter[\"from\"] || undefined }}",
            "till": "={{ $parameter[\"till\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
          },
          "url": "/availability/stock",
          "method": "GET"
        }
      },
      "description": "Get availability stock for an accommodation",
      "resource": "availability"
    },
    {
      "name": "Get Places",
      "value": "getPlaces",
      "action": "Get places",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "backend": "={{ $parameter[\"backend\"] || undefined }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
          },
          "url": "/availability/places",
          "method": "GET"
        }
      },
      "description": "Get available places",
      "resource": "availability"
    },
    {
      "name": "Get Categories",
      "value": "getCategories",
      "action": "Get categories",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
            "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
            "status[2]": "={{ $parameter[\"status_2\"] || undefined }}"
          },
          "url": "/categories",
          "method": "GET"
        }
      },
      "description": "Get a list of categories from the system",
      "resource": "categories"
    },
    {
      "name": "Get Category",
      "value": "getCategory",
      "action": "Get category",
      "routing": {
        "request": {
          "url": "=/categories/{{$parameter[\"category_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single category by ID",
      "resource": "categories"
    },
    {
      "name": "Add Category",
      "value": "addCategory",
      "action": "Add category",
      "routing": {
        "request": {
          "url": "/categories",
          "body": {
            "name": "={{ $parameter[\"name\"] }}",
            "description": "={{ $parameter[\"description\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new category to the system",
      "resource": "categories"
    },
    {
      "name": "Update Category",
      "value": "updateCategory",
      "action": "Update category",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"update_name\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "description": "={{ $parameter[\"update_description\"] || undefined }}"
          },
          "url": "=/categories/{{$parameter[\"category_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update the category in the system",
      "resource": "categories"
    },
    {
      "name": "Delete Category",
      "value": "deleteCategory",
      "action": "Delete category",
      "routing": {
        "request": {
          "url": "=/categories/{{$parameter[\"category_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a category from the system",
      "resource": "categories"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage contact meta information",
      "resource": "contacts"
    },
    {
      "name": "Get Contacts",
      "value": "getContacts",
      "action": "Get contacts",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
          },
          "url": "/contacts",
          "method": "GET"
        }
      },
      "description": "Get a list of contacts for this administration",
      "resource": "contacts"
    },
    {
      "name": "Get Contact",
      "value": "getContact",
      "action": "Get contact",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
          },
          "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single contact by id",
      "resource": "contacts"
    },
    {
      "name": "Add Contact",
      "value": "addContact",
      "action": "Add contact",
      "routing": {
        "request": {
          "url": "/contacts",
          "body": {
            "city": "={{ $parameter[\"city\"] || undefined }}",
            "meta": "={{ $parameter[\"extraFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "email": "={{ $parameter[\"email\"] || undefined }}",
            "id_nr": "={{ $parameter[\"id_nr\"] || undefined }}",
            "phone": "={{ $parameter[\"phone\"] || undefined }}",
            "state": "={{ $parameter[\"state\"] || undefined }}",
            "gender": "={{ $parameter[\"gender\"] || undefined }}",
            "address": "={{ $parameter[\"address\"] || undefined }}",
            "company": "={{ $parameter[\"company\"] || undefined }}",
            "country": "={{ $parameter[\"country\"] || undefined }}",
            "id_type": "={{ $parameter[\"id_type\"] || undefined }}",
            "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
            "birthday": "={{ $parameter[\"birthday\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
            "vat_number": "={{ $parameter[\"vat_number\"] || undefined }}",
            "phone_mobile": "={{ $parameter[\"phone_mobile\"] || undefined }}",
            "address_number": "={{ $parameter[\"address_number\"] || undefined }}",
            "country_origin": "={{ $parameter[\"country_origin\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty contact or add parameters to a contact",
      "resource": "contacts"
    },
    {
      "name": "Update Contact",
      "value": "updateContact",
      "action": "Update contact",
      "routing": {
        "request": {
          "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
          "body": {
            "city": "={{ $parameter[\"city\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "phone": "={{ $parameter[\"phone\"] || undefined }}",
            "gender": "={{ $parameter[\"gender\"] || undefined }}",
            "address": "={{ $parameter[\"address\"] || undefined }}",
            "company": "={{ $parameter[\"company\"] || undefined }}",
            "country": "={{ $parameter[\"country\"] || undefined }}",
            "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
            "address_number": "={{ $parameter[\"address_number\"] || undefined }}"
          },
          "method": "PUT"
        }
      },
      "description": "Update a contact, only provided parameters will be updated",
      "resource": "contacts"
    },
    {
      "name": "Delete Contact",
      "value": "deleteContact",
      "action": "Delete contact",
      "routing": {
        "request": {
          "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a contact from the administration by ID",
      "resource": "contacts"
    },
    {
      "name": "Get Exchange Rates",
      "value": "getExchangeRates",
      "action": "Get exchange rates",
      "routing": {
        "request": {
          "qs": {
            "date": "={{ $parameter[\"date\"] || undefined }}",
            "source_currency": "={{ $parameter[\"source_currency\"] || undefined }}",
            "converted_currency": "={{ $parameter[\"converted_currency\"] || undefined }}"
          },
          "url": "/exchange_rates",
          "method": "GET"
        }
      },
      "description": "Get a list of exchange rates with optional filters",
      "resource": "exchangeRates"
    },
    {
      "name": "Exchange Value",
      "value": "exchangeValue",
      "action": "Exchange value",
      "routing": {
        "request": {
          "qs": {
            "value": "={{ $parameter[\"value\"] }}",
            "source_currency": "={{ $parameter[\"source_currency\"] }}",
            "converted_currency": "={{ $parameter[\"converted_currency\"] }}"
          },
          "url": "/exchange_rates/exchange_value",
          "method": "GET"
        }
      },
      "description": "Exchange a value from one currency to another",
      "resource": "exchangeRates"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage invoice meta information",
      "resource": "invoices"
    },
    {
      "name": "Get Invoices",
      "value": "getInvoices",
      "action": "Get invoices",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "invoice_id": "={{ $parameter[\"invoice_id_filter\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
            "create_date[0]": "={{ $parameter[\"create_date_from\"] || undefined }}",
            "create_date[1]": "={{ $parameter[\"create_date_to\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
            "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}"
          },
          "url": "/invoices",
          "method": "GET"
        }
      },
      "description": "Get a list of invoices for this administration",
      "resource": "invoices"
    },
    {
      "name": "Get Invoice",
      "value": "getInvoice",
      "action": "Get invoice",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
            "get_vat_totals": "={{ $parameter[\"get_vat_totals\"] || undefined }}",
            "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_contact_meta": "={{ $parameter[\"get_contact_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "get_reservation_meta": "={{ $parameter[\"get_reservation_meta\"] || undefined }}"
          },
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single invoice by id",
      "resource": "invoices"
    },
    {
      "name": "Add Invoice",
      "value": "addInvoice",
      "action": "Add invoice",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "url": "/invoices",
          "method": "POST"
        }
      },
      "description": "Add a new empty concept email to the administration",
      "resource": "invoices"
    },
    {
      "name": "Update Invoice",
      "value": "updateInvoice",
      "action": "Update invoice",
      "routing": {
        "request": {
          "qs": {
            "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a invoice contact",
      "resource": "invoices"
    },
    {
      "name": "Delete Invoice",
      "value": "deleteInvoice",
      "action": "Delete invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Remove a invoice from the administration",
      "resource": "invoices"
    },
    {
      "name": "Finalize Invoice",
      "value": "finalizeInvoice",
      "action": "Finalize invoice",
      "routing": {
        "request": {
          "qs": {
            "delay": "={{ $parameter[\"delay\"] || undefined }}"
          },
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/finalize",
          "method": "POST"
        }
      },
      "description": "Invoices are started in status concept a can be changed",
      "resource": "invoices"
    },
    {
      "name": "Cancel Delayed Finalized Invoice",
      "value": "cancelDelayedFinalizedInvoice",
      "action": "Cancel delayed finalized invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/cancel_finalize",
          "method": "POST"
        }
      },
      "description": "Invoices are started in status concept a can be changed",
      "resource": "invoices"
    },
    {
      "name": "Create Credit",
      "value": "createCredit",
      "action": "Create credit",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/credit",
          "method": "POST"
        }
      },
      "description": "Create a credit note for an invoice",
      "resource": "invoices"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage kiosk meta information",
      "resource": "kiosks"
    },
    {
      "name": "Get Kiosks",
      "value": "getKiosks",
      "action": "Get kiosks",
      "routing": {
        "request": {
          "url": "/kiosks",
          "method": "GET"
        }
      },
      "description": "Get a list of kiosks for this administration",
      "resource": "kiosks"
    },
    {
      "name": "Get Kiosk",
      "value": "getKiosk",
      "action": "Get kiosk",
      "routing": {
        "request": {
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single kiosk by id",
      "resource": "kiosks"
    },
    {
      "name": "Update Kiosk",
      "value": "updateKiosk",
      "action": "Update kiosk",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] || undefined }}"
          },
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a kiosk, only provided parameters will be updated",
      "resource": "kiosks"
    },
    {
      "name": "Add Kiosk",
      "value": "addKiosk",
      "action": "Add kiosk",
      "routing": {
        "request": {
          "url": "/kiosks",
          "body": {
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "brand": "={{ $parameter[\"brand\"] || undefined }}",
            "api_key_id": "={{ $parameter[\"api_key_id\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty kiosk or add parameters to a kiosk",
      "resource": "kiosks"
    },
    {
      "name": "Delete Kiosk",
      "value": "deleteKiosk",
      "action": "Delete kiosk",
      "routing": {
        "request": {
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a kiosk from the administration by ID",
      "resource": "kiosks"
    },
    {
      "name": "Install Kiosk",
      "value": "installKiosk",
      "action": "Install kiosk",
      "routing": {
        "request": {
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}/install",
          "method": "POST"
        }
      },
      "description": "Installs a kiosk from the administration by ID",
      "resource": "kiosks"
    },
    {
      "name": "Get Ledgers",
      "value": "getLedgers",
      "action": "Get ledgers",
      "routing": {
        "request": {
          "url": "/ledgers",
          "method": "GET"
        }
      },
      "description": "Get a list of ledgers for this administration",
      "resource": "ledgers"
    },
    {
      "name": "Get Ledger",
      "value": "getLedger",
      "action": "Get ledger",
      "routing": {
        "request": {
          "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single ledger by id",
      "resource": "ledgers"
    },
    {
      "name": "Add Ledger",
      "value": "addLedger",
      "action": "Add ledger",
      "routing": {
        "request": {
          "url": "/ledgers",
          "body": {
            "name": "={{ $parameter[\"name\"] }}",
            "type": "={{ $parameter[\"type\"] }}",
            "number": "={{ $parameter[\"number\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new ledger to the administration",
      "resource": "ledgers"
    },
    {
      "name": "Update Ledger",
      "value": "updateLedger",
      "action": "Update ledger",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "number": "={{ $parameter[\"number\"] || undefined }}"
          },
          "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a ledger, only provided parameters will be updated",
      "resource": "ledgers"
    },
    {
      "name": "Delete Ledger",
      "value": "deleteLedger",
      "action": "Delete ledger",
      "routing": {
        "request": {
          "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a ledger from the administration by ID",
      "resource": "ledgers"
    },
    {
      "name": "Get License Plates",
      "value": "getLicensePlates",
      "action": "Get license plates",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "force_dates": "={{ $parameter[\"force_dates\"] || undefined }}",
            "license_plate": "={{ $parameter[\"license_plate\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
            "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
            "end_date_operator": "={{ $parameter[\"end_date_operator\"] || undefined }}",
            "start_date_operator": "={{ $parameter[\"start_date_operator\"] || undefined }}"
          },
          "url": "/license_plates",
          "method": "GET"
        }
      },
      "description": "Get a list of license plates from the system",
      "resource": "licensePlates"
    },
    {
      "name": "Get License Plate",
      "value": "getLicensePlate",
      "action": "Get license plate",
      "routing": {
        "request": {
          "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single license plate by ID",
      "resource": "licensePlates"
    },
    {
      "name": "Check Valid License Plate",
      "value": "checkValidLicensePlate",
      "action": "Check valid license plate",
      "routing": {
        "request": {
          "qs": {
            "plate": "={{ $parameter[\"plate\"] || undefined }}"
          },
          "url": "/license_plates/check_plate",
          "method": "GET"
        }
      },
      "description": "Validate a license plate",
      "resource": "licensePlates"
    },
    {
      "name": "Add License Plate",
      "value": "addLicensePlate",
      "action": "Add license plate",
      "routing": {
        "request": {
          "url": "/license_plates",
          "body": {
            "plate": "={{ $parameter[\"plate\"] }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new license plate",
      "resource": "licensePlates"
    },
    {
      "name": "Update License Plate",
      "value": "updateLicensePlate",
      "action": "Update license plate",
      "routing": {
        "request": {
          "qs": {
            "plate": "={{ $parameter[\"plate\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing license plate",
      "resource": "licensePlates"
    },
    {
      "name": "Delete License Plate",
      "value": "deleteLicensePlate",
      "action": "Delete license plate",
      "routing": {
        "request": {
          "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a license plate by ID",
      "resource": "licensePlates"
    },
    {
      "name": "Get Logs",
      "value": "getLogs",
      "action": "Get logs",
      "routing": {
        "request": {
          "url": "/api/logs",
          "method": "GET"
        }
      },
      "description": "Get a list of log entries",
      "resource": "logs"
    },
    {
      "name": "Add Log",
      "value": "addLog",
      "action": "Add log",
      "routing": {
        "request": {
          "url": "/logs",
          "body": {
            "type": "={{ $parameter[\"type\"] }}",
            "type_id": "={{ $parameter[\"type_id\"] }}",
            "severity": "={{ $parameter[\"severity\"] }}",
            "description": "={{ $parameter[\"description\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new log entry",
      "resource": "logs"
    },
    {
      "name": "Price Calculation",
      "value": "calculatePrice",
      "action": "Calculate price",
      "routing": {
        "request": {
          "qs": {
            "code": "={{ $parameter[\"code\"] || undefined }}",
            "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
            "card_id": "={{ $parameter[\"card_id\"] || undefined }}",
            "persons": "={{ $parameter[\"persons\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
            "timezone": "={{ $parameter[\"timezone\"] || undefined }}",
            "departure": "={{ $parameter[\"departure\"] || undefined }}",
            "age_tables": "={{ $parameter[\"age_tables\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "get_deposit": "={{ $parameter[\"get_deposit\"] || undefined }}",
            "get_options": "={{ $parameter[\"get_options\"] || undefined }}",
            "timeslot_id": "={{ $parameter[\"timeslot_id\"] || undefined }}",
            "birth_tables": "={{ $parameter[\"birth_tables\"] || undefined }}",
            "history_date": "={{ $parameter[\"history_date\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
            "get_taxes_price": "={{ $parameter[\"get_taxes_price\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
            "get_guests_price": "={{ $parameter[\"get_guests_price\"] || undefined }}",
            "search_alternative": "={{ $parameter[\"search_alternative\"] || undefined }}",
            "get_discounts_price": "={{ $parameter[\"get_discounts_price\"] || undefined }}",
            "get_available_places": "={{ $parameter[\"get_available_places\"] || undefined }}",
            "get_required_options_price": "={{ $parameter[\"get_required_options_price\"] || undefined }}"
          },
          "url": "/price_calculation",
          "method": "GET"
        }
      },
      "description": "With the price calculation API you can calculate a price",
      "resource": "priceCalculation"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage product meta information",
      "resource": "products"
    },
    {
      "name": "Get Products",
      "value": "getProducts",
      "action": "Get products",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "deal_id": "={{ $parameter[\"deal_id\"] || undefined }}",
            "category": "={{ $parameter[\"category\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "/products",
          "method": "GET"
        }
      },
      "description": "Get a list of products for this administration",
      "resource": "products"
    },
    {
      "name": "Get Product",
      "value": "getProduct",
      "action": "Get product",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "=/products/{{$parameter[\"product_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single product by id",
      "resource": "products"
    },
    {
      "name": "Update Product",
      "value": "updateProduct",
      "action": "Update product",
      "routing": {
        "request": {
          "qs": {
            "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "category": "={{ $parameter[\"category\"] || undefined }}",
            "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
            "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
          },
          "url": "=/products/{{$parameter[\"product_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a product, only provided parameters will be updated",
      "resource": "products"
    },
    {
      "name": "Add Product",
      "value": "addProduct",
      "action": "Add product",
      "routing": {
        "request": {
          "url": "/products",
          "body": {
            "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "category": "={{ $parameter[\"category\"] || undefined }}",
            "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
            "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty product or add parameters to a product",
      "resource": "products"
    },
    {
      "name": "Delete Product",
      "value": "deleteProduct",
      "action": "Delete product",
      "routing": {
        "request": {
          "url": "=/products/{{$parameter[\"product_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a product from the administration by ID",
      "resource": "products"
    },
    {
      "name": "Prices",
      "value": "prices",
      "action": "Prices",
      "description": "HTTP methods for prices of a rate",
      "resource": "rates"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "HTTP methods for meta of a rate",
      "resource": "rates"
    },
    {
      "name": "Get Rates",
      "value": "getRates",
      "action": "Get rates",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}"
          },
          "url": "/rates",
          "method": "GET"
        }
      },
      "description": "Get a list of rates",
      "resource": "rates"
    },
    {
      "name": "Get Rate",
      "value": "getRate",
      "action": "Get rate",
      "routing": {
        "request": {
          "url": "=/rates/{{$parameter[\"rate_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single rate by ID",
      "resource": "rates"
    },
    {
      "name": "Update Rate",
      "value": "updateRate",
      "action": "Update rate",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "closed": "={{ $parameter[\"closed\"] !== undefined && $parameter[\"closed\"] !== \"\" ? $parameter[\"closed\"] : undefined }}",
            "rules[0]": "={{ $parameter[\"rules\"]?.table ? ( Array.isArray($parameter[\"rules\"].table) ? JSON.stringify({ type: $parameter[\"rules\"].table[0].type, amount: String($parameter[\"rules\"].table[0].amount) }) : JSON.stringify({ type: $parameter[\"rules\"].table.type, amount: String($parameter[\"rules\"].table.amount) }) ) : undefined }}",
            "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}",
            "maximum_stay": "={{ $parameter[\"maximum_stay\"] || undefined }}",
            "minimum_stay": "={{ $parameter[\"minimum_stay\"] || undefined }}"
          },
          "url": "=/rates/{{$parameter[\"rate_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing rate",
      "resource": "rates"
    },
    {
      "name": "Add Rate",
      "value": "addRate",
      "action": "Add rate",
      "routing": {
        "request": {
          "url": "/rates",
          "body": "={{ Object.assign({}, ( $parameter.name ? { name: $parameter.name } : {} ), ( $parameter.status ? { status: $parameter.status } : {} ), ( $parameter.parent_id ? { parent_id: $parameter.parent_id } : {} ), ( $parameter.closed !== undefined && $parameter.closed !== \"\" ? { closed: $parameter.closed } : {} ), ( $parameter.minimum_stay ? { minimum_stay: $parameter.minimum_stay } : {} ), ( $parameter.maximum_stay ? { maximum_stay: $parameter.maximum_stay } : {} ), ($parameter.rules?.table ? { rules: (Array.isArray($parameter.rules.table) ? $parameter.rules.table.map(r => ({ type: r.type, amount: String(r.amount) })) : [{ type: $parameter.rules.table.type, amount: String($parameter.rules.table.amount) }]) } : {}) ) }}",
          "method": "POST"
        }
      },
      "description": "Create a new rate",
      "resource": "rates"
    },
    {
      "name": "Delete Rate",
      "value": "deleteRate",
      "action": "Delete rate",
      "routing": {
        "request": {
          "url": "=/rates/{{$parameter[\"rate_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a rate by ID",
      "resource": "rates"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage reservation meta information",
      "resource": "reservations"
    },
    {
      "name": "Get Reservations",
      "value": "getReservations",
      "action": "Get reservations",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
            "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "group_id": "={{ $parameter[\"group_id\"] || undefined }}",
            "meta_key": "={{ $parameter[\"meta_key\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
            "departure": "={{ $parameter[\"departure\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
            "meta_value": "={{ $parameter[\"meta_value\"] || undefined }}",
            "create_date": "={{ $parameter[\"create_date\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "last_modified": "={{ $parameter[\"last_modified\"] || undefined }}",
            "meta_operator": "={{ $parameter[\"meta_operator\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
            "arrival_operator": "={{ $parameter[\"arrival_operator\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "departure_operator": "={{ $parameter[\"departure_operator\"] || undefined }}",
            "get_invoice_payment": "={{ $parameter[\"get_invoice_payment\"] || undefined }}",
            "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "last_modified_operator": "={{ $parameter[\"last_modified_operator\"] || undefined }}"
          },
          "url": "/reservations",
          "method": "GET"
        }
      },
      "description": "You have a lot of possibilities to get information about multiple reservations",
      "resource": "reservations"
    },
    {
      "name": "Get Reservation",
      "value": "getReservation",
      "action": "Get reservation",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "get_booker": "={{ $parameter[\"get_booker\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_co_travelers": "={{ $parameter[\"get_co_travelers\"] || undefined }}",
            "get_invoice_meta": "={{ $parameter[\"get_invoice_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "get_invoice_rowsfilter": "={{ $parameter[\"get_invoice_rowsfilter\"] || undefined }}"
          },
          "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
          "method": "GET"
        }
      },
      "description": "You also can get the individual reservation, it is possible to get extra data on the reservation when needed",
      "resource": "reservations"
    },
    {
      "name": "Create Reservation",
      "value": "createReservation",
      "action": "Create reservation",
      "description": "Create a reservation using different methods",
      "resource": "reservations"
    },
    {
      "name": "Delete Reservation",
      "value": "deleteReservation",
      "action": "Delete reservation",
      "routing": {
        "request": {
          "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a reservation by ID",
      "resource": "reservations"
    },
    {
      "name": "Get Tags",
      "value": "getTags",
      "action": "Get tags",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}"
          },
          "url": "/tags",
          "method": "GET"
        }
      },
      "description": "Get a list of tags",
      "resource": "tags"
    },
    {
      "name": "Get Tag",
      "value": "getTag",
      "action": "Get tag",
      "routing": {
        "request": {
          "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
          "method": "GET"
        }
      },
      "description": "Get a single tag by ID",
      "resource": "tags"
    },
    {
      "name": "Add Tag",
      "value": "addTag",
      "action": "Add tag",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] }}"
          },
          "url": "/tags",
          "method": "POST"
        }
      },
      "description": "Add a new tag",
      "resource": "tags"
    },
    {
      "name": "Delete Tag",
      "value": "deleteTag",
      "action": "Delete tag",
      "routing": {
        "request": {
          "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
          "method": "DELETE"
        }
      },
      "description": "Delete a tag by ID",
      "resource": "tags"
    },
    {
      "name": "Get Timezones",
      "value": "getTimezones",
      "action": "Get timezones",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "country_code": "={{ $parameter[\"country_code\"] || undefined }}"
          },
          "url": "/timezones",
          "method": "GET"
        }
      },
      "description": "Get a list of timezones with optional filters",
      "resource": "timezones"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage user meta information",
      "resource": "users"
    },
    {
      "name": "Get Users",
      "value": "getUsers",
      "action": "Get users",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
            "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
          },
          "url": "/users",
          "method": "GET"
        }
      },
      "description": "Get a list of users for this administration",
      "resource": "users"
    },
    {
      "name": "Get User",
      "value": "getUser",
      "action": "Get user",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
            "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
          },
          "url": "=/users/{{$parameter[\"user_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single user by id",
      "resource": "users"
    },
    {
      "name": "Update User",
      "value": "updateUser",
      "action": "Update user",
      "routing": {
        "request": {
          "qs": {
            "email": "={{ $parameter[\"email\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
          },
          "url": "=/users/{{$parameter[\"user_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a user, only provided parameters will be updated",
      "resource": "users"
    },
    {
      "name": "Add User",
      "value": "addUser",
      "action": "Add user",
      "routing": {
        "request": {
          "url": "/users",
          "body": {
            "email": "={{ $parameter[\"email\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty user or add parameters to a user",
      "resource": "users"
    },
    {
      "name": "Get Widgets",
      "value": "getWidgets",
      "action": "Get widgets",
      "routing": {
        "request": {
          "qs": {
            "area": "={{ $parameter[\"area\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
          },
          "url": "/widgets",
          "method": "GET"
        }
      },
      "description": "Get a list of widgets for this administration",
      "resource": "widgets"
    },
    {
      "name": "Get Widget",
      "value": "getWidget",
      "action": "Get widget",
      "routing": {
        "request": {
          "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single widget by id",
      "resource": "widgets"
    },
    {
      "name": "Add Widget",
      "value": "addWidget",
      "action": "Add widget",
      "routing": {
        "request": {
          "url": "/widgets",
          "body": {
            "url": "={{ $parameter[\"url\"] || undefined }}",
            "area": "={{ $parameter[\"area\"] || undefined }}",
            "data": "={{ $parameter[\"data\"] || undefined }}",
            "app_id": "={{ $parameter[\"app_id\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty widget or add parameters to a widget",
      "resource": "widgets"
    },
    {
      "name": "Delete Widget",
      "value": "deleteWidget",
      "action": "Delete widget",
      "routing": {
        "request": {
          "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a widget by id",
      "resource": "widgets"
    }
  ]

npm_readme:
  # n8n-nodes-starfish

  This is an n8n community node. It lets you use the Starfish API (CampingCare/HotelCare) in your n8n workflows.

  Starfish is a comprehensive booking and reservation management platform for camping and hotel accommodations, providing APIs for managing contacts, reservations, accommodations, invoices, rates, and more.

  [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)
  - [Development](#development)
  - [Resources](#resources)
  - [Troubleshooting](#troubleshooting)
  - [Version history](#version-history)

  ## Installation

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

  ## Operations

  This package provides two nodes:

  ### Starfish (CampingCare/HotelCare) Node

  Regular node for making API calls:

  #### Accommodations API

  - **Get Accommodations** - List accommodations with filtering options
  - **Get Accommodation** - Retrieve a specific accommodation by ID
  - **Add Accommodation** - Create a new accommodation
  - **Update Accommodation** - Modify existing accommodation details
  - **Delete Accommodation** - Remove an accommodation
  - **Places** - Get places, get a single place, and update cleaning status (unknown, clean, wait_for_review, dirty)
  - **Meta Operations** - Manage accommodation metadata (get, update, delete)

  #### Administrations API

  - **Get Administrations** - List all administrations
  - **Get Administration** - Get details of a specific administration
  - **Add Administration** - Create a new administration (full PMS or lite version)
  - **Update Administration** - Modify administration details
  - **Delete Administration** - Remove an administration
  - **Get Places** - List places for a specific administration (filter, search, sort)
  - **Age Tables** - Retrieve and manage age table configurations
  - **Meta Operations** - Manage administration metadata

  #### Availability API

  - **Get Stock** - Check accommodation availability for specific date ranges
  - **Get Places** - Get available places/spots

  #### Categories API

  - **Get Categories** - List all categories
  - **Get Category** - Get a specific category by ID
  - **Add Category** - Create a new category
  - **Update Category** - Modify existing category
  - **Delete Category** - Remove a category

  #### Contacts API

  - **Get Contacts** - List contacts with filtering and pagination
  - **Get Contact** - Retrieve a specific contact by ID
  - **Add Contact** - Create a new contact with metadata support
  - **Update Contact** - Modify existing contact information
  - **Delete Contact** - Remove a contact
  - **Meta Operations** - Manage contact metadata

  #### Exchange Rates API

  - **Get Exchange Rates** - Get currency exchange rates for specific dates
  - **Exchange Value** - Convert amounts between currencies

  #### Invoices API

  - **Get Invoices** - List invoices with filters
  - **Get Invoice** - Get a specific invoice by ID
  - **Add Invoice** - Create a new invoice
  - **Update Invoice** - Modify existing invoice
  - **Delete Invoice** - Remove an invoice
  - **Finalize Invoice** - Finalize an invoice for payment
  - **Cancel Delayed Finalized Invoice** - Cancel a delayed finalization
  - **Create Credit** - Create a credit note for an invoice
  - **Add Rows** - Add line items to an invoice
  - **Meta Operations** - Manage invoice metadata

  #### Kiosks API

  - **Get Kiosks** - List all kiosks
  - **Get Kiosk** - Get a specific kiosk by ID
  - **Add Kiosk** - Create a new kiosk
  - **Update Kiosk** - Modify kiosk details
  - **Delete Kiosk** - Remove a kiosk
  - **Install Kiosk** - Install a kiosk
  - **Meta Operations** - Manage kiosk metadata

  #### Ledgers API

  - **Get Ledgers** - List all ledgers
  - **Get Ledger** - Get a specific ledger by ID
  - **Add Ledger** - Create a new ledger
  - **Update Ledger** - Modify ledger details
  - **Delete Ledger** - Remove a ledger

  #### License Plates API

  - **Get License Plates** - List license plates with filtering
  - **Get License Plate** - Get a specific license plate by ID
  - **Check Valid License Plate** - Validate a license plate
  - **Add License Plate** - Create a new license plate entry
  - **Update License Plate** - Modify existing license plate
  - **Delete License Plate** - Remove a license plate

  #### Logs API

  - **Get Logs** - Retrieve log entries
  - **Add Log** - Create a new log entry for tracking activities related to reservations, contacts, invoices, or accommodations

  #### Price Calculation API

  - **Calculate Price** - Get pricing information before creating a reservation with support for age tables, birthdates, discount codes, and channels

  #### Products API

  - **Get Products** - List all products with filtering options
  - **Get Product** - Get a specific product by ID
  - **Add Product** - Create a new product with multiple meta fields support
  - **Update Product** - Modify existing product details including meta fields
  - **Delete Product** - Remove a product
  - **Meta Operations** - Manage product metadata (get, update, delete)

  #### Rates API

  - **Get Rates** - List all rates
  - **Get Rate** - Get a specific rate by ID
  - **Add Rate** - Create a new rate
  - **Update Rate** - Modify existing rate
  - **Delete Rate** - Remove a rate
  - **Get Prices** - Retrieve prices for a specific rate and date range
  - **Update Prices** - Modify rate prices for specific dates
  - **Meta Operations** - Manage rate metadata

  #### Reservations API

  - **Get Reservations** - List all reservations with filtering
  - **Get Reservation** - Get a specific reservation by ID
  - **Create Reservation** - Create a new reservation (with price calculation or forced data)
  - **Delete Reservation** - Remove a reservation
  - **Meta Operations** - Manage reservation metadata

  #### Tags API

  - **Get Tags** - List all tags
  - **Get Tag** - Get a specific tag by ID
  - **Add Tag** - Create a new tag
  - **Delete Tag** - Remove a tag

  #### Timezones API

  - **Get Timezones** - List all available timezones

  #### Users API

  - **Get Users** - List all users
  - **Get User** - Get a specific user by ID
  - **Add User** - Create a new user
  - **Update User** - Modify user details
  - **Meta Operations** - Manage user metadata

  #### Widgets API

  - **Get Widgets** - List all widgets
  - **Get Widget** - Get a specific widget by ID
  - **Add Widget** - Create a new widget
  - **Update Widget** - Modify widget details
  - **Delete Widget** - Remove a widget

  ### Starfish (CampingCare/HotelCare) Trigger Node

  Webhook trigger node for real-time events:

  - Automatically creates and manages webhooks in Starfish
  - Supports multiple event types (reservations, contacts, invoices, etc.)
  - Receives real-time updates when data changes in Starfish
  - Includes signature validation for security

  ## Credentials

  ### Setting up API Credentials

  1. In n8n, go to **Credentials** > **New**
  2. Search for "Starfish (CampingCare/HotelCare) API"
  3. Enter your API credentials:
     - **API Key**: Your Starfish API key
     - **Webhook Secret** (optional): Value used to validate incoming webhooks; Starfish will echo it in the `X-Webhook-Secret` header and requests without it will be rejected.

  ### Obtaining Your API Key

  1. Log in to your Starfish dashboard (CampingCare or HotelCare)
  2. Navigate to Settings > API Keys
  3. Generate or copy your API key
  4. Paste it into the n8n credentials field

  The API key is used for authentication with all Starfish API endpoints. When provided, the webhook secret secures incoming webhooks.

  ## Compatibility

  - **Minimum n8n version:** 1.0.0
  - **Node.js version:** >= 20.15
  - **Tested with:** n8n 1.0.0+

  This node uses the Starfish API v21. Ensure your API key has access to the required endpoints.

  ## Usage

  ### Getting Started

  If you're new to n8n, check out the [Try it out](https://docs.n8n.io/try-it-out/) documentation to get started.

  ### Example 1: Create a Contact

  1. Add the "Starfish (CampingCare/HotelCare)" node
  2. Select **Resource**: Contacts API
  3. Select **Operation**: Add Contact
  4. Fill in required fields:
     - Email (required)
     - First Name
     - Last Name
     - Phone, Address, etc. (optional)

  The API allows creating contacts with minimal information and adding data as needed.

  ### Example 2: Create a Reservation

  1. Add the "Starfish (CampingCare/HotelCare)" node
  2. Select **Resource**: Reservations API
  3. Select **Operation**: Create Reservation
  4. Choose creation method:
     - **Using Price Calculation**: First calculate price, then create reservation
     - **Force with Own Data**: Provide all required data directly

  For the price calculation method:

  1. First use Price Calculation API to get `calculation_id` and `hash`
  2. Then create the reservation using these values

  ### Example 3: Listen for Webhook Events

  1. Add the "Starfish (CampingCare/HotelCare) Trigger" node
  2. Select events to listen for (e.g., "reservation_create", "contact_update")
  3. Activate the workflow
  4. The webhook will be automatically registered with Starfish
  5. When events occur, the workflow will be triggered

  ### Important Notes

  - **Date Format**: Always use YYYY-MM-DD format for dates.
  - **Required Fields**: Some operations have required fields (marked with \*)
  - **Meta Fields**: Many resources support custom metadata via meta operations
  - **Pagination**: Use `count` and `limit` parameters for large datasets
  - **Boolean Parameters**: Use string values "0" or "1" for boolean query parameters (examples: `get_meta`, `get_media`, `count`)
  - **Field Mapping**: When updating resources, only provided parameters will be updated
  - **Cleaning Status**: Accommodation places cleaning uses the `/cleaning` path and statuses `unknown|clean|wait_for_review|dirty`

  ## Development

  - Install dependencies: `pnpm install`
  - Build: `pnpm run build` (cleans `dist`, runs TypeScript, then `gulp build:icons`)
  - Dev watch: `pnpm run dev`
  - Lint: `pnpm run lint` (use `pnpm run lintfix` to auto-fix)
  - Format: `pnpm run format`

  ### Deploy to local n8n container (Windows)

  - Run `win_docker_deploy.bat` from the repo root to build and copy the node into a Dockerized n8n instance. Ensure Docker Desktop is running and your container name matches what the script expects.

  ### Webhook trigger validation

  - The trigger node validates webhook signatures; configure events in the node, activate the workflow, and ensure the public URL is reachable by Starfish.

  ### Resource coverage quick view

  | Resource | Key operations |
  | --- | --- |
  | Accommodations | get, get by id, add/update/delete, meta, places, cleaning status |
  | Administrations | get, get by id, add/update/delete, meta, age tables, places |
  | Reservations | get, get by id, create, delete, meta |
  | Contacts | get, get by id, add/update/delete, meta |
  | Rates | get, get by id, add/update/delete, prices get/update, meta |
  | Invoices | get, get by id, add/update/delete, finalize/cancel, credit, rows, meta |
  | Products | get, get by id, add/update/delete, meta |
  | Others | Kiosks, Ledgers, License Plates, Exchange Rates, Logs, Categories, Tags, Users, Widgets, Timezones |

  ## Resources

  - [Starfish API Documentation](https://support.starfish.care/faq/n8n/)
  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [GitHub Repository](https://github.com/CampingCare/n8n-node)
  - [CampingCare Website](https://www.camping.care)
  - [HotelCare Website](https://www.hotel.care)

  ## Version History

  ### Version 2.0.2 (Current)

  - Added accommodations places coverage (get places, get place, update cleaning status via `/cleaning`)
  - Fixed cleaning status endpoint path for accommodation places
  - Existing coverage retained: Invoices, Rates (pricing and metadata), Kiosks, Ledgers, License Plates, Exchange Rates, Logs, Categories, Tags, Users, and meta operations across major resources
  - Enhanced webhook trigger with signature validation and improved error handling

  ### Version 1.0.6

  - Broader API coverage across accommodations, reservations, contacts, and meta operations
  - Enhanced README documentation

  ### Version 1.0.0

  - Initial release
  - Support for Contacts, Reservations, and Accommodations
  - Webhook trigger support
  - Price calculation features
  - Administrations and Timezones support

  ---

  ## Troubleshooting

  ### Common Issues

  **"Invalid API Key" error**

  - Verify your API key in the Starfish dashboard
  - Check that the key hasn't expired
  - Update the key in n8n credentials if necessary

  **Webhook not receiving events**

  - Ensure the workflow is activated
  - Verify the webhook exists in your Starfish dashboard (Settings > Webhooks)
  - Check that n8n is accessible from the internet (for webhooks to work)
  - Review your firewall and network settings

  **Date format errors**

  - Ensure all dates use YYYY-MM-DD format
  - Check your system timezone settings

  **Meta operations not working**

  - Verify the resource supports meta operations
  - Check that the meta key is valid for the resource type
  - Some meta operations may require specific permissions
  - Ensure your API key has the necessary scopes

  **Rate limiting issues**

  - Implement delays between API calls if needed
  - Check the API documentation for rate limits
  - Consider batching operations where possible

  **Connection timeouts**

  - Check your internet connection
  - Verify the Starfish API endpoint is accessible
  - Try again after a few moments

  ## Contributing

  Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch: `git checkout -b feature/my-feature`
  3. Commit your changes: `git commit -am 'Add new feature'`
  4. Push to the branch: `git push origin feature/my-feature`
  5. Submit a pull request

  ## License

  [MIT](LICENSE.md)

  ## Support

  For support:

  - Check the [API Documentation](https://support.starfish.care/faq/n8n/)
  - Open an issue on [GitHub](https://github.com/CampingCare/n8n-node/issues)
  - Contact Starfish support for API-related questions

  ## Credits

  Created by the CampingCare development team.

  Built with the [n8n nodes starter](https://github.com/n8n-io/n8n-nodes-starter).

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows to interact with the Starfish API, a platform for managing camping and hotel bookings, reservations, and related operational data.","capabilities":["CRUD operations for Accommodations (list, get, create, update, delete)","CRUD operations for Administrations (list, get, create, update, delete)","CRUD operations for Categories (list, get, create, update, delete)","CRUD operations for Contacts (list, get, create, update, delete)","CRUD operations for Invoices (list, get, create, update, delete, finalize, cancel, credit)","CRUD operations for Kiosks (list, get, create, update, delete, install)","CRUD operations for Ledgers (list, get, create, update, delete)","CRUD operations for License Plates (list, get, create, update, delete, validate)","CRUD operations for Products (list, get, create, update, delete)","CRUD operations for Rates (list, get, create, update, delete)"],"authentication":"API key required (implied by 'Credentials' section and standard API node behavior, though specific method not detailed in provided text)","commonUseCases":["Automating camping or hotel reservation creation and management","Syncing guest contact information between systems","Managing inventory and availability for accommodations","Processing invoices and generating credit notes","Calculating dynamic pricing based on age or discounts"],"limitations":["Limited to the Starfish API's supported endpoints","Requires a valid Starfish API integration and credentials","Some advanced features may depend on specific Starfish plan permissions (e.g., PMS vs lite version)"],"relatedNodes":["n8n-nodes-starfish.campingCare","n8n-nodes-starfish.hotelCare","n8n-nodes-starfish","n8n-nodes-starfish.campingCare","n8n-nodes-starfish.hotelCare"]}


node_type: n8n-nodes-copyseeker.copyseeker
package_name: n8n-nodes-copyseeker
display_name: Copyseeker
description: Reverse image search and copyright analysis
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: copyseeker
author_github_url: https://github.com/man-tas/
npm_package_name: n8n-nodes-copyseeker
npm_version: 1.0.5
community_fetched_at: 2026-07-14T14:40:33.387Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "image",
      "options": [
        {
          "name": "Image",
          "value": "image"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "reverseSearch",
      "options": [
        {
          "name": "Reverse Search",
          "value": "reverseSearch",
          "action": "Perform reverse image search",
          "description": "Find where an image appears online"
        },
        {
          "name": "Site-Specific Search",
          "value": "siteSearch",
          "action": "Search specific site for image",
          "description": "Search for image on a specific website"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "image"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Reverse Search",
      "value": "reverseSearch",
      "action": "Perform reverse image search",
      "description": "Find where an image appears online",
      "resource": "image"
    },
    {
      "name": "Site-Specific Search",
      "value": "siteSearch",
      "action": "Search specific site for image",
      "description": "Search for image on a specific website",
      "resource": "image"
    }
  ]

npm_readme:
  # n8n-nodes-copyseeker

  n8n community node for [Copyseeker](https://copyseeker.net) - Reverse Image Search API

  [Installation](#installation) • [Configuration](#configuration) • [Operations](#operations) • [Use Cases](#use-cases) • [Support](#support)

  ## Installation

  ### Via n8n Community Nodes

  1. Go to **Settings** > **Community Nodes**
  2. Click **Install**
  3. Enter `n8n-nodes-copyseeker`
  4. Click **Install**

  ### Via npm
  ```bash
  npm install n8n-nodes-copyseeker
  ```

  ## Prerequisites

  Get your API key from [RapidAPI Copyseeker](https://rapidapi.com/copyseeker1-copyseeker-default/api/reverse-image-search-by-copyseeker)

  ## Configuration

  1. Add **Copyseeker** node to workflow
  2. Click **Create New Credentials**
  3. Enter your RapidAPI key
  4. Save

  ## Operations

  ### Reverse Image Search

  Find where an image appears online.

  **Input:**
  - Image URL (required)
  - Return Full Response (optional)
  - Filter by Minimum Rank (optional)
  - Include Visual Similar Images (optional)

  **Output:**
  ```json
  {
    "bestGuess": "logo design",
    "totalMatches": 15,
    "highestRankedSource": {
      "url": "https://example.com",
      "title": "Example Website",
      "rank": 8.5
    },
    "topEntities": ["Web Design", "Logo", "Branding"],
    "visuallySimilarCount": 23,
    "allPages": [],
    "entities": [],
    "visuallySimilar": []
  }
  ```

  ### Site-Specific Search

  Search for an image on a specific website.

  **Input:**
  - Image URL (required)
  - Target Site (required) - domain without protocol
  - Return Full Response (optional)
  - Filter by Minimum Rank (optional)
  - Include Visual Similar Images (optional)

  ## Use Cases

  ### Copyright Protection
  Monitor unauthorized use of your images across the web.

  ### E-commerce Visual Search
  Enable customers to find products by uploading images.

  ### Brand Protection
  Detect counterfeit products and unauthorized logo usage.

  ### Content Moderation
  Filter duplicate or previously flagged content.

  ### Fraud Detection
  Verify profile photos in dating apps, insurance claims, job applications.

  ### Fact-Checking
  Verify image authenticity and track original sources.

  ## Page Authority Scores

  | Score | Authority |
  |-------|-----------|
  | 8.0-10.0 | Very High - Major sites, likely original |
  | 6.0-7.9 | High - Established sites |
  | 4.0-5.9 | Medium - Regular sites |
  | 2.0-3.9 | Low - Smaller sites |
  | 0.0-1.9 | Very Low - New or low-authority |

  ## Best Practices

  **Do:**
  - Use direct image URLs (.jpg, .png, .gif, .webp)
  - Keep images under 10MB
  - Implement error handling
  - Cache results when possible
  - Use minimum rank filtering

  **Don't:**
  - Use HTML page URLs
  - Include protocol in Target Site
  - Exceed rate limits
  - Process same image repeatedly

  ## Troubleshooting

  **No matches found**
  - Verify URL is direct and public
  - Image may be too new to index

  **Rate limit exceeded**
  - Check RapidAPI plan limits
  - Add delays between requests

  **Invalid credentials**
  - Verify RapidAPI key
  - Check subscription status

  ## Support

  - [Copyseeker Website](https://copyseeker.net)
  - [GitHub Issues](https://github.com/man-tas/n8n-nodes-copyseeker/issues)
  - [RapidAPI Page](https://rapidapi.com/copyseeker1-copyseeker-default/api/reverse-image-search-by-copyseeker)

  ## License

  MIT

  ---

  Built for the n8n community • [Documentation](https://docs.n8n.io/integrations/community-nodes/)

ai_documentation_summary:
  {"purpose":"A n8n community node that performs reverse image search and copyright analysis using the Copyseeker API to find where images appear online.","capabilities":["Reverse image search to find image sources","Site-specific image search","Visual similarity detection","Return best guess and entity analysis","Filter results by minimum rank","Return full response data including all pages"],"authentication":"RapidAPI key required","commonUseCases":["Copyright protection monitoring","E-commerce visual search","Brand protection and counterfeit detection","Content moderation","Fraud detection in profile photos"],"limitations":["Requires direct image URLs (not HTML page URLs)","Images must be under 10MB","Subject to RapidAPI rate limits","May not find very new or unindexed images","Target Site parameter should not include protocol"],"relatedNodes":[]}


node_type: n8n-nodes-videotoblog.videoToBlog
package_name: n8n-nodes-videotoblog
display_name: VideoToBlog
description: Emits events from Video To Blog when a post is exported
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: andrewp629
author_github_url: https://github.com/Video-To-Blog/
npm_package_name: n8n-nodes-videotoblog
npm_version: 1.0.3
community_fetched_at: 2026-07-14T14:40:33.388Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-videotoblog

  Community node(s) to integrate Video To Blog with n8n.

  - Nodes
    - VideoToBlog (Trigger): Emits an item when a post is exported in Video To Blog

  ## Quick Start

  1. Install and link locally:

  ```sh
  npm run build
  npm link
  # In your n8n custom dir (~/.n8n/custom)
  npm link n8n-nodes-videotoblog
  n8n start
  ```

  2. Open n8n and add "VideoToBlog" as the first node.
     - Destination: a friendly label (e.g., "Docs")
     - Credentials: VideoToBlog API (enter your n8n API key from Video To Blog Integrations)
  3. Click "Listen for test event" to register the Test URL, or Activate the workflow to register the Production URL automatically.
  4. Export a blog post from Video To Blog. The trigger will output one item with:
     - html, markdown, emailHtml, title, metaDescription, metaTitle, slug, tags

  Optional: None - the trigger auto-registers/unregisters its webhook.

  ## Node parameters

  - Destination (string): Friendly identifier for your publishing target in n8n
  - Trigger Event (fixed): Post Exported
    

  ## Credentials

  - VideoToBlog API: Generic header auth, adds `x-api-key: <your_key>`.

  ## Docs & references

  - VideoToBlog n8n integration guide: https://docs.videotoblog.ai/en/help/articles/2997507-n8n
  - n8n submission checklist: https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/

  ## HTTPS and modes

  - No Base URL field is required in the node UI.
  - Test mode (Execute Node) uses the local Test webhook URL; activation registers the Production webhook URL.

  ## Development

  - Lint/build/test with the n8n node CLI scripts already included:
    - `npm run lint`
    - `npm run dev`
    - `npm run build`

  ## Compatibility

  - n8n: 1.x
  - License: MIT

ai_documentation_summary:
  {"purpose":"A trigger node that emits workflow items when a blog post is exported from Video To Blog.","capabilities":["Triggers on post export events","Outputs post metadata including title, slug, tags, and content formats (HTML, Markdown, Email HTML)","Supports both test and production webhook registration","Auto-registers/unregisters webhooks without manual configuration"],"authentication":"API Key (via custom header x-api-key)","commonUseCases":["Automatically publish Video To Blog posts to external CMS or marketing platforms","Trigger content processing workflows upon new blog post creation","Sync blog metadata across multiple systems"],"limitations":["Requires manual installation and linking of the community package","Only supports n8n version 1.x","No Base URL configuration field in the node UI"],"relatedNodes":["Webhook","HTTP Request","Trigger"]}


node_type: @musixmatch/n8n-nodes-musixmatch.musixmatch
package_name: @musixmatch/n8n-nodes-musixmatch
display_name: Musixmatch
description: Interact with Musixmatch API to access music metadata, lyrics, and more
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: musixmatchdev
author_github_url: https://github.com/musixmatchdev/n8n-nodes-musixmatch.git
npm_package_name: @musixmatch/n8n-nodes-musixmatch
npm_version: 0.2.4
community_fetched_at: 2026-07-14T14:40:33.389Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "catalog",
      "options": [
        {
          "name": "Catalog",
          "value": "catalog"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Chart Tracks Get",
          "value": "chartTracksGet",
          "action": "Get chart tracks",
          "description": "Retrieve track charts"
        },
        {
          "name": "Track Get",
          "value": "trackGet",
          "action": "Get track information",
          "description": "Get track information"
        },
        {
          "name": "Track Lyrics Get",
          "value": "trackLyricsGet",
          "action": "Get track lyrics",
          "description": "Get track lyrics"
        },
        {
          "name": "Track Subtitle Get",
          "value": "trackSubtitleGet",
          "action": "Get track subtitles",
          "description": "Get track subtitles"
        },
        {
          "name": "Matcher Track Get",
          "value": "matcherTrackGet",
          "action": "Match track by metadata",
          "description": "Match track by metadata"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "catalog"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Chart Tracks Get",
      "value": "chartTracksGet",
      "action": "Get chart tracks",
      "description": "Retrieve track charts",
      "resource": "catalog"
    },
    {
      "name": "Track Get",
      "value": "trackGet",
      "action": "Get track information",
      "description": "Get track information",
      "resource": "catalog"
    },
    {
      "name": "Track Lyrics Get",
      "value": "trackLyricsGet",
      "action": "Get track lyrics",
      "description": "Get track lyrics",
      "resource": "catalog"
    },
    {
      "name": "Track Subtitle Get",
      "value": "trackSubtitleGet",
      "action": "Get track subtitles",
      "description": "Get track subtitles",
      "resource": "catalog"
    },
    {
      "name": "Matcher Track Get",
      "value": "matcherTrackGet",
      "action": "Match track by metadata",
      "description": "Match track by metadata",
      "resource": "catalog"
    }
  ]

npm_readme:
  # n8n-nodes-musixmatch

  <picture>
    <source media="(prefers-color-scheme: dark)" srcset=".github/musixmatch-logo-dark.png">
    <source media="(prefers-color-scheme: light)" srcset=".github/musixmatch-logo.png">
    <img alt="Musixmatch Logo" src=".github/musixmatch-logo.png" width="300">
  </picture>

  [![npm version](https://img.shields.io/npm/v/@musixmatch/n8n-nodes-musixmatch.svg)](https://www.npmjs.com/package/@musixmatch/n8n-nodes-musixmatch)
  [![npm downloads](https://img.shields.io/npm/dt/@musixmatch/n8n-nodes-musixmatch.svg)](https://www.npmjs.com/package/@musixmatch/n8n-nodes-musixmatch)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
  [![GitHub issues](https://img.shields.io/github/issues/musixmatchdev/n8n-nodes-musixmatch.svg)](https://github.com/musixmatchdev/n8n-nodes-musixmatch/issues)

  This is an n8n community node that lets you use [Musixmatch](https://www.musixmatch.com/) in your n8n workflows.

  Musixmatch is the world's largest lyrics catalog, providing access to millions of songs' lyrics, translations, subtitles, and music metadata. This node enables you to integrate Musixmatch's powerful API into your automation workflows.

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

  ## Table of Contents

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

  ### Community Node Installation

  1. Go to **Settings > Community Nodes** in your n8n instance
  2. Select **Install**
  3. Enter `n8n-nodes-musixmatch` in **Enter npm package name**
  4. Agree to the [risks](https://docs.n8n.io/integrations/community-nodes/risks/) of using community nodes
  5. Select **Install**

  After installing the node, you can use it like any other node in your workflows.

  ## Operations

  The Musixmatch node currently supports the following operations:

  ### Catalog Resource

  - **Chart Tracks Get**: Retrieve the top charting tracks from a specific country
  - **Track Get**: Get track information by Musixmatch Track ID
  - **Track Lyrics Get**: Retrieve lyrics for a specific track
  - **Track Lyrics Translation Get**: Get translated lyrics for a track in a specified language
  - **Track Subtitle Get**: Retrieve subtitles (time-synced lyrics) for a track
  - **Matcher Track Get**: Search and match a track by artist and track name

  ### Available Operations Details

  #### Chart Tracks Get

  Retrieve trending and top charting tracks from Musixmatch charts. You can filter by country and chart type (e.g., top, hot, mxmweekly).

  #### Track Get

  Fetch detailed information about a specific track using its Musixmatch Track ID, including metadata like artist name, album, release date, and more.

  #### Track Lyrics Get

  Access the lyrics of any track in the Musixmatch catalog by providing the Track ID.

  #### Track Lyrics Translation Get

  Get translated versions of lyrics in multiple languages. Perfect for multilingual applications and global audiences.

  #### Track Subtitle Get

  Retrieve time-synced subtitles (lyrics with timestamps) for karaoke applications, music players, or synchronized displays.

  #### Matcher Track Get

  Search for a track by providing the artist name and track title. This operation returns the best matching track from the Musixmatch database.

  ## Credentials

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

  ### Getting Your API Key

  1. Visit [Musixmatch API Pricing](https://www.musixmatch.com/pro/api/pricing?utm_source=github_n8n_node&utm_medium=web&utm_content=pricing_page_link) to view available plans
  2. Subscribe to a plan that fits your needs
  3. Once subscribed, you'll receive your API key
  4. Copy your API key to use with this n8n node

  ### Setting Up Credentials in n8n

  1. In your n8n workflow, add the Musixmatch node
  2. Click on **Credential for Musixmatch API**
  3. Select **Create New Credential**
  4. Enter your **API Key**
  5. Click **Save**

  The node will automatically authenticate all API requests using your credentials.

  ## Compatibility

  - **Minimum n8n version**: 1.0.0
  - **Tested with n8n versions**: 1.119.2 and above

  This node is built using the latest n8n community node standards and should be compatible with all recent versions of n8n.

  ## Usage

  ### Example Workflow: Get Trending Tracks with Lyrics

  Here's a simple example that retrieves the top 10 trending tracks from the US charts and fetches their lyrics:

  1. **Add Musixmatch node** configured to use **Chart Tracks Get** operation
     - Set **Country** to `US`
     - Set **Chart Name** to `top`
     - Set **Page Size** to `10`

  2. **Add a second Musixmatch node** configured to use **Track Lyrics Get** operation
     - Use `{{ $json.track_id }}` from the previous node to fetch lyrics for each track

  3. **Process the results** with other n8n nodes as needed (e.g., save to database, send to webhook, etc.)

  ### Example Workflow: Search and Translate Lyrics

  1. **Add Musixmatch node** configured to use **Matcher Track Get** operation
     - Set **Artist Name** to the artist you want to search
     - Set **Track Name** to the song title

  2. **Add a second Musixmatch node** configured to use **Track Lyrics Translation Get** operation
     - Use `{{ $json.track_id }}` from the previous node
     - Set **Language** to your desired language code (e.g., `es` for Spanish, `fr` for French)

  ### Tips

  - The node is compatible with AI Agent workflows (marked as `usableAsTool`)
  - All operations respect n8n's **Continue On Fail** setting for robust error handling
  - Use the **Matcher Track Get** operation when you don't have a Track ID but know the artist and song name
  - Rate limits depend on your Musixmatch API plan - consider implementing appropriate delays for large batch operations

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Musixmatch API Documentation](https://docs.musixmatch.com/lyrics-api/introduction?utm_source=github_n8n_node&utm_medium=web&utm_content=docs_link)
  - [n8n Documentation](https://docs.n8n.io/)

  ## Support

  For issues, questions, or contributions, please visit the [GitHub repository](https://github.com/musixmatchdev/n8n-nodes-musixmatch/issues).

  ---

  _This is a community node and is not officially maintained by n8n. For official support, please contact Musixmatch directly._

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows to interact with the Musixmatch API to retrieve music metadata, lyrics, translations, and subtitles.","capabilities":["Retrieve top charting tracks by country","Get detailed track information by Track ID","Fetch lyrics for specific tracks","Get translated lyrics in multiple languages","Retrieve time-synced subtitles","Search and match tracks by artist and name"],"authentication":"API Key required","commonUseCases":["Automating music metadata collection for databases","Integrating lyrics into content creation workflows","Building multilingual lyric translation tools","Creating karaoke or synchronized display applications"],"limitations":["Rate limits depend on the Musixmatch API plan","Requires a paid Musixmatch subscription to obtain an API key","Minimum n8n version required is 1.0.0"],"relatedNodes":["n8n HTTP Request node","n8n Set node","n8n Webhook node"]}


node_type: n8n-nodes-belakeai.belakeAi
package_name: n8n-nodes-belakeai
display_name: Belake.ai
description: Belake.ai API operations
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: rique29
author_github_url: https://github.com/belakeaiservicos/
npm_package_name: n8n-nodes-belakeai
npm_version: 1.0.11
community_fetched_at: 2026-07-14T14:40:33.389Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "chat",
      "options": [
        {
          "name": "Agent",
          "value": "agent"
        },
        {
          "name": "Chat",
          "value": "chat"
        },
        {
          "name": "Datasource",
          "value": "datasource"
        },
        {
          "name": "Group",
          "value": "group"
        },
        {
          "name": "Language Model",
          "value": "languageModel"
        },
        {
          "name": "Tool",
          "value": "tool"
        },
        {
          "name": "User",
          "value": "user"
        },
        {
          "name": "Workspace",
          "value": "workspace"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get Agents",
      "options": [
        {
          "name": "Create Agent",
          "value": "Create Agent",
          "action": "Create agent"
        },
        {
          "name": "Delete Agent by ID",
          "value": "Delete Agent by ID",
          "action": "Delete agent by id"
        },
        {
          "name": "Get Agent by ID",
          "value": "Get Agent by ID",
          "action": "Get agent by id"
        },
        {
          "name": "Get Agents",
          "value": "Get Agents",
          "action": "Get agents"
        },
        {
          "name": "Update Agent",
          "value": "Update Agent",
          "action": "Update agent"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "agent"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Send Message",
      "options": [
        {
          "name": "Get Chat by ID",
          "value": "Get Chat by ID",
          "action": "Get chat by id"
        },
        {
          "name": "Get Chats",
          "value": "Get Chats",
          "action": "Get chats"
        },
        {
          "name": "Send Message",
          "value": "Send Message",
          "action": "Send message"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "chat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get Datasources",
      "options": [
        {
          "name": "Get Datasource by ID",
          "value": "Get Datasource by ID",
          "action": "Get datasource by id"
        },
        {
          "name": "Get Datasources",
          "value": "Get Datasources",
          "action": "Get datasources"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "datasource"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get Groups",
      "options": [
        {
          "name": "Create Group",
          "value": "Create Group",
          "action": "Create group"
        },
        {
          "name": "Delete Group",
          "value": "Delete Group",
          "action": "Delete group"
        },
        {
          "name": "Get Group by ID",
          "value": "Get Group by ID",
          "action": "Get group by id"
        },
        {
          "name": "Get Groups",
          "value": "Get Groups",
          "action": "Get groups"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "group"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get Language Models",
      "options": [
        {
          "name": "Create Language Model",
          "value": "Create Language Model",
          "action": "Create language model"
        },
        {
          "name": "Delete Language Model by ID",
          "value": "Delete Language Model by ID",
          "action": "Delete language model by id"
        },
        {
          "name": "Get Language Model by ID",
          "value": "Get Language Model by ID",
          "action": "Get language model by id"
        },
        {
          "name": "Get Language Models",
          "value": "Get Language Models",
          "action": "Get language models"
        },
        {
          "name": "Link Language Model to Workspace",
          "value": "Link Language Model to Workspace",
          "action": "Link language model to workspace"
        },
        {
          "name": "Unlink Language Model From Workspace",
          "value": "Unlink Language Model from Workspace",
          "action": "Unlink language model from workspace"
        },
        {
          "name": "Update Language Model",
          "value": "Update Language Model",
          "action": "Update language model"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "languageModel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get Workspaces",
      "options": [
        {
          "name": "Add Members to Workspace",
          "value": "Add Members to Workspace",
          "action": "Add members to workspace"
        },
        {
          "name": "Add User to Workspace",
          "value": "Add User to Workspace",
          "action": "Add user to workspace"
        },
        {
          "name": "Add Users to Groups",
          "value": "Add Users to Groups",
          "action": "Add users to groups"
        },
        {
          "name": "Create Workspace",
          "value": "Create Workspace",
          "action": "Create workspace"
        },
        {
          "name": "Delete Workspace",
          "value": "Delete Workspace",
          "action": "Delete workspace"
        },
        {
          "name": "Get Workspace by ID",
          "value": "Get Workspace by ID",
          "action": "Get workspace by id"
        },
        {
          "name": "Get Workspaces",
          "value": "Get Workspaces",
          "action": "Get workspaces"
        },
        {
          "name": "Remove User From Group",
          "value": "Remove User from Group",
          "action": "Remove user from group"
        },
        {
          "name": "Remove Users From Workspace",
          "value": "Remove Users from Workspace",
          "action": "Remove users from workspace"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "workspace"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Create Tool",
      "options": [
        {
          "name": "Create Tool",
          "value": "Create Tool",
          "action": "Create tool"
        },
        {
          "name": "Delete Tool by ID",
          "value": "Delete Tool by ID",
          "action": "Delete tool by id"
        },
        {
          "name": "Update Tool",
          "value": "Update Tool",
          "action": "Update tool"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tool"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Create User",
      "options": [
        {
          "name": "Activate User by ID",
          "value": "Activate User by ID",
          "action": "Activate user by id"
        },
        {
          "name": "Create User",
          "value": "Create User",
          "action": "Create user"
        },
        {
          "name": "Delete User by ID",
          "value": "Delete User by ID",
          "action": "Delete user by id"
        },
        {
          "name": "Revoke User by ID",
          "value": "Revoke User by ID",
          "action": "Revoke user by id"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Agent",
      "value": "Create Agent",
      "action": "Create agent",
      "resource": "agent"
    },
    {
      "name": "Delete Agent by ID",
      "value": "Delete Agent by ID",
      "action": "Delete agent by id",
      "resource": "agent"
    },
    {
      "name": "Get Agent by ID",
      "value": "Get Agent by ID",
      "action": "Get agent by id",
      "resource": "agent"
    },
    {
      "name": "Get Agents",
      "value": "Get Agents",
      "action": "Get agents",
      "resource": "agent"
    },
    {
      "name": "Update Agent",
      "value": "Update Agent",
      "action": "Update agent",
      "resource": "agent"
    },
    {
      "name": "Get Chat by ID",
      "value": "Get Chat by ID",
      "action": "Get chat by id",
      "resource": "chat"
    },
    {
      "name": "Get Chats",
      "value": "Get Chats",
      "action": "Get chats",
      "resource": "chat"
    },
    {
      "name": "Send Message",
      "value": "Send Message",
      "action": "Send message",
      "resource": "chat"
    },
    {
      "name": "Get Datasource by ID",
      "value": "Get Datasource by ID",
      "action": "Get datasource by id",
      "resource": "datasource"
    },
    {
      "name": "Get Datasources",
      "value": "Get Datasources",
      "action": "Get datasources",
      "resource": "datasource"
    },
    {
      "name": "Create Group",
      "value": "Create Group",
      "action": "Create group",
      "resource": "group"
    },
    {
      "name": "Delete Group",
      "value": "Delete Group",
      "action": "Delete group",
      "resource": "group"
    },
    {
      "name": "Get Group by ID",
      "value": "Get Group by ID",
      "action": "Get group by id",
      "resource": "group"
    },
    {
      "name": "Get Groups",
      "value": "Get Groups",
      "action": "Get groups",
      "resource": "group"
    },
    {
      "name": "Create Language Model",
      "value": "Create Language Model",
      "action": "Create language model",
      "resource": "languageModel"
    },
    {
      "name": "Delete Language Model by ID",
      "value": "Delete Language Model by ID",
      "action": "Delete language model by id",
      "resource": "languageModel"
    },
    {
      "name": "Get Language Model by ID",
      "value": "Get Language Model by ID",
      "action": "Get language model by id",
      "resource": "languageModel"
    },
    {
      "name": "Get Language Models",
      "value": "Get Language Models",
      "action": "Get language models",
      "resource": "languageModel"
    },
    {
      "name": "Link Language Model to Workspace",
      "value": "Link Language Model to Workspace",
      "action": "Link language model to workspace",
      "resource": "languageModel"
    },
    {
      "name": "Unlink Language Model From Workspace",
      "value": "Unlink Language Model from Workspace",
      "action": "Unlink language model from workspace",
      "resource": "languageModel"
    },
    {
      "name": "Update Language Model",
      "value": "Update Language Model",
      "action": "Update language model",
      "resource": "languageModel"
    },
    {
      "name": "Add Members to Workspace",
      "value": "Add Members to Workspace",
      "action": "Add members to workspace",
      "resource": "workspace"
    },
    {
      "name": "Add User to Workspace",
      "value": "Add User to Workspace",
      "action": "Add user to workspace",
      "resource": "workspace"
    },
    {
      "name": "Add Users to Groups",
      "value": "Add Users to Groups",
      "action": "Add users to groups",
      "resource": "workspace"
    },
    {
      "name": "Create Workspace",
      "value": "Create Workspace",
      "action": "Create workspace",
      "resource": "workspace"
    },
    {
      "name": "Delete Workspace",
      "value": "Delete Workspace",
      "action": "Delete workspace",
      "resource": "workspace"
    },
    {
      "name": "Get Workspace by ID",
      "value": "Get Workspace by ID",
      "action": "Get workspace by id",
      "resource": "workspace"
    },
    {
      "name": "Get Workspaces",
      "value": "Get Workspaces",
      "action": "Get workspaces",
      "resource": "workspace"
    },
    {
      "name": "Remove User From Group",
      "value": "Remove User from Group",
      "action": "Remove user from group",
      "resource": "workspace"
    },
    {
      "name": "Remove Users From Workspace",
      "value": "Remove Users from Workspace",
      "action": "Remove users from workspace",
      "resource": "workspace"
    },
    {
      "name": "Create Tool",
      "value": "Create Tool",
      "action": "Create tool",
      "resource": "tool"
    },
    {
      "name": "Delete Tool by ID",
      "value": "Delete Tool by ID",
      "action": "Delete tool by id",
      "resource": "tool"
    },
    {
      "name": "Update Tool",
      "value": "Update Tool",
      "action": "Update tool",
      "resource": "tool"
    },
    {
      "name": "Activate User by ID",
      "value": "Activate User by ID",
      "action": "Activate user by id",
      "resource": "user"
    },
    {
      "name": "Create User",
      "value": "Create User",
      "action": "Create user",
      "resource": "user"
    },
    {
      "name": "Delete User by ID",
      "value": "Delete User by ID",
      "action": "Delete user by id",
      "resource": "user"
    },
    {
      "name": "Revoke User by ID",
      "value": "Revoke User by ID",
      "action": "Revoke user by id",
      "resource": "user"
    }
  ]

npm_readme:
  # n8n-nodes-belakeai

  This is an [n8n community node](https://docs.n8n.io/integrations/#community-nodes). It lets you use [Belake.ai](https://www.belake.ai/) inside your n8n workflows.

  Belake.ai is an AI platform that provides intelligent agents, chat interactions, datasources, group organization, language model integrations, tools (HTTP/MCP), and workspace governance — all of which can be orchestrated from this node.

  [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. The package is published on npm as `n8n-nodes-belakeai`.

  All API calls performed by this node are routed through the `/v1` prefix automatically — you only need to configure the base **Backend URL** in the credentials.

  ## Operations

  ### Operations matrix

  | Resource | Operation | HTTP method + path |
  | --- | --- | --- |
  | Agent | Create Agent | `POST /v1/agents?workspaceId={workspaceId}` |
  | Agent | Update Agent | `PATCH /v1/agents/{agentId}?workspaceId={workspaceId}` |
  | Agent | Delete Agent by ID | `DELETE /v1/agents/{agentId}` |
  | Agent | Get Agent by ID | `GET /v1/agents/{agentId}` |
  | Agent | Get Agents | `GET /v1/agents` |
  | Chat | Send Message | `POST /v1/chats/messages` |
  | Chat | Get Chat by ID | `GET /v1/chats/{chatId}` |
  | Chat | Get Chats | `GET /v1/chats` |
  | Datasource | Get Datasource by ID | `GET /v1/datasources/{datasourceId}` |
  | Datasource | Get Datasources | `GET /v1/datasources` |
  | Group | Create Group | `POST /v1/groups?workspaceId={workspaceId}` |
  | Group | Delete Group | `DELETE /v1/groups/{groupId}` |
  | Group | Get Group by ID | `GET /v1/groups/{groupId}` |
  | Group | Get Groups | `GET /v1/groups` |
  | Language Model | Create Language Model | `POST /v1/languagemodels` |
  | Language Model | Update Language Model | `PATCH /v1/languagemodels/{id}` |
  | Language Model | Delete Language Model by ID | `DELETE /v1/languagemodels/{id}` |
  | Language Model | Get Language Model by ID | `GET /v1/languagemodels/{id}` |
  | Language Model | Get Language Models | `GET /v1/languagemodels` |
  | Language Model | Link Language Model to Workspace | `POST /v1/workspaces/{workspaceId}/languagemodels` |
  | Language Model | Unlink Language Model from Workspace | `DELETE /v1/workspaces/{workspaceId}/languagemodels/{id}` |
  | Tool | Create Tool | `POST /v1/tools?workspaceId={workspaceId}` |
  | Tool | Update Tool | `PATCH /v1/tools/{toolId}` |
  | Tool | Delete Tool by ID | `DELETE /v1/tools/{toolId}` |
  | User | Create User | `POST /v1/users` |
  | User | Activate User by ID | `PUT /v1/users/{userId}/activate` |
  | User | Revoke User by ID | `PUT /v1/users/{userId}/revoke` |
  | User | Delete User by ID | `DELETE /v1/users/{userId}` |
  | Workspace | Create Workspace | `POST /v1/workspaces` |
  | Workspace | Delete Workspace | `DELETE /v1/workspaces/{workspaceId}` |
  | Workspace | Get Workspace by ID | `GET /v1/workspaces/{workspaceId}` |
  | Workspace | Get Workspaces | `GET /v1/workspaces` |
  | Workspace | Add User to Workspace | `POST /v1/workspaces/{workspaceId}/users` |
  | Workspace | Add Members to Workspace | `POST /v1/workspaces/{workspaceId}/users` (one request per user, `role: "member"`) |
  | Workspace | Remove Users from Workspace | `DELETE /v1/workspaces/{workspaceId}/users/{userId}` (one request per user) |
  | Workspace | Add Users to Groups | `POST /v1/workspaces/{workspaceId}/groups/{groupId}/users` (one request per user × group) |
  | Workspace | Remove User from Group | `DELETE /v1/workspaces/{workspaceId}/groups/{groupId}/users/{userId}` (one request per user) |

  ### Agent

  * **Create Agent** — Creates a new AI agent in a workspace. Required: `Name`, `Prompt`, `Language Model ID`, `Workspace ID`. Optional: `Description`, `Display Mode` (`Apenas Eu` or `Grupos` — when `Grupos` is selected, `Group IDs` becomes required as a JSON array), `Tools` (JSON array of tool IDs), `Enable Web Search`, `Enable Thinking`, `Thinking Level` (`Mínimo`, `Baixo`, `Médio`, `Alto` — only when `Enable Thinking` is on), `Datasource ID`. `enableDeepAgent` is always sent as `false` and `thinkingBudgetTokens` as `null` to mirror the backend contract.
  * **Update Agent** — Partial update via `PATCH`. Always-visible fields: `Agent ID` and `Workspace ID`. The optional **Update Fields** collection accepts: `Datasource ID`, `Departments IDs`, `Description`, `Display Mode`, `Enable Thinking`, `Enable Web Search`, `Language Model ID`, `Name`, `Prompt`, `Thinking Level`, `Tools`. **Only the fields you explicitly add are sent in the body.** `enableDeepAgent: false` and `thinkingBudgetTokens: null` are always included. When `Enable Thinking` is `false`, `thinkingLevel` is forced to `null`; when `true`, the chosen level is sent.
  * **Delete Agent by ID** — Deletes an agent by its identifier.
  * **Get Agent by ID** — Retrieves a specific agent.
  * **Get Agents** — Lists all agents (optionally scoped by `Workspace ID`).

  ### Chat

  * **Send Message** — Sends a message to one or more agents. Required: `Message`, `Agent IDs` (JSON array), `Language` (default `pt-br`). Optional: `Chat ID` (to continue an existing conversation) and `Hide Chat` (boolean controlling chat visibility in the response).
  * **Get Chat by ID** — Retrieves a single chat conversation.
  * **Get Chats** — Lists all chats.

  ### Datasource

  * **Get Datasource by ID** — Retrieves a specific datasource.
  * **Get Datasources** — Lists all available datasources.

  ### Group

  * **Create Group** — Creates a new group inside a workspace. Required: `Name`, `Workspace ID`. Optional: `Description`.
  * **Delete Group** — Deletes a group.
  * **Get Group by ID** — Retrieves a specific group.
  * **Get Groups** — Lists all groups (optionally scoped by `Workspace ID`).

  ### Language Model

  * **Create Language Model** — Creates a new language model. The `Platform` selector drives which fields appear:
    | Platform (UI label / internal value) | Fields exposed (besides Name, Description, Type, Is Default, API Model) |
    | --- | --- |
    | **OpenAI** (`OpenAI`) | API Key |
    | **Azure OpenAI** (`Microsoft`) | API Key, Endpoint, API Version, Model Name, Max Tokens |
    | **Azure Foundry** (`AzureFoundry`) | API Key, Endpoint, API Version, Max Tokens |
    | **Gemini (Vertex)** (`Vertex`) | API Key |
    | **AWS Bedrock** (`Bedrock`) | Region, Access Key, Secret Key, Bearer Token, Max Tokens |
    | **Anthropic** (`Anthropic`) | API Key, Max Tokens |

    * Supported `Type` values: `Chat Completion`, `OCR`, `Multimodal`, `Translation`, `Emedding`, `Web Search` (sent verbatim).
    * `tool` is mapped automatically from the chosen `Platform` (`OpenAI` → `OpenAI`, `Microsoft` → `Azure OpenAI`, `AzureFoundry` → `Azure Foundry`, `Vertex` → `Gemini`, `Bedrock` → `AWS Bedrock`, `Anthropic` → `Anthropic`).
    * `isActive` is always sent as `true` and `departmentsIds` as an empty array.

  * **Update Language Model** — Partial update via `PATCH`. Always-visible: `Language Model ID` and `Platform` (drives which fields are available inside **Update Fields**). The optional **Update Fields** collection accepts (subject to the same platform rules above): `Access Key`, `API Key`, `API Model`, `API Version`, `Bearer Token`, `Description`, `Endpoint`, `Is Default`, `Max Tokens`, `Model Name`, `Name`, `Region`, `Secret Key`, `Type`. **Only the fields you explicitly add are sent in the body.** `platform`, `tool` (derived from `Platform`) and `isActive: true` are always included. The fields `departmentsIds` and `iconUrl` are intentionally **not** exposed and cannot be modified through this node.

  * **Delete Language Model by ID** — Removes a language model.
  * **Get Language Model by ID** — Retrieves a single language model.
  * **Get Language Models** — Lists all language models.
  * **Link Language Model to Workspace** — Links an existing language model to a workspace.
  * **Unlink Language Model from Workspace** — Unlinks a language model from a workspace.

  ### Tool

  * **Create Tool** — Creates a new tool inside a workspace. The `Tool Type` selector drives which fields appear:
    * **HTTP**:
      * Required: `Name`, `Description`, `Docstring`, `Method` (`GET`/`POST`/`PUT`/`DELETE`/`PATCH`), `URL`, `Auth Type` (`No Auth`, `Basic Auth`, `Bearer Token`, `JWT Bearer`).
      * Optional: `Headers` (key/value collection), `Param Sets` (JSON array), `Body`, plus credential fields specific to the chosen `Auth Type`.
    * **MCP**:
      * Required: `Name`, `Description`, `Docstring`, `Server URL`, `Transport Type` (`HTTP`, `SSE`, `STDIO`), `Auth Type` (`None` or `Bearer`), `Timeout`.
      * Optional: `Auth Config` (key/value collection), `Selected Tools` (JSON array of exposed tool names), bearer token credential when `Auth Type` is `Bearer`.

  * **Update Tool** — Partial update via `PATCH`. Always-visible: `Tool ID` and `Tool Type` (HTTP or MCP — drives which fields are available inside **Update Fields**). The optional **Update Fields** collection accepts:
    * **HTTP**: `Auth Type`, `Body`, `Description`, `Docstring`, `Headers`, `Method`, `Name`, `Param Sets`, `URL`.
    * **MCP**: `Auth Config`, `Auth Type`, `Description`, `Docstring`, `Name`, `Selected Tools`, `Server URL`, `Timeout`, `Transport Type`.
    * **Only the fields you explicitly add are sent in the body.** `type` is always sent according to the selected `Tool Type`. The fields `workspaceId` and `iconUrl` are intentionally **not** exposed and cannot be modified through this node.

  * **Delete Tool by ID** — Removes a tool.

  ### User

  * **Create User** — Creates a new user. Required: `Email`, `Name`, `Login Type` (`Email e Senha` or `Azure AD`), `Global Role` (`User` or `Global Admin`). The `Password` field is required only when `Login Type` is `Email e Senha`. Optional: `Phone`, `Company Department`, `Job Title`, `Manager Email`.
  * **Activate User by ID** — Activates a user.
  * **Revoke User by ID** — Revokes (deactivates) a user.
  * **Delete User by ID** — Permanently deletes a user.

  ### Workspace

  * **Create Workspace** — Creates a new workspace. Required: `Name`. Optional: `Description`, `Type` (`Sandbox`, `Trial`, or `Production`). The `menuConfig` payload is applied with all features enabled by default.
  * **Delete Workspace** — Deletes a workspace.
  * **Get Workspace by ID** — Retrieves a single workspace.
  * **Get Workspaces** — Lists all workspaces.
  * **Add User to Workspace** — Adds a single user with a selectable `Role` (`admin`, `member`, or `owner`).
  * **Add Members to Workspace** — Adds one or more users as members. Accepts a JSON array of user IDs and produces **one request per user** with `role: "member"`.
  * **Remove Users from Workspace** — Removes one or more users. Accepts a JSON array of user IDs (one request per user).
  * **Add Users to Groups** — Adds one or more users to one or more groups within a workspace. Accepts JSON arrays of user IDs and group IDs (one request per user × group).
  * **Remove User from Group** — Removes one or more users from a specific group within a workspace. Accepts a JSON array of user IDs (one request per user).

  > **Note about batch operations:** every governance operation that receives a JSON array of user IDs (Add Members, Remove Users, Add Users to Groups, Remove User from Group) produces **one output item per user/group pair processed**, so downstream nodes can react to each individual call.

  ## Credentials

  To use this node you need to authenticate with Belake.ai using API key authentication.

  ### Prerequisites

  1. **Belake.ai account** — sign up at [https://www.belake.ai/](https://www.belake.ai/) if you don't have one.
  2. **Backend URL** — your Belake.ai backend instance URL (e.g., `https://[instance].belake.ai`). All API routes use the `/v1` prefix automatically — do **not** include it in the URL.
  3. **API Key** — issued from the Belake.ai portal.

  ### Authentication method

  This node uses **API Key authentication** with the following flow:

  * Your **Backend URL** and **API Key** are stored in the credential (no HTTP requests happen at credential level — fully compliant with n8n's marketplace requirements).
  * On every workflow execution, the node exchanges your API key for a bearer token via `POST /login/api-key-auth` using `this.helpers.httpRequest()`.
  * That bearer token is then attached as `Authorization: Bearer …` to all subsequent calls within the same execution.

  ### Setting up credentials

  1. In n8n, create a new credential and select **Belake API**.
  2. Enter your **Backend URL** including the protocol (e.g., `https://your-team.belake.ai`).
  3. Paste your **API Key**.
  4. Click **Test** to verify the credentials.
  5. Save.

  For a deeper walkthrough (including troubleshooting and security guidelines) see [credentials/README.md](credentials/README.md).

  ## Compatibility

  * Requires **n8n ≥ 1.0.0** and the **Nodes API v1** with strict mode enabled.
  * TypeScript-first implementation with full `IDataObject` typing — no `any`.
  * All operations honor n8n's **Continue on Fail** mode and surface `NodeOperationError` with descriptive messages on validation failures (invalid JSON arrays, missing required fields, etc.).

  ### Technical implementation

  * **Credentials** store the API key and backend URL without performing HTTP requests.
  * **Authentication** is performed at execution time using `this.helpers.httpRequest()`.
  * **Operations map** — a single declarative `Record<resource, Record<operation, () => Promise<...>>>` keeps each operation's logic isolated and easy to extend.
  * **Helpers** — internal `parseIdArray` helper validates JSON-array inputs (e.g., agent IDs, group IDs, tool IDs) and throws user-friendly `NodeOperationError`s when the input is malformed.

  ## Usage

  ### Send a message to one or more agents

  The most common workflow: send a chat message and route the response.

  1. Add a **Belake.ai** node to your workflow.
  2. Pick your saved **Belake API** credentials.
  3. Resource = **Chat**, Operation = **Send Message**.
  4. Configure the parameters:
     * **Message** — the text content to send.
     * **Agent IDs** — JSON array of agent IDs, e.g. `["agent_abc","agent_def"]`.
     * **Language** — language code (default `pt-br`).
     * **Chat ID** *(optional)* — pass an existing chat ID to continue a conversation.
     * **Hide Chat** — controls whether the chat appears in the user's history.
  5. Execute.

  ### Create an HTTP tool and attach it to a new agent

  1. **Tool** → **Create Tool**, with `Tool Type = HTTP`. Fill in `Name`, `Description`, `Docstring`, `Method`, `URL`, `Auth Type` (and corresponding credentials), optional `Headers`/`Body`/`Param Sets`, plus `Workspace ID`. Capture the resulting tool ID.
  2. **Agent** → **Create Agent**, with the desired `Language Model ID`, `Workspace ID`, and pass the captured tool ID inside the `Tools` JSON array.

  ### Provision a Language Model and link it to a workspace

  1. **Language Model** → **Create Language Model**, picking the appropriate `Platform` (e.g., `Azure OpenAI`) and filling in only the platform-specific fields shown by the UI.
  2. **Language Model** → **Link Language Model to Workspace**, passing the new `Language Model ID` and the target `Workspace ID`.
  3. *(Optional)* **Language Model** → **Update Language Model** to tweak only the fields you want without overwriting unrelated ones.

  ### Partially update an Agent / Tool / Language Model

  The three `Update *` operations follow the same pattern:

  * They expose an **Update Fields** collection that starts empty.
  * Add only the fields you actually want to change — anything you leave out is **not** sent to the backend, so it stays untouched.
  * For Agent / Language Model the `enableDeepAgent`, `thinkingBudgetTokens`, `platform`, `tool` and `isActive` book-keeping fields are filled in automatically by the node where applicable.

  ### Best practices

  * Use descriptive credential names per Belake.ai instance/environment.
  * Use chat continuation (`Chat ID`) to preserve conversation context across messages.
  * Wrap fan-out operations (Add Members, Add Users to Groups, etc.) with **Continue on Fail** when partial success is acceptable — the node already produces one output item per user/group pair processed.
  * Prefer the `Update *` operations over `Create *` whenever you only need to change a subset of fields, to avoid silently overwriting backend-managed properties.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Belake.ai homepage](https://www.belake.ai/)
  * [Belake.ai API credentials documentation](credentials/README.md)
  * [Project changelog](CHANGELOG.md) (auto-generated by `auto-changelog`)

  ## Version history

  * **v1.0.3** - API v1 routes and Workspace resource
    * Migrated all API endpoints to `/v1` prefix
    * Replaced Department resource with Group resource
    * Added Workspace resource with Get Workspace by ID and Get Workspaces operations
    * Workspace ID field available across resources for filtering

  * **v1.0.2** - Architecture improvements
    * Refactored authentication to comply with n8n best practices
    * Moved token exchange from credentials to node execution
    * Implemented declarative operations map for cleaner code
    * Enhanced type safety (removed `any` types)
    * Improved error handling and code maintainability

  * **v1.0.1** - Repository updates
    * Renamed repository references and added lint file

  * **v1.0.0** - First release
    * Support for Agent, Chat, Datasource, Department, and Language Model resources
    * API key authentication
    * Operations for retrieving and managing Belake.ai resources
    * Chat message sending with multi-agent support and language specification

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with Belake.ai, an AI platform for managing agents, chats, datasources, groups, language models, and workspaces within automation workflows.","capabilities":["Retrieve agent information by ID or list all agents","Retrieve chat information by ID or list all chats","Send messages to AI agents with language specification and chat continuation support","Retrieve datasource information by ID or list all datasources","Retrieve group information by ID or list all groups","Retrieve language model information by ID or list all language models","Retrieve workspace information by ID or list all workspaces","Filter resource queries by workspace ID","Control chat visibility in responses"],"authentication":"API Key Authentication","commonUseCases":["Sending messages to AI agents for chat interactions","Managing and listing AI agents, chats, and workspaces","Retrieving configuration details for datasources, groups, and language models","Maintaining conversation context using chat continuation"],"limitations":["Requires an active Belake.ai account and backend instance URL","Requires n8n version 1.0.0 or higher","Only read operations (Get) and message sending (Send Message) are documented; other CRUD operations may not be available"],"relatedNodes":["n8n-nodes-core.httpRequest","n8n-nodes-core.credential"]}


node_type: n8n-nodes-airparser.airparser
package_name: n8n-nodes-airparser
display_name: Airparser
description: Extract structured data from emails, PDFs, images, and other documents
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: andrew_io
author_github_url: https://github.com/Airparser/
npm_package_name: n8n-nodes-airparser
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:33.394Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "importFileSync",
      "options": [
        {
          "name": "Import File",
          "value": "importFileSync",
          "action": "Import a binary file into an inbox and return extracted data immediately",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a binary file into an inbox and return extracted data immediately"
        },
        {
          "name": "Import Text/HTML",
          "value": "importTextHtmlSync",
          "action": "Import a text html document into an inbox and return extracted data immediately",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a text/HTML document into an inbox and return extracted data immediately"
        },
        {
          "name": "Import File (Async)",
          "value": "importFile",
          "action": "Import a binary file into an inbox asynchronously and return the document ID",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a binary file into an inbox asynchronously and return the document ID"
        },
        {
          "name": "Import Text/HTML (Async)",
          "value": "importTextHtml",
          "action": "Import a text html document into an inbox asynchronously and return the document ID",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a text/HTML document into an inbox asynchronously and return the document ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Import File",
      "value": "importFileSync",
      "action": "Import a binary file into an inbox and return extracted data immediately",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a binary file into an inbox and return extracted data immediately",
      "resource": "document"
    },
    {
      "name": "Import Text/HTML",
      "value": "importTextHtmlSync",
      "action": "Import a text html document into an inbox and return extracted data immediately",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a text/HTML document into an inbox and return extracted data immediately",
      "resource": "document"
    },
    {
      "name": "Import File (Async)",
      "value": "importFile",
      "action": "Import a binary file into an inbox asynchronously and return the document ID",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a binary file into an inbox asynchronously and return the document ID",
      "resource": "document"
    },
    {
      "name": "Import Text/HTML (Async)",
      "value": "importTextHtml",
      "action": "Import a text html document into an inbox asynchronously and return the document ID",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a text/HTML document into an inbox asynchronously and return the document ID",
      "resource": "document"
    }
  ]

npm_readme:
  # Airparser n8n Node

  > 🧩 Official n8n Node to interact with [Airparser](https://airparser.com): import documents and extract structured data from emails, PDFs, images, and other documents.

  [About](#about)  
  [Operations](#operations)  
  [Credentials](#credentials)  
  [Usage](#usage)  
  [Resources](#resources)

  ## About

  **Airparser** is a powerful document parsing service that extracts structured data from emails, PDFs, images, and other documents using AI and machine learning.

  This official **n8n Node** allows you to:

  ✅ Import documents into Airparser for parsing  
  ✅ Automatically trigger workflows when documents are parsed  
  ✅ Extract structured data and use it in your automation workflows

  ## Operations

  ### Airparser Actions

  - **Import Document From File**
    - Use when you have a binary file (PDF, image, email attachment, etc.)
    - Example: Send files uploaded to a Google Drive folder to Airparser for data extraction
    - Automatically extracts structured data from the document

  - **Import Text/HTML Document**
    - Use when you have HTML pages, email content, or plain text
    - Example: Parse HTML from a website or email body content
    - Perfect for extracting data from web pages or text-based content

  ### Airparser Trigger

  - **Document Parsed**
    - Automatically starts your workflow when a document is parsed in Airparser
    - Receives the extracted data and passes it to the next node
    - Built-in security to protect your webhook

  ## Credentials

  ### Airparser API Key

  1. Sign in to your [Airparser account](https://app.airparser.com/account)
  2. Go to your account settings
  3. Copy your **API Key**

  In n8n:

  - Click **"Add Credential"** and search for **"Airparser API"**
  - Paste your API Key

  For more information, visit the [Airparser documentation](https://help.airparser.com/).

  ## Usage

  ### Airparser Trigger

  **Quick Start:**

  1. Add the **Airparser Trigger** node to your workflow
  2. Select **"Document processed"** as the event
  3. Choose the **Inbox** where you want to receive events
  4. Activate your workflow

  That's it! Your workflow will now automatically run whenever a document is parsed in the selected inbox.

  **What happens:**

  - When a document is parsed in your Airparser inbox, the trigger receives the extracted data
  - The data is automatically passed to the next node in your workflow
  - You can use this data in any n8n node (send emails, update databases, create records, etc.)

  **Example Use Cases:**

  - **Email Notifications**: Send an email notification when an invoice is parsed
  - **Data Logging**: Save parsed data to Google Sheets or Airtable
  - **CRM Updates**: Create or update records in your CRM when documents are processed
  - **Approval Workflows**: Route documents for approval based on parsed data

  ### Import Document From File

  1. Select the **Import Document From File** operation
  2. Choose an **Inbox** from the dropdown
  3. Enter the **Document File (Binary)** property name (usually "data")
  4. Optionally add a custom **Filename** or **Additional Metadata**

  **Example workflow:**

  - Read a PDF file → Airparser node → Extract data → Use in next steps

  ### Import Text/HTML Document

  1. Select the **Import Text/HTML Document** operation
  2. Choose an **Inbox** from the dropdown
  3. Enter the **HTML/Text Content** (paste directly or use an expression)
  4. Optionally add a custom **Filename** or **Additional Metadata**

  **Example workflow:**

  - Fetch HTML from a website → Airparser node → Extract data → Process results

  ## Resources

  - [Airparser](https://airparser.com) — Document parsing & data extraction
  - [Airparser Documentation](https://help.airparser.com/) — Help and guides
  - [n8n](https://n8n.io) — Workflow automation platform
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

ai_documentation_summary:
  {"purpose":"This n8n node interacts with the Airparser service to extract structured data from emails, PDFs, images, and other documents using AI and machine learning.","capabilities":["Import documents from binary files (PDFs, images, email attachments)","Import text or HTML content (web pages, email bodies)","Trigger workflows automatically when documents are parsed","Extract structured data for use in subsequent automation steps","Support custom metadata and filename configuration"],"authentication":"API Key required","commonUseCases":["Automated invoice processing and data logging","CRM record creation or updates from parsed documents","Email notification triggers based on document content","Approval workflows initiated by document parsing","Data extraction from web pages or text sources"],"limitations":[],"relatedNodes":["n8n-nodes-core.binaryData","n8n-nodes-core.httpRequest","n8n-nodes-core.code","n8n-nodes-github.githubWebhook","n8n-nodes-google-sheets.googleSheets"]}


node_type: @seclore/n8n-nodes-seclore.secloreProtect
package_name: @seclore/n8n-nodes-seclore
display_name: Seclore
description: Protect files using Seclore DRM
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: seclore_admin
author_github_url: https://github.com/seclore-tech/n8n-nodes-seclore.git
npm_package_name: @seclore/n8n-nodes-seclore
npm_version: 1.0.8
community_fetched_at: 2026-07-14T14:40:33.395Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "drmProtection",
      "options": [
        {
          "name": "DRM Protection",
          "value": "drmProtection",
          "description": "DRM file protection operations"
        },
        {
          "name": "DRM Unprotection",
          "value": "drmUnprotection",
          "description": "DRM file unprotection operations"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "protectWithHotFolder",
      "options": [
        {
          "name": "Protect Using Policy",
          "value": "protectWithHotFolder",
          "action": "Protect file using policy",
          "description": "Protect a file using HotFolder ID configuration"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "drmProtection"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "unprotect",
      "options": [
        {
          "name": "Unprotect",
          "value": "unprotect",
          "action": "Unprotect file",
          "description": "Unprotect a protected file"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "drmUnprotection"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Protect Using Policy",
      "value": "protectWithHotFolder",
      "action": "Protect file using policy",
      "description": "Protect a file using HotFolder ID configuration",
      "resource": "drmProtection"
    },
    {
      "name": "Unprotect",
      "value": "unprotect",
      "action": "Unprotect file",
      "description": "Unprotect a protected file",
      "resource": "drmUnprotection"
    }
  ]

npm_readme:
  # n8n-nodes-seclore

  This is an n8n community node. It lets you use Seclore DRM Server in your n8n workflows.

  [Seclore](https://www.seclore.com) is a leading data-centric security platform that provides enterprise-grade Digital Rights Management (DRM) capabilities to protect sensitive files and documents throughout their lifecycle.

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

  Use `n8n-nodes-seclore` as the package name.

  ## Operations

  This node supports the following operations with Seclore DRM Server:

  ### DRM Protection
  #### Protect using Policy
  - **Description**: Protects files using Seclore's HotFolder ID configuration and policy-based protection
  - **Required Parameters**:
    - **HotFolder ID**: The ID of the HotFolder configuration to use for protection
    - **Input Binary Property**: Name of the binary property containing the file to protect (default: 'data')
  - **Output**: Protected file with DRM protection applied according to the specified policy


  ### DRM Unprotection
  #### Unprotect
  - **Description**: Removes DRM protection from Seclore-protected files
  - **Required Parameters**:
    - **Input Binary Property**: Name of the binary property containing the protected file (default: 'data')
  - **Output**: Unprotected original file content


  ## Credentials

  To use this node, you need to authenticate with your Seclore DRM Server. The following credentials are required:

  ### Prerequisites
  - Access to a Seclore DRM Server instance
  - Valid tenant credentials (Tenant ID and Tenant Secret)
  - Appropriate permissions for file protection/unprotection operations

  ### Authentication Setup
  1. **Base URL**: The base URL of your Seclore DRM Server (e.g., `https://api.seclore.com`)
  2. **Tenant ID**: Your unique Seclore tenant identifier
  3. **Tenant Secret**: Your tenant's secret key for API authentication

  ### Configuration Steps
  1. In n8n, go to **Credentials** → **Create New**
  2. Search for "Seclore API" and select it
  3. Fill in your Seclore DRM Server details:
     - **Base URL**: Enter your Seclore DRM Server base URL
     - **Tenant ID**: Provide your unique tenant identifier
     - **Tenant Secret**: Enter your tenant's secret key (will be masked for security)
  4. Test the connection to ensure credentials are valid (tests against `/seclore/drm/1.0/auth/login` endpoint)
  5. Save the credentials for use in your workflows

  ## Compatibility

  - **Minimum n8n version**: 1.0.0
  - **Tested with n8n versions**: 1.0.0+
  - **Node.js version**: 18.x or higher
  - **Seclore API version**: Compatible with Seclore DRM API v1.0

  ## Usage

  ### Basic Workflow Examples

  #### Protecting Files with Policy
  1. Use a trigger node to receive files (HTTP Request, File Trigger, etc.)
  2. Add the **Seclore** node to your workflow
  3. Configure the node:
     - **Resource**: Select "DRM Protection"
     - **Operation**: Select "Protect using Policy"
     - **HotFolder ID**: Enter your HotFolder configuration ID
     - **Input Binary Property**: Specify the binary property name (default: 'data')
  4. Configure your Seclore API credentials
  5. The node will return the protected file with DRM encryption applied according to your policy

  #### Unprotecting Files
  1. Receive protected Seclore files in your workflow
  2. Add the **Seclore** node to your workflow
  3. Configure the node:
     - **Resource**: Select "DRM Unprotection"
     - **Operation**: Select "Unprotect"
     - **Input Binary Property**: Specify the binary property containing the protected file (default: 'data')
  4. Configure your Seclore API credentials
  5. The node will return the original unprotected file content

  ### Important Notes
  - Ensure your Seclore DRM Server is accessible from your n8n instance
  - File operations may take time depending on file size and server performance
  - Always handle errors appropriately in your workflows
  - Protected files can only be unprotected by authorized users with proper credentials
  - HotFolder ID must be configured in your Seclore Policy Server before using protection operations
  - The node supports binary data processing for both input and output files

  ### Error Handling
  The node includes comprehensive error handling and logging:
  - Connection failures to Seclore server
  - Authentication errors
  - File processing errors
  - Automatic cleanup of temporary files

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Seclore Official Documentation](https://docs.seclore.com/)
  * [Seclore Support](https://support.seclore.com/)

  ## License

  Refer the [LICENSE.md](LICENSE.md) file for details.

  ## Support

  For issues related to this n8n node:
  - Create an issue in this repository
  - Contact: support@seclore.com

  For Seclore platform support:
  - Visit [Seclore Support Portal](https://support.seclore.com/)
  - Check [Seclore Documentation](https://docs.seclore.com/)

ai_documentation_summary:
  {"purpose":"This n8n community node enables protection and unprotection of files using Seclore DRM Server, allowing secure handling of sensitive documents within automated workflows.","capabilities":["Protect files using Seclore DRM with policy-based HotFolder configuration","Unprotect files to retrieve original content from Seclore-protected files","Process binary data for input and output files","Authenticate with Seclore DRM Server via Base URL, Tenant ID, and Tenant Secret","Handle errors including connection failures, authentication errors, and file processing issues"],"authentication":"API key required (Tenant ID and Tenant Secret)","commonUseCases":["Securing sensitive documents in automated workflows","Protecting files before distribution or storage","Removing DRM restrictions from previously protected files","Integrating with file-based triggers or HTTP requests for secure file handling"],"limitations":["Requires access to a Seclore DRM Server instance","HotFolder ID must be pre-configured in the Seclore Policy Server","Protected files can only be unprotected by authorized users with proper credentials","File operations may experience latency based on file size and server performance","Requires n8n version 1.0.0+ and Node.js 18.x or higher"],"relatedNodes":["HTTP Request","File Trigger","Binary File"]}


node_type: n8n-nodes-parsio.parsio
package_name: n8n-nodes-parsio
display_name: Parsio
description: Extract structured data from emails, PDFs, images, and other documents
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: andrew_io
author_github_url: https://github.com/parsioio/
npm_package_name: n8n-nodes-parsio
npm_version: 0.2.1
community_fetched_at: 2026-07-14T14:40:33.396Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "importFileSync",
      "options": [
        {
          "name": "Import File",
          "value": "importFileSync",
          "action": "Import a binary file into a mailbox and return extracted data immediately",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a binary file into a mailbox and return extracted data immediately"
        },
        {
          "name": "Import Text/HTML",
          "value": "importTextHtmlSync",
          "action": "Import a text or html document into a mailbox and return extracted data immediately",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a text or HTML document into a mailbox and return extracted data immediately"
        },
        {
          "name": "Import File (Async)",
          "value": "importFile",
          "action": "Import a binary file into a mailbox asynchronously and return the document ID",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a binary file into a mailbox asynchronously and return the document ID"
        },
        {
          "name": "Import Text/HTML (Async)",
          "value": "importTextHtml",
          "action": "Import a text or html document into a mailbox asynchronously and return the document ID",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            }
          },
          "description": "Import a text or HTML document into a mailbox asynchronously and return the document ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Import File",
      "value": "importFileSync",
      "action": "Import a binary file into a mailbox and return extracted data immediately",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a binary file into a mailbox and return extracted data immediately",
      "resource": "document"
    },
    {
      "name": "Import Text/HTML",
      "value": "importTextHtmlSync",
      "action": "Import a text or html document into a mailbox and return extracted data immediately",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a text or HTML document into a mailbox and return extracted data immediately",
      "resource": "document"
    },
    {
      "name": "Import File (Async)",
      "value": "importFile",
      "action": "Import a binary file into a mailbox asynchronously and return the document ID",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a binary file into a mailbox asynchronously and return the document ID",
      "resource": "document"
    },
    {
      "name": "Import Text/HTML (Async)",
      "value": "importTextHtml",
      "action": "Import a text or html document into a mailbox asynchronously and return the document ID",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        }
      },
      "description": "Import a text or HTML document into a mailbox asynchronously and return the document ID",
      "resource": "document"
    }
  ]

npm_readme:
  # Parsio n8n Node

  > 🧩 Official n8n Node to interact with [Parsio](https://parsio.io): import documents and extract structured data from emails, PDFs, images, and other documents.

  [About](#about)  
  [Operations](#operations)  
  [Credentials](#credentials)  
  [Usage](#usage)  
  [Resources](#resources)

  ## About

  **Parsio** is a powerful document parsing service that extracts structured data from emails, PDFs, images, and other documents using AI and machine learning.

  This official **n8n Node** allows you to:

  ✅ Import documents into Parsio for parsing  
  ✅ Automatically trigger workflows when documents are parsed  
  ✅ Extract structured data and use it in your automation workflows

  ## Operations

  ### Parsio Actions

  - **Import File**
    - Synchronous by default: uploads a binary file and returns parsed data in the same node execution
    - Use when you have a PDF, image, email attachment, or other binary file
    - Async variant is also available when you only need the created document ID

  - **Import Text/HTML**
    - Synchronous by default: uploads text or HTML content and returns parsed data in the same node execution
    - Use when you have HTML pages, email content, or plain text
    - Async variant is also available when you want the workflow to continue without waiting for parsing

  ### Parsio Trigger

  - **Document Parsed**
    - Automatically starts your workflow when a document is parsed in Parsio
    - Receives the extracted data and passes it to the next node
    - Built-in security to protect your webhook

  ## Credentials

  ### Parsio API Key

  1. Sign in to your [Parsio account](https://app.parsio.io/account)
  2. Go to your account settings
  3. Copy your **API Key**

  In n8n:

  - Click **"Add Credential"** and search for **"Parsio API"**
  - Paste your API Key

  For more information, visit the [Parsio documentation](https://help.parsio.io/).

  ## Usage

  ### Parsio Trigger

  **Quick Start:**

  1. Add the **Parsio Trigger** node to your workflow
  2. Select **"Document Processed"** as the event
  3. Choose the **Mailbox** where you want to receive events
  4. Activate your workflow

  That's it! Your workflow will now automatically run whenever a document is parsed in the selected inbox.

  **What happens:**

  - When a document is parsed in your Parsio mailbox, the trigger receives the extracted data
  - The data is automatically passed to the next node in your workflow
  - You can use this data in any n8n node (send emails, update databases, create records, etc.)

  **Example Use Cases:**

  - **Email Notifications**: Send an email notification when an invoice is parsed
  - **Data Logging**: Save parsed data to Google Sheets or Airtable
  - **CRM Updates**: Create or update records in your CRM when documents are processed
  - **Approval Workflows**: Route documents for approval based on parsed data

  ### Import File

  1. Select the **Import File** operation
  2. Choose a **Mailbox** from the dropdown
  3. Enter the **Document File (Binary)** property name (usually "data")
  4. Optionally add a custom **Filename** or **Additional Metadata**

  **Example workflow:**

  - Read a PDF file → Parsio node → Extract data → Use in next steps

  ### Import Text/HTML

  1. Select the **Import Text/HTML** operation
  2. Choose a **Mailbox** from the dropdown
  3. Enter the **HTML/Text Content** (paste directly or use an expression)
  4. Optionally add a custom **Filename** or **Additional Metadata**

  **Example workflow:**

  - Fetch HTML from a website → Parsio node → Extract data → Process results

  ## Resources

  - [Parsio](https://parsio.io) — Document parsing & data extraction
  - [Parsio Documentation](https://help.parsio.io/) — Help and guides
  - [n8n](https://n8n.io) — Workflow automation platform
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

ai_documentation_summary:
  {"purpose":"This n8n node enables the extraction of structured data from emails, PDFs, images, and other documents using the Parsio AI document parsing service.","capabilities":["Import binary documents (PDFs, images, email attachments)","Import text or HTML content","Trigger workflows automatically when documents are parsed","Extract structured data for use in automation workflows"],"authentication":"API Key required","commonUseCases":["Email notifications based on parsed invoice data","Logging parsed data to databases or spreadsheets","Updating CRM records from processed documents","Automating approval workflows based on document content"],"limitations":[],"relatedNodes":["n8n-nodes-base.webhook","n8n-nodes-base.httpRequest","n8n-nodes-base.binaryFile"]}


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

updated_at: 2026-07-14 14:40:33
author_name: anthonybrebion
author_github_url: https://github.com/abrebion/
npm_package_name: n8n-nodes-realm
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:33.397Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "chat",
      "options": [
        {
          "name": "Chat",
          "value": "chat"
        },
        {
          "name": "Assistant",
          "value": "assistant"
        },
        {
          "name": "Connector",
          "value": "connector"
        },
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get chats",
          "routing": {
            "request": {
              "url": "=/chats",
              "method": "GET"
            }
          },
          "description": "Get many chat conversations"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a chat",
          "routing": {
            "request": {
              "url": "=/chats/{{$parameter.chatId}}",
              "method": "GET"
            }
          },
          "description": "Get a single chat conversation"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a chat",
          "routing": {
            "request": {
              "url": "=/chats/{{$parameter.chatId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a chat"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Start a chat",
          "routing": {
            "request": {
              "url": "={{$parameter[\"additionalFields\"]?.streamResponse ? \"/chats-streaming\" : \"/chats\"}}",
              "method": "POST"
            }
          },
          "description": "Start a new chat or continue an existing one"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "chat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get assistants",
          "routing": {
            "request": {
              "url": "/assistants",
              "method": "GET"
            }
          },
          "description": "Get assistants"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "assistant"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get connectors",
          "routing": {
            "request": {
              "url": "/connectors",
              "method": "GET"
            }
          },
          "description": "Get connectors"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connector"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create or Update",
          "value": "createOrUpdate",
          "action": "Create or update documents",
          "routing": {
            "request": {
              "url": "=/documents/{{$parameter.connectorId}}",
              "method": "POST"
            }
          },
          "description": "Create or update documents for a connector"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a document",
          "routing": {
            "request": {
              "url": "=/documents/{{$parameter.connectorId}}/{{$parameter.documentId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a document"
        },
        {
          "name": "Delete Old Documents",
          "value": "deleteOldDocuments",
          "action": "Delete documents older than a specified timestamp",
          "routing": {
            "request": {
              "qs": {
                "older_than": "={{$parameter.olderThan + \"Z\"}}"
              },
              "url": "=/documents/{{$parameter.connectorId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete documents older than a specified timestamp"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a document",
          "routing": {
            "request": {
              "qs": {
                "fields": "={{$parameter.fieldsToInclude}}"
              },
              "url": "=/documents/{{$parameter.connectorId}}/{{$parameter.documentId}}",
              "method": "GET",
              "arrayFormat": "repeat"
            }
          },
          "description": "Get a single document"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get documents",
          "routing": {
            "request": {
              "qs": {
                "fields": "={{$parameter.fieldsToInclude}}"
              },
              "url": "=/documents/{{$parameter.connectorId}}/",
              "method": "GET",
              "arrayFormat": "repeat"
            }
          },
          "description": "Get documents for a connector"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get chats",
      "routing": {
        "request": {
          "url": "=/chats",
          "method": "GET"
        }
      },
      "description": "Get many chat conversations",
      "resource": "chat"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a chat",
      "routing": {
        "request": {
          "url": "=/chats/{{$parameter.chatId}}",
          "method": "GET"
        }
      },
      "description": "Get a single chat conversation",
      "resource": "chat"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a chat",
      "routing": {
        "request": {
          "url": "=/chats/{{$parameter.chatId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a chat",
      "resource": "chat"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Start a chat",
      "routing": {
        "request": {
          "url": "={{$parameter[\"additionalFields\"]?.streamResponse ? \"/chats-streaming\" : \"/chats\"}}",
          "method": "POST"
        }
      },
      "description": "Start a new chat or continue an existing one",
      "resource": "chat"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get assistants",
      "routing": {
        "request": {
          "url": "/assistants",
          "method": "GET"
        }
      },
      "description": "Get assistants",
      "resource": "assistant"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get connectors",
      "routing": {
        "request": {
          "url": "/connectors",
          "method": "GET"
        }
      },
      "description": "Get connectors",
      "resource": "connector"
    },
    {
      "name": "Create or Update",
      "value": "createOrUpdate",
      "action": "Create or update documents",
      "routing": {
        "request": {
          "url": "=/documents/{{$parameter.connectorId}}",
          "method": "POST"
        }
      },
      "description": "Create or update documents for a connector",
      "resource": "document"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a document",
      "routing": {
        "request": {
          "url": "=/documents/{{$parameter.connectorId}}/{{$parameter.documentId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a document",
      "resource": "document"
    },
    {
      "name": "Delete Old Documents",
      "value": "deleteOldDocuments",
      "action": "Delete documents older than a specified timestamp",
      "routing": {
        "request": {
          "qs": {
            "older_than": "={{$parameter.olderThan + \"Z\"}}"
          },
          "url": "=/documents/{{$parameter.connectorId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete documents older than a specified timestamp",
      "resource": "document"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a document",
      "routing": {
        "request": {
          "qs": {
            "fields": "={{$parameter.fieldsToInclude}}"
          },
          "url": "=/documents/{{$parameter.connectorId}}/{{$parameter.documentId}}",
          "method": "GET",
          "arrayFormat": "repeat"
        }
      },
      "description": "Get a single document",
      "resource": "document"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get documents",
      "routing": {
        "request": {
          "qs": {
            "fields": "={{$parameter.fieldsToInclude}}"
          },
          "url": "=/documents/{{$parameter.connectorId}}/",
          "method": "GET",
          "arrayFormat": "repeat"
        }
      },
      "description": "Get documents for a connector",
      "resource": "document"
    }
  ]

npm_readme:
  # n8n-nodes-realm

  This is an n8n community node. It lets you consume Realm API in your n8n workflows.

  Realm is an AI-powered enterprise search engine that unifies your knowledge bases (Google Drive, Slack, Jira, Confluence, Salesforce, Gong, etc.) and makes them accessible to custom AI assistants.

  With the Realm API, you can programmatically add, edit, and delete documents for custom connectors (non-native knowledge data sources) and interact with Realm assistants.

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

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

  ## Installation

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

  ## Operations

  This node supports the following resources/operations:

  * Create or continue a chat conversation
  * Get a single chat conversation
  * Get many chat conversations
  * Delete a chat conversation
  * Get all asssistants
  * Get all connectors
  * Create or update documents in a connector
  * Get all documents from a connector
  * Get a specific document from a connector
  * Delete a specific document from a connector
  * Delete documents from a connector older than a specified timestamp

  ## Credentials

  * From the Realm app, create an API key and give it access to assistants.
  * In n8n, create a new Realm credential. Enter your API base url (e.g. https://your-account.withrealm.com/api/external/alpha) and the API key you've just created.

  ## Usage

  In your Workflow, find the Realm node and use as you need. I accept comments and suggestions in Issues repository on GitHub.

  ## Compatibility

  Tested against n8n version 1.117.3+

  ## Resources

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

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the Realm API to manage AI-powered enterprise search, including chat conversations and document operations across various knowledge bases.","capabilities":["Create or continue a chat conversation","Retrieve single, multiple, or specific chat conversations","Delete chat conversations","List all available assistants","List all available connectors","Create or update documents in custom connectors","Retrieve all documents from a connector","Retrieve a specific document from a connector","Delete specific documents from a connector","Delete documents older than a specified timestamp"],"authentication":"API key required","commonUseCases":["Integrating custom data sources into an AI knowledge base","Managing chat history and conversations programmatically","Automating document indexing and retrieval from external systems","Cleaning up old documents from connectors"],"limitations":["Requires manual setup of Realm API key and base URL in n8n credentials","Limited to operations supported by the Realm API (no custom logic beyond API calls)","Community node status may imply less official support or updates"],"relatedNodes":["n8n-nodes-http.request","n8n-nodes-github","n8n-nodes-slack","n8n-nodes-gdrive"]}


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

updated_at: 2026-07-14 14:40:33
author_name: dumitrucucu
author_github_url: https://github.com/agency-ai-solutions/
npm_package_name: n8n-nodes-agencii
npm_version: 0.4.0
community_fetched_at: 2026-07-14T14:40:33.398Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "chat",
      "options": [
        {
          "name": "Chat",
          "value": "chat"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendMessage",
      "options": [
        {
          "name": "Send Message",
          "value": "sendMessage",
          "action": "Send message to agency",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/",
              "method": "POST"
            }
          },
          "description": "Send a message to your agency on the Agencii.ai platform and receive a response"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "chat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "hidden",
      "default": "getResponse",
      "routing": {
        "send": {
          "type": "body",
          "property": "operation"
        }
      },
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "chat"
          ],
          "operation": [
            "sendMessage"
          ]
        }
      }
    }
  ]

operations:
  [
    {
      "name": "Send Message",
      "value": "sendMessage",
      "action": "Send message to agency",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/",
          "method": "POST"
        }
      },
      "description": "Send a message to your agency on the Agencii.ai platform and receive a response",
      "resource": "chat"
    }
  ]

npm_readme:
  # n8n-nodes-agencii

  This is an n8n community node for the **Agencii.ai Platform**. It connects your n8n workflows to your agency-swarm powered agencies on the Agencii.ai platform.

  [Agencii.ai](https://agencii.ai) is an AI automation platform that uses [agency-swarm](https://github.com/VRSEN/agency-swarm) to provide infrastructure for building and deploying AI agent agencies. The platform enables you to create multi-agent systems where specialized agents work together to accomplish complex tasks.

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

  ## How It Works

  This integration connects your n8n workflows directly to your agencies on the Agencii.ai platform:

  1. **Platform Configuration**: In your Agencii.ai dashboard, you configure n8n integration settings for your agency
  2. **Integration ID**: Each agency gets a unique n8n integration ID that identifies which agency to route requests to
  3. **Default Agent Routing**: When you send a message through this node, the platform routes it to your agency's default agent
  4. **Agency-Swarm Processing**: Your agency (powered by agency-swarm) processes the request using its configured agents and tools
  5. **Response**: The agency's response is returned to your n8n workflow for further processing

  ## Table of Contents

  - [How It Works](#how-it-works)
  - [Installation](#installation)
  - [Operations](#operations)
  - [Design Principles](#design-principles)
  - [Credentials](#credentials)
  - [Usage](#usage)
  - [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.

  ### Quick Install

  1. Go to **Settings > Community Nodes** in your n8n instance
  2. Select **Install**
  3. Enter `n8n-nodes-agencii`
  4. Agree to the risks and select **Install**

  After installation, the **Agencii** node will be available in your node palette.

  ## Operations

  The Agencii node supports the following operation:

  ### Send Message

  Send a message to your agency on the Agencii.ai platform and receive a response from your agency's default agent.

  **Parameters:**

  - **Message** (required): The message or task to send to your agency
  - **Session ID** (optional): Identifier to continue an existing conversation. If not provided, a new session is created automatically.
  - **Integration ID** (required): The specific Integration ID for the agency you want to connect to

  Note: Model selection, temperature, max tokens, tools, and agent behavior are configured on the Agencii.ai platform (see [Agency Swarm Overview](https://agency-swarm.ai/welcome/overview)).

  **Returns:**

  - `text`: The agency's response to your message
  - `response`: Alias for `text` (for backwards compatibility)
  - `sessionId`: The session identifier (for continuing the conversation in follow-up calls)
  - `n8nIntegrationId`: The integration ID used
  - Additional metadata fields as provided by the backend

  ## Design Principles

  - Connectivity, not configuration:
    - This node connects n8n to your agencies on the Agencii.ai platform. It does not configure agent behavior.
  - Platform-managed tuning:
    - Model, temperature, max tokens, system prompts, tools, and multi-agent logic are defined on the platform.
  - Fixed endpoint:
    - The endpoint is fixed and not user-editable in this node. Routing to the correct agency is handled via your Integration ID.
  - Default agent routing:
    - Messages are routed to your agency’s default agent unless otherwise configured on the platform.
  - Session-focused:
    - Provide `Session ID` to continue context; omit it to start a new session automatically.

  ## Credentials

  To use this node, you need to configure your Agencii.ai Platform credentials:

  ### Prerequisites

  1. Sign up for an Agencii.ai account at [agencii.ai](https://agencii.ai)
  2. Get your API key from your Agencii dashboard
  3. For each workflow, you'll need the specific Integration ID for the agency you want to connect to

  ### Setting Up Credentials in n8n

  1. In n8n, go to **Credentials** and click **Add Credential**
  2. Search for **Agencii API** and select it
  3. Fill in the following field:
     - **API Key**: Your Agencii.ai API key for authentication
  4. Click **Save**

  ### Configuring Each Node

  Each Agencii node instance requires an **Integration ID** parameter that specifies which agency to connect to. This allows you to:

  - Connect different nodes to different agencies in the same workflow
  - Reuse the same API credentials across multiple agencies
  - Easily switch between agencies by changing the Integration ID parameter

  ### Authentication Method

  The node uses Bearer token authentication (API Key in header) and sends your Integration ID as a URL query parameter to route requests to the correct agency on the Agencii.ai platform.

  ## Usage

  ### Single Request

  Use the **Send Message** operation to send a single message to your agency and receive a response.

  **Example Use Case:** Task execution via agency

  ```
  1. Add an Agencii node to your workflow
  2. Select Resource: Chat
  3. Select Operation: Send Message
  4. Set Integration ID: Your agency's Integration ID from Agencii dashboard
  5. Set Message: "Analyze the customer feedback data and provide a summary: {{$json.feedbackData}}"
  6. Leave Session ID empty (a new session will be created automatically)
  ```

  **Result:** Your agency processes the request using its configured agents and tools, returning the result.

  ### Multi-Turn Conversation

  For conversational workflows where context matters, reuse the `sessionId` from previous calls in subsequent **Send Message** calls to maintain session continuity.

  **Example Use Case:** Interactive data analysis with context

  ```
  Step 1: Initial request
  - Add an Agencii node
  - Select Resource: Chat
  - Select Operation: Send Message
  - Set Integration ID: Your agency's Integration ID
  - Set Message: "Analyze this sales data and identify trends: {{$json.salesData}}"
  - Leave Session ID empty (stores the sessionId in output)

  Step 2: Follow-up questions
  - Add another Agencii node
  - Select Resource: Chat
  - Select Operation: Send Message
  - Set Integration ID: Same Integration ID as Step 1
  - Set Message: "Based on those trends, what should our Q4 strategy be?"
  - Set Session ID: {{$node["Previous Node"].json.sessionId}}
  - Your agency will remember the previous analysis and provide contextual recommendations
  ```

  **Benefits:**

  - Your agency maintains conversation context across multiple interactions
  - More natural and contextual task execution
  - Efficient processing as the agency remembers prior exchanges

  ### Advanced Patterns

  #### Conditional Session Management

  Use an IF node to check if a `sessionId` exists. If yes, reuse it for conversation continuity; if no, a new session will be created automatically.

  #### Session Persistence

  Store `sessionId` values in n8n's built-in data storage or an external database to maintain long-running conversations with your agency across multiple workflow executions.

  ### Understanding Agency Routing

  When you send a message through this node:

  1. Your **Integration ID** identifies which agency to route to
  2. The message is sent to your agency's **default agent** (configured in Agencii.ai platform)
  3. Your agency, powered by **agency-swarm**, coordinates between its agents to process the request
  4. Each agent has specific tools and capabilities configured in your agency setup
  5. The agency returns the final response to your n8n workflow

  **Note:** Agent behavior, system prompts, tools, and capabilities are all configured within the Agencii.ai platform, not in this n8n node. The node simply connects n8n to your pre-configured agency.

  ## Compatibility

  - **Minimum n8n version:** 1.0.0
  - **Tested on:** n8n v1.0.0+
  - **Node API Version:** 1

  This node uses n8n's declarative routing feature for simplified API integration.

  ## Resources

  - [n8n Documentation](https://docs.n8n.io/)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/#community-nodes)
  - [Agencii.ai Platform](https://agencii.ai)
  - [Agency Swarm Overview](https://agency-swarm.ai/welcome/overview)
  - [Agency-Swarm Framework](https://github.com/VRSEN/agency-swarm)
  - [Agencii.ai Documentation](https://docs.agencii.ai)

  ## Support

  For issues, questions, or feature requests:

  - Open an issue on [GitHub](https://github.com/agency-ai-solutions/n8n-nodes-agencii/issues)
  - Join the [n8n community](https://community.n8n.io/)

  ## Version History

  ### 0.1.0 (Initial Release)

  - ✨ Initial implementation of Agencii.ai Platform integration for n8n
  - 🚀 Support for **Send Message** operation: Send messages to your agency-swarm powered agencies
  - 🔐 Secure API authentication via Integration ID (routes to specific agency)
  - 🤖 Direct integration with agency-swarm infrastructure on Agencii.ai
  - 📊 Response includes `text`, `response` (alias), and `sessionId` fields
  - 💬 Session management for multi-turn conversations with agencies
  - 📝 Comprehensive documentation and workflow examples

  ## License

  [MIT](LICENSE)

  ## Contributing

  Contributions are welcome! Please feel free to submit a Pull Request.

ai_documentation_summary:
  {"purpose":"Connects n8n workflows to Agencii.ai platform agencies to send messages and receive responses from configured multi-agent systems.","capabilities":["Send messages to agency default agents","Maintain conversation context via Session ID","Route requests to specific agencies using Integration ID","Return structured responses including text, sessionId, and metadata"],"authentication":"API Key (Bearer token in header)","commonUseCases":["Automated task execution via AI agent agencies","Multi-turn conversational workflows with context retention","Customer feedback analysis and summarization","Interactive data processing with specialized agents"],"limitations":["Model selection, temperature, max tokens, and agent behavior are configured on the Agencii.ai platform, not in n8n","Messages are routed to the default agent unless configured otherwise on the platform","Endpoint is fixed and not user-editable in the node","Session ID must be managed by the user for multi-turn conversations"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: n8n-nodes-upcellapi.upcellApi
package_name: n8n-nodes-upcellapi
display_name: upcell API
description: Get data from the upcell API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: justinsweeney
author_github_url: https://github.com/UpCell/n8n-node.git
npm_package_name: n8n-nodes-upcellapi
npm_version: 0.3.0
community_fetched_at: 2026-07-14T14:40:33.399Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "enrichMobile",
      "options": [
        {
          "name": "Enrich Mobile",
          "value": "enrichMobile"
        },
        {
          "name": "Enrich Email",
          "value": "enrichEmail"
        },
        {
          "name": "Enrich Social URL",
          "value": "enrichSocialUrl"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Post",
          "value": "post",
          "action": "Enrich mobile",
          "routing": {
            "request": {
              "url": "/enrich/contact",
              "body": {
                "fields": "={{[\"mobile\"]}}",
                "linkedinUrl": "={{ $parameter.linkedinUrl }}"
              },
              "method": "POST"
            }
          },
          "description": "Enrich contact with mobile phone"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "enrichMobile"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Post",
          "value": "post",
          "action": "Enrich email",
          "routing": {
            "request": {
              "url": "/enrich/email",
              "body": {
                "last_name": "={{ $parameter.lastName }}",
                "first_name": "={{ $parameter.firstName }}",
                "company_domain": "={{ $parameter.companyDomain }}"
              },
              "method": "POST"
            }
          },
          "description": "Enrich contact with email address"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "enrichEmail"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Post",
          "value": "post",
          "action": "Enrich social url",
          "routing": {
            "request": {
              "url": "/enrich/socialurl",
              "body": {
                "email": "={{ $parameter.email }}",
                "title": "={{ $parameter.title }}",
                "last_name": "={{ $parameter.lastName }}",
                "first_name": "={{ $parameter.firstName }}",
                "company_name": "={{ $parameter.companyName }}",
                "mobile_phone": "={{ $parameter.mobilePhone }}",
                "company_domain": "={{ $parameter.companyDomain }}",
                "company_social_url": "={{ $parameter.companySocialUrl }}"
              },
              "method": "POST"
            }
          },
          "description": "Enrich contact with social URL"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "enrichSocialUrl"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Post",
      "value": "post",
      "action": "Enrich mobile",
      "routing": {
        "request": {
          "url": "/enrich/contact",
          "body": {
            "fields": "={{[\"mobile\"]}}",
            "linkedinUrl": "={{ $parameter.linkedinUrl }}"
          },
          "method": "POST"
        }
      },
      "description": "Enrich contact with mobile phone",
      "resource": "enrichMobile"
    },
    {
      "name": "Post",
      "value": "post",
      "action": "Enrich email",
      "routing": {
        "request": {
          "url": "/enrich/email",
          "body": {
            "last_name": "={{ $parameter.lastName }}",
            "first_name": "={{ $parameter.firstName }}",
            "company_domain": "={{ $parameter.companyDomain }}"
          },
          "method": "POST"
        }
      },
      "description": "Enrich contact with email address",
      "resource": "enrichEmail"
    },
    {
      "name": "Post",
      "value": "post",
      "action": "Enrich social url",
      "routing": {
        "request": {
          "url": "/enrich/socialurl",
          "body": {
            "email": "={{ $parameter.email }}",
            "title": "={{ $parameter.title }}",
            "last_name": "={{ $parameter.lastName }}",
            "first_name": "={{ $parameter.firstName }}",
            "company_name": "={{ $parameter.companyName }}",
            "mobile_phone": "={{ $parameter.mobilePhone }}",
            "company_domain": "={{ $parameter.companyDomain }}",
            "company_social_url": "={{ $parameter.companySocialUrl }}"
          },
          "method": "POST"
        }
      },
      "description": "Enrich contact with social URL",
      "resource": "enrichSocialUrl"
    }
  ]

npm_readme:
  # n8n-nodes-upcellapi

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

  upcell provides B2B contact and sales intelligence data.

  [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

  * Enrich Contact - enrich a contact with mobile data
  * Enrich Email - enrich a contact with a verified email address
  * Enrich Social URL - enrich a contact with a social url

  ## Credentials

  In order to use the upcell node, you will need to first obtain an upcell API key by contacting [sales@upcell.io](mailto:sales@upcell.io).

  ## Compatibility

  This has been tested against n8n version 1.115.3.

  ## Usage

  To understand more about the APIs available from upcell, visit https://api.upcell.io.

  If you are new to n8n and community nodes, you can [Try it out](https://docs.n8n.io/try-it-out/) to get started.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [upcell API Docs](https://www.upcell.io)

ai_documentation_summary:
  {"purpose":"This n8n community node retrieves B2B contact and sales intelligence data from the upcell API, including mobile data, verified email addresses, and social URLs.","capabilities":["Enrich contact with mobile data","Enrich contact with verified email address","Enrich contact with social URL"],"authentication":"API key required (obtained by contacting sales@upcell.io)","commonUseCases":["Lead enrichment in sales workflows","Contact data validation","Social media link retrieval for prospects"],"limitations":["Community node (not official n8n node)","Requires manual API key acquisition via email contact"],"relatedNodes":["n8n-nodes-upcellapi.upcellApi"]}


node_type: @tehw0lf/n8n-nodes-toon.toon
package_name: @tehw0lf/n8n-nodes-toon
display_name: TOON
description: Convert between TOON and JSON formats with zero external dependencies
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: tehw0lf
author_github_url: https://github.com/tehw0lf/n8n-nodes-toon.git
npm_package_name: @tehw0lf/n8n-nodes-toon
npm_version: 1.3.2
community_fetched_at: 2026-07-14T14:40:33.400Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "jsonToToon",
      "options": [
        {
          "name": "JSON to TOON",
          "value": "jsonToToon",
          "action": "Convert JSON to TOON",
          "description": "Convert JSON data to TOON format"
        },
        {
          "name": "TOON to JSON",
          "value": "toonToJson",
          "action": "Convert TOON to JSON",
          "description": "Parse TOON format to JSON"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "JSON to TOON",
      "value": "jsonToToon",
      "action": "Convert JSON to TOON",
      "description": "Convert JSON data to TOON format"
    },
    {
      "name": "TOON to JSON",
      "value": "toonToJson",
      "action": "Convert TOON to JSON",
      "description": "Parse TOON format to JSON"
    }
  ]

npm_readme:
  # @tehw0lf/n8n-nodes-toon

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

  This is an n8n community node that provides bidirectional conversion between **TOON (Token-Oriented Object Notation)** and JSON formats. TOON is a line-oriented, indentation-based format optimized for LLM prompts and structured data interchange.

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

  ## Table of Contents

  - [What is TOON?](#what-is-toon)
  - [Installation](#installation)
  - [Operations](#operations)
  - [Configuration Options](#configuration-options)
  - [Usage Examples](#usage-examples)
  - [Use Cases](#use-cases)
  - [Compatibility](#compatibility)
  - [Zero Dependencies](#zero-dependencies)
  - [Resources](#resources)

  ## What is TOON?

  **TOON (Token-Oriented Object Notation)** is a compact text format that encodes the JSON data model with explicit structure and minimal quoting. It's particularly efficient for arrays of uniform objects — common in data exports, API responses, and LLM prompts.

  ### Key Features

  - **Line-oriented and indentation-based** — similar to YAML but more deterministic
  - **Minimal quoting** — strings are quoted only when necessary
  - **Explicit array lengths** — detect truncation and malformed data
  - **Tabular arrays** — declare field lists once, then list values row by row
  - **Multiple delimiters** — comma, tab, or pipe for different use cases
  - **Zero external dependencies** — pure Node.js implementation

  ### Quick Example

  **JSON:**
  ```json
  {
    "users": [
      {"id": 1, "name": "Alice", "role": "admin"},
      {"id": 2, "name": "Bob", "role": "user"}
    ]
  }
  ```

  **TOON:**
  ```
  users[2]{id,name,role}:
    1,Alice,admin
    2,Bob,user
  ```

  The TOON format is **50% more compact** than JSON for tabular data, making it ideal for:
  - **LLM prompts** — fit more context in token limits
  - **Data serialization** — compact representation of structured data
  - **API responses** — human-readable but machine-parseable
  - **Configuration files** — cleaner syntax than JSON

  ## Installation

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

  ### npm

  ```bash
  npm install @tehw0lf/n8n-nodes-toon
  ```

  ### n8n Cloud

  In n8n Cloud or self-hosted n8n (v0.200+):

  1. Go to **Settings** → **Community Nodes**
  2. Select **Install**
  3. Enter `@tehw0lf/n8n-nodes-toon` and agree to the risks
  4. Click **Install**

  The TOON node will appear in your node palette under the **Transform** category.

  ## Operations

  The TOON node supports two operations:

  ### 1. JSON to TOON

  Convert JSON data to TOON format.

  **Input:** JSON object or array
  **Output:** TOON formatted text

  **Use case:** Prepare data for LLM prompts, compact serialization

  ### 2. TOON to JSON

  Parse TOON formatted text back to JSON.

  **Input:** TOON formatted text
  **Output:** JSON object or array

  **Use case:** Parse LLM responses, deserialize TOON data

  ## Configuration Options

  ### Encoding Options (JSON→TOON)

  | Option | Type | Default | Description |
  |--------|------|---------|-------------|
  | **Indent Size** | Number | `2` | Spaces per indentation level |
  | **Delimiter** | Choice | `comma` | Delimiter for array values (`comma`, `tab`, `pipe`) |
  | **Key Folding** | Choice | `off` | Collapse single-key chains (`off`, `safe`) |
  | **Flatten Depth** | Number | `999` | Maximum segments to fold (999 = unlimited) |
  | **Include Token Metrics** | Boolean | `false` | Add token count comparison to output |

  ### Decoding Options (TOON→JSON)

  | Option | Type | Default | Description |
  |--------|------|---------|-------------|
  | **Expected Indent Size** | Number | `2` | Expected indentation for validation |
  | **Strict Mode** | Boolean | `true` | Enforce array counts and indentation |
  | **Expand Paths** | Choice | `off` | Split dotted keys (`off`, `safe`) |

  ### Input/Output Configuration

  | Option | Type | Default | Description |
  |--------|------|---------|-------------|
  | **Input Data** | String | `={{ $json }}` | Data to convert. Supports drag-and-drop, field names, dot notation, and expressions. Auto-detects input type. |
  | **Output Field** | String | `data` | Field name for output |

  #### Input Data Details

  The **Input Data** field auto-detects the input type:
  - **Drag-and-drop**: Drag fields from the left panel - automatically evaluated by n8n
  - **Field names**: Simple field access (e.g., `data`)
  - **Dot notation**: Nested access (e.g., `users[0].name`)
  - **Expressions**: Full n8n expressions (e.g., `={{ $json.users.filter(u => u.active) }}`)
  - **Literal TOON** (for decoding): If a string doesn't match a field path, treated as TOON data

  ### Token Metrics Output

  When **Include Token Metrics** is enabled for JSON→TOON conversion, the output includes a `tokenMetrics` object:

  ```json
  {
    "data": "users[2]{id,name}:\n  1,Alice\n  2,Bob",
    "tokenMetrics": {
      "json": 123,
      "toon": 58,
      "saved": 65,
      "reduction": 0.5285
    }
  }
  ```

  - **json**: Estimated token count for JSON input
  - **toon**: Estimated token count for TOON output
  - **saved**: Number of tokens saved
  - **reduction**: Reduction ratio (0.5285 = 52.85% reduction)

  ## Usage Examples

  ### Example 1: LLM Context Preparation

  **Workflow:** Fetch Users → JSON to TOON → Send to LLM

  Use TOON to fit more context into LLM token limits while maintaining readability.

  **Input (JSON):**
  ```json
  {
    "users": [
      {"id": 1, "name": "Alice", "role": "admin", "active": true},
      {"id": 2, "name": "Bob", "role": "user", "active": true},
      {"id": 3, "name": "Charlie", "role": "user", "active": false}
    ]
  }
  ```

  **Output (TOON - comma delimiter):**
  ```
  users[3]{id,name,role,active}:
    1,Alice,admin,true
    2,Bob,user,true
    3,Charlie,user,false
  ```

  **Token Savings:** ~40-50% fewer tokens than equivalent JSON for structured data.

  ### Example 2: Parse LLM Structured Output

  **Workflow:** Send Prompt to LLM → TOON to JSON → Process Data

  LLMs can generate TOON format more reliably than JSON due to simpler syntax.

  **LLM Output (TOON):**
  ```
  result:
    tasks[3]{name,priority,status}:
      "Update docs",high,pending
      "Fix bug #123",high,done
      "Refactor code",low,pending
    summary: "3 tasks identified"
  ```

  **Parsed JSON:**
  ```json
  {
    "result": {
      "tasks": [
        {"name": "Update docs", "priority": "high", "status": "pending"},
        {"name": "Fix bug #123", "priority": "high", "status": "done"},
        {"name": "Refactor code", "priority": "low", "status": "pending"}
      ],
      "summary": "3 tasks identified"
    }
  }
  ```

  ### Example 3: Working with CSV Data

  n8n has excellent built-in CSV support via the "Extract from File" node. Use TOON for transformations:

  **Workflow:** Read File → Extract from CSV → JSON to TOON → Transform → TOON to JSON → Use Data

  1. Use n8n's "Extract from File" (CSV) node to parse CSV files
  2. The extracted data is already JSON (one item per row)
  3. Use "JSON to TOON" to convert to TOON format for LLM processing
  4. Use "TOON to JSON" to convert back to JSON for further processing

  ### Example 4: Key Folding for Nested Data

  **Workflow:** API Request → JSON to TOON (Key Folding: Safe) → Transform

  Simplify deeply nested JSON structures.

  **Input:**
  ```json
  {
    "user": {
      "profile": {
        "name": "Alice",
        "email": "alice@example.com"
      }
    }
  }
  ```

  **Output (with Key Folding):**
  ```
  user.profile.name: Alice
  user.profile.email: alice@example.com
  ```

  ### Example 5: Different Delimiters

  Use tab delimiters for data with commas in values.

  **TOON (tab delimiter):**
  ```
  products[2]{id	name	price}:
    1	"Widget, Small"	9.99
    2	"Gadget, Large"	19.99
  ```

  ## Use Cases

  ### 1. LLM Integration

  **Problem:** JSON wastes tokens on quotes, brackets, and redundant keys.

  **Solution:** TOON reduces token usage by 40-50% for structured data.

  ```
  Workflow: Data Source → JSON to TOON → LLM → TOON to JSON → Process
  ```

  ### 2. API Response Transformation

  **Problem:** API responses are verbose JSON that's hard to read in logs.

  **Solution:** Convert to TOON for compact, human-readable logging.

  ```
  Workflow: API Request → JSON to TOON → Log/Store → TOON to JSON → Use
  ```

  ### 3. Data Format Conversion

  **Problem:** Need to transform data between different formats for different systems.

  **Solution:** Use TOON as an intermediate format for transformations.

  ```
  Workflow: Extract from CSV → JSON to TOON → Transform → TOON to JSON → Send to API
  ```

  ### 4. Configuration Management

  **Problem:** JSON config files are verbose and don't support comments well.

  **Solution:** Store configs in TOON format for better readability.

  ```
  Workflow: Read TOON Config → TOON to JSON → Apply Settings
  ```

  ### 5. Report Generation

  **Problem:** Need to generate readable reports from structured data.

  **Solution:** Convert to TOON for human-friendly text representation.

  ```
  Workflow: Fetch Data → JSON to TOON → Format Report → Send Email
  ```

  ## Compatibility

  - **n8n version:** 0.200.0 or later
  - **Node.js:** 18.x or later
  - **TOON Specification:** v3.0

  ## Specification Compliance

  This node implements **TOON Specification v3.0** with comprehensive coverage of all core features and major optional features.

  ### Implemented Features

  ✅ **Core Features (100%)**
  - All JSON data types (objects, arrays, primitives)
  - Indentation-based structure with configurable spacing
  - Array length declarations `[N]`
  - Tabular arrays for uniform objects `[N]{field1,field2}:`
  - All three delimiters: comma (default), tab, pipe
  - Deterministic string quoting and escaping
  - Strict mode validation with array count and width checking

  ✅ **Optional Features**
  - **Key Folding** (`keyFolding: "safe"`) - Collapse nested single-key objects into dotted paths (e.g., `{a: {b: {c: 1}}}` → `a.b.c: 1`)
  - **Path Expansion** (`expandPaths: "safe"`) - Expand dotted keys back into nested objects during decoding

  ### Not Implemented

  ❌ **Hyphen Syntax for List-Item Objects (§10)** - Optional YAML-style compact notation for objects in arrays. This is a purely cosmetic encoding optimization that doesn't affect functionality or data compatibility. Our implementation uses standard object indentation instead, which is equally spec-compliant and easier to maintain.

  ### Round-Trip Guarantee

  All JSON data can be encoded to TOON and decoded back to JSON with full fidelity. The implementation passes all conformance requirements for encoders and decoders per the specification.

  ## Advanced Features

  ### Strict Mode

  When enabled (default), the decoder validates:
  - Array element counts match declared length
  - Indentation multiples match expected indent size
  - Proper structure and syntax

  Disable for lenient parsing of hand-written TOON.

  ### Path Expansion

  Convert dotted keys into nested objects:

  **TOON:**
  ```
  user.name: Alice
  user.email: alice@example.com
  ```

  **JSON (with expandPaths: safe):**
  ```json
  {
    "user": {
      "name": "Alice",
      "email": "alice@example.com"
    }
  }
  ```

  ### Round-Trip Guarantees

  TOON guarantees lossless round-trip conversion:

  - **JSON → TOON → JSON** preserves all data and structure
  - Works with any valid JSON input
  - Maintains data types (strings, numbers, booleans, null)

  ## Zero Dependencies

  This node has **zero production dependencies**:
  - Pure Node.js implementation
  - No external libraries required
  - Minimal package size
  - No security vulnerabilities from dependencies

  **Note:** There is another package called `n8n-nodes-toon` (non-scoped) that wraps the official `@toon-format/toon` library. This package (`@tehw0lf/n8n-nodes-toon`) implements the TOON specification directly, resulting in zero production dependencies and full control over the implementation.

  ## Troubleshooting

  ### Issue: "Input must be a string" error

  **Cause:** TOON to JSON operation expects string input.

  **Solution:** Ensure input field contains TOON text, not a JSON object.

  ### Issue: Strict mode validation errors

  **Cause:** TOON data doesn't match expected structure.

  **Solution:** Disable strict mode or fix indentation/counts in TOON data.

  ### Issue: Key folding conflicts

  **Cause:** Both `user.name` and `user` keys exist in same object.

  **Solution:** Use `keyFolding: "safe"` which only folds when safe, or disable key folding.

  ### Issue: Round-trip doesn't match exactly

  **Cause:** TOON normalizes data (e.g., -0 → 0, sorts object keys).

  **Solution:** This is expected — TOON preserves semantic meaning, not exact formatting.

  ## Automated Monitoring

  This repository includes automated workflows for continuous monitoring:

  ### Specification Monitoring

  Monitors the official TOON specification for updates:

  - **Frequency:** Checks run every Monday at 9:00 AM UTC
  - **Automatic Detection:** Compares `toonSpecVersion` in `package.json` against the upstream GitHub Releases API
  - **Issue Creation:** Automatically opens a GitHub issue when updates are detected
  - **Manual Trigger:** Can be triggered manually via GitHub Actions

  When a specification update is detected, the workflow:
  1. Creates a labeled issue (`spec-update`, `enhancement`) with version details
  2. Includes a diff summary showing the changes
  3. Provides links to the official specification
  4. Avoids duplicate issues for the same version

  See [`.github/workflows/monitor-spec.yml`](.github/workflows/monitor-spec.yml) for implementation details.

  ### Security Monitoring

  Performs comprehensive security scanning to detect vulnerabilities:

  - **Frequency:** Runs daily at 2:00 AM UTC
  - **Source Code Scanning:** Semgrep analysis for security issues (OWASP Top 10, etc.)
  - **Dependency Scanning:** npm audit on dependencies
  - **Published Package Scanning:** Checks the live npm package for newly disclosed vulnerabilities
  - **Automatic Trigger:** Also runs on changes to `package.json` or `package-lock.json`

  When vulnerabilities are detected, the workflow:
  1. Creates a labeled issue (`security`, `vulnerability`, `dependencies`)
  2. Includes severity levels and full audit report
  3. Provides remediation guidance with specific commands
  4. Updates existing issues instead of creating duplicates

  See [`.github/workflows/security-scan.yml`](.github/workflows/security-scan.yml) for implementation details.

  ## Resources

  - **TOON Specification v3.0:** Official spec at [github.com/toon-format/spec](https://github.com/toon-format/spec) or see [SPEC.md](SPEC.md) in this repository
  - **n8n Documentation:** https://docs.n8n.io/
  - **Community Nodes Guide:** https://docs.n8n.io/integrations/community-nodes/
  - **GitHub Repository:** https://github.com/tehw0lf/n8n-nodes-toon
  - **Issues & Support:** https://github.com/tehw0lf/n8n-nodes-toon/issues

  ## License

  MIT © [tehw0lf](https://github.com/tehw0lf)

  ## Author

  **tehw0lf** <tehwolf@protonmail.com>

  ## Contributing

  Contributions are welcome! Please open an issue or pull request on GitHub.

  ---

  **Note:** This node implements the [TOON Specification v3.0](https://github.com/toon-format/spec). See `SPEC.md` for complete format documentation or visit the official spec repository.

ai_documentation_summary:
  {"purpose":"Converts data between TOON (Token-Oriented Object Notation) and JSON formats, optimizing for compactness in LLM prompts and structured data interchange.","capabilities":["JSON to TOON conversion","TOON to JSON parsing","Customizable indentation and delimiters","Token count metrics calculation","Key folding for compact output","Strict mode validation for TOON parsing","Support for comma, tab, and pipe delimiters","Support for nested key expansion"],"authentication":"None","commonUseCases":["Reducing token usage in LLM prompts","Compact serialization of tabular data","Parsing structured API responses","Data interchange between systems"],"limitations":["TOON format is optimized for arrays of uniform objects and may not be ideal for deeply nested or highly variable structures","Token metrics are estimated, not actual API token counts","Strict mode may reject valid but non-conforming TOON data"],"relatedNodes":["n8n HTTP Request","n8n Code","n8n Set","n8n Split In Batches"]}


node_type: n8n-nodes-clipboardgenie.clipboardGenie
package_name: n8n-nodes-clipboardgenie
display_name: Clipboard Genie
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: genielaboratories
author_github_url: https://github.com/genielaboratories/
npm_package_name: n8n-nodes-clipboardgenie
npm_version: 0.1.7
community_fetched_at: 2026-07-14T14:40:33.401Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Integrate n8n with the ClipboardGenie app to send and receive clipboard data between your desktop and workflows.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "item",
      "options": [
        {
          "name": "Item",
          "value": "item"
        },
        {
          "name": "Notification",
          "value": "notification"
        }
      ],
      "required": true,
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createText",
      "options": [
        {
          "name": "Create Text Item",
          "value": "createText",
          "action": "Create text item",
          "description": "Create a new text item in the desktop app"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "item"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "show",
      "options": [
        {
          "name": "Show",
          "value": "show",
          "action": "Show notification",
          "description": "Displays a system notification on your desktop with an optional title and message"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "notification"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Text Item",
      "value": "createText",
      "action": "Create text item",
      "description": "Create a new text item in the desktop app",
      "resource": "item"
    },
    {
      "name": "Show",
      "value": "show",
      "action": "Show notification",
      "description": "Displays a system notification on your desktop with an optional title and message",
      "resource": "notification"
    }
  ]

npm_readme:
  ﻿# n8n-nodes-clipboardgenie

  This is an n8n community node. It allows you to connect **Clipboard Genie** with your n8n workflows.

  **Clipboard Genie** is a modern Windows clipboard manager with pinboards, advanced search, and desktop notifications.
  With this node, you can send text items directly to the app or trigger desktop notifications from your workflows.


  > This is a community-contributed node. It is not affiliated with or maintained by n8n GmbH.


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

  ---

  ## Installation

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

  ```bash
  # Inside your n8n instance
  npm install n8n-nodes-clipboardgenie
  ```

  After installation, restart n8n to load the new node.

  ---

  ## Operations

  This node provides two resources:

  ### 🗂️ Resource: Item

  **Operation: Create Text Item**

  Creates a new text item in your Clipboard Genie desktop app.
  You can choose the pinboard where the item will appear, optionally show it on the main board, and display a system notification.

  #### Parameters

  | Name                                 | Type    | Required    | Default | Description                                                                                                                                                                                                                                                                                                                                          |
  | ------------------------------------ | ------- | ----------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | **Pinboard Name**                    | String  | ✅ Yes       | `""`    | Specify the pinboard name where the item will be added.                                                                                                                                                                                                                                                                                              |
  | **Show on Main Board**               | Boolean | No          | `false` | Also display the item on your main board.                                                                                                                                                                                                                                                                                                            |
  | **Text to Send**                     | String  | ✅ Yes       | `""`    | The text content of the new item.                                                                                                                                                                                                                                                                                                                    |
  | **Open Link or Path**                | String  | No          | `""`    | Optional URL, file path, or command associated with the item. When provided, a button in the app will open it directly.<br>Supported formats: `https://example.com`, `file:///Users/name/file.pdf`, `file://app.name --param value`.<br>For Windows paths with spaces, wrap them in quotes, e.g. `"C:\\Program Files\\App\\app.exe" "--flag value"`. |
  | **Show System Notification**         | Boolean | No          | `true`  | Display a desktop notification when the item is received.                                                                                                                                                                                                                                                                                            |
  | **Notification Title**               | String  | Conditional | `""`    | Optional title displayed in the notification (only shown if notifications are enabled).                                                                                                                                                                                                                                                              |
  | **Notification Message**             | String  | Conditional | `""`    | Optional body text for the notification.                                                                                                                                                                                                                                                                                                             |
  | **Close Notification Automatically** | Boolean | Conditional | `false` | Automatically close the notification after a short delay.                                                                                                                                                                                                                                                                                            |

  ---

  ### 🔔 Resource: Notification

  **Operation: Show**

  Displays a native desktop notification with an optional title, message, and “Open” button.

  #### Parameters

  | Name                     | Type    | Required | Default | Description                                                                             |
  | ------------------------ | ------- | -------- | ------- | --------------------------------------------------------------------------------------- |
  | **Notification Title**   | String  | No       | `""`    | Optional title. If not set, a default title will appear.                                |
  | **Notification Message** | String  | ✅ Yes    | `""`    | Main content of the notification.                                                       |
  | **Open Link or Path**    | String  | No       | `""`    | Optional URL, file path, or app command. When provided, a button will open it directly. |
  | **Auto Close**           | Boolean | No       | `false` | Automatically close the notification after a short delay.                               |

  ---

  ## Credentials

  ### 🔑 API Key Authentication

  Clipboard Genie uses API key authentication for all n8n integrations.

  1. In the Clipboard Genie desktop app, go to
     **Settings → Extensions → n8n**
  2. Click **Generate API Key**.
  3. Copy the generated key and paste it into the **API Key** field in your n8n credentials for Clipboard Genie.
  4. The node will automatically send it using:

     ```
     Authorization: Bearer <API_KEY>
     ```

  ---

  ## Compatibility

  * **n8n version:** ≥ 1.x (supports community nodes)
  * **Clipboard Genie:** latest desktop version with n8n extension
  * **Platform:** Windows desktop (notifications and pinboards handled by the app)

  ---

  ## Usage

  ### ▶️ Example 1: Create a Text Item

  1. Add a new node: **Clipboard Genie → Item → Create Text Item**
  2. Fill in the required fields:

     * *Pinboard Name*
     * *Text to Send*
  3. (Optional) Enable **Show System Notification** to alert the user when the item is added.
  4. Execute the workflow.
     The text will appear in the selected pinboard in Clipboard Genie desktop application.

  ---

  ### ▶️ Example 2: Show a Desktop Notification

  1. Add a node: **Clipboard Genie → Notification → Show**
  2. Provide a *Notification Message* (required).
  3. Optionally set:

     * *Notification Title*
     * *Open Link or Path*
     * *Auto Close*
  4. Run the workflow.
     The user will receive a native desktop notification with the specified content and actions.

  ---

  ## Resources

  * [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Clipboard Genie Website](https://clipboardgenie.com)
  * [GitHub Repository & Issues](https://github.com/genielaboratories/n8n-nodes-clipboardgenie/issues) — report bugs or suggest new features

  ---

  ## Version history

  | Version   | Changes                                                                                             |
  | --------- | --------------------------------------------------------------------------------------------------- |
  | **0.1.6** | Fix: optional parameters (internal version, never published to npm)                                |
  | **0.1.0** | Initial release with two operations:<br>– Item → Create Text Item<br>– Notification → Show         |

  ---

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with the Clipboard Genie Windows app to send text items to pinboards and trigger desktop notifications from workflows.","capabilities":["Create text items in Clipboard Genie pinboards","Display items on the main board","Attach URLs, file paths, or commands to clipboard items","Trigger desktop notifications with custom titles and messages","Automatically close notifications after a delay"],"authentication":"None","commonUseCases":["Automatically save copied text to organized pinboards","Send workflow-generated links or files to the clipboard for quick access","Notify users of workflow completion via desktop alerts","Integrate clipboard management into automated desktop workflows"],"limitations":["Windows-only compatibility (requires Clipboard Genie desktop app)","Community-contributed node not maintained by n8n GmbH","Requires manual installation via npm"],"relatedNodes":[]}


node_type: @predictleads/n8n-nodes-predictleads.predictLeads
package_name: @predictleads/n8n-nodes-predictleads
display_name: PredictLeads
description: Get company insights from PredictLeads' official node
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: deankostomaj_predictleads
author_github_url: https://github.com/PredictLeads/n8n-nodes-predict-leads.git
npm_package_name: @predictleads/n8n-nodes-predictleads
npm_version: 1.0.1
community_fetched_at: 2026-07-14T14:40:33.402Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "companies",
      "options": [
        {
          "name": "Company",
          "value": "companies"
        },
        {
          "name": "Connection",
          "value": "connections"
        },
        {
          "name": "Financing Event",
          "value": "financingEvents"
        },
        {
          "name": "Job Opening",
          "value": "jobOpenings"
        },
        {
          "name": "News Event",
          "value": "newsEvents"
        },
        {
          "name": "Technology",
          "value": "technologies"
        },
        {
          "name": "Technology Detection",
          "value": "technologyDetections"
        },
        {
          "name": "Website Evolution",
          "value": "websiteEvolution"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve Company",
          "value": "retrieveCompany",
          "action": "Retrieve Company",
          "routing": {
            "request": {
              "url": "=/companies/{{$parameter.domain}}",
              "method": "GET"
            }
          },
          "description": "Returns Company"
        },
        {
          "name": "Retrieve Companies",
          "value": "retrieveCompanies",
          "action": "Retrieve Companies",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "sizes": "={{ $parameter.sizes }}",
                "location": "={{ $parameter.location }}"
              },
              "url": "=/discover/companies",
              "method": "GET",
              "arrayFormat": "brackets"
            }
          },
          "description": "Returns a list of companies filtered by their location and size, ordered by last updated date"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "companies"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve Company Job Openings",
          "value": "retrieveCompanyJobOpenings",
          "action": "Retrieve Company Job Openings",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "categories": "={{ $parameter.categories.join(\",\") }}",
                "not_closed": "={{ $parameter.notClosed }}",
                "active_only": "={{ $parameter.activeOnly }}",
                "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
                "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
                "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
                "with_location_only": "={{ $parameter.withLocationOnly }}",
                "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}",
                "with_description_only": "={{ $parameter.withDescriptionOnly }}"
              },
              "url": "=/companies/{{$parameter.domain}}/job_openings",
              "method": "GET"
            }
          },
          "description": "Returns a list of company's Job Openings"
        },
        {
          "name": "Retrieve Single Job Opening",
          "value": "retrieveSingleJobOpening",
          "action": "Retrieve Single Job Opening",
          "routing": {
            "request": {
              "url": "=/job_openings/{{$parameter.id}}",
              "method": "GET"
            }
          },
          "description": "Returns a single Job Opening"
        },
        {
          "name": "Retrieve a List of Job Openings",
          "value": "retrieveListOfJobOpenings",
          "action": "Retrieve a List of Job Openings",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "location": "={{ $parameter.location }}",
                "onet_codes": "={{ $parameter.onetCodes }}"
              },
              "url": "=/discover/job_openings",
              "method": "GET"
            }
          },
          "description": "Returns a list of Job Openings filtered by a given profession (e.g. \"Sales Engineers\" or \"Marketing Managers\") using O*NET occupation codes and/or location of the company"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "jobOpenings"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve Technologies Used by Specific Company",
          "value": "retrieveTechnologiesUsedByCompany",
          "action": "Retrieve Technologies used by specific Company",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
                "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
                "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
                "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
              },
              "url": "=/companies/{{$parameter.domain}}/technology_detections",
              "method": "GET"
            }
          },
          "description": "Returns Technologies used by a specific Company as a list of Technology Detections"
        },
        {
          "name": "Retrieve Companies Using Specific Technology ID or Fuzzy Name",
          "value": "retrieveCompaniesUsingSpecificTechnology",
          "action": "Retrieve Companies using specific Technology ID or Fuzzy Name",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
                "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
                "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
                "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
              },
              "url": "=/discover/technologies/{{$parameter.idOrFuzzyName}}/technology_detections",
              "method": "GET"
            }
          },
          "description": "Returns Companies using a specific Technology as a list of Technology Detections, ordered by the first_seen_at, descending"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "technologyDetections"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve All Tracked Technologies",
          "value": "retrieveAllTrackedTechnologies",
          "action": "Retrieve All Tracked Technologies",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "order_by": "={{ $parameter.orderBy }}",
                "fuzzy_name": "={{ $parameter.fuzzyName }}"
              },
              "url": "=/technologies",
              "method": "GET"
            }
          },
          "description": "Returns a list of all tracked Technologies"
        },
        {
          "name": "Retrieve a Single Technology by ID or Fuzzy Name",
          "value": "retrieveSingleTechnologyByIdOrFuzzyName",
          "action": "Retrieve a Single Technology by ID or Fuzzy Name",
          "routing": {
            "request": {
              "url": "=/technologies/{{$parameter.idOrFuzzyName}}",
              "method": "GET"
            }
          },
          "description": "Returns a single Technology"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "technologies"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve Company News Events",
          "value": "retrieveCompanyNewsEvents",
          "action": "Retrieve Company News Events",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "categories": "={{ $parameter.categories.join(\",\") }}",
                "found_at_from": "={{ $parameter.foundAtFrom }}",
                "found_at_until": "={{ $parameter.foundAtUntil }}"
              },
              "url": "=/companies/{{$parameter.domain}}/news_events",
              "method": "GET"
            }
          },
          "description": "Returns a list of company's News Events"
        },
        {
          "name": "Retrieve Single News Event",
          "value": "retrieveSingleNewsEvent",
          "action": "Retrieve Single News Event",
          "routing": {
            "request": {
              "url": "=/news_events/{{$parameter.id}}",
              "method": "GET"
            }
          },
          "description": "Returns specific News Event"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "newsEvents"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve Company Financing Events",
          "value": "retrieveCompanyFinancingEvents",
          "action": "Retrieve Company Financing Events",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
                "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
              },
              "url": "=/companies/{{$parameter.domain}}/financing_events",
              "method": "GET"
            }
          },
          "description": "Returns a list of company's Financing Events"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "financingEvents"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve Company Connections",
          "value": "retrieveCompanyConnections",
          "action": "Retrieve Company Connections",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "categories": "={{ $parameter.categories.join(\",\") }}",
                "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
                "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
              },
              "url": "=/companies/{{$parameter.domain}}/connections",
              "method": "GET"
            }
          },
          "description": "Returns a list of company's Connections"
        },
        {
          "name": "Retrieve Portfolio Companies",
          "value": "retrievePortfolioCompanies",
          "action": "Retrieve Portfolio Companies",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
                "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
                "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
                "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
              },
              "url": "=/discover/portfolio_companies/connections",
              "method": "GET"
            }
          },
          "description": "Returns the Portfolio Companies found on the portfolio pages of thousands of VCs, accelerators, and incubators, as a list of Connections categorized as investor, ordered by the first_seen_at, descending"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connections"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Retrieve Company Website Evolution",
          "value": "retrieveCompanyWebsiteEvolution",
          "action": "Retrieve Company Website Evolution",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page }}",
                "limit": "={{ $parameter.limit }}",
                "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
                "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
              },
              "url": "=/companies/{{$parameter.domain}}/website_evolution",
              "method": "GET"
            }
          },
          "description": "Returns a list of company's Website Evolution"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "websiteEvolution"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Retrieve Company",
      "value": "retrieveCompany",
      "action": "Retrieve Company",
      "routing": {
        "request": {
          "url": "=/companies/{{$parameter.domain}}",
          "method": "GET"
        }
      },
      "description": "Returns Company",
      "resource": "companies"
    },
    {
      "name": "Retrieve Companies",
      "value": "retrieveCompanies",
      "action": "Retrieve Companies",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "sizes": "={{ $parameter.sizes }}",
            "location": "={{ $parameter.location }}"
          },
          "url": "=/discover/companies",
          "method": "GET",
          "arrayFormat": "brackets"
        }
      },
      "description": "Returns a list of companies filtered by their location and size, ordered by last updated date",
      "resource": "companies"
    },
    {
      "name": "Retrieve Company Job Openings",
      "value": "retrieveCompanyJobOpenings",
      "action": "Retrieve Company Job Openings",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "categories": "={{ $parameter.categories.join(\",\") }}",
            "not_closed": "={{ $parameter.notClosed }}",
            "active_only": "={{ $parameter.activeOnly }}",
            "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
            "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
            "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
            "with_location_only": "={{ $parameter.withLocationOnly }}",
            "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}",
            "with_description_only": "={{ $parameter.withDescriptionOnly }}"
          },
          "url": "=/companies/{{$parameter.domain}}/job_openings",
          "method": "GET"
        }
      },
      "description": "Returns a list of company's Job Openings",
      "resource": "jobOpenings"
    },
    {
      "name": "Retrieve Single Job Opening",
      "value": "retrieveSingleJobOpening",
      "action": "Retrieve Single Job Opening",
      "routing": {
        "request": {
          "url": "=/job_openings/{{$parameter.id}}",
          "method": "GET"
        }
      },
      "description": "Returns a single Job Opening",
      "resource": "jobOpenings"
    },
    {
      "name": "Retrieve a List of Job Openings",
      "value": "retrieveListOfJobOpenings",
      "action": "Retrieve a List of Job Openings",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "location": "={{ $parameter.location }}",
            "onet_codes": "={{ $parameter.onetCodes }}"
          },
          "url": "=/discover/job_openings",
          "method": "GET"
        }
      },
      "description": "Returns a list of Job Openings filtered by a given profession (e.g. \"Sales Engineers\" or \"Marketing Managers\") using O*NET occupation codes and/or location of the company",
      "resource": "jobOpenings"
    },
    {
      "name": "Retrieve Technologies Used by Specific Company",
      "value": "retrieveTechnologiesUsedByCompany",
      "action": "Retrieve Technologies used by specific Company",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
            "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
            "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
            "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
          },
          "url": "=/companies/{{$parameter.domain}}/technology_detections",
          "method": "GET"
        }
      },
      "description": "Returns Technologies used by a specific Company as a list of Technology Detections",
      "resource": "technologyDetections"
    },
    {
      "name": "Retrieve Companies Using Specific Technology ID or Fuzzy Name",
      "value": "retrieveCompaniesUsingSpecificTechnology",
      "action": "Retrieve Companies using specific Technology ID or Fuzzy Name",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
            "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
            "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
            "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
          },
          "url": "=/discover/technologies/{{$parameter.idOrFuzzyName}}/technology_detections",
          "method": "GET"
        }
      },
      "description": "Returns Companies using a specific Technology as a list of Technology Detections, ordered by the first_seen_at, descending",
      "resource": "technologyDetections"
    },
    {
      "name": "Retrieve All Tracked Technologies",
      "value": "retrieveAllTrackedTechnologies",
      "action": "Retrieve All Tracked Technologies",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "order_by": "={{ $parameter.orderBy }}",
            "fuzzy_name": "={{ $parameter.fuzzyName }}"
          },
          "url": "=/technologies",
          "method": "GET"
        }
      },
      "description": "Returns a list of all tracked Technologies",
      "resource": "technologies"
    },
    {
      "name": "Retrieve a Single Technology by ID or Fuzzy Name",
      "value": "retrieveSingleTechnologyByIdOrFuzzyName",
      "action": "Retrieve a Single Technology by ID or Fuzzy Name",
      "routing": {
        "request": {
          "url": "=/technologies/{{$parameter.idOrFuzzyName}}",
          "method": "GET"
        }
      },
      "description": "Returns a single Technology",
      "resource": "technologies"
    },
    {
      "name": "Retrieve Company News Events",
      "value": "retrieveCompanyNewsEvents",
      "action": "Retrieve Company News Events",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "categories": "={{ $parameter.categories.join(\",\") }}",
            "found_at_from": "={{ $parameter.foundAtFrom }}",
            "found_at_until": "={{ $parameter.foundAtUntil }}"
          },
          "url": "=/companies/{{$parameter.domain}}/news_events",
          "method": "GET"
        }
      },
      "description": "Returns a list of company's News Events",
      "resource": "newsEvents"
    },
    {
      "name": "Retrieve Single News Event",
      "value": "retrieveSingleNewsEvent",
      "action": "Retrieve Single News Event",
      "routing": {
        "request": {
          "url": "=/news_events/{{$parameter.id}}",
          "method": "GET"
        }
      },
      "description": "Returns specific News Event",
      "resource": "newsEvents"
    },
    {
      "name": "Retrieve Company Financing Events",
      "value": "retrieveCompanyFinancingEvents",
      "action": "Retrieve Company Financing Events",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
            "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
          },
          "url": "=/companies/{{$parameter.domain}}/financing_events",
          "method": "GET"
        }
      },
      "description": "Returns a list of company's Financing Events",
      "resource": "financingEvents"
    },
    {
      "name": "Retrieve Company Connections",
      "value": "retrieveCompanyConnections",
      "action": "Retrieve Company Connections",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "categories": "={{ $parameter.categories.join(\",\") }}",
            "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
            "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
          },
          "url": "=/companies/{{$parameter.domain}}/connections",
          "method": "GET"
        }
      },
      "description": "Returns a list of company's Connections",
      "resource": "connections"
    },
    {
      "name": "Retrieve Portfolio Companies",
      "value": "retrievePortfolioCompanies",
      "action": "Retrieve Portfolio Companies",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "last_seen_at_from": "={{ $parameter.lastSeenAtFrom }}",
            "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
            "last_seen_at_until": "={{ $parameter.lastSeenAtUntil }}",
            "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
          },
          "url": "=/discover/portfolio_companies/connections",
          "method": "GET"
        }
      },
      "description": "Returns the Portfolio Companies found on the portfolio pages of thousands of VCs, accelerators, and incubators, as a list of Connections categorized as investor, ordered by the first_seen_at, descending",
      "resource": "connections"
    },
    {
      "name": "Retrieve Company Website Evolution",
      "value": "retrieveCompanyWebsiteEvolution",
      "action": "Retrieve Company Website Evolution",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page }}",
            "limit": "={{ $parameter.limit }}",
            "first_seen_at_from": "={{ $parameter.firstSeenAtFrom }}",
            "first_seen_at_until": "={{ $parameter.firstSeenAtUntil }}"
          },
          "url": "=/companies/{{$parameter.domain}}/website_evolution",
          "method": "GET"
        }
      },
      "description": "Returns a list of company's Website Evolution",
      "resource": "websiteEvolution"
    }
  ]

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

  # n8n-nodes-predict-leads

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

  [PredictLeads](https://predictleads.com/) company intelligence data powers a wide range of business applications, from AI-powered automation to market research and investment analysis.

  ## Installation

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

  ## Operations

  This node supports the following operations:
  - retrieve company's data
  - retrieve companies' data based on their size and location
  - retrieve company's job openings
  - retrieve a single job opening
  - retrieve a list of job openings based on O*NET codes and location
  - retrieve technologies used by a specific company
  - retrieve companies using a specific technology
  - retrieve all tracked technologies
  - retrieve a single technology
  - retrieve company's news events
  - retrieve a single news event
  - retrieve company's financing events
  - retrieve company's connections
  - retrieve portfolio companies
  - retrieve company's website evolution

  ## Credentials

  You must have a PredictLeads API key and token to use this node. You can register for a free account to get your API key and token here:

  https://predictleads.com/sign_in

  Once registered, you can find your API key and token here:

  https://predictleads.com/dashboard

  Then you'll need to create credentials in n8n for PredictLeads.

  ![Add Credentials](images/add-credentials.png)

  ## Compatibility

  - Minimum n8n version: 1.84.0
  - Verified working with: 1.119.1
  - Known issues: None

  ## Usage

  Add PredictLeads node to a workflow.

  ![Add PredictLeads to Workflow](images/workflow.png)

  Configure a basic query and hit "Test step" to get the data.

  ![Test a company search through PredictLeads](images/test-company-search.png)

  ## API Resources / Search Engines

  This node currently only supports the most popular PredictLeads endpoints. If there's an endpoints missing that you would like to use, please let us know at support@predictleads.com

  In the meantime, you can also use the [generic HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/) to get the data from other endpoints.

  ## Related Resources

  PredictLeads's complete API documentation is available here:

  https://docs.predictleads.com/

  ## License

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

ai_documentation_summary:
  {"purpose":"This n8n community node retrieves company intelligence data from PredictLeads, including company profiles, job openings, technologies, news, financing events, and connections.","capabilities":["Retrieve company data","Search companies by size and location","Retrieve company job openings","Retrieve specific job opening details","Search job openings by O*NET codes and location","Retrieve technologies used by a company","Find companies using a specific technology","Retrieve all tracked technologies","Retrieve specific technology details","Retrieve company news events"],"authentication":"API key and token required","commonUseCases":["Market research and competitor analysis","Investment analysis and due diligence","AI-powered automation workflows","Recruitment and talent sourcing","Technology stack analysis"],"limitations":["Only supports the most popular PredictLeads endpoints; some endpoints may be missing","Missing endpoints can be accessed via the generic HTTP Request node instead"],"relatedNodes":["n8n-nodes-base.httprequest"]}


node_type: @datafix/n8n-nodes-exact-online.exactOnline
package_name: @datafix/n8n-nodes-exact-online
display_name: Exact Online
description: Exact Online Node
category: Community
development_style: declarative
version: 1
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: bramknuever
author_github_url: https://github.com/DataFix-B-V/ExactOnline.git
npm_package_name: @datafix/n8n-nodes-exact-online
npm_version: 0.3.7
community_fetched_at: 2026-07-14T14:40:33.403Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "",
      "description": "Resource to connect to. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code-examples/expressions/\">expression</a>. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "displayName": "Resource Name or ID",
      "typeOptions": {
        "loadOptionsMethod": "getResources",
        "loadOptionsDependsOn": [
          "service"
        ]
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "description": "Operation to use. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code-examples/expressions/\">expression</a>. Choose from the list, or specify an ID using an <a href=\"https://docs.n8n.io/code/expressions/\">expression</a>.",
      "displayName": "Operation Name or ID",
      "typeOptions": {
        "loadOptionsMethod": "getOperations",
        "loadOptionsDependsOn": [
          "resource"
        ]
      },
      "noDataExpression": true
    }
  ]

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

  # n8n-nodes-exact-online

  This node was developed during the n8n node-athon. This is version one with a basic CRUD implemented.
  During the development the API reference docs were scraped with a n8n workflow. This Workflow was also included in the repo.
  There were 396 pages scraped and processed into a config file.

  The node is usable with a Developer account which can be created for free at Exact Online's website. This way you can test the node however you like it without compromising your production environment.
  After you can easily connect it with a production environment and automate your workflows.

  ## Developer

  Hi, 

  We are [DataFix](https://datafix.nl), an expert partner of n8n.
  > :warning: **We have developed this node to be free to use. The node is as-is, support is not included.**

  Some of the services we offer:
  * Node Development
  * Workflow Development
  * Mentoring
  * Support

  Feel free to reach out if you want to hire us @ hi@datafix.nl

  For questions or issues with the node, please open an issue on Github.
  We will have a look and if it is an issue with the node we will try to fix it. Be sure to include a proper description and screenshot(s) of the issue so we can easily understand the issue.

  ## Exact Online

  Exact Online is an ERP solution that is offered as a cloud service. Most companies that use exact use it as their main application and have all kinds of applications they use around that. Exact has been expanding over the years and they now offer Exact Online internationally.

  ## Install instructions

  The node can be installed with the community package feature. It can also be installed manually. 
  If you need more information on that, please refer to the n8n docs.

  Make sure to restart n8n when you have installed the node.
  > :warning: **Make sure to restart n8n when you have installed the node.**

  ## Setup instructions

  > :warning: **You need a HTTPS callback url for it to function. Exact Online does not allow you to use HTTP. Make sure you have this before starting the setup.**

  > **_NOTE:_**  Some of the documentation was rewritten because the production app setup is a bit different from the development app. That is also why some names and urls arent the same everywhere, I hope it is clear enough not to get you confused about changing names and such.

  To setup this node you will have to create an App in Exact online. Below there is a step by step guide on how to do this.
  In the future there might be a possibility to simply select it from the app store of Exact Online. I will be looking into getting it approved at a later date.

  The Images should be clear enough for you to follow along.

  Login into Exact Online by clicking on the marked button

  ![Login](https://github.com/bramkn/ExactOnline/blob/master/Images/login.png)

  Click on appcenter button to open the app center, this where you can connect apps.

  ![ManageApps](https://github.com/bramkn/ExactOnline/blob/master/Images/appcenterNormal.png)

  At this point it will forward you to all the apps you can browse. You probably need to click on login in the top right again to actually login on this page.

  After that you will see the manage apps button
  Click on the manage apps button

  ![ManageApps2](https://github.com/bramkn/ExactOnline/blob/master/Images/manageapps2.png)

  You will then see your apps. There is a choice between production and test. Click on register an app.
  If you do not have a choice simply click on the big + to register an app.

  ![Apps](https://github.com/bramkn/ExactOnline/blob/master/Images/Apps.png)

  Open a tab with n8n and go to the Exact Online Node, if you do not have it open already.
  Create a new credentials entry or modify an existing one in the app.

  ![Apps](https://github.com/bramkn/ExactOnline/blob/master/Images/credentials.png)

  You should see the credential information. You need to fill this in, but first you need the Callback URL to be filled in into the app setup in Exact Online.
  Copy the callback URL from n8n into Exact Online. 
  If you are registering a production app you will need to do this in this first screen that pops up. If it is a testing app this pop-up is skipped. (fill in the name and the callback url in the following screen if this step is skipped)

  ![prodRegister](https://github.com/bramkn/ExactOnline/blob/master/Images/registerappProd.png)

  Fill in the rest of the information in the credentials of n8n.
  Should look a bit like this:

  Exact Online:
  ![Apps](https://github.com/bramkn/ExactOnline/blob/master/Images/oauth2Exact2.png)

  n8n:
  ![Apps](https://github.com/bramkn/ExactOnline/blob/master/Images/Oauth2n8n2.png)

  After you can Click connect / reconnect and it might give you a pop-up to login to exact online if you aren't logged in yet or you need to confirm the connection / approve some terms.

  ## Features v1.0

  All posible API requests were scraped from the Exact Online docs. This was used to create a config file. some quality of life features were added and more will be added in the future.

  You can choose al Devisions your account has access to. And all data you have access to will be able to be retrieved.
  Somtimes you do not retrieve any data that is because there is non or you do not have access.

  you can use the dropdowns to select what you want to do.

  ![Apps](https://github.com/bramkn/ExactOnline/blob/master/Images/options1.png)

  when retrieving data you can add filters and choose what fields you want to include. You can both name field to be included and excluded. Some Api endpoints allow you to retrieve all fields when not selecting any and some require you to select the fields you want to include. By setting the slider to exclude the selected fields and not selecting any fields the node will automatically fetch all fields available.

  ![Apps](https://github.com/bramkn/ExactOnline/blob/master/Images/options3.png)


  when you want to create a new record or edit it, you will be able to add fields and select fields from a list of options for that specific resource.

  ![Apps](https://github.com/bramkn/ExactOnline/blob/master/Images/options2.png)

  ## Using the scraper

  - You do not need an account for the scraper.
  - Paste the JSON into an n8n workflow.
  - Set the Github Authorization
  - The first time you might want to set the Github node to create the file.
  - Start
  - Done -> make sure to format the output file as this will improve the readability ;-)

  ## More info on the API

  [Exact Online ref](https://start.exactonline.nl/docs/HlpRestAPIResources.aspx?SourceAction=10)

  ## License

  [ChickenDance](https://github.com/bramkn/ExactOnline/blob/master/n8n-nodes-exact-online/LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n node enables automation of Exact Online ERP systems by providing CRUD operations and data retrieval capabilities via the Exact Online API.","capabilities":["Create, Read, Update, and Delete (CRUD) operations on Exact Online entities","Retrieve data with customizable filters","Select specific fields to include or exclude in API responses","Access multiple divisions within an Exact Online account","Authentication via OAuth2 using a callback URL"],"authentication":"OAuth2 (requires HTTPS callback URL)","commonUseCases":["Automating data synchronization between Exact Online and other systems","Extracting inventory or financial data for reporting","Testing Exact Online API integrations without affecting production data"],"limitations":["Requires a HTTPS callback URL (HTTP is not supported by Exact Online)","Support is not included; the node is provided as-is","Some API endpoints may require explicit field selection even when retrieving all data","Version 1.0 is a basic implementation with potential for future enhancements"],"relatedNodes":["n8n-nodes-exact-online.exactOnline","n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: @woztell-sanuker/n8n-nodes-woztell-sanuker.woztellTrigger
package_name: @woztell-sanuker/n8n-nodes-woztell-sanuker
display_name: WOZTELL Trigger
description: Automate messaging workflows across WhatsApp, Messenger, and Instagram with WOZTELL
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: krisatwoztell
author_github_url: https://github.com/Woztell/n8n-nodes-woztell-sanuker.git
npm_package_name: @woztell-sanuker/n8n-nodes-woztell-sanuker
npm_version: 0.1.15
community_fetched_at: 2026-07-14T14:40:33.404Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-woztell-sanuker

  Welcome to our WOZTELL n8n nodes, for easier [WOZTELL](https://woztell.com/) integration within your n8n workflows, please read:

  *  [Product Features](#product-features)
  *  [In case you don't have the n8n](#in-case-you-dont-have-the-n8n)
  *  [Sign up WOZTELL and WhatsApp Business API for Free](#sign-up-woztell-and-whatsapp-business-api-for-free)
  *  [Installation](#installation)
  *  [Credentials](#credentials)
  *  [Build automation with WOZTELL](#build-automation-with-woztell)
  *  [Triggers and Nodes](#triggers-and-nodes)
  *  [Contact](#contact)
  *  [About Us](#about-us)
  *  [Resources](#resources)


  ## Product Features

  * **Webhook**: Receive all WhatsApp, Facebook Messenger, Instagram, WebChat, and website messages in WOZTELL inbox in real time.

  * **Send Messages**: Send messages or approved message templates to target customers via WhatsApp Business API.

  * **Chatbot Forwarding**: Route customer conversations to WOZTELL chatbot for autoreply.

  * **Full WhatsApp Message Type Support**: Support all business message types and conversation categories available on WhatsApp and Facebook Messenger.

  * **Member Search**: Batch query WOZTELL user information using Member Tags.

  * **OpenAPI Information Query**: Directly query and update user profiles, conversation histories, and related data on WOZTELL platform via OpenAPI.


  ## In case you don't have the n8n

  Connect WOZTELL on n8n | Unlock AI-powered WhatsApp automation in just a few clicks. Easily build no-code workflows on WhatsApp, Messenger, Instagram, and WebChat by connecting WOZTELL with thousands of n8n integrations. Automate personalized broadcasts, conversations, and inbox management, fully powered by WOZTELL’s OpenAPI and GenAI engine.


  ## Sign up WOZTELL and WhatsApp Business API for Free

  You can now create a WOZTELL account and open up a WhatsApp Business API account, completely for free.

  1.  Go to the registration link: https://platform.woztell.com/signup?lang=en&utm_campaign=plugin-n8n&utm_medium=plugin-n8n&utm_source=N8N

  2.  Fill in personal and company details and verify your email.

      ![register2](https://store.sanuker.cn/nn/images/register2.png)

      ![register3](https://store.sanuker.cn/nn/images/register3.png)

  3.  Once you signed up, you will be directed to the platform homepage. There, you can register a WhatsApp Business API account for free following [https://doc.woztell.com/docs/procedures/basic-whatsapp-chatbot-setup/standard-procedures-wa-connect-waba/](https://doc.woztell.com/docs/procedures/basic-whatsapp-chatbot-setup/standard-procedures-wa-connect-waba/) or  use the buttons on the top right of the homepage to chat with our sales team or book a demo session.

      ![register4](https://store.sanuker.cn/nn/images/register4.png)

  ## Installation

  Install WOZTELL community node package in your n8n

  1.	Sign in to n8n with admin access
  2.	Go to **Settings** > **Community Nodes**
  3.	Select **Install**
  4.	Copy and paste the n8n package name @woztell-sanuker/n8n-nodes-woztell-sanuker

  ```
  @woztell-sanuker/n8n-nodes-woztell-sanuker
  ```

  <img src="https://store.sanuker.cn/nn/images/image-20250826180723230.png" alt="image-20250826180723230" style="zoom:50%;" />

  5.  Click **Install**. n8n will now download the package and you may return to n8n to use.

  Learn more about installation from  [https://docs.n8n.io/integrations/community-nodes/installation/gui-install/](https://docs.n8n.io/integrations/community-nodes/installation/gui-install/)



  ## Credentials

  Before you begin using our n8n plugin, you will need to obtain your API Credential information from the WOZTELL Platform. These credentials serve as the essential authentication keys for accessing the WOZTELL Product API. Please refer to the documentation linked below to acquire the appropriate credential according to the required permission level, and then enter this information into the WOZTELL n8n Credential configuration.

  1.  Open **Credential**

  ![image-20250829102707280](https://store.sanuker.cn/nn/images/image-20250829102707280.png)

  2.  Create credential by searching **WOZTELL**

  <img src="https://store.sanuker.cn/nn/images/image-20250829122336781.png" alt="image-20250829122336781" style="zoom:50%;" />

  3.  Login your WOZTELL account and open [**https://platform.woztell.com/settings/accesstokens?lang=en**](https://platform.woztell.com/settings/accesstokens?lang=en), and enable the **channel:list**, **botapi:sendResponses**, and **bot:redirectMemberToNode** permissions.

  4.  For more functions you need, please check the document [**https://doc.woztell.com/docs/documentations/settings/access-token/**](https://doc.woztell.com/docs/documentations/settings/access-token/)

  5.  Generate the access token

  6.  For more details on access token, please refer to this [https://doc.woztell.com/docs/documentations/settings/access-token](https://doc.woztell.com/docs/documentations/settings/access-token).

      ![image-20250829103010464](https://store.sanuker.cn/nn/images/image-20250829103010464.png)

  7.  Fill in access token and **Save**

      ![image-20250829103034574](https://store.sanuker.cn/nn/images/image-20250829103034574.png)

      

  ## Build automation with WOZTELL

  #### Create a n8n workflow

  ![image-20250829121753114](https://store.sanuker.cn/nn/images/image-20250829121753114.png)

  #### Open the nodes panel

  ![image-20250829121645155](https://store.sanuker.cn/nn/images/image-20250829121645155.png)

  #### Search WOZTELL

  <img src="https://store.sanuker.cn/nn/images/image-20250829121853114.png" alt="image-20250829121853114" style="zoom:50%;" />



  ## Triggers and Nodes

  #### Overview

  By searching the keyword **“WOZTELL”** in the sidebar, you can access the list of available n8n nodes and triggers.

  <img src="https://store.sanuker.cn/nn/images/image-20250829122639889.png" alt="image-20250829122639889" style="zoom:50%;" />

  Within this list, you will find all nodes and triggers developed by WOZTELL for n8n. You may directly drag and drop the required node or trigger into the workflow designer to make it part of your workflow.

  -  **Triggers**: These nodes enable you to receive all webhook message data coming from WOZTELL products.
  -  **BOT API Actions**: These nodes provide your workflow with the ability to send messages and perform data operations through WOZTELL products.
  -  **Member Actions**: These nodes allow you to efficiently manage all member information stored within WOZTELL products.



  #### Webhook: On WOZTELL Message received

  Through the **WOZTELL Trigger** node, you can receive webhook messages from any WOZTELL Channel, including various types such as *Inbound*, *Outbound*, and *Member Update*. Each message is delivered in JSON format and contains comprehensive data along with the associated event information.

  ![image-20250829122535949](https://store.sanuker.cn/nn/images/image-20250829122535949.png)

  Within this node, you can specify the corresponding **Webhook Path** and configure filtering options based on **Channel ID** and **Event Type**, ensuring that the information you receive is properly filtered and can be utilized effectively.

  Learn more from: [https://doc.woztell.com/docs/documentations/channels/channels-webhook](https://doc.woztell.com/docs/documentations/channels/channels-webhook)

  ![image-20250826184406024](https://store.sanuker.cn/nn/images/image-20250826184406024.png)



  #### Node: Send Response

  Using the **Send Response** node, you can directly send messages from your WhatsApp Business number to the target customer’s WhatsApp account via the WOZTELL BotAPI. All message content can be placed directly within the Response data.

  Once the message is sent, you will receive the corresponding API result, which allows subsequent nodes to continue processing the data.

  For more details, please refer to the official WOZTELL product documentation: [https://doc.woztell.com/docs/reference/bot-api-reference#send-responses](https://doc.woztell.com/docs/reference/bot-api-reference#send-responses)

  ![sendResponse](https://store.sanuker.cn/nn/images/sendResponse.png)



  #### Node: Redirect member to node

  With the **Redirect Member to Node** node, you no longer need to manually construct complex JSON data for sending messages. Instead, you simply pass the relevant WOZTELL information to a **Chatbot Tree** node, and the WOZTELL Chatbot will handle the subsequent actions for you — such as sending WhatsApp conversation message templates.

  This node can be understood as a memory pointer: it redirects the current operation to the WOZTELL Chatbot. You do not need to prepare complicated data structures; you only need to initiate a request to the BotAPI.

  For customers who already have chatbot designs running on the WOZTELL platform, this provides an excellent way to integrate with n8n.

  Learn more from: [https://doc.woztell.com/docs/reference/bot-api-reference#redirect-member-to-node](https://doc.woztell.com/docs/reference/bot-api-reference#redirect-member-to-node)

  ![redirectMemberToNode](https://store.sanuker.cn/nn/images/redirectMemberToNode.png)

  #### Node: Send WhatsApp Template message

  According to WhatsApp’s official business messaging guidelines, when contacting unfamiliar WhatsApp numbers or numbers outside the 24-hour session window, you must first send a **WhatsApp Template Message**.

  Our n8n plugin significantly simplifies the complexity of working with WhatsApp Template Messages. The current node can automatically generate the required message content based on templates that have already been created and approved. You only need to complete the corresponding form fields, and the Template Message can be sent directly.

  Learn more from: [https://doc.woztell.com/docs/integrations/whatsapp/wa-message-types#whatsapp-message-template](https://doc.woztell.com/docs/integrations/whatsapp/wa-message-types#whatsapp-message-template)

  ![image-20250826185818626](https://store.sanuker.cn/nn/images/image-20250826185818626.png)



  ## Contact

  We sincerely appreciate your strong support and understanding of our current n8n plugin. If you are interested in learning more about our products or services, you may also reach us through the following channels:

  *  WOZTELL product team: [https://woztell.com](https://woztell.com)
  *  Sanuker service team: [https://sanuker.com](https://sanuker.com)
  *  Email: [kris@woztell.com](mailto:kris@woztell.com)
  *  Email: [hello@woztell.com](mailto:hello@woztell.com)
  *  WOZTELL Customer Success WhatsApp: [https://wa.me/14157959796](https://wa.me/14157959796)
  *  Sanuker Service WhatsApp: [https://wa.me/85254432330](https://wa.me/85254432330)



  ## About Us

  **Sanuker**

  Sanuker is a leading AI Business Messaging Consulting firm, offering professional business messaging services and AI chatbot solutions tailored for enterprises. We distinguish ourselves in the market through our innovative approach to messaging designs and strategies, especially across Meta platforms - WhatsApp, Messenger, Instagram.

  As a trusted partners of AWS, HSBC Business Go, and Meta, we serve 10K+ clients across 25 countries through our WOZTELL Conversational Platform, empowering businesses to qualify leads and boost conversions.

  **WOZTELL**

  WOZTELL is your all-in-one platform to seamlessly create, manage, and deploy chatbots across WhatsApp, Messenger, Instagram, and Websites. Powered by cutting-edge GenAI engines, WOZTELL empowers you to execute personalized broadcasts, manage unlimited live chat agents, and integrate effortlessly with any third-party software via our robust OpenAPI.

  ## Resources

  - n8n Community Nodes, [https://docs.n8n.io/integrations/#community-nodes](https://docs.n8n.io/integrations/#community-nodes)
  - WOZTELL Platform documentation, [https://doc.woztell.com/](https://doc.woztell.com/)
  - WOZTELL Bot API, [https://doc.woztell.com/docs/reference/bot-api-reference](https://doc.woztell.com/docs/reference/bot-api-reference)
  - WOZTELL Open API, [https://doc.woztell.com/open-api-reference](https://doc.woztell.com/open-api-reference)
  - WOZTELL Webhook, [https://doc.woztell.com/docs/documentations/channels/channels-webhook](https://doc.woztell.com/docs/documentations/channels/channels-webhook)
  - WhatsApp Integration on Woztell: [https://doc.woztell.com/docs/integrations/whatsapp/wa-overview](https://doc.woztell.com/docs/integrations/whatsapp/wa-overview)
  - Facebook Messenger Integration on WOZTELL: [https://doc.woztell.com/docs/integrations/facebook/fb-overview](https://doc.woztell.com/docs/integrations/facebook/fb-overview)
  - Instagram Integration on WOZTELL: [https://doc.woztell.com/docs/integrations/instagram/ig-overview](https://doc.woztell.com/docs/integrations/instagram/ig-overview)
  - Webchat Integration on WOZTELL: [https://doc.woztell.com/docs/integrations/web-chat/webchat-overview](https://doc.woztell.com/docs/integrations/web-chat/webchat-overview)

ai_documentation_summary:
  {"purpose":"The WOZTELL Trigger node automates messaging workflows by receiving real-time messages from WhatsApp, Facebook Messenger, Instagram, and WebChat, and enables sending messages or routing conversations to chatbots.","capabilities":["Receive messages from WhatsApp, Facebook Messenger, Instagram, WebChat, and websites","Send messages or approved message templates via WhatsApp Business API","Route customer conversations to WOZTELL chatbot for autoreply","Support all business message types and conversation categories","Batch query user information using Member Tags","Query and update user profiles and conversation histories via OpenAPI"],"authentication":"API Token (Access Token) required from WOZTELL Platform with specific permissions (channel:list, botapi:sendResponses, bot:redirectMemberToNode)","commonUseCases":["Automate customer support responses across multiple messaging platforms","Implement chatbot forwarding for autoreplies","Send broadcast messages to target customers","Manage and update user profiles and conversation histories"],"limitations":["Requires manual setup of WOZTELL account and WhatsApp Business API","Access tokens require specific permission levels to be enabled in the WOZTELL platform","Node is a community package and may depend on n8n's community node support"],"relatedNodes":["WOZTELL Send","WOZTELL Chatbot","WOZTELL Member Search","WOZTELL OpenAPI"]}


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

updated_at: 2026-07-14 14:40:33
author_name: lucianholt
author_github_url: https://github.com/anny-co/anny-n8n.git
npm_package_name: n8n-nodes-anny
npm_version: 1.1.2
community_fetched_at: 2026-07-14T14:40:33.405Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "booking",
      "options": [
        {
          "name": "Availability",
          "value": "availability"
        },
        {
          "name": "Booking",
          "value": "booking"
        },
        {
          "name": "Customer",
          "value": "customer"
        },
        {
          "name": "Invoice",
          "value": "invoice"
        },
        {
          "name": "Order",
          "value": "order"
        },
        {
          "name": "Plan Subscription",
          "value": "planSubscription"
        },
        {
          "name": "Resource",
          "value": "resource"
        },
        {
          "name": "Service",
          "value": "service"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getUpcomingIntervals",
      "options": [
        {
          "name": "Get End Times",
          "value": "getEndTimes",
          "action": "Get end times",
          "description": "Get all interval end dates for a start datetime"
        },
        {
          "name": "Get Start Times",
          "value": "getStartTimes",
          "action": "Get start times",
          "description": "Get all interval start dates for a given date"
        },
        {
          "name": "Get Upcoming Intervals",
          "value": "getUpcomingIntervals",
          "action": "Get upcoming intervals",
          "description": "Get a list of upcoming available intervals"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "availability"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Cancel",
          "value": "cancel",
          "action": "Cancel booking",
          "description": "Cancel an existing booking"
        },
        {
          "name": "Check In",
          "value": "checkIn",
          "action": "Check in booking",
          "description": "Check in a customer for their booking"
        },
        {
          "name": "Check Out",
          "value": "checkOut",
          "action": "Check out booking",
          "description": "Check out a customer from their booking"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get booking",
          "description": "Get a single booking by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many bookings",
          "description": "Get multiple bookings"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "booking"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create customer",
          "description": "Create a new customer"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete customer",
          "description": "Delete an existing customer"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get customer",
          "description": "Get a single customer by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many customers",
          "description": "Get multiple customers"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update customer",
          "description": "Update an existing customer"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customer"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get order",
          "description": "Get a single order by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many orders",
          "description": "Get multiple orders"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "order"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get invoice",
          "description": "Get a single invoice by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many invoices",
          "description": "Get multiple invoices"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invoice"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get service",
          "description": "Get a single service by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many services",
          "description": "Get multiple services"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "service"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get resource",
          "description": "Get a single resource by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many resources",
          "description": "Get multiple resources"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "resource"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get plan subscription",
          "description": "Get a single plan subscription by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many plan subscriptions",
          "description": "Get multiple plan subscriptions"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "planSubscription"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get End Times",
      "value": "getEndTimes",
      "action": "Get end times",
      "description": "Get all interval end dates for a start datetime",
      "resource": "availability"
    },
    {
      "name": "Get Start Times",
      "value": "getStartTimes",
      "action": "Get start times",
      "description": "Get all interval start dates for a given date",
      "resource": "availability"
    },
    {
      "name": "Get Upcoming Intervals",
      "value": "getUpcomingIntervals",
      "action": "Get upcoming intervals",
      "description": "Get a list of upcoming available intervals",
      "resource": "availability"
    },
    {
      "name": "Cancel",
      "value": "cancel",
      "action": "Cancel booking",
      "description": "Cancel an existing booking",
      "resource": "booking"
    },
    {
      "name": "Check In",
      "value": "checkIn",
      "action": "Check in booking",
      "description": "Check in a customer for their booking",
      "resource": "booking"
    },
    {
      "name": "Check Out",
      "value": "checkOut",
      "action": "Check out booking",
      "description": "Check out a customer from their booking",
      "resource": "booking"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get booking",
      "description": "Get a single booking by ID",
      "resource": "booking"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many bookings",
      "description": "Get multiple bookings",
      "resource": "booking"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create customer",
      "description": "Create a new customer",
      "resource": "customer"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete customer",
      "description": "Delete an existing customer",
      "resource": "customer"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get customer",
      "description": "Get a single customer by ID",
      "resource": "customer"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many customers",
      "description": "Get multiple customers",
      "resource": "customer"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update customer",
      "description": "Update an existing customer",
      "resource": "customer"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get order",
      "description": "Get a single order by ID",
      "resource": "order"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many orders",
      "description": "Get multiple orders",
      "resource": "order"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get invoice",
      "description": "Get a single invoice by ID",
      "resource": "invoice"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many invoices",
      "description": "Get multiple invoices",
      "resource": "invoice"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get service",
      "description": "Get a single service by ID",
      "resource": "service"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many services",
      "description": "Get multiple services",
      "resource": "service"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get resource",
      "description": "Get a single resource by ID",
      "resource": "resource"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many resources",
      "description": "Get multiple resources",
      "resource": "resource"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get plan subscription",
      "description": "Get a single plan subscription by ID",
      "resource": "planSubscription"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many plan subscriptions",
      "description": "Get multiple plan subscriptions",
      "resource": "planSubscription"
    }
  ]

npm_readme:
  # n8n-nodes-anny

  This is an n8n community node for the [anny](https://anny.co) booking platform. It lets you manage bookings, customers, orders, invoices, resources, and services, plus react to anny webhooks inside n8n.

  anny offers scheduling, payments, and resource management for online booking flows.

  [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

  - Bookings: get, list (with filters), cancel, check-in, check-out
  - Customers: create, get, list (with filters), update, delete
  - Orders, invoices, plan subscriptions, services, resources: get and list with filters and includes
  - Availability: get upcoming intervals for a resource/service combination
  - API Call: run arbitrary requests against `/api/*` with custom method, params, headers, and body
  - Triggers: webhooks for bookings (created/started/ended/updated/checked-in/checked-out/cancelled/deleted), customers (created/updated/deleted), orders (created/updated/deleted), invoices (created/updated/deleted)

  ## Credentials

  - Uses OAuth2 with preconfigured scopes; only pick your region (anny.co, anny.eu, staging, or local) and complete the OAuth flow.
  - The credential tests by fetching your user profile from the selected region.

  ## Compatibility

  - Built with nodes API v1 via `@n8n/node-cli` 0.13.0 (`n8n-workflow` 1.113.0).
  - Tested locally with n8n 1.x; use a current n8n release for best results.

  ## Usage

  - Add the **anny OAuth2 API** credential first; choose the right region and finish the OAuth consent.
  - Use **anny Booking** to create or manage bookings; include related data via the `include` field when needed.
  - Use the trigger nodes to subscribe to anny webhooks automatically; they create and clean up webhook subscriptions for the selected events.
  - For unsupported endpoints, use **anny API Call** to hit any `/api/v1/*` path with custom parameters.

  ## Resources

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

  ## Version history

  - 0.1.0: Initial release of the anny node pack (bookings, customers, orders, invoices, plan subscriptions, resources, services, triggers, and generic API call).

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the anny booking platform to manage bookings, customers, orders, invoices, and resources, while also handling webhooks for automated event responses.","capabilities":["Get and list bookings with filters","Cancel bookings","Check-in and check-out bookings","Create, retrieve, update, and delete customers","Manage orders, invoices, subscriptions, services, and resources","Retrieve availability for resource/service combinations","Execute arbitrary API calls to /api/* endpoints","Subscribe to webhooks for bookings, customers, orders, and invoices"],"authentication":"OAuth2 with preconfigured scopes; requires selecting a region (anny.co, anny.eu, staging, or local) and completing the OAuth flow","commonUseCases":["Automating booking confirmations and reminders","Syncing customer data between systems","Processing order and invoice updates","Monitoring booking status changes via webhooks"],"limitations":["Requires a current n8n release (tested with n8n 1.x)","Uses nodes API v1 via @n8n/node-cli 0.13.0","Generic API Call node required for unsupported endpoints"],"relatedNodes":["n8n-nodes-base.webhook","n8n-nodes-base.httpRequest","n8n-nodes-base.oauth2"]}


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

updated_at: 2026-07-14 14:40:33
author_name: bryantgillespie
author_github_url: https://github.com/directus/n8n-nodes-directus.git
npm_package_name: @directus/n8n-nodes-directus
npm_version: 1.0.3
community_fetched_at: 2026-07-14T14:40:33.406Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "item",
      "options": [
        {
          "name": "Item",
          "value": "item"
        },
        {
          "name": "User",
          "value": "user"
        },
        {
          "name": "File",
          "value": "file"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an item",
          "description": "Create a new item"
        },
        {
          "name": "Create (Raw JSON)",
          "value": "createRaw",
          "action": "Create an item with raw JSON",
          "description": "Create a new item using raw JSON data"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an item",
          "description": "Delete an item"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an item",
          "description": "Get a single item"
        },
        {
          "name": "Get (Raw JSON)",
          "value": "getRaw",
          "action": "Get an item with raw JSON",
          "description": "Get a single item using raw JSON query parameters"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many items",
          "description": "Get many items from a collection"
        },
        {
          "name": "Get Many (Raw JSON)",
          "value": "getAllRaw",
          "action": "Get many items with raw JSON",
          "description": "Get many items using raw JSON query parameters"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an item",
          "description": "Update an existing item"
        },
        {
          "name": "Update (Raw JSON)",
          "value": "updateRaw",
          "action": "Update an item with raw JSON",
          "description": "Update an existing item using raw JSON data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "item"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "invite",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a user",
          "description": "Delete a user"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a user",
          "description": "Get a single user"
        },
        {
          "name": "Get (Raw JSON)",
          "value": "getRaw",
          "action": "Get a user with raw JSON",
          "description": "Get a single user using raw JSON query parameters"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many users",
          "description": "Get many users"
        },
        {
          "name": "Get Many (Raw JSON)",
          "value": "getAllRaw",
          "action": "Get many users with raw JSON",
          "description": "Get many users using raw JSON query parameters"
        },
        {
          "name": "Invite User",
          "value": "invite",
          "action": "Invite a user",
          "description": "Invite a new user via email"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a user",
          "description": "Update an existing user"
        },
        {
          "name": "Update (Raw JSON)",
          "value": "updateRaw",
          "action": "Update a user with raw JSON",
          "description": "Update an existing user using raw JSON data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "import",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a file",
          "description": "Delete a file"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a file",
          "description": "Get a single file"
        },
        {
          "name": "Get (Raw JSON)",
          "value": "getRaw",
          "action": "Get a file with raw JSON",
          "description": "Get a single file using raw JSON query parameters"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many files",
          "description": "Get many files"
        },
        {
          "name": "Get Many (Raw JSON)",
          "value": "getAllRaw",
          "action": "Get many files with raw JSON",
          "description": "Get many files using raw JSON query parameters"
        },
        {
          "name": "Import a File",
          "value": "import",
          "action": "Import a file from URL",
          "description": "Import a file from a URL"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a file",
          "description": "Update file metadata"
        },
        {
          "name": "Update (Raw JSON)",
          "value": "updateRaw",
          "action": "Update a file with raw JSON",
          "description": "Update file metadata using raw JSON data"
        },
        {
          "name": "Upload a File",
          "value": "upload",
          "action": "Upload a file",
          "description": "Upload a file using binary data from a previous node"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an item",
      "description": "Create a new item",
      "resource": "item"
    },
    {
      "name": "Create (Raw JSON)",
      "value": "createRaw",
      "action": "Create an item with raw JSON",
      "description": "Create a new item using raw JSON data",
      "resource": "item"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an item",
      "description": "Delete an item",
      "resource": "item"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an item",
      "description": "Get a single item",
      "resource": "item"
    },
    {
      "name": "Get (Raw JSON)",
      "value": "getRaw",
      "action": "Get an item with raw JSON",
      "description": "Get a single item using raw JSON query parameters",
      "resource": "item"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many items",
      "description": "Get many items from a collection",
      "resource": "item"
    },
    {
      "name": "Get Many (Raw JSON)",
      "value": "getAllRaw",
      "action": "Get many items with raw JSON",
      "description": "Get many items using raw JSON query parameters",
      "resource": "item"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an item",
      "description": "Update an existing item",
      "resource": "item"
    },
    {
      "name": "Update (Raw JSON)",
      "value": "updateRaw",
      "action": "Update an item with raw JSON",
      "description": "Update an existing item using raw JSON data",
      "resource": "item"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a user",
      "description": "Delete a user",
      "resource": "user"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a user",
      "description": "Get a single user",
      "resource": "user"
    },
    {
      "name": "Get (Raw JSON)",
      "value": "getRaw",
      "action": "Get a user with raw JSON",
      "description": "Get a single user using raw JSON query parameters",
      "resource": "user"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many users",
      "description": "Get many users",
      "resource": "user"
    },
    {
      "name": "Get Many (Raw JSON)",
      "value": "getAllRaw",
      "action": "Get many users with raw JSON",
      "description": "Get many users using raw JSON query parameters",
      "resource": "user"
    },
    {
      "name": "Invite User",
      "value": "invite",
      "action": "Invite a user",
      "description": "Invite a new user via email",
      "resource": "user"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a user",
      "description": "Update an existing user",
      "resource": "user"
    },
    {
      "name": "Update (Raw JSON)",
      "value": "updateRaw",
      "action": "Update a user with raw JSON",
      "description": "Update an existing user using raw JSON data",
      "resource": "user"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a file",
      "description": "Delete a file",
      "resource": "file"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a file",
      "description": "Get a single file",
      "resource": "file"
    },
    {
      "name": "Get (Raw JSON)",
      "value": "getRaw",
      "action": "Get a file with raw JSON",
      "description": "Get a single file using raw JSON query parameters",
      "resource": "file"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many files",
      "description": "Get many files",
      "resource": "file"
    },
    {
      "name": "Get Many (Raw JSON)",
      "value": "getAllRaw",
      "action": "Get many files with raw JSON",
      "description": "Get many files using raw JSON query parameters",
      "resource": "file"
    },
    {
      "name": "Import a File",
      "value": "import",
      "action": "Import a file from URL",
      "description": "Import a file from a URL",
      "resource": "file"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a file",
      "description": "Update file metadata",
      "resource": "file"
    },
    {
      "name": "Update (Raw JSON)",
      "value": "updateRaw",
      "action": "Update a file with raw JSON",
      "description": "Update file metadata using raw JSON data",
      "resource": "file"
    },
    {
      "name": "Upload a File",
      "value": "upload",
      "action": "Upload a file",
      "description": "Upload a file using binary data from a previous node",
      "resource": "file"
    }
  ]

npm_readme:
  # n8n-nodes-directus

  A comprehensive n8n community node package for integrating with Directus CMS.

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

  ## Installation

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

  ### Package Name

  The package is published as `@directus/n8n-nodes-directus` on npm.

  ### From npm (when published)

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

  ## Usage

  ### Getting Started

  1. **Install the package** (when published):

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

     # Or using pnpm
     pnpm add @directus/n8n-nodes-directus
     ```

  2. **Configure credentials** in n8n:
     - Add your Directus URL (e.g., `https://your-directus.app`)
     - Add your Directus API token with appropriate permissions

  3. **Use the nodes** in your workflows:
     - **Directus Node**: For CRUD operations on items, users, and files
     - **Directus Trigger Node**: For webhook-based automation

  ### Available Operations

  #### Directus Node

  - **Items**:
    - Create, Create (Raw JSON)
    - Get, Get (Raw JSON)
    - Get Many, Get Many (Raw JSON)
    - Update, Update (Raw JSON)
    - Delete
  - **Users**:
    - Invite
    - Get, Get (Raw JSON)
    - Get Many, Get Many (Raw JSON) with Simplify option
    - Update, Update (Raw JSON)
    - Delete
  - **Files**:
    - Upload a File (using binary data from a previous node)
    - Import a File (from a URL)
    - Get, Get (Raw JSON)
    - Get Many, Get Many (Raw JSON) with Simplify option
    - Update, Update (Raw JSON)
    - Delete

  #### Directus Trigger Node

  - **Item Events**: Trigger on create, update, delete operations in collections
  - **User Events**: Trigger on user creation, updates, and deletions
  - **File Events**: Trigger on file uploads and updates

  ## Features

  - **Dynamic Field Loading**: Automatically loads available collections and fields from your Directus instance
  - **Smart Field Processing**: Handles complex field types and relationships
  - **Simplify Option**: Returns essential fields only for Users and Files "Get Many" operations
  - **Raw JSON Operations**: Full support for raw JSON data/query parameters for advanced use cases (available for all CRUD operations)
  - **Robust Error Handling**: Comprehensive error handling with detailed error messages
  - **Webhook Management**: Automatic webhook creation and cleanup for trigger nodes
  - **Type Safety**: Full TypeScript support with proper type definitions
  - **UX Compliance**: Follows n8n community node UX guidelines with proper naming and placeholders

  ## Credentials

  ### Directus API

  Configure your Directus instance connection:

  - **Directus URL**: Your Directus instance URL (e.g., `https://your-directus.app`)
  - **Token**: Your Directus API token with appropriate permissions

  ## Compatibility

  - **Directus Cloud**: Fully supported
  - **Self-hosted Directus**: Fully supported
  - **Directus Versions**: Compatible with Directus 10.0+

  ## Development

  This project uses the official n8n-node CLI tool for development and follows n8n community node standards.

  ### Prerequisites

  - **Node.js 22+**
  - **npm 10+**
  - **Directus instance** for testing (cloud or self-hosted)
  - **ngrok** (for webhook testing) - install from [ngrok.com](https://ngrok.com/)

  ### Setup

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

  # Install dependencies
  npm install

  # Build the project
  npm run build
  ```

  ### Quick Start

  1. **Start n8n with your node loaded**:

     ```bash
     npm run dev:n8n
     ```

     This will:
     - Link your custom node to n8n
     - Start n8n development server
     - Make your Directus nodes available in n8n

  2. **Access n8n**: Open http://localhost:5678 in your browser

  3. **Configure credentials**:
     - Add your Directus API credentials
     - Test the connection

  4. **Create workflows**: Use the Directus nodes in your workflows

  ### Testing

  #### Webhook Testing (Requires ngrok)

  For testing the **Directus Trigger** node, you need to expose n8n via a public URL since Directus cannot reach localhost:

  1. **Install ngrok** (if not already installed):

     ```bash
     # macOS with Homebrew
     brew install ngrok

     # Or download from https://ngrok.com/
     ```

  2. **Start n8n** (in one terminal):

     ```bash
     npm run dev:n8n
     ```

  3. **Start ngrok** (in another terminal):

     ```bash
     ngrok http 5678
     ```

     This will give you a public URL like `https://abc123.ngrok-free.dev`

  4. **Create a webhook workflow**:
     - Add a **Directus Trigger** node
     - Configure the trigger (resource, event, collection)
     - Activate the workflow
     - Copy the webhook URL from n8n

  5. **Update Directus webhook**:
     - In Directus, go to **Settings → Flows**
     - Find the created flow and edit it
     - Replace `localhost:5678` with your ngrok URL
     - Save the flow

  6. **Test the webhook**:
     - Create/update items in Directus
     - Check if the webhook triggers in n8n

  **Note**: The manual URL replacement step is required because Directus cannot reach localhost URLs directly.

  ### Getting Help

  - Check the [GitHub Issues](https://github.com/directus/n8n-nodes-directus/issues) for known problems
  - Run `pnpm test` to verify everything works
  - Use `pnpm test:coverage` to see test coverage

  ## Contributing

  We welcome feedback and suggestions! Please help us improve this community node:

  ### Reporting Issues

  - **Bug Reports**: Use the [GitHub Issues](https://github.com/directus/n8n-nodes-directus/issues) page to report bugs
  - **Feature Requests**: Submit enhancement ideas through GitHub Issues
  - **Documentation**: Help improve our documentation by reporting unclear sections

  ### Issue Guidelines

  When reporting issues, please provide:

  - Detailed description of the problem or feature request
  - Steps to reproduce (for bugs)
  - Expected vs actual behavior
  - Your Directus version and n8n version
  - Any relevant error messages or logs

  ### Code Contributions

  While we appreciate community interest, we maintain this node internally to ensure:

  - Consistent code quality and style
  - Proper testing and validation
  - Alignment with Directus and n8n best practices
  - Timely maintenance and updates

  If you have specific code improvements or bug fixes, please:

  1. **Open an issue first** describing the problem or improvement
  2. **Wait for our team to review** and potentially implement the change
  3. **Provide detailed information** to help us understand the requirement

  This approach ensures the node remains reliable, well-tested, and follows n8n community node verification guidelines.

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/installation/)
  - [Directus API Documentation](https://directus.io/docs/api)

  ## License

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

  ## Support

  For issues and questions:

  - [GitHub Issues](https://github.com/directus/n8n-nodes-directus/issues)
  - [Directus Community](https://community.directus.io/)
  - [n8n Community](https://community.n8n.io/)

ai_documentation_summary:
  {"purpose":"A community node package for integrating with Directus CMS, enabling CRUD operations on items, users, and files, as well as webhook-based automation.","capabilities":["Create items, users, and files","Retrieve single items with raw JSON support","Retrieve multiple items with raw JSON support","Update items, users, and files","Delete items, users, and files","Upload files using binary data","Import files from URLs","Invite users","Get many users/files with simplify option","Trigger on item events (create, update, delete)"],"authentication":"Directus API token with appropriate permissions","commonUseCases":["Automating content management workflows in Directus","Triggering actions in n8n when Directus data changes","Syncing data between Directus and other systems","File management automation (upload/import)"],"limitations":["Requires npm 10+ for installation","Node.js 22+ required for development","Webhook testing requires ngrok to expose n8n to Directus","Manual URL replacement needed in Directus flows for ngrok testing"],"relatedNodes":["n8n HTTP Request node","n8n Webhook node","n8n File node"]}


node_type: @starhunter/n8n-nodes-graphql.starhunter
package_name: @starhunter/n8n-nodes-graphql
display_name: Starhunter
description: Interact with Starhunter
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: andreas-ullrich-elunic
author_github_url: https://github.com/starhunter-gmbh/n8n-nodes-graphql.git
npm_package_name: @starhunter/n8n-nodes-graphql
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:33.407Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "person",
      "options": [
        {
          "name": "Candidate",
          "value": "candidate"
        },
        {
          "name": "Email",
          "value": "email"
        },
        {
          "name": "Employee",
          "value": "employee"
        },
        {
          "name": "Person",
          "value": "person"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Project Candidate",
          "value": "projectCandidate"
        },
        {
          "name": "Task",
          "value": "task"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getBirthdays",
      "options": [
        {
          "name": "Get Birthdays",
          "value": "getBirthdays",
          "action": "Get persons with birthdays on a date",
          "description": "Get all persons with birthdays on a specific date"
        },
        {
          "name": "Get by ID",
          "value": "getById",
          "action": "Get a person by ID",
          "description": "Retrieve a single person by their ID"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search persons",
          "description": "Search for persons by name"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search candidates",
          "description": "Search for candidates by ID, name, or birth date"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "candidate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Get Current User",
          "value": "getCurrent",
          "action": "Get current authenticated user",
          "description": "Get the employee record for the authenticated user"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search employees",
          "description": "Search for employees by ID or name"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "employee"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "log",
      "options": [
        {
          "name": "Log Email",
          "value": "log",
          "action": "Log an email activity",
          "description": "Log an email activity in Starhunter"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "email"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Add to Project",
          "value": "add",
          "action": "Add candidate to project",
          "description": "Add a candidate to a project with optional status"
        },
        {
          "name": "Get By Status Change Date",
          "value": "getByStatusChangeDate",
          "action": "Get candidates by status change date",
          "description": "Get project candidates whose status changed X days ago"
        },
        {
          "name": "Update Status",
          "value": "updateStatus",
          "action": "Update presentation status",
          "description": "Update the status of a presentation with optional comment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "projectCandidate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a task",
          "description": "Create a new task in Starhunter"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search projects",
          "description": "Search for projects by status"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Birthdays",
      "value": "getBirthdays",
      "action": "Get persons with birthdays on a date",
      "description": "Get all persons with birthdays on a specific date",
      "resource": "person"
    },
    {
      "name": "Get by ID",
      "value": "getById",
      "action": "Get a person by ID",
      "description": "Retrieve a single person by their ID",
      "resource": "person"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search persons",
      "description": "Search for persons by name",
      "resource": "person"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search candidates",
      "description": "Search for candidates by ID, name, or birth date",
      "resource": "candidate"
    },
    {
      "name": "Get Current User",
      "value": "getCurrent",
      "action": "Get current authenticated user",
      "description": "Get the employee record for the authenticated user",
      "resource": "employee"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search employees",
      "description": "Search for employees by ID or name",
      "resource": "employee"
    },
    {
      "name": "Log Email",
      "value": "log",
      "action": "Log an email activity",
      "description": "Log an email activity in Starhunter",
      "resource": "email"
    },
    {
      "name": "Add to Project",
      "value": "add",
      "action": "Add candidate to project",
      "description": "Add a candidate to a project with optional status",
      "resource": "projectCandidate"
    },
    {
      "name": "Get By Status Change Date",
      "value": "getByStatusChangeDate",
      "action": "Get candidates by status change date",
      "description": "Get project candidates whose status changed X days ago",
      "resource": "projectCandidate"
    },
    {
      "name": "Update Status",
      "value": "updateStatus",
      "action": "Update presentation status",
      "description": "Update the status of a presentation with optional comment",
      "resource": "projectCandidate"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a task",
      "description": "Create a new task in Starhunter",
      "resource": "task"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search projects",
      "description": "Search for projects by status",
      "resource": "project"
    }
  ]

npm_readme:
  # @starhunter/n8n-nodes-graphql

  This is an n8n community node that integrates with [Starhunter](https://starhunter.com) in your n8n workflows.

  Starhunter is a customer relationship management (CRM) system designed for recruiting and talent management. This node allows you to automate interactions with persons, candidates, employees, emails, project candidates, and tasks in Starhunter.

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

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

  ## Installation

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

  ## Operations

  ### Person

  - **Get Birthdays**: Retrieve persons whose birthday falls on a specific date (today or a custom date in MM-DD format)
  - **Get by ID**: Retrieve a single person by their ID
  - **Search**: Search for persons by name (partial match supported)

  ### Candidate

  - **Search**: Search for candidates by ID, name, or birth date

  ### Employee

  - **Get Current**: Get the employee record for the currently authenticated user
  - **Search**: Search for employees by ID or name

  ### Email

  - **Log**: Log an email activity in Starhunter (records sender, recipient, subject, and body)

  ### Project Candidate

  - **Get by Status Change Date**: Retrieve project candidates whose status changed a specified number of days ago

  ### Task

  - **Create**: Create a new task with optional deadline, assignee, and target entity

  ## Credentials

  To use this node, you need to authenticate with your Starhunter instance using an API access token.

  ### Prerequisites

  1. Access to a Starhunter instance
  2. A valid API access token from your Starhunter account settings

  ### Setting up credentials in n8n

  1. In n8n, go to **Credentials** and click **Add Credential**
  2. Search for **Starhunter API**
  3. Enter the following:
     - **Base URL**: The base URL of your Starhunter instance (e.g., `https://your-company.starhunter.software`).
     - **Access Token**: Your Starhunter API access token
  4. Click **Save** to test the connection

  For API documentation, refer to your instance's built-in docs at `https://<your-instance>.starhunter.software/Api/docs`.

  ## Compatibility

  - **Minimum n8n version**: 1.0.0
  - **n8n Nodes API version**: 1
  - **AI Tool compatible**: Yes (can be used as a tool in n8n AI workflows)

  Tested with n8n version 1.x.

  ## Usage

  ### Example: Birthday notifications

  Create a workflow that runs daily to fetch persons with birthdays today and send notification emails or Slack messages to your team.

  1. Add a **Schedule Trigger** node set to run daily
  2. Add the **Starhunter** node with:
     - Resource: Person
     - Operation: Get Birthdays
     - Use Today: enabled
  3. Connect to an **Email** or **Slack** node to send notifications

  ### Example: Log emails to CRM

  Automatically log emails sent through your workflow back to Starhunter for tracking purposes.

  1. After sending an email in your workflow, add the **Starhunter** node
  2. Configure with:
     - Resource: Email
     - Operation: Log
     - Map the from, to, subject, and body fields from your email node

  ### Example: Track candidate status changes

  Monitor candidates who changed status a specific number of days ago for follow-up actions.

  1. Add a **Schedule Trigger** node
  2. Add the **Starhunter** node with:
     - Resource: Project Candidate
     - Operation: Get by Status Change Date
     - Status: Your target status (e.g., "Ident")
     - Days Ago: Number of days to look back

  ## Resources

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

  ## Version history

  ### 0.1.1

  - Initial public release
  - Added publishConfig for npm public access

  ### 0.1.0

  - Initial release with support for:
    - Person operations (Get Birthdays, Get by ID, Search)
    - Candidate operations (Search)
    - Employee operations (Get Current, Search)
    - Email operations (Log)
    - Project Candidate operations (Get by Status Change Date)
    - Task operations (Create)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of interactions within the Starhunter CRM system, covering recruiting and talent management tasks.","capabilities":["Retrieve persons by ID, search by name, or get birthdays for a specific date","Search for candidates by ID, name, or birth date","Retrieve current authenticated employee record","Search for employees by ID or name","Log email activities (sender, recipient, subject, body) into Starhunter","Retrieve project candidates based on status change date","Create new tasks with deadline, assignee, and target entity"],"authentication":"API key required (Starhunter API access token)","commonUseCases":["Automated birthday notifications for employees","Tracking candidate status changes for follow-up actions","Logging workflow-generated emails into the CRM","Retrieving current user employee profile"],"limitations":["Requires access to a Starhunter instance","Requires a valid API access token from Starhunter account settings"],"relatedNodes":["n8n Schedule Trigger","n8n Email","n8n Slack"]}


