# nodes

node_type: @emvion/n8n-nodes-venabo.emvionVenabo
package_name: @emvion/n8n-nodes-venabo
display_name: Emvion Venabo
description: Interact with the emvion venabo API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: frerichs
author_github_url: https://github.com/emvion-group/n8n-nodes-venabo.git
npm_package_name: @emvion/n8n-nodes-venabo
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:33.692Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "department",
      "options": [
        {
          "name": "Address",
          "value": "address"
        },
        {
          "name": "Department",
          "value": "department"
        },
        {
          "name": "Employee",
          "value": "employee"
        },
        {
          "name": "Object",
          "value": "object"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Ticket",
          "value": "ticket"
        },
        {
          "name": "Ticket Entry",
          "value": "ticket_entries"
        },
        {
          "name": "Time Entry",
          "value": "time_entry"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an address",
          "routing": {
            "request": {
              "url": "/addresses",
              "method": "POST"
            }
          },
          "description": "Create a new address"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an address",
          "routing": {
            "request": {
              "url": "=/addresses/{{$parameter.addressId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete an address"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an address",
          "routing": {
            "request": {
              "url": "=/addresses/{{$parameter.addressId}}",
              "method": "GET"
            }
          },
          "description": "Get a single address"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many addresses",
          "routing": {
            "request": {
              "url": "/addresses",
              "method": "GET"
            }
          },
          "description": "Get many addresses"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an address",
          "routing": {
            "request": {
              "url": "=/addresses/{{$parameter.addressId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing address"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "address"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a department",
          "routing": {
            "request": {
              "url": "/departments",
              "method": "POST"
            }
          },
          "description": "Create a new department"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a department",
          "routing": {
            "request": {
              "url": "=/departments/{{$parameter.departmentId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a department"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a department",
          "routing": {
            "request": {
              "url": "=/departments/{{$parameter.departmentId}}",
              "method": "GET"
            }
          },
          "description": "Get a single department"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many departments",
          "routing": {
            "request": {
              "url": "/departments",
              "method": "GET"
            }
          },
          "description": "Get many departments"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a department",
          "routing": {
            "request": {
              "url": "=/departments/{{$parameter.departmentId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing department"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "department"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an employee",
          "routing": {
            "request": {
              "url": "/employees",
              "method": "POST"
            }
          },
          "description": "Create a new employee"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an employee",
          "routing": {
            "request": {
              "url": "=/employees/{{$parameter.employeeId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete an employee"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an employee",
          "routing": {
            "request": {
              "url": "=/employees/{{$parameter.employeeId}}",
              "method": "GET"
            }
          },
          "description": "Get a single employee"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many employees",
          "routing": {
            "request": {
              "url": "/employees",
              "method": "GET"
            }
          },
          "description": "Get many employees"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an employee",
          "routing": {
            "request": {
              "url": "=/employees/{{$parameter.employeeId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing employee"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "employee"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an object",
          "routing": {
            "request": {
              "url": "/objects",
              "method": "POST"
            }
          },
          "description": "Create a new object"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an object",
          "routing": {
            "request": {
              "url": "=/objects/{{$parameter.objectId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete an object"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an object",
          "routing": {
            "request": {
              "url": "=/objects/{{$parameter.objectId}}",
              "method": "GET"
            }
          },
          "description": "Get a single object"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many objects",
          "routing": {
            "request": {
              "url": "/objects",
              "method": "GET"
            }
          },
          "description": "Get many objects"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an object",
          "routing": {
            "request": {
              "url": "=/objects/{{$parameter.objectId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing object"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "object"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a project",
          "routing": {
            "request": {
              "url": "/projects",
              "method": "POST"
            }
          },
          "description": "Create a new project"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a project",
          "routing": {
            "request": {
              "url": "=/projects/{{$parameter.projectId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a project"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project",
          "routing": {
            "request": {
              "url": "=/projects/{{$parameter.projectId}}",
              "method": "GET"
            }
          },
          "description": "Get a single project"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many projects",
          "routing": {
            "request": {
              "url": "/projects",
              "method": "GET"
            }
          },
          "description": "Get many projects"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a project",
          "routing": {
            "request": {
              "url": "=/projects/{{$parameter.projectId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a ticket",
          "routing": {
            "request": {
              "url": "/tickets",
              "method": "POST"
            }
          },
          "description": "Create a new ticket"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a ticket",
          "routing": {
            "request": {
              "url": "=/tickets/{{$parameter.ticketId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a ticket"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a ticket",
          "routing": {
            "request": {
              "url": "=/tickets/{{$parameter.ticketId}}",
              "method": "GET"
            }
          },
          "description": "Get a single ticket"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many tickets",
          "routing": {
            "request": {
              "url": "/tickets",
              "method": "GET"
            }
          },
          "description": "Get many tickets"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a ticket",
          "routing": {
            "request": {
              "url": "=/tickets/{{$parameter.ticketId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing ticket"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ticket"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a ticket entry",
          "routing": {
            "request": {
              "url": "=/ticket_entries/{{$parameter.ticketEntryId}}",
              "method": "GET"
            }
          },
          "description": "Get a single ticket entry"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many ticket entries",
          "routing": {
            "request": {
              "url": "/ticket_entries",
              "method": "GET"
            }
          },
          "description": "Get many ticket entries"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ticket_entries"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a time entry",
          "routing": {
            "request": {
              "url": "/time_entry",
              "method": "POST"
            }
          },
          "description": "Create a new time entry"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a time entry",
          "routing": {
            "request": {
              "url": "=/time_entry/{{$parameter.timeEntryId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a time entry"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a time entry",
          "routing": {
            "request": {
              "url": "=/time_entry/{{$parameter.timeEntryId}}",
              "method": "GET"
            }
          },
          "description": "Get a single time entry"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many time entries",
          "routing": {
            "request": {
              "url": "/time_entry",
              "method": "GET"
            }
          },
          "description": "Get many time entries"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a time entry",
          "routing": {
            "request": {
              "url": "=/time_entry/{{$parameter.timeEntryId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing time entry"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "time_entry"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an address",
      "routing": {
        "request": {
          "url": "/addresses",
          "method": "POST"
        }
      },
      "description": "Create a new address",
      "resource": "address"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an address",
      "routing": {
        "request": {
          "url": "=/addresses/{{$parameter.addressId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete an address",
      "resource": "address"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an address",
      "routing": {
        "request": {
          "url": "=/addresses/{{$parameter.addressId}}",
          "method": "GET"
        }
      },
      "description": "Get a single address",
      "resource": "address"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many addresses",
      "routing": {
        "request": {
          "url": "/addresses",
          "method": "GET"
        }
      },
      "description": "Get many addresses",
      "resource": "address"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an address",
      "routing": {
        "request": {
          "url": "=/addresses/{{$parameter.addressId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing address",
      "resource": "address"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a department",
      "routing": {
        "request": {
          "url": "/departments",
          "method": "POST"
        }
      },
      "description": "Create a new department",
      "resource": "department"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a department",
      "routing": {
        "request": {
          "url": "=/departments/{{$parameter.departmentId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a department",
      "resource": "department"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a department",
      "routing": {
        "request": {
          "url": "=/departments/{{$parameter.departmentId}}",
          "method": "GET"
        }
      },
      "description": "Get a single department",
      "resource": "department"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many departments",
      "routing": {
        "request": {
          "url": "/departments",
          "method": "GET"
        }
      },
      "description": "Get many departments",
      "resource": "department"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a department",
      "routing": {
        "request": {
          "url": "=/departments/{{$parameter.departmentId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing department",
      "resource": "department"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an employee",
      "routing": {
        "request": {
          "url": "/employees",
          "method": "POST"
        }
      },
      "description": "Create a new employee",
      "resource": "employee"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an employee",
      "routing": {
        "request": {
          "url": "=/employees/{{$parameter.employeeId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete an employee",
      "resource": "employee"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an employee",
      "routing": {
        "request": {
          "url": "=/employees/{{$parameter.employeeId}}",
          "method": "GET"
        }
      },
      "description": "Get a single employee",
      "resource": "employee"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many employees",
      "routing": {
        "request": {
          "url": "/employees",
          "method": "GET"
        }
      },
      "description": "Get many employees",
      "resource": "employee"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an employee",
      "routing": {
        "request": {
          "url": "=/employees/{{$parameter.employeeId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing employee",
      "resource": "employee"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an object",
      "routing": {
        "request": {
          "url": "/objects",
          "method": "POST"
        }
      },
      "description": "Create a new object",
      "resource": "object"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an object",
      "routing": {
        "request": {
          "url": "=/objects/{{$parameter.objectId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete an object",
      "resource": "object"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an object",
      "routing": {
        "request": {
          "url": "=/objects/{{$parameter.objectId}}",
          "method": "GET"
        }
      },
      "description": "Get a single object",
      "resource": "object"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many objects",
      "routing": {
        "request": {
          "url": "/objects",
          "method": "GET"
        }
      },
      "description": "Get many objects",
      "resource": "object"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an object",
      "routing": {
        "request": {
          "url": "=/objects/{{$parameter.objectId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing object",
      "resource": "object"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a project",
      "routing": {
        "request": {
          "url": "/projects",
          "method": "POST"
        }
      },
      "description": "Create a new project",
      "resource": "project"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a project",
      "routing": {
        "request": {
          "url": "=/projects/{{$parameter.projectId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a project",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "routing": {
        "request": {
          "url": "=/projects/{{$parameter.projectId}}",
          "method": "GET"
        }
      },
      "description": "Get a single project",
      "resource": "project"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many projects",
      "routing": {
        "request": {
          "url": "/projects",
          "method": "GET"
        }
      },
      "description": "Get many projects",
      "resource": "project"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a project",
      "routing": {
        "request": {
          "url": "=/projects/{{$parameter.projectId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing project",
      "resource": "project"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a ticket",
      "routing": {
        "request": {
          "url": "/tickets",
          "method": "POST"
        }
      },
      "description": "Create a new ticket",
      "resource": "ticket"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a ticket",
      "routing": {
        "request": {
          "url": "=/tickets/{{$parameter.ticketId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a ticket",
      "resource": "ticket"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a ticket",
      "routing": {
        "request": {
          "url": "=/tickets/{{$parameter.ticketId}}",
          "method": "GET"
        }
      },
      "description": "Get a single ticket",
      "resource": "ticket"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many tickets",
      "routing": {
        "request": {
          "url": "/tickets",
          "method": "GET"
        }
      },
      "description": "Get many tickets",
      "resource": "ticket"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a ticket",
      "routing": {
        "request": {
          "url": "=/tickets/{{$parameter.ticketId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing ticket",
      "resource": "ticket"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a ticket entry",
      "routing": {
        "request": {
          "url": "=/ticket_entries/{{$parameter.ticketEntryId}}",
          "method": "GET"
        }
      },
      "description": "Get a single ticket entry",
      "resource": "ticket_entries"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many ticket entries",
      "routing": {
        "request": {
          "url": "/ticket_entries",
          "method": "GET"
        }
      },
      "description": "Get many ticket entries",
      "resource": "ticket_entries"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a time entry",
      "routing": {
        "request": {
          "url": "/time_entry",
          "method": "POST"
        }
      },
      "description": "Create a new time entry",
      "resource": "time_entry"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a time entry",
      "routing": {
        "request": {
          "url": "=/time_entry/{{$parameter.timeEntryId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a time entry",
      "resource": "time_entry"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a time entry",
      "routing": {
        "request": {
          "url": "=/time_entry/{{$parameter.timeEntryId}}",
          "method": "GET"
        }
      },
      "description": "Get a single time entry",
      "resource": "time_entry"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many time entries",
      "routing": {
        "request": {
          "url": "/time_entry",
          "method": "GET"
        }
      },
      "description": "Get many time entries",
      "resource": "time_entry"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a time entry",
      "routing": {
        "request": {
          "url": "=/time_entry/{{$parameter.timeEntryId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing time entry",
      "resource": "time_entry"
    }
  ]

npm_readme:
  # @emvion/n8n-nodes-venabo

  n8n Community Node for integration with **venabo.Zeit** and **venabo.Service** - a software for time tracking and service management.

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

  ```bash
  npm install @emvion/n8n-nodes-venabo
  ```

  ## Operations

  This node supports the following resources and operations:

  | Resource         | Description             |
  |------------------|-------------------------|
  | **Address**      | Manage addresses        |
  | **Department**   | Manage departments      |
  | **Employee**     | Manage employees        |
  | **Object**       | Manage objects          |
  | **Project**      | Manage projects         |
  | **Ticket**       | Manage tickets          |
  | **Ticket Entry** | Manage ticket entries   |
  | **Time Entry**   | Manage time entries     |

  Each resource supports the following operations:

  - **Create** - Create a new entry
  - **Get** - Retrieve a single entry
  - **Get Many** - Retrieve multiple entries
  - **Update** - Update an entry
  - **Delete** - Delete an entry

  ## Credentials

  To use this node, you need the following credentials:

  | Field       | Description                                                               |
  |-------------|---------------------------------------------------------------------------|
  | **API URL** | The base URL of your venabo instance (e.g. `https://domain.venabo.cloud`) |
  | **API Key** | The API key for authentication                                            |

  ### Creating an API Key

  1. Log in to your venabo instance
  2. Navigate to users
  3. Create a new API user with appropriate permissions
  4. Copy the key and paste it into n8n

  ## Compatibility

  - Tested with n8n version 2.4.0
  - Requires n8n version 2.4.0 or higher

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [venabo Website](https://www.venabo.de/)
  - [emvion Business Software GmbH](https://www.emvion.de/)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community n8n node that enables automation workflows to interact with the emvion venabo API for time tracking and service management.","capabilities":["Create new entries for addresses, departments, employees, objects, projects, tickets, ticket entries, and time entries","Retrieve single or multiple entries for all supported resources","Update existing entries across all resources","Delete entries from all supported resources","Manage organizational data including addresses, departments, employees, objects, projects, and tickets"],"authentication":"API Key required (along with API URL)","commonUseCases":["Automating time entry creation and tracking","Managing project and employee records","Handling ticket workflows and updates","Synchronizing organizational data between venabo and other systems"],"limitations":["Requires n8n version 2.4.0 or higher","Requires manual creation of API users with appropriate permissions in the venabo instance"],"relatedNodes":["n8n HTTP Request","n8n Webhook","n8n Code Node"]}


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

updated_at: 2026-07-14 14:40:33
author_name: apoorva-prospeo
author_github_url: https://github.com/prospeo-v2/n8n-nodes-prospeo.git
npm_package_name: @prospeo/n8n-nodes-prospeo
npm_version: 1.0.0
community_fetched_at: 2026-07-14T14:40:33.693Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Prospeo is a B2B platform to find people and company data and enrich them with verified emails and mobile numbers.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "person",
      "options": [
        {
          "name": "Person",
          "value": "person"
        },
        {
          "name": "Company",
          "value": "company"
        },
        {
          "name": "Account",
          "value": "account"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "enrich",
      "options": [
        {
          "name": "Enrich Person",
          "value": "enrich",
          "action": "Enrich a person",
          "routing": {
            "request": {
              "url": "/enrich-person",
              "method": "POST"
            }
          },
          "description": "Enriches a person with details like email, mobile number, job title, etc"
        },
        {
          "name": "Find Verified Work Email",
          "value": "findEmail",
          "action": "Find verified work email",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "setKeyValue",
                  "properties": {
                    "email": "={{ $responseItem.person?.email?.email ?? null }}"
                  }
                }
              ]
            },
            "request": {
              "url": "/enrich-person",
              "body": {
                "only_verified_email": true
              },
              "method": "POST"
            }
          },
          "description": "Finds a verified work email for a person"
        },
        {
          "name": "Find Verified Mobile Number",
          "value": "findMobile",
          "action": "Find verified mobile number",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "setKeyValue",
                  "properties": {
                    "mobile": "={{ $responseItem.person?.mobile?.mobile ?? null }}"
                  }
                }
              ]
            },
            "request": {
              "url": "/enrich-person",
              "body": {
                "only_verified_mobile": true
              },
              "method": "POST"
            }
          },
          "description": "Finds a verified mobile number for a person"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "enrich",
      "options": [
        {
          "name": "Enrich Company",
          "value": "enrich",
          "action": "Enrich a company",
          "routing": {
            "request": {
              "url": "/enrich-company",
              "method": "POST"
            }
          },
          "description": "Enriches a company with various details"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "company"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "info",
      "options": [
        {
          "name": "Get Account Information",
          "value": "info",
          "action": "Get account information",
          "routing": {
            "request": {
              "url": "/account-information",
              "method": "GET"
            }
          },
          "description": "Finds various details related to your Prospeo account"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Enrich Person",
      "value": "enrich",
      "action": "Enrich a person",
      "routing": {
        "request": {
          "url": "/enrich-person",
          "method": "POST"
        }
      },
      "description": "Enriches a person with details like email, mobile number, job title, etc",
      "resource": "person"
    },
    {
      "name": "Find Verified Work Email",
      "value": "findEmail",
      "action": "Find verified work email",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "setKeyValue",
              "properties": {
                "email": "={{ $responseItem.person?.email?.email ?? null }}"
              }
            }
          ]
        },
        "request": {
          "url": "/enrich-person",
          "body": {
            "only_verified_email": true
          },
          "method": "POST"
        }
      },
      "description": "Finds a verified work email for a person",
      "resource": "person"
    },
    {
      "name": "Find Verified Mobile Number",
      "value": "findMobile",
      "action": "Find verified mobile number",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "setKeyValue",
              "properties": {
                "mobile": "={{ $responseItem.person?.mobile?.mobile ?? null }}"
              }
            }
          ]
        },
        "request": {
          "url": "/enrich-person",
          "body": {
            "only_verified_mobile": true
          },
          "method": "POST"
        }
      },
      "description": "Finds a verified mobile number for a person",
      "resource": "person"
    },
    {
      "name": "Enrich Company",
      "value": "enrich",
      "action": "Enrich a company",
      "routing": {
        "request": {
          "url": "/enrich-company",
          "method": "POST"
        }
      },
      "description": "Enriches a company with various details",
      "resource": "company"
    },
    {
      "name": "Get Account Information",
      "value": "info",
      "action": "Get account information",
      "routing": {
        "request": {
          "url": "/account-information",
          "method": "GET"
        }
      },
      "description": "Finds various details related to your Prospeo account",
      "resource": "account"
    }
  ]

npm_readme:
  # n8n-nodes-prospeo

  n8n community node for [Prospeo](https://prospeo.io/) - find verified emails and mobile numbers for people and companies.

  ## Operations

  ### Person
  - **Enrich Person** - Get person data (job title, company, socials, contact info)
  - **Find Verified Work Email** - Get verified business email
  - **Find Verified Mobile Number** - Get verified mobile number

  ### Company
  - **Enrich Company** - Get company details (size, industry, location, etc.)

  ### Account
  - **Get Account Information** - Check your API usage

  ## Installation

  ### Via n8n

  1. Go to **Settings** and then **Community Nodes**
  2. Click **Install**
  3. Enter `n8n-nodes-prospeo` in the search box.
  4. Click on **Install** button.

  ### Manual

  ```bash
  cd ~/.n8n/custom-n8n-nodes-directory
  git clone https://github.com/prospeo-v2/n8n-nodes-prospeo.git
  cd n8n-nodes-prospeo
  npm install && npm run build
  # Restart n8n after all the steps
  ```

  ## Credentials

  1. Get your API key from [Prospeo dashboard](https://app.prospeo.io/api).
  2. In n8n, for Prospeo, and the new credential with API key.

  ## Links

  - [Prospeo](https://prospeo.io/)
  - [Prospeo API Docs](https://prospeo.io/api-docs)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)

  ## Issues

  [Open an issue](https://github.com/prospeo-v2/n8n-nodes-prospeo/issues)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"A community n8n node that connects to the Prospeo B2B platform to retrieve verified emails, mobile numbers, and detailed company or person data.","capabilities":["Enrich person data (job title, company, socials, contact info)","Find verified work email for a person","Find verified mobile number for a person","Enrich company details (size, industry, location)","Check API usage and account information"],"authentication":"API key required","commonUseCases":["Lead verification and enrichment","Sales outreach with verified contact details","Company research and prospecting","Data cleaning for contact lists"],"limitations":["Requires manual installation via git clone and npm build for non-community node users","Limited to Prospeo platform's data availability and API rate limits"],"relatedNodes":["HTTP Request","Cron Trigger","Set"]}


node_type: @demografix/n8n-nodes-genderize.demografixGenderize
package_name: @demografix/n8n-nodes-genderize
display_name: Genderize
description: Get gender prediction for a given name using the Genderize.io API (free tier: 2,500 requests/month)
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: demografix
author_github_url: https://github.com/DemografixGenderize/n8n-nodes-genderize.git
npm_package_name: @demografix/n8n-nodes-genderize
npm_version: 1.1.1
community_fetched_at: 2026-07-14T14:40:33.694Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "getGender",
      "options": [
        {
          "name": "Get Gender",
          "value": "getGender",
          "action": "Get gender prediction for a name",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "set",
                  "properties": {
                    "value": "={{ { ...($response.body), \"rateLimit\": { \"limit\": $response.headers[\"x-rate-limit-limit\"], \"remaining\": $response.headers[\"x-rate-limit-remaining\"], \"reset\": $response.headers[\"x-rate-limit-reset\"] } } }}"
                  }
                }
              ]
            },
            "request": {
              "qs": {
                "name": "={{$parameter.name}}",
                "country_id": "={{$parameter.country_id || undefined}}"
              },
              "url": "",
              "method": "GET"
            }
          },
          "description": "Get the predicted gender for a given first name"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Gender",
      "value": "getGender",
      "action": "Get gender prediction for a name",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "set",
              "properties": {
                "value": "={{ { ...($response.body), \"rateLimit\": { \"limit\": $response.headers[\"x-rate-limit-limit\"], \"remaining\": $response.headers[\"x-rate-limit-remaining\"], \"reset\": $response.headers[\"x-rate-limit-reset\"] } } }}"
              }
            }
          ]
        },
        "request": {
          "qs": {
            "name": "={{$parameter.name}}",
            "country_id": "={{$parameter.country_id || undefined}}"
          },
          "url": "",
          "method": "GET"
        }
      },
      "description": "Get the predicted gender for a given first name"
    }
  ]

npm_readme:
  # @demografix/n8n-nodes-genderize

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

  Genderize.io is a gender prediction API that infers gender based on names using statistical analysis.

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

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

  ## Installation

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

  ## Operations

  - **Get Gender**: Predict the gender for a given name with probability score

  ## Credentials

  An API key is required for all Genderize.io requests.

  ### Free tier — 2,500 requests/month
  Sign up at [genderize.io](https://genderize.io) for a free account. Free accounts include 2,500 requests per month at no cost.

  ### Paid tiers
  For higher volumes, subscribe to a paid plan at [genderize.io](https://genderize.io) — tiers cover increased monthly request quotas.

  ### Setup
  1. Sign up at [genderize.io](https://genderize.io)
  2. Copy your API key from the dashboard
  3. In n8n, create new "Genderize API" credentials
  4. Paste the API key
  5. Test the credentials to verify they work

  ## Compatibility

  This node is built using n8n's declarative style and requires n8n version 1.0 or later.

  ## Usage

  ### Basic Example
  1. Add the "Genderize" node to your workflow
  2. Enter a name (e.g., "Peter", "Sarah", "Alex")
  3. Execute the node

  ### Response Data
  The node returns the following data:
  - `name`: The name that was queried
  - `gender`: Predicted gender ("male", "female", or null)
  - `probability`: Confidence score (0-1, where 1 is 100% confident)
  - `count`: Number of data samples used for this prediction
  - `rateLimit.limit`: Total requests allowed in current period
  - `rateLimit.remaining`: Requests remaining in current period
  - `rateLimit.reset`: Seconds until the rate limit window resets

  ### Tips
  - Names with probability close to 0.5 indicate unisex names with less certainty
  - The API supports diacritics and non-Latin alphabets
  - Use the `rateLimit` data to monitor your API usage and avoid hitting limits

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Genderize.io official website](https://genderize.io)
  - [Genderize.io API documentation](https://genderize.io/documentation)

ai_documentation_summary:
  {"purpose":"Predicts the gender of a given first name using the Genderize.io API, returning the predicted gender, confidence probability, and usage statistics.","capabilities":["Predict gender from first names","Return probability score (0-1)","Support diacritics and non-Latin alphabets","Track rate limits and remaining requests","Return sample count used for prediction"],"authentication":"None for free tier (100 requests/day); API key required for paid tiers","commonUseCases":["Data anonymization workflows","User profile enrichment","Demographic analysis","Privacy-preserving data processing"],"limitations":["Free tier limited to 100 requests per day per IP address","No signup required for free tier but limited by rate limits","Paid tier requires subscription to Genderize.io"],"relatedNodes":["n8n HTTP Request node","n8n Set node","n8n Split In Batches node"]}


node_type: n8n-nodes-channel-talk.channelTalkTrigger
package_name: n8n-nodes-channel-talk
display_name: Channel Talk Trigger
description: Starts the workflow when Channel Talk events occur
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: zoyi
author_github_url: https://github.com/channel-io/
npm_package_name: n8n-nodes-channel-talk
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:33.695Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-channel-talk

  This is an n8n community node. It lets you work with Channel Talk in your n8n workflows: send messages and retrieve channel info.

  [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

  - Bot
    - List (GET /open/v5/bots)
    - Create or Update (POST /open/v5/bots)
    - Delete (DELETE /open/v5/bots/{botId})
  - Channel
    - Get: Retrieve the channel connected with your API credentials (GET /open/v5/channel)
  - Manager
    - List (GET /open/v5/managers)
    - Get (GET /open/v5/managers/{managerId})
  - Team Chat
    - List (GET /open/v5/groups)
    - Get (GET /open/v5/groups/{groupId})
    - Get by Name (GET /open/v5/groups/@{groupName})
    - Update (PATCH /open/v5/groups/{groupId})
    - Get Sessions (GET /open/v5/groups/{groupId}/sessions)
    - Get Messages (GET /open/v5/groups/{groupId}/messages)
    - Get Messages by Name (GET /open/v5/groups/@{groupName}/messages)
    - Get Messages File (GET /open/v5/groups/{groupId}/messages/file)
    - Get Messages File by Name (GET /open/v5/groups/@{groupName}/messages/file)
    - Create Message - Plain Text (POST /open/v5/groups/{groupId}/messages)
    - Create Message - Plain Text by Name (POST /open/v5/groups/@{groupName}/messages)
    - Create Message - Blocks (POST /open/v5/groups/{groupId}/messages)
    - Create Message - Blocks by Name (POST /open/v5/groups/@{groupName}/messages)
  - User
    - Get by User ID (GET /open/v5/users/{userId})
    - Get by Member ID (GET /open/v5/users/@{memberId})
    - Create (POST /open/v5/users)
    - Create or Update (PUT /open/v5/users/@{memberId})
    - Update (PATCH /open/v5/users/{userId})
    - Delete by User ID (DELETE /open/v5/users/{userId})
    - Delete by Member ID (DELETE /open/v5/users/@{memberId})
    - Block (POST /open/v5/users/{userId}/block)
    - Unblock (DELETE /open/v5/users/{userId}/block)
    - Issue User Token by User ID (PUT /open/v5/users/{userId}/user-token/issue)
    - Issue User Token by Member ID (PUT /open/v5/users/@{memberId}/user-token/issue)
    - Issue Session JWT (PUT /open/v5/users/@{memberId}/session-jwt/issue)
    - Touch (POST /open/v5/users/{userId}/touch)
  - User Chat
    - List (GET /open/v5/user-chats)
    - Get (GET /open/v5/user-chats/{userChatId})
    - Update (PATCH /open/v5/user-chats/{userChatId})
    - Delete (DELETE /open/v5/user-chats/{userChatId})
    - Open (PUT /open/v5/user-chats/{userChatId}/open)
    - Close (PATCH /open/v5/user-chats/{userChatId}/close)
    - Snooze (PUT /open/v5/user-chats/{userChatId}/snooze)
    - Remove (DELETE /open/v5/user-chats/{userChatId}/remove)
    - Assign to Manager (PATCH /open/v5/user-chats/{userChatId}/assign-to/managers/{managerId})
    - Invite (PATCH /open/v5/user-chats/{userChatId}/invite)
    - Get Cases (GET /open/v5/user-chats/cases)
    - Get Sessions (GET /open/v5/user-chats/{userChatId}/sessions)
    - Get Messages (GET /open/v5/user-chats/{userChatId}/messages)
    - Get Messages File (GET /open/v5/user-chats/{userChatId}/messages/file)
    - Create Message (POST /open/v5/user-chats/{userChatId}/messages)
    - Get Meets Messages (GET /open/v5/user-chats/{userChatId}/meets/{messageId}/messages)
    - Get Meets Recording (GET /open/v5/user-chats/{userChatId}/meets/{messageId}/recording)
  - Webhook
    - List (GET /open/v5/webhooks)
    - Get (GET /open/v5/webhooks/{webhookId})
    - Create (POST /open/v5/webhooks)
    - Update (PATCH /open/v5/webhooks/{webhookId})
    - Delete (DELETE /open/v5/webhooks/{webhookId})

  ## Credentials

  Create Open API credentials in Channel Talk and set the following fields:

  - Access Key
  - Access Secret

  These are sent as `x-access-key` and `x-access-secret` headers in each request.

  Refer to the Channel developers documentation for details:
  https://developers.channel.io/docs/authentication-2

  ## Compatibility

  Compatible with n8n@1.60.0 or later

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Channel Open API docs](https://developers.channel.io/docs)

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with Channel Talk's Open API, allowing users to manage bots, channels, teams, users, and messages within automated workflows.","capabilities":["List, create, update, and delete bots","Retrieve connected channel information","List, get, update, and delete team chats (groups)","Retrieve and create messages (plain text and blocks) in team chats","Manage user data including creation, updates, deletion, blocking, and token issuance","Handle user chats including opening, closing, snoozing, and assigning to managers","Retrieve and create messages in user chats","List, create, update, and delete webhooks","Issue session JWTs and user tokens"],"authentication":"API Key (Access Key and Access Secret sent as x-access-key and x-access-secret headers)","commonUseCases":["Automated customer support workflows using team chat messages","User management automation (onboarding, blocking, token generation)","Bot lifecycle management in automated scripts","Webhook management for custom integrations"],"limitations":["Community node (not official n8n node)","Requires specific Channel Talk API credentials","Compatible only with n8n version 1.60.0 or later"],"relatedNodes":["n8n-nodes-core.webhook","n8n-nodes-core.httpRequest","n8n-nodes-core.manualTrigger"]}


node_type: n8n-nodes-channel-talk.channelTalk
package_name: n8n-nodes-channel-talk
display_name: Channel Talk
description: Send messages to Channel Talk
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: zoyi
author_github_url: https://github.com/channel-io/
npm_package_name: n8n-nodes-channel-talk
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:33.696Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "userChat",
      "options": [
        {
          "name": "Bot",
          "value": "bot"
        },
        {
          "name": "Channel",
          "value": "channel"
        },
        {
          "name": "Manager",
          "value": "manager"
        },
        {
          "name": "Team Chat",
          "value": "teamChat"
        },
        {
          "name": "User",
          "value": "user"
        },
        {
          "name": "User Chat",
          "value": "userChat"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create or Update",
          "value": "createOrUpdate",
          "action": "Create or update a bot",
          "routing": {
            "request": {
              "url": "/open/v5/bots",
              "method": "POST"
            }
          },
          "description": "Create a new bot or update an existing one"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a bot",
          "routing": {
            "request": {
              "url": "=/open/v5/bots/{{$parameter.botId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a bot"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List all bots",
          "routing": {
            "request": {
              "url": "/open/v5/bots",
              "method": "GET"
            }
          },
          "description": "List all bots in the channel"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "bot"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get channel",
          "routing": {
            "request": {
              "url": "/open/v5/channel",
              "method": "GET"
            }
          },
          "description": "Retrieve the channel connected with the given API key credentials"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "channel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a manager",
          "routing": {
            "request": {
              "url": "=/open/v5/managers/{{$parameter.managerId}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a manager by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List all managers",
          "routing": {
            "request": {
              "url": "/open/v5/managers",
              "method": "GET"
            }
          },
          "description": "List all managers in the channel"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "manager"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create Message (Blocks, by Name)",
          "value": "createMessageBlocksByName",
          "action": "Send a blocks message to a group by name",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages",
              "method": "POST"
            }
          },
          "description": "Send a new blocks message to a team chat group by name"
        },
        {
          "name": "Create Message (Blocks)",
          "value": "createMessageBlocks",
          "action": "Send a blocks message to a group",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/{{$parameter.groupId}}/messages",
              "method": "POST"
            }
          },
          "description": "Send a new blocks message to a team chat group by ID"
        },
        {
          "name": "Create Message (Plain Text, by Name)",
          "value": "createMessagePlainTextByName",
          "action": "Send a plain text message to a group by name",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages",
              "method": "POST"
            }
          },
          "description": "Send a new plain text message to a team chat group by name"
        },
        {
          "name": "Create Message (Plain Text)",
          "value": "createMessagePlainText",
          "action": "Send a plain text message to a group",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/{{$parameter.groupId}}/messages",
              "method": "POST"
            }
          },
          "description": "Send a new plain text message to a team chat group by ID"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a group by ID",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/{{$parameter.groupId}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a team chat group by ID"
        },
        {
          "name": "Get (by Name)",
          "value": "getByName",
          "action": "Get a group by name",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/@{{$parameter.groupName}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a team chat group by name"
        },
        {
          "name": "Get Messages",
          "value": "getMessages",
          "action": "List messages in a group",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/{{$parameter.groupId}}/messages",
              "method": "GET"
            }
          },
          "description": "Retrieve a list of messages in a team chat group by ID"
        },
        {
          "name": "Get Messages (by Name)",
          "value": "getMessagesByName",
          "action": "List messages in a group by name",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages",
              "method": "GET"
            }
          },
          "description": "Retrieve a list of messages in a team chat group by name"
        },
        {
          "name": "Get Messages File",
          "value": "getMessagesFile",
          "action": "Get signed file URL by group ID",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/{{$parameter.groupId}}/messages/file",
              "method": "GET"
            }
          },
          "description": "Get signed file URL using file key and group ID"
        },
        {
          "name": "Get Messages File (by Name)",
          "value": "getMessagesFileByName",
          "action": "Get signed file URL by group name",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages/file",
              "method": "GET"
            }
          },
          "description": "Get signed file URL using file key and group name"
        },
        {
          "name": "Get Sessions",
          "value": "getSessions",
          "action": "List members in a group",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/{{$parameter.groupId}}/sessions",
              "method": "GET"
            }
          },
          "description": "List of members in a team chat group"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List all groups",
          "routing": {
            "request": {
              "url": "/open/v5/groups",
              "method": "GET"
            }
          },
          "description": "List all team chat groups"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a group",
          "routing": {
            "request": {
              "url": "=/open/v5/groups/{{$parameter.groupId}}",
              "method": "PATCH"
            }
          },
          "description": "Update a team chat group"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "teamChat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "open",
      "options": [
        {
          "name": "Assign to Manager",
          "value": "assignToManager",
          "action": "Assign a manager to user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/assign-to/managers/{{$parameter.managerId}}",
              "method": "PATCH"
            }
          },
          "description": "Assign a manager to a user chat"
        },
        {
          "name": "Close",
          "value": "close",
          "action": "Close a user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/close",
              "method": "PATCH"
            }
          },
          "description": "Close the user chat"
        },
        {
          "name": "Create (by User ID)",
          "value": "createByUserId",
          "action": "Create a user chat by user id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}/user-chats",
              "method": "POST"
            }
          },
          "description": "Create a new user chat for a specific user"
        },
        {
          "name": "Create Message",
          "value": "createMessage",
          "action": "Send a message to a chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/messages",
              "method": "POST"
            }
          },
          "description": "Send a new message to a chat"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a user chat"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Retrieve a user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{ String($parameter.userChatId ?? '') }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a user chat"
        },
        {
          "name": "Get Cases",
          "value": "getCases",
          "action": "List user chat cases",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/cases",
              "method": "GET"
            }
          },
          "description": "List user chat cases within a time range"
        },
        {
          "name": "Get Meets Messages",
          "value": "getMeetsMessages",
          "action": "List messages in STT chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/meets/{{$parameter.messageId}}/messages",
              "method": "GET"
            }
          },
          "description": "Retrieve a list of messages in a stt chat"
        },
        {
          "name": "Get Meets Recording",
          "value": "getMeetsRecording",
          "action": "Download call recording",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/meets/{{$parameter.messageId}}/recording",
              "method": "GET"
            }
          },
          "description": "Download a recording of a call meet"
        },
        {
          "name": "Get Messages",
          "value": "getMessages",
          "action": "List messages in chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/messages",
              "method": "GET"
            }
          },
          "description": "Retrieve a list of messages in a chat"
        },
        {
          "name": "Get Messages File",
          "value": "getMessagesFile",
          "action": "Get signed file URL",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/messages/file",
              "method": "GET"
            }
          },
          "description": "Get signed file URL using file key"
        },
        {
          "name": "Get Sessions",
          "value": "getSessions",
          "action": "List members in user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/sessions",
              "method": "GET"
            }
          },
          "description": "List of members in a user chat"
        },
        {
          "name": "Invite",
          "value": "invite",
          "action": "Invite managers to user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/invite?botName={{ encodeURIComponent($parameter.botName || '') }}{{ (() => { const ids = ($parameter.additionalOptions?.managerIds ?? '').toString().split(',').map((id) => id.trim()).filter(Boolean); return ids.length ? '&' + ids.map((id) => 'managerIds=' + encodeURIComponent(id)).join('&') : ''; })() }}",
              "method": "PATCH"
            }
          },
          "description": "Invite managers to a user chat"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List user chats",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats",
              "method": "GET"
            }
          },
          "description": "List of user chats in managed state"
        },
        {
          "name": "List (by User ID)",
          "value": "listByUserId",
          "action": "List user chats by user id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}/user-chats",
              "method": "GET"
            }
          },
          "description": "List user chats for a specific user"
        },
        {
          "name": "Open",
          "value": "open",
          "action": "Open a user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/open",
              "method": "PUT"
            }
          },
          "description": "Open a user chat"
        },
        {
          "name": "Remove",
          "value": "remove",
          "action": "Remove a user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/remove",
              "method": "DELETE"
            }
          },
          "description": "Remove a user chat"
        },
        {
          "name": "Snooze",
          "value": "snooze",
          "action": "Snooze a user chat",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/snooze",
              "method": "PUT"
            }
          },
          "description": "Snooze a user chat"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update user chat description",
          "routing": {
            "request": {
              "url": "=/open/v5/user-chats/{{$parameter.userChatId}}",
              "body": "={{ $parameter.sendBody !== false && $parameter.requestBody ? { description: $parameter.requestBody.description ?? \"\" } : undefined }}",
              "method": "PATCH"
            }
          },
          "description": "Update user chat description"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "userChat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getByUserId",
      "options": [
        {
          "name": "Block",
          "value": "block",
          "action": "Block a user",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}/block",
              "method": "POST"
            }
          },
          "description": "Block a user by user ID"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a user",
          "routing": {
            "request": {
              "url": "/open/v5/users",
              "method": "POST"
            }
          },
          "description": "Create a new lead by profile"
        },
        {
          "name": "Create or Update",
          "value": "upsert",
          "action": "Create or update a user by member id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/@{{$parameter.memberId}}",
              "method": "PUT"
            }
          },
          "description": "Create a new record, or update the current one if it already exists (upsert)"
        },
        {
          "name": "Delete (by Member ID)",
          "value": "deleteByMemberId",
          "action": "Delete a user by member id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/@{{$parameter.memberId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a user by member ID"
        },
        {
          "name": "Delete (by User ID)",
          "value": "deleteByUserId",
          "action": "Delete a user by user id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a user by user ID"
        },
        {
          "name": "Get (by Member ID)",
          "value": "getByMemberId",
          "action": "Get a user by member id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/@{{$parameter.memberId}}",
              "method": "GET"
            }
          },
          "description": "Get a user by member ID"
        },
        {
          "name": "Get (by User ID)",
          "value": "getByUserId",
          "action": "Get a user by user id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}",
              "method": "GET"
            }
          },
          "description": "Get a user by user ID"
        },
        {
          "name": "Issue Session JWT",
          "value": "issueSessionJwt",
          "action": "Issue session jwt",
          "routing": {
            "request": {
              "url": "=/open/v5/users/@{{$parameter.memberId}}/session-jwt/issue",
              "method": "PUT"
            }
          },
          "description": "Issue a session JWT for a member"
        },
        {
          "name": "Issue User Token (by Member ID)",
          "value": "issueUserTokenByMemberId",
          "action": "Issue user token by member id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/@{{$parameter.memberId}}/user-token/issue",
              "method": "PUT"
            }
          },
          "description": "Issue a user token by member ID"
        },
        {
          "name": "Issue User Token (by User ID)",
          "value": "issueUserToken",
          "action": "Issue user token by user id",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}/user-token/issue",
              "method": "PUT"
            }
          },
          "description": "Issue a user token by user ID"
        },
        {
          "name": "Touch",
          "value": "touch",
          "action": "Touch a user",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}/touch",
              "method": "POST"
            }
          },
          "description": "Updates user lastSeenAt, sessionsCount, and daily unique user statistics"
        },
        {
          "name": "Unblock",
          "value": "unblock",
          "action": "Unblock a user",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}/block",
              "method": "DELETE"
            }
          },
          "description": "Unblock a user by user ID"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a user",
          "routing": {
            "request": {
              "url": "=/open/v5/users/{{$parameter.userId}}",
              "method": "PATCH"
            }
          },
          "description": "Update a user by user ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a webhook",
          "routing": {
            "request": {
              "url": "/open/v5/webhooks",
              "method": "POST"
            }
          },
          "description": "Create a new webhook"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a webhook",
          "routing": {
            "request": {
              "url": "=/open/v5/webhooks/{{$parameter.webhookId}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a webhook"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a webhook",
          "routing": {
            "request": {
              "url": "=/open/v5/webhooks/{{$parameter.webhookId}}",
              "method": "GET"
            }
          },
          "description": "Get a webhook by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List all webhooks",
          "routing": {
            "request": {
              "url": "/open/v5/webhooks",
              "method": "GET"
            }
          },
          "description": "List all webhooks in the channel"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a webhook",
          "routing": {
            "request": {
              "url": "=/open/v5/webhooks/{{$parameter.webhookId}}",
              "method": "PATCH"
            }
          },
          "description": "Update a webhook"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create or Update",
      "value": "createOrUpdate",
      "action": "Create or update a bot",
      "routing": {
        "request": {
          "url": "/open/v5/bots",
          "method": "POST"
        }
      },
      "description": "Create a new bot or update an existing one",
      "resource": "bot"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a bot",
      "routing": {
        "request": {
          "url": "=/open/v5/bots/{{$parameter.botId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a bot",
      "resource": "bot"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List all bots",
      "routing": {
        "request": {
          "url": "/open/v5/bots",
          "method": "GET"
        }
      },
      "description": "List all bots in the channel",
      "resource": "bot"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get channel",
      "routing": {
        "request": {
          "url": "/open/v5/channel",
          "method": "GET"
        }
      },
      "description": "Retrieve the channel connected with the given API key credentials",
      "resource": "channel"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a manager",
      "routing": {
        "request": {
          "url": "=/open/v5/managers/{{$parameter.managerId}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a manager by ID",
      "resource": "manager"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List all managers",
      "routing": {
        "request": {
          "url": "/open/v5/managers",
          "method": "GET"
        }
      },
      "description": "List all managers in the channel",
      "resource": "manager"
    },
    {
      "name": "Create Message (Blocks, by Name)",
      "value": "createMessageBlocksByName",
      "action": "Send a blocks message to a group by name",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages",
          "method": "POST"
        }
      },
      "description": "Send a new blocks message to a team chat group by name",
      "resource": "teamChat"
    },
    {
      "name": "Create Message (Blocks)",
      "value": "createMessageBlocks",
      "action": "Send a blocks message to a group",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/{{$parameter.groupId}}/messages",
          "method": "POST"
        }
      },
      "description": "Send a new blocks message to a team chat group by ID",
      "resource": "teamChat"
    },
    {
      "name": "Create Message (Plain Text, by Name)",
      "value": "createMessagePlainTextByName",
      "action": "Send a plain text message to a group by name",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages",
          "method": "POST"
        }
      },
      "description": "Send a new plain text message to a team chat group by name",
      "resource": "teamChat"
    },
    {
      "name": "Create Message (Plain Text)",
      "value": "createMessagePlainText",
      "action": "Send a plain text message to a group",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/{{$parameter.groupId}}/messages",
          "method": "POST"
        }
      },
      "description": "Send a new plain text message to a team chat group by ID",
      "resource": "teamChat"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a group by ID",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/{{$parameter.groupId}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a team chat group by ID",
      "resource": "teamChat"
    },
    {
      "name": "Get (by Name)",
      "value": "getByName",
      "action": "Get a group by name",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/@{{$parameter.groupName}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a team chat group by name",
      "resource": "teamChat"
    },
    {
      "name": "Get Messages",
      "value": "getMessages",
      "action": "List messages in a group",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/{{$parameter.groupId}}/messages",
          "method": "GET"
        }
      },
      "description": "Retrieve a list of messages in a team chat group by ID",
      "resource": "teamChat"
    },
    {
      "name": "Get Messages (by Name)",
      "value": "getMessagesByName",
      "action": "List messages in a group by name",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages",
          "method": "GET"
        }
      },
      "description": "Retrieve a list of messages in a team chat group by name",
      "resource": "teamChat"
    },
    {
      "name": "Get Messages File",
      "value": "getMessagesFile",
      "action": "Get signed file URL by group ID",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/{{$parameter.groupId}}/messages/file",
          "method": "GET"
        }
      },
      "description": "Get signed file URL using file key and group ID",
      "resource": "teamChat"
    },
    {
      "name": "Get Messages File (by Name)",
      "value": "getMessagesFileByName",
      "action": "Get signed file URL by group name",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/@{{$parameter.groupName}}/messages/file",
          "method": "GET"
        }
      },
      "description": "Get signed file URL using file key and group name",
      "resource": "teamChat"
    },
    {
      "name": "Get Sessions",
      "value": "getSessions",
      "action": "List members in a group",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/{{$parameter.groupId}}/sessions",
          "method": "GET"
        }
      },
      "description": "List of members in a team chat group",
      "resource": "teamChat"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List all groups",
      "routing": {
        "request": {
          "url": "/open/v5/groups",
          "method": "GET"
        }
      },
      "description": "List all team chat groups",
      "resource": "teamChat"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a group",
      "routing": {
        "request": {
          "url": "=/open/v5/groups/{{$parameter.groupId}}",
          "method": "PATCH"
        }
      },
      "description": "Update a team chat group",
      "resource": "teamChat"
    },
    {
      "name": "Assign to Manager",
      "value": "assignToManager",
      "action": "Assign a manager to user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/assign-to/managers/{{$parameter.managerId}}",
          "method": "PATCH"
        }
      },
      "description": "Assign a manager to a user chat",
      "resource": "userChat"
    },
    {
      "name": "Close",
      "value": "close",
      "action": "Close a user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/close",
          "method": "PATCH"
        }
      },
      "description": "Close the user chat",
      "resource": "userChat"
    },
    {
      "name": "Create (by User ID)",
      "value": "createByUserId",
      "action": "Create a user chat by user id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}/user-chats",
          "method": "POST"
        }
      },
      "description": "Create a new user chat for a specific user",
      "resource": "userChat"
    },
    {
      "name": "Create Message",
      "value": "createMessage",
      "action": "Send a message to a chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/messages",
          "method": "POST"
        }
      },
      "description": "Send a new message to a chat",
      "resource": "userChat"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a user chat",
      "resource": "userChat"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Retrieve a user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{ String($parameter.userChatId ?? '') }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a user chat",
      "resource": "userChat"
    },
    {
      "name": "Get Cases",
      "value": "getCases",
      "action": "List user chat cases",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/cases",
          "method": "GET"
        }
      },
      "description": "List user chat cases within a time range",
      "resource": "userChat"
    },
    {
      "name": "Get Meets Messages",
      "value": "getMeetsMessages",
      "action": "List messages in STT chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/meets/{{$parameter.messageId}}/messages",
          "method": "GET"
        }
      },
      "description": "Retrieve a list of messages in a stt chat",
      "resource": "userChat"
    },
    {
      "name": "Get Meets Recording",
      "value": "getMeetsRecording",
      "action": "Download call recording",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/meets/{{$parameter.messageId}}/recording",
          "method": "GET"
        }
      },
      "description": "Download a recording of a call meet",
      "resource": "userChat"
    },
    {
      "name": "Get Messages",
      "value": "getMessages",
      "action": "List messages in chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/messages",
          "method": "GET"
        }
      },
      "description": "Retrieve a list of messages in a chat",
      "resource": "userChat"
    },
    {
      "name": "Get Messages File",
      "value": "getMessagesFile",
      "action": "Get signed file URL",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/messages/file",
          "method": "GET"
        }
      },
      "description": "Get signed file URL using file key",
      "resource": "userChat"
    },
    {
      "name": "Get Sessions",
      "value": "getSessions",
      "action": "List members in user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/sessions",
          "method": "GET"
        }
      },
      "description": "List of members in a user chat",
      "resource": "userChat"
    },
    {
      "name": "Invite",
      "value": "invite",
      "action": "Invite managers to user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/invite?botName={{ encodeURIComponent($parameter.botName || '') }}{{ (() => { const ids = ($parameter.additionalOptions?.managerIds ?? '').toString().split(',').map((id) => id.trim()).filter(Boolean); return ids.length ? '&' + ids.map((id) => 'managerIds=' + encodeURIComponent(id)).join('&') : ''; })() }}",
          "method": "PATCH"
        }
      },
      "description": "Invite managers to a user chat",
      "resource": "userChat"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List user chats",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats",
          "method": "GET"
        }
      },
      "description": "List of user chats in managed state",
      "resource": "userChat"
    },
    {
      "name": "List (by User ID)",
      "value": "listByUserId",
      "action": "List user chats by user id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}/user-chats",
          "method": "GET"
        }
      },
      "description": "List user chats for a specific user",
      "resource": "userChat"
    },
    {
      "name": "Open",
      "value": "open",
      "action": "Open a user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/open",
          "method": "PUT"
        }
      },
      "description": "Open a user chat",
      "resource": "userChat"
    },
    {
      "name": "Remove",
      "value": "remove",
      "action": "Remove a user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/remove",
          "method": "DELETE"
        }
      },
      "description": "Remove a user chat",
      "resource": "userChat"
    },
    {
      "name": "Snooze",
      "value": "snooze",
      "action": "Snooze a user chat",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}/snooze",
          "method": "PUT"
        }
      },
      "description": "Snooze a user chat",
      "resource": "userChat"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update user chat description",
      "routing": {
        "request": {
          "url": "=/open/v5/user-chats/{{$parameter.userChatId}}",
          "body": "={{ $parameter.sendBody !== false && $parameter.requestBody ? { description: $parameter.requestBody.description ?? \"\" } : undefined }}",
          "method": "PATCH"
        }
      },
      "description": "Update user chat description",
      "resource": "userChat"
    },
    {
      "name": "Block",
      "value": "block",
      "action": "Block a user",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}/block",
          "method": "POST"
        }
      },
      "description": "Block a user by user ID",
      "resource": "user"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a user",
      "routing": {
        "request": {
          "url": "/open/v5/users",
          "method": "POST"
        }
      },
      "description": "Create a new lead by profile",
      "resource": "user"
    },
    {
      "name": "Create or Update",
      "value": "upsert",
      "action": "Create or update a user by member id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/@{{$parameter.memberId}}",
          "method": "PUT"
        }
      },
      "description": "Create a new record, or update the current one if it already exists (upsert)",
      "resource": "user"
    },
    {
      "name": "Delete (by Member ID)",
      "value": "deleteByMemberId",
      "action": "Delete a user by member id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/@{{$parameter.memberId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a user by member ID",
      "resource": "user"
    },
    {
      "name": "Delete (by User ID)",
      "value": "deleteByUserId",
      "action": "Delete a user by user id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a user by user ID",
      "resource": "user"
    },
    {
      "name": "Get (by Member ID)",
      "value": "getByMemberId",
      "action": "Get a user by member id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/@{{$parameter.memberId}}",
          "method": "GET"
        }
      },
      "description": "Get a user by member ID",
      "resource": "user"
    },
    {
      "name": "Get (by User ID)",
      "value": "getByUserId",
      "action": "Get a user by user id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}",
          "method": "GET"
        }
      },
      "description": "Get a user by user ID",
      "resource": "user"
    },
    {
      "name": "Issue Session JWT",
      "value": "issueSessionJwt",
      "action": "Issue session jwt",
      "routing": {
        "request": {
          "url": "=/open/v5/users/@{{$parameter.memberId}}/session-jwt/issue",
          "method": "PUT"
        }
      },
      "description": "Issue a session JWT for a member",
      "resource": "user"
    },
    {
      "name": "Issue User Token (by Member ID)",
      "value": "issueUserTokenByMemberId",
      "action": "Issue user token by member id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/@{{$parameter.memberId}}/user-token/issue",
          "method": "PUT"
        }
      },
      "description": "Issue a user token by member ID",
      "resource": "user"
    },
    {
      "name": "Issue User Token (by User ID)",
      "value": "issueUserToken",
      "action": "Issue user token by user id",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}/user-token/issue",
          "method": "PUT"
        }
      },
      "description": "Issue a user token by user ID",
      "resource": "user"
    },
    {
      "name": "Touch",
      "value": "touch",
      "action": "Touch a user",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}/touch",
          "method": "POST"
        }
      },
      "description": "Updates user lastSeenAt, sessionsCount, and daily unique user statistics",
      "resource": "user"
    },
    {
      "name": "Unblock",
      "value": "unblock",
      "action": "Unblock a user",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}/block",
          "method": "DELETE"
        }
      },
      "description": "Unblock a user by user ID",
      "resource": "user"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a user",
      "routing": {
        "request": {
          "url": "=/open/v5/users/{{$parameter.userId}}",
          "method": "PATCH"
        }
      },
      "description": "Update a user by user ID",
      "resource": "user"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a webhook",
      "routing": {
        "request": {
          "url": "/open/v5/webhooks",
          "method": "POST"
        }
      },
      "description": "Create a new webhook",
      "resource": "webhook"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a webhook",
      "routing": {
        "request": {
          "url": "=/open/v5/webhooks/{{$parameter.webhookId}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a webhook",
      "resource": "webhook"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a webhook",
      "routing": {
        "request": {
          "url": "=/open/v5/webhooks/{{$parameter.webhookId}}",
          "method": "GET"
        }
      },
      "description": "Get a webhook by ID",
      "resource": "webhook"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List all webhooks",
      "routing": {
        "request": {
          "url": "/open/v5/webhooks",
          "method": "GET"
        }
      },
      "description": "List all webhooks in the channel",
      "resource": "webhook"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a webhook",
      "routing": {
        "request": {
          "url": "=/open/v5/webhooks/{{$parameter.webhookId}}",
          "method": "PATCH"
        }
      },
      "description": "Update a webhook",
      "resource": "webhook"
    }
  ]

npm_readme:
  # n8n-nodes-channel-talk

  This is an n8n community node. It lets you work with Channel Talk in your n8n workflows: send messages and retrieve channel info.

  [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

  - Bot
    - List (GET /open/v5/bots)
    - Create or Update (POST /open/v5/bots)
    - Delete (DELETE /open/v5/bots/{botId})
  - Channel
    - Get: Retrieve the channel connected with your API credentials (GET /open/v5/channel)
  - Manager
    - List (GET /open/v5/managers)
    - Get (GET /open/v5/managers/{managerId})
  - Team Chat
    - List (GET /open/v5/groups)
    - Get (GET /open/v5/groups/{groupId})
    - Get by Name (GET /open/v5/groups/@{groupName})
    - Update (PATCH /open/v5/groups/{groupId})
    - Get Sessions (GET /open/v5/groups/{groupId}/sessions)
    - Get Messages (GET /open/v5/groups/{groupId}/messages)
    - Get Messages by Name (GET /open/v5/groups/@{groupName}/messages)
    - Get Messages File (GET /open/v5/groups/{groupId}/messages/file)
    - Get Messages File by Name (GET /open/v5/groups/@{groupName}/messages/file)
    - Create Message - Plain Text (POST /open/v5/groups/{groupId}/messages)
    - Create Message - Plain Text by Name (POST /open/v5/groups/@{groupName}/messages)
    - Create Message - Blocks (POST /open/v5/groups/{groupId}/messages)
    - Create Message - Blocks by Name (POST /open/v5/groups/@{groupName}/messages)
  - User
    - Get by User ID (GET /open/v5/users/{userId})
    - Get by Member ID (GET /open/v5/users/@{memberId})
    - Create (POST /open/v5/users)
    - Create or Update (PUT /open/v5/users/@{memberId})
    - Update (PATCH /open/v5/users/{userId})
    - Delete by User ID (DELETE /open/v5/users/{userId})
    - Delete by Member ID (DELETE /open/v5/users/@{memberId})
    - Block (POST /open/v5/users/{userId}/block)
    - Unblock (DELETE /open/v5/users/{userId}/block)
    - Issue User Token by User ID (PUT /open/v5/users/{userId}/user-token/issue)
    - Issue User Token by Member ID (PUT /open/v5/users/@{memberId}/user-token/issue)
    - Issue Session JWT (PUT /open/v5/users/@{memberId}/session-jwt/issue)
    - Touch (POST /open/v5/users/{userId}/touch)
  - User Chat
    - List (GET /open/v5/user-chats)
    - Get (GET /open/v5/user-chats/{userChatId})
    - Update (PATCH /open/v5/user-chats/{userChatId})
    - Delete (DELETE /open/v5/user-chats/{userChatId})
    - Open (PUT /open/v5/user-chats/{userChatId}/open)
    - Close (PATCH /open/v5/user-chats/{userChatId}/close)
    - Snooze (PUT /open/v5/user-chats/{userChatId}/snooze)
    - Remove (DELETE /open/v5/user-chats/{userChatId}/remove)
    - Assign to Manager (PATCH /open/v5/user-chats/{userChatId}/assign-to/managers/{managerId})
    - Invite (PATCH /open/v5/user-chats/{userChatId}/invite)
    - Get Cases (GET /open/v5/user-chats/cases)
    - Get Sessions (GET /open/v5/user-chats/{userChatId}/sessions)
    - Get Messages (GET /open/v5/user-chats/{userChatId}/messages)
    - Get Messages File (GET /open/v5/user-chats/{userChatId}/messages/file)
    - Create Message (POST /open/v5/user-chats/{userChatId}/messages)
    - Get Meets Messages (GET /open/v5/user-chats/{userChatId}/meets/{messageId}/messages)
    - Get Meets Recording (GET /open/v5/user-chats/{userChatId}/meets/{messageId}/recording)
  - Webhook
    - List (GET /open/v5/webhooks)
    - Get (GET /open/v5/webhooks/{webhookId})
    - Create (POST /open/v5/webhooks)
    - Update (PATCH /open/v5/webhooks/{webhookId})
    - Delete (DELETE /open/v5/webhooks/{webhookId})

  ## Credentials

  Create Open API credentials in Channel Talk and set the following fields:

  - Access Key
  - Access Secret

  These are sent as `x-access-key` and `x-access-secret` headers in each request.

  Refer to the Channel developers documentation for details:
  https://developers.channel.io/docs/authentication-2

  ## Compatibility

  Compatible with n8n@1.60.0 or later

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Channel Open API docs](https://developers.channel.io/docs)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of Channel Talk operations, allowing users to send messages, manage bots, channels, teams, and users, and retrieve channel information within n8n workflows.","capabilities":["Send plain text and block-based messages to Team Chats","Retrieve and manage Channel Talk bots (list, create, update, delete)","Access and manage Team Chat groups (list, get, update, sessions, messages)","Manage User accounts (create, update, delete, block, unblock, issue tokens)","Handle User Chats (list, open, close, snooze, assign, invite, cases)","Retrieve channel information and connected API credentials","Manage Webhooks (list, create, update, delete)","Access message files and recording data from meetings"],"authentication":"API Key (Access Key and Access Secret sent as x-access-key and x-access-secret headers)","commonUseCases":["Automated customer support responses via Team Chat","Automated user onboarding and account management","Automated bot provisioning and configuration","Automated message retrieval and analysis"],"limitations":["Community node (not official n8n node)","Requires Channel Talk API credentials","Compatible only with n8n 1.60.0 or later"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: @cryptolens/n8n-nodes-devolens.cryptolensDevolens
package_name: @cryptolens/n8n-nodes-devolens
display_name: Cryptolens Devolens
description: Interact with the Cryptolens Devolens API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: artemlos
author_github_url: https://github.com/Cryptolens/n8n-node.git
npm_package_name: @cryptolens/n8n-nodes-devolens
npm_version: 0.2.4
community_fetched_at: 2026-07-14T14:40:33.697Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "key",
      "options": [
        {
          "name": "Key",
          "value": "key"
        },
        {
          "name": "AI",
          "value": "ai"
        },
        {
          "name": "Product",
          "value": "product"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Add Feature",
          "value": "addFeature",
          "action": "Add a feature to a license",
          "routing": {
            "request": {
              "url": "/key/AddFeature",
              "method": "GET"
            }
          },
          "description": "Set a feature flag to true on a key"
        },
        {
          "name": "Block",
          "value": "block",
          "action": "Block a license",
          "routing": {
            "request": {
              "url": "/key/BlockKey",
              "method": "GET"
            }
          },
          "description": "Block an existing Cryptolens key"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a license key",
          "routing": {
            "request": {
              "url": "/key/CreateKey",
              "method": "GET"
            }
          },
          "description": "Create a new Cryptolens key"
        },
        {
          "name": "Extend License",
          "value": "extendLicense",
          "action": "Extend a license",
          "routing": {
            "request": {
              "url": "/key/ExtendLicense",
              "method": "GET"
            }
          },
          "description": "Extend an existing Cryptolens key"
        },
        {
          "name": "Remove Feature",
          "value": "removeFeature",
          "action": "Remove a feature from a license",
          "routing": {
            "request": {
              "url": "/key/RemoveFeature",
              "method": "GET"
            }
          },
          "description": "Set a feature flag to false on a key"
        },
        {
          "name": "Unblock",
          "value": "unblock",
          "action": "Unblock a license",
          "routing": {
            "request": {
              "url": "/key/UnblockKey",
              "method": "GET"
            }
          },
          "description": "Unblock an existing Cryptolens key"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "key"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getWebApiLog",
      "options": [
        {
          "name": "Get Web API Log",
          "value": "getWebApiLog",
          "action": "Get web API log events",
          "routing": {
            "request": {
              "url": "/ai/GetWebAPILog",
              "method": "GET"
            }
          },
          "description": "Get logs of Web API requests"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ai"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getProducts",
      "options": [
        {
          "name": "Get Keys",
          "value": "getKeys",
          "action": "Get keys",
          "routing": {
            "request": {
              "url": "/product/GetKeys",
              "method": "GET"
            }
          },
          "description": "Get license keys for a product"
        },
        {
          "name": "Get Products",
          "value": "getProducts",
          "action": "Get products",
          "routing": {
            "request": {
              "url": "/product/GetProducts",
              "method": "GET"
            }
          },
          "description": "Get all products"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "product"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Add Feature",
      "value": "addFeature",
      "action": "Add a feature to a license",
      "routing": {
        "request": {
          "url": "/key/AddFeature",
          "method": "GET"
        }
      },
      "description": "Set a feature flag to true on a key",
      "resource": "key"
    },
    {
      "name": "Block",
      "value": "block",
      "action": "Block a license",
      "routing": {
        "request": {
          "url": "/key/BlockKey",
          "method": "GET"
        }
      },
      "description": "Block an existing Cryptolens key",
      "resource": "key"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a license key",
      "routing": {
        "request": {
          "url": "/key/CreateKey",
          "method": "GET"
        }
      },
      "description": "Create a new Cryptolens key",
      "resource": "key"
    },
    {
      "name": "Extend License",
      "value": "extendLicense",
      "action": "Extend a license",
      "routing": {
        "request": {
          "url": "/key/ExtendLicense",
          "method": "GET"
        }
      },
      "description": "Extend an existing Cryptolens key",
      "resource": "key"
    },
    {
      "name": "Remove Feature",
      "value": "removeFeature",
      "action": "Remove a feature from a license",
      "routing": {
        "request": {
          "url": "/key/RemoveFeature",
          "method": "GET"
        }
      },
      "description": "Set a feature flag to false on a key",
      "resource": "key"
    },
    {
      "name": "Unblock",
      "value": "unblock",
      "action": "Unblock a license",
      "routing": {
        "request": {
          "url": "/key/UnblockKey",
          "method": "GET"
        }
      },
      "description": "Unblock an existing Cryptolens key",
      "resource": "key"
    },
    {
      "name": "Get Web API Log",
      "value": "getWebApiLog",
      "action": "Get web API log events",
      "routing": {
        "request": {
          "url": "/ai/GetWebAPILog",
          "method": "GET"
        }
      },
      "description": "Get logs of Web API requests",
      "resource": "ai"
    },
    {
      "name": "Get Keys",
      "value": "getKeys",
      "action": "Get keys",
      "routing": {
        "request": {
          "url": "/product/GetKeys",
          "method": "GET"
        }
      },
      "description": "Get license keys for a product",
      "resource": "product"
    },
    {
      "name": "Get Products",
      "value": "getProducts",
      "action": "Get products",
      "routing": {
        "request": {
          "url": "/product/GetProducts",
          "method": "GET"
        }
      },
      "description": "Get all products",
      "resource": "product"
    }
  ]

npm_readme:
  ﻿# @cryptolens/n8n-nodes-devolens

  This is an n8n community node for Cryptolens. It lets you use Cryptolens Web API v3 in your n8n workflows.

  [Cryptolens](https://cryptolens.io/) is a software licensing and entitlement platform.

  [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

  ### Key
  - Create Key (`/key/CreateKey`)
  - Extend License (`/key/ExtendLicense`)
  - Block Key (`/key/BlockKey`)
  - Unblock Key (`/key/UnblockKey`)
  - Add Feature (`/key/AddFeature`)
  - Remove Feature (`/key/RemoveFeature`)

  ### AI
  - Get Web API Log (`/ai/GetWebAPILog`)

  ### Product
  - Get Products (`/product/GetProducts`)
  - Get Keys (`/product/GetKeys`)

  ## Credentials

  Create a Cryptolens Access Token in your Cryptolens account and add it in n8n as the credential type `Cryptolens Devolens API`.

  Credential field:
  - `Access Token` 
  - Source file: [`credentials/CryptolensDevolensApi.credentials.ts`](https://github.com/Cryptolens/n8n-node/blob/main/%40cryptolens/n8n-nodes-devolens/credentials/CryptolensDevolensApi.credentials.ts)

  This node sends the token as:
  - `token` header
  - `token` query parameter

  Base URL used by the node:
  - `https://api.cryptolens.io/api`

  ## Compatibility

  Built with the n8n community node tooling (`@n8n/node-cli`) and Node API version 1.

  Test this node against your target n8n version before production use.

  ## Usage

  1. Add the `Cryptolens Devolens` node to your workflow.
  2. Select a resource (`Key`, `AI`, or `Product`).
  3. Select an operation.
  4. Configure the operation fields.
  5. Execute the node.

  Notes:
  - Most endpoints in this node are `GET` and map fields to query parameters.
  - Some operations include an optional method version parameter `v`.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Cryptolens Web API v3 docs](https://app.cryptolens.io/docs/api/v3/)
  * [Project repository](https://github.com/Cryptolens/n8n-node/tree/main/%40cryptolens/n8n-nodes-devolens)

  ## Version history

  ### 0.1.0
  - Initial public version.

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the Cryptolens Devolens Web API v3 for software licensing and entitlement management within n8n workflows.","capabilities":["Create new license keys","Extend existing license keys","Block license keys","Unblock license keys","Add features to license keys","Remove features from license keys","Retrieve web API logs","Get available products","Get license keys"],"authentication":"API Token (Access Token) required, sent via 'token' header or 'token' query parameter","commonUseCases":["Automating license key generation and management","Managing software entitlements in workflow automation","Monitoring web API usage through logs","Controlling feature access for different products"],"limitations":["Most endpoints are GET requests mapping fields to query parameters","Some operations require an optional method version parameter 'v'","Requires manual token configuration in n8n credentials"],"relatedNodes":["Cryptolens Devolens API","n8n HTTP Request node","n8n Webhook node"]}


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

updated_at: 2026-07-14 14:40:33
author_name: agnitas
author_github_url: https://github.com/agnitas-org/n8n-nodes-openemm.git
npm_package_name: @openemm/n8n-nodes-openemm
npm_version: 0.3.3
community_fetched_at: 2026-07-14T14:40:33.698Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "mailing",
      "options": [
        {
          "name": "Mailing",
          "value": "mailing"
        },
        {
          "name": "Mailing Content",
          "value": "content"
        },
        {
          "name": "Mailing List",
          "value": "mailinglist"
        },
        {
          "name": "Recipient",
          "value": "recipient"
        }
      ],
      "required": true,
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Copy",
          "value": "copy",
          "action": "Copy mailing",
          "description": "Copy mailing"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create mailing",
          "description": "Create mailing"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete mailing",
          "description": "Delete mailing"
        },
        {
          "name": "Get",
          "value": "read",
          "action": "Get mailing",
          "description": "Get mailing"
        },
        {
          "name": "Send",
          "value": "send",
          "action": "Send mailing",
          "description": "Send mailing"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update mailing",
          "description": "Update mailing"
        }
      ],
      "required": true,
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "mailing"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "read",
      "options": [
        {
          "name": "Get",
          "value": "read",
          "action": "Get mailing content",
          "description": "Get mailing content"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update mailing content",
          "description": "Update mailing content"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete mailing content",
          "description": "Delete mailing content"
        }
      ],
      "required": true,
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "content"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create mailing list"
        },
        {
          "name": "Get Recipient Binding",
          "value": "getBinding",
          "action": "Get recipient binding"
        }
      ],
      "required": true,
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "mailinglist"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Get",
          "value": "read",
          "action": "Get recipient",
          "description": "Get recipient"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create recipient",
          "description": "Create recipient"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update recipient",
          "description": "Update profile and binding data of recipient"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete recipient",
          "description": "Delete recipient"
        }
      ],
      "required": true,
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "recipient"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Copy",
      "value": "copy",
      "action": "Copy mailing",
      "description": "Copy mailing",
      "resource": "mailing"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create mailing",
      "description": "Create mailing",
      "resource": "mailing"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete mailing",
      "description": "Delete mailing",
      "resource": "mailing"
    },
    {
      "name": "Get",
      "value": "read",
      "action": "Get mailing",
      "description": "Get mailing",
      "resource": "mailing"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send mailing",
      "description": "Send mailing",
      "resource": "mailing"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update mailing",
      "description": "Update mailing",
      "resource": "mailing"
    },
    {
      "name": "Get",
      "value": "read",
      "action": "Get mailing content",
      "description": "Get mailing content",
      "resource": "content"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update mailing content",
      "description": "Update mailing content",
      "resource": "content"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete mailing content",
      "description": "Delete mailing content",
      "resource": "content"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create mailing list",
      "resource": "mailinglist"
    },
    {
      "name": "Get Recipient Binding",
      "value": "getBinding",
      "action": "Get recipient binding",
      "resource": "mailinglist"
    },
    {
      "name": "Get",
      "value": "read",
      "action": "Get recipient",
      "description": "Get recipient",
      "resource": "recipient"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create recipient",
      "description": "Create recipient",
      "resource": "recipient"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update recipient",
      "description": "Update profile and binding data of recipient",
      "resource": "recipient"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete recipient",
      "description": "Delete recipient",
      "resource": "recipient"
    }
  ]

npm_readme:
  # @openemm/n8n-nodes-openemm

  These are OpenEMM community nodes for n8n. They let you use OpenEMM in your n8n workflows.

  [OpenEMM](https://www.agnitas.de/openemm-wiki/) is a web based enterprise application for email and marketing automation. It is used for automated email communication with customers, leads, members and employees. It can be operated via a web browser or in headless mode via its SOAP or REST API. OpenEMM is published under open source license [APGLv3](https://www.gnu.org/licenses/agpl-3.0.html).

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


  ## Installation

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


  ## Operations

  The OpenEMM community nodes are extended from time to time. You can find the up-to-date functionality of all triggers and actions along with input and output parameters in the [OpenEMM Wiki](https://wiki-iframe.agnitas.de/doku.php?id=integration-apis).


  ## Credentials

  The OpenEMM community nodes use the REST API of OpenEMM for its action nodes and the callback API (webhooks) of OpenEMM for trigger nodes. Create credentials in n8n for the REST API so that an n8n workflow can access your OpenEMM instance. Copy the webhook URLs generated by n8n into the settings of the events in your OpenEMM instance so that OpenEMM can trigger workflows in n8n.


  ## Compatibility

  To be able to use all triggers and actions provided by the OpenEMM community nodes for n8n you have to use at least version 25.11 of OpenEMM.


  ## Usage

  Use the trigger nodes to receive event data from OpenEMM like mail openings, link clicks or profile field changes (via OpenEMM's callback API/webhooks).
  Use the action nodes to send data to OpenEMM like mailing or recipient data or to initiate an action like sending out a mailing (via OpenEMM's REST API).


  ## Resources
  * [OpenEMM integrations documenation](https://wiki-iframe.agnitas.de/doku.php?id=start#integrations)
  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)


  ## History

  0.3.0 update license to MIT
  0.2.0 initial public release

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with OpenEMM, an enterprise email and marketing automation platform, allowing workflows to trigger on events and send actions via API.","capabilities":["Receive event triggers via OpenEMM callback API/webhooks (e.g., mail openings, link clicks, profile changes)","Send data to OpenEMM via REST API (e.g., mailing, recipient data, initiate actions)","Support for both SOAP and REST API interactions with OpenEMM"],"authentication":"API key required (REST API credentials in n8n; webhook URLs configured in OpenEMM)","commonUseCases":["Automated email marketing campaigns","Lead tracking and engagement monitoring","Customer communication automation","Event-driven workflow triggers (opens, clicks, profile updates)"],"limitations":["Requires OpenEMM version 25.11 or higher to use all triggers and actions","Limited to REST API and callback API (webhooks) for integration"],"relatedNodes":["HTTP Request","Webhook","Email"]}


node_type: @openemm/n8n-nodes-openemm.openEmmTrigger
package_name: @openemm/n8n-nodes-openemm
display_name: OpenEMM Trigger
description: Interact with EMM
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: agnitas
author_github_url: https://github.com/agnitas-org/n8n-nodes-openemm.git
npm_package_name: @openemm/n8n-nodes-openemm
npm_version: 0.3.3
community_fetched_at: 2026-07-14T14:40:33.699Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # @openemm/n8n-nodes-openemm

  These are OpenEMM community nodes for n8n. They let you use OpenEMM in your n8n workflows.

  [OpenEMM](https://www.agnitas.de/openemm-wiki/) is a web based enterprise application for email and marketing automation. It is used for automated email communication with customers, leads, members and employees. It can be operated via a web browser or in headless mode via its SOAP or REST API. OpenEMM is published under open source license [APGLv3](https://www.gnu.org/licenses/agpl-3.0.html).

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


  ## Installation

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


  ## Operations

  The OpenEMM community nodes are extended from time to time. You can find the up-to-date functionality of all triggers and actions along with input and output parameters in the [OpenEMM Wiki](https://wiki-iframe.agnitas.de/doku.php?id=integration-apis).


  ## Credentials

  The OpenEMM community nodes use the REST API of OpenEMM for its action nodes and the callback API (webhooks) of OpenEMM for trigger nodes. Create credentials in n8n for the REST API so that an n8n workflow can access your OpenEMM instance. Copy the webhook URLs generated by n8n into the settings of the events in your OpenEMM instance so that OpenEMM can trigger workflows in n8n.


  ## Compatibility

  To be able to use all triggers and actions provided by the OpenEMM community nodes for n8n you have to use at least version 25.11 of OpenEMM.


  ## Usage

  Use the trigger nodes to receive event data from OpenEMM like mail openings, link clicks or profile field changes (via OpenEMM's callback API/webhooks).
  Use the action nodes to send data to OpenEMM like mailing or recipient data or to initiate an action like sending out a mailing (via OpenEMM's REST API).


  ## Resources
  * [OpenEMM integrations documenation](https://wiki-iframe.agnitas.de/doku.php?id=start#integrations)
  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)


  ## History

  0.3.0 update license to MIT
  0.2.0 initial public release

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the OpenEMM enterprise email and marketing automation platform, allowing workflows to trigger on events and send actions via REST API and webhooks.","capabilities":["Receive event triggers via OpenEMM callback API/webhooks (e.g., mail openings, link clicks, profile changes)","Send data to OpenEMM via REST API (e.g., mailing, recipient data)","Initiate actions like sending out mailings","Monitor customer, lead, member, and employee communication events"],"authentication":"API key required (REST API credentials) and webhook URL configuration","commonUseCases":["Automated email marketing campaigns","Tracking email engagement (opens, clicks)","Automated customer communication workflows","Lead management and profile updates"],"limitations":["Requires OpenEMM version 25.11 or higher for full functionality","Requires manual configuration of webhook URLs in OpenEMM settings"],"relatedNodes":["OpenEMM Action","OpenEMM Trigger","n8n HTTP Request","n8n Webhook"]}


node_type: n8n-nodes-surplus-lines-undtec.surplusLinesApi
package_name: n8n-nodes-surplus-lines-undtec
display_name: Surplus Lines API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: edward_ut
author_github_url: https://github.com/undtec/surplus-lines-undtec.git
npm_package_name: n8n-nodes-surplus-lines-undtec
npm_version: 1.2.2
community_fetched_at: 2026-07-14T14:40:33.700Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Calculate surplus lines taxes for all U.S. states. Supports current and historical rates with automatic fallback.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "tax",
      "options": [
        {
          "name": "Tax",
          "value": "tax",
          "description": "Calculate surplus lines taxes"
        },
        {
          "name": "Rate",
          "value": "rate",
          "description": "Get tax rate information"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "calculate",
      "options": [
        {
          "name": "Calculate",
          "value": "calculate",
          "action": "Calculate surplus lines tax",
          "description": "Calculate surplus lines tax for a state and premium (supports historical with automatic fallback)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tax"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getRate",
      "options": [
        {
          "name": "Get Rate",
          "value": "getRate",
          "action": "Get tax rate",
          "description": "Get current or historical tax rate (automatic fallback if historical data unavailable)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "rate"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Calculate",
      "value": "calculate",
      "action": "Calculate surplus lines tax",
      "description": "Calculate surplus lines tax for a state and premium (supports historical with automatic fallback)",
      "resource": "tax"
    },
    {
      "name": "Get Rate",
      "value": "getRate",
      "action": "Get tax rate",
      "description": "Get current or historical tax rate (automatic fallback if historical data unavailable)",
      "resource": "rate"
    }
  ]

npm_readme:
  # n8n-nodes-surplus-lines-undtec

  This is an n8n community node for the [Surplus Lines Tax API](https://surpluslinesapi.com) by [Underwriters Technologies](https://undtec.com).

  Calculate surplus lines taxes for all 50 U.S. states, the District of Columbia, Puerto Rico, and the U.S. Virgin Islands with accurate state-specific rules and rounding.

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

  ## Try It Free

  Want to test surplus lines tax calculations before integrating? Try our **free web-based calculator** at [sltax.undtec.com](https://sltax.undtec.com/) - no signup required!

  ## About

  The Surplus Lines Tax API is a product of [Underwriters Technologies](https://undtec.com), providing insurance technology solutions for the surplus lines industry.

  - **API Service**: [surpluslinesapi.com](https://surpluslinesapi.com)
  - **Free Calculator**: [sltax.undtec.com](https://sltax.undtec.com/)
  - **Company**: [undtec.com](https://undtec.com)

  ## Installation

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

  ### npm

  ```bash
  npm install n8n-nodes-surplus-lines-undtec
  ```

  ### n8n Community Nodes

  1. Go to **Settings > Community Nodes**
  2. Select **Install**
  3. Enter `n8n-nodes-surplus-lines-undtec` and confirm

  ## Credentials

  You need a Surplus Lines API key to use this node:

  1. Create an account at [app.surpluslinesapi.com](https://app.surpluslinesapi.com)
  2. Navigate to the API Keys section in your dashboard
  3. Generate a new API key
  4. In n8n, create new credentials of type "Surplus Lines API" and paste your key

  New accounts include **100 free API calls** to get started.

  ## Operations

  ### Calculate Tax

  Calculate surplus lines tax for a specific state and premium amount.

  **Required Parameters:**
  - **State**: Select from all 50 U.S. states plus DC, Puerto Rico, and Virgin Islands
  - **Premium**: The premium amount in USD

  **Optional Parameters:**
  - **Wet Marine**: For wet marine coverage (affects Alaska)
  - **Fire Insurance**: For fire insurance (affects SD, MT)
  - **Electronic Filing**: For electronic filing (affects MT stamping fee)
  - **Fire Marshal Rate**: 0-1% fire marshal tax (Illinois only)
  - **Medical Malpractice**: For medical malpractice coverage (exempt in PR)
  - **Workers Comp**: For workers comp coverage (exempt in VA)
  - **Year**: Tax year (affects Iowa rates 2024-2027)
  - **New Business**: New/renewal policy flag (affects Oregon $10 fee)

  **Example Response:**

  ```json
  {
    "success": true,
    "state": "Texas",
    "premium": 10000,
    "taxes": {
      "sl_tax": 485.00,
      "tax_rate": 0.0485,
      "stamping_fee": 18.00,
      "stamping_fee_rate": 0.0018
    },
    "total_tax": 503.00,
    "total_due": 10503.00
  }
  ```

  ### Get Rate

  Get the current or historical tax rate for a specific state. Automatically falls back to current rates if historical data is unavailable.

  **Required Parameters:**
  - **State**: Select from all 50 U.S. states plus DC, Puerto Rico, and Virgin Islands

  **Optional Parameters:**
  - **Date**: Date in YYYY-MM-DD format for historical rates. Leave empty for current rates.

  **Example Response (Current Rate):**

  ```json
  {
    "success": true,
    "state": "Texas",
    "query_date": "2026-02-12",
    "rate": {
      "tax_rate": 0.0485,
      "stamping_fee": 0.0018,
      "filing_fee": null,
      "service_fee": null,
      "surcharge": null,
      "regulatory_fee": null,
      "effective_from": "2020-01-01",
      "effective_to": null,
      "legislative_source": "Texas Insurance Code § 225.006",
      "confidence": "high"
    }
  }
  ```

  **Example Response (Historical Rate with Fallback):**

  ```json
  {
    "success": true,
    "state": "Iowa",
    "query_date": "2020-01-01",
    "rate": {
      "tax_rate": 0.01,
      "stamping_fee": 0.002,
      "filing_fee": null,
      "service_fee": null,
      "surcharge": null,
      "regulatory_fee": null,
      "effective_from": "2019-01-01",
      "effective_to": "2023-12-31",
      "legislative_source": "Iowa Code § 515.138",
      "confidence": "high"
    },
    "fallback_used": false,
    "fallback_message": null
  }
  ```

  **Automatic Fallback:**

  If historical data is unavailable for the requested date, the API automatically returns the current rate with a helpful message:

  ```json
  {
    "success": true,
    "state": "Texas",
    "query_date": "2010-01-01",
    "rate": {
      "tax_rate": 0.0485,
      "stamping_fee": 0.0018,
      // ... current rate data
    },
    "fallback_used": true,
    "fallback_message": "Historical data not available for this date. Returning current rate."
  }
  ```

  ### Calculate Historical Tax

  The **Calculate Tax** operation also supports historical calculations. Simply provide an `effective_date` parameter to calculate taxes using rates that were in effect on that date.

  **Example:**
  - State: Texas
  - Premium: 10,000
  - Effective Date: 2020-01-01

  The API will use the tax rates that were in effect on January 1, 2020 for the calculation. If historical data is unavailable, it automatically falls back to current rates with a notification.

  ## Why Use Surplus Lines API?

  - **Accurate**: State-specific rounding rules and current tax rates
  - **Complete**: Covers all 50 states, DC, Puerto Rico, and Virgin Islands
  - **Fast**: Real-time calculations with low latency
  - **Reliable**: Built for production insurance workflows
  - **Affordable**: Pay-as-you-go pricing with 100 free calls to start

  ## Resources

  - [Surplus Lines API Documentation](https://surpluslinesapi.com/docs/)
  - [Free Web Calculator](https://sltax.undtec.com/)
  - [Underwriters Technologies](https://undtec.com)
  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## Support

  For API support, contact [support@undtec.com](mailto:support@undtec.com)

  ## License

  [MIT](LICENSE)

  ---

  **Surplus Lines Tax API** is a product of [Underwriters Technologies](https://undtec.com) - Insurance Technology Solutions

ai_documentation_summary:
  {"purpose":"Calculates surplus lines taxes for U.S. states and territories, supporting current and historical rates with automatic fallback.","capabilities":["Calculate current surplus lines tax for a specific state and premium amount","Retrieve current tax rates for all 50 U.S. states, DC, Puerto Rico, and Virgin Islands","Retrieve historical tax rates for specific dates with automatic fallback to current rates","Calculate historical tax using rates effective on a specific date","Support state-specific parameters (Wet Marine, Fire Insurance, Electronic Filing, Fire Marshal Rate, Medical Malpractice, Workers Comp, New Business)","Handle state-specific rounding rules and tax calculations"],"authentication":"API key required","commonUseCases":["Insurance compliance reporting","Policy premium tax calculation","Historical tax rate analysis","State-specific tax rate lookup"],"limitations":["Historical data may not be available for all dates, requiring fallback to current rates","Limited to U.S. states, DC, Puerto Rico, and Virgin Islands","Requires API key authentication"],"relatedNodes":["n8n-nodes-surplus-lines-undtec.surplusLinesApi"]}


node_type: n8n-nodes-lettr.lettr
package_name: n8n-nodes-lettr
display_name: Lettr
description: Interact with Lettr transactional email APIs
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: tlapi
author_github_url: https://github.com/lettr-com/lettr-n8n.git
npm_package_name: n8n-nodes-lettr
npm_version: 0.5.0
community_fetched_at: 2026-07-14T14:40:33.701Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "email",
      "options": [
        {
          "name": "Email",
          "value": "email"
        },
        {
          "name": "Domain",
          "value": "domain"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Template",
          "value": "template"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        },
        {
          "name": "Campaign",
          "value": "campaign"
        },
        {
          "name": "Audience Contact",
          "value": "audienceContact"
        },
        {
          "name": "Audience List",
          "value": "audienceList"
        },
        {
          "name": "Audience Property",
          "value": "audienceProperty"
        },
        {
          "name": "Audience Segment",
          "value": "audienceSegment"
        },
        {
          "name": "Audience Topic",
          "value": "audienceTopic"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Cancel Scheduled",
          "value": "cancelScheduled",
          "action": "Cancel a scheduled email",
          "description": "Cancel a scheduled email transmission"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an email request",
          "description": "Get an email request by ID"
        },
        {
          "name": "Get Events",
          "value": "getEvents",
          "action": "Get email events",
          "description": "List email events (delivery, bounce, open, click, etc.)"
        },
        {
          "name": "Get Scheduled",
          "value": "getScheduled",
          "action": "Get a scheduled email",
          "description": "Get a scheduled email transmission by ID"
        },
        {
          "name": "Schedule",
          "value": "schedule",
          "action": "Schedule a transactional email",
          "description": "Schedule a transactional email for future delivery"
        },
        {
          "name": "Send",
          "value": "send",
          "action": "Send a transactional email",
          "description": "Send a transactional email"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "email"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a domain",
          "description": "Register a new sending domain"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a domain",
          "description": "Delete a sending domain"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a domain",
          "description": "Get a sending domain by name"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many domains",
          "description": "Get all sending domains"
        },
        {
          "name": "Verify",
          "value": "verify",
          "action": "Verify a domain",
          "description": "Verify a domain's DNS records"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "domain"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a template",
          "description": "Create a new email template"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a template",
          "description": "Delete a template"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a template",
          "description": "Get a template by slug"
        },
        {
          "name": "Get HTML",
          "value": "getHtml",
          "action": "Get template HTML",
          "description": "Get a template's active HTML and merge tags"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many templates",
          "description": "Get all templates"
        },
        {
          "name": "Get Merge Tags",
          "value": "getMergeTags",
          "action": "Get template merge tags",
          "description": "Get the merge tags for a template version"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a template",
          "description": "Update a template's name or content"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a webhook",
          "description": "Create a new webhook"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a webhook",
          "description": "Delete a webhook"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a webhook",
          "description": "Get a webhook by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many webhooks",
          "description": "Get all webhooks"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a webhook",
          "description": "Update an existing webhook"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "contactGetAll",
      "options": [
        {
          "name": "Attach to List",
          "value": "contactAttachList",
          "action": "Attach a contact to a list",
          "description": "Attach a contact to a list"
        },
        {
          "name": "Bulk Attach to Lists",
          "value": "contactBulkAttachLists",
          "action": "Bulk attach contacts to lists",
          "description": "Attach many contacts to many lists"
        },
        {
          "name": "Bulk Detach From Lists",
          "value": "contactBulkDetachLists",
          "action": "Bulk detach contacts from lists",
          "description": "Detach many contacts from many lists"
        },
        {
          "name": "Create",
          "value": "contactCreate",
          "action": "Create an audience contact",
          "description": "Create a contact"
        },
        {
          "name": "Create Many",
          "value": "contactCreateMany",
          "action": "Create many audience contacts",
          "description": "Create many contacts at once"
        },
        {
          "name": "Delete",
          "value": "contactDelete",
          "action": "Delete an audience contact",
          "description": "Delete a contact"
        },
        {
          "name": "Detach From List",
          "value": "contactDetachList",
          "action": "Detach a contact from a list",
          "description": "Detach a contact from a list"
        },
        {
          "name": "Get",
          "value": "contactGet",
          "action": "Get an audience contact",
          "description": "Get a contact by ID"
        },
        {
          "name": "Get Many",
          "value": "contactGetAll",
          "action": "Get many audience contacts",
          "description": "Get many contacts"
        },
        {
          "name": "Subscribe to Topic",
          "value": "contactSubscribeTopic",
          "action": "Subscribe a contact to a topic",
          "description": "Subscribe a contact to a topic"
        },
        {
          "name": "Unsubscribe From Topic",
          "value": "contactUnsubscribeTopic",
          "action": "Unsubscribe a contact from a topic",
          "description": "Unsubscribe a contact from a topic"
        },
        {
          "name": "Update",
          "value": "contactUpdate",
          "action": "Update an audience contact",
          "description": "Update a contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "audienceContact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listGetAll",
      "options": [
        {
          "name": "Create",
          "value": "listCreate",
          "action": "Create an audience list",
          "description": "Create an audience list"
        },
        {
          "name": "Delete",
          "value": "listDelete",
          "action": "Delete an audience list",
          "description": "Delete an audience list"
        },
        {
          "name": "Delete Many",
          "value": "listDeleteMany",
          "action": "Delete many audience lists",
          "description": "Delete many audience lists"
        },
        {
          "name": "Get",
          "value": "listGet",
          "action": "Get an audience list",
          "description": "Get an audience list by ID"
        },
        {
          "name": "Get Many",
          "value": "listGetAll",
          "action": "Get many audience lists",
          "description": "Get many audience lists"
        },
        {
          "name": "Update",
          "value": "listUpdate",
          "action": "Update an audience list",
          "description": "Update an audience list"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "audienceList"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "propertyGetAll",
      "options": [
        {
          "name": "Create",
          "value": "propertyCreate",
          "action": "Create an audience property",
          "description": "Create a property"
        },
        {
          "name": "Delete",
          "value": "propertyDelete",
          "action": "Delete an audience property",
          "description": "Delete a property"
        },
        {
          "name": "Get",
          "value": "propertyGet",
          "action": "Get an audience property",
          "description": "Get a property by ID"
        },
        {
          "name": "Get Many",
          "value": "propertyGetAll",
          "action": "Get many audience properties",
          "description": "Get many properties"
        },
        {
          "name": "Update",
          "value": "propertyUpdate",
          "action": "Update an audience property",
          "description": "Update a property"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "audienceProperty"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "segmentGetAll",
      "options": [
        {
          "name": "Create",
          "value": "segmentCreate",
          "action": "Create an audience segment",
          "description": "Create a segment"
        },
        {
          "name": "Delete",
          "value": "segmentDelete",
          "action": "Delete an audience segment",
          "description": "Delete a segment"
        },
        {
          "name": "Get",
          "value": "segmentGet",
          "action": "Get an audience segment",
          "description": "Get a segment by ID"
        },
        {
          "name": "Get Many",
          "value": "segmentGetAll",
          "action": "Get many audience segments",
          "description": "Get many segments"
        },
        {
          "name": "Update",
          "value": "segmentUpdate",
          "action": "Update an audience segment",
          "description": "Update a segment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "audienceSegment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "topicGetAll",
      "options": [
        {
          "name": "Create",
          "value": "topicCreate",
          "action": "Create an audience topic",
          "description": "Create a topic"
        },
        {
          "name": "Delete",
          "value": "topicDelete",
          "action": "Delete an audience topic",
          "description": "Delete a topic"
        },
        {
          "name": "Get",
          "value": "topicGet",
          "action": "Get an audience topic",
          "description": "Get a topic by ID"
        },
        {
          "name": "Get Many",
          "value": "topicGetAll",
          "action": "Get many audience topics",
          "description": "Get many topics"
        },
        {
          "name": "Update",
          "value": "topicUpdate",
          "action": "Update an audience topic",
          "description": "Update a topic"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "audienceTopic"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many projects",
          "description": "Get all projects"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a campaign",
          "description": "Get a campaign by ID"
        },
        {
          "name": "Get Events",
          "value": "getEvents",
          "action": "Get campaign events",
          "description": "List campaign engagement events (open, click, bounce, etc.)"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many campaigns",
          "description": "Get many campaigns"
        },
        {
          "name": "Schedule",
          "value": "schedule",
          "action": "Schedule a campaign",
          "description": "Schedule a campaign for future delivery"
        },
        {
          "name": "Send",
          "value": "send",
          "action": "Send a campaign",
          "description": "Send a draft campaign immediately"
        },
        {
          "name": "Unschedule",
          "value": "unschedule",
          "action": "Unschedule a campaign",
          "description": "Cancel a scheduled campaign and return it to draft"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "campaign"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Cancel Scheduled",
      "value": "cancelScheduled",
      "action": "Cancel a scheduled email",
      "description": "Cancel a scheduled email transmission",
      "resource": "email"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an email request",
      "description": "Get an email request by ID",
      "resource": "email"
    },
    {
      "name": "Get Events",
      "value": "getEvents",
      "action": "Get email events",
      "description": "List email events (delivery, bounce, open, click, etc.)",
      "resource": "email"
    },
    {
      "name": "Get Scheduled",
      "value": "getScheduled",
      "action": "Get a scheduled email",
      "description": "Get a scheduled email transmission by ID",
      "resource": "email"
    },
    {
      "name": "Schedule",
      "value": "schedule",
      "action": "Schedule a transactional email",
      "description": "Schedule a transactional email for future delivery",
      "resource": "email"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send a transactional email",
      "description": "Send a transactional email",
      "resource": "email"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a domain",
      "description": "Register a new sending domain",
      "resource": "domain"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a domain",
      "description": "Delete a sending domain",
      "resource": "domain"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a domain",
      "description": "Get a sending domain by name",
      "resource": "domain"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many domains",
      "description": "Get all sending domains",
      "resource": "domain"
    },
    {
      "name": "Verify",
      "value": "verify",
      "action": "Verify a domain",
      "description": "Verify a domain's DNS records",
      "resource": "domain"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a template",
      "description": "Create a new email template",
      "resource": "template"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a template",
      "description": "Delete a template",
      "resource": "template"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a template",
      "description": "Get a template by slug",
      "resource": "template"
    },
    {
      "name": "Get HTML",
      "value": "getHtml",
      "action": "Get template HTML",
      "description": "Get a template's active HTML and merge tags",
      "resource": "template"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many templates",
      "description": "Get all templates",
      "resource": "template"
    },
    {
      "name": "Get Merge Tags",
      "value": "getMergeTags",
      "action": "Get template merge tags",
      "description": "Get the merge tags for a template version",
      "resource": "template"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a template",
      "description": "Update a template's name or content",
      "resource": "template"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a webhook",
      "description": "Create a new webhook",
      "resource": "webhook"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a webhook",
      "description": "Delete a webhook",
      "resource": "webhook"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a webhook",
      "description": "Get a webhook by ID",
      "resource": "webhook"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many webhooks",
      "description": "Get all webhooks",
      "resource": "webhook"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a webhook",
      "description": "Update an existing webhook",
      "resource": "webhook"
    },
    {
      "name": "Attach to List",
      "value": "contactAttachList",
      "action": "Attach a contact to a list",
      "description": "Attach a contact to a list",
      "resource": "audienceContact"
    },
    {
      "name": "Bulk Attach to Lists",
      "value": "contactBulkAttachLists",
      "action": "Bulk attach contacts to lists",
      "description": "Attach many contacts to many lists",
      "resource": "audienceContact"
    },
    {
      "name": "Bulk Detach From Lists",
      "value": "contactBulkDetachLists",
      "action": "Bulk detach contacts from lists",
      "description": "Detach many contacts from many lists",
      "resource": "audienceContact"
    },
    {
      "name": "Create",
      "value": "contactCreate",
      "action": "Create an audience contact",
      "description": "Create a contact",
      "resource": "audienceContact"
    },
    {
      "name": "Create Many",
      "value": "contactCreateMany",
      "action": "Create many audience contacts",
      "description": "Create many contacts at once",
      "resource": "audienceContact"
    },
    {
      "name": "Delete",
      "value": "contactDelete",
      "action": "Delete an audience contact",
      "description": "Delete a contact",
      "resource": "audienceContact"
    },
    {
      "name": "Detach From List",
      "value": "contactDetachList",
      "action": "Detach a contact from a list",
      "description": "Detach a contact from a list",
      "resource": "audienceContact"
    },
    {
      "name": "Get",
      "value": "contactGet",
      "action": "Get an audience contact",
      "description": "Get a contact by ID",
      "resource": "audienceContact"
    },
    {
      "name": "Get Many",
      "value": "contactGetAll",
      "action": "Get many audience contacts",
      "description": "Get many contacts",
      "resource": "audienceContact"
    },
    {
      "name": "Subscribe to Topic",
      "value": "contactSubscribeTopic",
      "action": "Subscribe a contact to a topic",
      "description": "Subscribe a contact to a topic",
      "resource": "audienceContact"
    },
    {
      "name": "Unsubscribe From Topic",
      "value": "contactUnsubscribeTopic",
      "action": "Unsubscribe a contact from a topic",
      "description": "Unsubscribe a contact from a topic",
      "resource": "audienceContact"
    },
    {
      "name": "Update",
      "value": "contactUpdate",
      "action": "Update an audience contact",
      "description": "Update a contact",
      "resource": "audienceContact"
    },
    {
      "name": "Create",
      "value": "listCreate",
      "action": "Create an audience list",
      "description": "Create an audience list",
      "resource": "audienceList"
    },
    {
      "name": "Delete",
      "value": "listDelete",
      "action": "Delete an audience list",
      "description": "Delete an audience list",
      "resource": "audienceList"
    },
    {
      "name": "Delete Many",
      "value": "listDeleteMany",
      "action": "Delete many audience lists",
      "description": "Delete many audience lists",
      "resource": "audienceList"
    },
    {
      "name": "Get",
      "value": "listGet",
      "action": "Get an audience list",
      "description": "Get an audience list by ID",
      "resource": "audienceList"
    },
    {
      "name": "Get Many",
      "value": "listGetAll",
      "action": "Get many audience lists",
      "description": "Get many audience lists",
      "resource": "audienceList"
    },
    {
      "name": "Update",
      "value": "listUpdate",
      "action": "Update an audience list",
      "description": "Update an audience list",
      "resource": "audienceList"
    },
    {
      "name": "Create",
      "value": "propertyCreate",
      "action": "Create an audience property",
      "description": "Create a property",
      "resource": "audienceProperty"
    },
    {
      "name": "Delete",
      "value": "propertyDelete",
      "action": "Delete an audience property",
      "description": "Delete a property",
      "resource": "audienceProperty"
    },
    {
      "name": "Get",
      "value": "propertyGet",
      "action": "Get an audience property",
      "description": "Get a property by ID",
      "resource": "audienceProperty"
    },
    {
      "name": "Get Many",
      "value": "propertyGetAll",
      "action": "Get many audience properties",
      "description": "Get many properties",
      "resource": "audienceProperty"
    },
    {
      "name": "Update",
      "value": "propertyUpdate",
      "action": "Update an audience property",
      "description": "Update a property",
      "resource": "audienceProperty"
    },
    {
      "name": "Create",
      "value": "segmentCreate",
      "action": "Create an audience segment",
      "description": "Create a segment",
      "resource": "audienceSegment"
    },
    {
      "name": "Delete",
      "value": "segmentDelete",
      "action": "Delete an audience segment",
      "description": "Delete a segment",
      "resource": "audienceSegment"
    },
    {
      "name": "Get",
      "value": "segmentGet",
      "action": "Get an audience segment",
      "description": "Get a segment by ID",
      "resource": "audienceSegment"
    },
    {
      "name": "Get Many",
      "value": "segmentGetAll",
      "action": "Get many audience segments",
      "description": "Get many segments",
      "resource": "audienceSegment"
    },
    {
      "name": "Update",
      "value": "segmentUpdate",
      "action": "Update an audience segment",
      "description": "Update a segment",
      "resource": "audienceSegment"
    },
    {
      "name": "Create",
      "value": "topicCreate",
      "action": "Create an audience topic",
      "description": "Create a topic",
      "resource": "audienceTopic"
    },
    {
      "name": "Delete",
      "value": "topicDelete",
      "action": "Delete an audience topic",
      "description": "Delete a topic",
      "resource": "audienceTopic"
    },
    {
      "name": "Get",
      "value": "topicGet",
      "action": "Get an audience topic",
      "description": "Get a topic by ID",
      "resource": "audienceTopic"
    },
    {
      "name": "Get Many",
      "value": "topicGetAll",
      "action": "Get many audience topics",
      "description": "Get many topics",
      "resource": "audienceTopic"
    },
    {
      "name": "Update",
      "value": "topicUpdate",
      "action": "Update an audience topic",
      "description": "Update a topic",
      "resource": "audienceTopic"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many projects",
      "description": "Get all projects",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a campaign",
      "description": "Get a campaign by ID",
      "resource": "campaign"
    },
    {
      "name": "Get Events",
      "value": "getEvents",
      "action": "Get campaign events",
      "description": "List campaign engagement events (open, click, bounce, etc.)",
      "resource": "campaign"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many campaigns",
      "description": "Get many campaigns",
      "resource": "campaign"
    },
    {
      "name": "Schedule",
      "value": "schedule",
      "action": "Schedule a campaign",
      "description": "Schedule a campaign for future delivery",
      "resource": "campaign"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send a campaign",
      "description": "Send a draft campaign immediately",
      "resource": "campaign"
    },
    {
      "name": "Unschedule",
      "value": "unschedule",
      "action": "Unschedule a campaign",
      "description": "Cancel a scheduled campaign and return it to draft",
      "resource": "campaign"
    }
  ]

npm_readme:
  # n8n-nodes-lettr

  This package provides a verified-style n8n community node for [Lettr](https://docs.lettr.com).

  ## Logo

  - Source logo file (edit this): `assets/logo.svg`
  - n8n node icon file (auto-generated from source on build): `nodes/Lettr/lettr.svg`

  To apply your custom SVG logo:

  ```bash
  npm run sync:logo
  npm run build
  ```

  ## Supported resources and operations

  - **Email**
    - Send
    - Get
  - **Domain**
    - Get Many
  - **Template**
    - Get Many
  - **Webhook**
    - Get Many
  - **Campaign**
    - Get Many, Get, Get Events, Send, Schedule, Unschedule
  - **Audience Contact**
    - Get Many, Get, Create, Create Many, Update, Delete, Attach/Detach List, Bulk Attach/Detach Lists, Subscribe/Unsubscribe Topic
  - **Audience List**
    - Get Many, Get, Create, Update, Delete, Delete Many
  - **Audience Topic**
    - Get Many, Get, Create, Update, Delete
  - **Audience Property**
    - Get Many, Get, Create, Update, Delete
  - **Audience Segment**
    - Get Many, Get, Create, Update, Delete

  ## Credentials

  Use a Lettr API key from your Lettr account.

  - Credential type: `Lettr API`
  - Auth header: `Authorization: Bearer <api_key>`

  ## Build

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

  ## Local n8n install

  ```bash
  npm install /absolute/path/to/n8n-nodes-lettr
  ```

  Then restart n8n.

  ## Notes for community verification

  - Uses official Lettr REST endpoints at `https://app.lettr.com/api`
  - Includes credential test call (`GET /domains`)
  - Includes pagination controls for list operations
  - Runtime has no third-party dependencies

  ## API references used

  - [Lettr API introduction](https://docs.lettr.com/api-reference/introduction)
  - [Send email](https://docs.lettr.com/api-reference/emails/send-email)
  - [Get email request](https://docs.lettr.com/api-reference/emails/get-email-request-details)
  - [List domains](https://docs.lettr.com/api-reference/domains/get-sending-domains)
  - [List templates](https://docs.lettr.com/api-reference/templates/get-all-email-templates)
  - [List webhooks](https://docs.lettr.com/api-reference/webhooks/get-all-webhooks)
  - [Audience API](https://docs.lettr.com/api-reference/introduction)

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with Lettr's transactional email APIs to manage email sending, domains, templates, and webhooks.","capabilities":["Send transactional emails","Retrieve email request details","List sending domains","List email templates","List webhooks","Supports pagination for list operations","Includes credential test functionality"],"authentication":"API key required (Bearer token in Authorization header)","commonUseCases":["Automated transactional email workflows","Email template management","Domain verification and management","Webhook configuration for email events"],"limitations":["Community node (unofficial)","No third-party runtime dependencies"],"relatedNodes":["n8n-nodes-core.httpRequest","n8n-nodes-core.code"]}


node_type: n8n-nodes-umich-tdx.umichTdx
package_name: n8n-nodes-umich-tdx
display_name: UMich TDX
description: Connect to UMich TDX
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: cpuzzuol
author_github_url: https://github.com/umich-its-ai/
npm_package_name: n8n-nodes-umich-tdx
npm_version: 1.1.6
community_fetched_at: 2026-07-14T14:40:33.702Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "ticketSearch",
      "options": [
        {
          "name": "Ticket Search",
          "value": "ticketSearch"
        },
        {
          "name": "Ticket Creation",
          "value": "ticketCreation"
        },
        {
          "name": "Ticket Modification",
          "value": "ticketModification"
        },
        {
          "name": "User Lookup",
          "value": "userLookup"
        },
        {
          "name": "Report Search",
          "value": "reportSearch"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTicketById",
      "options": [
        {
          "name": "Get Ticket by ID",
          "value": "getTicketById",
          "action": "Get a single TDX ticket",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "method": "GET"
            }
          },
          "description": "Get a single TDX ticket by ID"
        },
        {
          "name": "Search Tickets",
          "value": "searchTickets",
          "action": "Search for TDX tickets",
          "routing": {
            "send": {
              "preSend": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "request": {
              "method": "POST"
            }
          },
          "description": "Search for TDX tickets"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ticketSearch"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createTicket",
      "options": [
        {
          "name": "Create Ticket",
          "value": "createTicket",
          "action": "Create a new TDX ticket",
          "routing": {
            "send": {
              "preSend": [
                null,
                null
              ]
            },
            "request": {
              "method": "POST"
            }
          },
          "description": "Create a new TDX ticket"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ticketCreation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "addCommentToTicket",
      "options": [
        {
          "name": "Add Comment to Ticket",
          "value": "addCommentToTicket",
          "action": "Add a comment to a TDX ticket",
          "routing": {
            "send": {
              "preSend": [
                null,
                null
              ]
            },
            "request": {
              "method": "POST"
            }
          },
          "description": "Add a comment to a TDX ticket"
        },
        {
          "name": "Add Ticket Contact",
          "value": "addTicketContact",
          "action": "Add a contact to a TDX ticket",
          "routing": {
            "send": {
              "preSend": [
                null,
                null
              ]
            },
            "request": {
              "method": "POST"
            }
          },
          "description": "Add a contact to a TDX ticket"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ticketModification"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "findUidByUniqname",
      "options": [
        {
          "name": "Find UID by Uniqname",
          "value": "findUidByUniqname",
          "action": "Find TDX UID by Uniqname",
          "routing": {
            "send": {
              "preSend": [
                null,
                null
              ]
            },
            "request": {
              "url": "=people/search",
              "method": "GET"
            }
          },
          "description": "Find a user's internal TDX UID by their U-M Uniqname"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "userLookup"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getReportById",
      "options": [
        {
          "name": "Get Report by ID",
          "value": "getReportById",
          "action": "Get a single TDX report",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "method": "GET"
            }
          },
          "description": "Get a single TDX report by ID"
        },
        {
          "name": "Search Reports",
          "value": "searchReports",
          "action": "Search for TDX reports",
          "routing": {
            "send": {
              "preSend": [
                null,
                null,
                null
              ]
            },
            "request": {
              "method": "POST"
            }
          },
          "description": "Search for TDX reports"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reportSearch"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Ticket by ID",
      "value": "getTicketById",
      "action": "Get a single TDX ticket",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "method": "GET"
        }
      },
      "description": "Get a single TDX ticket by ID",
      "resource": "ticketSearch"
    },
    {
      "name": "Search Tickets",
      "value": "searchTickets",
      "action": "Search for TDX tickets",
      "routing": {
        "send": {
          "preSend": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null
          ]
        },
        "request": {
          "method": "POST"
        }
      },
      "description": "Search for TDX tickets",
      "resource": "ticketSearch"
    },
    {
      "name": "Create Ticket",
      "value": "createTicket",
      "action": "Create a new TDX ticket",
      "routing": {
        "send": {
          "preSend": [
            null,
            null
          ]
        },
        "request": {
          "method": "POST"
        }
      },
      "description": "Create a new TDX ticket",
      "resource": "ticketCreation"
    },
    {
      "name": "Add Comment to Ticket",
      "value": "addCommentToTicket",
      "action": "Add a comment to a TDX ticket",
      "routing": {
        "send": {
          "preSend": [
            null,
            null
          ]
        },
        "request": {
          "method": "POST"
        }
      },
      "description": "Add a comment to a TDX ticket",
      "resource": "ticketModification"
    },
    {
      "name": "Add Ticket Contact",
      "value": "addTicketContact",
      "action": "Add a contact to a TDX ticket",
      "routing": {
        "send": {
          "preSend": [
            null,
            null
          ]
        },
        "request": {
          "method": "POST"
        }
      },
      "description": "Add a contact to a TDX ticket",
      "resource": "ticketModification"
    },
    {
      "name": "Find UID by Uniqname",
      "value": "findUidByUniqname",
      "action": "Find TDX UID by Uniqname",
      "routing": {
        "send": {
          "preSend": [
            null,
            null
          ]
        },
        "request": {
          "url": "=people/search",
          "method": "GET"
        }
      },
      "description": "Find a user's internal TDX UID by their U-M Uniqname",
      "resource": "userLookup"
    },
    {
      "name": "Get Report by ID",
      "value": "getReportById",
      "action": "Get a single TDX report",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "method": "GET"
        }
      },
      "description": "Get a single TDX report by ID",
      "resource": "reportSearch"
    },
    {
      "name": "Search Reports",
      "value": "searchReports",
      "action": "Search for TDX reports",
      "routing": {
        "send": {
          "preSend": [
            null,
            null,
            null
          ]
        },
        "request": {
          "method": "POST"
        }
      },
      "description": "Search for TDX reports",
      "resource": "reportSearch"
    }
  ]

npm_readme:
  # n8n-nodes-umich-tdx

  This is an n8n community node that provides integration with the University of Michigan (UMich) TeamDynamix (TDX) API. It enables you to interact with UMich TDX services directly from your n8n workflows, including ticket creation, modification, single-ticket and multi-ticket search, report lookup, user lookup, and ticket attachment download operations.

  The UMich TDX API is a service that allows programmatic access to TeamDynamix ticket management functionality for University of Michigan systems.

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

  ## Table of Contents

  [Installation](#installation)  
  [Credentials](#credentials)  
  [Resources and Operations](#resources-and-operations)  
  [Validation and Security](#validation-and-security)  
  [Test vs Production Environment](#test-vs-production-environment)  
  [Usage Examples](#usage-examples)  
  [Compatibility](#compatibility)  
  [Resources](#resources)  

  ## Installation

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

  In summary:
  1. Install the package in your n8n instance
  2. Restart n8n
  3. The "UMich TDX" node will be available in the node palette

  ## Credentials

  To use this node, you need to set up OAuth2 credentials with the U-M API Directory.

  ### Prerequisites

  1. **U-M API Directory Account**: You need access to the [U-M API Directory](https://dir.api.it.umich.edu/) or alternatively the [U-M Test API Directory](https://dir-test.api.it.umich.edu).
  2. **API Application**: Create an application in the U-M API Directory with the `tdxticket` scope
  3. **API Key and Secret**: Obtain your API Key (Client ID) and API Secret (Client Secret) from your application

  ### Setting Up Credentials

  1. In n8n, add a new credential of type "UMich TDX OAuth2 API"
  2. Configure the following fields:
     - **Environment**: Choose either "Test" or "Production" (see [Test vs Production Environment](#test-vs-production-environment) below)
     - **App ID**: Your TeamDynamix App ID (numeric value)
     - **API Key**: The "Key" value from your app in the U-M API Directory
     - **API Secret**: The "Secret" value from your app in the U-M API Directory
  3. Click "Connect my account" to authenticate
  4. The credentials will automatically handle OAuth2 token management

  ### Credential Fields

  | Field | Description | Required |
  |-------|-------------|----------|
  | Environment | Choose between Test or Production environment | Yes |
  | App ID | Your TeamDynamix App ID (numeric) | Yes |
  | API Key | Client ID from U-M API Directory | Yes |
  | API Secret | Client Secret from U-M API Directory | Yes |

  ## Resources and Operations

  The UMich TDX node supports six main resources, each with specific operations:

  ### 1. Ticket Search

  Search and retrieve ticket information from TDX.

  #### Operations

  - **Get Ticket by ID**: Retrieve a single TDX ticket by its ID
    - **Parameters**:
      - `Ticket ID` (required): The numeric ID of the ticket to retrieve

  - **Search Tickets**: Search for multiple tickets matching criteria (POST to the ticket search API)
    - **Parameters**:
      - `Search Text` (optional): Free-text search across ticket fields
      - `Max Results` (optional): Maximum number of tickets to return (numeric, default: `3`)
    - **Additional Parameters** (optional collection — combine filters as needed):
      - `Ticket ID`: Filter to a specific ticket ID
      - `Parent Ticket ID`: Filter by parent ticket ID
      - `Requestor Name Search`: Search requestors by name
      - `Requestor Email Search`: Search requestors by email (must be `@umich.edu`)
      - `Status IDs`: Comma-separated status IDs (e.g. `1,2,3`)
      - `Service IDs`: Comma-separated service IDs
      - `Location IDs`: Comma-separated location IDs
      - `Account IDs`: Comma-separated account IDs
      - `Requestor UIDs`: Comma-separated requestor UIDs
      - `Responsibility UIDs`: Comma-separated responsibility UIDs
      - `Responsibility Group IDs`: Comma-separated responsibility group IDs
      - `Created Date From` / `Created Date To`: Created date range (date/time fields)
      - `Updated Date From` / `Updated Date To`: Updated date range (date/time fields)
      - `Ticket Classification`: Filter by ticket classification

    Returns multiple tickets in the API response (up to `Max Results`). Use this operation when you need to find tickets by status, service, requestor, dates, or text rather than a known ticket ID.

  ### 2. Ticket Creation

  Create new tickets in TDX.

  #### Operations

  - **Create Ticket**: Create a new TDX ticket
    - **Required Parameters**:
      - `Title`: The title of the ticket (max 500 characters)
      - `Body`: The description/body of the ticket (max 2000 characters)
      - `Requestor`: Email address of the requestor (must be a valid `@umich.edu` email)
      - `Service ID`: The service ID that the ticket is related to (numeric)
      - `Type ID`: An internal classification of the ticket (numeric). Available from the instance admin.
    - **Optional Parameters**:
      - `Responsible Group ID`: The responsible group ID to assign the ticket to (numeric)
    - **Additional Fields** (optional):
      - `Apply Defaults`: Whether to apply default values for unspecified properties (default: `true`)
      - `Enable Notify Reviewer`: Whether reviewer notifications should be enabled (default: `false`)
      - `Notify Requestor`: Whether the requestor should be notified on ticket creation (default: `false`)
      - `Notify Responsible`: Whether responsible resources should be notified (default: `false`)
      - `Allow Requestor Creation`: Whether to create a requestor if not found (default: `true`)
      - `Prefer Requestor Account and Priority`: Use requestor's default account/priority (default: `false`)
    - **Hidden Parameters** (automatically set):
      - `Source ID`: Set to `8` (Systems) by default
      - `Status ID`: Set to `0` by default

  ### 3. Ticket Modification

  Modify existing tickets in TDX.

  #### Operations

  - **Add Comment to Ticket**: Add a comment to an existing TDX ticket
    - **Parameters**:
      - `Ticket ID` (required): The ID of the ticket to modify (numeric)
      - `New Comment` (required): The comment text to add (max 2000 characters)

  - **Add Ticket Contact**: Add a contact (user) to a TDX ticket
    - **Parameters**:
      - `Ticket ID` (required): The ID of the ticket to modify (numeric)
      - `TDX User UID` (required): The internal TDX UID of the user to assign (alphanumeric)

  ### 4. User Lookup

  Look up user information in TDX.

  #### Operations

  - **Find UID by Uniqname**: Find a user's internal TDX UID by their U-M Uniqname
    - **Parameters**:
      - `U-M Uniqname` (required): The uniqname to search for (3-8 lowercase letters only)

  ### 5. Report Search

  Search and retrieve TDX reports (saved searches / reporting definitions).

  #### Operations

  - **Get Report by ID**: Retrieve a single report by ID
    - **Parameters**:
      - `Report ID` (required): The numeric ID of the report
    - **Note**: The report’s visibility settings must include the **APIReportingAccess** group for it to be accessible via this API.

  - **Search Reports**: Search for multiple reports matching criteria
    - **Parameters**:
      - `Search Text` (optional): Free-text search across report names/descriptions
    - **Additional Parameters** (optional collection):
      - `Owner UID`: Filter reports by owner’s TDX UID (alphanumeric)
      - `Report Source ID`: Filter by report source ID (numeric)
    - `App ID` is taken automatically from your credentials (`forAppId` in the request body).

    Returns multiple reports in the API response. Use **Get Report by ID** when you already know the report ID; use **Search Reports** to discover reports by name or owner.

  ### 6. Attachments

  Download ticket attachment file content from TDX as n8n binary data.

  #### Operations

  - **Get Attachment Content by ID**: Download the raw content of a TDX attachment
    - **Parameters**:
      - `Attachment ID` (required): The UUID of the attachment (from a ticket’s `Attachments` array)
    - **Output**:
      - **Binary**: File content on the `data` binary property
      - **JSON**: Pass-through fields from upstream nodes (e.g. `attachmentId`, `fileName`, `ticketId`) plus resolved `fileName` and `mimeType`
    - **API endpoint**: `GET attachments/{id}/content`
    - **Notes**:
      - Responses are fetched as raw bytes (`arraybuffer`), not JSON
      - Pass `fileName` from a prior node (e.g. Code node splitting ticket attachments) so Google Drive and other downstream nodes get the correct filename
      - Allowed file extensions: `pdf`, `jpg`, `jpeg`, `png`, `gif`, `webp`, `doc`, `docx`, `xls`, `xlsx`, `ppt`, `pptx`, `txt`, `csv`, `tsv`, `json`, `xml`, `html`, `css`, `js`
      - Maximum file size: 20 MB

  ## Validation and Security

  The node includes comprehensive validation measures to ensure data integrity and security:

  ### Input Validation

  1. **Email Validation**:
     - Must be a valid email format
     - **Must be a `@umich.edu` email address** (enforced)
     - Used for: Requestor Email (ticket creation) and Requestor Email Search (ticket search)

  2. **Uniqname Validation**:
     - Must be 3-8 characters long
     - Must contain only lowercase letters
     - Used for: User Lookup operations

  3. **UID Validation**:
     - Must be alphanumeric (letters, numbers, dots, hyphens, underscores)
     - Prevents path traversal attacks
     - Used for: TDX User UID (contacts, report owners), and UID fields in ticket search filters

  4. **Numeric ID Validation**:
     - Must be numeric only
     - Used for: Service ID, Responsible Group ID, Status ID, Source ID, Ticket ID, Report ID, Report Source ID, Type ID

  5. **Comma-Separated ID Lists**:
     - Used in **Search Tickets** additional parameters (`Status IDs`, `Service IDs`, `Location IDs`, etc.)
     - Each value must be numeric; lists are parsed and sent to the API as arrays

  6. **Text Length Validation**:
     - **Title**: Maximum 500 characters
     - **Description/Body**: Maximum 2000 characters
     - **Comments**: Maximum 2000 characters
     - Prevents DoS attacks from excessively large payloads

  7. **Source ID Validation**:
     - Only allows specific source IDs
     - Currently only allows `8` (Systems) for ticket creation
     - Can be expanded in the future

  8. **Attachment Validation**:
     - **Attachment ID**: UUID string (validated as a safe URL path segment)
     - **File extension allowlist**: Only common document, image, and text types are accepted; other extensions are rejected after download
     - **File size limit**: Maximum 20 MB per attachment
     - **Binary handling**: Downloads use `arraybuffer` encoding and a custom post-receive hook so PDFs, images, and Office files are not corrupted by JSON/text parsing

  ### Security Features

  - **Path Traversal Protection**: URL path segments are validated to prevent directory traversal attacks (`../`, query strings, etc.)
  - **OAuth2 Authentication**: All requests use secure OAuth2 bearer token authentication
  - **Input Sanitization**: All user inputs are validated before being sent to the API
  - **Environment Isolation**: Test and production environments are completely separate

  ## Test vs Production Environment

  The node supports both Test and Production environments. The environment is selected when configuring credentials.

  ### Test Environment

  - **Base URL**: `https://gw-test.api.it.umich.edu/um/it`
  - **Token URL**: `https://gw-test.api.it.umich.edu/um/oauth2/token`
  - **Use Case**: Development, testing, and experimentation
  - **Data**: Separate from production data

  ### Production Environment

  - **Base URL**: `https://gw.api.it.umich.edu/um/it`
  - **Token URL**: `https://gw.api.it.umich.edu/um/oauth2/token`
  - **Use Case**: Live production workflows
  - **Data**: Real production TDX data

  ### Switching Environments

  To switch between environments:
  1. Create separate credentials for Test and Production
  2. Or update your existing credentials and change the "Environment" field
  3. The node will automatically use the correct API endpoints based on your credential configuration

  **Important**: Always test your workflows in the Test environment before using Production credentials.

  ## Usage Examples

  ### Example 1: Create a Ticket

  1. Add a "UMich TDX" node to your workflow
  2. Select Resource: "Ticket Creation"
  3. Select Operation: "Create Ticket"
  4. Fill in:
     - Title: "Example Ticket"
     - Body: "This is an example ticket created via n8n"
     - Requestor: "user@umich.edu"
     - Service ID: "31"
     - Type ID: "421"
     - Responsible Group ID: "944" (optional)
  5. Configure additional fields as needed
  6. Execute the workflow

  ### Example 2: Look Up User and Add to Ticket

  1. First node: "User Lookup" → "Find UID by Uniqname"
     - Enter uniqname: "jdoe"
  2. Second node: "Ticket Modification" → "Add Ticket Contact"
     - Ticket ID: "12345"
     - TDX User UID: Use the UID from the first node's output

  ### Example 3: Get Ticket and Add Comment

  1. First node: "Ticket Search" → "Get Ticket by ID"
     - Ticket ID: "12345"
  2. Second node: "Ticket Modification" → "Add Comment to Ticket"
     - Ticket ID: "12345"
     - New Comment: "Status update from automated workflow"

  ### Example 4: Search Multiple Tickets

  1. Add a "UMich TDX" node
  2. Select Resource: "Ticket Search"
  3. Select Operation: "Search Tickets"
  4. Set:
     - Search Text: `"network outage"` (optional)
     - Max Results: `10`
  5. Under **Additional Parameters**, add filters as needed, for example:
     - Status IDs: `1,2`
     - Service IDs: `31`
     - Requestor Email Search: `user@umich.edu`
  6. Execute the workflow — the output contains multiple matching tickets for downstream nodes (Split Out, loops, etc.)

  ### Example 5: Find a Report and Run It

  1. First node: "Report Search" → "Search Reports"
     - Search Text: `"open tickets"`
     - Additional Parameters → Owner UID: (optional, from a prior User Lookup node)
  2. Use the report ID from the search results in a follow-on workflow step, or call **Get Report by ID** with a known ID to retrieve full report metadata.

  ### Example 6: Download Ticket Attachments to Google Drive

  1. **Ticket Search** → "Get Ticket by ID"
     - Ticket ID: `10374337`
  2. **Code** node — one output item per attachment:

  ```javascript
  return $input.all().flatMap(item => {
    const ticket = item.json;
    return (ticket.Attachments ?? []).map(attachment => ({
      json: {
        ticketId: ticket.ID,
        attachmentId: attachment.ID,
        fileName: attachment.Name,
      },
    }));
  });
  ```

  3. **UMich TDX** → Resource: "Attachments", Operation: "Get Attachment Content by ID"
     - Attachment ID: `{{ $json.attachmentId }}`
  4. **Google Drive** → Upload file
     - Binary Property: `data`
     - File Name: `{{ $json.fileName }}`

  Each attachment runs as its own item. Binary data is stored in n8n’s binary layer (memory or configured storage) until the Drive node uploads it.

  ## Compatibility

  - **Minimum n8n version**: Compatible with n8n workflow API version 1
  - **Node.js**: Compatible with Node.js versions supported by n8n
  - **TypeScript**: Built with TypeScript 5.9.2

  ## Resources

  ### Documentation

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [U-M API Directory - TDX Ticket API Documentation](https://dir.api.it.umich.edu/docs/tdxticket/1/overview)
  - [TeamDynamix API Documentation](https://solutions.teamdynamix.com/TDWebApi/Home/type/TeamDynamix.Api.Tickets.Ticket)
  - [U-M API Directory](https://dir.api.it.umich.edu/)

  ### Finding IDs

  - **Service ID**: Found in the JSON response when retrieving a ticket via "Ticket Search" (single or search results)
  - **Status ID**: Found in ticket search/get responses; use comma-separated values for multi-ticket search filters
  - **Responsible Group ID**: In TDX, go to the create ticket form, search for groups in the Responsible field, click "View" under the profile, and find the "Group ID" in the upper-left portion of the page
  - **Type ID**: Reach out to your TDX administrator to get the list of type IDs.
  - **TDX User UID**: Found in the JSON response when using "User Lookup" → "Find UID by Uniqname"; also used as **Owner UID** in report search
  - **Report ID**: From **Search Reports** results, or from the TDX reporting UI (report must grant **APIReportingAccess** visibility)
  - **Attachment ID**: UUID on each object in a ticket’s `Attachments` array (from **Get Ticket by ID** or **Search Tickets**). Use `ContentUri` or `ID` — the node expects the UUID only (e.g. `6a24453b-0775-45f5-90a3-096ea8982098`)

  ### Support

  For issues, questions, or contributions, please refer to the repository:
  - **Repository**: [n8n-nodes-umich-tdx](https://github.com/umich-its-ai/n8n-nodes-umich-tdx)
  - **Author**: Chris Puzzuoli (cpuzzuol@umich.edu)

  ---

  **Note**: This node is designed specifically for University of Michigan TeamDynamix integration. All email addresses must be `@umich.edu` addresses, and you must have appropriate access to the U-M API Directory to use this node.

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with the University of Michigan TeamDynamix (TDX) API to manage ticket operations including creation, modification, search, and user lookup.","capabilities":["Create TDX tickets with customizable parameters","Modify existing tickets by adding comments","Modify existing tickets by adding contacts","Search and retrieve tickets by ID","Lookup user UIDs by U-M Uniqname","OAuth2 authentication with U-M API Directory","Support for both Test and Production environments"],"authentication":"OAuth2 (U-M API Directory with tdxticket scope)","commonUseCases":["Automating IT support ticket creation in UMich systems","Integrating UMich service requests into n8n workflows","Looking up user IDs for automated ticket assignments","Managing service tickets programmatically"],"limitations":["Requires specific U-M API Directory account access","Requestor email must be a valid @umich.edu address","Uniqname must be 3-8 lowercase letters only","Limited to UMich-specific email domains for requestors","Requires manual setup of API application with tdxticket scope"],"relatedNodes":["n8n-nodes-base.oauth2","n8n-nodes-base.httpRequest","n8n-nodes-base.email"]}


node_type: n8n-nodes-kundenschreiber.kundenschreiber
package_name: n8n-nodes-kundenschreiber
display_name: Kundenschreiber
description: Send handwritten letters via the Kundenschreiber API to recipients
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: kundenschreiber
author_github_url: https://github.com/kundenschreiber/
npm_package_name: n8n-nodes-kundenschreiber
npm_version: 0.1.5
community_fetched_at: 2026-07-14T14:40:33.703Z
npm_readme: ERROR: No README data found!
ai_summary_generated_at: 2026-03-25 22:51:43
ai_documentation_summary:
  {"purpose":"This n8n node sends handwritten letters via the Kundeschreiber API to specified recipients.","capabilities":["Send handwritten letters through the Kundeschreiber API","Integrate with the Kundeschreiber service for letter delivery"],"authentication":"API key required","commonUseCases":["Automated handwritten letter delivery","Personalized communication campaigns"],"limitations":[],"relatedNodes":[]}


node_type: n8n-nodes-scrapeunblocker.scrapeUnblocker
package_name: n8n-nodes-scrapeunblocker
display_name: ScrapeUnblocker
description: Unblock and scrape any website using ScrapeUnblocker API
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: tvaitiekunas
author_github_url: https://github.com/ScrapeUnblocker/
npm_package_name: n8n-nodes-scrapeunblocker
npm_version: 0.1.9
community_fetched_at: 2026-07-14T14:40:33.704Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-scrapeunblocker

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

  The ScrapeUnblocker web scraping API helps to bypass captchas and anti-bot systems.

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

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

  ## Installation

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

  ## Operations

  ### Get Page Source (`POST /getPageSource`)

  Fetches the fully rendered HTML source of a webpage through a residential proxy. Optionally waits for a specific element to appear before capturing the HTML, or returns structured JSON for supported domains.

  | Parameter | Type | Required | Description |
  |---|---|---|---|
  | **URL** | string | Yes | The URL of the webpage you want to fetch. |
  | **Proxy Country** | string | No | Country of the proxy to use. If not set, a random European proxy is used. Available: `BE`, `CA`, `CN`, `DE`, `ES`, `FR`, `GB`, `IL`, `IT`, `JP`, `LT`, `NL`, `PL`, `TW`, `US`. |
  | **Wait for Element Method** | string | No | Selector strategy to wait for a specific element before capturing HTML. Useful for JavaScript-rendered pages. Must be used together with **Wait for Element Value**. Allowed values: `css`, `xPath`, `className`, `tagName`. |
  | **Wait for Element Value** | string | No | The selector string to wait for, interpreted according to the chosen method. The request returns once a matching element appears (20 second timeout). Only shown when a method is selected. |
  | **Parsed Data** | boolean | No | If enabled, returns structured JSON extracted from the page for supported domains instead of raw HTML. Defaults to `false`. |

  #### Example: Wait for a CSS element

  Set **Wait for Element Method** to `css` and **Wait for Element Value** to `.main-content` to wait for the element with class `main-content` to appear before the HTML is captured.

  ## Credentials

  You can obtain your API KEY for free by signing up at https://app.scrapeunblocker.com/

  After signing up you will be given 100 free calls for testing ScrapeUnblocker API service.

  ## Compatibility

  n8n 2.8.3 and above

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Get Page Source API](https://www.scrapeunblocker.com/documentation)

  ## Version history

  - 0.1.1: Initial Release
  - 0.1.2: Github repo made public
  - 0.1.3: Corrections after n8n manual review
  - 0.1.4: Added `proxy_country`, `method`, `value`, and `parsed_data` parameters to Get Page Source
  - 0.1.5: Empty version bump
  - 0.1.6: Dark/light logos added
  - 0.1.7: Indicate which parameters are optional
  - 0.1.8: Provenance-backed publish, corrections after n8n review
  - 0.1.9: Updated credential screen links: "Read our docs" now points to the developer docs, and added a link to obtain an API key

ai_documentation_summary:
  {"purpose":"This n8n community node enables workflows to bypass captchas and anti-bot systems by using the ScrapeUnblocker API to retrieve webpage content.","capabilities":["Get Page Source","Bypass captchas","Bypass anti-bot systems","Access protected or restricted websites"],"authentication":"API key required (obtained from ScrapeUnblocker account)","commonUseCases":["Web scraping of protected sites","Automated data collection from captcha-protected pages","Bot detection bypass for research or monitoring tasks"],"limitations":["Free tier limited to 100 calls for testing","Requires external API key from ScrapeUnblocker service","May have rate limits based on API plan"],"relatedNodes":["n8n HTTP Request","n8n Webhook"]}


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

updated_at: 2026-07-14 14:40:33
author_name: thibaulttimizer
author_github_url: https://github.com/timizerio/timizer-n8n-node.git
npm_package_name: n8n-nodes-timizer
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:33.705Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "activityReport",
      "options": [
        {
          "name": "Activity Report",
          "value": "activityReport"
        },
        {
          "name": "Client",
          "value": "client"
        },
        {
          "name": "Client Contact",
          "value": "clientContact"
        },
        {
          "name": "Contracted",
          "value": "contracted"
        },
        {
          "name": "Contracted Contact",
          "value": "contractedContact"
        },
        {
          "name": "Mission",
          "value": "mission"
        },
        {
          "name": "Tag",
          "value": "tag"
        },
        {
          "name": "Team",
          "value": "team"
        },
        {
          "name": "Team Member",
          "value": "teamMember"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an activity report"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an activity report"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an activity report"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many activity reports"
        },
        {
          "name": "Get PDF",
          "value": "getPdf",
          "action": "Get activity report PDF"
        },
        {
          "name": "Mark as Processed",
          "value": "markProcessed",
          "action": "Mark an activity report as processed"
        },
        {
          "name": "Mark as Unprocessed",
          "value": "markUnprocessed",
          "action": "Mark an activity report as unprocessed"
        },
        {
          "name": "Refuse",
          "value": "refuse",
          "action": "Refuse an activity report"
        },
        {
          "name": "Share",
          "value": "share",
          "action": "Share an activity report"
        },
        {
          "name": "Share by Email",
          "value": "shareByEmail",
          "action": "Share an activity report by email"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an activity report"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "activityReport"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a client"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a client"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a client"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many clients"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a client"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "client"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a client contact"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a client contact"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many client contacts"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a client contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "clientContact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a contracted"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a contracted"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a contracted"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many contracted"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a contracted"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contracted"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a contracted contact"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a contracted contact"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many contracted contacts"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a contracted contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contractedContact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a mission"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a mission"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many missions"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a mission"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "mission"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a tag"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a tag"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many tags"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a tag"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a team"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a team"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many teams"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a team"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "team"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a team member"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many team members"
        },
        {
          "name": "Invite",
          "value": "invite",
          "action": "Invite a team member"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a team member"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "teamMember"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an activity report",
      "resource": "activityReport"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an activity report",
      "resource": "activityReport"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an activity report",
      "resource": "activityReport"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many activity reports",
      "resource": "activityReport"
    },
    {
      "name": "Get PDF",
      "value": "getPdf",
      "action": "Get activity report PDF",
      "resource": "activityReport"
    },
    {
      "name": "Mark as Processed",
      "value": "markProcessed",
      "action": "Mark an activity report as processed",
      "resource": "activityReport"
    },
    {
      "name": "Mark as Unprocessed",
      "value": "markUnprocessed",
      "action": "Mark an activity report as unprocessed",
      "resource": "activityReport"
    },
    {
      "name": "Refuse",
      "value": "refuse",
      "action": "Refuse an activity report",
      "resource": "activityReport"
    },
    {
      "name": "Share",
      "value": "share",
      "action": "Share an activity report",
      "resource": "activityReport"
    },
    {
      "name": "Share by Email",
      "value": "shareByEmail",
      "action": "Share an activity report by email",
      "resource": "activityReport"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an activity report",
      "resource": "activityReport"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a client",
      "resource": "client"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a client",
      "resource": "client"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a client",
      "resource": "client"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many clients",
      "resource": "client"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a client",
      "resource": "client"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a client contact",
      "resource": "clientContact"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a client contact",
      "resource": "clientContact"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many client contacts",
      "resource": "clientContact"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a client contact",
      "resource": "clientContact"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a contracted",
      "resource": "contracted"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a contracted",
      "resource": "contracted"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a contracted",
      "resource": "contracted"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many contracted",
      "resource": "contracted"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a contracted",
      "resource": "contracted"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a contracted contact",
      "resource": "contractedContact"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a contracted contact",
      "resource": "contractedContact"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many contracted contacts",
      "resource": "contractedContact"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a contracted contact",
      "resource": "contractedContact"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a mission",
      "resource": "mission"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a mission",
      "resource": "mission"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many missions",
      "resource": "mission"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a mission",
      "resource": "mission"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a tag",
      "resource": "tag"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a tag",
      "resource": "tag"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many tags",
      "resource": "tag"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a tag",
      "resource": "tag"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a team",
      "resource": "team"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a team",
      "resource": "team"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many teams",
      "resource": "team"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a team",
      "resource": "team"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a team member",
      "resource": "teamMember"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many team members",
      "resource": "teamMember"
    },
    {
      "name": "Invite",
      "value": "invite",
      "action": "Invite a team member",
      "resource": "teamMember"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a team member",
      "resource": "teamMember"
    }
  ]

npm_readme:
  # n8n-nodes-timizer

  This is an [n8n](https://n8n.io/) community node for [Timizer](https://timizer.io), a timesheet and activity report management platform.

  It lets you interact with the Timizer API directly from your n8n workflows.

  ## Installation

  In your n8n instance:

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

  ## Credentials

  You need a Timizer API key and Team ID to authenticate. Configure them in n8n:

  1. Go to **Credentials > New Credential**
  2. Search for **Timizer API**
  3. Enter your **API Key** and **Team ID**

  ## Nodes

  ### Timizer

  Interact with Timizer resources. Supported resources and operations:

  | Resource | Operations |
  |---|---|
  | Activity Report | Create, Delete, Get, Update |
  | Client | Create, Delete, Get, Update |
  | Client Contact | Create, Delete, Update |
  | Contracted | Create, Delete, Get, Update |
  | Contracted Contact | Create, Delete, Update |
  | Mission | Create, Delete, Update |
  | Tag | Create, Delete, Update |
  | Team | Create, Delete, Update |
  | Team Member | Delete, Update |

  ### Timizer Trigger

  Starts a workflow when Timizer events occur via webhooks. Supported events:

  - Activity Report: Created, Deleted, Refused, Shared, Signed, Updated

  ## Compatibility

  Tested with n8n v1.x. Requires Node.js >= 18.

  ## Resources

  - [Timizer website](https://timizer.io)
  - [Timizer API documentation](https://api.timizer.io)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables interaction with the Timizer API for managing timesheets and activity reports.","capabilities":["Create, Delete, Get, Update Activity Reports","Create, Delete, Get, Update Clients","Create, Delete, Update Client Contacts","Create, Delete, Get, Update Contracted items","Create, Delete, Update Contracted Contacts","Create, Delete, Update Missions","Create, Delete, Update Tags","Create, Delete, Update Teams","Delete, Update Team Members","Trigger workflows via Timizer webhooks for events like report creation, deletion, refusal, sharing, signing, and updates"],"authentication":"API Key and Team ID required","commonUseCases":["Automating timesheet data entry into Timizer","Syncing client and team information with Timizer","Notifying workflows when activity reports are created or signed","Managing contracted projects and team members via API"],"limitations":["Tested only with n8n v1.x","Requires Node.js >= 18","Team Member Create operation is not supported"],"relatedNodes":["n8n-nodes-base.webhook","n8n-nodes-base.httpRequest"]}


node_type: n8n-nodes-timizer.timizerTrigger
package_name: n8n-nodes-timizer
display_name: Timizer Trigger
description: Starts the workflow when Timizer events occur
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: thibaulttimizer
author_github_url: https://github.com/timizerio/timizer-n8n-node.git
npm_package_name: n8n-nodes-timizer
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:33.706Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-timizer

  This is an [n8n](https://n8n.io/) community node for [Timizer](https://timizer.io), a timesheet and activity report management platform.

  It lets you interact with the Timizer API directly from your n8n workflows.

  ## Installation

  In your n8n instance:

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

  ## Credentials

  You need a Timizer API key and Team ID to authenticate. Configure them in n8n:

  1. Go to **Credentials > New Credential**
  2. Search for **Timizer API**
  3. Enter your **API Key** and **Team ID**

  ## Nodes

  ### Timizer

  Interact with Timizer resources. Supported resources and operations:

  | Resource | Operations |
  |---|---|
  | Activity Report | Create, Delete, Get, Update |
  | Client | Create, Delete, Get, Update |
  | Client Contact | Create, Delete, Update |
  | Contracted | Create, Delete, Get, Update |
  | Contracted Contact | Create, Delete, Update |
  | Mission | Create, Delete, Update |
  | Tag | Create, Delete, Update |
  | Team | Create, Delete, Update |
  | Team Member | Delete, Update |

  ### Timizer Trigger

  Starts a workflow when Timizer events occur via webhooks. Supported events:

  - Activity Report: Created, Deleted, Refused, Shared, Signed, Updated

  ## Compatibility

  Tested with n8n v1.x. Requires Node.js >= 18.

  ## Resources

  - [Timizer website](https://timizer.io)
  - [Timizer API documentation](https://api.timizer.io)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"The Timizer Trigger node starts an n8n workflow when specific events occur in the Timizer timesheet and activity report management platform via webhooks.","capabilities":["Monitors Timizer events via webhooks","Triggers workflow execution on Activity Report events","Supports events: Created, Deleted, Refused, Shared, Signed, Updated","Integrates with Timizer API for timesheet management"],"authentication":"API key required (Timizer API Key and Team ID)","commonUseCases":["Automated timesheet processing","Activity report status notifications","Workflow automation based on client or team updates","Automated task assignment on mission creation"],"limitations":["Only supports Activity Report events (not all Timizer resources)","Missing Create operation for Activity Report events","Missing Create operation for Team Member resource","Limited to n8n v1.x compatibility","Requires Node.js >= 18"],"relatedNodes":["Timizer (full API interaction node)","Webhook","IF (conditionals)","Execute Workflow"]}


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

updated_at: 2026-07-14 14:40:33
author_name: jason18505
author_github_url: https://github.com/DropInBlog/n8n-nodes-dropinblog.git
npm_package_name: @dropinblog/n8n-nodes-dropinblog
npm_version: 1.0.11
community_fetched_at: 2026-07-14T14:40:33.707Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Post",
          "value": "post"
        }
      ],
      "description": "The resource to operate on",
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a post",
          "description": "Create a new blog post"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a post",
          "description": "Get a post by ID or slug"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search posts",
          "description": "Search blog posts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "post"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a post",
      "description": "Create a new blog post",
      "resource": "post"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a post",
      "description": "Get a post by ID or slug",
      "resource": "post"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search posts",
      "description": "Search blog posts",
      "resource": "post"
    }
  ]

npm_readme:
  # n8n-nodes-dropinblog

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

  DropInBlog is an SEO-friendly blog solution that embeds into any website.

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

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

  ## Installation

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

  ## Operations

  ### DropInBlog Node

  - **Post**
    - **Create** - Create a new blog post with title, content, and optional fields:
      - Status
      - Slug
      - Featured image URL
      - SEO title and description
      - Keyword
      - Author name
      - Category names
    - **Get** - Retrieve a post by its numeric ID or slug
    - **Search** - Search blog posts with optional filters:
      - Status (Draft/Published)
      - Limit

  ### DropInBlog Trigger Node

  - **Post Published** - Triggers when a post is published in your DropInBlog

  ## Credentials

  This node uses OAuth2 authentication with DropInBlog. You'll need to:

  1. Contact [DropInBlog support](https://dropinblog.com/contact/) to request OAuth credentials for your account
  2. Configure the OAuth2 credentials in n8n with the Client ID and Client Secret provided
  3. Complete the OAuth authorization flow

  ## Compatibility

  Tested with n8n version 1.48.0 and above. Requires Node.js 18.10 or later.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [DropInBlog API documentation](https://dropinblog.readme.io/reference/api-reference)
  * [DropInBlog website](https://dropinblog.com)

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with DropInBlog, an SEO-friendly blog solution, allowing users to create, retrieve, and search blog posts directly within n8n workflows.","capabilities":["Create new blog posts with title, content, status, slug, featured image, SEO metadata, keywords, author, and categories","Retrieve existing blog posts by numeric ID or slug","Search blog posts with optional filters for status and limit","Trigger workflow execution when a post is published in DropInBlog"],"authentication":"OAuth2","commonUseCases":["Automated blog post creation from external data sources","Real-time notifications for new blog posts via webhooks","Scheduling and managing blog content through n8n workflows"],"limitations":["Requires manual OAuth credential setup by contacting DropInBlog support","Limited to n8n versions 1.48.0 and above","Requires Node.js 18.10 or later"],"relatedNodes":["n8n HTTP Request","n8n Webhook","n8n Trigger All"]}


node_type: @dropinblog/n8n-nodes-dropinblog.dropInBlogTrigger
package_name: @dropinblog/n8n-nodes-dropinblog
display_name: DropInBlog Trigger
description: Starts the workflow when a DropInBlog event occurs
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: jason18505
author_github_url: https://github.com/DropInBlog/n8n-nodes-dropinblog.git
npm_package_name: @dropinblog/n8n-nodes-dropinblog
npm_version: 1.0.11
community_fetched_at: 2026-07-14T14:40:33.708Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-dropinblog

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

  DropInBlog is an SEO-friendly blog solution that embeds into any website.

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

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

  ## Installation

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

  ## Operations

  ### DropInBlog Node

  - **Post**
    - **Create** - Create a new blog post with title, content, and optional fields:
      - Status
      - Slug
      - Featured image URL
      - SEO title and description
      - Keyword
      - Author name
      - Category names
    - **Get** - Retrieve a post by its numeric ID or slug
    - **Search** - Search blog posts with optional filters:
      - Status (Draft/Published)
      - Limit

  ### DropInBlog Trigger Node

  - **Post Published** - Triggers when a post is published in your DropInBlog

  ## Credentials

  This node uses OAuth2 authentication with DropInBlog. You'll need to:

  1. Contact [DropInBlog support](https://dropinblog.com/contact/) to request OAuth credentials for your account
  2. Configure the OAuth2 credentials in n8n with the Client ID and Client Secret provided
  3. Complete the OAuth authorization flow

  ## Compatibility

  Tested with n8n version 1.48.0 and above. Requires Node.js 18.10 or later.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [DropInBlog API documentation](https://dropinblog.readme.io/reference/api-reference)
  * [DropInBlog website](https://dropinblog.com)

ai_documentation_summary:
  {"purpose":"The DropInBlog Trigger node starts an n8n workflow automatically when a blog post is published in a DropInBlog account.","capabilities":["Triggers workflow on post publication events","Supports OAuth2 authentication with DropInBlog","Integrates with DropInBlog's blog management system"],"authentication":"OAuth2 required (Client ID and Client Secret obtained via DropInBlog support)","commonUseCases":["Automatically process new blog posts upon publication","Send notifications when content is published","Trigger downstream actions based on blog updates"],"limitations":["Requires manual OAuth credential setup via DropInBlog support","Limited to triggering on post publication events only (no manual trigger operations)"],"relatedNodes":["DropInBlog Post Node","DropInBlog Get Node","DropInBlog Search Node"]}


node_type: @stackflo-labs/n8n-nodes-retainr.retainr
package_name: @stackflo-labs/n8n-nodes-retainr
display_name: Retainr
description: Store, search, and retrieve AI agent memories.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: sebastianstupak
author_github_url: https://github.com/stackflo-labs/n8n-nodes-retainr.git
npm_package_name: @stackflo-labs/n8n-nodes-retainr
npm_version: 0.4.1
community_fetched_at: 2026-07-14T14:40:33.709Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "memory",
      "options": [
        {
          "name": "Memory",
          "value": "memory"
        },
        {
          "name": "Workspace",
          "value": "workspace"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "store",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete memories",
          "description": "Delete memories matching a filter."
        },
        {
          "name": "Get Context",
          "value": "getContext",
          "action": "Get memory context",
          "description": "Get pre-formatted memory context for LLM prompts."
        },
        {
          "name": "List",
          "value": "list",
          "action": "List memories",
          "description": "List memories with optional filters."
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search memories",
          "description": "Semantic search across memories."
        },
        {
          "name": "Store",
          "value": "store",
          "action": "Store a memory",
          "description": "Store a new memory."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "memory"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getInfo",
      "options": [
        {
          "name": "Get Info",
          "value": "getInfo",
          "action": "Get workspace info",
          "description": "Get workspace details, usage, and API keys."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "workspace"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete memories",
      "description": "Delete memories matching a filter.",
      "resource": "memory"
    },
    {
      "name": "Get Context",
      "value": "getContext",
      "action": "Get memory context",
      "description": "Get pre-formatted memory context for LLM prompts.",
      "resource": "memory"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List memories",
      "description": "List memories with optional filters.",
      "resource": "memory"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search memories",
      "description": "Semantic search across memories.",
      "resource": "memory"
    },
    {
      "name": "Store",
      "value": "store",
      "action": "Store a memory",
      "description": "Store a new memory.",
      "resource": "memory"
    },
    {
      "name": "Get Info",
      "value": "getInfo",
      "action": "Get workspace info",
      "description": "Get workspace details, usage, and API keys.",
      "resource": "workspace"
    }
  ]

npm_readme:
  # @stackflo-labs/n8n-nodes-retainr

  [n8n](https://n8n.io/) community node for [retainr.dev](https://retainr.dev) — the AI agent memory persistence API.

  Give your n8n AI agents **long-term memory** that persists across workflow runs. Store facts, preferences, and context, then retrieve them with semantic search — so your agents remember what matters.

  ## Features

  | Operation | Description |
  |-----------|-------------|
  | **Store** | Save a memory with namespace, tags, metadata, TTL, and deduplication |
  | **Search** | Semantic similarity search across stored memories |
  | **Get Context** | Retrieve pre-formatted memory context ready for LLM system prompts |
  | **List** | Browse memories with filters (namespace, tags) |
  | **Delete** | Remove memories by namespace |
  | **Get Workspace Info** | View plan usage, API keys, and workspace details |

  ## Installation

  ### n8n Cloud & Desktop

  1. Go to **Settings > Community Nodes**
  2. Click **Install**
  3. Enter the exact package name: `@stackflo-labs/n8n-nodes-retainr`
  4. Click **Install** and restart if prompted

  ### Self-hosted n8n (UI)

  1. Go to **Settings > Community Nodes > Install**
  2. Enter `@stackflo-labs/n8n-nodes-retainr`
  3. Click **Install**

  Requires `N8N_COMMUNITY_PACKAGES_ENABLED=true` in your environment (set by default in Docker).

  ### Self-hosted n8n (manual / Docker volume)

  ```bash
  # If you mount a custom node directory or manage packages directly:
  cd /home/node/.n8n
  npm install @stackflo-labs/n8n-nodes-retainr
  ```

  Then restart n8n.

  ## Setup

  1. Sign up at [retainr.dev](https://retainr.dev) and get your API key
  2. In n8n, go to **Credentials > New > Retainr API**
  3. Paste your API key (`rec_live_...`) — each key is scoped to one workspace
  4. The default Base URL (`https://api.retainr.dev`) works out of the box

  ## How it works

  **Workspace → Namespace** hierarchy:

  - **Workspace**: Your organization, determined by the API key
  - **Namespace**: Groups memories by customer, tenant, or any identifier (e.g., `customer:alice`, `project:onboarding`)

  Every memory operation accepts a **Namespace** field. Use it to keep each customer's memories separate within your workspace.

  ## Usage Examples

  ### Store a memory after a conversation

  1. Add the **Retainr** node after your AI Agent
  2. Set **Resource** to `Memory`, **Operation** to `Store`
  3. Map the conversation summary to the **Content** field
  4. Set **Namespace** to the customer identifier (e.g., `customer:alice`)

  ### Inject memory context into an LLM prompt

  1. Add a **Retainr** node before your AI Agent
  2. Set **Operation** to `Get Context`
  3. Use the incoming message as the **Query**
  4. Set the same **Namespace** to retrieve that customer's memories
  5. Pass the `context` output into your LLM's system prompt

  ### Deduplicate similar memories

  Use the **Dedup Threshold** field (e.g., `0.95`) when storing. If a sufficiently similar memory already exists, it will be updated instead of duplicated.

  ## AI Agent Tool

  This node has `usableAsTool` enabled — you can use it directly as a tool inside n8n's **AI Agent** node, letting the agent decide when to store or recall memories autonomously.

  ## API Documentation

  Full API reference: [retainr.dev/docs](https://retainr.dev/docs)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables AI agents to persist long-term memories by storing, searching, and retrieving facts, preferences, and context using the retainr.dev API.","capabilities":["Store memories with namespace, tags, metadata, TTL, and deduplication","Perform semantic similarity search across stored memories","Retrieve pre-formatted memory context for LLM system prompts","List memories with filters (namespace, tags)","Delete memories by namespace","View workspace plan usage, API keys, and details","Operate as a tool within n8n's AI Agent node"],"authentication":"API key required (obtained from retainr.dev, scoped to workspace)","commonUseCases":["Injecting customer-specific memory context into AI agent responses","Persisting conversation summaries and user preferences across workflow runs","Deduplicating similar memories to maintain clean knowledge bases","Organizing memories by customer or project namespace"],"limitations":["Requires a valid API key and workspace from retainr.dev","Requires n8n community packages to be enabled for installation","Deduplication relies on configurable similarity thresholds"],"relatedNodes":["AI Agent","HTTP Request","Code"]}


node_type: @fundraisingbox/n8n-nodes-fundraisingbox.fundraisingboxTrigger
package_name: @fundraisingbox/n8n-nodes-fundraisingbox
display_name: FundraisingBox Trigger
description: Triggers the workflow when new donations arrive in FundraisingBox
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: p.montag
author_github_url: https://github.com/FundraisingBox/n8n-nodes-fundraisingbox.git
npm_package_name: @fundraisingbox/n8n-nodes-fundraisingbox
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:33.710Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # @fundraisingbox/n8n-nodes-fundraisingbox

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

  FundraisingBox is a donation and fundraising management platform that helps non-profit organizations collect and manage donations online.

  [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

  ### FundraisingBox (action node)

  #### Communication

  - **Create** – Create a new communication entry linked to a person. Requires Person ID and HTML message. Optional fields: type (note/email/phone/talk/letter), subject, direction (in/out), date, sticky.
  - **Delete** – Delete a communication entry permanently.
  - **Get** – Retrieve a single communication entry by ID.
  - **Get Many** – Retrieve a list of communications. Filter by Person ID, type, direction, and date range. Supports pagination.
  - **Update** – Update an existing communication entry by ID.

  #### Donation

  - **Get** – Retrieve a single donation by ID.
  - **Get Many** – Retrieve a list of donations. Filter by amount range, date range, updated range, project, type, source, person, test status, and various IDs. Supports pagination.

  #### Donation Type

  - **Get** – Retrieve a single donation type by ID.
  - **Get Many** – Retrieve a list of donation types. Supports pagination.

  #### Person

  FundraisingBox uses the term "Person" for what many tools call a Contact.

  - **Create** – Create a new person. Requires Last Name. First Name and additional fields (Company ID, External Person ID, Greeting, Info, Position, Salutation, Title) are optional.
  - **Get** – Retrieve a single person by their numeric ID.
  - **Get Many** – Retrieve a list of persons. Filter by salutation, first/last name, company, phone, email, address, tag IDs, person IDs, smart search ID, and created/updated date range. Supports pagination.
  - **Update** – Update an existing person by ID. All fields are optional.

  #### Person Address

  - **Create** – Create a new address for a person. Requires Person ID, street address, post code, city, and country. Optional fields: state, type (work/home/other), is main address.
  - **Get** – Retrieve a single address by ID.
  - **Update** – Update an existing address by ID. Updatable fields: street address, post code, city, state, country, type, is main address.

  #### Person Email Address

  - **Create** – Create a new email address for a person. Requires Person ID and email. Optional fields: type (work/home/other), is main email address.
  - **Get** – Retrieve a single email address by ID.
  - **Update** – Update an existing email address by ID. Updatable fields: email, type, is main email address.

  #### Project

  - **Get** – Retrieve a single project by ID.
  - **Get Many** – Retrieve a list of projects. Supports pagination.

  #### Source

  - **Get** – Retrieve a single source by ID.
  - **Get Many** – Retrieve a list of sources. Supports pagination.

  ### FundraisingBox Donation Trigger (polling trigger node)

  - **New Donation** – Triggers the workflow whenever a new confirmed donation appears. On first activation the node initialises its checkpoint to the latest donation and will only emit donations created after that point.

  ## Credentials

  FundraisingBox uses HTTP Basic Auth with an API key. To authenticate:

  1. Retrieve your API key by following the [FundraisingBox support article on connecting third-party systems via REST API](https://support.fundraisingbox.com/de/support/solutions/articles/79000147562-schnittstellen-zu-drittsystemen-herstellen-rest-api-webhooks-).
  2. In n8n, create a new **FundraisingBox API** credential.
  3. Paste your API key into the **API Key** field.

  The node sends the API key as the HTTP Basic Auth username (the password field is ignored by the API).

  ## Compatibility

  Requires **n8n 1.x**. The node uses `usableAsTool: true`, which requires n8n 1.31 or later.

  No known incompatibilities with current n8n versions.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [FundraisingBox API documentation](https://developer.fundraisingbox.com/reference/introduction-json)

ai_documentation_summary:
  {"purpose":"A polling trigger node that initiates n8n workflows when a new confirmed donation is received in FundraisingBox.","capabilities":["Trigger workflow on new confirmed donations","Maintain checkpoint to track donations processed since last run","Support for FundraisingBox API integration","Access to Person, Communication, Donation, Project, and Source data via related action nodes"],"authentication":"API Key (used as HTTP Basic Auth username)","commonUseCases":["Automate follow-up emails when a donation is received","Create tasks or notifications for fundraising campaigns","Sync donation data to external CRM or reporting systems"],"limitations":["Requires n8n 1.31 or later","Only triggers on new confirmed donations, not all donation events","Initializes checkpoint on first activation and only processes donations after that point"],"relatedNodes":["FundraisingBox Action Node","FundraisingBox Person Node","FundraisingBox Donation Node","FundraisingBox Communication Node"]}


node_type: @fundraisingbox/n8n-nodes-fundraisingbox.fundraisingbox
package_name: @fundraisingbox/n8n-nodes-fundraisingbox
display_name: FundraisingBox
description: Manage donations, donors, communications, and projects in FundraisingBox
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: p.montag
author_github_url: https://github.com/FundraisingBox/n8n-nodes-fundraisingbox.git
npm_package_name: @fundraisingbox/n8n-nodes-fundraisingbox
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:33.711Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "person",
      "options": [
        {
          "name": "Communication",
          "value": "communication"
        },
        {
          "name": "Donation",
          "value": "donation"
        },
        {
          "name": "Donation Type",
          "value": "donationType"
        },
        {
          "name": "Person",
          "value": "person",
          "description": "FundraisingBox uses the term Person for what many tools call a Contact"
        },
        {
          "name": "Person Address",
          "value": "personAddress"
        },
        {
          "name": "Person Email Address",
          "value": "personEmailAddress"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Source",
          "value": "source"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a communication",
          "description": "Add a communication entry for a person"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a communication",
          "description": "Delete a communication permanently"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a communication",
          "description": "Retrieve a communication"
        },
        {
          "name": "Get Many",
          "value": "list",
          "action": "Get many communications",
          "description": "Retrieve a list of communication entries"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a communication",
          "description": "Update an existing communication entry"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "communication"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a donation",
          "description": "Retrieve a donation"
        },
        {
          "name": "Get Many",
          "value": "list",
          "action": "Get many donations",
          "description": "Retrieve a list of donations"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "donation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a donation type",
          "description": "Retrieve a donation type"
        },
        {
          "name": "Get Many",
          "value": "list",
          "action": "Get many donation types",
          "description": "Retrieve a list of donation types"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "donationType"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a person",
          "description": "Create a new person"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a person",
          "description": "Retrieve a person"
        },
        {
          "name": "Get Many",
          "value": "list",
          "action": "Get many persons",
          "description": "Retrieve a list of persons"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a person",
          "description": "Update an existing person"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a person address",
          "description": "Add an address to a person"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a person address",
          "description": "Retrieve a person address"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a person address",
          "description": "Update an existing address"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "personAddress"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a person email address",
          "description": "Add an email address to a person"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a person email address",
          "description": "Retrieve a person email address"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a person email address",
          "description": "Update an existing email address"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "personEmailAddress"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project",
          "description": "Retrieve a project"
        },
        {
          "name": "Get Many",
          "value": "list",
          "action": "Get many projects",
          "description": "Retrieve a list of projects"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a source",
          "description": "Retrieve a source"
        },
        {
          "name": "Get Many",
          "value": "list",
          "action": "Get many sources",
          "description": "Retrieve a list of sources"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "source"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a communication",
      "description": "Add a communication entry for a person",
      "resource": "communication"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a communication",
      "description": "Delete a communication permanently",
      "resource": "communication"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a communication",
      "description": "Retrieve a communication",
      "resource": "communication"
    },
    {
      "name": "Get Many",
      "value": "list",
      "action": "Get many communications",
      "description": "Retrieve a list of communication entries",
      "resource": "communication"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a communication",
      "description": "Update an existing communication entry",
      "resource": "communication"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a donation",
      "description": "Retrieve a donation",
      "resource": "donation"
    },
    {
      "name": "Get Many",
      "value": "list",
      "action": "Get many donations",
      "description": "Retrieve a list of donations",
      "resource": "donation"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a donation type",
      "description": "Retrieve a donation type",
      "resource": "donationType"
    },
    {
      "name": "Get Many",
      "value": "list",
      "action": "Get many donation types",
      "description": "Retrieve a list of donation types",
      "resource": "donationType"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a person",
      "description": "Create a new person",
      "resource": "person"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a person",
      "description": "Retrieve a person",
      "resource": "person"
    },
    {
      "name": "Get Many",
      "value": "list",
      "action": "Get many persons",
      "description": "Retrieve a list of persons",
      "resource": "person"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a person",
      "description": "Update an existing person",
      "resource": "person"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a person address",
      "description": "Add an address to a person",
      "resource": "personAddress"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a person address",
      "description": "Retrieve a person address",
      "resource": "personAddress"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a person address",
      "description": "Update an existing address",
      "resource": "personAddress"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a person email address",
      "description": "Add an email address to a person",
      "resource": "personEmailAddress"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a person email address",
      "description": "Retrieve a person email address",
      "resource": "personEmailAddress"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a person email address",
      "description": "Update an existing email address",
      "resource": "personEmailAddress"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "description": "Retrieve a project",
      "resource": "project"
    },
    {
      "name": "Get Many",
      "value": "list",
      "action": "Get many projects",
      "description": "Retrieve a list of projects",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a source",
      "description": "Retrieve a source",
      "resource": "source"
    },
    {
      "name": "Get Many",
      "value": "list",
      "action": "Get many sources",
      "description": "Retrieve a list of sources",
      "resource": "source"
    }
  ]

npm_readme:
  # @fundraisingbox/n8n-nodes-fundraisingbox

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

  FundraisingBox is a donation and fundraising management platform that helps non-profit organizations collect and manage donations online.

  [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

  ### FundraisingBox (action node)

  #### Communication

  - **Create** – Create a new communication entry linked to a person. Requires Person ID and HTML message. Optional fields: type (note/email/phone/talk/letter), subject, direction (in/out), date, sticky.
  - **Delete** – Delete a communication entry permanently.
  - **Get** – Retrieve a single communication entry by ID.
  - **Get Many** – Retrieve a list of communications. Filter by Person ID, type, direction, and date range. Supports pagination.
  - **Update** – Update an existing communication entry by ID.

  #### Donation

  - **Get** – Retrieve a single donation by ID.
  - **Get Many** – Retrieve a list of donations. Filter by amount range, date range, updated range, project, type, source, person, test status, and various IDs. Supports pagination.

  #### Donation Type

  - **Get** – Retrieve a single donation type by ID.
  - **Get Many** – Retrieve a list of donation types. Supports pagination.

  #### Person

  FundraisingBox uses the term "Person" for what many tools call a Contact.

  - **Create** – Create a new person. Requires Last Name. First Name and additional fields (Company ID, External Person ID, Greeting, Info, Position, Salutation, Title) are optional.
  - **Get** – Retrieve a single person by their numeric ID.
  - **Get Many** – Retrieve a list of persons. Filter by salutation, first/last name, company, phone, email, address, tag IDs, person IDs, smart search ID, and created/updated date range. Supports pagination.
  - **Update** – Update an existing person by ID. All fields are optional.

  #### Person Address

  - **Create** – Create a new address for a person. Requires Person ID, street address, post code, city, and country. Optional fields: state, type (work/home/other), is main address.
  - **Get** – Retrieve a single address by ID.
  - **Update** – Update an existing address by ID. Updatable fields: street address, post code, city, state, country, type, is main address.

  #### Person Email Address

  - **Create** – Create a new email address for a person. Requires Person ID and email. Optional fields: type (work/home/other), is main email address.
  - **Get** – Retrieve a single email address by ID.
  - **Update** – Update an existing email address by ID. Updatable fields: email, type, is main email address.

  #### Project

  - **Get** – Retrieve a single project by ID.
  - **Get Many** – Retrieve a list of projects. Supports pagination.

  #### Source

  - **Get** – Retrieve a single source by ID.
  - **Get Many** – Retrieve a list of sources. Supports pagination.

  ### FundraisingBox Donation Trigger (polling trigger node)

  - **New Donation** – Triggers the workflow whenever a new confirmed donation appears. On first activation the node initialises its checkpoint to the latest donation and will only emit donations created after that point.

  ## Credentials

  FundraisingBox uses HTTP Basic Auth with an API key. To authenticate:

  1. Retrieve your API key by following the [FundraisingBox support article on connecting third-party systems via REST API](https://support.fundraisingbox.com/de/support/solutions/articles/79000147562-schnittstellen-zu-drittsystemen-herstellen-rest-api-webhooks-).
  2. In n8n, create a new **FundraisingBox API** credential.
  3. Paste your API key into the **API Key** field.

  The node sends the API key as the HTTP Basic Auth username (the password field is ignored by the API).

  ## Compatibility

  Requires **n8n 1.x**. The node uses `usableAsTool: true`, which requires n8n 1.31 or later.

  No known incompatibilities with current n8n versions.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [FundraisingBox API documentation](https://developer.fundraisingbox.com/reference/introduction-json)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of interactions with the FundraisingBox API, allowing non-profit organizations to manage donations, contacts, and communications programmatically.","capabilities":["Create, read, update, and delete communication entries (notes, emails, phone records, etc.)","Retrieve and filter donation data by amount, date, project, type, source, or person","Manage person/contact records including creation, updates, and filtering","Handle person addresses and email addresses (work/home/other types)","Retrieve donation type and project information","Retrieve source information","Poll for new confirmed donations via a trigger node"],"authentication":"API Key (HTTP Basic Auth - key used as username, password field ignored)","commonUseCases":["Automating donation follow-up emails based on donation status","Syncing donor data between FundraisingBox and other CRM systems","Triggering workflows when new donations are received","Managing contact records and communication history for non-profit campaigns"],"limitations":["Requires n8n 1.31 or later (due to usableAsTool: true requirement)","Password field in credentials is ignored; API key must be used as HTTP Basic Auth username","Limited to HTTP Basic Auth; OAuth2 or other methods not supported"],"relatedNodes":["n8n HTTP Request node","n8n Webhook node","n8n Trigger node (for donation polling)"]}


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

updated_at: 2026-07-14 14:40:33
author_name: azhderskam
author_github_url: https://github.com/localithai/
npm_package_name: n8n-nodes-localith
npm_version: 0.1.17
community_fetched_at: 2026-07-14T14:40:33.712Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "listing",
      "options": [
        {
          "name": "Item",
          "value": "item"
        },
        {
          "name": "Listing",
          "value": "listing"
        },
        {
          "name": "Listing Metrics",
          "value": "listingMetrics"
        },
        {
          "name": "Listing Item Metrics",
          "value": "listingItemMetrics"
        },
        {
          "name": "Content Publishing Media",
          "value": "contentPublishingMedia"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many items",
          "routing": {
            "request": {
              "url": "/rest/v1/items",
              "method": "GET"
            }
          },
          "description": "Retrieve the collection of items (reviews)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "item"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many listings",
          "routing": {
            "request": {
              "url": "/rest/v1/listings",
              "method": "GET"
            }
          },
          "description": "Retrieve the collection of listings"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a listing",
          "routing": {
            "request": {
              "url": "=/rest/v1/listings/{{$parameter[\"listingId\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single listing by ID"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a listing",
          "routing": {
            "request": {
              "url": "=/rest/v1/listings/{{$parameter[\"listingId\"]}}",
              "method": "PATCH"
            }
          },
          "description": "Update a listing by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "listing"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get listing metrics",
          "routing": {
            "request": {
              "url": "/rest/v1/listing_metrics",
              "method": "GET"
            }
          },
          "description": "Retrieve daily listing metrics summarized data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "listingMetrics"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get listing item metrics",
          "routing": {
            "request": {
              "url": "/rest/v1/listing_item_metrics",
              "method": "GET"
            }
          },
          "description": "Retrieve reviews metrics summarized data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "listingItemMetrics"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "publish",
      "options": [
        {
          "name": "Publish / Schedule",
          "value": "publish",
          "action": "Publish or schedule a media post",
          "routing": {
            "request": {
              "url": "/rest/v1/content_publishing_media",
              "method": "POST"
            }
          },
          "description": "Publish or schedule content publishing media posts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contentPublishingMedia"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many items",
      "routing": {
        "request": {
          "url": "/rest/v1/items",
          "method": "GET"
        }
      },
      "description": "Retrieve the collection of items (reviews)",
      "resource": "item"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many listings",
      "routing": {
        "request": {
          "url": "/rest/v1/listings",
          "method": "GET"
        }
      },
      "description": "Retrieve the collection of listings",
      "resource": "listing"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a listing",
      "routing": {
        "request": {
          "url": "=/rest/v1/listings/{{$parameter[\"listingId\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single listing by ID",
      "resource": "listing"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a listing",
      "routing": {
        "request": {
          "url": "=/rest/v1/listings/{{$parameter[\"listingId\"]}}",
          "method": "PATCH"
        }
      },
      "description": "Update a listing by ID",
      "resource": "listing"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get listing metrics",
      "routing": {
        "request": {
          "url": "/rest/v1/listing_metrics",
          "method": "GET"
        }
      },
      "description": "Retrieve daily listing metrics summarized data",
      "resource": "listingMetrics"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get listing item metrics",
      "routing": {
        "request": {
          "url": "/rest/v1/listing_item_metrics",
          "method": "GET"
        }
      },
      "description": "Retrieve reviews metrics summarized data",
      "resource": "listingItemMetrics"
    },
    {
      "name": "Publish / Schedule",
      "value": "publish",
      "action": "Publish or schedule a media post",
      "routing": {
        "request": {
          "url": "/rest/v1/content_publishing_media",
          "method": "POST"
        }
      },
      "description": "Publish or schedule content publishing media posts",
      "resource": "contentPublishingMedia"
    }
  ]

npm_readme:
  # n8n-nodes-localith

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

  > Access your Google Business reviews, listings, and location metrics directly in n8n — and build powerful automations, dashboards, or your own reputation management platform on top of them.

  ---

  ## 🌐 What is Localith?

  [Localith](https://localith.ai) is a Google Business Profile management platform that gives you full programmatic access to your locations, reviews, and performance metrics.

  Think of it as the **Google Business API made simple**. With this n8n node, you can pull all of that data into any workflow — no complex API setup required.

  ---

  ## 🚀 What can you build?

  | Use Case | Description |
  |---|---|
  | 📊 Custom dashboards | Sync review data to Airtable, Notion, or Google Sheets |
  | 🔔 Review alerts | Get Slack or email notifications the moment a new review comes in |
  | 🤖 AI reply automation | Pipe reviews into an AI node and auto-generate replies |
  | 📈 Reputation reporting | Build weekly performance reports for clients or internal teams |
  | 🏗️ Your own platform | Use Localith as the data layer and build your own review management tool |
  | 🔁 Multi-location sync | Manage hundreds of locations from a single workflow |

  ---

  ## ⚙️ Operations

  ### 📍 Listings
  | Operation | Description |
  |---|---|
  | Get all listings | Fetch all your Google Business locations |
  | Get listing by ID | Retrieve details for a specific location |
  | Update listing | Modify listing information |

  ### ⭐ Reviews
  | Operation | Description |
  |---|---|
  | Get reviews | Fetch all reviews across your locations, with filtering by rating, date, and source |
  | Get review metrics | Aggregate review stats (average rating, total count, trends) |

  ### 📈 Metrics
  | Operation | Description |
  |---|---|
  | Get listing metrics | Impressions, clicks, calls, direction requests per location |
  | Get item metrics | Performance data for individual posts or products |

  ### 📣 Content Publishing
  | Operation | Description |
  |---|---|
  | Publish media | Upload and publish content to your Google Business profiles |

  ---

  ## 🔐 Authentication

  This node uses **API Key** authentication. You can find your API key in your [Localith dashboard](https://localith.ai).

  ---

  ## 📦 Installation

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

  ```
  n8n-nodes-localith
  ```

  ---

  ## 💡 Example — Automated review alerts with AI replies

  ```
  ⏱ Schedule Trigger (every hour)
    ↓
  📍 Localith: Get Reviews (new reviews since last run)
    ↓
  🔀 IF Node (filter 1–3 star reviews)
    ↓
  🤖 OpenAI Node (generate professional reply)
    ↓
  💬 Slack Node (send review + suggested reply for team approval)
  ```

  ---

  ## 🔗 Links

  | | |
  |---|---|
  | 🌐 Website | [localith.ai](https://localith.ai) |
  | 📦 npm | [n8n-nodes-localith](https://www.npmjs.com/package/n8n-nodes-localith) |
  | 💻 GitHub | [localithai/n8n-nodes-localith](https://github.com/localithai/n8n-nodes-localith) |
  | 📖 API Docs | [embedsocial.com/app/api/documentation](https://embedsocial.com/app/api/documentation) |

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the Localith API to access Google Business Profile data, including listings, reviews, and performance metrics.","capabilities":["Fetch all Google Business locations","Retrieve specific location details by ID","Update location listing information","Fetch reviews with filtering by rating, date, and source","Get aggregated review metrics and trends","Retrieve listing performance metrics (impressions, clicks, calls, directions)","Get item metrics for posts or products","Publish media to Google Business profiles"],"authentication":"API Key required","commonUseCases":["Sync review data to external tools like Airtable, Notion, or Google Sheets","Set up automated alerts for new reviews via Slack or email","Generate AI-powered automated replies to customer reviews","Create reputation management dashboards and reports","Manage multiple business locations from a single workflow"],"limitations":[],"relatedNodes":["n8n-nodes-http.request","n8n-nodes-whatsapp.whatsapp","n8n-nodes-slack.slack","n8n-nodes-github.github","n8n-nodes-airtable.airtable"]}


node_type: n8n-nodes-invoice-api-xhub.invoiceXhub
package_name: n8n-nodes-invoice-api-xhub
display_name: invoice-api.xhub
description: Generate, parse, and validate e-invoices across 28 European countries with 18+ formats
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: pa201608
author_github_url: https://github.com/xhubio/
npm_package_name: n8n-nodes-invoice-api-xhub
npm_version: 1.1.2
community_fetched_at: 2026-07-14T14:40:33.713Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "generate",
      "options": [
        {
          "name": "Generate",
          "value": "generate",
          "action": "Generate an e invoice document",
          "description": "Generate an e-invoice document (PDF, XRechnung, ZUGFeRD, etc.)"
        },
        {
          "name": "Get Formats",
          "value": "getFormats",
          "action": "Get supported formats",
          "description": "Get supported countries and formats"
        },
        {
          "name": "Parse",
          "value": "parse",
          "action": "Parse an e invoice document",
          "description": "Parse an e-invoice document and extract invoice data"
        },
        {
          "name": "Parse (Auto-Detect)",
          "value": "parseAutoDetect",
          "action": "Parse an e invoice with auto detection",
          "description": "Parse an e-invoice with automatic country and format detection"
        },
        {
          "name": "Validate",
          "value": "validate",
          "action": "Validate invoice data",
          "description": "Validate invoice data against country-specific rules"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate",
      "value": "generate",
      "action": "Generate an e invoice document",
      "description": "Generate an e-invoice document (PDF, XRechnung, ZUGFeRD, etc.)"
    },
    {
      "name": "Get Formats",
      "value": "getFormats",
      "action": "Get supported formats",
      "description": "Get supported countries and formats"
    },
    {
      "name": "Parse",
      "value": "parse",
      "action": "Parse an e invoice document",
      "description": "Parse an e-invoice document and extract invoice data"
    },
    {
      "name": "Parse (Auto-Detect)",
      "value": "parseAutoDetect",
      "action": "Parse an e invoice with auto detection",
      "description": "Parse an e-invoice with automatic country and format detection"
    },
    {
      "name": "Validate",
      "value": "validate",
      "action": "Validate invoice data",
      "description": "Validate invoice data against country-specific rules"
    }
  ]

npm_readme:
  # n8n-nodes-invoice-api-xhub

  [![npm version](https://badge.fury.io/js/n8n-nodes-invoice-api-xhub.svg)](https://badge.fury.io/js/n8n-nodes-invoice-api-xhub)
  [![npm downloads](https://img.shields.io/npm/dw/n8n-nodes-invoice-api-xhub)](https://www.npmjs.com/package/n8n-nodes-invoice-api-xhub)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
  [![n8n](https://img.shields.io/badge/n8n-community%20node-ff6d5a)](https://docs.n8n.io/integrations/community-nodes/)

  This is the official [invoice-api.xhub](https://invoice-api.xhub.io) community node for [n8n](https://n8n.io/). Generate, parse, and validate e-invoices across 28 European countries and 18+ formats — including XRechnung, ZUGFeRD, Factur-X, FatturaPA, and Peppol — directly from your n8n workflows.

  [Full documentation](https://invoice-api.xhub.io/docs/integrations/n8n) | [API Playground](https://invoice-api.xhub.io/playground) | [OpenAPI Reference](https://service.invoice-api.xhub.io/docs) | [YouTube](https://www.youtube.com/@invoice-api-xhub-io)

  ## Why invoice-api.xhub?

  - **28 countries, 18+ formats** — one unified JSON schema for XRechnung, ZUGFeRD, Factur-X, FatturaPA, UBL, Peppol, and more
  - **Compliance built in** — validation against country-specific rules (EN 16931, B2G/B2B mandates)
  - **No-code automation** — drag-and-drop n8n node with auto-detect parsing, binary file support, and batch processing
  - **Free sandbox** — test with `sk_test_*` keys, no credit card required

  See the [full feature overview](https://invoice-api.xhub.io) and [n8n workflow templates](https://invoice-api.xhub.io/docs/integrations/n8n/templates).

  ## Table of Contents

  - [Why invoice-api.xhub?](#why-invoice-apixhub)
  - [Installation](#installation)
  - [Operations](#operations)
  - [Credentials](#credentials)
  - [Compatibility](#compatibility)
  - [Usage](#usage)
  - [Troubleshooting](#troubleshooting)
  - [Resources](#resources)

  ## Installation

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

  The package name is `n8n-nodes-invoice-api-xhub`.

  For a step-by-step walkthrough, see the [n8n Integration Guide](https://invoice-api.xhub.io/docs/integrations/n8n) or watch the [video walkthrough](https://www.youtube.com/watch?v=DMtHMHrevYw) on YouTube.

  ## Operations

  **Generate**
  - Create e-invoice from JSON data (XRechnung, ZUGFeRD, Factur-X, FatturaPA, and more)

  **Parse**
  - Extract structured invoice data from XML or PDF documents

  **Parse (Auto-Detect)**
  - Parse an invoice with automatic country and format detection — no configuration needed

  **Validate**
  - Validate invoice JSON against country-specific rules and return errors/warnings

  **Get Formats**
  - Retrieve all supported countries and formats, or formats for a specific country

  ## Credentials

  This node requires an API key from [invoice-api.xhub.io](https://invoice-api.xhub.io).

  1. Register at [invoice-api.xhub.io](https://invoice-api.xhub.io) and navigate to **Dashboard → API Keys**
  2. Create a new API key — keys follow the format `sk_live_...` (production) or `sk_test_...` (sandbox)
  3. In n8n, go to **Credentials → New Credential**, search for "invoice-api.xhub API", and enter your key

  The credential test automatically verifies the connection by calling `GET /api/v1/invoice/formats`.

  ## Compatibility

  Tested with n8n **1.94.0** and later.

  Requires Node.js **≥ 22.0**.

  ## Usage

  ### Supported Countries (28)

  | Region | Countries |
  |--------|-----------|
  | DACH | Germany (DE), Austria (AT), Switzerland (CH) |
  | Western Europe | France (FR), Belgium (BE), Netherlands (NL), Luxembourg (LU), Ireland (IE), United Kingdom (GB) |
  | Southern Europe | Italy (IT), Spain (ES), Portugal (PT), Greece (GR), Cyprus (CY), Malta (MT) |
  | Northern Europe | Denmark (DK), Sweden (SE), Finland (FI), Norway (NO) |
  | Baltics | Estonia (EE), Latvia (LV), Lithuania (LT) |
  | Central & Eastern Europe | Poland (PL), Czech Republic (CZ), Hungary (HU), Slovenia (SI), Romania (RO), Bulgaria (BG) |

  ### Supported Formats

  `pdf` · `ubl` · `peppol-ubl` · `zugferd` · `xrechnung` · `ebinterface` · `qr-bill` · `facturx` · `fatturapa` · `facturae` · `isdoc` · `nav` · `mydata` · `cii` · `ksef` · `efactura` · `saft`

  For format details and country-specific requirements, see the [API documentation](https://invoice-api.xhub.io/docs).

  ### Minimal Example: Generate a German XRechnung

  ```json
  {
    "operation": "generate",
    "countryCode": "DE",
    "format": "xrechnung",
    "invoiceData": {
      "type": "invoice",
      "invoiceNumber": "INV-2025-001",
      "issueDate": "2025-01-15",
      "dueDate": "2025-02-14",
      "currency": "EUR",
      "seller": { "name": "ACME GmbH", "street": "Hauptstraße 1", "city": "Berlin", "postalCode": "10115", "countryCode": "DE", "vatId": "DE123456789" },
      "buyer": { "name": "Customer AG", "street": "Nebenstraße 2", "city": "München", "postalCode": "80331", "countryCode": "DE" },
      "countrySpecific": { "buyerReference": "BUYER-REF-001" },
      "items": [{ "position": 1, "description": "Consulting", "quantity": 10, "unit": "HUR", "unitPrice": 150.00, "netAmount": 1500.00, "taxRate": 19, "taxAmount": 285.00, "grossAmount": 1785.00 }],
      "taxSummary": [{ "taxRate": 19, "netAmount": 1500.00, "taxAmount": 285.00 }],
      "subtotal": 1500.00,
      "total": 1785.00,
      "paymentTerms": { "dueDays": 30 }
    }
  }
  ```

  For the full invoice data schema, all parameters, and workflow examples see the [API Reference](docs/API-REFERENCE.md) and [n8n workflow templates](https://invoice-api.xhub.io/docs/integrations/n8n/templates).

  ## Troubleshooting

  | Issue | Solution |
  |-------|----------|
  | `401 Unauthorized` | Check your API key format (`sk_live_*` or `sk_test_*`) and that it's entered in the credential |
  | `Invalid VAT ID` | Ensure VAT IDs include the country prefix (e.g., `DE123456789`) |
  | Binary output is empty | Set "Output Binary" to `true` and check the binary property name (default: `data`) |
  | Request timeout | For large batches, increase the n8n node timeout or process invoices in smaller chunks |
  | Format not found | Use the "Get Formats" operation to list available formats for a country |

  For more help, see the [full troubleshooting guide](https://invoice-api.xhub.io/docs/integrations/n8n) or contact support@xhub.io.

  ## Resources

  - [invoice-api.xhub Website](https://invoice-api.xhub.io) — pricing, features, and documentation
  - [n8n Integration Guide](https://invoice-api.xhub.io/docs/integrations/n8n) — setup, workflow templates, and FAQ
  - [API Playground](https://invoice-api.xhub.io/playground) — test API calls in your browser
  - [OpenAPI Documentation](https://service.invoice-api.xhub.io/docs) — full endpoint reference
  - [API Reference (this repo)](docs/API-REFERENCE.md)
  - [YouTube Channel](https://www.youtube.com/@invoice-api-xhub-io) — video tutorials and product updates
  - [Video Tutorial](https://www.youtube.com/watch?v=DMtHMHrevYw) — automate e-invoicing with n8n (XRechnung & ZUGFeRD)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/) — how to install community nodes
  - [GitHub Repository](https://github.com/xhubio/n8n-nodes-invoice-api-xhub)
  - **Support:** support@xhub.io

  ## Version History

  See [Releases](https://github.com/xhubio/n8n-nodes-invoice-api-xhub/releases) for the full changelog.

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"A community n8n node that generates, parses, and validates e-invoices across 14 European countries supporting 18+ formats.","capabilities":["Generate e-invoices from JSON data in various formats (XRechnung, ZUGFeRD, Factur-X, FatturaPA)","Parse e-invoices from XML or PDF documents","Auto-detect invoice country and format","Validate invoice data against country-specific rules","Retrieve supported countries and formats"],"authentication":"API key required (sk_live_ or sk_test_ prefix)","commonUseCases":["Automated invoice generation for European businesses","Invoice data extraction and processing workflows","Cross-border e-invoice validation","Automated document handling for accounting systems"],"limitations":["Limited to 14 European countries","Supports 18+ formats but specific format support may vary by country","Requires manual API key setup in n8n credentials"],"relatedNodes":["n8n-nodes-base-code","n8n-nodes-base-http-request","n8n-nodes-base-binary-file"]}


node_type: n8n-nodes-adyntel.adyntel
package_name: n8n-nodes-adyntel
display_name: Adyntel API
description: Learn if a domain is running ads or not using the Adyntel API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: andrei-adyntel
author_github_url: https://github.com/Adyntel/adyntel-n8n-node.git
npm_package_name: n8n-nodes-adyntel
npm_version: 0.3.0
community_fetched_at: 2026-07-14T14:40:33.714Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "facebookAds",
      "options": [
        {
          "name": "Facebook Ad",
          "value": "facebookAds"
        },
        {
          "name": "Google Ad",
          "value": "googleAds"
        },
        {
          "name": "LinkedIn Ad",
          "value": "linkedInAds"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search facebook ads",
          "routing": {
            "request": {
              "url": "/facebook",
              "body": {
                "company_domain": "={{$parameter.companyDomain}}"
              },
              "method": "POST"
            }
          },
          "description": "Search Facebook ads for a company domain"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebookAds"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search google ads",
          "routing": {
            "request": {
              "url": "/google",
              "body": {
                "company_domain": "={{$parameter.companyDomain}}"
              },
              "method": "POST"
            }
          },
          "description": "Search Google ads for a company domain"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "googleAds"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search linked in ads",
          "routing": {
            "request": {
              "url": "/linkedin",
              "body": {
                "company_domain": "={{$parameter.companyDomain}}"
              },
              "method": "POST"
            }
          },
          "description": "Search LinkedIn ads for a company domain"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "linkedInAds"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Search",
      "value": "search",
      "action": "Search facebook ads",
      "routing": {
        "request": {
          "url": "/facebook",
          "body": {
            "company_domain": "={{$parameter.companyDomain}}"
          },
          "method": "POST"
        }
      },
      "description": "Search Facebook ads for a company domain",
      "resource": "facebookAds"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search google ads",
      "routing": {
        "request": {
          "url": "/google",
          "body": {
            "company_domain": "={{$parameter.companyDomain}}"
          },
          "method": "POST"
        }
      },
      "description": "Search Google ads for a company domain",
      "resource": "googleAds"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search linked in ads",
      "routing": {
        "request": {
          "url": "/linkedin",
          "body": {
            "company_domain": "={{$parameter.companyDomain}}"
          },
          "method": "POST"
        }
      },
      "description": "Search LinkedIn ads for a company domain",
      "resource": "linkedInAds"
    }
  ]

npm_readme:
  # n8n-nodes-adyntel

  This is an n8n community node. It lets you use Adyntel's API in your n8n workflows.

  Adyntel is an Ad Intelligence Platform that helps you uncover competitor and prospect ads across Google, Meta (Facebook), and LinkedIn. Use this node to discover who's running ads on these platforms and analyze their advertising strategies.

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

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

  ## Installation

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

  In brief, you can install this node by:

  1. Going to **Settings** → **Community Nodes**
  2. Clicking **Install a community node**
  3. Entering `n8n-nodes-adyntel`
  4. Clicking **Install**

  Alternatively, you can install it via npm in your n8n installation directory:

  ```bash
  npm install n8n-nodes-adyntel
  ```

  ## Operations

  ### Get Facebook Ads

  Retrieves Facebook ads data for a specified company domain. This operation allows you to discover what Facebook ads a company is running, including ad creatives, targeting information, and campaign details.

  **Parameters:**
  - **Company Domain** (required): The domain of the company you want to get Facebook ads data for (e.g., `example.com`). You can enter this directly or use an expression to reference data from previous nodes, such as `={{$json.domain}}`.

  ## Credentials

  To use this node, you need to authenticate with Adyntel using your API credentials.

  ### Prerequisites

  1. Sign up for an Adyntel account at [https://adyntel.com](https://adyntel.com)
  2. Get your API key from your Adyntel Dashboard

  ### Setting up credentials

  1. In the Adyntel node, click on **Credentials** → **Create New**
  2. Select **Adyntel API**
  3. Enter the following:
     - **API Key**: Your Adyntel API key (found in your Dashboard)
     - **Email**: The email address associated with your Adyntel account
  4. Click **Save**

  Your API key and email are used to authenticate all API requests to Adyntel's services.

  ## Compatibility

  - **Minimum n8n version**: Compatible with n8n version 1.0.0 and above
  - **Node.js version**: Requires Node.js 20.15 or higher

  ## Usage

  ### Basic Example

  1. Add the **Adyntel** node to your workflow
  2. Configure your **Adyntel API** credentials (see [Credentials](#credentials) above)
  3. Select the **Get Facebook Ads** operation
  4. Enter the **Company Domain** you want to analyze (e.g., `example.com`)
  5. Execute the node to retrieve Facebook ads data

  ### Using with Previous Nodes

  You can use the Company Domain parameter with expressions to dynamically pull domains from previous nodes:

  **Example workflow:**
  1. Use a node to fetch a list of companies (e.g., from a CRM or database)
  2. Connect the **Adyntel** node
  3. In the **Company Domain** field, use an expression like `={{$json.domain}}` or `={{$json.companyDomain}}`
  4. The node will automatically process each company domain from the previous node's output

  ### Example Use Cases

  - **Competitor Analysis**: Monitor what ads your competitors are running on Facebook
  - **Prospect Research**: Discover which companies in your target market are actively advertising
  - **CRM Enrichment**: Enrich your CRM data with ad intelligence information
  - **ABM Segmentation**: Segment your ABM prospects by ad creative type or campaign strategy

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Adyntel Documentation](https://docs.adyntel.com)
  * [Adyntel Website](https://adyntel.com)
  * [Adyntel API Authorization Guide](https://docs.adyntel.com/authorization)

ai_documentation_summary:
  {"purpose":"This n8n community node enables users to analyze a company's advertising activity on Facebook by retrieving ad data, creatives, targeting information, and campaign details using the Adyntel API.","capabilities":["Retrieve Facebook ads data for a specified company domain","Access ad creatives","Retrieve targeting information","Retrieve campaign details","Support dynamic domain input via expressions from previous nodes"],"authentication":"API Key required (along with account email)","commonUseCases":["Competitor analysis on Facebook ads","Prospect research for active advertisers","CRM enrichment with ad intelligence","Account-Based Marketing (ABM) segmentation"],"limitations":["Limited to Facebook platform only (does not support Google or LinkedIn as mentioned in Adyntel's general description)","Requires separate Adyntel account and API key setup"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code","n8n-nodes-base.set"]}


node_type: n8n-nodes-wavix-api.wavixApi
package_name: n8n-nodes-wavix-api
display_name: Wavix
description: Send and retrieve SMS/MMS messages using Wavix
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: wavix
author_github_url: https://github.com/Wavix/
npm_package_name: n8n-nodes-wavix-api
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:33.715Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "sms",
      "options": [
        {
          "name": "SMS",
          "value": "sms"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendSms",
      "options": [
        {
          "name": "Send SMS",
          "value": "sendSms",
          "action": "Send SMS",
          "routing": {
            "request": {
              "url": "/v3/messages/idempotent",
              "method": "POST"
            }
          }
        },
        {
          "name": "Get SMS",
          "value": "getSmsByUuid",
          "action": "Get SMS by UUID",
          "routing": {
            "request": {
              "url": "=/v3/messages/{{$parameter.uuid}}",
              "method": "GET"
            }
          },
          "description": "Get SMS by UUID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sms"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send SMS",
      "value": "sendSms",
      "action": "Send SMS",
      "routing": {
        "request": {
          "url": "/v3/messages/idempotent",
          "method": "POST"
        }
      },
      "resource": "sms"
    },
    {
      "name": "Get SMS",
      "value": "getSmsByUuid",
      "action": "Get SMS by UUID",
      "routing": {
        "request": {
          "url": "=/v3/messages/{{$parameter.uuid}}",
          "method": "GET"
        }
      },
      "description": "Get SMS by UUID",
      "resource": "sms"
    }
  ]

npm_readme:
  # n8n-nodes-wavix-api

  This is an n8n community node that lets you use the [Wavix](https://wavix.com) SMS API in your n8n workflows.

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

  ## Installation

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

  ## Operations

  ### SMS

  - **Send SMS** — Send an SMS/MMS message with support for media attachments, smart encoding, callback URLs, validity period, tags, and idempotency.
  - **Get SMS** — Retrieve an SMS message by its UUID.

  ## Credentials

  You need a Wavix API key. Generate one from your [Wavix dashboard](https://wavix.com) and add it as an API Key credential in n8n.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Wavix API documentation](https://wavix.com/api)

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with the Wavix SMS API to send and retrieve SMS/MMS messages within n8n workflows.","capabilities":["Send SMS messages","Send MMS messages","Attach media files to messages","Support smart encoding","Configure callback URLs","Set message validity periods","Add tags to messages","Enable idempotency","Retrieve SMS messages by UUID"],"authentication":"API key required","commonUseCases":["Automated SMS notifications in business workflows","Two-factor authentication (2FA) implementation","Order confirmations and delivery updates","Marketing campaigns via SMS"],"limitations":[],"relatedNodes":["n8n-nodes-http.request","n8n-nodes-wavix-api"]}


node_type: @optimizely-campaign/n8n-nodes-optimizely-campaign.optimizelyCampaignTrigger
package_name: @optimizely-campaign/n8n-nodes-optimizely-campaign
display_name: Optimizely Campaign Trigger
description: Handle Optimizely Campaign events via webhooks
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: optimizely-campaign
author_github_url: https://github.com/optimizely-campaign/campaign-n8n-nodes.git
npm_package_name: @optimizely-campaign/n8n-nodes-optimizely-campaign
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:33.716Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-optimizely-campaign

  This package provides **n8n community nodes** for interacting with the **Optimizely Campaign API**.

  It enables you to process response data in real time using webhooks, manage recipients, and send transactional emails directly from your n8n workflows.

  ## Features

  - 📡 **Webhook Trigger**
    - Receive and process response data from Optimizely Campaign in real time
    - Ideal for event-driven and reactive workflows

  - 👥 **Recipient Management**
    - Create new recipients
    - Update existing recipients
    - Manage recipient data programmatically

  - ✉️ **Transactional Emails**
    - Send transactional emails via Optimizely Campaign
    - Integrate email delivery into automated workflows


  ## Installation

  ### Community Nodes (self-hosted)

  1. Open **Settings → Community Nodes**
  2. Click **Install**
  3. Enter the package name: `@optimizely-campaign/n8n-nodes-optimizely-campaign`
  4. Click **Install**

  ### Manual Installation (self-hosted)

  ```bash
  npm install @optimizely-campaign/n8n-nodes-optimizely-campaign
  ```

  After installation, restart your n8n instance to load the new nodes.

  ## Credentials

  To use this node, you need **Optimizely Campaign API credentials**. These must be requested from Optimizely Campaign Support.

  ### How to obtain API credentials:

  1. Contact **Optimizely Campaign Support** at [campaignsupport@optimizely.com](mailto:campaignsupport@optimizely.com)
  2. Request an **API user** for your Optimizely Campaign account
  3. You will receive:
     - **API Username** (API-User)
     - **API Password**
     - **Client ID** (mandator ID)

  ### Setting up credentials in n8n:

  1. In n8n, go to **Credentials** → **New**
  2. Search for **Optimizely Campaign API**
  3. Enter your credentials:
     - **API-User**: Your API username
     - **Password**: Your API password
     - **Client**: Your Client/Mandator ID
  4. Click **Save**

  The credentials will be automatically tested by calling the `/users/authenticated` endpoint.

  ## Compatibility

  Tested with:
  - n8n version **1.112.0** and later
  - Optimizely Campaign API (REST API v1)

  ## Usage

  ### Example 1: Create a Recipient

  1. Add the **Optimizely Campaign** node to your workflow
  2. Select **Recipient** as the resource
  3. Select **Create** as the operation
  4. Choose your recipient list
  5. Select the recipient ID field (usually email)
  6. Map your data fields using the Resource Mapper
  7. Optionally trigger an opt-in process

  ### Example 2: Send Transactional Email

  1. Add the **Optimizely Campaign** node
  2. Select **Transactional Mail** as the resource
  3. Choose your transactional mailing
  4. Select the recipient list
  5. Map recipient data including the ID field
  6. Execute to send the email

  ### Example 3: Webhook Trigger for Campaign Events

  1. Add the **Optimizely Campaign Trigger** node
  2. Select the event type (e.g., Click, Open, Bounce)
  3. The webhook URL will be automatically registered with Optimizely Campaign
  4. Process incoming webhook data in your workflow

  ## Operations

  ### Recipient Resource

  - **Create**: Create a new recipient in a recipient list
  - **Get Recipient**: Retrieve recipient data with selected attributes  
  - **Update**: Update an existing recipient's data

  ### Transactional Mail Resource

  - **Send**: Send a transactional email to a recipient

  ### Webhook Trigger

  Available events:
  - Archive, Blocklist, Bounce, Click, Confirmed Opt-In, Double Opt-In
  - Filtered by Blocklist, Open, Sent, Single Opt-In, Spam Complaint, Unsubscribe

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Optimizely Campaign API Documentation](https://support.optimizely.com/hc/en-us/articles/4413200461197)
  - [Optimizely Campaign](https://www.optimizely.com/products/campaign/)
  - [GitHub Repository](https://github.com/optimizely-campaign/campaign-n8n-nodes)

  ## Support

  For issues or questions:
  - **API Access & Credentials**: Contact [campaignsupport@optimizely.com](mailto:campaignsupport@optimizely.com)
  - **General Questions**: Refer to the [Optimizely Campaign Support](https://support.optimizely.com/hc/en-us/categories/4413188107405-Optimizely-Campaign)


  ## License

  [MIT](LICENSE.md)

  ---

  **Developed by:** Optimizely Campaign Integration Management Team

ai_documentation_summary:
  {"purpose":"This n8n community node enables real-time processing of Optimizely Campaign events via webhooks, manages recipients, and sends transactional emails directly from n8n workflows.","capabilities":["Webhook trigger for campaign events","Create new recipients","Update existing recipients","Retrieve recipient data","Send transactional emails","Manage recipient lists programmatically"],"authentication":"API key required (API Username, API Password, and Client/Mandator ID)","commonUseCases":["Real-time processing of campaign events like clicks, opens, or bounces","Automated recipient onboarding and data management","Triggering transactional email campaigns based on workflow conditions"],"limitations":["Requires manual API credentials from Optimizely Campaign Support","Compatible only with n8n version 1.112.0 and later","Uses Optimizely Campaign REST API v1"],"relatedNodes":["Optimizely Campaign","Webhook Trigger","HTTP Request"]}


node_type: @optimizely-campaign/n8n-nodes-optimizely-campaign.optimizelyCampaign
package_name: @optimizely-campaign/n8n-nodes-optimizely-campaign
display_name: Optimizely Campaign
description: Optimizely Campaign
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: optimizely-campaign
author_github_url: https://github.com/optimizely-campaign/campaign-n8n-nodes.git
npm_package_name: @optimizely-campaign/n8n-nodes-optimizely-campaign
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:33.717Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "recipient",
      "options": [
        {
          "name": "Recipient",
          "value": "recipient"
        },
        {
          "name": "Transactional Mail",
          "value": "transactionalMail"
        }
      ],
      "required": true,
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a recipient",
          "description": "Create a recipient"
        },
        {
          "name": "Get Recipient",
          "value": "getRecipient",
          "action": "Get a recipient",
          "description": "Get a recipient with selected attributes"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a recipient",
          "description": "Update a recipient"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "recipient"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send a transactional mail"
        }
      ],
      "required": true,
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transactionalMail"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a recipient",
      "description": "Create a recipient",
      "resource": "recipient"
    },
    {
      "name": "Get Recipient",
      "value": "getRecipient",
      "action": "Get a recipient",
      "description": "Get a recipient with selected attributes",
      "resource": "recipient"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a recipient",
      "description": "Update a recipient",
      "resource": "recipient"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send a transactional mail",
      "resource": "transactionalMail"
    }
  ]

npm_readme:
  # n8n-nodes-optimizely-campaign

  This package provides **n8n community nodes** for interacting with the **Optimizely Campaign API**.

  It enables you to process response data in real time using webhooks, manage recipients, and send transactional emails directly from your n8n workflows.

  ## Features

  - 📡 **Webhook Trigger**
    - Receive and process response data from Optimizely Campaign in real time
    - Ideal for event-driven and reactive workflows

  - 👥 **Recipient Management**
    - Create new recipients
    - Update existing recipients
    - Manage recipient data programmatically

  - ✉️ **Transactional Emails**
    - Send transactional emails via Optimizely Campaign
    - Integrate email delivery into automated workflows


  ## Installation

  ### Community Nodes (self-hosted)

  1. Open **Settings → Community Nodes**
  2. Click **Install**
  3. Enter the package name: `@optimizely-campaign/n8n-nodes-optimizely-campaign`
  4. Click **Install**

  ### Manual Installation (self-hosted)

  ```bash
  npm install @optimizely-campaign/n8n-nodes-optimizely-campaign
  ```

  After installation, restart your n8n instance to load the new nodes.

  ## Credentials

  To use this node, you need **Optimizely Campaign API credentials**. These must be requested from Optimizely Campaign Support.

  ### How to obtain API credentials:

  1. Contact **Optimizely Campaign Support** at [campaignsupport@optimizely.com](mailto:campaignsupport@optimizely.com)
  2. Request an **API user** for your Optimizely Campaign account
  3. You will receive:
     - **API Username** (API-User)
     - **API Password**
     - **Client ID** (mandator ID)

  ### Setting up credentials in n8n:

  1. In n8n, go to **Credentials** → **New**
  2. Search for **Optimizely Campaign API**
  3. Enter your credentials:
     - **API-User**: Your API username
     - **Password**: Your API password
     - **Client**: Your Client/Mandator ID
  4. Click **Save**

  The credentials will be automatically tested by calling the `/users/authenticated` endpoint.

  ## Compatibility

  Tested with:
  - n8n version **1.112.0** and later
  - Optimizely Campaign API (REST API v1)

  ## Usage

  ### Example 1: Create a Recipient

  1. Add the **Optimizely Campaign** node to your workflow
  2. Select **Recipient** as the resource
  3. Select **Create** as the operation
  4. Choose your recipient list
  5. Select the recipient ID field (usually email)
  6. Map your data fields using the Resource Mapper
  7. Optionally trigger an opt-in process

  ### Example 2: Send Transactional Email

  1. Add the **Optimizely Campaign** node
  2. Select **Transactional Mail** as the resource
  3. Choose your transactional mailing
  4. Select the recipient list
  5. Map recipient data including the ID field
  6. Execute to send the email

  ### Example 3: Webhook Trigger for Campaign Events

  1. Add the **Optimizely Campaign Trigger** node
  2. Select the event type (e.g., Click, Open, Bounce)
  3. The webhook URL will be automatically registered with Optimizely Campaign
  4. Process incoming webhook data in your workflow

  ## Operations

  ### Recipient Resource

  - **Create**: Create a new recipient in a recipient list
  - **Get Recipient**: Retrieve recipient data with selected attributes  
  - **Update**: Update an existing recipient's data

  ### Transactional Mail Resource

  - **Send**: Send a transactional email to a recipient

  ### Webhook Trigger

  Available events:
  - Archive, Blocklist, Bounce, Click, Confirmed Opt-In, Double Opt-In
  - Filtered by Blocklist, Open, Sent, Single Opt-In, Spam Complaint, Unsubscribe

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Optimizely Campaign API Documentation](https://support.optimizely.com/hc/en-us/articles/4413200461197)
  - [Optimizely Campaign](https://www.optimizely.com/products/campaign/)
  - [GitHub Repository](https://github.com/optimizely-campaign/campaign-n8n-nodes)

  ## Support

  For issues or questions:
  - **API Access & Credentials**: Contact [campaignsupport@optimizely.com](mailto:campaignsupport@optimizely.com)
  - **General Questions**: Refer to the [Optimizely Campaign Support](https://support.optimizely.com/hc/en-us/categories/4413188107405-Optimizely-Campaign)


  ## License

  [MIT](LICENSE.md)

  ---

  **Developed by:** Optimizely Campaign Integration Management Team

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the Optimizely Campaign API to manage recipients, send transactional emails, and process real-time campaign events via webhooks.","capabilities":["Create new recipients in a recipient list","Update existing recipient data","Retrieve recipient data with selected attributes","Send transactional emails via Optimizely Campaign","Receive real-time campaign events (e.g., Click, Open, Bounce) via webhooks","Manage opt-in processes (Single Opt-In, Double Opt-In, Confirmed Opt-In)"],"authentication":"API key required (API Username, Password, and Client/Mandator ID)","commonUseCases":["Automated email marketing campaigns","Real-time processing of campaign engagement events","Managing subscriber lists and opt-in workflows","Sending transactional notifications through Optimizely"],"limitations":["Requires manual API credentials obtained from Optimizely Campaign Support","Compatible with Optimizely Campaign API REST v1 only","Requires n8n version 1.112.0 or later"],"relatedNodes":["Optimizely Campaign Trigger","Optimizely Campaign API"]}


node_type: n8n-nodes-docupotion.docupotion
package_name: n8n-nodes-docupotion
display_name: DocuPotion - Generate PDF Documents
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: docupotion
author_github_url: https://github.com/docupotion/
npm_package_name: n8n-nodes-docupotion
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:33.718Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Automatically create PDFs from a reusable template. Use our AI-powered document editor to create your template in minutes and generate error-free PDFs at scale.

properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "createDocument",
      "options": [
        {
          "name": "Create Document",
          "value": "createDocument",
          "action": "Create a document",
          "description": "Create a document from a template"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Document",
      "value": "createDocument",
      "action": "Create a document",
      "description": "Create a document from a template"
    }
  ]

npm_readme:
  # n8n-nodes-docupotion

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

  [DocuPotion](https://docupotion.com/) is a document generation and automation tool. It lets you design professional-looking document templates using a drag and drop editor. You can generate PDFs of these templates and fill them with your own data in an n8n workflow.

  [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

  | Operation | Description |
  |-----------|-------------|
  | Create Document | Generate a PDF document from a DocuPotion template |

  ### Output options

  | Option | Description |
  |--------|-------------|
  | File | Returns the document as binary data for use in subsequent workflow steps (e.g. email attachments, cloud storage uploads) |
  | URL | Returns a temporary presigned URL to the generated document |
  | Base64 | Returns the document as a base64-encoded string |

  ## Credentials

  To use this node, you need a DocuPotion account:

  1. Sign up at [app.docupotion.com](https://app.docupotion.com/register)
  2. Copy your API Key from the dashboard
  3. In n8n, add a new **DocuPotion API** credential and paste your API Key

  ## Compatibility

  Tested with n8n v1.71.0 and above.

  ## Usage

  1. Add the **DocuPotion** node to your workflow
  2. Select your DocuPotion API credentials
  3. Enter the **Template ID** of the template you want to generate
  4. Choose an **Output** type:
     - **File** (default) — returns binary data you can pass to nodes like Send Email, Google Drive, Write Binary File, etc. You can set a custom file name.
     - **URL** — returns a temporary link to the document. You can configure how long the URL remains valid (1–10,080 minutes).
     - **Base64** — returns the raw base64-encoded document data in the JSON output.
  5. Optionally provide **Template Data** as a JSON object to fill in dynamic template variables

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [n8n + DocuPotion quickstart guide](https://docs.docupotion.com/article/67-n8n-quickstart-creating-a-document-in-a-workflow)
  * [DocuPotion API docs](https://docupotion.com/api-docs)
  * [DocuPotion knowledge base](https://docs.docupotion.com/)

  ## Version history

  ### 0.1.0

  Initial release with the following features:

  - **Create Document** operation — generate PDFs from DocuPotion templates
  - **Output options** — File (binary), URL (presigned), or Base64
  - **Template Data** — pass dynamic variables as JSON to populate templates

ai_documentation_summary:
  {"purpose":"Generates PDF documents from DocuPotion templates by populating them with dynamic data within n8n workflows.","capabilities":["Create PDF documents from DocuPotion templates","Fill templates with dynamic variables via JSON data","Return output as binary file data","Return output as presigned URL","Return output as base64-encoded string"],"authentication":"API key required (DocuPotion API Key)","commonUseCases":["Generating invoice PDFs with customer data","Creating personalized marketing materials","Producing contract documents with variable terms","Exporting reports to cloud storage or email"],"limitations":["Requires a separate DocuPotion account and API key","Output as URL returns a temporary link with configurable validity (1–10,080 minutes)","Compatible only with n8n v1.71.0 and above"],"relatedNodes":["Binary File","Send Email","Google Drive","Write Binary File","HTTP Request"]}


node_type: n8n-nodes-recram.recramTrigger
package_name: n8n-nodes-recram
display_name: RecRam Trigger
description: Starts workflow when a RecRam event occurs
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: recram
author_github_url: https://github.com/therecram/
npm_package_name: n8n-nodes-recram
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:33.719Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-recram

  This is an n8n community node for [RecRam](https://recram.com) — the AI-powered video survey platform.

  ## Features

  ### RecRam Trigger
  Starts a workflow when a RecRam event occurs:
  - **Form Response Completed** — Triggered after all video processing and AI analysis
  - **Form Response Submitted** — Triggered immediately on submission

  ### RecRam (Actions)
  Interact with the RecRam API:
  - **Forms**: List all, Get by ID
  - **Responses**: List all, Get by ID

  ## Setup

  1. In RecRam, go to **Settings → API Keys** and create a new key with `webhooks:read`, `webhooks:write`, `forms:read`, `answers:read` scopes
  2. In n8n, add **RecRam API** credentials with your API key
  3. Add a **RecRam Trigger** node and select the event type
  4. Activate the workflow — webhook is automatically registered

  ## Installation

  ### Community Nodes (recommended)

  1. Go to **Settings → Community Nodes**
  2. Select **Install a community node**
  3. Enter `n8n-nodes-recram`
  4. Agree to the risks and install

  ### Manual

  ```bash
  cd ~/.n8n/nodes
  npm install n8n-nodes-recram
  ```

  ## Resources

  - [RecRam Website](https://recram.com)
  - [RecRam Help Center](https://recram.com/help)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community n8n node that triggers workflows when RecRam events occur or allows interaction with the RecRam API to manage forms and responses.","capabilities":["Trigger workflow on Form Response Completed event","Trigger workflow on Form Response Submitted event","List all RecRam forms","Get a specific form by ID","List all RecRam responses","Get a specific response by ID"],"authentication":"API key required (with scopes: webhooks:read, webhooks:write, forms:read, answers:read)","commonUseCases":["Automate data collection workflows when video surveys are completed","Process survey responses immediately upon submission","Manage and retrieve form and response data programmatically"],"limitations":["Community node (requires manual installation or community node approval)","Requires RecRam account with specific API scopes"],"relatedNodes":["RecRam API","n8n-nodes-recram.recramForm","n8n-nodes-recram.recramResponse"]}


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

updated_at: 2026-07-14 14:40:33
author_name: recram
author_github_url: https://github.com/therecram/
npm_package_name: n8n-nodes-recram
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:33.720Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "form",
      "options": [
        {
          "name": "Form",
          "value": "form"
        },
        {
          "name": "Response",
          "value": "response"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get All",
          "value": "getAll",
          "action": "Get all forms",
          "description": "List all forms"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a form",
          "description": "Get a form by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "form"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get All",
          "value": "getAll",
          "action": "Get all responses",
          "description": "List all responses"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a response",
          "description": "Get a response by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "response"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get All",
      "value": "getAll",
      "action": "Get all forms",
      "description": "List all forms",
      "resource": "form"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a form",
      "description": "Get a form by ID",
      "resource": "form"
    },
    {
      "name": "Get All",
      "value": "getAll",
      "action": "Get all responses",
      "description": "List all responses",
      "resource": "response"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a response",
      "description": "Get a response by ID",
      "resource": "response"
    }
  ]

npm_readme:
  # n8n-nodes-recram

  This is an n8n community node for [RecRam](https://recram.com) — the AI-powered video survey platform.

  ## Features

  ### RecRam Trigger
  Starts a workflow when a RecRam event occurs:
  - **Form Response Completed** — Triggered after all video processing and AI analysis
  - **Form Response Submitted** — Triggered immediately on submission

  ### RecRam (Actions)
  Interact with the RecRam API:
  - **Forms**: List all, Get by ID
  - **Responses**: List all, Get by ID

  ## Setup

  1. In RecRam, go to **Settings → API Keys** and create a new key with `webhooks:read`, `webhooks:write`, `forms:read`, `answers:read` scopes
  2. In n8n, add **RecRam API** credentials with your API key
  3. Add a **RecRam Trigger** node and select the event type
  4. Activate the workflow — webhook is automatically registered

  ## Installation

  ### Community Nodes (recommended)

  1. Go to **Settings → Community Nodes**
  2. Select **Install a community node**
  3. Enter `n8n-nodes-recram`
  4. Agree to the risks and install

  ### Manual

  ```bash
  cd ~/.n8n/nodes
  npm install n8n-nodes-recram
  ```

  ## Resources

  - [RecRam Website](https://recram.com)
  - [RecRam Help Center](https://recram.com/help)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community n8n node that allows users to interact with the RecRam API for video survey data, including triggering workflows on form events and managing forms/responses.","capabilities":["Trigger workflow on Form Response Completed event","Trigger workflow on Form Response Submitted event","List all forms","Get a form by ID","List all responses","Get a response by ID"],"authentication":"API key required (with webhooks:read, webhooks:write, forms:read, answers:read scopes)","commonUseCases":["Automate video survey data collection workflows","Process AI-analyzed video responses immediately upon submission","Retrieve and analyze survey form data programmatically"],"limitations":["Community node (may have fewer updates or support than official nodes)","Requires specific API scopes to be granted in RecRam settings"],"relatedNodes":["RecRam API","RecRam Trigger"]}


node_type: @watchflow/n8n-nodes-watchflow.watchflow
package_name: @watchflow/n8n-nodes-watchflow
display_name: Watchflow (n8n Monitoring Suite)
description: Heartbeat monitoring for your cron jobs and scheduled tasks.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: henriklippke
author_github_url: https://github.com/watchflow/n8n-nodes-watchflow.git
npm_package_name: @watchflow/n8n-nodes-watchflow
npm_version: 0.14.0
community_fetched_at: 2026-07-14T14:40:33.721Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "workflowMonitoring",
      "options": [
        {
          "name": "Workflow Monitoring (Recommended)",
          "value": "workflowMonitoring"
        },
        {
          "name": "Generic Heartbeat (Advanced)",
          "value": "heartbeat"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "reportFailure",
      "options": [
        {
          "name": "Report a Failed Run",
          "value": "reportFailure",
          "action": "Report a failed run",
          "description": "Place behind the global Error Trigger; pulls workflow and error automatically"
        },
        {
          "name": "Report a Successful Run",
          "value": "reportSuccess",
          "action": "Report a successful run",
          "description": "Place at the end of the workflow; heartbeat plus your metrics"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "workflowMonitoring"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "ping",
      "options": [
        {
          "name": "Send a Success Ping",
          "value": "ping",
          "action": "Send a success ping",
          "description": "Simple ping to mark the job as successful"
        },
        {
          "name": "Send a Failure Ping",
          "value": "fail",
          "action": "Send a failure ping",
          "description": "Mark the job as failed with an error message"
        },
        {
          "name": "Send a Start Ping",
          "value": "start",
          "action": "Send a start ping",
          "description": "Start job tracking for duration measurement"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "heartbeat"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Report a Failed Run",
      "value": "reportFailure",
      "action": "Report a failed run",
      "description": "Place behind the global Error Trigger; pulls workflow and error automatically",
      "resource": "workflowMonitoring"
    },
    {
      "name": "Report a Successful Run",
      "value": "reportSuccess",
      "action": "Report a successful run",
      "description": "Place at the end of the workflow; heartbeat plus your metrics",
      "resource": "workflowMonitoring"
    },
    {
      "name": "Send a Success Ping",
      "value": "ping",
      "action": "Send a success ping",
      "description": "Simple ping to mark the job as successful",
      "resource": "heartbeat"
    },
    {
      "name": "Send a Failure Ping",
      "value": "fail",
      "action": "Send a failure ping",
      "description": "Mark the job as failed with an error message",
      "resource": "heartbeat"
    },
    {
      "name": "Send a Start Ping",
      "value": "start",
      "action": "Send a start ping",
      "description": "Start job tracking for duration measurement",
      "resource": "heartbeat"
    }
  ]

npm_readme:
  # @watchflow/n8n-nodes-watchflow

  Watchflow (n8n Monitoring Suite) is an n8n community node for [Watchflow.io](https://www.watchflow.io/). It allows you to send heartbeats from your n8n workflows to monitor their health and execution time.


  ## Installation

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

  ## Credentials

  To use this node, you'll need a Watchflow API Key. You can get one from the [Watchflow Dashboard](https://app.watchflow.io).

  ## Resources & Operations

  ### Heartbeat

  Monitor your scheduled tasks and cron jobs.

  #### Operations:
  - **Ping**: Simple heartbeat successful notification. Marks the job as successful.
  - **Start**: Signal the start of a job. Use this at the beginning of a workflow to track execution duration.
  - **Error**: Signal a job failure. Marks the job as failed and allows you to provide an error message.

  #### Parameters:
  - **Monitor Key**: A unique identifier for your monitor (e.g., `daily-backup`).
  - **Monitor Name**: A human-readable name for your monitor.
  - **Interval**: Expected heartbeat interval (e.g., `5m`, `1h`, `24h`).
  - **Additional Data**: Custom metrics or metadata as a JSON object.
  - **Error Message**: Description of why the job failed (only for Error operation).

  📚 **[Learn n8n monitoring best practices](https://www.watchflow.io/use-cases/n8n-monitoring/)**

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"This n8n community node sends heartbeats to Watchflow.io to monitor the health, execution time, and status of scheduled tasks and cron jobs.","capabilities":["Send heartbeat notifications for job monitoring","Mark jobs as successful via Ping operation","Track job execution duration via Start operation","Report job failures with custom error messages via Error operation","Attach custom metrics and metadata as JSON objects","Configure heartbeat intervals (e.g., 5m, 1h, 24h)"],"authentication":"API key required (Watchflow API Key from Dashboard)","commonUseCases":["Monitoring cron job health","Tracking scheduled task execution time","Alerting on workflow failures","Custom metric collection for automated processes"],"limitations":[],"relatedNodes":[]}


node_type: n8n-nodes-dremio.dremio
package_name: n8n-nodes-dremio
display_name: Dremio
description: Execute queries against Dremio Cloud or Software
category: Community
development_style: declarative
version: 1
operations:
  [
  {
  "name": "Execute",
  "value": "execute",
  "resource": "query"
  }
  ]

credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: alexmerced
author_github_url: https://github.com/developer-advocacy-dremio/dremio-n8n-connector.git
npm_package_name: n8n-nodes-dremio
npm_version: 2.0.17
community_fetched_at: 2026-07-14T14:40:33.722Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "query",
      "options": [
        {
          "name": "Query",
          "value": "query"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "execute",
      "options": [
        {
          "name": "Execute",
          "value": "execute"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "query"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

npm_readme:
  # Dremio n8n Connector

  A community n8n node for executing SQL queries against **Dremio Cloud** and **Dremio Software** directly from your n8n workflows.

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

  ## Features

  - **Execute SQL** — Run any SQL query supported by Dremio
  - **Dual Compatibility** — First-class support for both Dremio Cloud and Dremio Software (self-hosted)
  - **Credential-Based Auth** — Authentication via Personal Access Token (PAT) using n8n's built-in `httpRequestWithAuthentication`
  - **Automatic Credential Test** — Validates your credentials when you save them in n8n
  - **SSL Flexibility** — Option to skip SSL certificate validation for self-hosted instances with self-signed certificates
  - **Data Lineage** — Full `pairedItem` tracking for n8n's data lineage feature
  - **Proper Error Handling** — Uses `NodeOperationError` for clear, actionable error messages

  ## Installation

  ### n8n Community Nodes (Recommended)

  1. Go to your n8n dashboard
  2. Navigate to **Settings** > **Community Nodes**
  3. Click **Install a community node**
  4. Enter: `n8n-nodes-dremio`
  5. Click **Install**

  The **Dremio** node will now be available in your workflow editor.

  ### Self-Hosted n8n (Manual)

  ```bash
  # Clone and build
  git clone https://github.com/developer-advocacy-dremio/dremio-n8n-connector.git
  cd dremio-n8n-connector
  npm install
  npm run build

  # Link to n8n
  mkdir -p ~/.n8n/custom
  cd ~/.n8n/custom
  npm link /path/to/dremio-n8n-connector

  # Restart n8n
  ```

  ## Usage Guide

  ### 1. Add the Node
  Open your n8n workflow, click **+**, and search for **Dremio**.

  ### 2. Configure Credentials

  Click the credential dropdown and create a new **Dremio API** credential.

  #### Dremio Cloud
  | Field | Value |
  |:---|:---|
  | **Type** | `Cloud` |
  | **Base URL** | `https://api.dremio.cloud` (default) or `https://api.eu.dremio.cloud` for EU |
  | **Project ID** | Found in Dremio Cloud → Project Settings |
  | **Access Token** | Your Personal Access Token (PAT) |
  | **Ignore SSL Issues** | `False` |

  #### Dremio Software
  | Field | Value |
  |:---|:---|
  | **Type** | `Software` |
  | **Base URL** | `https://<HOST>:9047/api/v3` |
  | **Access Token** | Your Personal Access Token (PAT) |
  | **Ignore SSL Issues** | `True` if using a self-signed certificate |

  > **Tip:** Click **Test Credential** to verify connectivity before saving.

  ### 3. Execute SQL
  - **Resource**: `Query`
  - **Operation**: `Execute`
  - **SQL Query**: Your SQL statement

  **Examples:**
  ```sql
  -- Query sample data
  SELECT * FROM "Samples"."samples.dremio.com"."NYC-taxi-trips" LIMIT 10

  -- Use with expressions from previous nodes
  SELECT * FROM my_table WHERE id = '{{ $json.id }}'
  ```

  ## How It Works

  The connector uses the Dremio REST API's asynchronous job execution model:

  1. **Submit** — `POST` the SQL query to the `/sql` endpoint → receives a Job ID
  2. **Poll** — Checks job status every second until `COMPLETED`, `FAILED`, or `CANCELED`
  3. **Fetch** — Retrieves results from `/job/{id}/results` and outputs rows as n8n items

  Each output item includes `pairedItem` metadata for n8n's data lineage tracking.

  ## Project Structure

  | Path | Description |
  |:---|:---|
  | `credentials/DremioApi.credentials.ts` | Credential definition — auth, SSL, and credential test |
  | `nodes/Dremio/Dremio.node.ts` | Node logic — SQL execution via submit/poll/fetch |
  | `nodes/Dremio/dremio.svg` | Node icon |
  | `scripts/verify_api.js` | Standalone API test script (reads from `.env`) |
  | `.github/workflows/publish.yml` | GitHub Actions — auto-publish to npm with provenance on release |
  | `.env.template` | Template for local API testing credentials |

  ## Development

  See the **[Developer Guide](DEVELOPMENT.md)** for implementation details.

  ### Quick Start

  ```bash
  npm install          # Install dependencies
  npm run build        # Compile TypeScript + copy SVG assets
  npm run lint         # Run ESLint
  npm run dev          # Watch mode for development
  ```

  ### Testing API Connectivity

  ```bash
  cp .env.template .env   # Fill in your Dremio credentials
  node scripts/verify_api.js
  ```

  ### Publishing

  Releases are automated via GitHub Actions. To publish a new version:

  1. Bump the version in `package.json`
  2. Commit, tag, and push:
     ```bash
     git tag v2.x.x
     git push origin main --tags
     ```
  3. Create a **GitHub Release** from the tag — this triggers the publish workflow

  ## Troubleshooting

  | Problem | Solution |
  |:---|:---|
  | **Job Failed** | Check the Dremio UI Jobs page for detailed SQL error messages |
  | **SSL Error** | Toggle **Ignore SSL Issues** to `True` in credentials |
  | **Timeout** | Use `LIMIT` clauses or paginate large result sets |
  | **Credential Test Fails** | Verify your PAT is valid and Project ID is correct (Cloud) |
  | **401 Unauthorized** | Regenerate your Personal Access Token in Dremio |

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"A community n8n node that executes SQL queries against Dremio Cloud or Dremio Software by leveraging the Dremio REST API's asynchronous job execution model.","capabilities":["Execute SQL queries against Dremio Cloud","Execute SQL queries against self-hosted Dremio Software","Support for Personal Access Token (PAT) authentication","Automatic credential validation","SSL certificate validation toggle","Data lineage tracking via pairedItem","Asynchronous job polling for query results"],"authentication":"Personal Access Token (PAT) via n8n credential system","commonUseCases":["Extracting data from Dremio for n8n workflows","Running ad-hoc SQL queries in automated processes","Integrating Dremio data with other n8n nodes"],"limitations":["Requires manual installation for self-hosted n8n (not included in standard n8n Community Nodes)","Relies on Dremio's asynchronous job model which may introduce latency","Large result sets may require LIMIT clauses or pagination to avoid timeouts"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code","n8n-nodes-base.splitInBatches"]}


node_type: n8n-nodes-deliverect.deliverectTrigger
package_name: n8n-nodes-deliverect
display_name: Deliverect Order Webhook Trigger
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: deliverect-stefaang
author_github_url: https://github.com/Deliverect/
npm_package_name: n8n-nodes-deliverect
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:33.724Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Triggers the workflow when order events are received from Deliverect. Handles new orders, order status updates, and courier/delivery updates.

npm_readme:
  # n8n-nodes-deliverect

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


  [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

  Store API: 

  * get stores
  * get snoozed products
  * set snoozed products

  POSAPI

  * sync products

  Channel API

  * publish menu

  ## Credentials

  [Request](https://developers.deliverect.com/docs/getting-started) a client credentials keypair with Deliverect API support.

  Bearer token support is WIP.

  ## Compatibility

  Tested with N8N 1.97.1

  ## Usage

  If you're new with N8N, [try it out](https://docs.n8n.io/try-it-out/) first.

  ## Resources

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

  ## Version history

  v1.0: Initial version

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows when order events, status updates, or courier/delivery updates are received from Deliverect.","capabilities":["Monitor new orders","Track order status updates","Handle courier and delivery updates","Retrieve stores","Retrieve snoozed products","Set snoozed products","Sync products via POSAPI","Publish menu via Channel API"],"authentication":"API key required (Client credentials keypair)","commonUseCases":["Automate order processing upon delivery confirmation","Update inventory based on order status changes","Trigger notifications for delivery updates","Sync product data between POS and delivery systems"],"limitations":["Bearer token support is currently in progress (WIP)","Limited to Deliverect-specific operations"],"relatedNodes":["Deliverect Store","Deliverect Product","Deliverect Order","Deliverect Courier"]}


node_type: @alphainsiderinc/n8n-nodes-alphainsider.alphaInsider
package_name: @alphainsiderinc/n8n-nodes-alphainsider
display_name: AlphaInsider
description: Real-time stock & crypto data, automated trading, live trade alerts, broker connections.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: alphainsider
author_github_url: https://github.com/AlphaInsider/n8n-nodes-alphainsider.git
npm_package_name: @alphainsiderinc/n8n-nodes-alphainsider
npm_version: 1.4.4
community_fetched_at: 2026-07-14T14:40:33.725Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "websockets",
      "options": [
        {
          "name": "Websockets",
          "value": "websockets"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "subscribe",
      "options": [
        {
          "name": "Subscribe",
          "value": "subscribe",
          "action": "Subscribe to websocket channels",
          "description": "Subscribe to real-time websocket events from AlphaInsider"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "websockets"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Subscribe",
      "value": "subscribe",
      "action": "Subscribe to websocket channels",
      "description": "Subscribe to real-time websocket events from AlphaInsider",
      "resource": "websockets"
    }
  ]

npm_readme:
  # n8n-nodes-alphainsider

  This is an n8n community node package that provides:

  - **AlphaInsider** trigger node with selectable actions (including websocket triggers)
  - **AlphaInsider API** credentials used by the trigger

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

  ## Installation

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

  ## Credentials

  1. Log in to [AlphaInsider](https://alphainsider.com).
  2. Open [Settings -> Developers](https://alphainsider.com/settings/developers).
  3. Generate an API key.
  4. In n8n, create **AlphaInsider API** credentials and paste your API key.

  n8n validates credentials with a `POST https://alphainsider.com/api/verifyToken` request.

  ## Usage

  Use the **AlphaInsider** trigger node to subscribe to realtime updates from `wss://alphainsider.com/ws`.

  1. Add **AlphaInsider** to your workflow.
  2. Select your **AlphaInsider API** credentials.
  3. Choose **Action Sub-Label** = `Websockets`.
  4. Choose **Action** = `Trigger`.
  5. Enter channels (comma-separated or newline-separated).
  6. Activate the workflow.

  ### Subscription Payload

  ```json
  {
    "event": "subscribe",
    "payload": {
      "channels": ["wsOrders:<STRATEGY_ID>"],
      "token": "<YOUR_API_KEY>"
    }
  }
  ```

  ### Channel Examples

  - `wsStockPrice:AAPL:NASDAQ`
  - `wsStrategyValue:<STRATEGY_ID>`
  - `wsOrders:<STRATEGY_ID>`
  - `wsPositions:<STRATEGY_ID>`
  - `wsTimelines:<STRATEGY_ID>`
  - `wsBotStatus:<BOT_ID>`
  - `wsBotAllocations:<BOT_ID>`
  - `wsBotActivities:<BOT_ID>`

  ### Notes

  - Enable **Emit Lifecycle Events** for connection/subscription diagnostics.
  - Enable **Debug Logging** to add websocket diagnostics to n8n logs.
  - Control events (for example `subscribe`, `error`, `connected`) are not emitted as data items.
  - Only `ws...` data events for subscribed channels are emitted.
  - In manual/test mode, lifecycle events are suppressed to avoid early completion.

  ## Resources

  - [AlphaInsider Platform](https://alphainsider.com)
  - [AlphaInsider API Docs](https://api.alphainsider.com)
  - [AlphaInsider Websocket Docs](https://api.alphainsider.com/resources/websockets)
  - [n8n Docs](https://docs.n8n.io/)

  ## Support

  - [GitHub Issues](https://github.com/AlphaInsider/n8n-nodes-alphainsider/issues)
  - [AlphaInsider Support](https://alphainsider.com/contact)

ai_documentation_summary:
  {"purpose":"This node enables real-time monitoring of AlphaInsider trading strategies by subscribing to WebSocket channels for stock prices, strategy values, orders, positions, and bot activities.","capabilities":["Trigger node for real-time WebSocket updates","Subscribe to multiple strategy channels","Monitor stock prices (e.g., AAPL:NASDAQ)","Track strategy values and positions","Monitor bot status, allocations, and activities","Emit lifecycle events for diagnostics","Support for manual/test mode"],"authentication":"API key required","commonUseCases":["Real-time trading strategy monitoring","Automated trade execution based on strategy signals","Capital allocation across multiple strategies","Bot activity tracking and management"],"limitations":["Lifecycle events (subscribe, error, connected) are not emitted as data items","Only data events for subscribed channels are emitted","Manual/test mode suppresses lifecycle events to prevent early completion"],"relatedNodes":["n8n Webhook node","n8n Code node","n8n HTTP Request node"]}


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

updated_at: 2026-07-14 14:40:33
author_name: rvreftab
author_github_url: https://github.com/Reftab/
npm_package_name: n8n-nodes-reftab
npm_version: 1.0.7
community_fetched_at: 2026-07-14T14:40:33.726Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "asset",
      "options": [
        {
          "name": "Asset",
          "value": "asset"
        },
        {
          "name": "Asset Maintenance",
          "value": "assetMaintenance"
        },
        {
          "name": "Custom",
          "value": "custom"
        },
        {
          "name": "Loan",
          "value": "loan"
        },
        {
          "name": "Reservation",
          "value": "reservation"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get an asset",
          "description": "Get an asset by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many assets",
          "description": "Get multiple assets"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create an asset",
          "description": "Create a new asset"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an asset",
          "description": "Update an asset"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an asset",
          "description": "Delete an asset"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "asset"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a maintenance record",
          "description": "Get a maintenance record by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many maintenance records",
          "description": "Get multiple maintenance records"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a maintenance record",
          "description": "Create a new maintenance record for an asset"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "assetMaintenance"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a loan",
          "description": "Get a loan by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many loans",
          "description": "Get multiple loans"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a loan",
          "description": "Create a new loan (check out)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a loan",
          "description": "Update a loan"
        },
        {
          "name": "Check In",
          "value": "checkIn",
          "action": "Check in a loan",
          "description": "Check in / return a loan"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "loan"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a reservation",
          "description": "Get a reservation by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many reservations",
          "description": "Get multiple reservations"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a reservation",
          "description": "Create a new reservation"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a reservation",
          "description": "Update a reservation"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a reservation",
          "description": "Delete a reservation"
        },
        {
          "name": "Fulfill",
          "value": "fulfill",
          "action": "Fulfill a reservation",
          "description": "Fulfill a reservation (convert to loan)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reservation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "apiCall",
      "options": [
        {
          "name": "API Call",
          "value": "apiCall",
          "action": "Make a custom API call",
          "description": "Make a custom API call"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "custom"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get",
      "value": "get",
      "action": "Get an asset",
      "description": "Get an asset by ID",
      "resource": "asset"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many assets",
      "description": "Get multiple assets",
      "resource": "asset"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an asset",
      "description": "Create a new asset",
      "resource": "asset"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an asset",
      "description": "Update an asset",
      "resource": "asset"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an asset",
      "description": "Delete an asset",
      "resource": "asset"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a maintenance record",
      "description": "Get a maintenance record by ID",
      "resource": "assetMaintenance"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many maintenance records",
      "description": "Get multiple maintenance records",
      "resource": "assetMaintenance"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a maintenance record",
      "description": "Create a new maintenance record for an asset",
      "resource": "assetMaintenance"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a loan",
      "description": "Get a loan by ID",
      "resource": "loan"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many loans",
      "description": "Get multiple loans",
      "resource": "loan"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a loan",
      "description": "Create a new loan (check out)",
      "resource": "loan"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a loan",
      "description": "Update a loan",
      "resource": "loan"
    },
    {
      "name": "Check In",
      "value": "checkIn",
      "action": "Check in a loan",
      "description": "Check in / return a loan",
      "resource": "loan"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a reservation",
      "description": "Get a reservation by ID",
      "resource": "reservation"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many reservations",
      "description": "Get multiple reservations",
      "resource": "reservation"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a reservation",
      "description": "Create a new reservation",
      "resource": "reservation"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a reservation",
      "description": "Update a reservation",
      "resource": "reservation"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a reservation",
      "description": "Delete a reservation",
      "resource": "reservation"
    },
    {
      "name": "Fulfill",
      "value": "fulfill",
      "action": "Fulfill a reservation",
      "description": "Fulfill a reservation (convert to loan)",
      "resource": "reservation"
    },
    {
      "name": "API Call",
      "value": "apiCall",
      "action": "Make a custom API call",
      "description": "Make a custom API call",
      "resource": "custom"
    }
  ]

npm_readme:
  # n8n-nodes-reftab

  This is an n8n community node for [Reftab](https://reftab.com) - Asset Management Software.

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

  ### npm Installation

  ```bash
  npm install n8n-nodes-reftab
  ```

  ### Manual Installation

  1. Navigate to your n8n nodes directory:
     ```bash
     cd ~/.n8n/nodes
     ```

  2. Install the package:
     ```bash
     npm install n8n-nodes-reftab
     ```

  3. Restart n8n

  ## Credentials

  To use this node, you need a Reftab API key pair:

  1. Log into your Reftab account
  2. Go to **Settings** > **API Keys**
  3. Click **Create API Key**
  4. Copy both the **Public Key** and **Secret Key**

  In n8n, create new Reftab API credentials and enter both keys.

  ## Resources

  This node supports the following Reftab resources:

  ### Asset
  - **Get** - Get a single asset by ID
  - **Get Many** - Get multiple assets with filtering options
  - **Create** - Create a new asset
  - **Update** - Update an existing asset
  - **Delete** - Delete an asset

  ### Asset Maintenance
  - **Get** - Get a maintenance record by ID
  - **Get Many** - Get multiple maintenance records with filtering
  - **Create** - Create a new maintenance record for an asset

  ### Loan
  - **Get** - Get a loan by ID
  - **Get Many** - Get multiple loans with filtering
  - **Create** - Create a new loan (check out items)
  - **Update** - Update a loan
  - **Check In** - Return loaned items

  ### Reservation
  - **Get** - Get a reservation by ID
  - **Get Many** - Get multiple reservations with filtering
  - **Create** - Create a new reservation
  - **Update** - Update a reservation
  - **Delete** - Delete a reservation
  - **Fulfill** - Convert a reservation to a loan

  ### Custom API Call
  - Make custom API calls to any Reftab endpoint

  ## Features

  - **HMAC Authentication** - Proper signature generation for Reftab API
  - **Email Lookups** - Enter email addresses for loanees/users and the node automatically looks up the ID
  - **Dynamic Dropdowns** - Locations, categories, and statuses are loaded dynamically
  - **Remote Signature** - Option to bypass signature requirements for automated checkouts

  ## Compatibility

  - n8n version 1.0.0 or later
  - Node.js 18.x or later

  ## License

  [MIT](LICENSE.md)

  ## Links

  - [Reftab](https://reftab.com)
  - [Reftab API Documentation](https://www.reftab.com/api-docs)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows to interact with the Reftab Asset Management Software API, allowing management of assets, loans, reservations, and maintenance records.","capabilities":["Retrieve single or multiple assets with filtering","Create, update, and delete assets","Manage asset maintenance records","Handle loan operations including creation, updates, and check-ins","Manage reservations including creation, updates, deletion, and fulfillment","Perform custom API calls to any Reftab endpoint","Automatically look up user IDs from email addresses","Load dynamic dropdowns for locations, categories, and statuses","Generate HMAC signatures for API authentication","Bypass signature requirements for automated checkouts"],"authentication":"API key required (Public Key and Secret Key)","commonUseCases":["Automating asset inventory management","Processing loan checkouts and returns","Managing reservation fulfillment workflows","Tracking asset maintenance schedules","Integrating Reftab data into broader business automation processes"],"limitations":["Community node (not official n8n node)","Requires separate Reftab account and API keys","Requires n8n version 1.0.0 or later","Requires Node.js 18.x or later"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: n8n-nodes-dataforb2b.dataForB2B
package_name: n8n-nodes-dataforb2b
display_name: DataForB2B
description: Access B2B data - Search people, companies and enrich profiles
category: Sales
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: tit_linkup
author_github_url: https://github.com/DataForB2B/n8n-node.git
npm_package_name: n8n-nodes-dataforb2b
npm_version: 1.0.13
community_fetched_at: 2026-07-14T14:40:33.727Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Enrich",
          "value": "enrich"
        },
        {
          "name": "Search",
          "value": "search"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "searchPeople",
      "options": [
        {
          "name": "Agentic Search (LLM)",
          "value": "agenticSearch",
          "action": "Agentic search LLM",
          "description": "Natural language queries with AI interpretation"
        },
        {
          "name": "Search Companies",
          "value": "searchCompanies",
          "action": "Search companies",
          "description": "Find companies with advanced filters"
        },
        {
          "name": "Search People",
          "value": "searchPeople",
          "action": "Search people",
          "description": "Find professionals using 50+ filters"
        },
        {
          "name": "Text to Filters",
          "value": "textToFilters",
          "action": "Text to filters",
          "description": "Convert natural language to structured filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "search"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "enrichProfile",
      "options": [
        {
          "name": "Enrich Company",
          "value": "enrichCompany",
          "action": "Enrich company",
          "description": "Retrieve comprehensive company information"
        },
        {
          "name": "Enrich Profile",
          "value": "enrichProfile",
          "action": "Enrich profile",
          "description": "Retrieve detailed professional data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "enrich"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Agentic Search (LLM)",
      "value": "agenticSearch",
      "action": "Agentic search LLM",
      "description": "Natural language queries with AI interpretation",
      "resource": "search"
    },
    {
      "name": "Search Companies",
      "value": "searchCompanies",
      "action": "Search companies",
      "description": "Find companies with advanced filters",
      "resource": "search"
    },
    {
      "name": "Search People",
      "value": "searchPeople",
      "action": "Search people",
      "description": "Find professionals using 50+ filters",
      "resource": "search"
    },
    {
      "name": "Text to Filters",
      "value": "textToFilters",
      "action": "Text to filters",
      "description": "Convert natural language to structured filters",
      "resource": "search"
    },
    {
      "name": "Enrich Company",
      "value": "enrichCompany",
      "action": "Enrich company",
      "description": "Retrieve comprehensive company information",
      "resource": "enrich"
    },
    {
      "name": "Enrich Profile",
      "value": "enrichProfile",
      "action": "Enrich profile",
      "description": "Retrieve detailed professional data",
      "resource": "enrich"
    }
  ]

npm_readme:
  # n8n-nodes-dataforb2b

  Official n8n integration for DataForB2B - Access B2B data to search professionals, companies and enrich profiles.

  ## Installation

  ```bash
  npm install n8n-nodes-dataforb2b
  ```

  ## Quick Start

  ### 1. Get API Credentials

  Sign up at [app.dataforb2b.ai](https://app.dataforb2b.ai) and get your API key.

  ### 2. Configure in n8n

  Add your DataForB2B credentials in n8n:
  - **Credential Type**: DataForB2B API
  - **API Key**: Your API key from the dashboard

  ### 3. Use in Workflows

  Drag and drop DataForB2B nodes into your workflow and start automating.

  ## Features

  ### Search
  - **Search People** - Find professionals using 50+ filters (name, title, company, skills, location, experience, education, certifications, languages)
  - **Search Companies** - Find companies with advanced filters (name, industry, size, headquarters, growth, funding, verified status)
  - **Agentic Search (LLM)** - Natural language queries with AI interpretation
  - **Text to Filters** - Convert natural language to structured filters

  ### Enrich
  - **Enrich Profile** - Retrieve detailed professional data including:
    - Full profile data (1 credit)
    - Work email (3 credits)
    - Personal email (1 credit)
    - Phone number (10 credits)
  - **Enrich Company** - Retrieve comprehensive company information including metrics, growth, funding, investors, locations

  ## Filter System

  Use structured filters with AND/OR logic:

  ```json
  {
    "op": "and",
    "conditions": [
      {"field": "title", "op": "like", "value": "CEO"},
      {"field": "company", "op": "=", "value": "Google"}
    ]
  }
  ```

  ### Supported Operators
  - Comparison: `=`, `!=`, `>`, `>=`, `<`, `<=`
  - Range: `between` (requires value2)
  - List: `in`, `not_in`
  - Text: `like`, `not_like`
  - Null: `is_null`, `is_not_null`

  ## Documentation

  - **Full API Docs**: [docs.dataforb2b.ai](https://docs.dataforb2b.ai)
  - **Dashboard**: [app.dataforb2b.ai](https://app.dataforb2b.ai)

  ## Requirements

  - Node.js: >= 18.10
  - n8n: Latest version
  - Valid DataForB2B API key

  ## License

  MIT - See [LICENSE](LICENSE)

  ## Support

  - Website: [dataforb2b.ai](https://dataforb2b.ai)
  - Documentation: [docs.dataforb2b.ai](https://docs.dataforb2b.ai)

ai_documentation_summary:
  {"purpose":"This n8n node enables searching and enriching B2B data, including professionals and companies, using DataForB2B's API with advanced filtering and AI-powered search capabilities.","capabilities":["Search professionals using 50+ filters (name, title, company, skills, location, experience, education, certifications, languages)","Search companies with filters (name, industry, size, headquarters, growth, funding, verified status)","Agentic Search using LLM for natural language queries","Text to Filters conversion from natural language to structured filters","Enrich professional profiles (full data, work email, personal email, phone number)","Enrich company information (metrics, growth, funding, investors, locations)","Structured filtering with AND/OR logic and multiple operators"],"authentication":"API key required","commonUseCases":["Finding specific professionals for recruitment or sales outreach","Validating company information for business development","Enriching lead databases with contact details","Automated research using natural language queries"],"limitations":["Requires valid DataForB2B API key with sufficient credits for enrichment operations","Credit-based pricing model for different data types (full profile, email, phone)","Requires n8n version 18.10 or higher"],"relatedNodes":["n8n-nodes-core.credential","n8n-nodes-core.httpRequest","n8n-nodes-core.webhook"]}


node_type: n8n-nodes-zernio.late
package_name: n8n-nodes-zernio
display_name: Zernio
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: mikipalet
author_github_url: https://github.com/zernio-dev/
npm_package_name: n8n-nodes-zernio
npm_version: 0.7.1
community_fetched_at: 2026-07-14T14:40:33.728Z
ai_summary_generated_at: 2026-05-02 08:57:17
description:
  Schedule and manage social media posts across multiple platforms with Zernio - supporting Twitter/X, Instagram, Facebook, LinkedIn, TikTok, YouTube, Threads, Bluesky, Pinterest, Reddit, Telegram, Google Business, and Snapchat

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "profiles",
      "options": [
        {
          "name": "Profiles",
          "value": "profiles",
          "description": "Organize your social media accounts into profiles for managing multiple brands, clients, or personal accounts separately"
        },
        {
          "name": "Posts",
          "value": "posts",
          "description": "Create, schedule, and manage social media posts across multiple platforms with advanced features like threads, stories, and platform-specific settings"
        },
        {
          "name": "Media",
          "value": "media",
          "description": "Upload images and videos up to 5GB for use in your social media posts with automatic optimization"
        },
        {
          "name": "Social Accounts",
          "value": "accounts",
          "description": "Manage connected social media accounts, view their status, and disconnect accounts when needed"
        },
        {
          "name": "Connect Platform",
          "value": "connect",
          "description": "Initiate OAuth flows to connect new social media platforms (Twitter/X, Instagram, Facebook, LinkedIn, TikTok, YouTube, Threads)"
        },
        {
          "name": "Usage Statistics",
          "value": "usage",
          "description": "Monitor your current usage against plan limits including uploads, profiles, and billing information"
        },
        {
          "name": "Facebook Management",
          "value": "facebook",
          "description": "Manage Facebook pages, select which page to post to, and handle Facebook-specific settings"
        },
        {
          "name": "LinkedIn Management",
          "value": "linkedin",
          "description": "Switch between personal and company posting, manage LinkedIn organization settings"
        },
        {
          "name": "Clone Connection",
          "value": "clone",
          "description": "Reuse OAuth connections across multiple profiles while targeting different pages or organizations"
        },
        {
          "name": "Webhooks",
          "value": "webhooks",
          "description": "Configure webhook notifications for post events, account changes, and messages"
        },
        {
          "name": "Queue",
          "value": "queue",
          "description": "Manage queue slots for automated posting schedules across your accounts"
        },
        {
          "name": "Account Groups",
          "value": "accountGroups",
          "description": "Create and manage groups of accounts for bulk operations and organized posting"
        },
        {
          "name": "Analytics",
          "value": "analytics",
          "description": "View post performance analytics and engagement metrics across platforms"
        },
        {
          "name": "Bluesky Management",
          "value": "bluesky",
          "description": "Connect and manage Bluesky accounts using app passwords"
        },
        {
          "name": "Pinterest Management",
          "value": "pinterest",
          "description": "Manage Pinterest boards and select which board to post to"
        },
        {
          "name": "Reddit Management",
          "value": "reddit",
          "description": "Manage saved subreddits and search for Reddit communities"
        },
        {
          "name": "Telegram Management",
          "value": "telegram",
          "description": "Connect and manage Telegram channels for posting"
        },
        {
          "name": "Google Business Management",
          "value": "googlebusiness",
          "description": "Manage Google Business locations and respond to reviews"
        },
        {
          "name": "Snapchat Management",
          "value": "snapchat",
          "description": "Connect and manage Snapchat profiles for posting"
        },
        {
          "name": "Invites",
          "value": "invites",
          "description": "Create invite tokens to grant team members access to profiles"
        },
        {
          "name": "Logs",
          "value": "logs",
          "description": "View publishing logs with detailed information about each publishing attempt"
        },
        {
          "name": "API Keys",
          "value": "apiKeys",
          "description": "Manage API keys for programmatic access to the Late API"
        },
        {
          "name": "Users",
          "value": "users",
          "description": "View users and team members with access to your account"
        },
        {
          "name": "Tools",
          "value": "tools",
          "description": "Manage tools"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List profiles",
          "routing": {
            "request": {
              "qs": {
                "includeOverLimit": "={{ $parameter.includeOverLimit || false }}"
              },
              "url": "/profiles",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create profile",
          "routing": {
            "request": {
              "url": "/profiles",
              "body": {
                "name": "={{ $parameter.name }}",
                "color": "={{ $parameter.color || '' }}",
                "description": "={{ $parameter.description || '' }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}",
              "body": {
                "name": "={{ $parameter.name || undefined }}",
                "color": "={{ $parameter.color || undefined }}",
                "isDefault": "={{ $parameter.isDefault ?? undefined }}",
                "description": "={{ $parameter.description || undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "profiles"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List posts",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page || 1 }}",
                "limit": "={{ $parameter.limit || 10 }}",
                "dateTo": "={{ $parameter.dateTo || undefined }}",
                "search": "={{ $parameter.search || undefined }}",
                "sortBy": "={{ $parameter.sortBy || undefined }}",
                "status": "={{ $parameter.status || undefined }}",
                "dateFrom": "={{ $parameter.dateFrom || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "createdBy": "={{ $parameter.createdBy || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}",
                "includeHidden": "={{ $parameter.includeHidden ?? undefined }}"
              },
              "url": "/posts",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get post",
          "routing": {
            "request": {
              "url": "=/posts/{{ $parameter.postId }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create post",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/posts",
              "method": "POST",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update post",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}",
              "method": "PUT",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete post",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}",
              "method": "DELETE",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Retry",
          "value": "retry",
          "action": "Retry failed post",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}/retry",
              "method": "POST",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Unpublish",
          "value": "unpublish",
          "action": "Unpublish post",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}/unpublish",
              "body": {
                "platform": "={{ $parameter.unpublishPlatform }}"
              },
              "method": "POST",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Bulk Upload",
          "value": "bulkUpload",
          "action": "Bulk upload posts from CSV",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "qs": {
                "dryRun": "={{ $parameter.dryRun || false }}"
              },
              "url": "/posts/bulk-upload",
              "body": {
                "file": "={{ { value: $parameter.csvFile, options: { filename: 'bulk-upload.csv', contentType: 'text/csv' } } }}"
              },
              "method": "POST",
              "headers": {
                "Content-Type": "multipart/form-data"
              },
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Get Logs",
          "value": "logs",
          "action": "Get post publishing logs",
          "routing": {
            "request": {
              "url": "=/posts/{{ $parameter.postId }}/logs",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "posts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload media",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/media",
              "method": "POST",
              "headers": {
                "Content-Type": "multipart/form-data"
              },
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Get Presigned URL",
          "value": "presign",
          "action": "Get presigned URL for direct upload",
          "routing": {
            "request": {
              "url": "/media/presign",
              "body": {
                "size": "={{ $parameter.size }}",
                "filename": "={{ $parameter.filename }}",
                "contentType": "={{ $parameter.contentType }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "media"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List social accounts",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/accounts",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get account details",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "body": {
                "isActive": "={{ $parameter.isActive }}",
                "displayName": "={{ $parameter.displayName || undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Disconnect account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Get Health",
          "value": "health",
          "action": "Check account health",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/health",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get All Health",
          "value": "allHealth",
          "action": "Check all accounts health",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/accounts/health",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Follower Stats",
          "value": "followerStats",
          "action": "Get follower statistics",
          "routing": {
            "request": {
              "qs": {
                "accountId": "={{ $parameter.accountId || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/accounts/follower-stats",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "accounts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getConnectUrl",
      "options": [
        {
          "name": "Get Connect URL",
          "value": "getConnectUrl",
          "action": "Get OAuth connect URL",
          "routing": {
            "request": {
              "qs": {
                "headless": "={{ $parameter.headless || undefined }}",
                "profileId": "={{ $parameter.profileId }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
              },
              "url": "=/connect/{{ $parameter.platform }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Complete OAuth Callback",
          "value": "handleOAuthCallback",
          "action": "Complete OAuth callback",
          "routing": {
            "request": {
              "url": "=/connect/{{ $parameter.platform }}",
              "body": {
                "code": "={{ $parameter.code }}",
                "state": "={{ $parameter.state }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Facebook Pages (Headless)",
          "value": "listFacebookPages",
          "action": "List Facebook pages",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/facebook/select-page",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Facebook Page (Headless)",
          "value": "selectFacebookPage",
          "action": "Select Facebook page",
          "routing": {
            "request": {
              "url": "/connect/facebook/select-page",
              "body": {
                "pageId": "={{ $parameter.pageId }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ $parameter.userProfile || undefined }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Google Business Locations (Headless)",
          "value": "listGoogleBusinessLocations",
          "action": "List GBP locations",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/googlebusiness/locations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Google Business Location (Headless)",
          "value": "selectGoogleBusinessLocation",
          "action": "Select GBP location",
          "routing": {
            "request": {
              "url": "/connect/googlebusiness/select-location",
              "body": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "locationId": "={{ $parameter.locationId }}",
                "userProfile": "={{ $parameter.userProfile }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Get Pending OAuth Data (Headless)",
          "value": "getPendingOAuthData",
          "action": "Get pending OAuth data",
          "routing": {
            "request": {
              "qs": {
                "token": "={{ $parameter.token }}"
              },
              "url": "/connect/pending-data",
              "method": "GET"
            }
          }
        },
        {
          "name": "List LinkedIn Organizations (Details)",
          "value": "listLinkedInOrganizations",
          "action": "List LinkedIn orgs",
          "routing": {
            "request": {
              "qs": {
                "orgIds": "={{ $parameter.orgIds }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/linkedin/organizations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select LinkedIn Organization",
          "value": "selectLinkedInOrganization",
          "action": "Select LinkedIn org",
          "routing": {
            "request": {
              "url": "/connect/linkedin/select-organization",
              "body": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "accountType": "={{ $parameter.accountType }}",
                "userProfile": "={{ $parameter.userProfile }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
                "selectedOrganization": "={{ $parameter.selectedOrganization || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Pinterest Boards (Headless)",
          "value": "listPinterestBoardsForSelection",
          "action": "List Pinterest boards",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/pinterest/select-board",
              "method": "GET",
              "headers": {
                "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
              }
            }
          }
        },
        {
          "name": "Select Pinterest Board (Headless)",
          "value": "selectPinterestBoard",
          "action": "Select Pinterest board",
          "routing": {
            "request": {
              "url": "/connect/pinterest/select-board",
              "body": {
                "boardId": "={{ $parameter.boardId }}",
                "boardName": "={{ $parameter.boardName || undefined }}",
                "expiresIn": "={{ $parameter.expiresIn || undefined }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ $parameter.userProfile || undefined }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
                "refreshToken": "={{ $parameter.refreshToken || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Snapchat Profiles (Headless)",
          "value": "listSnapchatProfiles",
          "action": "List Snapchat profiles",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/snapchat/select-profile",
              "method": "GET",
              "headers": {
                "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
              }
            }
          }
        },
        {
          "name": "Select Snapchat Profile (Headless)",
          "value": "selectSnapchatProfile",
          "action": "Select Snapchat profile",
          "routing": {
            "request": {
              "url": "/connect/snapchat/select-profile",
              "body": {
                "expiresIn": "={{ $parameter.expiresIn || undefined }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ $parameter.userProfile }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
                "refreshToken": "={{ $parameter.refreshToken || undefined }}",
                "selectedPublicProfile": "={{ $parameter.selectedPublicProfile }}"
              },
              "method": "POST",
              "headers": {
                "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
              }
            }
          }
        },
        {
          "name": "Connect Bluesky via Credentials",
          "value": "connectBlueskyCredentials",
          "action": "Connect Bluesky account",
          "routing": {
            "request": {
              "url": "/connect/bluesky/credentials",
              "body": {
                "state": "={{ $parameter.state }}",
                "identifier": "={{ $parameter.identifier }}",
                "appPassword": "={{ $parameter.appPassword }}",
                "redirectUri": "={{ $parameter.redirectUri || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Connect WhatsApp via Credentials",
          "value": "connectWhatsAppCredentials",
          "action": "Connect WhatsApp via credentials",
          "routing": {
            "request": {
              "url": "/connect/whatsapp/credentials",
              "body": {
                "wabaId": "={{ $parameter.wabaId }}",
                "profileId": "={{ $parameter.profileId }}",
                "accessToken": "={{ $parameter.accessToken }}",
                "phoneNumberId": "={{ $parameter.phoneNumberId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Generate Telegram Code",
          "value": "getTelegramConnectStatus",
          "action": "Generate Telegram code",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/connect/telegram",
              "method": "GET"
            }
          }
        },
        {
          "name": "Connect Telegram Directly",
          "value": "initiateTelegramConnect",
          "action": "Connect Telegram directly",
          "routing": {
            "request": {
              "url": "/connect/telegram",
              "body": {
                "chatId": "={{ $parameter.chatId }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Check Telegram Status",
          "value": "completeTelegramConnect",
          "action": "Check Telegram status",
          "routing": {
            "request": {
              "qs": {
                "code": "={{ $parameter.code }}"
              },
              "url": "/connect/telegram",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connect"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStats",
      "options": [
        {
          "name": "Get Stats",
          "value": "getStats",
          "action": "Get usage statistics",
          "routing": {
            "request": {
              "url": "/usage-stats",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Usage Stats",
          "value": "getUsageStats",
          "action": "Get plan and usage stats",
          "routing": {
            "request": {
              "url": "/usage-stats",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "usage"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listPages",
      "options": [
        {
          "name": "List Pages",
          "value": "listPages",
          "action": "List Facebook pages",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/facebook/select-page",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Page",
          "value": "selectPage",
          "action": "Select Facebook page",
          "routing": {
            "request": {
              "url": "/connect/facebook/select-page",
              "body": {
                "pageId": "={{ $parameter.pageId }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ { id: $parameter.userProfileId || '', name: $parameter.userProfileName || '', email: $parameter.userProfileEmail || '', picture: $parameter.userProfilePicture || '', accessToken: $parameter.userProfileAccessToken || '' } }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Account Pages",
          "value": "listAccountPages",
          "action": "List Facebook pages for account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update Page",
          "value": "updatePage",
          "action": "Update Facebook page",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
              "body": {
                "selectedPageId": "={{ $parameter.selectedPageId }}"
              },
              "method": "PUT"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebook"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "updateOrganization",
      "options": [
        {
          "name": "Update Organization",
          "value": "updateOrganization",
          "action": "Update LinkedIn organization",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/linkedin-organization",
              "body": {
                "accountType": "={{ $parameter.accountType }}",
                "selectedOrganization": "={{ { id: $parameter.organizationId || '', urn: $parameter.organizationUrn || '', name: $parameter.organizationName || '', logoUrl: $parameter.organizationLogoUrl || '', description: $parameter.organizationDescription || '' } }}"
              },
              "method": "PUT"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "linkedin"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "cloneConnection",
      "options": [
        {
          "name": "Clone Connection",
          "value": "cloneConnection",
          "action": "Clone connection to profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}/clone-connection",
              "body": {
                "targetPageId": "={{ $parameter.targetPageId || undefined }}",
                "targetPageName": "={{ $parameter.targetPageName || undefined }}",
                "sourceAccountId": "={{ $parameter.sourceAccountId }}",
                "targetAccountType": "={{ $parameter.targetAccountType || undefined }}",
                "targetOrganizationId": "={{ $parameter.targetOrganizationId || undefined }}",
                "targetOrganizationUrn": "={{ $parameter.targetOrganizationUrn || undefined }}",
                "targetPageAccessToken": "={{ $parameter.targetPageAccessToken || undefined }}",
                "targetOrganizationName": "={{ $parameter.targetOrganizationName || undefined }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "clone"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Settings",
          "value": "get",
          "action": "Get webhook settings",
          "routing": {
            "request": {
              "url": "/webhooks/settings",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create Settings",
          "value": "create",
          "action": "Create webhook settings",
          "routing": {
            "request": {
              "url": "/webhooks/settings",
              "body": {
                "url": "={{ $parameter.url }}",
                "name": "={{ $parameter.name || undefined }}",
                "events": "={{ $parameter.events || undefined }}",
                "secret": "={{ $parameter.secret || undefined }}",
                "isActive": "={{ $parameter.isActive }}",
                "customHeaders": "={{ $parameter.customHeaders || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update Settings",
          "value": "update",
          "action": "Update webhook settings",
          "routing": {
            "request": {
              "url": "/webhooks/settings",
              "body": {
                "_id": "={{ $parameter.webhookId }}",
                "url": "={{ $parameter.url || undefined }}",
                "name": "={{ $parameter.name || undefined }}",
                "events": "={{ $parameter.events || undefined }}",
                "secret": "={{ $parameter.secret || undefined }}",
                "isActive": "={{ $parameter.isActive }}",
                "customHeaders": "={{ $parameter.customHeaders || undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete Settings",
          "value": "delete",
          "action": "Delete webhook settings",
          "routing": {
            "request": {
              "qs": {
                "id": "={{ $parameter.webhookId }}"
              },
              "url": "/webhooks/settings",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Test Webhook",
          "value": "test",
          "action": "Send test webhook",
          "routing": {
            "request": {
              "url": "/webhooks/test",
              "body": {
                "webhookId": "={{ $parameter.webhookId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Get Logs",
          "value": "logs",
          "action": "Get webhook delivery logs",
          "routing": {
            "request": {
              "qs": {
                "event": "={{ $parameter.event || undefined }}",
                "limit": "={{ $parameter.limit || 50 }}",
                "status": "={{ $parameter.status || undefined }}",
                "webhookId": "={{ $parameter.webhookId || undefined }}"
              },
              "url": "/webhooks/logs",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhooks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List Slots",
          "value": "list",
          "action": "List queue slots",
          "routing": {
            "request": {
              "qs": {
                "all": "={{ $parameter.all ? 'true' : undefined }}",
                "queueId": "={{ $parameter.queueId || undefined }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/slots",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create Slot",
          "value": "create",
          "action": "Create queue slot",
          "routing": {
            "request": {
              "url": "/queue/slots",
              "body": {
                "name": "={{ $parameter.name }}",
                "slots": "={{ $parameter.slots }}",
                "active": "={{ $parameter.active }}",
                "timezone": "={{ $parameter.timezone }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update Slot",
          "value": "update",
          "action": "Update queue slot",
          "routing": {
            "request": {
              "url": "/queue/slots",
              "body": {
                "name": "={{ $parameter.name || undefined }}",
                "slots": "={{ $parameter.slots }}",
                "active": "={{ $parameter.active }}",
                "queueId": "={{ $parameter.queueId || undefined }}",
                "timezone": "={{ $parameter.timezone }}",
                "profileId": "={{ $parameter.profileId }}",
                "setAsDefault": "={{ $parameter.setAsDefault }}",
                "reshuffleExisting": "={{ $parameter.reshuffleExisting }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete Slot",
          "value": "delete",
          "action": "Delete queue slot",
          "routing": {
            "request": {
              "qs": {
                "queueId": "={{ $parameter.queueId }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/slots",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Preview Queue",
          "value": "preview",
          "action": "Preview upcoming queue posts",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter.count || 20 }}",
                "queueId": "={{ $parameter.queueId || undefined }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/preview",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Next Slot",
          "value": "nextSlot",
          "action": "Get next available queue slot",
          "routing": {
            "request": {
              "qs": {
                "queueId": "={{ $parameter.queueId || undefined }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/next-slot",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "queue"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List account groups",
          "routing": {
            "request": {
              "url": "/account-groups",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create account group",
          "routing": {
            "request": {
              "url": "/account-groups",
              "body": {
                "name": "={{ $parameter.name }}",
                "accountIds": "={{ $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update account group",
          "routing": {
            "request": {
              "url": "=/account-groups/{{ $parameter.groupId }}",
              "body": {
                "name": "={{ $parameter.name || undefined }}",
                "accountIds": "={{ $parameter.accountIds ? $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete account group",
          "routing": {
            "request": {
              "url": "=/account-groups/{{ $parameter.groupId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "accountGroups"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Analytics",
          "value": "get",
          "action": "Get post analytics",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page || undefined }}",
                "limit": "={{ $parameter.limit || undefined }}",
                "order": "={{ $parameter.order || undefined }}",
                "postId": "={{ $parameter.postId || undefined }}",
                "sortBy": "={{ $parameter.sortBy || undefined }}",
                "source": "={{ $parameter.source || undefined }}",
                "toDate": "={{ $parameter.toDate || undefined }}",
                "fromDate": "={{ $parameter.fromDate || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "accountId": "={{ $parameter.accountId || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics",
              "method": "GET"
            }
          }
        },
        {
          "name": "YouTube Daily Views",
          "value": "youtubeDailyViews",
          "action": "Get YouTube daily views",
          "routing": {
            "request": {
              "qs": {
                "endDate": "={{ $parameter.endDate || undefined }}",
                "videoId": "={{ $parameter.videoId }}",
                "accountId": "={{ $parameter.accountId }}",
                "startDate": "={{ $parameter.startDate || undefined }}"
              },
              "url": "/analytics/youtube/daily-views",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram Account Insights",
          "value": "instagramAccountInsights",
          "action": "Get Instagram account-level insights",
          "routing": {
            "request": {
              "qs": {
                "since": "={{ $parameter.since || undefined }}",
                "until": "={{ $parameter.until || undefined }}",
                "metrics": "={{ $parameter.metrics || undefined }}",
                "accountId": "={{ $parameter.accountId }}",
                "breakdown": "={{ $parameter.breakdown || undefined }}",
                "metricType": "={{ $parameter.metricType || undefined }}"
              },
              "url": "/analytics/instagram/account-insights",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram Demographics",
          "value": "instagramDemographics",
          "action": "Get Instagram audience demographics",
          "routing": {
            "request": {
              "qs": {
                "metric": "={{ $parameter.metric || undefined }}",
                "accountId": "={{ $parameter.accountId }}",
                "breakdown": "={{ $parameter.breakdown || undefined }}",
                "timeframe": "={{ $parameter.timeframe || undefined }}"
              },
              "url": "/analytics/instagram/demographics",
              "method": "GET"
            }
          }
        },
        {
          "name": "Daily Metrics",
          "value": "dailyMetrics",
          "action": "Get daily aggregated metrics",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "toDate": "={{ $parameter.toDateTime || undefined }}",
                "fromDate": "={{ $parameter.fromDateTime || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "accountId": "={{ $parameter.accountId || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/daily-metrics",
              "method": "GET"
            }
          }
        },
        {
          "name": "Best Time to Post",
          "value": "bestTime",
          "action": "Get best times to post",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/best-time",
              "method": "GET"
            }
          }
        },
        {
          "name": "Content Decay",
          "value": "contentDecay",
          "action": "Get content performance decay",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/content-decay",
              "method": "GET"
            }
          }
        },
        {
          "name": "Posting Frequency",
          "value": "postingFrequency",
          "action": "Get posting frequency vs engagement",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/posting-frequency",
              "method": "GET"
            }
          }
        },
        {
          "name": "Post Timeline",
          "value": "postTimeline",
          "action": "Get post analytics timeline",
          "routing": {
            "request": {
              "qs": {
                "postId": "={{ $parameter.postId }}",
                "toDate": "={{ $parameter.toDateTime || undefined }}",
                "fromDate": "={{ $parameter.fromDateTime || undefined }}"
              },
              "url": "/analytics/post-timeline",
              "method": "GET"
            }
          }
        },
        {
          "name": "Follower Stats",
          "value": "followerStats",
          "action": "Get follower stats",
          "routing": {
            "request": {
              "qs": {
                "toDate": "={{ $parameter.toDate || undefined }}",
                "fromDate": "={{ $parameter.fromDate || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}",
                "accountIds": "={{ $parameter.accountIds || undefined }}",
                "granularity": "={{ $parameter.granularity || undefined }}"
              },
              "url": "/accounts/follower-stats",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn Aggregate Analytics",
          "value": "linkedinAggregateAnalytics",
          "action": "Get LinkedIn aggregate stats",
          "routing": {
            "request": {
              "qs": {
                "endDate": "={{ $parameter.endDate || undefined }}",
                "metrics": "={{ $parameter.metrics || undefined }}",
                "startDate": "={{ $parameter.startDate || undefined }}",
                "aggregation": "={{ $parameter.aggregation || undefined }}"
              },
              "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-aggregate-analytics",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn Post Analytics",
          "value": "linkedinPostAnalytics",
          "action": "Get LinkedIn post stats",
          "routing": {
            "request": {
              "qs": {
                "urn": "={{ $parameter.urn }}"
              },
              "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-analytics",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn Post Reactions",
          "value": "linkedinPostReactions",
          "action": "Get LinkedIn post reactions",
          "routing": {
            "request": {
              "qs": {
                "urn": "={{ $parameter.urn }}",
                "limit": "={{ $parameter.limit || undefined }}",
                "cursor": "={{ $parameter.cursor || undefined }}"
              },
              "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-reactions",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "analytics"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "connect",
      "options": [
        {
          "name": "Connect with Credentials",
          "value": "connect",
          "action": "Connect Bluesky account with credentials",
          "routing": {
            "request": {
              "url": "/connect/bluesky/credentials",
              "body": {
                "handle": "={{ $parameter.handle }}",
                "profileId": "={{ $parameter.profileId }}",
                "appPassword": "={{ $parameter.appPassword }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Disconnect",
          "value": "disconnect",
          "action": "Disconnect Bluesky account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "bluesky"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listBoards",
      "options": [
        {
          "name": "List Boards",
          "value": "listBoards",
          "action": "List Pinterest boards",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Board",
          "value": "selectBoard",
          "action": "Select Pinterest board for posting",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
              "body": {
                "boardId": "={{ $parameter.boardId }}"
              },
              "method": "PUT"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pinterest"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listSubreddits",
      "options": [
        {
          "name": "List Subreddits",
          "value": "listSubreddits",
          "action": "List saved subreddits",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update Subreddits",
          "value": "updateSubreddits",
          "action": "Update saved subreddits",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
              "body": {
                "subredditIds": "={{ $parameter.subredditIds.split(',').map(s => s.trim()).filter(s => s) }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Search Posts",
          "value": "searchReddit",
          "action": "Search Reddit posts",
          "routing": {
            "request": {
              "qs": {
                "q": "={{ $parameter.q }}",
                "sort": "={{ $parameter.sort || 'new' }}",
                "after": "={{ $parameter.after || undefined }}",
                "limit": "={{ $parameter.limit || 25 }}",
                "accountId": "={{ $parameter.accountId }}",
                "subreddit": "={{ $parameter.subreddit || undefined }}",
                "restrict_sr": "={{ $parameter.restrict_sr || undefined }}"
              },
              "url": "/reddit/search",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Feed",
          "value": "feed",
          "action": "Get subreddit feed",
          "routing": {
            "request": {
              "qs": {
                "t": "={{ $parameter.t || undefined }}",
                "sort": "={{ $parameter.sort || 'hot' }}",
                "after": "={{ $parameter.after || undefined }}",
                "limit": "={{ $parameter.limit || 25 }}",
                "accountId": "={{ $parameter.accountId }}",
                "subreddit": "={{ $parameter.subreddit || undefined }}"
              },
              "url": "/reddit/feed",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reddit"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStatus",
      "options": [
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get Telegram connection status",
          "routing": {
            "request": {
              "url": "/connect/telegram",
              "method": "GET"
            }
          }
        },
        {
          "name": "Initiate Connection",
          "value": "initiate",
          "action": "Start Telegram connection flow",
          "routing": {
            "request": {
              "url": "/connect/telegram",
              "body": {
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "telegram"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listLocations",
      "options": [
        {
          "name": "List Locations",
          "value": "listLocations",
          "action": "List Google Business locations",
          "routing": {
            "request": {
              "qs": {
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/googlebusiness/locations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Location",
          "value": "selectLocation",
          "action": "Select Google Business location",
          "routing": {
            "request": {
              "url": "/connect/googlebusiness/select-location",
              "body": {
                "tempToken": "={{ $parameter.tempToken }}",
                "locationId": "={{ $parameter.locationId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Account Locations",
          "value": "listAccountLocations",
          "action": "List GBP locations for account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Switch Location",
          "value": "switchLocation",
          "action": "Switch GBP location for account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
              "body": {
                "locationId": "={{ $parameter.newLocationId }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "List Reviews",
          "value": "listReviews",
          "action": "List Google Business reviews",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page || 1 }}",
                "limit": "={{ $parameter.limit || 20 }}"
              },
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews",
              "method": "GET"
            }
          }
        },
        {
          "name": "Reply to Review",
          "value": "replyReview",
          "action": "Reply to a Google Business review",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
              "body": {
                "comment": "={{ $parameter.comment }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete Review Reply",
          "value": "deleteReply",
          "action": "Delete a review reply",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "googlebusiness"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listProfiles",
      "options": [
        {
          "name": "List Profiles",
          "value": "listProfiles",
          "action": "List Snapchat profiles",
          "routing": {
            "request": {
              "qs": {
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/snapchat/select-profile",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Profile",
          "value": "selectProfile",
          "action": "Select Snapchat profile",
          "routing": {
            "request": {
              "url": "/connect/snapchat/select-profile",
              "body": {
                "profileId": "={{ $parameter.snapchatProfileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "snapchat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Token",
          "value": "create",
          "action": "Create invite token",
          "routing": {
            "request": {
              "url": "/invite/tokens",
              "body": {
                "scope": "={{ $parameter.scope }}",
                "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invites"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listPostsLogs",
      "options": [
        {
          "name": "List Posts Logs",
          "value": "listPostsLogs",
          "action": "List publishing logs",
          "routing": {
            "request": {
              "qs": {
                "days": "={{ $parameter.days || 7 }}",
                "skip": "={{ $parameter.skip || 0 }}",
                "limit": "={{ $parameter.limit || 50 }}",
                "action": "={{ $parameter.action || undefined }}",
                "search": "={{ $parameter.search || undefined }}",
                "status": "={{ $parameter.status || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}"
              },
              "url": "/posts/logs",
              "method": "GET"
            }
          }
        },
        {
          "name": "List Connection Logs",
          "value": "listConnectionLogs",
          "action": "List connection logs",
          "routing": {
            "request": {
              "qs": {
                "days": "={{ $parameter.days || 7 }}",
                "skip": "={{ $parameter.skip || 0 }}",
                "limit": "={{ $parameter.limit || 50 }}",
                "status": "={{ $parameter.connectionStatus || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "eventType": "={{ $parameter.eventType || undefined }}"
              },
              "url": "/connections/logs",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Post Logs",
          "value": "getPostLogs",
          "action": "Get post logs",
          "routing": {
            "request": {
              "qs": {
                "limit": "={{ $parameter.limit || 50 }}"
              },
              "url": "=/posts/{{ $parameter.postId }}/logs",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "logs"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List API keys",
          "routing": {
            "request": {
              "url": "/api-keys",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create API key",
          "routing": {
            "request": {
              "url": "/api-keys",
              "body": {
                "name": "={{ $parameter.name }}",
                "scope": "={{ $parameter.scope }}",
                "expiresIn": "={{ $parameter.expiresIn || undefined }}",
                "permission": "={{ $parameter.permission }}",
                "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds : undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete API key",
          "routing": {
            "request": {
              "url": "=/api-keys/{{ $parameter.keyId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "apiKeys"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List users",
          "routing": {
            "request": {
              "url": "/users",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get user",
          "routing": {
            "request": {
              "url": "=/users/{{ $parameter.userId }}",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "users"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "youtubeDownload",
      "options": [
        {
          "name": "YouTube: Download",
          "value": "youtubeDownload",
          "action": "Download YouTube video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "action": "={{ $parameter.action }}",
                "format": "={{ $parameter.format }}",
                "quality": "={{ $parameter.quality }}",
                "formatId": "={{ $parameter.formatId }}"
              },
              "url": "/tools/youtube/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "YouTube: Transcript",
          "value": "youtubeTranscript",
          "action": "Get YouTube transcript",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "lang": "={{ $parameter.lang }}"
              },
              "url": "/tools/youtube/transcript",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram: Download",
          "value": "instagramDownload",
          "action": "Download Instagram media",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/instagram/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram: Hashtag Checker",
          "value": "instagramHashtagChecker",
          "action": "Check IG hashtag bans",
          "routing": {
            "request": {
              "url": "/tools/instagram/hashtag-checker",
              "body": {
                "hashtags": "={{ $parameter.hashtags }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "TikTok: Download",
          "value": "tiktokDownload",
          "action": "Download TikTok video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "action": "={{ $parameter.action }}",
                "formatId": "={{ $parameter.formatId }}"
              },
              "url": "/tools/tiktok/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Twitter/X: Download",
          "value": "twitterDownload",
          "action": "Download Twitter/X media",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "action": "={{ $parameter.action }}",
                "formatId": "={{ $parameter.formatId }}"
              },
              "url": "/tools/twitter/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Facebook: Download",
          "value": "facebookDownload",
          "action": "Download Facebook video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/facebook/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn: Download",
          "value": "linkedinDownload",
          "action": "Download LinkedIn video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/linkedin/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Bluesky: Download",
          "value": "blueskyDownload",
          "action": "Download Bluesky media",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/bluesky/download",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tools"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "List",
      "value": "list",
      "action": "List profiles",
      "routing": {
        "request": {
          "qs": {
            "includeOverLimit": "={{ $parameter.includeOverLimit || false }}"
          },
          "url": "/profiles",
          "method": "GET"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}",
          "method": "GET"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create profile",
      "routing": {
        "request": {
          "url": "/profiles",
          "body": {
            "name": "={{ $parameter.name }}",
            "color": "={{ $parameter.color || '' }}",
            "description": "={{ $parameter.description || '' }}"
          },
          "method": "POST"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}",
          "body": {
            "name": "={{ $parameter.name || undefined }}",
            "color": "={{ $parameter.color || undefined }}",
            "isDefault": "={{ $parameter.isDefault ?? undefined }}",
            "description": "={{ $parameter.description || undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}",
          "method": "DELETE"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List posts",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page || 1 }}",
            "limit": "={{ $parameter.limit || 10 }}",
            "dateTo": "={{ $parameter.dateTo || undefined }}",
            "search": "={{ $parameter.search || undefined }}",
            "sortBy": "={{ $parameter.sortBy || undefined }}",
            "status": "={{ $parameter.status || undefined }}",
            "dateFrom": "={{ $parameter.dateFrom || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "createdBy": "={{ $parameter.createdBy || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}",
            "includeHidden": "={{ $parameter.includeHidden ?? undefined }}"
          },
          "url": "/posts",
          "method": "GET"
        }
      },
      "resource": "posts"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get post",
      "routing": {
        "request": {
          "url": "=/posts/{{ $parameter.postId }}",
          "method": "GET"
        }
      },
      "resource": "posts"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create post",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/posts",
          "method": "POST",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update post",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}",
          "method": "PUT",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete post",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}",
          "method": "DELETE",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Retry",
      "value": "retry",
      "action": "Retry failed post",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}/retry",
          "method": "POST",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Unpublish",
      "value": "unpublish",
      "action": "Unpublish post",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}/unpublish",
          "body": {
            "platform": "={{ $parameter.unpublishPlatform }}"
          },
          "method": "POST",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Bulk Upload",
      "value": "bulkUpload",
      "action": "Bulk upload posts from CSV",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "qs": {
            "dryRun": "={{ $parameter.dryRun || false }}"
          },
          "url": "/posts/bulk-upload",
          "body": {
            "file": "={{ { value: $parameter.csvFile, options: { filename: 'bulk-upload.csv', contentType: 'text/csv' } } }}"
          },
          "method": "POST",
          "headers": {
            "Content-Type": "multipart/form-data"
          },
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Get Logs",
      "value": "logs",
      "action": "Get post publishing logs",
      "routing": {
        "request": {
          "url": "=/posts/{{ $parameter.postId }}/logs",
          "method": "GET"
        }
      },
      "resource": "posts"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload media",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/media",
          "method": "POST",
          "headers": {
            "Content-Type": "multipart/form-data"
          },
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "media"
    },
    {
      "name": "Get Presigned URL",
      "value": "presign",
      "action": "Get presigned URL for direct upload",
      "routing": {
        "request": {
          "url": "/media/presign",
          "body": {
            "size": "={{ $parameter.size }}",
            "filename": "={{ $parameter.filename }}",
            "contentType": "={{ $parameter.contentType }}"
          },
          "method": "POST"
        }
      },
      "resource": "media"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List social accounts",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/accounts",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get account details",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "body": {
            "isActive": "={{ $parameter.isActive }}",
            "displayName": "={{ $parameter.displayName || undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Disconnect account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "method": "DELETE"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get Health",
      "value": "health",
      "action": "Check account health",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/health",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get All Health",
      "value": "allHealth",
      "action": "Check all accounts health",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/accounts/health",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get Follower Stats",
      "value": "followerStats",
      "action": "Get follower statistics",
      "routing": {
        "request": {
          "qs": {
            "accountId": "={{ $parameter.accountId || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/accounts/follower-stats",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get Connect URL",
      "value": "getConnectUrl",
      "action": "Get OAuth connect URL",
      "routing": {
        "request": {
          "qs": {
            "headless": "={{ $parameter.headless || undefined }}",
            "profileId": "={{ $parameter.profileId }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
          },
          "url": "=/connect/{{ $parameter.platform }}",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Complete OAuth Callback",
      "value": "handleOAuthCallback",
      "action": "Complete OAuth callback",
      "routing": {
        "request": {
          "url": "=/connect/{{ $parameter.platform }}",
          "body": {
            "code": "={{ $parameter.code }}",
            "state": "={{ $parameter.state }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Facebook Pages (Headless)",
      "value": "listFacebookPages",
      "action": "List Facebook pages",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/facebook/select-page",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Facebook Page (Headless)",
      "value": "selectFacebookPage",
      "action": "Select Facebook page",
      "routing": {
        "request": {
          "url": "/connect/facebook/select-page",
          "body": {
            "pageId": "={{ $parameter.pageId }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ $parameter.userProfile || undefined }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Google Business Locations (Headless)",
      "value": "listGoogleBusinessLocations",
      "action": "List GBP locations",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/googlebusiness/locations",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Google Business Location (Headless)",
      "value": "selectGoogleBusinessLocation",
      "action": "Select GBP location",
      "routing": {
        "request": {
          "url": "/connect/googlebusiness/select-location",
          "body": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "locationId": "={{ $parameter.locationId }}",
            "userProfile": "={{ $parameter.userProfile }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Get Pending OAuth Data (Headless)",
      "value": "getPendingOAuthData",
      "action": "Get pending OAuth data",
      "routing": {
        "request": {
          "qs": {
            "token": "={{ $parameter.token }}"
          },
          "url": "/connect/pending-data",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List LinkedIn Organizations (Details)",
      "value": "listLinkedInOrganizations",
      "action": "List LinkedIn orgs",
      "routing": {
        "request": {
          "qs": {
            "orgIds": "={{ $parameter.orgIds }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/linkedin/organizations",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select LinkedIn Organization",
      "value": "selectLinkedInOrganization",
      "action": "Select LinkedIn org",
      "routing": {
        "request": {
          "url": "/connect/linkedin/select-organization",
          "body": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "accountType": "={{ $parameter.accountType }}",
            "userProfile": "={{ $parameter.userProfile }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
            "selectedOrganization": "={{ $parameter.selectedOrganization || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Pinterest Boards (Headless)",
      "value": "listPinterestBoardsForSelection",
      "action": "List Pinterest boards",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/pinterest/select-board",
          "method": "GET",
          "headers": {
            "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
          }
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Pinterest Board (Headless)",
      "value": "selectPinterestBoard",
      "action": "Select Pinterest board",
      "routing": {
        "request": {
          "url": "/connect/pinterest/select-board",
          "body": {
            "boardId": "={{ $parameter.boardId }}",
            "boardName": "={{ $parameter.boardName || undefined }}",
            "expiresIn": "={{ $parameter.expiresIn || undefined }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ $parameter.userProfile || undefined }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
            "refreshToken": "={{ $parameter.refreshToken || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Snapchat Profiles (Headless)",
      "value": "listSnapchatProfiles",
      "action": "List Snapchat profiles",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/snapchat/select-profile",
          "method": "GET",
          "headers": {
            "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
          }
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Snapchat Profile (Headless)",
      "value": "selectSnapchatProfile",
      "action": "Select Snapchat profile",
      "routing": {
        "request": {
          "url": "/connect/snapchat/select-profile",
          "body": {
            "expiresIn": "={{ $parameter.expiresIn || undefined }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ $parameter.userProfile }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
            "refreshToken": "={{ $parameter.refreshToken || undefined }}",
            "selectedPublicProfile": "={{ $parameter.selectedPublicProfile }}"
          },
          "method": "POST",
          "headers": {
            "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
          }
        }
      },
      "resource": "connect"
    },
    {
      "name": "Connect Bluesky via Credentials",
      "value": "connectBlueskyCredentials",
      "action": "Connect Bluesky account",
      "routing": {
        "request": {
          "url": "/connect/bluesky/credentials",
          "body": {
            "state": "={{ $parameter.state }}",
            "identifier": "={{ $parameter.identifier }}",
            "appPassword": "={{ $parameter.appPassword }}",
            "redirectUri": "={{ $parameter.redirectUri || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Connect WhatsApp via Credentials",
      "value": "connectWhatsAppCredentials",
      "action": "Connect WhatsApp via credentials",
      "routing": {
        "request": {
          "url": "/connect/whatsapp/credentials",
          "body": {
            "wabaId": "={{ $parameter.wabaId }}",
            "profileId": "={{ $parameter.profileId }}",
            "accessToken": "={{ $parameter.accessToken }}",
            "phoneNumberId": "={{ $parameter.phoneNumberId }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Generate Telegram Code",
      "value": "getTelegramConnectStatus",
      "action": "Generate Telegram code",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/connect/telegram",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Connect Telegram Directly",
      "value": "initiateTelegramConnect",
      "action": "Connect Telegram directly",
      "routing": {
        "request": {
          "url": "/connect/telegram",
          "body": {
            "chatId": "={{ $parameter.chatId }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Check Telegram Status",
      "value": "completeTelegramConnect",
      "action": "Check Telegram status",
      "routing": {
        "request": {
          "qs": {
            "code": "={{ $parameter.code }}"
          },
          "url": "/connect/telegram",
          "method": "PATCH"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Get Stats",
      "value": "getStats",
      "action": "Get usage statistics",
      "routing": {
        "request": {
          "url": "/usage-stats",
          "method": "GET"
        }
      },
      "resource": "usage"
    },
    {
      "name": "Get Usage Stats",
      "value": "getUsageStats",
      "action": "Get plan and usage stats",
      "routing": {
        "request": {
          "url": "/usage-stats",
          "method": "GET"
        }
      },
      "resource": "usage"
    },
    {
      "name": "List Pages",
      "value": "listPages",
      "action": "List Facebook pages",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/facebook/select-page",
          "method": "GET"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "Select Page",
      "value": "selectPage",
      "action": "Select Facebook page",
      "routing": {
        "request": {
          "url": "/connect/facebook/select-page",
          "body": {
            "pageId": "={{ $parameter.pageId }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ { id: $parameter.userProfileId || '', name: $parameter.userProfileName || '', email: $parameter.userProfileEmail || '', picture: $parameter.userProfilePicture || '', accessToken: $parameter.userProfileAccessToken || '' } }}"
          },
          "method": "POST"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "List Account Pages",
      "value": "listAccountPages",
      "action": "List Facebook pages for account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
          "method": "GET"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "Update Page",
      "value": "updatePage",
      "action": "Update Facebook page",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
          "body": {
            "selectedPageId": "={{ $parameter.selectedPageId }}"
          },
          "method": "PUT"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "Update Organization",
      "value": "updateOrganization",
      "action": "Update LinkedIn organization",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/linkedin-organization",
          "body": {
            "accountType": "={{ $parameter.accountType }}",
            "selectedOrganization": "={{ { id: $parameter.organizationId || '', urn: $parameter.organizationUrn || '', name: $parameter.organizationName || '', logoUrl: $parameter.organizationLogoUrl || '', description: $parameter.organizationDescription || '' } }}"
          },
          "method": "PUT"
        }
      },
      "resource": "linkedin"
    },
    {
      "name": "Clone Connection",
      "value": "cloneConnection",
      "action": "Clone connection to profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}/clone-connection",
          "body": {
            "targetPageId": "={{ $parameter.targetPageId || undefined }}",
            "targetPageName": "={{ $parameter.targetPageName || undefined }}",
            "sourceAccountId": "={{ $parameter.sourceAccountId }}",
            "targetAccountType": "={{ $parameter.targetAccountType || undefined }}",
            "targetOrganizationId": "={{ $parameter.targetOrganizationId || undefined }}",
            "targetOrganizationUrn": "={{ $parameter.targetOrganizationUrn || undefined }}",
            "targetPageAccessToken": "={{ $parameter.targetPageAccessToken || undefined }}",
            "targetOrganizationName": "={{ $parameter.targetOrganizationName || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "clone"
    },
    {
      "name": "Get Settings",
      "value": "get",
      "action": "Get webhook settings",
      "routing": {
        "request": {
          "url": "/webhooks/settings",
          "method": "GET"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Create Settings",
      "value": "create",
      "action": "Create webhook settings",
      "routing": {
        "request": {
          "url": "/webhooks/settings",
          "body": {
            "url": "={{ $parameter.url }}",
            "name": "={{ $parameter.name || undefined }}",
            "events": "={{ $parameter.events || undefined }}",
            "secret": "={{ $parameter.secret || undefined }}",
            "isActive": "={{ $parameter.isActive }}",
            "customHeaders": "={{ $parameter.customHeaders || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Update Settings",
      "value": "update",
      "action": "Update webhook settings",
      "routing": {
        "request": {
          "url": "/webhooks/settings",
          "body": {
            "_id": "={{ $parameter.webhookId }}",
            "url": "={{ $parameter.url || undefined }}",
            "name": "={{ $parameter.name || undefined }}",
            "events": "={{ $parameter.events || undefined }}",
            "secret": "={{ $parameter.secret || undefined }}",
            "isActive": "={{ $parameter.isActive }}",
            "customHeaders": "={{ $parameter.customHeaders || undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Delete Settings",
      "value": "delete",
      "action": "Delete webhook settings",
      "routing": {
        "request": {
          "qs": {
            "id": "={{ $parameter.webhookId }}"
          },
          "url": "/webhooks/settings",
          "method": "DELETE"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Test Webhook",
      "value": "test",
      "action": "Send test webhook",
      "routing": {
        "request": {
          "url": "/webhooks/test",
          "body": {
            "webhookId": "={{ $parameter.webhookId }}"
          },
          "method": "POST"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Get Logs",
      "value": "logs",
      "action": "Get webhook delivery logs",
      "routing": {
        "request": {
          "qs": {
            "event": "={{ $parameter.event || undefined }}",
            "limit": "={{ $parameter.limit || 50 }}",
            "status": "={{ $parameter.status || undefined }}",
            "webhookId": "={{ $parameter.webhookId || undefined }}"
          },
          "url": "/webhooks/logs",
          "method": "GET"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "List Slots",
      "value": "list",
      "action": "List queue slots",
      "routing": {
        "request": {
          "qs": {
            "all": "={{ $parameter.all ? 'true' : undefined }}",
            "queueId": "={{ $parameter.queueId || undefined }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/slots",
          "method": "GET"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Create Slot",
      "value": "create",
      "action": "Create queue slot",
      "routing": {
        "request": {
          "url": "/queue/slots",
          "body": {
            "name": "={{ $parameter.name }}",
            "slots": "={{ $parameter.slots }}",
            "active": "={{ $parameter.active }}",
            "timezone": "={{ $parameter.timezone }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Update Slot",
      "value": "update",
      "action": "Update queue slot",
      "routing": {
        "request": {
          "url": "/queue/slots",
          "body": {
            "name": "={{ $parameter.name || undefined }}",
            "slots": "={{ $parameter.slots }}",
            "active": "={{ $parameter.active }}",
            "queueId": "={{ $parameter.queueId || undefined }}",
            "timezone": "={{ $parameter.timezone }}",
            "profileId": "={{ $parameter.profileId }}",
            "setAsDefault": "={{ $parameter.setAsDefault }}",
            "reshuffleExisting": "={{ $parameter.reshuffleExisting }}"
          },
          "method": "PUT"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Delete Slot",
      "value": "delete",
      "action": "Delete queue slot",
      "routing": {
        "request": {
          "qs": {
            "queueId": "={{ $parameter.queueId }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/slots",
          "method": "DELETE"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Preview Queue",
      "value": "preview",
      "action": "Preview upcoming queue posts",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter.count || 20 }}",
            "queueId": "={{ $parameter.queueId || undefined }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/preview",
          "method": "GET"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Get Next Slot",
      "value": "nextSlot",
      "action": "Get next available queue slot",
      "routing": {
        "request": {
          "qs": {
            "queueId": "={{ $parameter.queueId || undefined }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/next-slot",
          "method": "GET"
        }
      },
      "resource": "queue"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List account groups",
      "routing": {
        "request": {
          "url": "/account-groups",
          "method": "GET"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create account group",
      "routing": {
        "request": {
          "url": "/account-groups",
          "body": {
            "name": "={{ $parameter.name }}",
            "accountIds": "={{ $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) }}"
          },
          "method": "POST"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update account group",
      "routing": {
        "request": {
          "url": "=/account-groups/{{ $parameter.groupId }}",
          "body": {
            "name": "={{ $parameter.name || undefined }}",
            "accountIds": "={{ $parameter.accountIds ? $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete account group",
      "routing": {
        "request": {
          "url": "=/account-groups/{{ $parameter.groupId }}",
          "method": "DELETE"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Get Analytics",
      "value": "get",
      "action": "Get post analytics",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page || undefined }}",
            "limit": "={{ $parameter.limit || undefined }}",
            "order": "={{ $parameter.order || undefined }}",
            "postId": "={{ $parameter.postId || undefined }}",
            "sortBy": "={{ $parameter.sortBy || undefined }}",
            "source": "={{ $parameter.source || undefined }}",
            "toDate": "={{ $parameter.toDate || undefined }}",
            "fromDate": "={{ $parameter.fromDate || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "accountId": "={{ $parameter.accountId || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "YouTube Daily Views",
      "value": "youtubeDailyViews",
      "action": "Get YouTube daily views",
      "routing": {
        "request": {
          "qs": {
            "endDate": "={{ $parameter.endDate || undefined }}",
            "videoId": "={{ $parameter.videoId }}",
            "accountId": "={{ $parameter.accountId }}",
            "startDate": "={{ $parameter.startDate || undefined }}"
          },
          "url": "/analytics/youtube/daily-views",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Instagram Account Insights",
      "value": "instagramAccountInsights",
      "action": "Get Instagram account-level insights",
      "routing": {
        "request": {
          "qs": {
            "since": "={{ $parameter.since || undefined }}",
            "until": "={{ $parameter.until || undefined }}",
            "metrics": "={{ $parameter.metrics || undefined }}",
            "accountId": "={{ $parameter.accountId }}",
            "breakdown": "={{ $parameter.breakdown || undefined }}",
            "metricType": "={{ $parameter.metricType || undefined }}"
          },
          "url": "/analytics/instagram/account-insights",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Instagram Demographics",
      "value": "instagramDemographics",
      "action": "Get Instagram audience demographics",
      "routing": {
        "request": {
          "qs": {
            "metric": "={{ $parameter.metric || undefined }}",
            "accountId": "={{ $parameter.accountId }}",
            "breakdown": "={{ $parameter.breakdown || undefined }}",
            "timeframe": "={{ $parameter.timeframe || undefined }}"
          },
          "url": "/analytics/instagram/demographics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Daily Metrics",
      "value": "dailyMetrics",
      "action": "Get daily aggregated metrics",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "toDate": "={{ $parameter.toDateTime || undefined }}",
            "fromDate": "={{ $parameter.fromDateTime || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "accountId": "={{ $parameter.accountId || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/daily-metrics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Best Time to Post",
      "value": "bestTime",
      "action": "Get best times to post",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/best-time",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Content Decay",
      "value": "contentDecay",
      "action": "Get content performance decay",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/content-decay",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Posting Frequency",
      "value": "postingFrequency",
      "action": "Get posting frequency vs engagement",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/posting-frequency",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Post Timeline",
      "value": "postTimeline",
      "action": "Get post analytics timeline",
      "routing": {
        "request": {
          "qs": {
            "postId": "={{ $parameter.postId }}",
            "toDate": "={{ $parameter.toDateTime || undefined }}",
            "fromDate": "={{ $parameter.fromDateTime || undefined }}"
          },
          "url": "/analytics/post-timeline",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Follower Stats",
      "value": "followerStats",
      "action": "Get follower stats",
      "routing": {
        "request": {
          "qs": {
            "toDate": "={{ $parameter.toDate || undefined }}",
            "fromDate": "={{ $parameter.fromDate || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}",
            "accountIds": "={{ $parameter.accountIds || undefined }}",
            "granularity": "={{ $parameter.granularity || undefined }}"
          },
          "url": "/accounts/follower-stats",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "LinkedIn Aggregate Analytics",
      "value": "linkedinAggregateAnalytics",
      "action": "Get LinkedIn aggregate stats",
      "routing": {
        "request": {
          "qs": {
            "endDate": "={{ $parameter.endDate || undefined }}",
            "metrics": "={{ $parameter.metrics || undefined }}",
            "startDate": "={{ $parameter.startDate || undefined }}",
            "aggregation": "={{ $parameter.aggregation || undefined }}"
          },
          "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-aggregate-analytics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "LinkedIn Post Analytics",
      "value": "linkedinPostAnalytics",
      "action": "Get LinkedIn post stats",
      "routing": {
        "request": {
          "qs": {
            "urn": "={{ $parameter.urn }}"
          },
          "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-analytics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "LinkedIn Post Reactions",
      "value": "linkedinPostReactions",
      "action": "Get LinkedIn post reactions",
      "routing": {
        "request": {
          "qs": {
            "urn": "={{ $parameter.urn }}",
            "limit": "={{ $parameter.limit || undefined }}",
            "cursor": "={{ $parameter.cursor || undefined }}"
          },
          "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-reactions",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Connect with Credentials",
      "value": "connect",
      "action": "Connect Bluesky account with credentials",
      "routing": {
        "request": {
          "url": "/connect/bluesky/credentials",
          "body": {
            "handle": "={{ $parameter.handle }}",
            "profileId": "={{ $parameter.profileId }}",
            "appPassword": "={{ $parameter.appPassword }}"
          },
          "method": "POST"
        }
      },
      "resource": "bluesky"
    },
    {
      "name": "Disconnect",
      "value": "disconnect",
      "action": "Disconnect Bluesky account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "method": "DELETE"
        }
      },
      "resource": "bluesky"
    },
    {
      "name": "List Boards",
      "value": "listBoards",
      "action": "List Pinterest boards",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
          "method": "GET"
        }
      },
      "resource": "pinterest"
    },
    {
      "name": "Select Board",
      "value": "selectBoard",
      "action": "Select Pinterest board for posting",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
          "body": {
            "boardId": "={{ $parameter.boardId }}"
          },
          "method": "PUT"
        }
      },
      "resource": "pinterest"
    },
    {
      "name": "List Subreddits",
      "value": "listSubreddits",
      "action": "List saved subreddits",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
          "method": "GET"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Update Subreddits",
      "value": "updateSubreddits",
      "action": "Update saved subreddits",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
          "body": {
            "subredditIds": "={{ $parameter.subredditIds.split(',').map(s => s.trim()).filter(s => s) }}"
          },
          "method": "PUT"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Search Posts",
      "value": "searchReddit",
      "action": "Search Reddit posts",
      "routing": {
        "request": {
          "qs": {
            "q": "={{ $parameter.q }}",
            "sort": "={{ $parameter.sort || 'new' }}",
            "after": "={{ $parameter.after || undefined }}",
            "limit": "={{ $parameter.limit || 25 }}",
            "accountId": "={{ $parameter.accountId }}",
            "subreddit": "={{ $parameter.subreddit || undefined }}",
            "restrict_sr": "={{ $parameter.restrict_sr || undefined }}"
          },
          "url": "/reddit/search",
          "method": "GET"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Get Feed",
      "value": "feed",
      "action": "Get subreddit feed",
      "routing": {
        "request": {
          "qs": {
            "t": "={{ $parameter.t || undefined }}",
            "sort": "={{ $parameter.sort || 'hot' }}",
            "after": "={{ $parameter.after || undefined }}",
            "limit": "={{ $parameter.limit || 25 }}",
            "accountId": "={{ $parameter.accountId }}",
            "subreddit": "={{ $parameter.subreddit || undefined }}"
          },
          "url": "/reddit/feed",
          "method": "GET"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get Telegram connection status",
      "routing": {
        "request": {
          "url": "/connect/telegram",
          "method": "GET"
        }
      },
      "resource": "telegram"
    },
    {
      "name": "Initiate Connection",
      "value": "initiate",
      "action": "Start Telegram connection flow",
      "routing": {
        "request": {
          "url": "/connect/telegram",
          "body": {
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "telegram"
    },
    {
      "name": "List Locations",
      "value": "listLocations",
      "action": "List Google Business locations",
      "routing": {
        "request": {
          "qs": {
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/googlebusiness/locations",
          "method": "GET"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Select Location",
      "value": "selectLocation",
      "action": "Select Google Business location",
      "routing": {
        "request": {
          "url": "/connect/googlebusiness/select-location",
          "body": {
            "tempToken": "={{ $parameter.tempToken }}",
            "locationId": "={{ $parameter.locationId }}"
          },
          "method": "POST"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "List Account Locations",
      "value": "listAccountLocations",
      "action": "List GBP locations for account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
          "method": "GET"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Switch Location",
      "value": "switchLocation",
      "action": "Switch GBP location for account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
          "body": {
            "locationId": "={{ $parameter.newLocationId }}"
          },
          "method": "PUT"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "List Reviews",
      "value": "listReviews",
      "action": "List Google Business reviews",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page || 1 }}",
            "limit": "={{ $parameter.limit || 20 }}"
          },
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews",
          "method": "GET"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Reply to Review",
      "value": "replyReview",
      "action": "Reply to a Google Business review",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
          "body": {
            "comment": "={{ $parameter.comment }}"
          },
          "method": "POST"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Delete Review Reply",
      "value": "deleteReply",
      "action": "Delete a review reply",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
          "method": "DELETE"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "List Profiles",
      "value": "listProfiles",
      "action": "List Snapchat profiles",
      "routing": {
        "request": {
          "qs": {
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/snapchat/select-profile",
          "method": "GET"
        }
      },
      "resource": "snapchat"
    },
    {
      "name": "Select Profile",
      "value": "selectProfile",
      "action": "Select Snapchat profile",
      "routing": {
        "request": {
          "url": "/connect/snapchat/select-profile",
          "body": {
            "profileId": "={{ $parameter.snapchatProfileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "method": "POST"
        }
      },
      "resource": "snapchat"
    },
    {
      "name": "Create Token",
      "value": "create",
      "action": "Create invite token",
      "routing": {
        "request": {
          "url": "/invite/tokens",
          "body": {
            "scope": "={{ $parameter.scope }}",
            "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "invites"
    },
    {
      "name": "List Posts Logs",
      "value": "listPostsLogs",
      "action": "List publishing logs",
      "routing": {
        "request": {
          "qs": {
            "days": "={{ $parameter.days || 7 }}",
            "skip": "={{ $parameter.skip || 0 }}",
            "limit": "={{ $parameter.limit || 50 }}",
            "action": "={{ $parameter.action || undefined }}",
            "search": "={{ $parameter.search || undefined }}",
            "status": "={{ $parameter.status || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}"
          },
          "url": "/posts/logs",
          "method": "GET"
        }
      },
      "resource": "logs"
    },
    {
      "name": "List Connection Logs",
      "value": "listConnectionLogs",
      "action": "List connection logs",
      "routing": {
        "request": {
          "qs": {
            "days": "={{ $parameter.days || 7 }}",
            "skip": "={{ $parameter.skip || 0 }}",
            "limit": "={{ $parameter.limit || 50 }}",
            "status": "={{ $parameter.connectionStatus || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "eventType": "={{ $parameter.eventType || undefined }}"
          },
          "url": "/connections/logs",
          "method": "GET"
        }
      },
      "resource": "logs"
    },
    {
      "name": "Get Post Logs",
      "value": "getPostLogs",
      "action": "Get post logs",
      "routing": {
        "request": {
          "qs": {
            "limit": "={{ $parameter.limit || 50 }}"
          },
          "url": "=/posts/{{ $parameter.postId }}/logs",
          "method": "GET"
        }
      },
      "resource": "logs"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List API keys",
      "routing": {
        "request": {
          "url": "/api-keys",
          "method": "GET"
        }
      },
      "resource": "apiKeys"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create API key",
      "routing": {
        "request": {
          "url": "/api-keys",
          "body": {
            "name": "={{ $parameter.name }}",
            "scope": "={{ $parameter.scope }}",
            "expiresIn": "={{ $parameter.expiresIn || undefined }}",
            "permission": "={{ $parameter.permission }}",
            "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds : undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "apiKeys"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete API key",
      "routing": {
        "request": {
          "url": "=/api-keys/{{ $parameter.keyId }}",
          "method": "DELETE"
        }
      },
      "resource": "apiKeys"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List users",
      "routing": {
        "request": {
          "url": "/users",
          "method": "GET"
        }
      },
      "resource": "users"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get user",
      "routing": {
        "request": {
          "url": "=/users/{{ $parameter.userId }}",
          "method": "GET"
        }
      },
      "resource": "users"
    },
    {
      "name": "YouTube: Download",
      "value": "youtubeDownload",
      "action": "Download YouTube video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "action": "={{ $parameter.action }}",
            "format": "={{ $parameter.format }}",
            "quality": "={{ $parameter.quality }}",
            "formatId": "={{ $parameter.formatId }}"
          },
          "url": "/tools/youtube/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "YouTube: Transcript",
      "value": "youtubeTranscript",
      "action": "Get YouTube transcript",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "lang": "={{ $parameter.lang }}"
          },
          "url": "/tools/youtube/transcript",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Instagram: Download",
      "value": "instagramDownload",
      "action": "Download Instagram media",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/instagram/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Instagram: Hashtag Checker",
      "value": "instagramHashtagChecker",
      "action": "Check IG hashtag bans",
      "routing": {
        "request": {
          "url": "/tools/instagram/hashtag-checker",
          "body": {
            "hashtags": "={{ $parameter.hashtags }}"
          },
          "method": "POST"
        }
      },
      "resource": "tools"
    },
    {
      "name": "TikTok: Download",
      "value": "tiktokDownload",
      "action": "Download TikTok video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "action": "={{ $parameter.action }}",
            "formatId": "={{ $parameter.formatId }}"
          },
          "url": "/tools/tiktok/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Twitter/X: Download",
      "value": "twitterDownload",
      "action": "Download Twitter/X media",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "action": "={{ $parameter.action }}",
            "formatId": "={{ $parameter.formatId }}"
          },
          "url": "/tools/twitter/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Facebook: Download",
      "value": "facebookDownload",
      "action": "Download Facebook video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/facebook/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "LinkedIn: Download",
      "value": "linkedinDownload",
      "action": "Download LinkedIn video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/linkedin/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Bluesky: Download",
      "value": "blueskyDownload",
      "action": "Download Bluesky media",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/bluesky/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    }
  ]

npm_readme:
  # n8n-nodes-zernio

  <img src="https://zernio.com/brand/logo-primary.png" alt="Zernio Logo" width="200"/>

  An n8n community node for the [Zernio API](https://zernio.com) - the professional social media management platform.

  **Schedule and manage social media posts across multiple platforms:**
  - 🐦 **Twitter/X** - Posts, threads, and automation
  - 📸 **Instagram** - Posts, Stories, Reels with Business account support
  - 👤 **Facebook** - Page management and posting
  - 💼 **LinkedIn** - Personal and company page posting
  - 🎵 **TikTok** - Direct video posting with privacy controls
  - 📹 **YouTube** - Videos and Shorts with custom thumbnails
  - 🧵 **Threads** - Meta's social platform
  - 🦋 **Bluesky** - Decentralized social network
  - 📌 **Pinterest** - Pin to boards
  - 🤖 **Reddit** - Post to subreddits
  - ✈️ **Telegram** - Channel posting
  - 📍 **Google Business** - Business profile posts and reviews
  - 👻 **Snapchat** - Public profile posting

  ## Version History

  - **1.0.0** - Initial release with comprehensive Zernio API integration

  ## Installation

  ### From n8n Community Nodes Panel (Recommended)

  1. Go to **Settings** → **Community Nodes** in your n8n instance
  2. Select **Install** and enter `n8n-nodes-zernio`
  3. Click **Install** and restart n8n
  4. The Zernio node will appear in your node palette

  > **Note:** Also available as `n8n-nodes-late` for backwards compatibility.

  ### From npm

  ```bash
  npm install n8n-nodes-zernio
  ```

  ### From Source

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

  ## Prerequisites

  1. **Zernio Account**: Sign up at [zernio.com](https://zernio.com)
  2. **API Key**: Generate an API key from your Zernio dashboard
  3. **Social Accounts**: Connect your social media accounts to Zernio profiles

  ## Credentials Setup

  1. Add a new credential in n8n
  2. Search for "Zernio API"
  3. Enter your API key from the Zernio dashboard

  ## Quick Start

  ### 1. Create a Profile

  Profiles organize your social media accounts by brand, client, or purpose.

  ```json
  {
    "resource": "profiles",
    "operation": "create",
    "name": "Personal Brand",
    "description": "My personal social media accounts",
    "color": "#4ade80"
  }
  ```

  ### 2. Connect Social Accounts

  Connect your social media platforms to the profile:

  ```json
  {
    "resource": "connect",
    "operation": "connect",
    "platform": "twitter",
    "profileId": "profile_123_abc"
  }
  ```

  ### 3. Schedule a Post

  Create posts across multiple platforms:

  ```json
  {
    "resource": "posts",
    "operation": "create",
    "content": "Hello, world! #automation",
    "platforms": [
      {"platform": "twitter", "accountId": "twitter_account_123"},
      {"platform": "linkedin", "accountId": "linkedin_account_456"}
    ],
    "scheduledFor": "2024-01-15T16:00:00",
    "timezone": "America/New_York"
  }
  ```

  ## Supported Operations

  ### Profiles
  - **List** - Get all profiles
  - **Create** - Create new profile (subject to plan limits)
  - **Update** - Update profile details
  - **Delete** - Delete profile (must be empty)

  ### Posts
  - **List** - Get posts with pagination and filters
  - **Get** - Get specific post details
  - **Create** - Schedule or publish posts
  - **Update** - Edit draft/scheduled posts
  - **Delete** - Delete posts (published posts cannot be deleted)
  - **Retry** - Retry failed posts
  - **Logs** - Get publishing logs for a post
  - **Bulk Upload** - Upload multiple posts at once

  ### Media
  - **Upload** - Upload images/videos up to 5GB
  - **Presign** - Get presigned URL for large file uploads

  ### Social Accounts
  - **List** - View connected accounts
  - **Get** - Get specific account details
  - **Update** - Update account settings (e.g., display name)
  - **Delete** - Disconnect accounts
  - **Health** - Check account connection health
  - **All Health** - Check health of all accounts
  - **Follower Stats** - Get follower statistics

  ### Account Groups
  - **List** - Get all account groups
  - **Get** - Get specific group details
  - **Create** - Create new account group
  - **Update** - Update group settings
  - **Delete** - Delete account group

  ### Connect Platform
  - **Connect** - Initiate OAuth for new platforms

  ### Usage Statistics
  - **Get Stats** - Monitor usage against plan limits

  ### Analytics
  - **Get** - Get post analytics across platforms
  - **YouTube Daily Views** - Get daily view statistics for YouTube

  ### Queue (Scheduling Slots)
  - **List** - Get queue slots for a profile
  - **Create** - Create new queue slot
  - **Update** - Update slot time
  - **Delete** - Remove queue slot
  - **Preview** - Preview upcoming scheduled posts
  - **Next Slot** - Get next available slot time

  ### Webhooks
  - **Get** - Get webhook configuration
  - **Create** - Create new webhook endpoint
  - **Update** - Update webhook settings
  - **Delete** - Remove webhook
  - **Test** - Send test webhook event
  - **Logs** - View webhook delivery history

  ### Facebook Management
  - **List Pages** - Get available Facebook pages
  - **Select Page** - Connect specific page
  - **List Account Pages** - Get pages for a specific account
  - **Update Page** - Change active page

  ### LinkedIn Management
  - **Update Organization** - Switch between personal/company posting

  ### Google Business Management
  - **List Locations** - Get available business locations
  - **Select Location** - Connect specific location
  - **List Account Locations** - Get locations for an account
  - **Switch Location** - Change active location
  - **List Reviews** - Get business reviews
  - **Reply Review** - Respond to a review
  - **Delete Reply** - Remove review response

  ### Pinterest Management
  - **List Boards** - Get available Pinterest boards
  - **Select Board** - Connect specific board

  ### Bluesky Management
  - **Connect** - Connect Bluesky account with credentials
  - **Disconnect** - Disconnect Bluesky account

  ### Reddit Management
  - **List Subreddits** - Get saved subreddits for posting
  - **Update Subreddits** - Update subreddit list
  - **Search** - Search for subreddits
  - **Feed** - Get subreddit feed (hot, new, top, rising)

  ### Snapchat Management
  - **List Profiles** - Get available public profiles
  - **Select Profile** - Connect specific profile

  ### Telegram Management
  - **Get Status** - Check Telegram connection status
  - **Initiate** - Start Telegram connection flow

  ### Clone Connection
  - **Clone Connection** - Reuse OAuth across profiles

  ### Team Management
  - **Invites: Create** - Invite team members with profile access

  ### API Keys
  - **List** - Get all API keys
  - **Create** - Generate new API key
  - **Delete** - Revoke API key

  ### Users
  - **List** - Get team members
  - **Get** - Get user details

  ### Logs
  - **List** - Get publishing logs with filters
  - **Get** - Get specific log entry

  ## Advanced Features

  ### Platform-Specific Settings

  #### Twitter/X Threads
  Create multi-tweet threads:

  ```json
  {
    "platforms": [
      {
        "platform": "twitter",
        "accountId": "twitter_account_123",
        "platformSpecificData": {
          "threadItems": [
            {"content": "Tweet 1 - Introduction"},
            {"content": "Tweet 2 - Details"},
            {"content": "Tweet 3 - Conclusion"}
          ]
        }
      }
    ]
  }
  ```

  #### Instagram Stories
  Post to Instagram Stories:

  ```json
  {
    "platforms": [
      {
        "platform": "instagram",
        "accountId": "instagram_account_123",
        "platformSpecificData": {
          "contentType": "story"
        }
      }
    ],
    "mediaItems": [
      {"type": "image", "url": "https://your-story-image.jpg"}
    ]
  }
  ```

  #### TikTok Privacy, Photo Carousel and Disclosure Settings

  Control TikTok privacy plus optional PHOTO carousel media type (with background
  music), commercial content disclosure, and AIGC labeling:

  ```json
  {
    "platforms": [
      {
        "platform": "tiktok",
        "accountId": "tiktok_account_123",
        "platformSpecificData": {
          "tiktokSettings": {
            "privacy_level": "PUBLIC_TO_EVERYONE",
            "allow_comment": true,
            "allow_duet": true,
            "allow_stitch": true,
            "media_type": "PHOTO",
            "auto_add_music": true,
            "commercial_content_type": "brand_organic",
            "is_brand_organic_post": true,
            "video_made_with_ai": false
          }
        }
      }
    ]
  }
  ```

  PHOTO carousel posts require `media_type: "PHOTO"` and support `auto_add_music`
  to attach TikTok-recommended background music. Brand and AIGC disclosures are
  optional but required by TikTok policy when applicable.

  #### YouTube Settings
  Add custom thumbnails and first comments:

  ```json
  {
    "platforms": [
      {
        "platform": "youtube",
        "accountId": "youtube_account_123",
        "platformSpecificData": {
          "firstComment": "Thanks for watching! Don't forget to like and subscribe!"
        }
      }
    ],
    "mediaItems": [
      {
        "type": "video",
        "url": "https://your-video.mp4",
        "thumbnail": "https://your-custom-thumbnail.jpg"
      }
    ],
    "tags": ["tutorial", "automation", "n8n"]
  }
  ```

  #### Bluesky Threads
  Create multi-post threads on Bluesky:

  ```json
  {
    "platforms": [
      {
        "platform": "bluesky",
        "accountId": "bluesky_account_123",
        "platformSpecificData": {
          "threadItems": [
            {"content": "Post 1 - Introduction"},
            {"content": "Post 2 - Details"},
            {"content": "Post 3 - Conclusion"}
          ]
        }
      }
    ]
  }
  ```

  ### Media Upload

  Upload files before using in posts:

  ```json
  {
    "resource": "media",
    "operation": "upload",
    "files": [
      {
        "filename": "image.jpg",
        "data": "base64_encoded_data"
      }
    ]
  }
  ```

  For large files (>4MB), use the presign operation:

  ```json
  {
    "resource": "media",
    "operation": "presign",
    "filename": "video.mp4",
    "contentType": "video/mp4"
  }
  ```

  ### Webhooks

  Set up webhooks to receive real-time notifications:

  ```json
  {
    "resource": "webhooks",
    "operation": "create",
    "url": "https://your-server.com/webhook",
    "events": ["post.published", "post.failed"]
  }
  ```

  Available webhook events:
  - `post.scheduled` - Post scheduled
  - `post.published` - Post published successfully
  - `post.failed` - Post failed to publish
  - `post.partial` - Post partially published (some platforms failed)

  ## Platform Requirements

  - **Instagram**: Business account required (Personal/Creator accounts not supported)
  - **Facebook**: Must be admin of Facebook pages
  - **LinkedIn**: Company pages require admin access
  - **TikTok**: Creator account recommended
  - **YouTube**: Channel access required
  - **Twitter/X**: Standard account
  - **Threads**: Standard account
  - **Bluesky**: Standard account (uses app password)
  - **Pinterest**: Business account recommended
  - **Reddit**: Account with posting privileges
  - **Telegram**: Bot token required
  - **Google Business**: Business profile owner/manager access
  - **Snapchat**: Public profile required

  ## Plan Limits

  Zernio enforces usage limits based on your plan:

  - **Free**: 10 posts/month, 2 Social Sets - $0/mo
  - **Build**: 120 posts/month, 10 Social Sets - $13/mo (billed yearly)
  - **Accelerate**: Unlimited posts, 50 Social Sets - $33/mo (billed yearly)
  - **Unlimited**: Unlimited posts, Unlimited Social Sets - $667/mo (billed yearly)

  Optional add-ons available: Analytics, Comments + DMs

  Monitor usage with the Usage Statistics operation.

  ## Error Handling

  The node handles various error scenarios:

  - **403**: Plan limits exceeded
  - **401**: Invalid API key
  - **400**: Invalid request data
  - **404**: Resource not found
  - **429**: Rate limit exceeded

  Check the node output for detailed error messages and upgrade suggestions.

  ## Development

  ### Prerequisites
  - Node.js 18+
  - TypeScript
  - n8n development environment

  ### Setup
  ```bash
  git clone https://github.com/zernio-dev/n8n-nodes-zernio.git
  cd n8n-nodes-zernio
  npm install
  npm run build
  ```

  ### Linting
  ```bash
  npm run lint        # Check for issues
  npm run lintfix     # Fix automatically
  ```

  ## Support

  - **Documentation**: [Zernio API Docs](https://docs.zernio.com)
  - **Dashboard**: [zernio.com/dashboard](https://zernio.com/dashboard)
  - **Email**: [miki@zernio.com](mailto:miki@zernio.com)
  - **Issues**: [GitHub Issues](https://github.com/zernio-dev/n8n-nodes-zernio/issues)

  ## License

  MIT

  ## Contributing

  Contributions are welcome! Please read our contributing guidelines and submit pull requests.

  ---

  **Made with love by the Zernio team**

  [Website](https://zernio.com) | [Documentation](https://docs.zernio.com) | [Dashboard](https://zernio.com/dashboard)

ai_documentation_summary:
  {"purpose":"The Zernio node enables scheduling, publishing, and managing social media posts across 13+ platforms including Twitter, Instagram, LinkedIn, and TikTok. It also supports media management, analytics, and specialized features like Google Business reviews and YouTube view tracking.","capabilities":["Schedule and publish posts across multiple platforms simultaneously","Create, update, and delete social media profiles","Upload media files up to 5GB with presigned URLs","Manage social account connections and health checks","Retrieve follower statistics and usage analytics","Handle Google Business reviews and location management","Manage Pinterest boards and Bluesky connections","Schedule posts using queue slots with timezone support","Monitor webhook deliveries and test endpoints","Bulk upload multiple posts at once"],"authentication":"API key required","commonUseCases":["Cross-platform social media posting from a single workflow","Automated content scheduling with timezone awareness","Managing multiple client or brand profiles","Tracking social media performance and analytics","Handling Google Business profile updates and reviews"],"limitations":["Published posts cannot be deleted","Profile creation is subject to plan limits","Some platforms require OAuth connection flow","Media upload limited to 5GB per file"],"relatedNodes":[]}


