# nodes

node_type: n8n-nodes-wawcd.wawcdTrigger
package_name: n8n-nodes-wawcd
display_name: WAWCD Plugin Receive Message
description: Starts the workflow when WAWCD calls your n8n webhook URL (outgoing webhooks)
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: wawcd
author_github_url: https://github.com/WAWCD-LLC/wawcd-n8n-node.git
npm_package_name: n8n-nodes-wawcd
npm_version: 1.2.0
community_fetched_at: 2026-07-14T14:40:34.341Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-wawcd

  Official **WAWCD** community nodes for [n8n](https://n8n.io). Connect WhatsApp automation in n8n to your WAWCD account — send messages from workflows and trigger workflows when customers message you on WhatsApp.

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

  ---

  ## Table of contents

  - [What this package does](#what-this-package-does)
  - [How it works](#how-it-works)
  - [Features](#features)
  - [Prerequisites](#prerequisites)
  - [Installation](#installation)
  - [Quick start](#quick-start)
  - [Credentials (WAWCD API)](#credentials-wawcd-api)
  - [Nodes](#nodes)
  - [WAWCD WhatsApp Receice Message (Trigger)](#wawcd-whatsapp-receice-message-trigger)
  - [WAWCD WhatsApp Send Message](#wawcd-whatsapp-send-message)
  - [Example workflows](#example-workflows)
  - [Common use cases](#common-use-cases)
  - [Debugging & troubleshooting](#debugging--troubleshooting)
  - [Development](#development)
  - [Publishing to npm](#publishing-to-npm)
  - [Submit for n8n verification](#submit-for-n8n-verification)
  - [Support & links](#support--links)
  - [License](#license)

  ---

  ## What this package does

  This npm package adds two n8n nodes that bridge **n8n workflows** and **WAWCD** (WhatsApp automation via the WAWCD browser extension):

  | Direction | Node | What happens |
  |-----------|------|--------------|
  | **Inbound** (WhatsApp → n8n) | **WAWCD WhatsApp Receice Message** | WAWCD POSTs a JSON payload to your n8n webhook when someone messages your connected WhatsApp line. The workflow starts automatically. |
  | **Outbound** (n8n → WhatsApp) | **WAWCD WhatsApp Send Message** | n8n calls the WAWCD API to deliver text, media, audio, location, or scheduled messages to one or more WhatsApp numbers. |

  You can use either node alone or chain them — for example, receive a customer message, run AI or CRM logic, then reply with **Send Message**.

  ---

  ## How it works

  ```mermaid
  sequenceDiagram
      participant WA as WhatsApp contact
      participant WAWCD as WAWCD extension + API
      participant n8n as n8n workflow

      Note over WA,n8n: Inbound — Receive Message (Trigger)
      WA->>WAWCD: Customer sends message
      WAWCD->>n8n: POST JSON to webhook URL
      n8n->>n8n: Workflow runs (AI, CRM, etc.)

      Note over WA,n8n: Outbound — Send Message
      n8n->>WAWCD: POST /webhooks/send-message (Bearer token)
      WAWCD->>WA: Message delivered via WhatsApp Web
  ```

  **Inbound flow**

  1. You add **WAWCD WhatsApp Receice Message** to a workflow and copy its webhook URL.
  2. In WAWCD → **Outgoing Webhooks**, you register that URL (POST).
  3. When a contact messages your WAWCD-connected WhatsApp account, WAWCD sends JSON to n8n.
  4. The node normalizes field names (including `reciver-*` → `receiver-*`) and passes data to the next nodes.

  **Outbound flow**

  1. You create **WAWCD API** credentials in n8n (API base URL + incoming webhook token).
  2. You add **WAWCD WhatsApp Send Message** and configure recipient(s) and content.
  3. The node POSTs to `{API Base URL}/webhooks/send-message` with `Authorization: Bearer <token>`.
  4. WAWCD delivers the message through WhatsApp Web (extension must be online).

  The WhatsApp account is tied to your **incoming webhook token** on the WAWCD backend — you do not pass a separate account ID in the send body.

  ---

  ## Features

  ### WAWCD WhatsApp Receice Message (Trigger)

  - Webhook trigger with **Test URL** (while editing) and **Production URL** (when workflow is active)
  - Optional custom **Path** segment for the webhook URL
  - **Incoming Authentication** — none, or shared secret via `Authorization: Bearer` or `X-WAWCD-Token`
  - **Strict Payload Validation** — reject requests that do not look like WAWCD JSON
  - Normalizes WAWCD’s `reciver-*` typo fields to canonical `receiver-*` keys
  - Supports nested `body` objects in the payload
  - Preserves all other WAWCD fields unchanged

  ### WAWCD WhatsApp Send Message

  - Send to **one or many** recipients (comma or newline separated)
  - **Text** messages with `{first_name}` placeholder support
  - **Media URLs** (images, documents, etc.) with optional caption
  - **Audio URLs**
  - **Location** pins (latitude / longitude)
  - **Random delay** range (`minDelay` / `maxDelay` in seconds)
  - **Scheduled send** via `schedule-timestamp`
  - Personalization fields: `first_name`, `last_name`
  - Built-in **credential test** (validates API reachability and token)
  - **60 second** request timeout; bearer tokens are never echoed in error messages
  - Usable as an **AI tool** in n8n agent workflows

  ### Security

  - Credential tokens stored as password fields in n8n
  - Send errors redact `Bearer` token values
  - Optional webhook shared secret on the trigger node

  ---

  ## Prerequisites

  Before using these nodes you need:

  1. A **[WAWCD](https://wawcd.com)** account with the browser extension installed
  2. **WhatsApp Web** connected and the WAWCD extension **online** (required for outbound delivery)
  3. A **self-hosted n8n** instance or n8n Cloud with [community nodes](https://docs.n8n.io/integrations/community-nodes/installation/) enabled
  4. An **Incoming Webhook Token** from WAWCD → Webhooks → Incoming (for Send Message)
  5. An **Outgoing Webhook** configured in WAWCD (for Receive Message)

  ---

  ## Installation

  ### From npm (after the package is published)

  ```bash
  npm install n8n-nodes-wawcd
  ```

  In n8n Cloud or self-hosted with community nodes UI: search for **WAWCD** in **Settings → Community nodes → Install** and install `n8n-nodes-wawcd`.

  > **Note:** If you get `404 Not Found`, the package has not been published to npm yet. Use [local installation](#local-installation-before-publish) below.

  ### Self-hosted — custom extensions directory

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

  ```bash
  # Example: install into n8n's custom node directory
  cd ~/.n8n/custom
  npm install n8n-nodes-wawcd
  ```

  Restart n8n after installing.

  ### Local installation (before publish)

  Use this while developing or before the first npm release.

  **Option 1 — install from this repository folder**

  ```bash
  cd /path/to/wawcd-n8n-node
  npm install
  npm run build

  # In your n8n project or custom nodes folder:
  npm install /path/to/wawcd-n8n-node
  ```

  **Option 2 — npm link**

  ```bash
  # In this repo
  cd /path/to/wawcd-n8n-node
  npm install
  npm run build
  npm link

  # In your n8n install directory
  npm link n8n-nodes-wawcd
  ```

  Restart n8n. You should see **WAWCD WhatsApp Receice Message** and **WAWCD WhatsApp Send Message** in the node panel.

  ### Environment variable (Docker / server installs)

  Set n8n’s community nodes environment variable as described in the [n8n docs](https://docs.n8n.io/hosting/configuration/environment-variables/nodes/):

  ```bash
  N8N_COMMUNITY_PACKAGES=n8n-nodes-wawcd
  ```

  ---

  ## Quick start

  ### 1. Create credentials

  1. In n8n, go to **Credentials → Add credential → WAWCD API**.
  2. Set **API Base URL** (default: `https://backend.wawcd.com`).
  3. Paste your **Incoming Webhook Token** from WAWCD → Webhooks → Incoming.
  4. Click **Test** — you should see *Connection successful*.

  ### 2. Send a test message

  1. Create a workflow with a **Manual Trigger** → **WAWCD WhatsApp Send Message**.
  2. Select your WAWCD API credentials.
  3. Set **Receiver WhatsApp Number** (e.g. `923009897989`).
  4. Set **Message** (e.g. `Hello from n8n!`).
  5. Execute the workflow. Ensure WhatsApp Web + WAWCD extension are online.

  ### 3. Receive a message

  1. Create a workflow with **WAWCD WhatsApp Receice Message**.
  2. Copy the **Test URL** from the node panel.
  3. In WAWCD → **Outgoing Webhooks**, add a webhook: method **POST**, paste the URL.
  4. Send a WhatsApp message to your connected line — the workflow should execute.

  ---

  ## Credentials (WAWCD API)

  | Field | Required | Description |
  |-------|----------|-------------|
  | **API Base URL** | Yes | WAWCD API host. Default: `https://backend.wawcd.com`. No trailing slash. |
  | **Incoming Webhook Token** | Yes | Token from WAWCD extension → Webhooks → Incoming. Used as `Authorization: Bearer <token>` on send requests. Paste the token only, or a full `Bearer …` line. |

  **Credential test behavior**

  | Result | Meaning |
  |--------|---------|
  | Connection successful | API reachable and token accepted |
  | Invalid token or access denied | HTTP 401/403 — check your token |
  | Host reachable (404 on root is acceptable) | Server responds; root path may 404 |
  | Could not reach WAWCD API | Wrong URL, network issue, or firewall |

  ---

  ## Nodes

  ### WAWCD WhatsApp Receice Message (Trigger)

  Starts a workflow when WAWCD POSTs JSON to your n8n webhook URL.

  #### Setup steps

  1. Add the node to a workflow.
  2. (Optional) Set a custom **Path** — leave empty to use the auto-generated webhook ID.
  3. (Optional) Enable **Incoming Authentication → Shared Secret** and set **Webhook Token** to match WAWCD Outgoing → Bearer.
  4. (Optional) Enable **Strict Payload Validation** to reject non-WAWCD payloads.
  5. Copy **Test URL** while building, or **Production URL** after activating the workflow.
  6. Register the URL in WAWCD → **Outgoing Webhooks** (POST).

  #### Output fields (after normalization)

  | Field | Description |
  |-------|-------------|
  | `user-whatsapp-number` | Your WAWCD-connected WhatsApp line |
  | `receiver-whatsapp-number` | Contact who sent the message |
  | `receiver-display-name` | Contact display name |
  | `receiver-saved-name` | Saved contact name |
  | `receiver-message` | Message text |
  | `receiver-message-timestamp` | Message timestamp |
  | `receiver-country` / `receiver-country-code` | Contact country info |
  | `whatsapp_account_id` | Account ID when present |

  Example output:

  ```json
  {
    "user-whatsapp-number": "+12456784545",
    "receiver-whatsapp-number": "96234343434",
    "receiver-display-name": "John Doe",
    "receiver-message": "Hello, I completed the payment online.",
    "receiver-message-timestamp": "2025-02-26T00:00:00Z"
  }
  ```

  #### Reply to the sender

  Connect to **WAWCD WhatsApp Send Message** and set:

  ```
  Receiver WhatsApp Number: {{ $json['receiver-whatsapp-number'] }}
  Message: {{ $json['receiver-message'] }}
  ```

  ---

  ### WAWCD WhatsApp Send Message

  Sends WhatsApp messages via `POST {API Base URL}/webhooks/send-message`.

  #### Parameters

  | Parameter | Required | Description |
  |-----------|----------|-------------|
  | **Receiver WhatsApp Number** | Yes | One or more numbers with country code. Comma or newline separated. Accepts `+923…` or `923…`. |
  | **Message** | Conditional | Text body. Required unless sending media, audio, or location. Supports `{first_name}`. |
  | **Additional Fields** | No | See table below. |

  #### Additional fields

  | Field | Description |
  |-------|-------------|
  | **Media URLs** | One or more image/document URLs |
  | **Audio URLs** | One or more audio file URLs |
  | **Caption** | Caption when sending media |
  | **Send Location** | Enable location pin |
  | **Latitude / Longitude** | Required when Send Location is enabled |
  | **First Name / Last Name** | Personalization for `{first_name}` |
  | **Min Delay / Max Delay** | Random delay range in seconds before sending |
  | **Schedule Timestamp** | ISO-style datetime to schedule the message |

  #### Example API payload (simple text)

  ```json
  {
    "receiver-whatsapp-number": ["923009897989"],
    "message": "hello"
  }
  ```

  #### Example API payload (media + delay)

  ```json
  {
    "receiver-whatsapp-number": ["923009897989", "923001234567"],
    "message": "Hi {first_name}!",
    "first_name": "Ali",
    "mediaUrl": ["https://example.com/image.jpg"],
    "caption": "Your order receipt",
    "minDelay": 2,
    "maxDelay": 5
  }
  ```

  ---


  ## Example workflows

  Import JSON files from the [`examples/`](examples/) folder in n8n (**Workflows → Import from file**):

  | File | Description |
  |------|-------------|
  | [`shopify-order.json`](examples/shopify-order.json) | Manual trigger with sample order data → **Send Message** (order notification) |
  | [`ai-support.json`](examples/ai-support.json) | **Receive Message** → processing stub → **Send Message** (auto-reply pattern) |
  | [`lead-capture.json`](examples/lead-capture.json) | **Receive Message** with strict validation → field mapping stub |

  Replace placeholder credentials and webhook URLs before running in production.

  ---

  ## Common use cases

  | Use case | Workflow pattern |
  |----------|------------------|
  | Order notifications | Shopify/WooCommerce trigger → **Send Message** |
  | AI customer support | **Receive Message** → OpenAI/AI Agent → **Send Message** |
  | Lead capture | **Receive Message** (strict validation) → CRM node (HubSpot, Airtable, etc.) |
  | Appointment reminders | Schedule trigger → **Send Message** |
  | Two-way chat bot | **Receive Message** → logic/Code node → **Send Message** with `{{ $json['receiver-whatsapp-number'] }}` |

  ---

  ## Debugging & troubleshooting

  ### Send Message issues

  | Symptom | Check |
  |---------|-------|
  | Credential test fails | Verify **API Base URL** and **Incoming Webhook Token** in WAWCD → Webhooks → Incoming |
  | 401 / access denied | Token expired or wrong — regenerate in WAWCD |
  | Message not delivered | WhatsApp Web must be open; WAWCD extension must be online |
  | Timeout after 60s | Network or WAWCD API slow — check `https://backend.wawcd.com` reachability |
  | "At least one receiver required" | Set **Receiver WhatsApp Number** with country code |
  | "Provide at least one of: Message, Media…" | Add text, media URL, audio URL, or location |

  **Debug commands (local development)**

  ```bash
  cd /path/to/wawcd-n8n-node
  npm run lint          # Check n8n community node standards
  npm run build         # Compile TypeScript → dist/
  npm run dev           # Run n8n locally with this node loaded (hot reload)
  ```

  Use n8n’s **Executions** panel to inspect input/output JSON for each node run. Enable **Continue On Fail** on Send Message to capture per-item errors without stopping the workflow.

  ### Receive Message (Trigger) issues

  | Symptom | Check |
  |---------|-------|
  | Workflow never triggers | Workflow must be **active** for Production URL; use Test URL while editing |
  | 401 Unauthorized | **Webhook Token** in n8n must match WAWCD Outgoing → Bearer |
  | 400 Invalid payload | Enable/disable **Strict Payload Validation**; confirm WAWCD sends JSON with expected fields |
  | Wrong field names | Node auto-normalizes `reciver-*` → `receiver-*`; use `$json['receiver-whatsapp-number']` in expressions |
  | Webhook URL not reachable | n8n must be publicly accessible (or use ngrok/tunnel for local dev) |

  **Testing the webhook manually**

  ```bash
  curl -X POST "https://your-n8n.example.com/webhook-test/your-path" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer YOUR_WEBHOOK_TOKEN" \
    -d '{
      "user-whatsapp-number": "+12456784545",
      "receiver-whatsapp-number": "96234343434",
      "receiver-message": "Test message"
    }'
  ```

  ### npm install returns 404

  The package is not on npm yet. Use [local installation](#local-installation-before-publish) or wait until the first release is published via GitHub Actions.

  ### Node not visible in n8n

  1. Confirm install: `npm list n8n-nodes-wawcd` in your n8n directory
  2. Restart n8n
  3. Search for **WAWCD** in the node panel
  4. For Docker: rebuild/restart the container after installing the package

  ---

  ## Development

  ### Requirements

  - Node.js LTS
  - npm

  ### Commands

  | Command | Description |
  |---------|-------------|
  | `npm install` | Install dependencies |
  | `npm run lint` | Run n8n community node linter |
  | `npm run lint:fix` | Auto-fix lint issues where possible |
  | `npm run build` | Compile TypeScript to `dist/` |
  | `npm run build:watch` | Watch mode TypeScript compile |
  | `npm run dev` | Start local n8n with this node (hot reload) |
  | `npm run release` | Bump version, tag, push — triggers npm publish workflow |

  ### Project structure

  ```
  wawcd-n8n-node/
  ├── credentials/          # WAWCD API credential type
  ├── nodes/
  │   ├── WawcdSendMessage/ # Send Message node
  │   ├── WawcdTrigger/     # Receive Message trigger
  │   └── shared/           # Shared payload & HTTP logic
  ├── examples/             # Sample workflow JSON files
  ├── dist/                 # Compiled output (generated by build)
  ├── package.json
  └── README.md
  ```

  ### Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Run `npm run lint && npm run build`
  4. Open a pull request against [WAWCD-LLC/wawcd-n8n-node](https://github.com/WAWCD-LLC/wawcd-n8n-node)

  ---

  ## Publishing to npm

  This package is published via GitHub Actions with [npm provenance](https://docs.npmjs.com/generating-provenance-statements), as required by n8n for verified community nodes (from May 2026).

  ### One-time setup

  1. Create the package on [npmjs.com](https://www.npmjs.com/) (or it is created on first publish if the name is free).
  2. On npm → package **Settings → Publish access → Trusted Publishers → Add publisher**:
     - **Repository owner:** `WAWCD-LLC`
     - **Repository name:** `wawcd-n8n-node`
     - **Workflow name:** `publish.yml`
  3. Alternatively, set an `NPM_TOKEN` secret in GitHub Actions (see [`.github/workflows/publish.yml`](.github/workflows/publish.yml)).

  ### Release

  ```bash
  npm run release
  ```

  This lints, builds, prompts for a version bump, commits, tags (e.g. `0.1.1`), and pushes. The [`publish.yml`](.github/workflows/publish.yml) workflow publishes to npm when a version tag is pushed.

  After publish, install with:

  ```bash
  npm install n8n-nodes-wawcd
  ```

  ---

  ## Submit for n8n verification

  To appear in n8n’s verified community nodes panel:

  1. Ensure `npm run lint` passes and the package has no runtime dependencies
  2. Publish to npm via GitHub Actions (see above)
  3. Submit at the [n8n Creator Portal](https://creators.n8n.io/nodes)

  Requirements: [Submit community nodes](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/) · [Verification guidelines](https://docs.n8n.io/integrations/creating-nodes/build/reference/verification-guidelines/) · [UX guidelines](https://docs.n8n.io/integrations/creating-nodes/build/reference/ux-guidelines/)

  ---

  ## Support & links

  | Resource | URL |
  |----------|-----|
  | WAWCD website | [wawcd.com](https://wawcd.com) |
  | GitHub issues | [github.com/WAWCD-LLC/wawcd-n8n-node/issues](https://github.com/WAWCD-LLC/wawcd-n8n-node/issues) |
  | n8n community nodes docs | [docs.n8n.io/integrations/community-nodes](https://docs.n8n.io/integrations/community-nodes/installation/) |
  | n8n Creator Portal | [creators.n8n.io/nodes](https://creators.n8n.io/nodes) |
  | npm package | [npmjs.com/package/n8n-nodes-wawcd](https://www.npmjs.com/package/n8n-nodes-wawcd) |

  ---

  ## License

  [MIT](LICENSE) — Copyright (c) WAWCD

ai_documentation_summary:
  {"purpose":"The WAWCD Plugin Receive Message node triggers an n8n workflow when a customer sends a message to a WhatsApp account managed by the WAWCD browser extension, normalizing incoming JSON payloads for further processing.","capabilities":["Webhook trigger for incoming WhatsApp messages","Incoming authentication via shared secret (Bearer or X-WAWCD-Token)","Strict payload validation to reject non-WAWCD requests","Automatic normalization of WAWCD's 'reciver-*' typo fields to 'receiver-*'","Support for nested body objects in the payload","Customizable webhook path segment","Test and Production URL modes","Usable as an AI tool in n8n agent workflows"],"authentication":"Incoming Authentication: None or Shared Secret via 'Authorization: Bearer' or 'X-WAWCD-Token' headers","commonUseCases":["Triggering AI chatbots to respond to customer WhatsApp inquiries","Integrating WhatsApp messages into CRM systems for lead management","Automated order confirmation or status updates upon customer message","Data extraction and logging from customer interactions"],"limitations":["Requires the WAWCD browser extension to be online for outbound functionality (though receive works independently)","Does not support sending messages directly; must be paired with the 'WAWCD Plugin Send Message' node","Incoming webhook token from WAWCD must be configured separately in the WAWCD backend","No built-in support for multiple incoming webhooks per account without manual configuration"],"relatedNodes":["WAWCD Plugin Send Message","WAWCD API (Credentials)","Webhook Trigger (Standard n8n node)"]}


node_type: n8n-nodes-weclapp.weclappTrigger
package_name: n8n-nodes-weclapp
display_name: Weclapp Trigger
description: Starts the workflow when a Weclapp event occurs
category: Community
development_style: declarative
version: 1
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: bashlenix
author_github_url: https://github.com/Bashlenix/Weclapp_n8n_Custom_Node.git
npm_package_name: n8n-nodes-weclapp
npm_version: 0.2.8
community_fetched_at: 2026-07-14T14:40:34.343Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "party",
      "options": [
        {
          "name": "Accounting Transaction",
          "value": "accountingTransaction"
        },
        {
          "name": "Article",
          "value": "article"
        },
        {
          "name": "Article Category",
          "value": "articleCategory"
        },
        {
          "name": "Comment",
          "value": "comment"
        },
        {
          "name": "Currency",
          "value": "currency"
        },
        {
          "name": "Document",
          "value": "document"
        },
        {
          "name": "Incoming Goods",
          "value": "incomingGoods"
        },
        {
          "name": "Manufacturer",
          "value": "manufacturer"
        },
        {
          "name": "Party (Customer / Contact)",
          "value": "party"
        },
        {
          "name": "Purchase Invoice",
          "value": "purchaseInvoice"
        },
        {
          "name": "Purchase Order",
          "value": "purchaseOrder"
        },
        {
          "name": "Quotation",
          "value": "quotation"
        },
        {
          "name": "Sales Invoice",
          "value": "salesInvoice"
        },
        {
          "name": "Sales Open Item",
          "value": "salesOpenItem"
        },
        {
          "name": "Sales Order",
          "value": "salesOrder"
        },
        {
          "name": "Shipment",
          "value": "shipment"
        },
        {
          "name": "Variant Article",
          "value": "variantArticle"
        }
      ],
      "description": "The Weclapp entity type to watch",
      "displayName": "Resource",
      "noDataExpression": true
    }
  ]

npm_readme:
  # n8n-nodes-weclapp

  An [n8n](https://n8n.io/) community node for the [Weclapp](https://www.weclapp.com/) ERP/CRM platform. It lets you read and write Weclapp data — customers, orders, articles, shipments, documents, and more — directly from your n8n workflows, and react to Weclapp events in real time with the built-in trigger node.

  ## Installation

  In your n8n instance, open **Settings → Community Nodes → Install** and enter:

  ```
  n8n-nodes-weclapp
  ```

  n8n will install the package and restart. The **Weclapp** and **Weclapp Trigger** nodes will appear in the node palette.

  > Requires n8n ≥ 0.187.0 (community node support).

  ## Credentials

  1. Log in to your Weclapp account.
  2. Click your avatar (top-right) → **My Settings → API**.
  3. Copy your **API token**.
  4. In n8n, create a new **Weclapp API** credential:
     - **Subdomain** — the part before `.weclapp.com` in your URL (e.g. `mycompany` for `mycompany.weclapp.com`).
     - **API Token** — the token you copied above.

  n8n will test the credential automatically against the `/user/count` endpoint.

  ## Weclapp Node

  Performs CRUD operations on the following Weclapp resources:

  | Resource | Create | Get by ID | Search | Count | Update | Delete | Download |
  |---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
  | Party (Customer / Contact) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Article | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Article Category | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Sales Order | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Quotation | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Sales Invoice | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Sales Open Item | | ✓ | ✓ | ✓ | | ✓ | |
  | Shipment | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Purchase Order | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Purchase Invoice | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Incoming Goods | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Comment | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Currency | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Document | | ✓ | ✓ | ✓ | | | ✓ |
  | Manufacturer | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Accounting Transaction | | ✓ | ✓ | ✓ | | | |
  | Variant Article | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Warehouse Stock | | ✓ | ✓ | ✓ | | | |
  | Warehouse Stock Movement | | ✓ | ✓ | ✓ | | | |
  | User | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |

  > **Read-only resources** — Document, Accounting Transaction, Warehouse Stock, and Warehouse Stock Movement do not support Create, Update, or Delete.

  ### Operations

  #### Get by ID

  Fetches a single record by its Weclapp internal ID.

  **Example — look up a customer:**
  - Resource: `Party (Customer / Contact)`
  - Operation: `Get by ID`
  - Record ID: `{{ $json.partyId }}`

  #### Search

  Returns a list of records, with optional filtering, sorting, and pagination.

  **Fields:**
  - **Custom Query** — Weclapp filter syntax, e.g. `salesChannel-eq=NET1&createdDate-gt=1700000000000`. Multiple conditions are ANDed by default; use `or-`/`orGroupN-` prefixes for OR logic (see [Weclapp Query Syntax](#weclapp-query-syntax)).
  - **Sort** — field name, prefix with `-` for descending, e.g. `-lastModifiedDate`.
  - **Return All** — when enabled, fetches every page automatically. When disabled, use **Page** and **Page Size** to paginate manually.

  **Example — find all open sales orders modified in the last hour:**
  - Resource: `Sales Order`
  - Operation: `Search`
  - Custom Query: `orderStatusId-eq=OPEN&lastModifiedDate-gt={{ Date.now() - 3600000 }}`
  - Return All: `true`

  **Example — search for a customer by number:**
  - Resource: `Party (Customer / Contact)`
  - Custom Query: `customerNumber-eq=K10001`

  ##### Including referenced entities

  Weclapp can return referenced records (e.g. the `unit` behind an article's `unitId`) in the same request. Add [`includeReferencedEntities`](https://www.weclapp.com/api/#overview--getting-started) to the **Custom Query** field with a comma-separated list of reference properties:

  ```
  includeReferencedEntities=unitId,articleCategoryId
  ```

  Weclapp returns a single, de-duplicated `referencedEntities` pool shared across the whole result set — it is **not** aligned to individual records. Rather than attaching that whole pool to every item, the node **resolves each record's foreign keys** against the pool and attaches only the matching entity inline: a field named `<type>Id` is resolved to a single object under `<type>`, and a field named `<type>Ids` to an array under `<type>`. This works for any reference whose base name matches a pool key, so each item carries just its own references. When **Return All** is enabled, the pool is merged across pages and de-duplicated by `id` before resolution.

  > **Note:** matching is done by `id`. If you narrow the response with `properties` and use the `entity:prop` selection syntax, include the entity's `id` too (e.g. `unit:id,unit:name`), otherwise the pooled entities have no `id` to match against and nothing will be resolved.

  **Example output** for `article` with Custom Query `includeReferencedEntities=unitId`:

  ```json
  {
    "id": "1001",
    "articleNumber": "EPM242J",
    "unitId": "2770",
    "unit": { "id": "2770", "name": "Stk." }
  }
  ```

  ##### Requesting additional properties

  Some Weclapp fields are calculated or complexly determined and must be explicitly requested. Add [`additionalProperties`](https://www.weclapp.com/api/#overview--getting-started) to the **Custom Query** field with a comma-separated list of property names:

  ```
  additionalProperties=currentSalesPrice
  ```

  Weclapp returns an `additionalProperties` object where each property holds an array whose index aligns with the matching entity. The node maps each record's slice back onto that record under an `additionalProperties` key, so every item carries its own values. When **Return All** is enabled, the arrays are concatenated across pages in order to preserve that alignment.

  **Example output** for `article` with Custom Query `additionalProperties=currentSalesPrice`:

  ```json
  {
    "id": "1001",
    "articleNumber": "EPM242J",
    "additionalProperties": {
      "currentSalesPrice": {
        "articleUnitPrice": "39.95",
        "currencyId": "256",
        "quantity": "1",
        "reductionAdditionItems": []
      }
    }
  }
  ```

  #### Count

  Returns the number of records matching an optional filter, without fetching the records themselves. Accepts the same **Custom Query** filter syntax as Search (and the required entity filters for Comment / Document). The output is a single item `{ "count": <number> }`.

  **Example — count open sales orders:**
  - Resource: `Sales Order`
  - Operation: `Count`
  - Custom Query: `orderStatusId-eq=OPEN`

  #### Create

  Creates a new record. Map the fields you want to set in the **Additional Fields** section using n8n expressions or fixed values.

  **Example — create a sales order:**
  - Resource: `Sales Order`
  - Operation: `Create`
  - Additional Fields → `customerId`: `{{ $json.customerId }}`

  #### Update

  Updates an existing record by ID. Only the fields you map are sent — unset fields are left unchanged.

  **Example — mark a shipment as dispatched:**
  - Resource: `Shipment`
  - Operation: `Update`
  - Record ID: `{{ $json.id }}`
  - Additional Fields → `status`: `SHIPPED`

  #### Delete

  Deletes a record by ID (available for writable resources only). Returns `{ "success": true, "id": "<id>" }` on success.

  **Example — delete a quotation:**
  - Resource: `Quotation`
  - Operation: `Delete`
  - Record ID: `{{ $json.id }}`

  #### Dry Run

  Create, Update, and Delete expose a **Dry Run** toggle. When enabled, Weclapp runs its business logic and validates the payload but **persists nothing** — useful for validating input before committing changes. On success the response is returned without meta properties (`id`, `version`, `createdDate`, `lastModifiedDate`).

  #### Download Document

  Downloads a Weclapp document as a binary file (available for the **Document** resource only). The binary output can be passed to a Write Binary File node or an email attachment.

  **Example — attach a PDF invoice to an email:**
  1. Weclapp node: Resource `Document`, Operation `Download Document`, Record ID `{{ $json.documentId }}`
  2. Send Email node: attach `{{ $binary.data }}`

  ## Weclapp Trigger Node

  Starts a workflow automatically whenever a Weclapp entity is created, updated, or deleted. It registers a webhook in Weclapp on activation and removes it on deactivation — no manual webhook setup required.

  **Configuration:**
  - **Resource** — the entity type to watch. Supports all writable resources: Party, Article, Article Category, Sales Order, Quotation, Sales Invoice, Sales Open Item, Shipment, Purchase Order, Purchase Invoice, Incoming Goods, Comment, Currency, Document, Manufacturer, Variant Article, Accounting Transaction, and more.
  - **Events** — one or more of `Created`, `Updated`, `Deleted`.

  **Example — notify Slack when a new sales order arrives:**
  1. Weclapp Trigger: Resource `Sales Order`, Events `Created`
  2. Slack node: post `New order {{ $json.orderNumber }} from {{ $json.customerName }}`

  **Example — sync customer updates to a CRM:**
  1. Weclapp Trigger: Resource `Party (Customer / Contact)`, Events `Updated`
  2. HTTP Request node: `PUT https://crm.example.com/contacts/{{ $json.id }}`

  **Example — alert on shipment deletion:**
  1. Weclapp Trigger: Resource `Shipment`, Events `Deleted`
  2. Send Email node: notify the logistics team

  > **Tip:** Before your first live run, use n8n's **Pin Data** feature on the trigger node to capture a sample payload. This enables field autocompletion in downstream nodes (IF, Switch, Set, etc.) without waiting for a real event.

  ## Weclapp Query Syntax

  The **Custom Query** field uses Weclapp's native filter format:

  ```
  fieldName-operator=value&anotherField-operator=value
  ```

  Common operators:

  | Operator | Meaning |
  |---|---|
  | `eq` | equals |
  | `ne` | not equals |
  | `lt` / `gt` | less / greater than |
  | `le` / `ge` | less / greater than or equal |
  | `like` | wildcard match (`%` = any chars) |
  | `null` | field is null (`true`/`false`) |

  Timestamps are Unix milliseconds (e.g. `1700000000000`).

  ### OR conditions

  By default, multiple conditions are combined with AND. To combine conditions with OR, prefix them with `or-`:

  ```
  or-name-eq=charlie&or-name-eq=chaplin
  ```

  To mix AND and OR, assign conditions to numbered groups with `orGroupN-`. Conditions **within the same group** are ORed together, and separate groups are ANDed with each other:

  ```
  orGroup1-shippingCarrierId-eq=213305372&orGroup1-shippingCarrierId-eq=113291681&orGroup2-status-eq=CANCELLED&orGroup2-status-eq=INCOMING_CANCELLED
  ```

  This matches records whose carrier is one of the two IDs **and** whose status is `CANCELLED` or `INCOMING_CANCELLED`. Repeating the same key is required and fully supported — every value is sent to Weclapp.

  > **Note:** Weclapp only allows filtering on filterable properties; computed `*Name` fields (e.g. `shippingCarrierName`) are generally not filterable in API v2 — filter by the corresponding `*Id` instead. Unknown *filter* properties are silently ignored by Weclapp, but unknown `sort` or `properties` values return an error. When Weclapp rejects a request, the node surfaces its exact message and the offending parameter.

  See the [Weclapp API documentation](https://www.weclapp.com/api/) for the full list of filterable fields per entity.

  ## License

  MIT — see [LICENSE](./LICENSE).

ai_documentation_summary:
  {"purpose":"The Weclapp Trigger node automatically starts an n8n workflow when specific events (create, update, delete) occur on Weclapp entities, eliminating the need for manual webhook configuration.","capabilities":["Real-time event monitoring for multiple entity types","Support for Created, Updated, and Deleted events","Automatic webhook registration and deactivation in Weclapp","Integration with n8n expressions for dynamic data handling","Pin Data feature for testing and field autocompletion"],"authentication":"API Token required (via Weclapp API credentials)","commonUseCases":["Automated Slack notifications for new sales orders","Synchronizing customer data updates to external CRMs","Alerting logistics teams on shipment status changes","Triggering automated email workflows on document creation"],"limitations":["Requires n8n version ≥ 0.187.0","Manual webhook setup is not needed but the node automatically manages it","Some resources like Document do not support Create or Update operations"],"relatedNodes":["Weclapp API","Weclapp Trigger","Send Email","Slack","HTTP Request"]}


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

updated_at: 2026-07-14 14:40:34
author_name: bashlenix
author_github_url: https://github.com/Bashlenix/Weclapp_n8n_Custom_Node.git
npm_package_name: n8n-nodes-weclapp
npm_version: 0.2.8
community_fetched_at: 2026-07-14T14:40:34.344Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "party",
      "options": [
        {
          "name": "Accounting Transaction",
          "value": "accountingTransaction"
        },
        {
          "name": "Article",
          "value": "article"
        },
        {
          "name": "Article Category",
          "value": "articleCategory"
        },
        {
          "name": "Comment",
          "value": "comment"
        },
        {
          "name": "Currency",
          "value": "currency"
        },
        {
          "name": "Document",
          "value": "document"
        },
        {
          "name": "Incoming Goods",
          "value": "incomingGoods"
        },
        {
          "name": "Manufacturer",
          "value": "manufacturer"
        },
        {
          "name": "Party (Customer / Contact)",
          "value": "party"
        },
        {
          "name": "Purchase Invoice",
          "value": "purchaseInvoice"
        },
        {
          "name": "Purchase Order",
          "value": "purchaseOrder"
        },
        {
          "name": "Quotation",
          "value": "quotation"
        },
        {
          "name": "Sales Invoice",
          "value": "salesInvoice"
        },
        {
          "name": "Sales Open Item",
          "value": "salesOpenItem"
        },
        {
          "name": "Sales Order",
          "value": "salesOrder"
        },
        {
          "name": "Shipment",
          "value": "shipment"
        },
        {
          "name": "User",
          "value": "user"
        },
        {
          "name": "Variant Article",
          "value": "variantArticle"
        },
        {
          "name": "Warehouse Stock",
          "value": "warehouseStock"
        },
        {
          "name": "Warehouse Stock Movement",
          "value": "warehouseStockMovement"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getById",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a record"
        },
        {
          "name": "Download Document",
          "value": "downloadDocument",
          "action": "Download a document as binary (document resource only)"
        },
        {
          "name": "Get by ID",
          "value": "getById",
          "action": "Get a record by ID"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search records"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a record"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a record"
    },
    {
      "name": "Download Document",
      "value": "downloadDocument",
      "action": "Download a document as binary (document resource only)"
    },
    {
      "name": "Get by ID",
      "value": "getById",
      "action": "Get a record by ID"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search records"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a record"
    }
  ]

npm_readme:
  # n8n-nodes-weclapp

  An [n8n](https://n8n.io/) community node for the [Weclapp](https://www.weclapp.com/) ERP/CRM platform. It lets you read and write Weclapp data — customers, orders, articles, shipments, documents, and more — directly from your n8n workflows, and react to Weclapp events in real time with the built-in trigger node.

  ## Installation

  In your n8n instance, open **Settings → Community Nodes → Install** and enter:

  ```
  n8n-nodes-weclapp
  ```

  n8n will install the package and restart. The **Weclapp** and **Weclapp Trigger** nodes will appear in the node palette.

  > Requires n8n ≥ 0.187.0 (community node support).

  ## Credentials

  1. Log in to your Weclapp account.
  2. Click your avatar (top-right) → **My Settings → API**.
  3. Copy your **API token**.
  4. In n8n, create a new **Weclapp API** credential:
     - **Subdomain** — the part before `.weclapp.com` in your URL (e.g. `mycompany` for `mycompany.weclapp.com`).
     - **API Token** — the token you copied above.

  n8n will test the credential automatically against the `/user/count` endpoint.

  ## Weclapp Node

  Performs CRUD operations on the following Weclapp resources:

  | Resource | Create | Get by ID | Search | Count | Update | Delete | Download |
  |---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
  | Party (Customer / Contact) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Article | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Article Category | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Sales Order | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Quotation | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Sales Invoice | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Sales Open Item | | ✓ | ✓ | ✓ | | ✓ | |
  | Shipment | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Purchase Order | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Purchase Invoice | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Incoming Goods | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Comment | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Currency | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Document | | ✓ | ✓ | ✓ | | | ✓ |
  | Manufacturer | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Accounting Transaction | | ✓ | ✓ | ✓ | | | |
  | Variant Article | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
  | Warehouse Stock | | ✓ | ✓ | ✓ | | | |
  | Warehouse Stock Movement | | ✓ | ✓ | ✓ | | | |
  | User | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |

  > **Read-only resources** — Document, Accounting Transaction, Warehouse Stock, and Warehouse Stock Movement do not support Create, Update, or Delete.

  ### Operations

  #### Get by ID

  Fetches a single record by its Weclapp internal ID.

  **Example — look up a customer:**
  - Resource: `Party (Customer / Contact)`
  - Operation: `Get by ID`
  - Record ID: `{{ $json.partyId }}`

  #### Search

  Returns a list of records, with optional filtering, sorting, and pagination.

  **Fields:**
  - **Custom Query** — Weclapp filter syntax, e.g. `salesChannel-eq=NET1&createdDate-gt=1700000000000`. Multiple conditions are ANDed by default; use `or-`/`orGroupN-` prefixes for OR logic (see [Weclapp Query Syntax](#weclapp-query-syntax)).
  - **Sort** — field name, prefix with `-` for descending, e.g. `-lastModifiedDate`.
  - **Return All** — when enabled, fetches every page automatically. When disabled, use **Page** and **Page Size** to paginate manually.

  **Example — find all open sales orders modified in the last hour:**
  - Resource: `Sales Order`
  - Operation: `Search`
  - Custom Query: `orderStatusId-eq=OPEN&lastModifiedDate-gt={{ Date.now() - 3600000 }}`
  - Return All: `true`

  **Example — search for a customer by number:**
  - Resource: `Party (Customer / Contact)`
  - Custom Query: `customerNumber-eq=K10001`

  ##### Including referenced entities

  Weclapp can return referenced records (e.g. the `unit` behind an article's `unitId`) in the same request. Add [`includeReferencedEntities`](https://www.weclapp.com/api/#overview--getting-started) to the **Custom Query** field with a comma-separated list of reference properties:

  ```
  includeReferencedEntities=unitId,articleCategoryId
  ```

  Weclapp returns a single, de-duplicated `referencedEntities` pool shared across the whole result set — it is **not** aligned to individual records. Rather than attaching that whole pool to every item, the node **resolves each record's foreign keys** against the pool and attaches only the matching entity inline: a field named `<type>Id` is resolved to a single object under `<type>`, and a field named `<type>Ids` to an array under `<type>`. This works for any reference whose base name matches a pool key, so each item carries just its own references. When **Return All** is enabled, the pool is merged across pages and de-duplicated by `id` before resolution.

  > **Note:** matching is done by `id`. If you narrow the response with `properties` and use the `entity:prop` selection syntax, include the entity's `id` too (e.g. `unit:id,unit:name`), otherwise the pooled entities have no `id` to match against and nothing will be resolved.

  **Example output** for `article` with Custom Query `includeReferencedEntities=unitId`:

  ```json
  {
    "id": "1001",
    "articleNumber": "EPM242J",
    "unitId": "2770",
    "unit": { "id": "2770", "name": "Stk." }
  }
  ```

  ##### Requesting additional properties

  Some Weclapp fields are calculated or complexly determined and must be explicitly requested. Add [`additionalProperties`](https://www.weclapp.com/api/#overview--getting-started) to the **Custom Query** field with a comma-separated list of property names:

  ```
  additionalProperties=currentSalesPrice
  ```

  Weclapp returns an `additionalProperties` object where each property holds an array whose index aligns with the matching entity. The node maps each record's slice back onto that record under an `additionalProperties` key, so every item carries its own values. When **Return All** is enabled, the arrays are concatenated across pages in order to preserve that alignment.

  **Example output** for `article` with Custom Query `additionalProperties=currentSalesPrice`:

  ```json
  {
    "id": "1001",
    "articleNumber": "EPM242J",
    "additionalProperties": {
      "currentSalesPrice": {
        "articleUnitPrice": "39.95",
        "currencyId": "256",
        "quantity": "1",
        "reductionAdditionItems": []
      }
    }
  }
  ```

  #### Count

  Returns the number of records matching an optional filter, without fetching the records themselves. Accepts the same **Custom Query** filter syntax as Search (and the required entity filters for Comment / Document). The output is a single item `{ "count": <number> }`.

  **Example — count open sales orders:**
  - Resource: `Sales Order`
  - Operation: `Count`
  - Custom Query: `orderStatusId-eq=OPEN`

  #### Create

  Creates a new record. Map the fields you want to set in the **Additional Fields** section using n8n expressions or fixed values.

  **Example — create a sales order:**
  - Resource: `Sales Order`
  - Operation: `Create`
  - Additional Fields → `customerId`: `{{ $json.customerId }}`

  #### Update

  Updates an existing record by ID. Only the fields you map are sent — unset fields are left unchanged.

  **Example — mark a shipment as dispatched:**
  - Resource: `Shipment`
  - Operation: `Update`
  - Record ID: `{{ $json.id }}`
  - Additional Fields → `status`: `SHIPPED`

  #### Delete

  Deletes a record by ID (available for writable resources only). Returns `{ "success": true, "id": "<id>" }` on success.

  **Example — delete a quotation:**
  - Resource: `Quotation`
  - Operation: `Delete`
  - Record ID: `{{ $json.id }}`

  #### Dry Run

  Create, Update, and Delete expose a **Dry Run** toggle. When enabled, Weclapp runs its business logic and validates the payload but **persists nothing** — useful for validating input before committing changes. On success the response is returned without meta properties (`id`, `version`, `createdDate`, `lastModifiedDate`).

  #### Download Document

  Downloads a Weclapp document as a binary file (available for the **Document** resource only). The binary output can be passed to a Write Binary File node or an email attachment.

  **Example — attach a PDF invoice to an email:**
  1. Weclapp node: Resource `Document`, Operation `Download Document`, Record ID `{{ $json.documentId }}`
  2. Send Email node: attach `{{ $binary.data }}`

  ## Weclapp Trigger Node

  Starts a workflow automatically whenever a Weclapp entity is created, updated, or deleted. It registers a webhook in Weclapp on activation and removes it on deactivation — no manual webhook setup required.

  **Configuration:**
  - **Resource** — the entity type to watch. Supports all writable resources: Party, Article, Article Category, Sales Order, Quotation, Sales Invoice, Sales Open Item, Shipment, Purchase Order, Purchase Invoice, Incoming Goods, Comment, Currency, Document, Manufacturer, Variant Article, Accounting Transaction, and more.
  - **Events** — one or more of `Created`, `Updated`, `Deleted`.

  **Example — notify Slack when a new sales order arrives:**
  1. Weclapp Trigger: Resource `Sales Order`, Events `Created`
  2. Slack node: post `New order {{ $json.orderNumber }} from {{ $json.customerName }}`

  **Example — sync customer updates to a CRM:**
  1. Weclapp Trigger: Resource `Party (Customer / Contact)`, Events `Updated`
  2. HTTP Request node: `PUT https://crm.example.com/contacts/{{ $json.id }}`

  **Example — alert on shipment deletion:**
  1. Weclapp Trigger: Resource `Shipment`, Events `Deleted`
  2. Send Email node: notify the logistics team

  > **Tip:** Before your first live run, use n8n's **Pin Data** feature on the trigger node to capture a sample payload. This enables field autocompletion in downstream nodes (IF, Switch, Set, etc.) without waiting for a real event.

  ## Weclapp Query Syntax

  The **Custom Query** field uses Weclapp's native filter format:

  ```
  fieldName-operator=value&anotherField-operator=value
  ```

  Common operators:

  | Operator | Meaning |
  |---|---|
  | `eq` | equals |
  | `ne` | not equals |
  | `lt` / `gt` | less / greater than |
  | `le` / `ge` | less / greater than or equal |
  | `like` | wildcard match (`%` = any chars) |
  | `null` | field is null (`true`/`false`) |

  Timestamps are Unix milliseconds (e.g. `1700000000000`).

  ### OR conditions

  By default, multiple conditions are combined with AND. To combine conditions with OR, prefix them with `or-`:

  ```
  or-name-eq=charlie&or-name-eq=chaplin
  ```

  To mix AND and OR, assign conditions to numbered groups with `orGroupN-`. Conditions **within the same group** are ORed together, and separate groups are ANDed with each other:

  ```
  orGroup1-shippingCarrierId-eq=213305372&orGroup1-shippingCarrierId-eq=113291681&orGroup2-status-eq=CANCELLED&orGroup2-status-eq=INCOMING_CANCELLED
  ```

  This matches records whose carrier is one of the two IDs **and** whose status is `CANCELLED` or `INCOMING_CANCELLED`. Repeating the same key is required and fully supported — every value is sent to Weclapp.

  > **Note:** Weclapp only allows filtering on filterable properties; computed `*Name` fields (e.g. `shippingCarrierName`) are generally not filterable in API v2 — filter by the corresponding `*Id` instead. Unknown *filter* properties are silently ignored by Weclapp, but unknown `sort` or `properties` values return an error. When Weclapp rejects a request, the node surfaces its exact message and the offending parameter.

  See the [Weclapp API documentation](https://www.weclapp.com/api/) for the full list of filterable fields per entity.

  ## License

  MIT — see [LICENSE](./LICENSE).

ai_documentation_summary:
  {"purpose":"This n8n community node enables full CRUD operations on Weclapp ERP/CRM resources and provides real-time event triggering for automated workflows.","capabilities":["Create records for 20+ Weclapp entities (customers, orders, shipments, etc.)","Retrieve records by ID or search with custom filter syntax","Update existing records by ID","Download documents as binary files","Real-time webhook triggering for Created, Updated, and Deleted events","Support for pagination and sorting in search operations","Field-level filtering using Weclapp's native query syntax"],"authentication":"API Token required (Subdomain and API Token)","commonUseCases":["Automated order processing and status updates","Real-time customer data synchronization with external CRMs","Automated shipment notifications to logistics teams","Document retrieval and attachment to emails","Event-driven alerts for new sales orders or inventory changes"],"limitations":["Download document operation is only available for the Document resource","Some resources (e.g., Accounting Transaction, Warehouse Stock) do not support Create or Update operations","Requires n8n version ≥ 0.187.0","Community node (not official n8n node)"],"relatedNodes":["Weclapp Trigger","Write Binary File","Send Email","HTTP Request","IF"]}


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

updated_at: 2026-07-14 14:40:34
author_name: thewils504
author_github_url: https://github.com/rwilson504/
npm_package_name: n8n-nodes-govee
npm_version: 0.2.10
community_fetched_at: 2026-07-14T14:40:34.345Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Control and manage Govee smart devices. Rate limits: 10,000 req/day overall; 10 req/min for device list; 10 req/min/device for control and state.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "device",
      "options": [
        {
          "name": "Appliance",
          "value": "appliance",
          "description": "Manage Govee appliances (humidifiers, purifiers, etc.)"
        },
        {
          "name": "Device",
          "value": "device",
          "description": "Manage Govee devices (lights, plugs, switches)"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Control",
          "value": "control",
          "action": "Control a device",
          "description": "Send a command to a device"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a device",
          "description": "Get a single device by its MAC address"
        },
        {
          "name": "Get Capabilities",
          "value": "getCapabilities",
          "action": "Get device capabilities",
          "description": "Get the supported commands and properties for a device (or all devices)"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many devices",
          "description": "Get a list of many devices"
        },
        {
          "name": "Get State",
          "value": "getState",
          "action": "Get device state",
          "description": "Get the current state of a device"
        },
        {
          "name": "Multi-Command",
          "value": "multiControl",
          "action": "Send multiple commands to a device",
          "description": "Send multiple commands to a device in sequence"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "device"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Control",
          "value": "control",
          "action": "Control an appliance",
          "description": "Send a command to an appliance"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many appliances",
          "description": "Get a list of many appliances"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "appliance"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Control",
      "value": "control",
      "action": "Control a device",
      "description": "Send a command to a device",
      "resource": "device"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a device",
      "description": "Get a single device by its MAC address",
      "resource": "device"
    },
    {
      "name": "Get Capabilities",
      "value": "getCapabilities",
      "action": "Get device capabilities",
      "description": "Get the supported commands and properties for a device (or all devices)",
      "resource": "device"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many devices",
      "description": "Get a list of many devices",
      "resource": "device"
    },
    {
      "name": "Get State",
      "value": "getState",
      "action": "Get device state",
      "description": "Get the current state of a device",
      "resource": "device"
    },
    {
      "name": "Multi-Command",
      "value": "multiControl",
      "action": "Send multiple commands to a device",
      "description": "Send multiple commands to a device in sequence",
      "resource": "device"
    },
    {
      "name": "Control",
      "value": "control",
      "action": "Control an appliance",
      "description": "Send a command to an appliance",
      "resource": "appliance"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many appliances",
      "description": "Get a list of many appliances",
      "resource": "appliance"
    }
  ]

npm_readme:
  # n8n-nodes-govee

  This is an n8n community node. It lets you use [Govee](https://us.govee.com/) smart devices in your n8n workflows.

  Govee is a smart home technology company offering Wi-Fi-enabled lights, plugs, switches, and appliances (humidifiers, purifiers, etc.). This node lets you list devices, query their state, and send control commands — all through the [Govee Developer API](https://govee-public.s3.amazonaws.com/developer-docs/GoveeDeveloperAPIReference.pdf).

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

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

  ## Operations

  ### Device (Lights, Plugs, Switches)

  | Operation | Description |
  |-----------|-------------|
  | **Get Many** | List all devices associated with your Govee account |
  | **Get** | Get a single device by its MAC address |
  | **Get State** | Query the current state of a specific device (online status, power, brightness, color, color temperature) |
  | **Control** | Send a command to a device — Turn on/off, set Brightness (0–100), set Color (visual color picker), set Color Temperature (2000–9000K) |
  | **Multi-Command** | Send multiple commands to a device in sequence (e.g., turn on + set color + set brightness) |

  ### Appliance (Humidifiers, Purifiers, etc.)

  | Operation | Description |
  |-----------|-------------|
  | **Get Many** | List all appliances associated with your Govee account |
  | **Control** | Send a command to an appliance — Turn on/off, set Mode (dynamically loaded from device capabilities) |

  ## Credentials

  You need a **Govee Developer API Key** to use this node.

  ### Obtaining a Govee Developer API Key

  1. **Download the Govee Home App:**
     - iOS: [Govee Home on the App Store](https://apps.apple.com/us/app/govee-home/id1395696823)
     - Android: [Govee Home on Google Play](https://play.google.com/store/apps/details?id=com.govee.home)
  2. **Open the app** and navigate to **My Profile** (tap the profile icon).
  3. **Go to Settings** (gear icon, top right).
  4. **Select "Apply for API Key"**.
  5. **Fill in the form** — provide your name and a reason (e.g., "home automation", "n8n integration").
  6. **Agree to the Terms of Service** and tap **Submit**.
  7. Once approved, your API key will be sent to your email.

  In n8n, create a new **Govee API** credential and paste your API key.

  ## Compatibility

  - Tested with n8n v1.x and later.
  - Requires devices that support Wi-Fi (Bluetooth-only devices are not supported by the Govee API).

  ## Usage

  ### List all your devices

  1. Add the **Govee** node to your workflow.
  2. Set **Resource** to `Device` and **Operation** to `Get Many`.
  3. Execute — you'll get a list of all your Govee devices with their MAC addresses, models, and supported commands.

  ### Turn on a light

  1. Set **Resource** to `Device`, **Operation** to `Control`.
  2. Select your device from the **Device Name or ID** dropdown (auto-populated from your Govee account).
  3. Select the **Model** (auto-populated based on your device selection).
  4. Set **Command** to `Turn`, **Turn Value** to `On`.

  ### Set a color

  1. Set **Resource** to `Device`, **Operation** to `Control`.
  2. Select your device and model from the dropdowns.
  3. Set **Command** to `Color` and use the **color picker** to choose your color.

  ### Send multiple commands at once

  1. Set **Resource** to `Device`, **Operation** to `Multi-Command`.
  2. Select your device and model.
  3. Enter a JSON array of commands:
     ```json
     [{"name": "turn", "value": "on"}, {"name": "brightness", "value": 80}, {"name": "color", "value": {"r": 255, "g": 0, "b": 100}}]
     ```

  ### Command validation

  Enable **Options > Validate Command** on Control or Multi-Command operations to check that your device supports the command before sending it. This makes an extra API call but gives a clear error message if the command isn't supported.

  ### Rate Limits

  The Govee API enforces rate limits:
  - **All APIs**: 10,000 requests per day (lights/plugs/switches), 100 per day (appliances)
  - **Device List**: 10 requests per minute
  - **Device Control / State**: 10 requests per minute per device

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Govee Developer API Reference (PDF)](https://govee-public.s3.amazonaws.com/developer-docs/GoveeDeveloperAPIReference.pdf)
  - [Govee Website](https://us.govee.com/)

  ## Development

  ### Prerequisites

  - [Node.js](https://nodejs.org/) v18+
  - A Govee Developer API Key (see [Credentials](#credentials))

  ### Setup

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

  ### API Key Configuration

  1. Copy the sample environment file:
     ```bash
     cp .env.dev.sample .env.dev
     ```
  2. Edit `.env.dev` and replace `your-api-key-here` with your actual Govee API key.
  3. The `.env.dev` file is git-ignored so your key won't be committed.

  ### Running Tests

  ```bash
  # Run all tests
  npm test

  # Run only unit tests (no API key needed)
  npm run test:unit

  # Run integration tests (requires API key in .env.dev)
  npm run test:integration
  ```

  **Unit tests** validate utility functions like `hexToRgb` and don't require network access.

  **Integration tests** call the real Govee API to verify endpoint structures, response fields, and authentication. They are automatically skipped if no API key is configured. Be mindful of [rate limits](#rate-limits) — the Govee API allows 100 requests per day for appliances and 10 requests per minute for device list/control.

  ### Linting

  ```bash
  npm run lint
  npm run lint:fix
  ```

  ## Version history

  ### 0.2.0

  - **Dynamic device dropdowns** — devices and appliances are loaded from your Govee account, no more copy-pasting MAC addresses
  - **Dynamic model selection** — model auto-populates when you select a device
  - **Visual color picker** — choose colors with a color picker instead of entering R/G/B values
  - **Color temperature range** — min/max constrained to 2000–9000K with device-specific range info
  - **Get single device** — new Get operation to retrieve one device by MAC address
  - **Multi-Command** — send multiple commands to a device in sequence (e.g., turn on + brightness + color)
  - **Command validation** — opt-in validation checks that your device supports the command before sending
  - **Dynamic appliance modes** — mode dropdown loads available modes (Low, Medium, High, Sleep, etc.) from device capabilities
  - **Rate limit info** — documented in node description for workflow planning

  ### 0.1.0

  - Initial release
  - Device resource: Get Many, Get State, Control (turn, brightness, color, color temperature)
  - Appliance resource: Get Many, Control (turn, mode)


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

ai_documentation_summary:
  {"purpose":"Control and manage Govee smart devices in n8n workflows using the Govee Developer API. It can list devices, query device state, and send control commands for supported Wi‑Fi Govee products.","capabilities":["List all devices associated with a Govee account","Get a single device by MAC address","Query device state including online status, power, brightness, color, and color temperature","Control devices with turn on/off, brightness, color, and color temperature commands","Send multiple device commands in sequence with Multi-Command","List appliances such as humidifiers and purifiers","Control appliances with turn on/off and mode selection","Validate commands against supported device capabilities before sending"],"authentication":"Govee Developer API Key required","commonUseCases":["Home automation workflows for lights, plugs, switches, and other Wi‑Fi Govee devices","Monitoring whether a device is online or what its current settings are","Triggering lighting changes such as turning on a light, setting brightness, or changing color","Sending a batch of device commands in one workflow step"],"limitations":["Only Wi‑Fi-enabled Govee devices are supported; Bluetooth-only devices are not supported","API rate limits apply: 10,000 requests/day overall for lights/plugs/switches, 100 requests/day for appliances, 10 requests/minute for device list, and 10 requests/minute per device for control/state","Appliance mode options are dynamically loaded from device capabilities"],"relatedNodes":[]}


node_type: n8n-nodes-android-texter.androidTexter
package_name: n8n-nodes-android-texter
display_name: Android Texter
description: Send SMS / MMS and manage threads via Android Texter
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: androidtexter1
author_github_url: https://github.com/argosautomation/
npm_package_name: n8n-nodes-android-texter
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.346Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Message",
          "value": "message"
        },
        {
          "name": "Device",
          "value": "device"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Spam",
          "value": "spam"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send an SMS or MMS",
          "description": "Queue an outbound message to a phone"
        },
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get message delivery status",
          "description": "Look up the status of a previously-sent message"
        },
        {
          "name": "Get History",
          "value": "getHistory",
          "action": "Get conversation history with a phone",
          "description": "Paginated history of messages with one phone number"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List linked devices",
          "description": "Returns every Android device linked to the account"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "device"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create or upsert a contact",
          "description": "Upserts by phone — existing contacts are updated"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "flag",
      "options": [
        {
          "name": "Flag",
          "value": "flag",
          "action": "Flag a phone as spam",
          "description": "Hides the thread; if live-mode is on, also starts the AI agent"
        },
        {
          "name": "Unflag",
          "value": "unflag",
          "action": "Unflag a phone remove from spam"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "spam"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send",
      "value": "send",
      "action": "Send an SMS or MMS",
      "description": "Queue an outbound message to a phone",
      "resource": "message"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get message delivery status",
      "description": "Look up the status of a previously-sent message",
      "resource": "message"
    },
    {
      "name": "Get History",
      "value": "getHistory",
      "action": "Get conversation history with a phone",
      "description": "Paginated history of messages with one phone number",
      "resource": "message"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List linked devices",
      "description": "Returns every Android device linked to the account",
      "resource": "device"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create or upsert a contact",
      "description": "Upserts by phone — existing contacts are updated",
      "resource": "contact"
    },
    {
      "name": "Flag",
      "value": "flag",
      "action": "Flag a phone as spam",
      "description": "Hides the thread; if live-mode is on, also starts the AI agent",
      "resource": "spam"
    },
    {
      "name": "Unflag",
      "value": "unflag",
      "action": "Unflag a phone remove from spam",
      "resource": "spam"
    }
  ]

npm_readme:
  # n8n-nodes-android-texter

  n8n community node for [Android Texter](https://androidtexter.com) — send and receive SMS / MMS through your own linked Android phone, without paying Twilio per-message fees.

  ## What it does

  | Node | Operations |
  |---|---|
  | **Android Texter** | Send SMS/MMS · Get Message Status · Get Conversation History · List Devices · Create Contact · Flag/Unflag Spam |
  | **Android Texter Trigger** | Polls every minute for new inbound SMS, starts your workflow when one arrives |

  ## Quick start

  1. **Install the node** in n8n: Settings → Community Nodes → Install → `n8n-nodes-android-texter`
  2. **Generate an API key** at [androidtexter.com/dashboard/settings/api-keys](https://androidtexter.com/dashboard/settings/api-keys) (starts with `atx_`)
  3. **Create a credential** in n8n: Credentials → New → Android Texter API → paste your key
  4. **Drop the node** onto your canvas — the credential test should pass green

  ## Use cases

  - **Lead capture → SMS reply.** Webhook from your form → AT trigger fires → branch on body → reply.
  - **Order confirmation.** New Shopify order → send a personalized confirmation SMS from your business phone.
  - **Two-way support.** New inbound SMS → ChatGPT for a draft reply → human approves → AT sends.
  - **Group blast.** Spreadsheet of phones → loop → send. (Use the HTTP Request node with `/api/messages/broadcast` if you need the bulk endpoint specifically.)

  ## Authentication

  Bearer-style API key, sent as `X-API-Key`. No OAuth flow.

  ```
  X-API-Key: atx_abc123...
  ```

  The credential test hits `GET /api/me` — the cheapest authenticated round-trip — and shows the green check on success.

  ## Operations reference

  ### Message → Send

  Inputs:
  - **To Phone** (required) — recipient. Any format; the server normalizes (`+15551234567`, `5551234567`, `(555) 123-4567` all work).
  - **Message** (required) — body, up to 1600 chars.
  - **Additional Options:**
    - **Device ID** — pick a specific phone if you have multiple linked. Default: first online device.
    - **Media URL** — public HTTPS URL to an image/video. Including this makes the message an MMS.
    - **Scheduled At** — ISO 8601 datetime; queue the send for later instead of immediately.

  Returns: `{ status: 200, message_id, device_id, device_name, phone_number, message }`.

  ### Message → Get Status

  Inputs: **Message ID** (from a previous Send).

  Returns: `{ id, status: "queued" | "sent" | "delivered" | "failed", phone }`.

  ### Message → Get History

  Paginated history with one phone. Inputs: **Phone**, **Page**, **Limit** (1–100). Newest-first.

  ### Device → List

  Lists every Android device linked to your account, including online/offline status and last-seen timestamp.

  ### Contact → Create

  Upserts by phone (existing contacts get updated, not duplicated). Inputs: **Phone**, **Name**, **Tags** (comma-separated).

  ### Spam → Flag / Unflag

  Flag a phone as spam. Hides the thread from the inbox and suppresses notifications. If your account has live-mode enabled, this also kicks off the AI evidence-collection agent.

  ## Trigger reference

  **Android Texter Trigger** polls `GET /api/messages/received` once per minute (default n8n polling cadence; configurable in the workflow's "Polling Times" setting). Each new inbound message becomes one execution item.

  State is per-workflow: the trigger remembers the most recent `created_at` it's seen and only emits messages newer than that, so reactivating a workflow doesn't replay history.

  - **Filter by Phone** — limit triggers to a specific number. Leave blank for all inbound.

  ## Need an endpoint that isn't here?

  Use n8n's built-in **HTTP Request** node pointed at our OpenAPI spec:

  - Spec: https://androidtexter.com/api/openapi.json
  - Interactive docs: https://androidtexter.com/api/swagger/index.html
  - Hand-written docs: https://androidtexter.com/dashboard/docs

  Auth header is the same: `X-API-Key: atx_...`.

  ## License

  [MIT](./LICENSE) — fork it, modify it, redistribute it.

  ## Support

  - Issues: https://github.com/argosautomation/android-texter/issues
  - Web: https://androidtexter.com

ai_documentation_summary:
  {"purpose":"A community n8n node that enables sending SMS/MMS, managing conversations, and triggering workflows on inbound messages via a linked Android phone.","capabilities":["Send SMS","Send MMS (with media URL)","Get Message Status","Get Conversation History","List Linked Devices","Create Contact","Flag/Unflag Spam","Trigger on inbound SMS"],"authentication":"API Key (Bearer-style via X-API-Key header)","commonUseCases":["Lead capture and automated SMS replies","Order confirmation messages","Two-way customer support chat","Group SMS blasts"],"limitations":["No OAuth flow, requires manual API key management","MMS requires a public HTTPS URL for media","Trigger polls every minute by default","Bulk sending requires using the HTTP Request node for the broadcast endpoint"],"relatedNodes":["HTTP Request","Webhook","Split In Batches","Code"]}


node_type: n8n-nodes-android-texter.androidTexterTrigger
package_name: n8n-nodes-android-texter
display_name: Android Texter Trigger
description: Starts a workflow when a new SMS arrives at your linked Android device
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: androidtexter1
author_github_url: https://github.com/argosautomation/
npm_package_name: n8n-nodes-android-texter
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.347Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-android-texter

  n8n community node for [Android Texter](https://androidtexter.com) — send and receive SMS / MMS through your own linked Android phone, without paying Twilio per-message fees.

  ## What it does

  | Node | Operations |
  |---|---|
  | **Android Texter** | Send SMS/MMS · Get Message Status · Get Conversation History · List Devices · Create Contact · Flag/Unflag Spam |
  | **Android Texter Trigger** | Polls every minute for new inbound SMS, starts your workflow when one arrives |

  ## Quick start

  1. **Install the node** in n8n: Settings → Community Nodes → Install → `n8n-nodes-android-texter`
  2. **Generate an API key** at [androidtexter.com/dashboard/settings/api-keys](https://androidtexter.com/dashboard/settings/api-keys) (starts with `atx_`)
  3. **Create a credential** in n8n: Credentials → New → Android Texter API → paste your key
  4. **Drop the node** onto your canvas — the credential test should pass green

  ## Use cases

  - **Lead capture → SMS reply.** Webhook from your form → AT trigger fires → branch on body → reply.
  - **Order confirmation.** New Shopify order → send a personalized confirmation SMS from your business phone.
  - **Two-way support.** New inbound SMS → ChatGPT for a draft reply → human approves → AT sends.
  - **Group blast.** Spreadsheet of phones → loop → send. (Use the HTTP Request node with `/api/messages/broadcast` if you need the bulk endpoint specifically.)

  ## Authentication

  Bearer-style API key, sent as `X-API-Key`. No OAuth flow.

  ```
  X-API-Key: atx_abc123...
  ```

  The credential test hits `GET /api/me` — the cheapest authenticated round-trip — and shows the green check on success.

  ## Operations reference

  ### Message → Send

  Inputs:
  - **To Phone** (required) — recipient. Any format; the server normalizes (`+15551234567`, `5551234567`, `(555) 123-4567` all work).
  - **Message** (required) — body, up to 1600 chars.
  - **Additional Options:**
    - **Device ID** — pick a specific phone if you have multiple linked. Default: first online device.
    - **Media URL** — public HTTPS URL to an image/video. Including this makes the message an MMS.
    - **Scheduled At** — ISO 8601 datetime; queue the send for later instead of immediately.

  Returns: `{ status: 200, message_id, device_id, device_name, phone_number, message }`.

  ### Message → Get Status

  Inputs: **Message ID** (from a previous Send).

  Returns: `{ id, status: "queued" | "sent" | "delivered" | "failed", phone }`.

  ### Message → Get History

  Paginated history with one phone. Inputs: **Phone**, **Page**, **Limit** (1–100). Newest-first.

  ### Device → List

  Lists every Android device linked to your account, including online/offline status and last-seen timestamp.

  ### Contact → Create

  Upserts by phone (existing contacts get updated, not duplicated). Inputs: **Phone**, **Name**, **Tags** (comma-separated).

  ### Spam → Flag / Unflag

  Flag a phone as spam. Hides the thread from the inbox and suppresses notifications. If your account has live-mode enabled, this also kicks off the AI evidence-collection agent.

  ## Trigger reference

  **Android Texter Trigger** polls `GET /api/messages/received` once per minute (default n8n polling cadence; configurable in the workflow's "Polling Times" setting). Each new inbound message becomes one execution item.

  State is per-workflow: the trigger remembers the most recent `created_at` it's seen and only emits messages newer than that, so reactivating a workflow doesn't replay history.

  - **Filter by Phone** — limit triggers to a specific number. Leave blank for all inbound.

  ## Need an endpoint that isn't here?

  Use n8n's built-in **HTTP Request** node pointed at our OpenAPI spec:

  - Spec: https://androidtexter.com/api/openapi.json
  - Interactive docs: https://androidtexter.com/api/swagger/index.html
  - Hand-written docs: https://androidtexter.com/dashboard/docs

  Auth header is the same: `X-API-Key: atx_...`.

  ## License

  [MIT](./LICENSE) — fork it, modify it, redistribute it.

  ## Support

  - Issues: https://github.com/argosautomation/android-texter/issues
  - Web: https://androidtexter.com

ai_documentation_summary:
  {"purpose":"The Android Texter Trigger node monitors a linked Android device for incoming SMS/MMS messages and automatically initiates a workflow when a new message is detected.","capabilities":["Polls for inbound SMS/MMS messages every minute","Starts workflow execution upon receiving a new message","Filters triggers by specific phone number","Supports filtering by message body (via workflow branching)","Integrates with AI assistants for draft replies","Supports MMS with media URLs"],"authentication":"API key required (Bearer-style via X-API-Key header)","commonUseCases":["Lead capture and SMS reply automation","Order confirmation messages","Two-way customer support chat","Group SMS blasts","Spam filtering and flagging"],"limitations":["Uses polling (every minute) instead of real-time webhooks","Requires a physical Android device linked to the account","No OAuth flow available","Message body filtering must be handled in workflow logic","Media requires public HTTPS URLs"],"relatedNodes":["HTTP Request node","Code node","Split In Batches node","Wait node"]}


node_type: @bufferapp/n8n-nodes-buffer.buffer
package_name: @bufferapp/n8n-nodes-buffer
display_name: Buffer
description: Interact with Buffer to manage ideas and posts
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: philippemiguet
author_github_url: https://github.com/bufferapp/buffer-n8n.git
npm_package_name: @bufferapp/n8n-nodes-buffer
npm_version: 3.8.0
community_fetched_at: 2026-07-14T14:40:34.348Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "idea",
      "options": [
        {
          "name": "Idea",
          "value": "idea"
        },
        {
          "name": "Post",
          "value": "post"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an idea",
          "description": "Create a new idea"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "idea"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a post",
          "description": "Create a new post"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "post"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an idea",
      "description": "Create a new idea",
      "resource": "idea"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a post",
      "description": "Create a new post",
      "resource": "post"
    }
  ]

npm_readme:
  # n8n-nodes-buffer

  This is an n8n community node for [Buffer](https://buffer.com). It lets you create ideas and publish posts to your social media channels directly from your n8n workflows.

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

  ## Features

  - **Create Ideas** - Save content ideas to your Buffer account
  - **Create Posts** - Publish to social channels (X, Instagram, TikTok, YouTube, Facebook, LinkedIn, etc.)
  - **Flexible Scheduling** - Publish immediately, add to queue, or schedule for a specific time
  - **Media Support** - Attach images or videos to your posts
  - **Multi-Channel** - Post to any connected Buffer channel

  ## Installation

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

  ## Credentials

  You need a Buffer API key to use this node. Learn more [here](https://developers.buffer.com/) to get setup! 

  ## Operations

  ### Idea

  | Operation | Description |
  |-----------|-------------|
  | Create | Create a new idea in Buffer |

  **Create Idea Fields:**
  - **Organization** - Select your Buffer organization
  - **Text** - The content of your idea
  - **Title** (optional) - A headline for the idea

  ### Post

  | Operation | Description |
  |-----------|-------------|
  | Create | Create a new post for publishing |

  **Create Post Fields:**
  - **Organization** - Select your Buffer organization
  - **Channel** - The social channel to post to
  - **Text** - The post content
  - **Share Mode** - "Share Now", "Add to Queue", or "Custom Schedule"
  - **Scheduled At** (for Custom Schedule) - ISO 8601 datetime
  - **Scheduling Type** (for Instagram/TikTok/YouTube) - "Automatic" or "Notification"

  **Media Options:**
  - **Attachment Type** - None, Image, or Video
  - **Image URL** - Public URL to an image (must be HTTP/HTTPS)
  - **Video URL** - Public URL to a video (must be HTTP/HTTPS)
  - **Thumbnail URL** (optional) - Custom thumbnail for media
  - **Alt Text** (optional, images only) - Accessibility description

  ## Compatibility

  - n8n Nodes API version 1

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Buffer](https://buffer.com)
  - [Developer Portal](https://developers.buffer.com/)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node allows users to interact with Buffer to create and manage social media ideas and posts across multiple platforms.","capabilities":["Create ideas in Buffer","Create posts for social media channels","Publish posts immediately","Add posts to a scheduling queue","Schedule posts for specific times","Attach images to posts","Attach videos to posts","Set custom thumbnails for media","Add accessibility alt text to images","Select scheduling types (Automatic or Notification) for video platforms"],"authentication":"API key required","commonUseCases":["Automated social media content creation","Scheduled content publishing workflows","Idea management and organization","Multi-platform social media distribution"],"limitations":["Requires a Buffer API key setup","Media URLs must be HTTP/HTTPS","Limited to Buffer-connected social channels"],"relatedNodes":["n8n HTTP Request","n8n Buffer Credentials","n8n Schedule Trigger"]}


node_type: @nuacom/n8n-nodes-nuacom.nuacomTrigger
package_name: @nuacom/n8n-nodes-nuacom
display_name: NUACOM Trigger
description: Triggers a workflow when a NUACOM event occurs
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: eduardo.nuacom
author_github_url: https://github.com/NUACOM/n8n-nodes-nuacom.git
npm_package_name: @nuacom/n8n-nodes-nuacom
npm_version: 0.1.13
community_fetched_at: 2026-07-14T14:40:34.349Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # @nuacom/n8n-nodes-nuacom

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

  An n8n community node package that provides seamless integration with the [NUACOM](https://nuacom.com) API, enabling you to automate calls, SMS, contact management, and webhook subscriptions within your n8n workflows.

  ## Features

  This package includes two main nodes:

  ### 1. NUACOM Node

  A comprehensive node for interacting with the NUACOM API, supporting the following resources:

  #### 📞 **Call Log**
  - **Get Many** — Retrieve call logs with optional filters: date range, call type (incoming/outgoing/missed/unanswered), extension, queue, phone number, and pagination
  - **Get** — Retrieve a specific call log by ID
  - **Get AI Data** — Retrieve AI analysis data for a call
  - **Download Recording** — Download the recording file for a call
  - **Add Note** — Add a text note to a call
  - **Add Tag by ID** — Tag a call using a tag definition ID
  - **Add Tag by Name** — Tag a call by name (creates the tag automatically if it does not exist)

  #### 📲 **Callback**
  - **Dial Agent** — Request a callback to a customer via an agent extension
  - **Dial Team** — Request a callback to a customer via a team queue

  #### 👤 **Contact**
  - **Get Many** — List contacts with pagination (15 / 50 / 100 / All per page)
  - **Get** — Retrieve a specific contact by ID
  - **Create** — Create a new contact with name, phone, and email
  - **Update** — Update an existing contact
  - **Delete** — Delete a contact

  #### 🤖 **Auto Dialer**
  - **Get Many Campaigns** — List all auto dialer campaigns
  - **Get Campaign Stats** — Retrieve statistics for a specific campaign
  - **Get Campaign Contacts** — List contacts (numbers) in a campaign
  - **Add Contact to Campaign** — Add a phone number to an existing campaign

  #### 🔌 **Extension**
  - **Get Many** — List all extensions on the account

  #### 💬 **Message**
  - **Send WhatsApp** — Send a WhatsApp message to a phone number
  - **Get** — Retrieve a message by ID
  - **Get Conversation** — Retrieve a conversation by ID

  #### 📱 **SMS**
  - **Send** — Send an SMS message from a registered sender

  #### 🔔 **Webhook Subscription**
  - **Get Many** — List all active webhook subscriptions
  - **Create** — Register a new webhook subscription for an event type
  - **Delete** — Remove an existing webhook subscription

  ---

  ### 2. NUACOM Trigger Node

  A webhook trigger node that automatically starts workflows when NUACOM events occur. Each event type exposes relevant filters so workflows only fire for the calls or messages you care about.

  | Event | Available Filters |
  |-------|-------------------|
  | **Call Answered** | Direction, Queue, Extension |
  | **Call Completed** | Direction, Queue, Extension |
  | **Call Initiated** | Direction, Queue, Extension |
  | **Call Missed** | Direction, Queue, Extension |
  | **Call Updated** | Direction, Event Type (AI Analysis / Notes / Tags) |
  | **Incoming Call** | Queue, Extension |
  | **Message Received** | Channel (SMS / WhatsApp), Message Contains |
  | **Message Sent** | Channel (SMS / WhatsApp), Message Contains |
  | **Call IVR Option Selected** | *(coming soon)* |
  | **Voicemail Received** | *(coming soon)* |

  ---

  ## Installation

  ### For n8n Cloud Users

  This node is available in the n8n community nodes catalog. You can install it directly from the n8n interface:

  1. Go to **Settings** → **Community Nodes**
  2. Search for `@nuacom/n8n-nodes-nuacom`
  3. Click **Install**

  ### For Self-Hosted n8n

  If you're running a self-hosted instance of n8n, install this package in your n8n installation directory:

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

  Or if you're using n8n via Docker:

  ```bash
  docker exec -it <container-name> npm install @nuacom/n8n-nodes-nuacom
  ```

  ## Configuration

  ### API Credentials

  Before using the NUACOM nodes, you need to configure your NUACOM API credentials:

  1. In n8n, go to **Credentials** → **Add Credential**
  2. Search for **NUACOM API**
  3. Enter your NUACOM API token
     - You can find your API token in your NUACOM dashboard under **Settings** → **API**

  ## Usage Examples

  ### Example 1: Create a Contact on Form Submission

  Automatically create a NUACOM contact when a form is filled in:

  1. Add a trigger node (e.g. Webhook or Typeform)
  2. Add a **NUACOM** node
  3. Select **Contact** → **Create**
  4. Map the form fields to **First Name**, **Last Name**, **Phone**, and **Email**

  ### Example 2: Trigger a Workflow on Incoming Call

  Run a workflow whenever a missed call occurs on a specific extension:

  1. Add a **NUACOM Trigger** node
  2. Select **Call Missed**
  3. Set **Extension** to the extension number you want to monitor
  4. Add subsequent nodes to send a Slack notification or create a follow-up task

  ### Example 3: Send an SMS Notification

  Send an SMS when a specific event happens in another system:

  1. Add any trigger node
  2. Add a **NUACOM** node
  3. Select **SMS** → **Send**
  4. Set the **From** field to your registered sender name or number
  5. Set **To** and **Message** using expressions from the trigger data

  ### Example 4: Tag a Call After AI Analysis

  Automatically tag a call once its AI analysis is ready:

  1. Add a **NUACOM Trigger** node, select **Call Updated**, set **Event Type** to **AI Analysis**
  2. Add a **NUACOM** node, select **Call Log** → **Add Tag by Name**
  3. Map **Call ID** from the trigger and set your tag name

  ### Example 5: Request a Callback When a Lead Submits a Form

  Trigger an outbound callback to a customer the moment they fill in a contact form:

  1. Add a Webhook trigger node
  2. Add a **NUACOM** node, select **Callback** → **Dial Agent**
  3. Set **Extension** to the agent's extension and **Destination Number** to the customer's phone number from the form

  ## Development

  ### Prerequisites

  - Node.js v18+
  - npm
  - TypeScript

  ### Setup

  1. Clone the repository:

  ```bash
  git clone https://github.com/NUACOM/@nuacom/n8n-nodes-nuacom.git
  cd @nuacom/n8n-nodes-nuacom
  ```

  2. Install dependencies:

  ```bash
  npm install
  ```

  3. Build the project:

  ```bash
  npm run build
  ```

  ### Available Scripts

  - `npm run build` — Compile TypeScript to JavaScript and copy icons
  - `npm run dev` — Watch mode for development
  - `npm run lint` — Run ESLint
  - `npm run prepublishOnly` — Build before publishing

  ### Project Structure

  ```
  @nuacom/n8n-nodes-nuacom/
  ├── nodes/
  │   ├── Nuacom/
  │   │   ├── Nuacom.node.ts        # Main action node
  │   │   └── nuacom.svg            # Node icon
  │   └── NuacomTrigger/
  │       ├── NuacomTrigger.node.ts # Trigger node
  │       └── nuacom.svg            # Node icon
  ├── credentials/
  │   └── NuacomApi.credentials.ts  # API credential definition
  ├── constants.ts                  # Base URL and shared constants
  └── dist/                         # Compiled output
  ```

  ## Contributing

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

  1. Fork the repository
  2. Create your feature branch (`git checkout -b feature/amazing-feature`)
  3. Make your changes and run linting (`npm run lint`)
  4. Commit your changes
  5. Push to the branch and open a Pull Request

  ## License

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

  ## Support

  For issues or questions:

  - **GitHub Issues**: [https://github.com/NUACOM/@nuacom/n8n-nodes-nuacom/issues](https://github.com/NUACOM/@nuacom/n8n-nodes-nuacom/issues)
  - **NUACOM Website**: [https://nuacom.com](https://nuacom.com)
  - **Email**: support@nuacom.com

  ---

  Made with ❤️ by the NUACOM team.

ai_documentation_summary:
  {"purpose":"The NUACOM Trigger node automatically initiates n8n workflows when specific NUACOM events occur, such as incoming calls, SMS messages, or call updates, allowing for event-driven automation.","capabilities":["Trigger on Call Answered","Trigger on Call Completed","Trigger on Call Initiated","Trigger on Call Missed","Trigger on Call Updated (AI Analysis, Notes, Tags)","Trigger on Incoming Call","Trigger on Message Received (SMS/WhatsApp)","Trigger on Message Sent (SMS/WhatsApp)","Filter triggers by Direction, Queue, Extension, Event Type, and Message Content","Integrate with NUACOM API for Call Logs, Contacts, Auto Dialer, Extensions, Messages, and Webhooks"],"authentication":"API token required (configured via n8n Credentials as 'NUACOM API')","commonUseCases":["Automatically create contacts from form submissions","Send notifications (Slack, Email) when calls are missed","Trigger outbound callbacks to customers after form submission","Automatically tag calls based on AI analysis completion","Send SMS notifications based on external triggers"],"limitations":["Some event types like 'Call IVR Option Selected' and 'Voicemail Received' are marked as 'coming soon'","Filtering options for triggers are limited to specific fields per event type (e.g., Direction, Queue, Extension for calls)"],"relatedNodes":["NUACOM Node","Webhook Trigger","Form Trigger","Slack Notification","Email Send"]}


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

updated_at: 2026-07-14 14:40:34
author_name: eduardo.nuacom
author_github_url: https://github.com/NUACOM/n8n-nodes-nuacom.git
npm_package_name: @nuacom/n8n-nodes-nuacom
npm_version: 0.1.13
community_fetched_at: 2026-07-14T14:40:34.350Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "calls",
      "options": [
        {
          "name": "Auto Dialer",
          "value": "autoDialer"
        },
        {
          "name": "Call",
          "value": "calls"
        },
        {
          "name": "Contact",
          "value": "contacts"
        },
        {
          "name": "Message",
          "value": "messages"
        },
        {
          "name": "NUACOM AI",
          "value": "nuacomAi"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Note",
          "value": "addNote",
          "action": "Add a note to a call"
        },
        {
          "name": "Add Tag",
          "value": "addTag",
          "action": "Add a tag to a call"
        },
        {
          "name": "Dial a Team",
          "value": "dialTeam",
          "action": "Make a call to a queue"
        },
        {
          "name": "Dial an Agent",
          "value": "dialAgent",
          "action": "Make a call to an agent"
        },
        {
          "name": "Download Call Recording",
          "value": "downloadRecording",
          "action": "Download the recording of a completed call"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Retrieve a specific call by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "List and filter calls with pagination support"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "calls"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Retrieve a specific SMS by ID"
        },
        {
          "name": "Get Conversation",
          "value": "getConversation",
          "action": "Retrieve all messages from a customer conversation"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "List and filter messages"
        },
        {
          "name": "Send",
          "value": "send",
          "action": "Send an SMS message"
        },
        {
          "name": "Send WhatsApp Message",
          "value": "sendWhatsapp",
          "action": "Send a whats app message"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "messages"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new contact"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Retrieve a specific contact"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "List and filter contacts"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an existing contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contacts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getCampaigns",
      "options": [
        {
          "name": "Add Contact to Campaign",
          "value": "addCampaignContact",
          "action": "Add a contact to an auto dialer campaign"
        },
        {
          "name": "Get a Campaign",
          "value": "getCampaign",
          "action": "Get a specific auto dialer campaign by ID"
        },
        {
          "name": "List All Calls",
          "value": "getCalls",
          "action": "List all auto dialer calls"
        },
        {
          "name": "List All Campaigns",
          "value": "getCampaigns",
          "action": "List all auto dialer campaigns"
        },
        {
          "name": "List Campaign Contacts",
          "value": "getCampaignContacts",
          "action": "List contacts in an auto dialer campaign"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "autoDialer"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getCallAiData",
      "options": [
        {
          "name": "Get Call AI Data",
          "value": "getCallAiData",
          "action": "Get an AI generated analysis for a specific call"
        },
        {
          "name": "List Calls AI Data",
          "value": "listCallsAiData",
          "action": "List AI generated analysis for calls"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "nuacomAi"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Add Note",
      "value": "addNote",
      "action": "Add a note to a call",
      "resource": "calls"
    },
    {
      "name": "Add Tag",
      "value": "addTag",
      "action": "Add a tag to a call",
      "resource": "calls"
    },
    {
      "name": "Dial a Team",
      "value": "dialTeam",
      "action": "Make a call to a queue",
      "resource": "calls"
    },
    {
      "name": "Dial an Agent",
      "value": "dialAgent",
      "action": "Make a call to an agent",
      "resource": "calls"
    },
    {
      "name": "Download Call Recording",
      "value": "downloadRecording",
      "action": "Download the recording of a completed call",
      "resource": "calls"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Retrieve a specific call by ID",
      "resource": "calls"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "List and filter calls with pagination support",
      "resource": "calls"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Retrieve a specific SMS by ID",
      "resource": "messages"
    },
    {
      "name": "Get Conversation",
      "value": "getConversation",
      "action": "Retrieve all messages from a customer conversation",
      "resource": "messages"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "List and filter messages",
      "resource": "messages"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send an SMS message",
      "resource": "messages"
    },
    {
      "name": "Send WhatsApp Message",
      "value": "sendWhatsapp",
      "action": "Send a whats app message",
      "resource": "messages"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new contact",
      "resource": "contacts"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Retrieve a specific contact",
      "resource": "contacts"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "List and filter contacts",
      "resource": "contacts"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an existing contact",
      "resource": "contacts"
    },
    {
      "name": "Add Contact to Campaign",
      "value": "addCampaignContact",
      "action": "Add a contact to an auto dialer campaign",
      "resource": "autoDialer"
    },
    {
      "name": "Get a Campaign",
      "value": "getCampaign",
      "action": "Get a specific auto dialer campaign by ID",
      "resource": "autoDialer"
    },
    {
      "name": "List All Calls",
      "value": "getCalls",
      "action": "List all auto dialer calls",
      "resource": "autoDialer"
    },
    {
      "name": "List All Campaigns",
      "value": "getCampaigns",
      "action": "List all auto dialer campaigns",
      "resource": "autoDialer"
    },
    {
      "name": "List Campaign Contacts",
      "value": "getCampaignContacts",
      "action": "List contacts in an auto dialer campaign",
      "resource": "autoDialer"
    },
    {
      "name": "Get Call AI Data",
      "value": "getCallAiData",
      "action": "Get an AI generated analysis for a specific call",
      "resource": "nuacomAi"
    },
    {
      "name": "List Calls AI Data",
      "value": "listCallsAiData",
      "action": "List AI generated analysis for calls",
      "resource": "nuacomAi"
    }
  ]

npm_readme:
  # @nuacom/n8n-nodes-nuacom

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

  An n8n community node package that provides seamless integration with the [NUACOM](https://nuacom.com) API, enabling you to automate calls, SMS, contact management, and webhook subscriptions within your n8n workflows.

  ## Features

  This package includes two main nodes:

  ### 1. NUACOM Node

  A comprehensive node for interacting with the NUACOM API, supporting the following resources:

  #### 📞 **Call Log**
  - **Get Many** — Retrieve call logs with optional filters: date range, call type (incoming/outgoing/missed/unanswered), extension, queue, phone number, and pagination
  - **Get** — Retrieve a specific call log by ID
  - **Get AI Data** — Retrieve AI analysis data for a call
  - **Download Recording** — Download the recording file for a call
  - **Add Note** — Add a text note to a call
  - **Add Tag by ID** — Tag a call using a tag definition ID
  - **Add Tag by Name** — Tag a call by name (creates the tag automatically if it does not exist)

  #### 📲 **Callback**
  - **Dial Agent** — Request a callback to a customer via an agent extension
  - **Dial Team** — Request a callback to a customer via a team queue

  #### 👤 **Contact**
  - **Get Many** — List contacts with pagination (15 / 50 / 100 / All per page)
  - **Get** — Retrieve a specific contact by ID
  - **Create** — Create a new contact with name, phone, and email
  - **Update** — Update an existing contact
  - **Delete** — Delete a contact

  #### 🤖 **Auto Dialer**
  - **Get Many Campaigns** — List all auto dialer campaigns
  - **Get Campaign Stats** — Retrieve statistics for a specific campaign
  - **Get Campaign Contacts** — List contacts (numbers) in a campaign
  - **Add Contact to Campaign** — Add a phone number to an existing campaign

  #### 🔌 **Extension**
  - **Get Many** — List all extensions on the account

  #### 💬 **Message**
  - **Send WhatsApp** — Send a WhatsApp message to a phone number
  - **Get** — Retrieve a message by ID
  - **Get Conversation** — Retrieve a conversation by ID

  #### 📱 **SMS**
  - **Send** — Send an SMS message from a registered sender

  #### 🔔 **Webhook Subscription**
  - **Get Many** — List all active webhook subscriptions
  - **Create** — Register a new webhook subscription for an event type
  - **Delete** — Remove an existing webhook subscription

  ---

  ### 2. NUACOM Trigger Node

  A webhook trigger node that automatically starts workflows when NUACOM events occur. Each event type exposes relevant filters so workflows only fire for the calls or messages you care about.

  | Event | Available Filters |
  |-------|-------------------|
  | **Call Answered** | Direction, Queue, Extension |
  | **Call Completed** | Direction, Queue, Extension |
  | **Call Initiated** | Direction, Queue, Extension |
  | **Call Missed** | Direction, Queue, Extension |
  | **Call Updated** | Direction, Event Type (AI Analysis / Notes / Tags) |
  | **Incoming Call** | Queue, Extension |
  | **Message Received** | Channel (SMS / WhatsApp), Message Contains |
  | **Message Sent** | Channel (SMS / WhatsApp), Message Contains |
  | **Call IVR Option Selected** | *(coming soon)* |
  | **Voicemail Received** | *(coming soon)* |

  ---

  ## Installation

  ### For n8n Cloud Users

  This node is available in the n8n community nodes catalog. You can install it directly from the n8n interface:

  1. Go to **Settings** → **Community Nodes**
  2. Search for `@nuacom/n8n-nodes-nuacom`
  3. Click **Install**

  ### For Self-Hosted n8n

  If you're running a self-hosted instance of n8n, install this package in your n8n installation directory:

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

  Or if you're using n8n via Docker:

  ```bash
  docker exec -it <container-name> npm install @nuacom/n8n-nodes-nuacom
  ```

  ## Configuration

  ### API Credentials

  Before using the NUACOM nodes, you need to configure your NUACOM API credentials:

  1. In n8n, go to **Credentials** → **Add Credential**
  2. Search for **NUACOM API**
  3. Enter your NUACOM API token
     - You can find your API token in your NUACOM dashboard under **Settings** → **API**

  ## Usage Examples

  ### Example 1: Create a Contact on Form Submission

  Automatically create a NUACOM contact when a form is filled in:

  1. Add a trigger node (e.g. Webhook or Typeform)
  2. Add a **NUACOM** node
  3. Select **Contact** → **Create**
  4. Map the form fields to **First Name**, **Last Name**, **Phone**, and **Email**

  ### Example 2: Trigger a Workflow on Incoming Call

  Run a workflow whenever a missed call occurs on a specific extension:

  1. Add a **NUACOM Trigger** node
  2. Select **Call Missed**
  3. Set **Extension** to the extension number you want to monitor
  4. Add subsequent nodes to send a Slack notification or create a follow-up task

  ### Example 3: Send an SMS Notification

  Send an SMS when a specific event happens in another system:

  1. Add any trigger node
  2. Add a **NUACOM** node
  3. Select **SMS** → **Send**
  4. Set the **From** field to your registered sender name or number
  5. Set **To** and **Message** using expressions from the trigger data

  ### Example 4: Tag a Call After AI Analysis

  Automatically tag a call once its AI analysis is ready:

  1. Add a **NUACOM Trigger** node, select **Call Updated**, set **Event Type** to **AI Analysis**
  2. Add a **NUACOM** node, select **Call Log** → **Add Tag by Name**
  3. Map **Call ID** from the trigger and set your tag name

  ### Example 5: Request a Callback When a Lead Submits a Form

  Trigger an outbound callback to a customer the moment they fill in a contact form:

  1. Add a Webhook trigger node
  2. Add a **NUACOM** node, select **Callback** → **Dial Agent**
  3. Set **Extension** to the agent's extension and **Destination Number** to the customer's phone number from the form

  ## Development

  ### Prerequisites

  - Node.js v18+
  - npm
  - TypeScript

  ### Setup

  1. Clone the repository:

  ```bash
  git clone https://github.com/NUACOM/@nuacom/n8n-nodes-nuacom.git
  cd @nuacom/n8n-nodes-nuacom
  ```

  2. Install dependencies:

  ```bash
  npm install
  ```

  3. Build the project:

  ```bash
  npm run build
  ```

  ### Available Scripts

  - `npm run build` — Compile TypeScript to JavaScript and copy icons
  - `npm run dev` — Watch mode for development
  - `npm run lint` — Run ESLint
  - `npm run prepublishOnly` — Build before publishing

  ### Project Structure

  ```
  @nuacom/n8n-nodes-nuacom/
  ├── nodes/
  │   ├── Nuacom/
  │   │   ├── Nuacom.node.ts        # Main action node
  │   │   └── nuacom.svg            # Node icon
  │   └── NuacomTrigger/
  │       ├── NuacomTrigger.node.ts # Trigger node
  │       └── nuacom.svg            # Node icon
  ├── credentials/
  │   └── NuacomApi.credentials.ts  # API credential definition
  ├── constants.ts                  # Base URL and shared constants
  └── dist/                         # Compiled output
  ```

  ## Contributing

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

  1. Fork the repository
  2. Create your feature branch (`git checkout -b feature/amazing-feature`)
  3. Make your changes and run linting (`npm run lint`)
  4. Commit your changes
  5. Push to the branch and open a Pull Request

  ## License

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

  ## Support

  For issues or questions:

  - **GitHub Issues**: [https://github.com/NUACOM/@nuacom/n8n-nodes-nuacom/issues](https://github.com/NUACOM/@nuacom/n8n-nodes-nuacom/issues)
  - **NUACOM Website**: [https://nuacom.com](https://nuacom.com)
  - **Email**: support@nuacom.com

  ---

  Made with ❤️ by the NUACOM team.

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of telephony, messaging, and contact management tasks by integrating with the NUACOM public API.","capabilities":["Retrieve call logs with filters and pagination","Download call recordings","Add notes and tags to call logs","Retrieve AI analysis data for calls","Request callbacks via agent or team queue","Manage contacts (create, update, delete, list)","Manage auto dialer campaigns and contacts","List account extensions","Send WhatsApp and SMS messages","Retrieve message and conversation details"],"authentication":"API token required","commonUseCases":["Automatically create contacts from form submissions","Trigger workflows on missed or answered calls","Send SMS notifications based on external events","Tag calls after AI analysis completion","Request callbacks for new leads"],"limitations":["Call IVR Option Selected and Voicemail Received trigger events are marked as 'coming soon'","Self-hosted installation requires manual npm installation"],"relatedNodes":["NUACOM Trigger","Webhook","Form Trigger","Slack Notification"]}


node_type: n8n-nodes-easyparser.easyparser
package_name: n8n-nodes-easyparser
display_name: Easyparser
description: Extract structured Amazon product data using Easyparser API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: easyparser.com
author_github_url: https://github.com/easyparser-com/
npm_package_name: n8n-nodes-easyparser
npm_version: 0.2.17
community_fetched_at: 2026-07-14T14:40:34.351Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "DETAIL",
      "options": [
        {
          "name": "Account Info",
          "value": "ACCOUNT_INFO",
          "action": "Get account info",
          "description": "Get account plan and credit usage details"
        },
        {
          "name": "Best Sellers Rank",
          "value": "BEST_SELLERS_RANK",
          "action": "Get best sellers rank",
          "description": "Get Best Sellers Rank for a product"
        },
        {
          "name": "Bulk Get Result",
          "value": "BULK_GET_RESULT",
          "action": "Get bulk result by ID",
          "description": "Retrieve the result of a bulk query by its ID"
        },
        {
          "name": "Bulk Submit",
          "value": "BULK_SUBMIT",
          "action": "Submit bulk request",
          "description": "Submit a batch of requests to the Bulk API for async processing"
        },
        {
          "name": "Package Dimension",
          "value": "PACKAGE_DIMENSION",
          "action": "Get package dimension",
          "description": "Get physical dimensions and weight of a product"
        },
        {
          "name": "Product Detail",
          "value": "DETAIL",
          "action": "Get product detail",
          "description": "Get detailed information about a product"
        },
        {
          "name": "Product Lookup",
          "value": "PRODUCT_LOOKUP",
          "action": "Look up product by identifier",
          "description": "Convert EAN / UPC / GTIN to Amazon ASIN"
        },
        {
          "name": "Product Offers",
          "value": "OFFER",
          "action": "Get product offers",
          "description": "Get price offers for a product"
        },
        {
          "name": "Sales Analysis History",
          "value": "SALES_ANALYSIS_HISTORY",
          "action": "Get sales analysis history",
          "description": "Get sales history and trend data"
        },
        {
          "name": "Search",
          "value": "SEARCH",
          "action": "Search products",
          "description": "Search for products by keyword or URL"
        },
        {
          "name": "Seller Feedback",
          "value": "SELLER_FEEDBACK",
          "action": "Get seller feedback",
          "description": "Get feedback history for a seller"
        },
        {
          "name": "Seller Products",
          "value": "SELLER_PRODUCTS",
          "action": "Get seller products",
          "description": "Get all products listed by a seller"
        },
        {
          "name": "Seller Profile",
          "value": "SELLER_PROFILE",
          "action": "Get seller profile",
          "description": "Get seller information and ratings"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Account Info",
      "value": "ACCOUNT_INFO",
      "action": "Get account info",
      "description": "Get account plan and credit usage details"
    },
    {
      "name": "Best Sellers Rank",
      "value": "BEST_SELLERS_RANK",
      "action": "Get best sellers rank",
      "description": "Get Best Sellers Rank for a product"
    },
    {
      "name": "Bulk Get Result",
      "value": "BULK_GET_RESULT",
      "action": "Get bulk result by ID",
      "description": "Retrieve the result of a bulk query by its ID"
    },
    {
      "name": "Bulk Submit",
      "value": "BULK_SUBMIT",
      "action": "Submit bulk request",
      "description": "Submit a batch of requests to the Bulk API for async processing"
    },
    {
      "name": "Package Dimension",
      "value": "PACKAGE_DIMENSION",
      "action": "Get package dimension",
      "description": "Get physical dimensions and weight of a product"
    },
    {
      "name": "Product Detail",
      "value": "DETAIL",
      "action": "Get product detail",
      "description": "Get detailed information about a product"
    },
    {
      "name": "Product Lookup",
      "value": "PRODUCT_LOOKUP",
      "action": "Look up product by identifier",
      "description": "Convert EAN / UPC / GTIN to Amazon ASIN"
    },
    {
      "name": "Product Offers",
      "value": "OFFER",
      "action": "Get product offers",
      "description": "Get price offers for a product"
    },
    {
      "name": "Sales Analysis History",
      "value": "SALES_ANALYSIS_HISTORY",
      "action": "Get sales analysis history",
      "description": "Get sales history and trend data"
    },
    {
      "name": "Search",
      "value": "SEARCH",
      "action": "Search products",
      "description": "Search for products by keyword or URL"
    },
    {
      "name": "Seller Feedback",
      "value": "SELLER_FEEDBACK",
      "action": "Get seller feedback",
      "description": "Get feedback history for a seller"
    },
    {
      "name": "Seller Products",
      "value": "SELLER_PRODUCTS",
      "action": "Get seller products",
      "description": "Get all products listed by a seller"
    },
    {
      "name": "Seller Profile",
      "value": "SELLER_PROFILE",
      "action": "Get seller profile",
      "description": "Get seller information and ratings"
    }
  ]

npm_readme:
  # n8n-nodes-easyparser

  <div align="center">
    <br>
    <picture>
      <source media="(prefers-color-scheme: dark)" srcset="https://easyparser.com/assets/svg/logos/logo-white-2.svg">
      <img alt="Easyparser" src="https://easyparser.com/assets/svg/logos/logo.svg" width="260">
    </picture>
    <br><br>
  </div>

  This is an n8n community node for [Easyparser](https://easyparser.com) — a powerful, real-time Amazon product data extraction API. Extract product details, offers, search results, seller data, and more across 19+ marketplaces — no scraping, no proxies. Use our n8n node to build powerful e-commerce automations in minutes.

  ## Features

  With this node you can extract structured data from Amazon across 19+ marketplaces. Operations are organized into four categories:

  | Group | Operation | Action | Description |
  |---|---|---|---|
  | **Product Data** | Product Detail | Get product detail | Full product info: title, price, images, reviews, variants |
  | | Product Offers | Get product offers | All seller offers and pricing for a product |
  | | Sales Analysis History | Get sales analysis history | Sales history and trend data |
  | | Best Sellers Rank | Get best sellers rank | BSR data for a product |
  | | Package Dimension | Get package dimension | Physical dimensions and weight |
  | **—** | | | |
  | **Search & Discovery** | Search | Search products | Search results by keyword or URL |
  | | Product Lookup | Look up product by identifier | Convert EAN / UPC / GTIN / ISBN to Amazon ASIN |
  | **—** | | | |
  | **Seller Data** | Seller Profile | Get seller profile | Seller info and ratings |
  | | Seller Products | Get seller products | All products listed by a seller |
  | | Seller Feedback | Get seller feedback | Feedback history for a seller |
  | **—** | | | |
  | **Bulk** | Bulk Submit | Submit bulk request | Submit a batch of requests for async processing via webhook |
  | | Bulk Get Result | Get bulk result by ID | Retrieve parsed result of a bulk query using its ID |
  | **—** | | | |
  | **Account** | Account Info | Get account info | Account plan and credit usage details |

  ## Bulk Integration

  The Bulk API (`bulk.easyparser.com`) allows you to submit thousands of requests in a single call. Results are delivered asynchronously to your `callback_url` (webhook).

  **Typical workflow:**
  1. Use **Bulk Submit** to send a batch (e.g., list of ASINs for DETAIL operation)
  2. Easyparser processes the batch and sends results to your `callback_url`
  3. Alternatively, use **Bulk Get Result** with the `id` values returned in the submit response to poll for results

  **Supported bulk operations:** DETAIL · OFFER · SEARCH · PACKAGE_DIMENSION · PRODUCT_LOOKUP · SALES_ANALYSIS_HISTORY · BEST_SELLERS_RANK · SELLER_PROFILE · SELLER_PRODUCTS

  **Payload example for DETAIL:**
  ```json
  {"asins": ["B00004RFMB", "B00004RFMC", "B00004RFMJ"]}
  ```

  > Note: In Bulk Integration, input keys are pluralized (e.g., `asins` instead of `asin`, `keywords` instead of `keyword`).

  ## Advanced Parameters

  All optional API parameters are available via the **Additional Options** section:
  - Pagination (`minPage`, `maxPage`, `pageNumber`)
  - Sorting (`sortBy`)
  - Offer filters (prime, free_shipping, condition filters)
  - A+ Content extraction
  - Language and Currency overrides
  - Custom `cookie` and `addressId` injection
  - Associate/Affiliate ID

  ## Installation

  In your n8n instance, go to **Settings → Community Nodes** and install:

  ```
  n8n-nodes-easyparser
  ```

  ## Credentials

  You need an **Easyparser API key**. Get yours at [app.easyparser.com](https://app.easyparser.com).

  ## Supported Marketplaces

  amazon.com · amazon.co.uk · amazon.de · amazon.fr · amazon.it · amazon.es · amazon.ca · amazon.com.mx · amazon.com.br · amazon.co.jp · amazon.com.au · amazon.in · amazon.ae · amazon.sa · amazon.nl · amazon.pl · amazon.se · amazon.com.tr · amazon.sg

  ## Documentation

  - Full API documentation: [easyparser.gitbook.io/easyparser-documentation](https://easyparser.gitbook.io/easyparser-documentation/)
  - Bulk Integration: [easyparser.gitbook.io/easyparser-documentation/bulk-integration/overview](https://easyparser.gitbook.io/easyparser-documentation/bulk-integration/overview)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Extract structured Amazon product data across 19+ marketplaces using the Easyparser API without scraping or proxies.","capabilities":["Extract product details (title, price, images, reviews, variants)","Retrieve product offers and seller pricing","Analyze sales history and trends","Get Best Sellers Rank (BSR) data","Extract package dimensions and weight","Search products by keyword or URL","Look up products by EAN/UPC/GTIN/ISBN to ASIN","Retrieve seller profiles, products, and feedback","Submit bulk requests for asynchronous processing","Retrieve bulk query results by ID"],"authentication":"API key required (configured via Credentials node)","commonUseCases":["Automated price monitoring and alerting","Competitor product analysis","Inventory tracking across multiple marketplaces","Bulk product data extraction for e-commerce platforms","Seller performance evaluation"],"limitations":["Bulk operations require asynchronous processing via webhook","Limited to 19 supported marketplaces","Requires active Easyparser account with API key"],"relatedNodes":["Webhook","HTTP Request","Delay","Split In Batches"]}


node_type: n8n-nodes-albacross.albacrossTrigger
package_name: n8n-nodes-albacross
display_name: Albacross Trigger
description: Receive identified-company leads from Albacross
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: albacross_dev
author_github_url: https://github.com/albacross/
npm_package_name: n8n-nodes-albacross
npm_version: 0.1.1
community_fetched_at: 2026-07-14T14:40:34.352Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-albacross

  [n8n](https://n8n.io/) community node package for
  [Albacross](https://albacross.com). Lets your n8n workflows react in real time
  to identified-company leads tracked by Albacross.

  ## What's in the package

  - **Albacross API** credential — stores the n8n API key you generate inside
    Albacross and verifies it on save by calling `GET /n8n/me`.
  - **Albacross Trigger** node — webhook-style trigger that registers itself
    with Albacross on workflow activation and receives lead events as they
    happen. Supports filtering by segment, buyer-persona keyword source, and
    send-mode (every match vs. one-per-company).

  ## Requirements

  - n8n version `1.0` or later (community nodes are supported on both
    self-hosted and Cloud installations with verified community nodes enabled).
  - An Albacross account with an n8n API key (see *Credentials* below).
  - Node.js `>= 20.15` if you are installing the node manually.

  ## Installation

  ### From the n8n editor (recommended)

  1. Open **Settings → Community Nodes** in your n8n instance.
  2. Click **Install a community node**.
  3. Enter `n8n-nodes-albacross` and confirm the install.

  n8n Cloud users need to have verified community nodes enabled. On
  self-hosted instances the feature is available out of the box once the
  admin has [allowed community nodes](https://docs.n8n.io/hosting/configuration/community-nodes/).

  ### Manual install

  ```bash
  npm install n8n-nodes-albacross
  ```

  Then restart your n8n instance so it picks up the new node and credential.

  ## Credentials

  1. Log in to your Albacross account.
  2. Go to **Settings → Integrations → n8n** to copy the API key.
  3. In n8n, create a new **Albacross API** credential and paste the API key into
     the **API Key** field.
  4. Click **Save**. n8n will verify the key by calling `GET /n8n/me` against
     the Albacross API.

  ## Using the Albacross Trigger node

  Drop the **Albacross Trigger** node onto your canvas to start a workflow
  whenever Albacross identifies a matching company.

  ### Parameters

  | Parameter | Description |
  |---|---|
  | **Segment** | Restrict the trigger to companies in a specific Albacross segment. Choose **All companies** to receive every identified lead. The dropdown is populated from your account's segments. |
  | **Send mode** | `Send New and Returning Companies` fires the workflow for every qualifying event. `Send Only New Companies` debounces so each company only triggers once. |
  | **Contacts** | Optionally enrich the lead payload with matching contacts. Filter by buyer-persona keyword source and country. |

  ### What happens on activation, edit, and deactivation

  - **Activation** — the node registers a webhook with Albacross by calling
    `POST /n8n/hooks`. Albacross records the n8n webhook URL and starts
    routing matching leads to it. The hook id is stored on the workflow so
    later edits can patch the same record.
  - **Editing parameters** — the node diffs your changes and `PATCH`es only
    the fields that changed.
  - **Deactivation** — the node calls `DELETE /n8n/hooks/:id` and Albacross
    stops sending events to that workflow.

  ### Receiving leads

  When Albacross matches a lead against your segment, it POSTs the lead to
  the n8n webhook URL the trigger registered. The payload contains the
  company information, any requested contacts, and event metadata. The
  workflow starts with that payload as the first item.

  ## Troubleshooting

  - **`Authentication failed` when saving the credential** — double-check
    the API key is the one generated under **Settings → Integrations → n8n** in
    Albacross, and not a different access token. Generate a new key if you
    are unsure.
  - **No events arriving after activation** — confirm in Albacross that the
    connector appears under your account's active n8n connectors, and check
    that the workflow's n8n webhook is reachable from the public internet.
  - **Segment dropdown is empty** — your account may not have any segments
    yet. Create one in Albacross first, or pick **All companies**.

  ## Support

  - Issues with this package: please file a GitHub issue on
    [albacross/n8n-nodes-albacross](https://github.com/albacross/n8n-nodes-albacross/issues).
  - Questions about your Albacross account, API keys, or segments:
    contact [developers@albacross.com](mailto:developers@albacross.com).

  ## Development

  This package is scaffolded with the official
  [`@n8n/node-cli`](https://www.npmjs.com/package/@n8n/node-cli).

  ```bash
  npm install
  npm run build      # transpile TypeScript to dist/
  npm run lint       # n8n-node lint (includes community-node scanner)
  npm test           # jest unit tests
  npm run dev        # run a local n8n instance with this node loaded
  ```

  Pull requests are welcome.

  ## Resources

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

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"The Albacross Trigger node enables n8n workflows to react in real-time to identified company leads tracked by Albacross by registering as a webhook endpoint.","capabilities":["Receive lead events from Albacross as they occur","Filter leads by specific Albacross segments","Filter leads by buyer-persona keyword source and country","Enrich lead payloads with matching contact information","Configure send mode to trigger for every match or debounce to one-per-company","Register, update, and unregister webhook hooks with Albacross API"],"authentication":"API key required (n8n API key generated in Albacross Settings → Integrations → n8n)","commonUseCases":["Automated outreach when new companies are identified","Lead enrichment and contact discovery","Real-time monitoring of target company segments"],"limitations":["Requires an active Albacross account with API key configuration","Segment filtering requires pre-existing segments in the Albacross account","Requires public internet access for the n8n webhook URL to receive events"],"relatedNodes":["Albacross API","Webhook","Code"]}


node_type: n8n-nodes-trugen.trugen
package_name: n8n-nodes-trugen
display_name: Trugen
description: Create agents, list avatars, and fetch conversations from Trugen
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: trugenai
author_github_url: https://github.com/trugenai/
npm_package_name: n8n-nodes-trugen
npm_version: 0.1.14
community_fetched_at: 2026-07-14T14:40:34.353Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "createAgent",
      "options": [
        {
          "name": "Create Agent",
          "value": "createAgent"
        },
        {
          "name": "Get Conversation",
          "value": "getConversation"
        },
        {
          "name": "Get Stock Avatars",
          "value": "getAvatars"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Agent",
      "value": "createAgent"
    },
    {
      "name": "Get Conversation",
      "value": "getConversation"
    },
    {
      "name": "Get Stock Avatars",
      "value": "getAvatars"
    }
  ]

npm_readme:
  # n8n-nodes-trugen

  This package provides an **n8n community node** for interacting with **Trugen** — allowing you to create AI video agents, list stock avatars, and fetch conversation details directly from n8n workflows.

  ---

  ## Supported Features

  The **Trugen** node exposes the following actions:

  - **Create Agent**
    Create and deploy a Trugen video agent with full configuration support (LLM, TTS, STT, callbacks, recording, etc.)

  - **Get Stock Avatars**
    Retrieve the list of available Trugen stock avatars

  - **Get Conversation**
    Fetch conversation details by ID, with optional polling until completion

  ---

  ## Installation

  n8n community guidelines provide complete overview of installation and usage steps.

  ---

  ## Supported Features

  The **Trugen** node contains a single action selector with three actions.

  #### 1. Create Agent

  Create and deploy a Trugen agent.

  Key configuration options include:

  * Agent name and system prompt
  * Stock or custom avatar selection
  * LLM provider and model (OpenAI, Groq, Google)
  * STT and TTS configuration
  * Greeting message and session timeout
  * Recording and webhook callbacks

  #### 2. Get Stock Avatars

  Returns a list of all available Trugen stock avatars.

  No additional parameters are required.

  #### 3. Get Conversation

  Retrieve details for a conversation by its ID.

  Optional:

  * Wait until the conversation reaches a `Completed` status before returning

  ---

  ## Documentation and Resources

  - n8n Community nodes installation [https://docs.n8n.io/integrations/community-nodes/installation][https://docs.n8n.io/integrations/community-nodes/installation]
  - Official API Documentation [https://docs.trugen.ai](https://docs.trugen.ai)
  - Webhook and callbacks integrations [https://docs.trugen.ai/docs/agents/callback](https://docs.trugen.ai/docs/agents/callback)
  - Enabled automted NPN package deployment workflow.


  ---

ai_documentation_summary:
  {"purpose":"This n8n community node lets you interact with Trugen from workflows to create AI video agents, list available stock avatars, and fetch conversation details. It is designed for managing Trugen agent setup and retrieving agent conversation data.","capabilities":["Create and deploy a Trugen AI video agent","Configure agent settings including name, system prompt, avatar, LLM, STT, TTS, greeting, timeout, recording, and callbacks","Retrieve the list of Trugen stock avatars","Fetch conversation details by conversation ID","Optionally poll a conversation until it reaches Completed status"],"authentication":"Not specified in the README; likely requires Trugen API credentials or token-based access via the Trugen API.","commonUseCases":["Automating creation of AI video agents in Trugen from n8n","Listing avatars for dynamic agent avatar selection","Retrieving or waiting for completed conversation records for downstream processing"],"limitations":["Only three actions are supported: Create Agent, Get Stock Avatars, and Get Conversation","Get Stock Avatars requires no parameters, while other operations appear limited to the documented fields and IDs","Authentication details are not documented in the README"],"relatedNodes":["HTTP Request","Webhook"]}


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

updated_at: 2026-07-14 14:40:34
author_name: mkorpela
author_github_url: https://github.com/dealfluence/adeu.git
npm_package_name: n8n-nodes-adeu
npm_version: 1.19.0
community_fetched_at: 2026-07-14T14:40:34.354Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Operate on Microsoft Word (.docx) files: extract LLM-friendly Markdown with CriticMarkup, navigate large documents via a structural outline, apply tracked changes and comments, generate sub-word diffs, and sanitize/finalize documents. Five operations on the Document resource: (1) Extract Markdown — project a .docx into Markdown plus a Semantic Appendix; toggle Clean View to simulate Accept All; pass an optional Page number to fetch only one page of a large document. (2) Extract Outline — return a token-cheap structural map (headings with level, page number, paragraph style, has_table, footnote IDs) plus total_pages. Pair with Extract Markdown to navigate large documents. (3) Apply Edits — apply a JSON array of DocumentChange objects as native Word tracked changes; modify edits support match_mode ('strict'|'first'|'all') and regex (boolean); the entire batch is pre-validated atomically and rejected if any single edit is invalid. Supports a Dry Run flag that previews edits without committing them. (4) Generate Diff — produce a @@ Word Patch @@ sub-word level diff between two .docx files. (5) Finalize Document — strip metadata, optionally accept all pending markup, and optionally lock the file read-only. DocumentChange schema (used by Apply Edits): each object has a 'type' field discriminator. type='modify' requires target_text (string, copied EXACTLY from the source including punctuation, spacing, and case) and new_text (string); optional comment (string); optional match_mode ('strict'|'first'|'all', default 'strict'); optional regex (boolean, default false — when true, target_text is an ES2022 RegExp pattern and new_text may reference $1, $2 capture groups). type='accept' or type='reject' requires target_id (string like 'Chg:12' from the Markdown projection); optional 'comment'. type='reply' requires target_id (string like 'Com:45') and text (string). type='insert_row' requires target_text (string), position ('above' or 'below'), and cells (array of strings). type='delete_row' requires target_text (string). Never wrap new_text in CriticMarkup tags like {++ ++} or {-- --}; the engine applies tracking automatically. Never target text already wrapped in another author's pending tracked change; accept or reject their change first by target_id. Binary handling for AI Agents: this tool cannot receive .docx files through JSON arguments because JSON cannot carry binary data. To process a document, set 'Document Source' to 'From Another Node' and 'Source Node Name' to the exact name of the workflow node that produced the .docx binary (typically the trigger node, e.g. 'Gmail Trigger', 'When clicking Test workflow', or an HTTP Request node configured to download a file). Node names are case-sensitive and must match the canvas label exactly. For the Generate Diff operation, set both 'Original Source Node Name' and 'Modified Source Node Name' independently.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "extractMarkdown",
      "options": [
        {
          "name": "Apply Edits",
          "value": "applyEdits",
          "action": "Apply tracked changes to document",
          "description": "Apply a JSON array of DocumentChange objects (modify, accept, reject, reply, insert_row, delete_row) as native Word tracked changes and comments. modify edits support match_mode ('strict'|'first'|'all') and regex (boolean) for targeted multi-occurrence writes. The whole batch is pre-validated atomically: if any single edit is invalid, the entire batch is rejected and the document is left untouched. Supports a Dry Run mode for previewing edits — when enabled, the engine returns a per-edit report (status, CriticMarkup preview, errors, warnings) without modifying the document or producing a redlined binary."
        },
        {
          "name": "Extract Markdown",
          "value": "extractMarkdown",
          "action": "Extract markdown from document",
          "description": "Project the .docx into LLM-friendly Markdown with CriticMarkup ({++ins++}, {--del--}, {>>comment<<}) plus a Semantic Appendix listing defined terms, cross-references, and potential typos. Each tracked change is tagged with a stable id (Chg:N, Com:N) for use in Apply Edits. Supports an optional Page parameter to fetch only one page of a large document (paired with Extract Outline for navigation)."
        },
        {
          "name": "Extract Outline",
          "value": "extractOutline",
          "action": "Extract a structural outline (table of contents) of the document",
          "description": "Return a token-cheap structural map of the .docx: a JSON array of headings with their level (1-6), text, page number, paragraph style, whether the section directly contains a table, and any footnote/endnote IDs scoped to that section. Also returns total_pages. Use this as a navigation primitive for large documents — call it first to discover structure, then call Extract Markdown with a specific Page to drill into the relevant section."
        },
        {
          "name": "Finalize",
          "value": "finalizeDocument",
          "action": "Sanitize metadata and lock the document for distribution",
          "description": "Strip author names, internal IDs, RSIDs, and proof errors; optionally auto-accept all pending tracked changes; optionally lock the document read-only. Use before sending to counterparties or signers."
        },
        {
          "name": "Generate Diff",
          "value": "generateDiff",
          "action": "Generate diff between documents",
          "description": "Produce a sub-word level @@ Word Patch @@ diff between two .docx files. Reads the document text via the same Markdown projection used by Extract Markdown, so the diff respects CriticMarkup and Clean View settings."
        },
        {
          "name": "Hydrate Tool Output",
          "value": "hydrateToolOutput",
          "action": "Hydrate a redlined binary stashed by Apply Edits as a tool",
          "description": "Read a binary's storage id from workflow static data (where Apply Edits stashes it when run as an AI Agent tool) and re-attach the binary to a main-flow item. Necessary because n8n's AI Agent tool wrapper strips binaries from tool outputs, so the redlined .docx produced by an apply_edits tool call cannot reach downstream nodes directly. Place this node downstream of the AI Agent on the main connection, then route its output into Write Binary File, Gmail (attachment), Slack (file upload), etc."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Apply Edits",
      "value": "applyEdits",
      "action": "Apply tracked changes to document",
      "description": "Apply a JSON array of DocumentChange objects (modify, accept, reject, reply, insert_row, delete_row) as native Word tracked changes and comments. modify edits support match_mode ('strict'|'first'|'all') and regex (boolean) for targeted multi-occurrence writes. The whole batch is pre-validated atomically: if any single edit is invalid, the entire batch is rejected and the document is left untouched. Supports a Dry Run mode for previewing edits — when enabled, the engine returns a per-edit report (status, CriticMarkup preview, errors, warnings) without modifying the document or producing a redlined binary.",
      "resource": "document"
    },
    {
      "name": "Extract Markdown",
      "value": "extractMarkdown",
      "action": "Extract markdown from document",
      "description": "Project the .docx into LLM-friendly Markdown with CriticMarkup ({++ins++}, {--del--}, {>>comment<<}) plus a Semantic Appendix listing defined terms, cross-references, and potential typos. Each tracked change is tagged with a stable id (Chg:N, Com:N) for use in Apply Edits. Supports an optional Page parameter to fetch only one page of a large document (paired with Extract Outline for navigation).",
      "resource": "document"
    },
    {
      "name": "Extract Outline",
      "value": "extractOutline",
      "action": "Extract a structural outline (table of contents) of the document",
      "description": "Return a token-cheap structural map of the .docx: a JSON array of headings with their level (1-6), text, page number, paragraph style, whether the section directly contains a table, and any footnote/endnote IDs scoped to that section. Also returns total_pages. Use this as a navigation primitive for large documents — call it first to discover structure, then call Extract Markdown with a specific Page to drill into the relevant section.",
      "resource": "document"
    },
    {
      "name": "Finalize",
      "value": "finalizeDocument",
      "action": "Sanitize metadata and lock the document for distribution",
      "description": "Strip author names, internal IDs, RSIDs, and proof errors; optionally auto-accept all pending tracked changes; optionally lock the document read-only. Use before sending to counterparties or signers.",
      "resource": "document"
    },
    {
      "name": "Generate Diff",
      "value": "generateDiff",
      "action": "Generate diff between documents",
      "description": "Produce a sub-word level @@ Word Patch @@ diff between two .docx files. Reads the document text via the same Markdown projection used by Extract Markdown, so the diff respects CriticMarkup and Clean View settings.",
      "resource": "document"
    },
    {
      "name": "Hydrate Tool Output",
      "value": "hydrateToolOutput",
      "action": "Hydrate a redlined binary stashed by Apply Edits as a tool",
      "description": "Read a binary's storage id from workflow static data (where Apply Edits stashes it when run as an AI Agent tool) and re-attach the binary to a main-flow item. Necessary because n8n's AI Agent tool wrapper strips binaries from tool outputs, so the redlined .docx produced by an apply_edits tool call cannot reach downstream nodes directly. Place this node downstream of the AI Agent on the main connection, then route its output into Write Binary File, Gmail (attachment), Slack (file upload), etc.",
      "resource": "document"
    }
  ]

npm_readme:
  # n8n-nodes-adeu

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

  An [n8n](https://n8n.io) community node for **[Adeu](https://adeu.ai)** — the AI-native Virtual DOM for Microsoft Word.

  > **🆕 New in this release:**
  > - **`Extract Outline`** — a new operation returning a token-cheap structural map (headings + page numbers + table flags) for navigating large documents.
  > - **`Page` parameter on `Extract Markdown`** — fetch only one page of a paginated projection instead of the whole document.
  > - **`match_mode` and `regex` on `modify` edits** — `Apply Edits` now supports targeted multi-occurrence writes. Set `match_mode: "all"` to replace every occurrence, `"first"` to anchor to the first hit silently, or omit/`"strict"` to fail on ambiguity. Set `regex: true` to interpret `target_text` as an ES2022 RegExp (with `$1`, `$2` capture-group references in `new_text`).
  >
  > **Existing workflows must hand-update their `$fromAI` expressions** to expose the new fields — n8n caches `$fromAI` expressions per workflow and does not retroactively update them on package upgrades.

  This node bridges the gap between Large Language Models (LLMs) and Microsoft Word. It translates complex OpenXML (`.docx`) files into token-efficient Markdown, allows AI models to reason over legal or technical text, and translates the AI's JSON output back into **native Word Tracked Changes and Comments** — all completely in-process, without your documents ever leaving the n8n runtime.

  ---

  ## 📦 Installation

  Depending on your self-hosted n8n configuration, you can install this node via the UI, environment variables, or manually.

  ### Method 1: GUI Installation (Recommended)
  1. In n8n, go to **Settings** > **Community Nodes**.
  2. Select **Install**.
  3. Enter `n8n-nodes-adeu` in the **Enter npm package name** field.
  4. Check **I understand the risks of installing unverified code from a public source**.
  5. Select **Install**.

  ### Method 2: Environment Variables
  For automated deployments, you can bootstrap your n8n instance with a fixed set of packages via environment variables:
  ```bash
  export N8N_COMMUNITY_PACKAGES_MANAGED_BY_ENV=true
  export N8N_COMMUNITY_PACKAGES='[{"name":"n8n-nodes-adeu"}]'
  ```
  *Note: Enabling this makes the Community Nodes settings UI read-only and will automatically uninstall any packages not listed in the JSON array.*

  ### Method 3: Manual Installation (Queue Mode)
  If your n8n instance runs in queue mode or you prefer terminal installation, you can install the node manually:
  ```bash
  docker exec -it n8n sh
  mkdir -p ~/.n8n/nodes
  cd ~/.n8n/nodes
  npm i n8n-nodes-adeu
  ```
  Restart your n8n instance after installation.

  ---

  ## 🚀 Key Capabilities

  - **CriticMarkup Projection**: Translates existing Word tracked changes into standard Markdown (`{++inserted++}`, `{--deleted--}`).
  - **Semantic Appendix**: Automatically extracts defined terms, cross-references, and potential typos to give LLMs deeper context.
  - **Structural Outline**: Lightweight headings-and-pages map of any document, with table/footnote flags per section.
  - **Pagination**: Drill into a single page of a large document instead of blasting the full body into LLM context.
  - **Native Redlining**: Apply `modify`, `accept`, `reject`, and `reply` actions directly to the OOXML tree.
  - **Targeted Multi-Occurrence Writes**: `match_mode` (`strict`/`first`/`all`) and `regex` support for surgical or sweeping replacements.
  - **Document Sanitization**: Strip metadata, auto-accept markup, and apply read-only locks before sending to counterparties.

  ---

  ## ⚙️ Operations

  The node exposes one resource (**Document**) with six operations:

  ### 1. Extract Markdown
  Projects a `.docx` file into LLM-friendly Markdown.
  - **Input**: `.docx` binary.
  - **Output**: JSON `{ markdown, fileName, cleanView }` (plus pagination metadata when a `page` is requested).
  - **Clean View toggle**:
    - `False` (Raw View): Shows all pending tracked changes via CriticMarkup. Best for resolving counterparty edits.
    - `True` (Clean View): Simulates an "Accept All" state, hiding markup. Best for generating net-new redlines on a clean baseline.
  - **🆕 Page parameter**: Optional 1-based page number. When `0` (default), the full document is returned. When `>= 1`, only that page's content is returned and the JSON includes `{ page, total_pages, has_next, has_prev, tracked_change_count }`. Pages are ~19,000-character chunks of the projected body; the Structural Appendix is appended to every page. Use **Extract Outline** first to discover how many pages exist.

  ### 2. Extract Outline 🆕
  Returns a token-cheap structural map of the document — essentially a table of contents an LLM can use to navigate large files.
  - **Input**: `.docx` binary.
  - **Output**: JSON `{ fileName, total_pages, outline: OutlineNode[] }` where each `OutlineNode` is:
    ```json
    {
      "level": 2,
      "text": "Confidentiality",
      "page": 1,
      "style": "Heading 2",
      "has_table": false,
      "footnote_ids": ["fn-1", "fn-3"]
    }
    ```
    - `level` (1–6): Heading depth.
    - `text`: Heading text with markdown/CriticMarkup stripped.
    - `page`: Which Extract Markdown page this heading lands on.
    - `style`: Word style name (e.g. `Heading 1`, `Title`) or `(heuristic)` for headings detected purely by typography.
    - `has_table`: Whether the section directly contains a Word table (does not bubble up to ancestor headings).
    - `footnote_ids`: Footnote/endnote markers scoped to this section, in document order, e.g. `fn-1`, `en-2`.
  - **Typical pattern**: Call this first, let the LLM choose a section, then call **Extract Markdown** with the matching `page` to get just that page's content.

  ### 3. Apply Edits
  Applies a JSON array of `DocumentChange` operations back to the Word document as tracked changes and comments.
  - **Input**: `.docx` binary + a `changes` JSON array (read from an upstream node or defined inline).
  - **Output**: A new redlined `.docx` binary + JSON application stats with per-edit reports (status, occurrences modified, heading path, pages affected, CriticMarkup context, post-accept preview).
  - **Atomic Batch Validation**: Adeu pre-validates the *entire* array of edits before touching the document. If even one edit is invalid (e.g., target text not found, ambiguous match), the engine safely rejects the entire batch to prevent partial or corrupted document states.

  #### 🆕 Targeted Multi-Occurrence Writes (`match_mode` + `regex`)
  The `modify` edit type now supports two optional fields:

  - **`match_mode`** (`"strict"` | `"first"` | `"all"`, default `"strict"`):
    - `"strict"`: Fails with an actionable ambiguity error if `target_text` matches more than one location. Recommended default — surfaces ambiguity to the LLM so it can self-correct with more context.
    - `"first"`: Silently anchors to the first occurrence in linear document order. Use only when you've verified there's just one intended hit.
    - `"all"`: Applies the same replacement to every occurrence. Returns `occurrences_modified` in the per-edit report. Pages listed in the report cover all modified locations.

  - **`regex`** (boolean, default `false`):
    - When `true`, `target_text` is interpreted as an ES2022 `RegExp` pattern (case-sensitive by default — embed flags via inline syntax like `(?i)` if needed).
    - `new_text` may reference capture groups via `$1`, `$2`, etc.
    - Combine with `match_mode: "all"` for global regex-based replacements.

  **Example — convert all dollar amounts to EUR**:
  ```json
  [
    {
      "type": "modify",
      "target_text": "\\$(\\d+)",
      "new_text": "EUR $1",
      "match_mode": "all",
      "regex": true,
      "comment": "Currency normalization."
    }
  ]
  ```

  #### 🔍 Dry Run Mode (Self-Correction for AI Agents)
  `Apply Edits` accepts an optional `Dry Run` boolean (default `false`). When enabled:
  - Every edit is validated and simulated in-memory.
  - The outgoing JSON contains a `stats.edits` array where each entry includes `status` (`applied` / `failed`), a `critic_markup` preview (~30 chars of surrounding context showing exactly where the change would land), a `clean_text` post-accept preview, a `warning` field (e.g. for punctuation-anchored targets prone to tokenization splits), and an `error` field if validation failed.
  - The document is **not** modified. No redlined `.docx` binary is produced. No `redlinedBinaryId` is stashed in workflow static data. The incoming binary passes through unchanged on the outgoing item, so downstream nodes that expected continuity do not break.
  - **Critical behavioral difference**: in a wet run (`Dry Run=false`), the engine throws a `BatchValidationError` atomically on the first invalid edit. In a dry run, invalid edits return as `failed` entries in the `edits` array instead — making dry-run also useful as a probe for whether an edit will succeed.
  - The downstream `Hydrate Tool Output` node naturally short-circuits during a dry run (no static-data entry to read), so the existing AI Agent pipeline correctly skips the file-write step.

  **When the AI should use it**: as a self-correction primitive for uncertain anchors (long quotes, legal terminology, possible duplicate phrases). The agent dry-runs, inspects the `critic_markup` preview, then re-calls with `Dry_Run=false` to commit. The system prompt in the example workflow tells the LLM explicitly to use dry-run sparingly — every dry run is an extra round trip.

  ### 4. Generate Diff
  Produces a sub-word level `@@ Word Patch @@` diff between two versions of a document.
  - **Input**: Two `.docx` binaries on the same item (e.g., `data` and `data2`).
  - **Output**: JSON `{ diff, originalFileName, modifiedFileName }`.

  ### 5. Finalize Document
  Prepares a document for signature or external distribution.
  - **Modes**:
    - `Full`: Strips all metadata and requires all tracked changes/comments to be resolved (or auto-accepted).
    - `Keep Markup`: Strips metadata but preserves visible tracked changes. Allows you to override the `Author` name (e.g., change "Adeu AI" to "My Law Firm").
    - `Baseline`: Only strips background noise (RSIDs, proof errors) without touching metadata.
  - **Protection**: Can inject a native Word "Read-Only" lock into the document settings.

  ### 6. Hydrate Tool Output (The "Hydration" Note)
  Because n8n's AI Agent tool wrapper intercepts and **strips all binary data** from tool outputs, files generated inside an AI loop cannot reach downstream nodes directly.
  - **What it does**: This operation is placed immediately downstream of the AI Agent on the main workflow execution line. It reads the stashed metadata pointer left by the last execution of `apply_edits`, retrieves the raw file stream directly from n8n's secure binary storage, and attaches a fresh binary buffer onto the outgoing item.
  - **Output Path Construction**: It supports an optional output path template (e.g., `C:\path\to\folder\{baseName}_{timestamp}.docx`) to resolve path strings inside TypeScript. This avoids expression-parsing and escape issues when configuring downstream Write File nodes on Windows.

  ---

  ## 🧠 The `DocumentChange` Schema

  To use the **Apply Edits** operation, your LLM must output a JSON array of objects matching this schema.

  | Type | Required Fields | Optional Fields | Description |
  | :--- | :--- | :--- | :--- |
  | `modify` | `target_text`, `new_text` | `comment`, `match_mode`, `regex` | Replaces baseline text. `match_mode`: `"strict"` (default, fails on ambiguity), `"first"` (silently picks first hit), `"all"` (replaces every occurrence). `regex`: when `true`, `target_text` is an ES2022 RegExp pattern. |
  | `accept` | `target_id` | `comment` | Accepts an existing tracked change (e.g., `Chg:123`). |
  | `reject` | `target_id` | `comment` | Rejects an existing tracked change. |
  | `reply` | `target_id`, `text` | — | Replies to an existing comment (e.g., `Com:456`). |
  | `insert_row` | `target_text`, `position`, `cells` | — | Inserts a new table row `above` or `below` the target cell text. |
  | `delete_row` | `target_text` | — | Deletes the table row containing the target text. |

  **Example LLM Output:**
  ```json
  [
    {
      "type": "reject",
      "target_id": "Chg:12",
      "comment": "We cannot accept 60-day terms."
    },
    {
      "type": "modify",
      "target_text": "within thirty (30) days",
      "new_text": "within forty-five (45) days",
      "comment": "Compromise per our playbook."
    },
    {
      "type": "modify",
      "target_text": "the Contractor",
      "new_text": "the Service Provider",
      "match_mode": "all",
      "comment": "Term harmonization."
    }
  ]
  ```

  ---

  ## 🔄 Handling Cumulative & Multi-Turn Edits (The Binary ID Pattern)

  When an AI Agent applies edits, receives feedback, and needs to make *another* round of changes, loading from the original node name (e.g., `'Read Binary File'`) would discard the modifications just made. To allow the model to chain consecutive edits seamlessly, the node utilizes an **explicit state pointer pipeline**:

  1. **First Tool Call**: The LLM loads from the baseline. It sets `Source_Node_Name` to the canvas node (e.g., `'Read Binary File'`) and leaves `Source_Binary_Id` blank.
  2. **Intermediate Output**: The `apply_edits` tool applies changes and returns a unique `redlinedBinaryId` (representing the immutable state of that edit) back in the JSON payload to the LLM.
  3. **Subsequent Tool Calls**: If the LLM needs to make further changes on top of its prior work, it must set `Source_Binary_Id` to the ID string returned by the previous call. The node's backend dynamically detects this ID, bypasses the upstream node name, and pulls the intermediate document directly from storage to apply the new changes cumulatively.
  4. **Handoff**: On every successful execution, the node overwrites a global static pointer (`adeu_last_redlined`) with the newest ID. When the AI Agent finishes its entire chat turn, the downstream `Hydrate Tool Output` node reads this pointer to output the final, fully-cumulative document.

  ---

  ## 🏗️ Typical Pipeline

  ```
  [ Gmail Trigger (Incoming Doc) ]
          │
          ▼
  [ Adeu: Extract Outline ]      ← Cheap structural map for large documents
          │
          ▼
  [ Adeu: Extract Markdown ]     ← Optionally page-scoped via Page parameter
          │
          ▼
  [ AI Node (LLM) ]              ← Outputs a JSON array of DocumentChange objects
          │
          ▼
  [ Adeu: Apply Edits ]          ← Pre-validates and writes redlines atomically
          │
          ▼
  [ Gmail: Reply with Doc ]
  ```

  ---

  ## 💡 Prompting Best Practices for LLMs

  To achieve the highest batch success rate when prompting models like Gemini, GPT-4o, or Claude to generate edits:

  1. **Enforce Exact Matching**: Instruct the LLM: *"The `target_text` must be copied EXACTLY from the source document — including identical punctuation, spacing, and capitalization."*
  2. **Short but Unique**: Instruct the LLM: *"Keep `target_text` short, but ensure it is unique enough to not match multiple locations in the document. If you need to replace the same phrase in many places, use `match_mode: 'all'` instead of writing multiple separate edits."*
  3. **No Fake Markup**: Instruct the LLM: *"Do NOT include CriticMarkup tags like `{++` or `{--` in your `new_text`. The engine will apply the redline tracking automatically."*
  4. **Mind the Overlap Constraint**: Adeu's engine strictly prevents `modify` (text-replace) edits from overlapping with or targeting text that is *already* inside a pending tracked change. Instruct the LLM: *"You cannot `modify` text that is wrapped in counterparty tracking markup. You must `accept` or `reject` their change using its ID."*
  5. **Use Outline for Navigation**: For documents longer than ~20 pages, instruct the LLM to call `Extract Outline` first to get a structural map, then call `Extract Markdown` with a specific `Page` number to drill in. This avoids blowing the context window on the full document body.

  ---

  ## 🤖 AI Agent Tool Setup: `$fromAI` Recipes

  When wiring this node into an AI Agent as a tool, n8n auto-generates `$fromAI()` expressions for AI-bindable fields. The **second argument** of `$fromAI` is the only per-parameter schema description the LLM actually receives — but n8n does **not** propagate node-source `description` metadata into that slot. Auto-generated stubs look like:

  ```
  {{ $fromAI('Changes__JSON_', ``, 'string') }}
  ```

  The empty backticks mean the LLM sees no schema for that field and will hallucinate the structure.

  **To apply any recipe below:** Open the tool node → click the target field → **disable** "Let the model define this parameter" (it locks the field to n8n's auto-generated empty-description stub) → switch to **Expression** mode → paste the recipe. The `$fromAI()` call inside your expression still binds the field to the LLM — you're just bypassing the auto-stub so you can supply a richer schema description.

  > **Stub caching gotcha:** Once a `$fromAI` expression is saved into a workflow, n8n caches it permanently in that workflow's JSON. Updating this package does not retroactively update expressions in existing workflows — you must hand-edit them or delete and re-add the tool node.

  ### What you do NOT bind to the LLM

  Some fields are **plumbing** — they configure which input/output port the node uses, not semantic content. Plumbing fields belong in the node editor; binding them to `$fromAI` lets the LLM produce confusing errors unrelated to the user's actual request.

  **Set these manually in the node editor — do NOT use `$fromAI`:**

  - **`Document Source`** (`fromInput` vs `fromNode`) — workflow topology decision.
  - **`Input Binary Property`** — wiring decision; downstream of the source node, not per-call.
  - **`Output Binary Property`** (Apply Edits, Finalize Document) — names where the outgoing binary lands on the workflow item. Downstream nodes need this fixed; an LLM picking `output_data` one call and `result` the next would break the pipeline. Default `'data'` is almost always correct.
  - **`Edits Source`** (Apply Edits) — controls whether the node reads the changes array from the `Changes (JSON)` field on the node itself (`defineBelow`) or from a property on the upstream item (`fromInputJson`). For AI Agent workflows, **set this to `Define Below` in the editor**. This is what activates the `Changes (JSON)` field as the LLM's entry point — the recipe in the Apply Edits section below populates that field via `$fromAI`, and the LLM hands its generated `Changes_JSON` string directly to the tool as a call argument. The `fromInputJson` branch is only for deterministic pipelines where an upstream non-AI node has pre-populated a `changes` property on the item.

  AI Agents cannot pass binary `.docx` data through JSON arguments anyway — that's why `fromNode` exists: it resolves the binary from a named upstream node (e.g. `Read Binary File`, `Gmail Trigger`) at execution time. The trigger source is `$fromAI`-bindable below because a system prompt can legitimately offer the LLM a choice between multiple binary-producing nodes.

  ---

  ### Extract Markdown

  **Source Node Name** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Node_Name', `Exact name of the workflow node that produced the .docx binary (string, case-sensitive, e.g. 'Read Binary File' or 'Gmail Trigger'). Must match the node label in the canvas exactly. If your system prompt specifies which node holds the document, always use that name.`, 'string', 'Read Binary File') }}
  ```

  **Source Binary ID** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Binary_Id', `Optional string. If you are inspecting a document that you have already modified during this conversation, pass the 'redlinedBinaryId' from the previous tool output here to view the updated draft. Leave empty on the first call to load from the baseline node name.`, 'string', '') }}
  ```

  **Clean View:**
  ```
  ={{ $fromAI('Clean_View', `Boolean. Set false (default) to surface all pending tracked changes as CriticMarkup tags {++ins++}, {--del--}, {>>comment<<} — use when reviewing counterparty edits or any document with pending markup. Set true to project the document as if all tracked changes were accepted (simulates Accept All) — use only when generating net-new redlines against a clean baseline.`, 'boolean', false) }}
  ```

  **Page** 🆕:
  ```
  ={{ $fromAI('Page', `Optional 1-based integer page number to retrieve only one page of the projected document. Set to 0 (default) for the full document body — use 0 for short documents (under ~10 pages). For long documents, call extract_outline first to discover total_pages and which headings live on which page, then call this tool again with Page set to the page you need. Pages are ~19,000-character chunks; the Structural Appendix is appended to every page. If you request a page beyond total_pages the tool will error.`, 'number', 0) }}
  ```

  ---

  ### Extract Outline 🆕

  **Source Node Name** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Node_Name', `Exact name of the workflow node that produced the .docx binary (string, case-sensitive, e.g. 'Read Binary File' or 'Gmail Trigger'). Must match the node label in the canvas exactly.`, 'string', 'Read Binary File') }}
  ```

  **Source Binary ID** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Binary_Id', `Optional string. If you are inspecting a document that you have already modified during this conversation, pass the 'redlinedBinaryId' from the previous tool output here to view the updated draft outline. Leave empty on the first call to load from the baseline node name.`, 'string', '') }}
  ```

  ---

  ### Apply Edits

  **Reasoning** (fill this FIRST):
  ```
  ={{ $fromAI('Reasoning', `State your reasoning for this batch of edits BEFORE you produce the Changes_JSON array: briefly explain what you intend to change and why (e.g. which clauses, which counterparty positions you are countering, which playbook rule applies). Always write this field first — reasoning through the change before emitting the JSON produces more accurate, better-anchored edits. This text is captured for audit only and does not alter engine behavior. One to three sentences is enough.`, 'string', '') }}
  ```

  **Source Node Name** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Node_Name', `Exact name of the workflow node that produced the .docx binary (string, case-sensitive). Must match the node label in the canvas exactly. If your system prompt specifies which node holds the document, always use that name.`, 'string', 'Read Binary File') }}
  ```

  **Source Binary ID** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Binary_Id', `Optional string. If you are doing consecutive edits on the same document during this conversation, pass the 'redlinedBinaryId' from the previous tool output here to continue editing the updated draft. Leave blank on your first tool call.`, 'string', '') }}
  ```

  **Author:**
  ```
  ={{ $fromAI('Author', `Author name attached to every tracked change and comment produced by this batch (string, e.g. 'AI Reviewer' or 'Acme Legal AI'). Appears in Word's review pane as the author of every redline. Choose a name your end users will recognize as the AI reviewer.`, 'string', 'Adeu AI') }}
  ```

  **Changes (JSON):**
  ```
  ={{ $fromAI('Changes_JSON', `JSON-encoded string containing an array of DocumentChange objects. Each object is one of: {"type":"modify","target_text":"<verbatim from source>","new_text":"<replacement>","comment":"<optional>","match_mode":"<optional 'strict' (default) | 'first' | 'all'>","regex":<optional boolean default false>} | {"type":"accept","target_id":"Chg:12","comment":"<optional>"} | {"type":"reject","target_id":"Chg:12","comment":"<optional>"} | {"type":"reply","target_id":"Com:45","text":"<reply>"} | {"type":"insert_row","target_text":"<cell text anchoring row>","position":"above" or "below","cells":["col1","col2"]} | {"type":"delete_row","target_text":"<cell text anchoring row>"}. MODIFY EXTENDED: set match_mode='all' to replace every occurrence of target_text in linear document order (returns occurrences_modified in the per-edit report); set match_mode='first' to silently anchor to the first hit; omit or use 'strict' (default) to fail on ambiguous matches so you can self-correct with more context. Set regex=true to interpret target_text as an ES2022 RegExp pattern; new_text may reference capture groups via $1, $2 etc. Combine match_mode='all' with regex=true for global pattern-based replacements. RULES: target_text must be copied VERBATIM from the source including punctuation/whitespace/case (unless regex=true) and must uniquely anchor one location under match_mode='strict'; never include CriticMarkup tags like {++ or {-- in new_text — the engine applies tracking automatically; use Chg:N and Com:N IDs exactly as surfaced by extract_markdown; the entire array must be a single JSON-encoded string. Atomic batch: if any single edit is invalid the whole array is rejected with an error telling you which edit failed — use that to self-correct on the next call.`, 'string') }}
  ```

  **Return Markdown Output:**
  ```
  ={{ $fromAI('Return_Markdown', `Boolean. When true (default), the tool returns the post-edit document as Markdown with CriticMarkup so you can verify what changed and reason about follow-up edits. Set false only to skip extraction when you are confident no follow-up review is needed.`, 'boolean', true) }}
  ```

  **Dry Run:**
  ```
  ={{ $fromAI('Dry_Run', `Boolean. Default false (commit edits to the document). Set true ONLY as a self-correction primitive when you are uncertain that a target_text anchor is unique or matches the source verbatim, OR when you want to preview a complex multi-edit batch before committing. A dry run validates and simulates every edit and returns a per-edit report containing 'status' (applied/failed), 'critic_markup' (a ~30-char CriticMarkup preview showing exactly where the change would land), 'clean_text' (the post-accept preview), 'warning' (punctuation/tokenization hints), and 'error' (if the edit failed) — but the document is NOT modified, no redlined binary is produced, and no static-data stash is written. Invalid edits in a dry run come back as failed entries in the array rather than throwing a BatchValidationError, so dry-run is also how you probe whether an edit will succeed without aborting the batch. After inspecting the preview, re-call with Dry_Run=false to commit. Do NOT default to true — every dry run is an extra round trip that costs the user time and tokens.`, 'boolean', false) }}
  ```

  ---

  ### Generate Diff

  **Original Source Node Name** (when `Original Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Original_Source_Node_Name', `Exact name of the workflow node that produced the baseline (before) .docx binary (string, case-sensitive). Must match the node label exactly.`, 'string') }}
  ```

  **Modified Source Node Name** (when `Modified Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Modified_Source_Node_Name', `Exact name of the workflow node that produced the modified (after) .docx binary (string, case-sensitive). Must match the node label exactly. Must reference a different node from the original source — otherwise the diff will be empty.`, 'string') }}
  ```

  **Clean View:**
  ```
  ={{ $fromAI('Clean_View', `Boolean. Set true (recommended default) to compare the Accept All clean view of both documents — diffs reflect final content as if all tracked changes were accepted. Set false to diff the raw CriticMarkup-projected text including pending change markers — useful for auditing tracked-change differences themselves.`, 'boolean', true) }}
  ```

  ---

  ### Finalize Document

  **Reasoning** (fill this FIRST):
  ```
  ={{ $fromAI('Reasoning', `State your reasoning for finalizing the document now BEFORE choosing the sanitize mode and options: what state the document is in, why it is ready for distribution, and who it is going to (signer, counterparty, internal). Always write this field first. This text is captured for audit only and does not alter engine behavior. One to three sentences is enough.`, 'string', '') }}
  ```

  **Source Node Name** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Node_Name', `Exact name of the workflow node that produced the .docx binary (string, case-sensitive). Must match the node label exactly.`, 'string', 'Read Binary File') }}
  ```

  **Source Binary ID** (when `Document Source` is `From Another Node`):
  ```
  ={{ $fromAI('Source_Binary_Id', `Optional string. If you are finalizing a document that has been consecutively edited during this loop, pass the 'redlinedBinaryId' from your last tool execution here. Leave blank to sanitize the original baseline file.`, 'string', '') }}
  ```

  **Sanitize Mode:**
  ```
  ={{ $fromAI('Sanitize_Mode', `One of 'baseline', 'full', or 'keep-markup'. 'full' (recommended for distribution) strips author metadata, RSIDs, paragraph IDs, and proof errors AND requires all tracked changes to be resolved — pair with Accept_All=true to auto-accept. 'keep-markup' strips metadata but preserves visible tracked changes and comments — use when sending markup for counterparty review; pair with Author_Override to rewrite author names. 'baseline' is minimal cleanup only (RSIDs and proof errors) — leaves tracked changes and metadata intact.`, 'string', 'full') }}
  ```

  **Accept All Tracked Changes** (only meaningful when `Sanitize Mode` is `full`):
  ```
  ={{ $fromAI('Accept_All', `Boolean. Only applies when Sanitize_Mode is 'full'. Set true to auto-accept all pending tracked changes before sanitization. Set false (default) to block finalization and raise an error if any pending tracked changes exist, forcing them to be resolved explicitly. If multiple distinct authors are detected in pending changes when true, the report will include a warning about potential silent smuggles.`, 'boolean', false) }}
  ```

  **Author Override** (only meaningful when `Sanitize Mode` is `keep-markup`):
  ```
  ={{ $fromAI('Author_Override', `Optional string. Only applies when Sanitize_Mode is 'keep-markup'. When set, replaces the author name on every preserved tracked change and comment with this value (e.g. 'Acme Legal'). Leave empty to keep original authors intact.`, 'string', '') }}
  ```

  **Protection Mode:**
  ```
  ={{ $fromAI('Protection_Mode', `One of 'none' or 'read_only'. 'none' (default) leaves the document unlocked. 'read_only' injects a native Word read-only enforcement flag into settings.xml — Word users see a read-only banner and cannot edit without explicitly unlocking. Use 'read_only' for distribution to signers or counterparties when you want to discourage casual edits.`, 'string', 'none') }}
  ```

  ---

  > **Tip:** The default-value (4th) argument of `$fromAI()` lets the LLM omit the parameter entirely and fall back to a sensible default. Use defaults aggressively on optional fields so the LLM only has to specify what actually varies per call.

  ---

  ## 🛠️ Error Handling & Troubleshooting

  Because Adeu enforces **Atomic Batch Validation**, any error in the LLM's JSON will throw a `NodeApiError` and halt the node. The error message will tell you exactly which edit failed and why.

  * **"Target text not found"**: The LLM hallucinated a word, altered the spacing, or the text doesn't exist in the baseline document.
  * **"Ambiguous match"**: The LLM used a `target_text` (like "the Company") that appears multiple times. The error details will show you the exact occurrences. Advise the LLM to either include more surrounding context (e.g., "the Company shall indemnify") or use `match_mode: "all"` if the intent is to replace every occurrence.
  * **"Modification targets an active insertion..."**: The LLM tried to `modify` text that another author is currently tracking. Adeu explicitly blocks this to maintain virtual DOM integrity and clean redline threading. You must `accept` or `reject` that prior change first. (Editing plain text that merely sits under another author's *comment* is allowed — the comment anchor survives the tracked change.)
  * **"...would sweep through a comment range from another author..."**: A `match_mode: "all"` bulk replacement crossed a colleague's comment range. Blind fan-outs are blocked to protect foreign annotations; target the commented text deliberately with `match_mode: "strict"` or `"first"`, or scope the edit outside the comment.
  * **"Read-only elements"**: The LLM tried to modify structural items like cross-references or footnotes.
  * **"Page N exceeds total_pages"**: The LLM requested a page beyond what the document has. Have it call `Extract Outline` first to discover the page count.

  **Tip**: If you are running bulk processing workflows, you can enable n8n's **"Continue On Fail"** setting on the `Apply Edits` node. If the LLM generates a flawed batch, n8n will catch the error, output an `{ "error": "..." }` JSON object for that specific document, and continue processing the rest of the files in your queue.

ai_documentation_summary:
  {"purpose":"A community node for working with Microsoft Word .docx documents in an AI-assisted workflow. It converts documents to LLM-friendly Markdown, applies tracked changes/comments back into Word, generates diffs, and finalizes/sanitizes documents.","capabilities":["Extract .docx to Markdown with CriticMarkup and a semantic appendix","Toggle Clean View to simulate Accept All during extraction","Apply a JSON array of DocumentChange operations as native Word tracked changes and comments","Support Dry Run validation with per-edit previews, warnings, and errors for self-correction","Generate sub-word @@ Word Patch @@ diffs between two .docx files","Finalize documents by stripping metadata, optionally accepting all markup, and optionally locking read-only","Support modify, accept, reject, reply, insert_row, and delete_row change types"],"authentication":"None mentioned; no API authentication is described in the README because the node operates on local .docx binaries within n8n","commonUseCases":["Convert a Word contract or legal document into Markdown for LLM analysis","Apply AI-generated edits back into a .docx as tracked changes and comments","Dry-run edits to validate anchors before committing changes","Compare two Word documents using a Word Patch diff","Sanitize a document before sharing externally"],"limitations":["Can only process .docx files and cannot receive binary files through JSON arguments","Change batches are atomically validated; one invalid edit rejects the whole batch in wet runs","target_text for modify must match the source exactly, including punctuation, spacing, and case","Cannot target text already wrapped in another author's pending tracked change until that change is accepted or rejected first","Existing workflows must manually add the Dry_Run binding after upgrades because n8n caches $fromAI expressions"],"relatedNodes":["Microsoft Word","Binary data handling nodes","HTTP Request","Gmail Trigger"]}


node_type: n8n-nodes-fluidx.fluidX
package_name: n8n-nodes-fluidx
display_name: fluidX
description: Interact with the fluidX revXR THE EYE API (sessions, inbound calls, SMS, email, media).
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: superoel
author_github_url: https://github.com/titelplusplus/
npm_package_name: n8n-nodes-fluidx
npm_version: 0.4.1
community_fetched_at: 2026-07-14T14:40:34.356Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "session",
      "options": [
        {
          "name": "Session",
          "value": "session",
          "description": "Create, read, close THE EYE sessions"
        },
        {
          "name": "Inbound Call",
          "value": "inboundCall",
          "description": "Submit and track inbound call requests"
        },
        {
          "name": "SMS",
          "value": "sms",
          "description": "Send transactional SMS"
        },
        {
          "name": "Email",
          "value": "email",
          "description": "Send transactional email tied to a session"
        },
        {
          "name": "Media",
          "value": "media",
          "description": "Read/upsert media info and session summaries"
        },
        {
          "name": "Eye",
          "value": "eye",
          "description": "Remote control commands for an active Eye session"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a session",
          "description": "POST /api/fx/ext/session/create"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a session",
          "description": "GET /api/fx/ext/session"
        },
        {
          "name": "Get All",
          "value": "getAll",
          "action": "List sessions",
          "description": "GET /api/fx/ext/session/all"
        },
        {
          "name": "Close",
          "value": "close",
          "action": "Close a session",
          "description": "POST /api/fx/ext/session/close"
        },
        {
          "name": "Close All",
          "value": "closeAll",
          "action": "Close all sessions",
          "description": "POST /api/fx/ext/session/close/all"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "session"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an inbound call",
          "description": "POST /api/fx/ext/inbound/calls"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an inbound call",
          "description": "GET /api/fx/ext/inbound/calls/{id}"
        },
        {
          "name": "Cancel",
          "value": "cancel",
          "action": "Cancel an inbound call",
          "description": "POST /api/fx/ext/inbound/calls/{id}/cancel"
        },
        {
          "name": "End",
          "value": "end",
          "action": "End an inbound call",
          "description": "POST /api/fx/ext/inbound/calls/{id}/end"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "inboundCall"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send an SMS",
          "description": "POST /api/fx/ext/sms/send"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sms"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send an email",
          "description": "POST /api/fx/ext/email/send"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "email"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getInfo",
      "options": [
        {
          "name": "Get Info",
          "value": "getInfo",
          "action": "Get media info",
          "description": "GET /api/fx/ext/media/info"
        },
        {
          "name": "Upsert Info",
          "value": "upsertInfo",
          "action": "Upsert media info",
          "description": "POST /api/fx/ext/media/info"
        },
        {
          "name": "Get Summary",
          "value": "getSummary",
          "action": "Get session summary",
          "description": "GET /api/fx/ext/media/summary"
        },
        {
          "name": "Download",
          "value": "download",
          "action": "Download media",
          "description": "GET /api/fx/ext/media/download"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "media"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "takePhoto",
      "options": [
        {
          "name": "Take Photo",
          "value": "takePhoto",
          "action": "Take a photo",
          "description": "POST /api/fx/ext/eye/takephoto"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "eye"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a session",
      "description": "POST /api/fx/ext/session/create",
      "resource": "session"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a session",
      "description": "GET /api/fx/ext/session",
      "resource": "session"
    },
    {
      "name": "Get All",
      "value": "getAll",
      "action": "List sessions",
      "description": "GET /api/fx/ext/session/all",
      "resource": "session"
    },
    {
      "name": "Close",
      "value": "close",
      "action": "Close a session",
      "description": "POST /api/fx/ext/session/close",
      "resource": "session"
    },
    {
      "name": "Close All",
      "value": "closeAll",
      "action": "Close all sessions",
      "description": "POST /api/fx/ext/session/close/all",
      "resource": "session"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an inbound call",
      "description": "POST /api/fx/ext/inbound/calls",
      "resource": "inboundCall"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an inbound call",
      "description": "GET /api/fx/ext/inbound/calls/{id}",
      "resource": "inboundCall"
    },
    {
      "name": "Cancel",
      "value": "cancel",
      "action": "Cancel an inbound call",
      "description": "POST /api/fx/ext/inbound/calls/{id}/cancel",
      "resource": "inboundCall"
    },
    {
      "name": "End",
      "value": "end",
      "action": "End an inbound call",
      "description": "POST /api/fx/ext/inbound/calls/{id}/end",
      "resource": "inboundCall"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send an SMS",
      "description": "POST /api/fx/ext/sms/send",
      "resource": "sms"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send an email",
      "description": "POST /api/fx/ext/email/send",
      "resource": "email"
    },
    {
      "name": "Get Info",
      "value": "getInfo",
      "action": "Get media info",
      "description": "GET /api/fx/ext/media/info",
      "resource": "media"
    },
    {
      "name": "Upsert Info",
      "value": "upsertInfo",
      "action": "Upsert media info",
      "description": "POST /api/fx/ext/media/info",
      "resource": "media"
    },
    {
      "name": "Get Summary",
      "value": "getSummary",
      "action": "Get session summary",
      "description": "GET /api/fx/ext/media/summary",
      "resource": "media"
    },
    {
      "name": "Download",
      "value": "download",
      "action": "Download media",
      "description": "GET /api/fx/ext/media/download",
      "resource": "media"
    },
    {
      "name": "Take Photo",
      "value": "takePhoto",
      "action": "Take a photo",
      "description": "POST /api/fx/ext/eye/takephoto",
      "resource": "eye"
    }
  ]

npm_readme:
  # n8n-nodes-fluidx

  Community n8n node for the **fluidX revXR THE EYE** API. Adds a single `fluidX` node that exposes:

  | Resource     | Operations                                  |
  | ------------ | ------------------------------------------- |
  | Session      | Create, Get, Get All, Close, Close All      |
  | Inbound Call | Create, Get, Cancel, End                    |
  | SMS          | Send                                        |
  | Email        | Send                                        |
  | Media        | Get Info, Upsert Info, Get Summary, Download |
  | Eye          | Take Photo                                  |

  Once installed it appears in n8n's node search as **fluidX**.

  ## Install

  ### A) Via the community node UI (recommended)

  In n8n: **Settings → Community Nodes → Install** and enter:

  ```
  n8n-nodes-fluidx
  ```

  ### B) Local development against your n8n instance

  ```bash
  git clone <this-repo> n8n-nodes-fluidx
  cd n8n-nodes-fluidx
  npm install
  npm run build
  # link it into your n8n custom-nodes folder
  npm link
  cd ~/.n8n/custom
  npm link n8n-nodes-fluidx
  # restart n8n
  ```

  ## Credentials

  After install, create a new credential of type **fluidX API** with:

  - **Base URL** — your fluidX root, e.g. `https://live.fluidx.digital`
  - **API Key** — your tenant API key (sent as `x-api-key`)

  The credential test hits `GET /api/healthz` against the configured Base URL.

  ## Build

  ```bash
  npm install
  npm run build      # compiles TS + copies SVG icons
  npm run dev        # watch mode
  npm run lint
  ```

  Output goes to `dist/`. The `n8n` block in `package.json` points at
  `dist/credentials/FluidXApi.credentials.js` and `dist/nodes/FluidX/FluidX.node.js`.

  ## Endpoints covered

  | n8n Operation             | HTTP                                                            |
  | ------------------------- | --------------------------------------------------------------- |
  | Session → Create          | `POST /api/fx/ext/session/create`                               |
  | Session → Get             | `GET /api/fx/ext/session?sessionId=`                            |
  | Session → Get All         | `GET /api/fx/ext/session/all?status=&includeAll=`               |
  | Session → Close           | `POST /api/fx/ext/session/close`                                |
  | Session → Close All       | `POST /api/fx/ext/session/close/all`                            |
  | Inbound Call → Create     | `POST /api/fx/ext/inbound/calls`                                |
  | Inbound Call → Get        | `GET /api/fx/ext/inbound/calls/{id}` (header `x-call-token`)    |
  | Inbound Call → Cancel     | `POST /api/fx/ext/inbound/calls/{id}/cancel`                    |
  | Inbound Call → End        | `POST /api/fx/ext/inbound/calls/{id}/end`                       |
  | SMS → Send                | `POST /api/fx/ext/sms/send`                                     |
  | Email → Send              | `POST /api/fx/ext/email/send`                                   |
  | Media → Get Info          | `GET /api/fx/ext/media/info?type=&id=`                          |
  | Media → Upsert Info       | `POST /api/fx/ext/media/info`                                   |
  | Media → Get Summary       | `GET /api/fx/ext/media/summary?sessionId=`                      |
  | Media → Download          | `GET /api/fx/ext/media/download?sessionId=&mediaId=&type=&format=` |
  | Eye → Take Photo          | `POST /api/fx/ext/eye/takephoto`                                |

  ## Downloading media (binary)

  `Media → Download` streams the original binary of a captured photo or video and writes it
  to a **binary property** on the output item (default field name `data`), so you can pipe it
  straight into _Write Binary File_, _Move Binary Data_, email attachments, S3, etc.

  Parameters:

  - **Source** — how to address the media:
    - `By ID` — build the request from **Session ID**, **Media ID** and **Type** (+ optional **Format**).
    - `By URL` — paste a ready download **URL** (e.g. a `photoRefs[].url` / `videoRefs[].url`
      link from a session response). The API key is still sent automatically, so you don't need a
      separate HTTP Request node with header auth.
  - **Session ID** / **Media ID** — identify the captured media (`By ID` mode).
  - **Type** — `Photo` or `Video` (`By ID` mode).
  - **Format** — video only; `WebM` (default) or `MP4` transcode. Ignored for photos.
  - **URL** — the download link (`By URL` mode).
  - **Put Output In Field** — name of the binary property to write to (default `data`).
  - **File Name** — optional; otherwise derived from the media ID, type, and the response
    `Content-Type` (e.g. `photo-77.png`, `video-12.webm`).

  > The endpoint requires a **TENANT_ADMIN** API key.

  The JSON side of the output item carries `{ sessionId, mediaId, type, fileName }`; the actual
  bytes live in the binary property.

  ### Discovering media IDs

  A `Session → Get` (or `Create`) response includes `photoRefs` and `videoRefs` arrays, each entry
  having an `id` and a ready `url` that already points at `/api/fx/ext/media/download`. You can
  either:

  1. **By ID** — feed each `id` into a `Media → Download` node (it builds the request for you), or
  2. **By URL** — pass the `url` straight into a `Media → Download` node in `By URL` mode
     (e.g. `{{ $json.url }}`). This is the one-node equivalent of a generic **HTTP Request** node
     with header auth.

  ## Releasing

  Releases are managed locally with [`release-it`](https://github.com/release-it/release-it) and published from CI with npm provenance.

  ```bash
  # interactive (asks which version bump to use)
  npm run release

  # non-interactive bumps
  npm run release:patch
  npm run release:minor
  npm run release:major

  # preview without changing anything
  npm run release:dry
  ```

  `release-it` will: run lint + build, bump the version in `package.json`, update `CHANGELOG.md` from conventional commits, commit, tag (`vX.Y.Z`), push, and create the GitHub release. The pushed tag triggers `.github/workflows/publish.yml`, which runs `npm publish` with provenance — required for n8n's verified-node program.

  Prerequisites:

  - Run on the `main` branch with a clean working tree.
  - Authenticate with GitHub so a release can be created: either export `GITHUB_TOKEN`, or use `GITHUB_TOKEN="$(gh auth token)" npm run release`.
  - The `NPM_TOKEN` secret must be set in the GitHub repo so the publish workflow can authenticate.

  Use [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `ci:`, `docs:`, etc.) so the changelog and version bump are derived correctly.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Provides n8n access to the fluidX revXR THE EYE API for managing sessions, inbound calls, messaging, media, and photo capture. It is designed to let workflows create, retrieve, close, and download fluidX resources directly inside n8n.","capabilities":["Session management: create, get, get all, close, and close all sessions","Inbound call management: create, get, cancel, and end inbound calls","Send SMS messages","Send email messages","Media management: get info, upsert info, get summary, and download media files","Take a photo via the Eye resource","Download media as binary output for use with other n8n nodes","Supports downloading media by ID or by direct URL"],"authentication":"API key required via a fluidX API credential, including Base URL and tenant API key sent as x-api-key. Media download requires a TENANT_ADMIN API key.","commonUseCases":["Creating and managing fluidX sessions in automated workflows","Fetching session media and downloading photos or videos for storage or downstream processing","Sending SMS or email notifications from workflow actions","Managing inbound call lifecycle events such as create, cancel, and end","Capturing a photo using the Eye endpoint"],"limitations":["Media download requires a TENANT_ADMIN API key","Inbound Call → Get requires the x-call-token header in addition to the call ID","Only the operations listed in the README are available; no broader API coverage is mentioned"],"relatedNodes":[]}


node_type: n8n-nodes-donethat.doneThat
package_name: n8n-nodes-donethat
display_name: DoneThat
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: chrhartm
author_github_url: https://github.com/donethatai/donethat-n8n.git
npm_package_name: n8n-nodes-donethat
npm_version: 0.3.4
community_fetched_at: 2026-07-14T14:40:34.357Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  DoneThat automatically tracks all work to boost productivity. This node exposes time-tracking reports, AI summary messages, projects, and search across your activity.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "report",
      "options": [
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Report",
          "value": "report"
        },
        {
          "name": "Search",
          "value": "search"
        },
        {
          "name": "Summary Message",
          "value": "message"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generate",
      "options": [
        {
          "name": "Generate",
          "value": "generate",
          "action": "Generate a report"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "report"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a rendered summary message"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Archive",
          "value": "archive",
          "action": "Archive or unarchive a project"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a project"
        },
        {
          "name": "Create or Update",
          "value": "upsert",
          "action": "Create or update a project"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many projects"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search done that content"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "search"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate",
      "value": "generate",
      "action": "Generate a report",
      "resource": "report"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a rendered summary message",
      "resource": "message"
    },
    {
      "name": "Archive",
      "value": "archive",
      "action": "Archive or unarchive a project",
      "resource": "project"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a project",
      "resource": "project"
    },
    {
      "name": "Create or Update",
      "value": "upsert",
      "action": "Create or update a project",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "resource": "project"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many projects",
      "resource": "project"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a project",
      "resource": "project"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search done that content",
      "resource": "search"
    }
  ]

npm_readme:
  # n8n-nodes-donethat

  [![License: MIT](https://img.shields.io/github/license/donethatai/donethat-n8n)](LICENSE)
  [![CI](https://github.com/donethatai/donethat-n8n/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/donethatai/donethat-n8n/actions/workflows/ci.yml)
  [![Node](https://img.shields.io/badge/node-%3E%3D22.16-339933?logo=node.js&logoColor=white)](package.json)
  [![n8n community node](https://img.shields.io/badge/n8n-community%20node-FF6D5A?logo=n8n&logoColor=white)](https://docs.n8n.io/integrations/community-nodes/)

  [DoneThat](https://donethat.ai) automatically tracks all work and uses this context to boost your productivity: automated timesheets, long-term memory for AIs, proactive coaching, and social sharing for accountability and remote trust. DoneThat is built privacy-first, cross-platform, and takes five minutes to set up.

  This n8n community node exposes the DoneThat API: generate time-tracking reports, fetch AI summary messages, manage projects, and search across your activity and tasks.

  API base: `https://api.donethat.ai`. Reference: [donethat.ai/api-reference](https://donethat.ai/api-reference).

  ## Resources

  - **Report**: `Generate` (POST /report). Aggregation: `activity`, `day`, `task`, `week`. `minute` is a legacy alias for `activity`.
  - **Summary message**: `Get` (GET /message).
  - **Project**: `Get Many`, `Get`, `Create`, `Create or Update`, `Update`, `Archive`. No delete.
  - **Search**: `Search` (POST /search). Sources: `tasks`, `activity`.

  ## Credential

  Create an API key at https://app.donethat.ai → Settings → API Access. The credential test hits `GET /user`, so the key needs at least `user:read`. Operations need scopes matching the resource (`reports:read`, `projects:read`/`projects:write`, `search:read`, `messages:read`).

  The Base URL field defaults to `https://api.donethat.ai`. Override only for testing.

  ## Development

  ```bash
  npm install
  npm run build && npm test
  ```

  `npm run build` compiles to `dist/` and runs `scripts/verify-n8n-package.mjs`, which asserts the package contracts n8n loads (class names, credential test endpoint, icon presence). Tests depend on `dist/`, so the build must run first.

  ### Live n8n

  `npm run n8n:live` builds the node, installs n8n into `.n8n-live/` (first run only, 1-2 GB), packs and loads this node, imports the workflows from `scripts/sample-workflows.mjs`, and starts n8n on http://127.0.0.1:5678. After code changes, rerun the same command.

  `npm run test:live` is the headless variant used in CI: starts n8n in a temp dir and checks that the node and credentials appear in the n8n metadata.

  Both scripts auto-switch to Node 22 via nvm (n8n 2.21+ needs ≥22.16). `.n8n-live/` is gitignored; `rm -rf .n8n-live` to reset.

  Optional env: `N8N_LIVE_VERSION=2.21.4`, `N8N_PORT=5678`.

  ## License

  MIT.

ai_documentation_summary:
  {"purpose":"A DoneThat community node for n8n that connects to the DoneThat API to generate time-tracking reports, retrieve AI summary messages, manage projects, and search activity/tasks.","capabilities":["Generate time-tracking reports with aggregations for activity, day, task, week, and legacy minute alias","Get AI summary messages","Get many projects","Get a single project","Create projects","Create or update projects","Update projects","Archive projects","Search across tasks and activity"],"authentication":"API key required. Create the key in DoneThat settings (API Access); the credential test uses GET /user and requires at least user:read, with operation scopes such as reports:read, projects:read/projects:write, search:read, and messages:read.","commonUseCases":["Pulling productivity or timesheet-style reports into n8n workflows","Fetching AI-generated summary messages for analysis or notifications","Automating project synchronization and maintenance","Searching recent activity and tasks for downstream workflow actions"],"limitations":["No delete operation for projects is provided","The 'minute' report aggregation is only a legacy alias for 'activity'","Base URL override is intended only for testing"],"relatedNodes":[]}


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

updated_at: 2026-07-14 14:40:34
author_name: mivanda
author_github_url: https://github.com/daytona/n8n-nodes-daytona.git
npm_package_name: @daytona/n8n-nodes-daytona
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.358Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Manage Daytona sandboxes, snapshots, and volumes; run code and shell commands; drive a full Git pipeline; and manage the sandbox filesystem

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "sandbox",
      "options": [
        {
          "name": "Code",
          "value": "code"
        },
        {
          "name": "File",
          "value": "file"
        },
        {
          "name": "Git",
          "value": "git"
        },
        {
          "name": "Sandbox",
          "value": "sandbox"
        },
        {
          "name": "Snapshot",
          "value": "snapshot"
        },
        {
          "name": "Volume",
          "value": "volume"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "runCode",
      "options": [
        {
          "name": "Run Code",
          "value": "runCode",
          "action": "Run code in a sandbox",
          "description": "Execute Python, JavaScript, or TypeScript inside a sandbox. Optionally creates an ephemeral sandbox just for this execution."
        },
        {
          "name": "Run Command",
          "value": "runCommand",
          "action": "Run a command in a sandbox",
          "description": "Execute a shell command inside a sandbox. Optionally creates an ephemeral sandbox just for this execution."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "code"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Create Folder",
          "value": "createFolder",
          "action": "Create a folder in a sandbox",
          "description": "Create a directory at an absolute path with Unix-style permissions"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a file or directory",
          "description": "Remove a file or directory; pass Recursive to remove non-empty folders"
        },
        {
          "name": "Download",
          "value": "download",
          "action": "Download a file from a sandbox",
          "description": "Read a file from a sandbox path and emit it as binary output"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List files in a directory",
          "description": "Return file metadata (name, size, mode, modTime, owner) for entries in a directory"
        },
        {
          "name": "Move",
          "value": "move",
          "action": "Move or rename a file or directory",
          "description": "Atomic move/rename. Use a different name to rename in place."
        },
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload a file to a sandbox",
          "description": "Send the input item’s binary field to a sandbox path"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "clone",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "action": "Stage files for the next commit",
          "description": "Stage one or more files in the working tree"
        },
        {
          "name": "Checkout",
          "value": "checkout",
          "action": "Check out a branch or commit",
          "description": "Switch to a branch or check out a specific commit SHA"
        },
        {
          "name": "Clone",
          "value": "clone",
          "action": "Clone a git repository into a sandbox",
          "description": "Clone a git repository into a path inside the sandbox"
        },
        {
          "name": "Commit",
          "value": "commit",
          "action": "Create a commit from staged changes",
          "description": "Commit the currently-staged changes with an author/message"
        },
        {
          "name": "Pull",
          "value": "pull",
          "action": "Pull changes from the remote",
          "description": "Fetch and merge updates from the remote tracking branch"
        },
        {
          "name": "Push",
          "value": "push",
          "action": "Push changes to the remote",
          "description": "Push local commits to the remote"
        },
        {
          "name": "Status",
          "value": "status",
          "action": "Show working tree status",
          "description": "Return current branch, ahead/behind counts, and per-file status"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "git"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a sandbox",
          "description": "Create a new sandbox, optionally waiting until it is started"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a sandbox",
          "description": "Permanently delete a sandbox by ID"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a sandbox",
          "description": "Retrieve a single sandbox by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many sandboxes",
          "description": "List sandboxes in the current organization"
        },
        {
          "name": "Get Preview URL",
          "value": "getPreviewUrl",
          "action": "Get a preview URL",
          "description": "Generate a public preview URL for a port exposed inside a sandbox"
        },
        {
          "name": "Start",
          "value": "start",
          "action": "Start a sandbox",
          "description": "Start a stopped sandbox, optionally waiting until it is started"
        },
        {
          "name": "Stop",
          "value": "stop",
          "action": "Stop a sandbox",
          "description": "Stop a running sandbox"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sandbox"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Activate",
          "value": "activate",
          "action": "Activate a snapshot",
          "description": "Mark a snapshot as active so it becomes usable for sandbox creation"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a snapshot",
          "description": "Create a new snapshot from a Docker image"
        },
        {
          "name": "Deactivate",
          "value": "deactivate",
          "action": "Deactivate a snapshot",
          "description": "Mark a snapshot as inactive"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a snapshot",
          "description": "Permanently delete a snapshot"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a snapshot",
          "description": "Retrieve a single snapshot by ID or name"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many snapshots",
          "description": "List snapshots in the current organization with optional filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "snapshot"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a volume",
          "description": "Create a new persistent volume"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a volume",
          "description": "Delete a volume by ID"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a volume",
          "description": "Retrieve a single volume by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many volumes",
          "description": "List volumes in the current organization"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "volume"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Run Code",
      "value": "runCode",
      "action": "Run code in a sandbox",
      "description": "Execute Python, JavaScript, or TypeScript inside a sandbox. Optionally creates an ephemeral sandbox just for this execution.",
      "resource": "code"
    },
    {
      "name": "Run Command",
      "value": "runCommand",
      "action": "Run a command in a sandbox",
      "description": "Execute a shell command inside a sandbox. Optionally creates an ephemeral sandbox just for this execution.",
      "resource": "code"
    },
    {
      "name": "Create Folder",
      "value": "createFolder",
      "action": "Create a folder in a sandbox",
      "description": "Create a directory at an absolute path with Unix-style permissions",
      "resource": "file"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a file or directory",
      "description": "Remove a file or directory; pass Recursive to remove non-empty folders",
      "resource": "file"
    },
    {
      "name": "Download",
      "value": "download",
      "action": "Download a file from a sandbox",
      "description": "Read a file from a sandbox path and emit it as binary output",
      "resource": "file"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List files in a directory",
      "description": "Return file metadata (name, size, mode, modTime, owner) for entries in a directory",
      "resource": "file"
    },
    {
      "name": "Move",
      "value": "move",
      "action": "Move or rename a file or directory",
      "description": "Atomic move/rename. Use a different name to rename in place.",
      "resource": "file"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload a file to a sandbox",
      "description": "Send the input item’s binary field to a sandbox path",
      "resource": "file"
    },
    {
      "name": "Add",
      "value": "add",
      "action": "Stage files for the next commit",
      "description": "Stage one or more files in the working tree",
      "resource": "git"
    },
    {
      "name": "Checkout",
      "value": "checkout",
      "action": "Check out a branch or commit",
      "description": "Switch to a branch or check out a specific commit SHA",
      "resource": "git"
    },
    {
      "name": "Clone",
      "value": "clone",
      "action": "Clone a git repository into a sandbox",
      "description": "Clone a git repository into a path inside the sandbox",
      "resource": "git"
    },
    {
      "name": "Commit",
      "value": "commit",
      "action": "Create a commit from staged changes",
      "description": "Commit the currently-staged changes with an author/message",
      "resource": "git"
    },
    {
      "name": "Pull",
      "value": "pull",
      "action": "Pull changes from the remote",
      "description": "Fetch and merge updates from the remote tracking branch",
      "resource": "git"
    },
    {
      "name": "Push",
      "value": "push",
      "action": "Push changes to the remote",
      "description": "Push local commits to the remote",
      "resource": "git"
    },
    {
      "name": "Status",
      "value": "status",
      "action": "Show working tree status",
      "description": "Return current branch, ahead/behind counts, and per-file status",
      "resource": "git"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a sandbox",
      "description": "Create a new sandbox, optionally waiting until it is started",
      "resource": "sandbox"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a sandbox",
      "description": "Permanently delete a sandbox by ID",
      "resource": "sandbox"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a sandbox",
      "description": "Retrieve a single sandbox by ID",
      "resource": "sandbox"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many sandboxes",
      "description": "List sandboxes in the current organization",
      "resource": "sandbox"
    },
    {
      "name": "Get Preview URL",
      "value": "getPreviewUrl",
      "action": "Get a preview URL",
      "description": "Generate a public preview URL for a port exposed inside a sandbox",
      "resource": "sandbox"
    },
    {
      "name": "Start",
      "value": "start",
      "action": "Start a sandbox",
      "description": "Start a stopped sandbox, optionally waiting until it is started",
      "resource": "sandbox"
    },
    {
      "name": "Stop",
      "value": "stop",
      "action": "Stop a sandbox",
      "description": "Stop a running sandbox",
      "resource": "sandbox"
    },
    {
      "name": "Activate",
      "value": "activate",
      "action": "Activate a snapshot",
      "description": "Mark a snapshot as active so it becomes usable for sandbox creation",
      "resource": "snapshot"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a snapshot",
      "description": "Create a new snapshot from a Docker image",
      "resource": "snapshot"
    },
    {
      "name": "Deactivate",
      "value": "deactivate",
      "action": "Deactivate a snapshot",
      "description": "Mark a snapshot as inactive",
      "resource": "snapshot"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a snapshot",
      "description": "Permanently delete a snapshot",
      "resource": "snapshot"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a snapshot",
      "description": "Retrieve a single snapshot by ID or name",
      "resource": "snapshot"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many snapshots",
      "description": "List snapshots in the current organization with optional filters",
      "resource": "snapshot"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a volume",
      "description": "Create a new persistent volume",
      "resource": "volume"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a volume",
      "description": "Delete a volume by ID",
      "resource": "volume"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a volume",
      "description": "Retrieve a single volume by ID",
      "resource": "volume"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many volumes",
      "description": "List volumes in the current organization",
      "resource": "volume"
    }
  ]

npm_readme:
  # @daytona/n8n-nodes-daytona

  The official [Daytona](https://www.daytona.io) community node for [n8n](https://n8n.io).

  ## Overview

  [Daytona](https://www.daytona.io) provides secure, elastic sandbox infrastructure for AI agents. Each sandbox is a complete, isolated environment that is fully programmable, spun up on demand, and built for autonomous use without human intervention.

  Using n8n, you can integrate Daytona into any automated workflow: create sandboxes from snapshots or custom Docker images, manage the full sandbox lifecycle, execute code and shell commands, expose running services via preview URLs, drive a complete Git pipeline (clone, status, add, commit, push, pull, checkout), and manage the sandbox filesystem (upload, download, list, move, delete, folder creation) — all as composable steps alongside thousands of other n8n nodes.

  ## Contents

  - [@daytona/n8n-nodes-daytona](#daytonan8n-nodes-daytona)
    - [Overview](#overview)
    - [Contents](#contents)
    - [Installation](#installation)
    - [Credentials](#credentials)
    - [Operations](#operations)
      - [Operation behavior notes](#operation-behavior-notes)
      - [AI Agent integration](#ai-agent-integration)
    - [Examples](#examples)
    - [Compatibility](#compatibility)
    - [Development](#development)
      - [Tests](#tests)
      - [Lint + build](#lint--build)
    - [Resources](#resources)
    - [License](#license)

  ## Installation

  Once published, install from inside n8n:

  1. Go to **Settings → Community Nodes**.
  2. Click **Install a community node**.
  3. Enter `@daytona/n8n-nodes-daytona` and click **Install**.
  4. The Daytona node appears in the node search panel after refresh.

  For local development against an unpublished version, see [Development](#development).

  ## Credentials

  Create an API key at [app.daytona.io/dashboard/keys](https://app.daytona.io/dashboard/keys), then add a **Daytona API** credential in n8n.

  | Field | Required | Description |
  |---|---|---|
  | **API Key** | Yes | Bearer token from the Daytona dashboard. Stored encrypted by n8n. |
  | **Base URL** | No (default `https://app.daytona.io/api`) | Override only when targeting a self-hosted Daytona instance. |
  | **Organization ID** | No | Required when authenticating with a JWT token. Always safe to set with an API key — Daytona accepts the header on every request. Sent as `X-Daytona-Organization-ID`. |

  The credential is verified against `GET /api-keys/current` when you save — n8n reports success or failure inline.

  ## Operations

  | Resource | Operation | Description |
  |---|---|---|
  | **Sandbox** | Create | Create a sandbox. Set **Snapshot** (pre-built template ID/name) or **Image** (Docker image reference like `python:3.11`). Snapshot takes precedence if both are set; if neither is set, Daytona's organization default snapshot is used. Optional name, ephemeral flag, and advanced options (CPU/memory/disk, region, env vars, labels, network policy, auto-stop/archive/delete intervals). Optional poll-until-`started`. |
  | | Get | Fetch a single sandbox by ID. |
  | | Get Many | List sandboxes (paginated when **Return All** is checked). |
  | | Delete | Permanently delete a sandbox. |
  | | Start | Start a stopped sandbox. Optional poll-until-`started`. |
  | | Stop | Stop a running sandbox. Optional poll-until-`stopped`. |
  | | Get Preview URL | Generate a public URL for a port exposed inside a sandbox. **Signed** (default, browser-friendly, token in URL) or **Standard** (token returned separately, sent via `x-daytona-preview-token` header). |
  | **Code** | Run Code | Execute Python, JavaScript, or TypeScript inside a sandbox. With **Use Ephemeral Sandbox** checked (default), creates a temporary sandbox just for this execution and auto-deletes afterward. |
  | | Run Command | Execute a shell command inside a sandbox. Same ephemeral-or-existing modes as Run Code. Supports working directory and environment variables. |
  | **File** | Upload | Upload an n8n binary field to a sandbox path. Multipart with content-type preservation. |
  | | Download | Read a file from a sandbox path and emit it as binary output for downstream nodes. |
  | | List | List entries in a directory. Returns structured metadata (name, isDir, size, mode, modTime, owner, group, permissions) plus a `count` summary. |
  | | Create Folder | Create a directory with Unix-style octal permissions (e.g. `0755`). |
  | | Move | Move or rename a file/directory. Atomic — handles both renames and cross-directory moves. |
  | | Delete | Delete a file or directory. Set **Recursive** to remove non-empty folders. |
  | **Git** | Clone | Clone a Git repository into a sandbox path. Supports branch, commit ID pinning, and HTTPS basic auth for private repositories. |
  | | Status | Return working tree status: current branch, ahead/behind counts vs the tracked remote, and per-file staging/worktree changes. |
  | | Add | Stage one or more files for the next commit. |
  | | Commit | Commit staged changes with required author/email/message. Optional **Allow Empty Commit** for re-triggering CI when nothing changed. |
  | | Push | Push local commits to the remote. Optional HTTPS basic auth for private remotes. |
  | | Pull | Fetch and merge updates from the remote tracking branch. Optional HTTPS basic auth for private remotes. |
  | | Checkout | Check out a branch (existing local or remote-tracking) or a specific commit SHA. |
  | **Snapshot** | Create | Create a snapshot from a Docker image with optional resource specs (CPU/memory/disk) and entrypoint. |
  | | Get | Fetch a single snapshot by ID or name. |
  | | Get Many | List snapshots with optional name filter, sort (by `createdAt`, `lastUsedAt`, `name`, `state`), and order. |
  | | Delete | Permanently delete a snapshot. |
  | | Activate | Mark a snapshot as active so it becomes usable for sandbox creation. |
  | | Deactivate | Mark a snapshot as inactive. |
  | **Volume** | Create | Create a persistent volume that can be mounted into sandboxes. |
  | | Get | Fetch a single volume by ID. |
  | | Get Many | List volumes; optionally include soft-deleted ones. |
  | | Delete | Delete a volume. |

  ### Operation behavior notes

  - **Run Code / Run Command output:** `result` contains stdout and stderr combined. `artifacts` carries any extra metadata Daytona returns (e.g. matplotlib `charts` for Python). Branch on `$json.exitCode` for success/failure — non-zero exit codes are returned as data, not thrown as errors.
  - **Ephemeral mode** creates a sandbox with `autoDeleteInterval: 0` so it auto-deletes as soon as it stops. Cleanup also runs in a `try/finally` so the sandbox is deleted even if the operation throws.
  - **Preview URL Signed flavor** embeds the auth token directly in the URL — no need for downstream nodes to add headers. The Standard flavor returns `{ url, token }` separately for callers that prefer header-based auth.
  - **Toolbox URL caching** — Daytona returns a per-sandbox `toolboxProxyUrl` from `GET /sandbox/{id}` that all toolbox operations (code/command/file/git) use to route requests. Within a single node execution this URL is fetched once per sandbox and reused for subsequent toolbox operations. The cache is invalidated on Start, Stop, and Delete so that subsequent calls re-fetch the URL and reflect any state change.

  ### Snapshot picker on Sandbox.Create

  The **Snapshot** field on `Sandbox.Create` is a dropdown populated dynamically from your Daytona organization. Pick from the list, leave at *(Use Daytona Default)*, or switch to expression mode to pass a dynamic value.

  ### AI Agent integration

  This node is marked `usableAsTool: true` and appears in n8n's AI Agent tool picker. Each operation's `description` and `action` strings are exposed to the agent's LLM as tool metadata.

  ## Examples

  Three importable example workflows live in [`docs/examples/`](./docs/examples):

  1. [**`run-python-ephemeral.json`**](./docs/examples/run-python-ephemeral.json) — AI agent runs ad-hoc Python in a one-shot ephemeral sandbox. The simplest possible code-execution workflow.
  2. [**`clone-build-download.json`**](./docs/examples/clone-build-download.json) — Persistent sandbox: clone a Git repo, run a build command, download the build artifact back to n8n as binary. Good template for CI-style flows.
  3. [**`web-app-with-preview.json`**](./docs/examples/web-app-with-preview.json) — Spin up a long-lived sandbox, upload a server script, run it on port 3000, return a signed preview URL. Demonstrates web-service exposure for sharing demos.

  To use them: in n8n, click **Workflows → Import from File** and select the JSON. You'll need to configure the Daytona credential after import.

  ## Compatibility

  - **n8n version:** 1.x and later. Tested against the latest stable n8n at the time of release.
  - **Node.js:** 20.x and later (matches n8n's runtime requirements).
  - **Daytona API:** v1 (current stable as of 2026-05). Self-hosted Daytona instances supported via the **Base URL** credential field.

  ## Development

  ```bash
  git clone https://github.com/daytona/integrations.git
  cd integrations/packages/n8n-nodes-daytona
  npm install
  npm run dev          # boots n8n on http://localhost:5678 with hot reload
  ```

  The dev server symlinks the node into `~/.n8n-node-cli/.n8n/custom/`. First run downloads n8n and takes 1–2 minutes; subsequent runs are fast.

  ### Tests

  ```bash
  DAYTONA_API_KEY=… npm test
  ```

  Or set values in `.env.local` (gitignored). Set `DAYTONA_TEST_INCLUDE_EPHEMERAL=1` to also run ephemeral-mode tests (creates extra real sandboxes).

  The integration suite covers the core operations across all six resources end-to-end against the real Daytona API in ~20–30 seconds.

  ### Lint + build

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

  The lint config is locked by `n8n.strict: true` for n8n Cloud compatibility — don't modify `eslint.config.mjs`.

  ## Resources

  - [Daytona documentation](https://www.daytona.io/docs)
  - [Daytona API reference](https://www.daytona.io/docs/en/tools/api)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [n8n verified community node submission](https://creators.n8n.io/nodes)
  - [Source code](https://github.com/daytona/integrations/tree/main/packages/n8n-nodes-daytona)
  - [Issues](https://github.com/daytona/integrations/issues)

  ## License

  [MIT](./LICENSE) © Daytona Platforms Inc.

ai_documentation_summary:
  {"purpose":"Manages Daytona secure sandbox infrastructure from n8n. It can create and control sandboxes, run code and shell commands, expose preview URLs, operate on files, execute Git workflows, and manage snapshots and persistent volumes.","capabilities":["Create, get, list, start, stop, and delete sandboxes","Generate preview URLs for services running inside sandboxes","Run Python, JavaScript, or TypeScript code in a sandbox","Run shell commands in a sandbox","Upload, download, list, create folders, move, and delete files and directories","Clone repositories and manage Git status, add, commit, push, pull, and checkout","Create, get, list, activate, deactivate, and delete snapshots","Create, get, list, and delete persistent volumes","Support ephemeral sandboxes for temporary execution tasks","Support advanced sandbox configuration such as CPU, memory, disk, region, env vars, labels, and network policy"],"authentication":"API key required via a Daytona API credential; optional Base URL for self-hosted instances and optional Organization ID. Credential is verified against GET /api-keys/current.","commonUseCases":["Spin up sandboxes for automated code execution in AI agent workflows","Run commands or scripts and fetch results as part of an n8n automation","Clone a repository, make changes, commit, and push from a workflow","Manage sandbox files and transfer data between n8n and Daytona","Create reusable snapshots and persistent volumes for repeatable environments"],"limitations":["Snapshot takes precedence over image when both are provided for sandbox creation","If neither snapshot nor image is set, the organization's default snapshot is used","Some actions are dependent on sandbox state, such as requiring a running sandbox for code or command execution","Preview URLs can be signed or standard; standard mode requires handling the token separately"],"relatedNodes":[]}


node_type: n8n-nodes-dreem.dreem
package_name: n8n-nodes-dreem
display_name: Dreem
description: AI-powered image generation with Dreem
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: hoccf
author_github_url: https://github.com/dreem-ai/
npm_package_name: n8n-nodes-dreem
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.361Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "content",
      "options": [
        {
          "name": "Generative Content",
          "value": "content",
          "description": "Generate AI-powered content"
        },
        {
          "name": "Library",
          "value": "library",
          "description": "Browse available talents and shots"
        },
        {
          "name": "Task",
          "value": "task",
          "description": "Track generation task status"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateModelShots",
      "options": [
        {
          "name": "Generate Model Shots",
          "value": "generateModelShots",
          "action": "Generate model shots",
          "description": "Try your product on different models and shots"
        },
        {
          "name": "Generate Product Shots",
          "value": "generateProductShots",
          "action": "Generate product shots",
          "description": "Generate clean, studio-style product shots"
        },
        {
          "name": "Generate Video",
          "value": "generateVideo",
          "action": "Generate video from image",
          "description": "Generate video from product image"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "content"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAvailableTalents",
      "options": [
        {
          "name": "Get Available Shots",
          "value": "getAvailableShots",
          "action": "Get available shots",
          "description": "List all available shots"
        },
        {
          "name": "Get Available Talents",
          "value": "getAvailableTalents",
          "action": "Get available talents",
          "description": "List all available AI models"
        },
        {
          "name": "Get Video Prompts",
          "value": "getVideoPrompts",
          "action": "Get video prompts",
          "description": "List available video generation prompts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "library"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStatus",
      "options": [
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get generation task status",
          "description": "Check generation task status"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate Model Shots",
      "value": "generateModelShots",
      "action": "Generate model shots",
      "description": "Try your product on different models and shots",
      "resource": "content"
    },
    {
      "name": "Generate Product Shots",
      "value": "generateProductShots",
      "action": "Generate product shots",
      "description": "Generate clean, studio-style product shots",
      "resource": "content"
    },
    {
      "name": "Generate Video",
      "value": "generateVideo",
      "action": "Generate video from image",
      "description": "Generate video from product image",
      "resource": "content"
    },
    {
      "name": "Get Available Shots",
      "value": "getAvailableShots",
      "action": "Get available shots",
      "description": "List all available shots",
      "resource": "library"
    },
    {
      "name": "Get Available Talents",
      "value": "getAvailableTalents",
      "action": "Get available talents",
      "description": "List all available AI models",
      "resource": "library"
    },
    {
      "name": "Get Video Prompts",
      "value": "getVideoPrompts",
      "action": "Get video prompts",
      "description": "List available video generation prompts",
      "resource": "library"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get generation task status",
      "description": "Check generation task status",
      "resource": "task"
    }
  ]

npm_readme:
  # n8n-nodes-dreem

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

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

  [Dreem](https://dreem.ai) is an AI-powered image generation platform for e-commerce, enabling you to create professional model shots and product shots from simple product images.

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

  ![Dreem node in an n8n workflow](https://raw.githubusercontent.com/dreem-ai/n8n-nodes-dreem/main/docs/images/n8n-nodes-dreem-screenshot.png)

  [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

  ### Generative Content

  - **Generate Model Shots** — Try your product on different AI models and shots. Requires a talent (AI model), shot selection, and at least one product image. Supports optional back and styling images.
  - **Generate Product Shots** — Generate clean, studio-style product shots. Requires shot selection and at least one product image.
  - **Generate Video** — Convert a product image into an animated video. Requires an image URL, duration (5s or 10s), and output aspect ratio (1:1, 3:4, or 9:16). Optionally select a motion prompt from the library or provide custom text.

  All generation operations support configurable output format (PNG/JPEG for images), aspect ratio, and an optional webhook callback URL for receiving results asynchronously.

  ### Library

  - **Get Available Talents** — List all available AI models for virtual model generation. Supports filtering by gender and keyword search.
  - **Get Available Shots** — List all available shots for image generation. Supports filtering by shot type and keyword search.
  - **Get Video Prompts** — Browse available video animation prompts for video generation. Supports filtering by gender, keyword search, and pagination.

  ### Task

  - **Get Status** — Check the status of a generation task by its request ID.

  ## Credentials

  This node supports two authentication methods:

  - **OAuth2** — Connect via OAuth2 (PKCE). Pre-configured for standard n8n usage with selectable permission scopes (Full Access, Generation Only, Read Only, or Custom).
  - **API Key** — Authenticate with an API key issued by Dreem. Generate one from your Dreem dashboard under **Settings → API Management**. The key starts with `dreem_pk_`.

  ## Compatibility

  Tested with n8n v1.x. Requires n8n Nodes API version 1.

  ## Usage

  1. Add the **Dreem** node to your workflow.
  2. Select an authentication method and configure your credentials.
  3. Choose a resource (**Generative Content**, **Library**, or **Task**) and an operation.
  4. For generation operations, provide product image URLs and select your desired shots.
  5. Generation is asynchronous — use the **Task → Get Status** operation with the returned request ID to poll for results, or provide a webhook URL to receive results automatically.

  ## Resources

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

  ## Version history

  - **0.1.0** — Initial release with model shot generation, product shot generation, video generation, library browsing (talents, shots, video prompts), and task status tracking.

ai_documentation_summary:
  {"purpose":"Dreem is an AI-powered image generation node for e-commerce workflows in n8n. It creates professional model shots, product shots, and animated videos from product images, and can also browse Dreem's asset libraries and check generation task status.","capabilities":["Generate model shots using AI models, shot selection, and product images","Generate clean studio-style product shots from product images","Generate animated videos from a product image with selectable duration and aspect ratio","List available talents (AI models) with gender and keyword filtering","List available shots with shot type and keyword filtering","Browse video prompts with gender, keyword, and pagination support","Check generation task status by request ID","Support configurable output formats, aspect ratios, and optional webhook callbacks for async results"],"authentication":"OAuth2 (PKCE) or API key. OAuth2 supports selectable permission scopes; API keys are issued by Dreem and start with 'dreem_pk_'.","commonUseCases":["Creating AI-generated product and model imagery for e-commerce listings","Generating marketing videos from product images","Polling or receiving asynchronous results from generation jobs via webhook or task status checks","Discovering available models, shots, and video prompts before generating content"],"limitations":["Generation is asynchronous, so results may require polling the task status or using a webhook callback","Video generation only supports durations of 5s or 10s and aspect ratios of 1:1, 3:4, or 9:16","Image generation output formats are limited to PNG or JPEG"],"relatedNodes":[]}


node_type: @bilig/n8n-nodes-workpaper.biligWorkpaper
package_name: @bilig/n8n-nodes-workpaper
display_name: Bilig WorkPaper
description: Verify spreadsheet formula readback with Bilig WorkPaper
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: kalmyk
author_github_url: https://github.com/proompteng/bilig.git
npm_package_name: @bilig/n8n-nodes-workpaper
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:34.363Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "forecast",
      "options": [
        {
          "name": "Forecast",
          "value": "forecast"
        },
        {
          "name": "WorkPaper JSON",
          "value": "workpaper"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "verifyReadback",
      "options": [
        {
          "name": "Verify Formula Readback",
          "value": "verifyReadback",
          "action": "Verify formula readback",
          "routing": {
            "request": {
              "url": "/api/workpaper/n8n/forecast",
              "method": "POST"
            }
          },
          "description": "Edit one forecast input cell and return recalculated formula proof"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "forecast"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "evaluateDocument",
      "options": [
        {
          "name": "Evaluate Document",
          "value": "evaluateDocument",
          "action": "Evaluate workpaper document",
          "routing": {
            "request": {
              "url": "/api/workpaper/n8n/evaluate",
              "method": "POST"
            }
          },
          "description": "Apply cell edits to a WorkPaper JSON document and return formula readback proof"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "workpaper"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Verify Formula Readback",
      "value": "verifyReadback",
      "action": "Verify formula readback",
      "routing": {
        "request": {
          "url": "/api/workpaper/n8n/forecast",
          "method": "POST"
        }
      },
      "description": "Edit one forecast input cell and return recalculated formula proof",
      "resource": "forecast"
    },
    {
      "name": "Evaluate Document",
      "value": "evaluateDocument",
      "action": "Evaluate workpaper document",
      "routing": {
        "request": {
          "url": "/api/workpaper/n8n/evaluate",
          "method": "POST"
        }
      },
      "description": "Apply cell edits to a WorkPaper JSON document and return formula readback proof",
      "resource": "workpaper"
    }
  ]

npm_readme:
  # @bilig/n8n-nodes-workpaper

  This is a Bilig WorkPaper community node for n8n.

  `@bilig/n8n-nodes-workpaper` is published with npm provenance and passes n8n's
  community-package scanner. Install it in self-hosted n8n today; n8n Cloud canvas
  installation depends on n8n accepting the package through their verified-node
  review.

  It gives an n8n workflow two spreadsheet-shaped resources:

  1. run the hosted forecast proof for a no-setup smoke test;
  2. send your own WorkPaper JSON document, apply cell edits, and read formula
     outputs back;
  3. return before/after values plus proof that formula output changed and the
     exported WorkPaper JSON restores to the same result.

  Use it when an n8n automation needs formula readback without driving Excel,
  LibreOffice, Google Sheets, or a browser spreadsheet UI.

  ## Installation

  Install the scoped community node package from n8n:

  1. In a self-hosted n8n instance, open **Settings** -> **Community nodes**.
  2. Choose **Install a community node**.
  3. Enter:

  ```text
  @bilig/n8n-nodes-workpaper
  ```

  You can also install it from npm in the n8n environment:

  ```sh
  npm install @bilig/n8n-nodes-workpaper
  ```

  Do not install an unscoped `n8n-nodes-workpaper` package for Bilig. The scoped
  package is the canonical package name.

  ## Operations

  ### Forecast: Verify Formula Readback

  Posts to:

  ```text
  POST https://bilig.proompteng.ai/api/workpaper/n8n/forecast
  ```

  Default parameters:

  ```json
  {
    "sheetName": "Inputs",
    "address": "B3",
    "value": 0.4
  }
  ```

  ### WorkPaper JSON: Evaluate Document

  Posts to:

  ```text
  POST https://bilig.proompteng.ai/api/workpaper/n8n/evaluate
  ```

  Default request shape:

  ```json
  {
    "document": {
      "format": "bilig.headless.work-paper.document.v1",
      "sheets": [
        {
          "name": "Inputs",
          "content": [
            ["Metric", "Value"],
            ["Win rate", 0.25]
          ]
        },
        {
          "name": "Summary",
          "content": [
            ["Metric", "Value"],
            ["Expected customers", "=Inputs!B2*20"]
          ]
        }
      ],
      "namedExpressions": []
    },
    "edits": [
      {
        "cell": "Inputs!B2",
        "value": 0.4
      }
    ],
    "readCells": "Summary!B2",
    "includeUpdatedDocument": true
  }
  ```

  The response includes before, after, and restored readback records plus an
  updated WorkPaper document when `includeUpdatedDocument` is enabled.

  The response includes:

  ```json
  {
    "verified": true,
    "editedCell": "Inputs!B3",
    "before": {
      "expectedArr": 60000
    },
    "after": {
      "expectedArr": 96000,
      "targetGap": 5600
    },
    "checks": {
      "formulasPersisted": true,
      "restoredMatchesAfter": true,
      "computedOutputChanged": true
    }
  }
  ```

  ## Credentials

  No credentials are required for the public hosted demo endpoint.

  ## Compatibility

  Built with the official `@n8n/node-cli` scaffold. The node is a thin HTTP
  integration with no runtime dependencies, matching n8n verification guidance for
  community nodes.

  ## Usage

  1. Add the Bilig WorkPaper node to a workflow.
  2. Choose `Forecast` for the hosted smoke test or `WorkPaper JSON` for a custom
     document.
  3. Choose `Verify Formula Readback` or `Evaluate Document`.
  4. Keep the default hosted base URL or point `Bilig Base URL` at your own Bilig
     app.
  5. For the forecast smoke test, pick an editable input cell:
     - `B2`: qualified opportunities
     - `B3`: win rate
     - `B4`: average ARR
     - `B5`: expansion multiplier
  6. For custom documents, set `Document JSON`, `Edits JSON`, and `Read Cells`.
  7. Use the returned `verified` and `checks` fields as a gate before the workflow
     continues.

  For a no-install workflow, see:

  ```text
  examples/n8n-workpaper-formula-readback/bilig-workpaper-formula-readback.n8n.json
  ```

  After installing this community node, import the native node workflow:

  ```text
  examples/n8n-workpaper-formula-readback/bilig-workpaper-native-node.n8n.json
  ```

  That workflow runs both the forecast smoke test and the generic WorkPaper JSON
  operation through the actual Bilig WorkPaper node.

  ## Resources

  - [Bilig GitHub repository](https://github.com/proompteng/bilig)
  - [Bilig n8n workflow example](https://github.com/proompteng/bilig/tree/main/examples/n8n-workpaper-formula-readback)
  - [Bilig n8n formula readback docs](https://proompteng.github.io/bilig/n8n-workpaper-formula-readback.html)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## Version history

  - `0.2.1`: remove premature n8n Cloud verification wording before Creator
    Portal review.
  - `0.2.0`: add a generic WorkPaper JSON evaluation operation for user-owned
    documents.
  - `0.1.2`: align the node codex category with n8n's supported `Development`
    category.
  - `0.1.1`: publish through the shared trusted-publishing workflow.
  - `0.1.0`: initial forecast formula-readback action.

ai_documentation_summary:
  {"purpose":"Bilig WorkPaper is an n8n community node for verifying spreadsheet formula readback with Bilig WorkPaper. It can run a hosted smoke test or evaluate a custom WorkPaper JSON document to confirm formulas recalculate correctly after edits.","capabilities":["Run a hosted forecast proof / smoke test for formula readback","Evaluate a custom WorkPaper JSON document","Apply cell edits to a document and read formula outputs back","Return before/after values and verification checks","Optionally include the updated WorkPaper document in the response","Support choosing a base URL for the hosted service or a self-hosted Bilig app"],"authentication":"No credentials required for the public hosted demo endpoint","commonUseCases":["Validating spreadsheet formula recalculation in an n8n workflow","Testing that edited cells update dependent formula outputs correctly","Using a no-setup hosted smoke test before continuing an automation","Evaluating user-owned WorkPaper JSON documents in a workflow gate"],"limitations":["Public hosted demo endpoint does not require authentication, but self-hosted or custom base URL usage is implied to depend on the user's Bilig app setup","This is a thin HTTP integration focused on formula readback rather than a full spreadsheet automation suite","n8n Cloud installation depends on n8n accepting the package through verified-node review"],"relatedNodes":["n8n community nodes","HTTP Request"]}


node_type: n8n-nodes-stemsplit.stemSplit
package_name: n8n-nodes-stemsplit
display_name: StemSplit
description: Separate audio tracks into individual stems (vocals, drums, bass, etc.) using StemSplit AI
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: stemsplit
author_github_url: https://github.com/StemSplit/n8n-stemsplit.git
npm_package_name: n8n-nodes-stemsplit
npm_version: 0.1.7
community_fetched_at: 2026-07-14T14:40:34.363Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "separateStemsWait",
      "options": [
        {
          "name": "Separate Stems",
          "value": "separateStems",
          "action": "Separate stems",
          "description": "Submit an audio file for stem separation and return a job ID immediately"
        },
        {
          "name": "Separate Stems (Wait for Completion)",
          "value": "separateStemsWait",
          "action": "Separate stems and wait for completion",
          "description": "Submit an audio file and wait until separation is complete, then return download URLs"
        },
        {
          "name": "Get Job",
          "value": "getJob",
          "action": "Get job",
          "description": "Get the status and outputs of a stem separation job"
        },
        {
          "name": "List Jobs",
          "value": "listJobs",
          "action": "List jobs",
          "description": "List stem separation jobs for your account"
        },
        {
          "name": "Get Balance",
          "value": "getBalance",
          "action": "Get balance",
          "description": "Get your current credit balance"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Separate Stems",
      "value": "separateStems",
      "action": "Separate stems",
      "description": "Submit an audio file for stem separation and return a job ID immediately"
    },
    {
      "name": "Separate Stems (Wait for Completion)",
      "value": "separateStemsWait",
      "action": "Separate stems and wait for completion",
      "description": "Submit an audio file and wait until separation is complete, then return download URLs"
    },
    {
      "name": "Get Job",
      "value": "getJob",
      "action": "Get job",
      "description": "Get the status and outputs of a stem separation job"
    },
    {
      "name": "List Jobs",
      "value": "listJobs",
      "action": "List jobs",
      "description": "List stem separation jobs for your account"
    },
    {
      "name": "Get Balance",
      "value": "getBalance",
      "action": "Get balance",
      "description": "Get your current credit balance"
    }
  ]

npm_readme:
  # n8n-nodes-stemsplit

  [![npm](https://img.shields.io/npm/v/n8n-nodes-stemsplit)](https://www.npmjs.com/package/n8n-nodes-stemsplit)
  [![N8N Community Nodes](https://img.shields.io/badge/n8n-community%20node-orange)](https://docs.n8n.io/integrations/community-nodes/)
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

  Separate vocals, drums, bass, and other stems from any audio file — directly inside N8N. `n8n-nodes-stemsplit` connects your workflows to the [StemSplit API](https://stemsplit.io), letting you remove vocals from a song, isolate instrumentals, extract drum tracks, or split full 6-stem mixes (vocals, drums, bass, guitar, piano, other) — without any ML infrastructure.

  Submit audio via URL or binary upload, wait for processing, and get presigned download URLs for each stem — all as native N8N nodes.

  ---

  ## What It Does

  Accepts audio via **public URL** or **binary file upload**. Submits to the StemSplit API for processing. Returns presigned download URLs for each stem.

  | Operation | When to use it |
  |-----------|----------------|
  | **Separate Stems (Wait)** | You want vocals, drums, bass, etc. back immediately in the same workflow — submits and polls until complete |
  | **Separate Stems** | Fire-and-forget — submit many jobs in parallel and poll status later |
  | **Get Job** | Check status or retrieve output URLs for a previously submitted job |
  | **List Jobs** | Browse job history or filter by status (`PENDING`, `PROCESSING`, `COMPLETED`, `FAILED`) |
  | **Get Balance** | Check remaining credits before a batch run |

  Outputs presigned download URLs for: **vocals · instrumental · drums · bass · piano · guitar · other**

  ---

  ## Installation

  ### Via the N8N Community Nodes UI

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

  ### Via npm (self-hosted N8N)

  ```bash
  npm install n8n-nodes-stemsplit
  ```

  ---

  ## Credentials

  1. Go to [stemsplit.io/app/settings/api](https://stemsplit.io/app/settings/api) and generate an API key (format: `sk_live_...`).
  2. In N8N, add a new **StemSplit API** credential and paste your key.

  The node sends `Authorization: Bearer <key>` on every request to `https://stemsplit.io/api/v1`.

  ---

  ## Operations

  ### Separate Stems

  Submits audio for processing and **returns immediately** with a job ID. Use this when you want to submit many jobs in parallel and poll status later with **Get Job**.

  **Input source:**
  - **Binary File** — pass audio as a binary N8N item (from an HTTP Request, Read Binary File, or any binary-capable node)
  - **URL** — provide a publicly accessible URL; StemSplit fetches it server-side

  **Parameters:**

  | Parameter | Default | Description |
  |-----------|---------|-------------|
  | Output Type | `VOCALS + Instrumental` | Which stems to extract (see Output Types below) |
  | Quality | `Best` | Processing quality: `Fast`, `Balanced`, or `Best` |
  | Output Format | `MP3` | Output file format: `MP3`, `WAV`, or `FLAC` |
  | File Name | _(auto)_ | Override the job's display name |
  | Metadata | `{}` | Custom JSON echoed back in all job responses |

  **Output fields:** `id`, `status`, `progress`, `creditsRequired`, `estimatedSeconds`, `createdAt`, `options`, `input`, `metadata`

  ---

  ### Separate Stems (Wait for Completion)

  Submits audio and **polls** until the job reaches `COMPLETED` — or throws on `FAILED` or timeout. Returns presigned download URLs for every stem.

  **Additional parameters:**

  | Parameter | Default | Description |
  |-----------|---------|-------------|
  | Timeout (Seconds) | `600` | Give up after this many seconds |
  | Poll Interval (Seconds) | `5` | How often to check job status |

  **Additional output fields:**
  - `vocalsUrl` / `vocalsExpiresAt`
  - `instrumentalUrl` / `instrumentalExpiresAt`
  - `drumsUrl`, `bassUrl`, `otherUrl`, `pianoUrl`, `guitarUrl` (when applicable)

  > **Note:** Presigned URLs expire **1 hour** after job completion. Output files are deleted **14 days** after creation.

  ---

  ### Get Job

  Fetch a single job by ID. Returns the same fields as **Separate Stems (Wait)**, including all available output URLs.

  ---

  ### List Jobs

  Returns a paginated list of jobs. Optional `status` filter (`PENDING`, `PROCESSING`, `COMPLETED`, `FAILED`) and pagination via `limit`/`offset`.

  ---

  ### Get Balance

  Returns your current credit balance:

  ```json
  {
    "balanceSeconds": 3600,
    "balanceMinutes": 60,
    "balanceFormatted": "60 minutes",
    "updatedAt": "2026-05-21T00:00:00Z"
  }
  ```

  **Credit model:** 1 credit = 1 second of audio. Credits are deducted at job submission. If your balance is insufficient, the node throws a `402 INSUFFICIENT_CREDITS` error.

  ---

  ## Output Types

  | Value | Stems produced |
  |-------|---------------|
  | `VOCALS` | Vocals only |
  | `INSTRUMENTAL` | Instrumental only |
  | `BOTH` | Vocals + Instrumental |
  | `FOUR_STEMS` | Vocals, Drums, Bass, Other |
  | `SIX_STEMS` | Vocals, Drums, Bass, Other, Piano, Guitar *(requires Best quality)* |

  ---

  ## Supported Audio Formats

  **Input:** `mp3`, `wav`, `flac`, `m4a`, `ogg`, `webm`, `aac`, `wma`  
  **Max file size:** 50 MB

  ---

  ## Example Workflows

  ### Basic n8n vocal remover pipeline

  ```
  [HTTP Request: download audio]
    → [StemSplit: Separate Stems (Wait)]
    → [HTTP Request: download vocals URL]
    → [Write Binary File: save vocals.mp3]
  ```

  ### Batch stem splitter from local files

  ```
  [Read Binary File: song.mp3]
    → [StemSplit: Separate Stems (Wait), Output: SIX_STEMS]
    → [Split In Batches]
    → [HTTP Request: upload each stem to S3]
  ```

  ### Fire-and-forget with webhook callback

  ```
  [Webhook trigger]
    → [StemSplit: Separate Stems]      ← returns job ID instantly
    → [Set: store job ID in DB]
    → [Cron: poll every 30s via Get Job]
    → [IF: status === COMPLETED]
    → [HTTP Request: notify downstream service]
  ```

  ---

  ## Why StemSplit?

  StemSplit runs state-of-the-art source separation models (HTDemucs and similar) on GPU infrastructure purpose-built for audio. If you need to [separate vocals online](https://stemsplit.io/vocal-remover) without managing your own ML stack, StemSplit's API gives you:

  - **Sub-minute turnaround** on most tracks (Fast/Balanced quality)
  - **High-fidelity six-stem output** — vocals, drums, bass, piano, guitar, other
  - **Simple credit model** — pay per second of audio processed, no subscriptions required
  - **No file hosting needed** — pass a URL and StemSplit fetches it server-side

  Full API docs: [stemsplit.io/docs/api](https://stemsplit.io/docs/api)  
  OpenAPI spec: `GET https://stemsplit.io/api/v1/openapi`

  ---

  ## Requirements

  - N8N v0.200 or later
  - A StemSplit account with an API key — sign up at [stemsplit.io](https://stemsplit.io)
  - Sufficient credit balance for your audio files (check with **Get Balance**)

  ---

  ## License

  MIT © StemSplit

ai_documentation_summary:
  {"purpose":"Separate audio files into individual stems such as vocals, drums, bass, and other instrument tracks using the StemSplit API. It can either return a job ID immediately or wait for processing to finish and provide download URLs for each stem.","capabilities":["Submit audio for stem separation via public URL or binary file upload","Separate stems with multiple output modes: vocals only, instrumental only, vocals + instrumental, four-stem mix, or six-stem mix","Wait for job completion with polling and return presigned download URLs","Fetch the status and results of an existing job by job ID","List jobs with optional status filtering and pagination","Check account credit balance before running jobs","Configure output format, quality, filename override, and metadata"],"authentication":"API key required; use a StemSplit API credential with Bearer token authentication","commonUseCases":["Remove vocals from a song and download the instrumental track","Split uploaded or remote audio into separate stems for music production workflows","Submit multiple batch jobs and poll their status later","Check available credits before processing a batch of audio files"],"limitations":["Max input file size is 50 MB","Six-stem output requires Best quality","Presigned output URLs expire 1 hour after job completion","Output files are deleted 14 days after creation","Insufficient credits cause a 402 INSUFFICIENT_CREDITS error"],"relatedNodes":["HTTP Request","Read Binary File","Write Binary File","Webhook","Cron"]}


node_type: @green-api/n8n-nodes-max-greenapi.greenapi
package_name: @green-api/n8n-nodes-max-greenapi
display_name: GREEN-API for MAX
description: Send and receive MAX messages using Green-API.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: andrew.shamin
author_github_url: https://github.com/green-api/n8n-nodes-max-green-api.git
npm_package_name: @green-api/n8n-nodes-max-greenapi
npm_version: 0.0.8
community_fetched_at: 2026-07-14T14:40:34.365Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "sending",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Group",
          "value": "group"
        },
        {
          "name": "Journal",
          "value": "journal"
        },
        {
          "name": "Queue",
          "value": "queue"
        },
        {
          "name": "Sending",
          "value": "sending"
        },
        {
          "name": "Service",
          "value": "service"
        },
        {
          "name": "Receiving",
          "value": "receiving"
        }
      ],
      "required": true,
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAccountSettings",
      "options": [
        {
          "name": "Get Account Settings",
          "value": "getAccountSettings",
          "action": "Get information about the account"
        },
        {
          "name": "Get Settings",
          "value": "getSettings",
          "action": "Get settings"
        },
        {
          "name": "Get State Instance",
          "value": "getStateInstance",
          "action": "Get state instance"
        },
        {
          "name": "Logout",
          "value": "logout",
          "action": "Logout instance"
        },
        {
          "name": "Reboot",
          "value": "reboot",
          "action": "Reboot instance"
        },
        {
          "name": "Set Settings",
          "value": "setSettings",
          "action": "Set settings"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendMessage",
      "options": [
        {
          "name": "Send Contact",
          "value": "sendContact",
          "action": "Send a contact"
        },
        {
          "name": "Send File By URL",
          "value": "sendFileByUrl",
          "action": "Send file by url"
        },
        {
          "name": "Send Location",
          "value": "sendLocation",
          "action": "Send a location"
        },
        {
          "name": "Send Message",
          "value": "sendMessage",
          "action": "Send message"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sending"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "showMessagesQueue",
      "options": [
        {
          "name": "Show Messages Queue",
          "value": "showMessagesQueue",
          "action": "Show messages queue"
        },
        {
          "name": "Clear Messages Queue",
          "value": "clearMessagesQueue",
          "action": "Clear messages queue"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "queue"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "lastIncomingMessages",
      "options": [
        {
          "name": "Get Chat History",
          "value": "getChatHistory",
          "action": "Get chat history"
        },
        {
          "name": "Get Message",
          "value": "getMessage",
          "action": "Get a message"
        },
        {
          "name": "Last Incoming Messages",
          "value": "lastIncomingMessages",
          "action": "Get last incoming messages"
        },
        {
          "name": "Last Outgoing Messages",
          "value": "lastOutgoingMessages",
          "action": "Get last outgoing messages"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "journal"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getContacts",
      "options": [
        {
          "name": "Check Account",
          "value": "checkAccount",
          "action": "Check MAX account"
        },
        {
          "name": "Delete Message",
          "value": "deleteMessage",
          "action": "Delete a message"
        },
        {
          "name": "Edit Message",
          "value": "editMessage",
          "action": "Edit the text message"
        },
        {
          "name": "Get Avatar",
          "value": "getAvatar",
          "action": "Get avatar"
        },
        {
          "name": "Get Contact Info",
          "value": "getContactInfo",
          "action": "Get contact info"
        },
        {
          "name": "Get Contacts",
          "value": "getContacts",
          "action": "Get contacts"
        },
        {
          "name": "Get Chats",
          "value": "getChats",
          "action": "Get chats"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "service"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getGroupData",
      "options": [
        {
          "name": "Add Group Participant",
          "value": "addGroupParticipant",
          "action": "Add group participant"
        },
        {
          "name": "Create Group",
          "value": "createGroup",
          "action": "Create a group"
        },
        {
          "name": "Get Group Data",
          "value": "getGroupData",
          "action": "Get group data"
        },
        {
          "name": "Leave Group",
          "value": "leaveGroup",
          "action": "Leave group"
        },
        {
          "name": "Remove Admin",
          "value": "removeAdmin",
          "action": "Remove group admin"
        },
        {
          "name": "Remove Group Participant",
          "value": "removeGroupParticipant",
          "action": "Remove group participant"
        },
        {
          "name": "Set Group Admin",
          "value": "setGroupAdmin",
          "action": "Set group admin"
        },
        {
          "name": "Update Group Name",
          "value": "updateGroupName",
          "action": "Update group name"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "group"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "downloadFile",
      "options": [
        {
          "name": "Download a File",
          "value": "downloadFile",
          "action": "Download a file"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "receiving"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Account Settings",
      "value": "getAccountSettings",
      "action": "Get information about the account",
      "resource": "account"
    },
    {
      "name": "Get Settings",
      "value": "getSettings",
      "action": "Get settings",
      "resource": "account"
    },
    {
      "name": "Get State Instance",
      "value": "getStateInstance",
      "action": "Get state instance",
      "resource": "account"
    },
    {
      "name": "Logout",
      "value": "logout",
      "action": "Logout instance",
      "resource": "account"
    },
    {
      "name": "Reboot",
      "value": "reboot",
      "action": "Reboot instance",
      "resource": "account"
    },
    {
      "name": "Set Settings",
      "value": "setSettings",
      "action": "Set settings",
      "resource": "account"
    },
    {
      "name": "Send Contact",
      "value": "sendContact",
      "action": "Send a contact",
      "resource": "sending"
    },
    {
      "name": "Send File By URL",
      "value": "sendFileByUrl",
      "action": "Send file by url",
      "resource": "sending"
    },
    {
      "name": "Send Location",
      "value": "sendLocation",
      "action": "Send a location",
      "resource": "sending"
    },
    {
      "name": "Send Message",
      "value": "sendMessage",
      "action": "Send message",
      "resource": "sending"
    },
    {
      "name": "Show Messages Queue",
      "value": "showMessagesQueue",
      "action": "Show messages queue",
      "resource": "queue"
    },
    {
      "name": "Clear Messages Queue",
      "value": "clearMessagesQueue",
      "action": "Clear messages queue",
      "resource": "queue"
    },
    {
      "name": "Get Chat History",
      "value": "getChatHistory",
      "action": "Get chat history",
      "resource": "journal"
    },
    {
      "name": "Get Message",
      "value": "getMessage",
      "action": "Get a message",
      "resource": "journal"
    },
    {
      "name": "Last Incoming Messages",
      "value": "lastIncomingMessages",
      "action": "Get last incoming messages",
      "resource": "journal"
    },
    {
      "name": "Last Outgoing Messages",
      "value": "lastOutgoingMessages",
      "action": "Get last outgoing messages",
      "resource": "journal"
    },
    {
      "name": "Check Account",
      "value": "checkAccount",
      "action": "Check MAX account",
      "resource": "service"
    },
    {
      "name": "Delete Message",
      "value": "deleteMessage",
      "action": "Delete a message",
      "resource": "service"
    },
    {
      "name": "Edit Message",
      "value": "editMessage",
      "action": "Edit the text message",
      "resource": "service"
    },
    {
      "name": "Get Avatar",
      "value": "getAvatar",
      "action": "Get avatar",
      "resource": "service"
    },
    {
      "name": "Get Contact Info",
      "value": "getContactInfo",
      "action": "Get contact info",
      "resource": "service"
    },
    {
      "name": "Get Contacts",
      "value": "getContacts",
      "action": "Get contacts",
      "resource": "service"
    },
    {
      "name": "Get Chats",
      "value": "getChats",
      "action": "Get chats",
      "resource": "service"
    },
    {
      "name": "Add Group Participant",
      "value": "addGroupParticipant",
      "action": "Add group participant",
      "resource": "group"
    },
    {
      "name": "Create Group",
      "value": "createGroup",
      "action": "Create a group",
      "resource": "group"
    },
    {
      "name": "Get Group Data",
      "value": "getGroupData",
      "action": "Get group data",
      "resource": "group"
    },
    {
      "name": "Leave Group",
      "value": "leaveGroup",
      "action": "Leave group",
      "resource": "group"
    },
    {
      "name": "Remove Admin",
      "value": "removeAdmin",
      "action": "Remove group admin",
      "resource": "group"
    },
    {
      "name": "Remove Group Participant",
      "value": "removeGroupParticipant",
      "action": "Remove group participant",
      "resource": "group"
    },
    {
      "name": "Set Group Admin",
      "value": "setGroupAdmin",
      "action": "Set group admin",
      "resource": "group"
    },
    {
      "name": "Update Group Name",
      "value": "updateGroupName",
      "action": "Update group name",
      "resource": "group"
    },
    {
      "name": "Download a File",
      "value": "downloadFile",
      "action": "Download a file",
      "resource": "receiving"
    }
  ]

npm_readme:
  # n8n-nodes-max-green-api

  Integration node for [Green API](https://green-api.com/) in [n8n](https://n8n.io).  
  This community node allows automation of MAX interactions using Green API — including messaging, file transfer, contacts, groups, statuses, and instance management.

  ---

  ## 📖 Overview

  The **GreenAPI Node** provides full access to Green API endpoints, enabling you to send messages, manage chats, groups, and retrieve account information.

  ---

  ## Installation
  ### Install community node
  Go to `Settings` → `Community Nodes` → `Install`, then enter `@green-api/n8n-nodes-max-greenapi`

  ## Authentication

  To use this node, you need to have an instance and token from [Green-API](https://green-api.com/en) platform and MAX account:

  - Sign up at [Green-API](https://green-api.com/en)
  - Create an instance
  - Get idInstance and apiTokenInstance
  - Authorize the instance in the [Console](https://console.green-api.com/instanceList)

  ## 🧩 Features

  | Category | Methods |
  |-----------|----------|
  | 👤 **Account** | getSettings, setSettings, getStateInstance, reboot, logout, getAccountSettings |
  | ✉️ **Sending** | sendMessage, sendFileByUrl, sendLocation, sendContact
  | 📥 **Receiving** | webhookTrigger, downloadFile |
  | 📜 **Journals** | getChatHistory, getMessage, lastIncomingMessages, lastOutgoingMessages |
  | 🧾 **Queues** | showMessagesQueue, clearMessagesQueue |
  | 👥 **Groups** | createGroup, updateGroupName, getGroupData, addGroupParticipant, deleteGroupParticipant, setGroupAdmin, removeGroupAdmin, leaveGroup |
  | 🧩 **Service** | getContacts, getChats, getContactInfo, editMessage, deleteMessage |

  ---

  ## ⚙️ Usage Examples

  ### 💬 Send Message
  ```json
  {
    "operation": "sendMessage",
    "chatId": "41234567",
    "message": "Hello from n8n and Green API!"
  }
  ```

  ### 📎 Send File by URL
  ```json
  {
    "operation": "sendFileByUrl",
    "chatId": "41234567",
    "urlFile": "https://example.com/image.jpg",
    "fileName": "photo.jpg"
  }
  ```

  ### 👥 Create Group
  ```json
  {
    "operation": "createGroup",
    "groupName": "My Team",
    "participants": ["12365498", "41234567"]
  }
  ```

  ### 🧭 Send Location
  ```json
  {
    "operation": "sendLocation",
    "chatId": "41234567",
    "latitude": 40.7128,
    "longitude": -74.0060
  }
  ```

  ### 🔄 Check Account
  ```json
  {
    "operation": "checkAccount",
    "phoneNumber": 79000000000
  }
  ```
  ---

  ## 🔗 Resources

  - 🌐 [Green API Documentation](https://green-api.com/en/docs/)
  - 📘 [n8n Documentation](https://docs.n8n.io)
  - 💬 [n8n Community Forum](https://community.n8n.io)

  ---

  ## 👤 Author

  Developed by [Green API](https://green-api.com/)  
  📧 support@green-api.com  
  🌍 https://green-api.com/en/

  ---

  ## 🪪 License

  [MIT License](LICENSE)

ai_documentation_summary:
  {"purpose":"Integrates Green-API with n8n to automate MAX messaging and chat workflows. It supports sending/receiving messages, managing contacts and groups, handling files, and retrieving account and chat data.","capabilities":["Send messages, files by URL, locations, and contacts","Receive messages via webhook trigger and download files","Access chat journals and message history","Manage message queues","Create and administer groups","Get contacts, chats, and contact information","Edit and delete messages","Manage account and instance settings such as state, reboot, logout, and configuration"],"authentication":"Requires Green-API instance credentials: idInstance and apiTokenInstance, with the instance authorized in the Green-API Console.","commonUseCases":["Automating MAX customer support messaging","Sending files, contacts, and location data to chats","Creating and managing group chats for team communication","Building webhook-based workflows to process incoming MAX messages","Tracking chat history and outgoing/incoming message logs"],"limitations":[],"relatedNodes":[]}


node_type: @green-api/n8n-nodes-max-greenapi.greenapiTrigger
package_name: @green-api/n8n-nodes-max-greenapi
display_name: GREEN-API Trigger
description: Starts the workflow on a Green-Api webhook
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: andrew.shamin
author_github_url: https://github.com/green-api/n8n-nodes-max-green-api.git
npm_package_name: @green-api/n8n-nodes-max-greenapi
npm_version: 0.0.8
community_fetched_at: 2026-07-14T14:40:34.366Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-max-green-api

  Integration node for [Green API](https://green-api.com/) in [n8n](https://n8n.io).  
  This community node allows automation of MAX interactions using Green API — including messaging, file transfer, contacts, groups, statuses, and instance management.

  ---

  ## 📖 Overview

  The **GreenAPI Node** provides full access to Green API endpoints, enabling you to send messages, manage chats, groups, and retrieve account information.

  ---

  ## Installation
  ### Install community node
  Go to `Settings` → `Community Nodes` → `Install`, then enter `@green-api/n8n-nodes-max-greenapi`

  ## Authentication

  To use this node, you need to have an instance and token from [Green-API](https://green-api.com/en) platform and MAX account:

  - Sign up at [Green-API](https://green-api.com/en)
  - Create an instance
  - Get idInstance and apiTokenInstance
  - Authorize the instance in the [Console](https://console.green-api.com/instanceList)

  ## 🧩 Features

  | Category | Methods |
  |-----------|----------|
  | 👤 **Account** | getSettings, setSettings, getStateInstance, reboot, logout, getAccountSettings |
  | ✉️ **Sending** | sendMessage, sendFileByUrl, sendLocation, sendContact
  | 📥 **Receiving** | webhookTrigger, downloadFile |
  | 📜 **Journals** | getChatHistory, getMessage, lastIncomingMessages, lastOutgoingMessages |
  | 🧾 **Queues** | showMessagesQueue, clearMessagesQueue |
  | 👥 **Groups** | createGroup, updateGroupName, getGroupData, addGroupParticipant, deleteGroupParticipant, setGroupAdmin, removeGroupAdmin, leaveGroup |
  | 🧩 **Service** | getContacts, getChats, getContactInfo, editMessage, deleteMessage |

  ---

  ## ⚙️ Usage Examples

  ### 💬 Send Message
  ```json
  {
    "operation": "sendMessage",
    "chatId": "41234567",
    "message": "Hello from n8n and Green API!"
  }
  ```

  ### 📎 Send File by URL
  ```json
  {
    "operation": "sendFileByUrl",
    "chatId": "41234567",
    "urlFile": "https://example.com/image.jpg",
    "fileName": "photo.jpg"
  }
  ```

  ### 👥 Create Group
  ```json
  {
    "operation": "createGroup",
    "groupName": "My Team",
    "participants": ["12365498", "41234567"]
  }
  ```

  ### 🧭 Send Location
  ```json
  {
    "operation": "sendLocation",
    "chatId": "41234567",
    "latitude": 40.7128,
    "longitude": -74.0060
  }
  ```

  ### 🔄 Check Account
  ```json
  {
    "operation": "checkAccount",
    "phoneNumber": 79000000000
  }
  ```
  ---

  ## 🔗 Resources

  - 🌐 [Green API Documentation](https://green-api.com/en/docs/)
  - 📘 [n8n Documentation](https://docs.n8n.io)
  - 💬 [n8n Community Forum](https://community.n8n.io)

  ---

  ## 👤 Author

  Developed by [Green API](https://green-api.com/)  
  📧 support@green-api.com  
  🌍 https://green-api.com/en/

  ---

  ## 🪪 License

  [MIT License](LICENSE)

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows from Green-API webhooks and provides access to Green API/MAX messaging and account management functionality. It is used to automate inbound and outbound interactions such as messages, files, groups, contacts, and instance operations.","capabilities":["webhookTrigger to start workflows on incoming Green-API events","send messages, files by URL, locations, and contacts","manage account and instance settings such as getSettings, setSettings, getStateInstance, reboot, logout, and getAccountSettings","retrieve chats, message history, and individual messages","inspect and manage message queues with showMessagesQueue and clearMessagesQueue","create and manage groups, including participants and admins","access service data such as contacts, chats, contact info, and support message edit/delete operations"],"authentication":"Requires Green-API instance credentials: idInstance and apiTokenInstance, plus an authorized MAX account.","commonUseCases":["start workflows when new Green-API webhook events arrive","send automated replies or notifications in MAX chats","download and forward received files","create and manage group chats and participants","sync contacts, chats, and message history into n8n workflows"],"limitations":["Requires a pre-created and authorized Green-API instance","Only works with a MAX account connected to Green-API"],"relatedNodes":[]}


node_type: n8n-nodes-syncx.syncX
package_name: n8n-nodes-syncx
display_name: SyncX
description: Create and update leads in SyncX
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: syncx.dev
author_github_url: https://github.com/dev-syncx/
npm_package_name: n8n-nodes-syncx
npm_version: 1.0.9
community_fetched_at: 2026-07-14T14:40:34.367Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "createUpdateLead",
      "options": [
        {
          "name": "Create or Update Lead",
          "value": "createUpdateLead",
          "action": "Create or update a lead",
          "description": "Creates a new lead or updates an existing lead"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create or Update Lead",
      "value": "createUpdateLead",
      "action": "Create or update a lead",
      "description": "Creates a new lead or updates an existing lead"
    }
  ]

npm_readme:
  # n8n-nodes-syncx

  This is an n8n community node for **SyncX** — a no-code AI platform for sales and support that connects AI agents with business tools and workflows.

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

  ---

  ## Nodes

  ### SyncX (Action)
  Interact with leads in SyncX.

  **Operations:**
  - **Create or Update Lead** — Create a new lead or update an existing one in a smartsheet

  ### SyncX Trigger
  Start a workflow when something happens in SyncX.

  **Events:**
  - **Lead Stage Updated** — Fires whenever a lead moves to a new pipeline stage (webhook-based)

  ---

  ## Credentials

  You need a **Domain** and an **API Key** from your SyncX account:

  1. Log in to your SyncX instance (e.g. `https://app.syncx.dev`)
  2. Go to **Integrations → API Keys**
  3. Copy your API key

  In n8n, create a new **SyncX API** credential and fill in:
  - **Domain** — your SyncX base URL, e.g. `https://app.syncx.dev`
  - **API Key** — the key you copied above

  ---

  ## Installation

  ### n8n Cloud
  > Community nodes on n8n Cloud require verification. Once verified, search for `n8n-nodes-syncx` in the nodes panel.

  ### Self-hosted n8n

  ```bash
  # Navigate to your n8n custom nodes directory
  cd ~/.n8n/nodes

  # Install the package
  npm install n8n-nodes-syncx
  ```

  Restart n8n after installation.

  ---

  ## Compatibility

  - **n8n** version `0.198.0` or later
  - **Node.js** version `18.10` or later

  ---

  ## Usage

  ### Action — Create or Update Lead

  1. Add a **SyncX** node to your workflow
  2. Select **Create or Update Lead**
  3. Pick a **Smartsheet**, **Pipeline**, and enter a **Phone Number** (required)
  4. Fill in any optional fields (name, email, stage, agents, teams, etc.)
  5. For custom smartsheet columns, use the **Extra Smartsheet Columns** section — column names load from the selected smartsheet

  ### Trigger — Lead Stage Updated

  1. Add a **SyncX Trigger** node as the first node in your workflow
  2. Select your **Smartsheet**, **Pipeline**, and one or more **Stages** to watch
  3. **Activate** the workflow — n8n will automatically register a webhook with SyncX
  4. When a lead moves to one of the watched stages, SyncX will send the event to n8n and the workflow will run
  5. Deactivating the workflow automatically unregisters the webhook from SyncX

  ---

  ## Resources

  - [SyncX website](https://syncx.dev)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Report an issue](https://github.com/dev-syncx/n8n-nodes-syncx/issues)

  ---

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"SyncX is an n8n community node for interacting with SyncX leads and workflows. It supports creating or updating leads and triggering workflows when a lead changes stage.","capabilities":["Create or update a lead in SyncX","Select a smartsheet and pipeline for lead operations","Set required phone number and optional lead details such as name, email, stage, agents, and teams","Map extra custom smartsheet columns","Trigger workflows on Lead Stage Updated events via webhook","Watch one or more stages in a selected smartsheet and pipeline"],"authentication":"Domain and API Key required (SyncX API credential)","commonUseCases":["Sync lead data from n8n into SyncX by creating or updating records","Automate follow-up workflows when a lead moves to a new pipeline stage","Populate custom smartsheet fields from workflow data"],"limitations":["Create or update lead operation requires a phone number","Trigger only supports Lead Stage Updated events","Custom columns are limited to the selected smartsheet's available columns"],"relatedNodes":["SyncX Trigger"]}


node_type: n8n-nodes-syncx.syncXTrigger
package_name: n8n-nodes-syncx
display_name: SyncX Trigger
description: Triggers when a lead stage is updated in SyncX
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: syncx.dev
author_github_url: https://github.com/dev-syncx/
npm_package_name: n8n-nodes-syncx
npm_version: 1.0.9
community_fetched_at: 2026-07-14T14:40:34.368Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-syncx

  This is an n8n community node for **SyncX** — a no-code AI platform for sales and support that connects AI agents with business tools and workflows.

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

  ---

  ## Nodes

  ### SyncX (Action)
  Interact with leads in SyncX.

  **Operations:**
  - **Create or Update Lead** — Create a new lead or update an existing one in a smartsheet

  ### SyncX Trigger
  Start a workflow when something happens in SyncX.

  **Events:**
  - **Lead Stage Updated** — Fires whenever a lead moves to a new pipeline stage (webhook-based)

  ---

  ## Credentials

  You need a **Domain** and an **API Key** from your SyncX account:

  1. Log in to your SyncX instance (e.g. `https://app.syncx.dev`)
  2. Go to **Integrations → API Keys**
  3. Copy your API key

  In n8n, create a new **SyncX API** credential and fill in:
  - **Domain** — your SyncX base URL, e.g. `https://app.syncx.dev`
  - **API Key** — the key you copied above

  ---

  ## Installation

  ### n8n Cloud
  > Community nodes on n8n Cloud require verification. Once verified, search for `n8n-nodes-syncx` in the nodes panel.

  ### Self-hosted n8n

  ```bash
  # Navigate to your n8n custom nodes directory
  cd ~/.n8n/nodes

  # Install the package
  npm install n8n-nodes-syncx
  ```

  Restart n8n after installation.

  ---

  ## Compatibility

  - **n8n** version `0.198.0` or later
  - **Node.js** version `18.10` or later

  ---

  ## Usage

  ### Action — Create or Update Lead

  1. Add a **SyncX** node to your workflow
  2. Select **Create or Update Lead**
  3. Pick a **Smartsheet**, **Pipeline**, and enter a **Phone Number** (required)
  4. Fill in any optional fields (name, email, stage, agents, teams, etc.)
  5. For custom smartsheet columns, use the **Extra Smartsheet Columns** section — column names load from the selected smartsheet

  ### Trigger — Lead Stage Updated

  1. Add a **SyncX Trigger** node as the first node in your workflow
  2. Select your **Smartsheet**, **Pipeline**, and one or more **Stages** to watch
  3. **Activate** the workflow — n8n will automatically register a webhook with SyncX
  4. When a lead moves to one of the watched stages, SyncX will send the event to n8n and the workflow will run
  5. Deactivating the workflow automatically unregisters the webhook from SyncX

  ---

  ## Resources

  - [SyncX website](https://syncx.dev)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Report an issue](https://github.com/dev-syncx/n8n-nodes-syncx/issues)

  ---

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Triggers an n8n workflow when a lead stage is updated in SyncX. It uses a webhook-based trigger to start automations based on pipeline stage changes.","capabilities":["Webhook-based trigger for lead stage updates","Watch one or more stages within a selected pipeline","Automatically register webhook on workflow activation","Automatically unregister webhook on workflow deactivation"],"authentication":"SyncX API credential requiring a Domain and API Key","commonUseCases":["Start a workflow when a lead moves to a new sales pipeline stage","Notify teams or systems when a lead reaches a specific stage","Automate follow-up actions based on lead progression"],"limitations":["Only supports the Lead Stage Updated event for this trigger","Requires workflow activation to register the webhook"],"relatedNodes":["SyncX (Action)"]}


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

updated_at: 2026-07-14 14:40:34
author_name: businessmap
author_github_url: https://github.com/kanbanize/
npm_package_name: n8n-nodes-businessmap
npm_version: 1.1.1
community_fetched_at: 2026-07-14T14:40:34.369Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-businessmap

  This is the official n8n community node working with the [Businessmap API](https://demo.businessmap.io/openapi/). 

  **Businessmap** is the most flexible software platform for outcomes-driven enterprise agility. The unmatched functionality consolidates multiple tools into one, enabling affordable deployment at scale, visibility across all projects/portfolios, and alignment on goals, to deliver quality work faster. 


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

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

  ## Installation

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

  ## Operations

  ### Supported Triggers
  The **Businessmap n8n community node** supports the following triggers:
  * `All Events`
  * `Card Created`
  * `Card Details Changed`
  * `Card Discarded`
  * `Card Restored`
  * `Card Moved`
  * `Card Archived`
  * `Card Is Unarchived`
  * `Comment Created`
  * `Comment Updated`
  * `Comment Deleted`
  * `Subtask Created`
  * `Subtask Updated`
  * `Subtask Deleted`
  * `Board Renamed`
  * `Board Archived`
  * `Board Unarchived`
  * `Board Deleted`
  * `Board Structure Changed`

  ### Supported Actions
  The **Businessmap n8n community node** supports the following actions:
  * `Create Card`: Create a card in a board of your choice. Set card details including custom fields, stickers and tags.
  * `Update Card`: Update the properties of a card (Title, Description, Priority, Size, Deadline, etc.).
  * `Move Card`: Move a card to a new column, lane or board.
  * `Get Card by ID`: Get the details of a card by its internal ID.
  * `Get Card by Custom Card ID`: Find card by custom card ID. If multiple cards are found, all will be returned. Use "Board" parameter to filter search by boards.
  * `Get All Cards Per Board`: Get all cards from a selected board. The response contains up to 200 cards. To retrieve more than 200 cards, please use pagination.
  * `Link Card`: Link a card to an existing card.
  * `Unlink Card`: Remove a link between two cards.
  * `Set Custom Fields`: Sets values of custom fields.
  * `Block Card`: Block a card.
  * `Unblock Card`: Unblock a card.
  * `Archive Card`: Add card to archive.
  * `Unarchive Card`: Extract card from archive.
  * `Discard Card`: Discard a card.
  * `Restore Card`: Restore a previously discarded card.
  * `Add Comment`: Add a comment to a card.
  * `Create Subtask`: Create a new subtask of a card.
  * `Log Time`: Log time to a card.
  * `Upload Attachment`: Upload an attachment to a card.
  * `Download Attachment`: Download an attachment from a card.
  * `Get Card Attachments`: Get a list with all attachments for a specified card.
  * `Create Workspace`: Create a workspace.
  * `Update Workspace`: Update a workspace.
  * `Get Workspace`: Get a workspace.
  * `Get All Workspaces`: Get a list with all workspaces in the account.
  * `Create Board`: Create a board.
  * `Update Board`: Update a board.
  * `Get Board`: Get a board.
  * `Get All Boards`: Get a list with all boards.
  * `Get Board Structure`: Get board structure which includes all workflows, lanes and columns.
  * `Create Tag`: Create a tag.
  * `Update Tag`: Update a tag.
  * `Delete Tag`: Delete a tag.
  * `Get Tag`: Get a tag.
  * `Get All Tags`: Get a list with all tags.
  * `Assign Tag`: Assign a tag to a board.
  * `Create Sticker`: Create a sticker.
  * `Update Sticker`: Update a sticker.
  * `Delete Sticker`: Delete a sticker.
  * `Get Sticker`: Get a sticker.
  * `Get All Stickers`: Get a list with all stickers.
  * `Assign Sticker`: Assign a sticker to a board.
  * `Create Document`: Create a new document with a title, content and optional flags.
  * `Get Document`: Get a single document by its ID.
  * `Get Board Documents`: Get all documents on a board.
  * `Update Document`: Update the title, content, or any of the document flags. Set Parent Doc ID to `0` to detach an existing parent. Leave Title or Content empty to keep the current value.
  * `Set Document Location`: Add a document to a card or a board.
  * `Add Attachment to Document`: Upload a file and attach it to a document.


  ## Credentials

  * To use this **n8n community node**, you'll need a **Businessmap** account and a user with permissions to access the API. If you don’t have an account yet, [sign up here](https://businessmap.io/sign-up) to get started.

  To authenticate with the Businessmap API, you'll need to provide your domain name and API key when setting up your credentials. Follow the instructions provided on the [Businessmap API page](https://businessmap.io/api) to obtain your API key.

  ## Compatibility

  Requires n8n version 1.0.0 or later
  Requires Node.js 20.15.0 or later

  ## Usage

  * Visit our [Knowledge Base](https://knowledgebase.businessmap.io/hc/en-us) to find answers to all your questions regarding Businessmap.
  * Contact our [customer support](https://businessmap.io/customer-support) with any specific request.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/builtin/app-nodes/)
  * [Create Businessmap Account](https://businessmap.io/sign-up)
  * [Knowledge Base](https://knowledgebase.businessmap.io/hc/en-us)
  * [Businessmap API documentation](https://demo.businessmap.io/openapi/#/)

ai_documentation_summary:
  {"purpose":"Integrates n8n with Businessmap to trigger workflows on Businessmap events and perform card, board, workspace, tag, sticker, and document operations through the Businessmap API.","capabilities":["Triggers on Businessmap events such as card, comment, subtask, and board changes","Create, update, move, get, archive, discard, restore, block, unblock, and link/unlink cards","Manage workspaces, boards, tags, stickers, documents, attachments, and time logs","Upload and download card attachments","Set custom fields and assign tags or stickers to boards"],"authentication":"Businessmap API key plus domain name required","commonUseCases":["Start workflows when cards are created, moved, or updated in Businessmap","Automate card and board management tasks","Sync Businessmap data with other systems using board, document, or attachment actions"],"limitations":["Get All Cards Per Board returns up to 200 cards; pagination is needed to retrieve more","Requires n8n version 1.0.0 or later","Requires Node.js 20.15.0 or later"],"relatedNodes":[]}


node_type: n8n-nodes-guni.guni
package_name: n8n-nodes-guni
display_name: Guni SMS & MMS
description: Send SMS or MMS via Guni API
category: Communication
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: gunismsmms
author_github_url: https://github.com/Guni-sms/guni-n8n-node.git
npm_package_name: n8n-nodes-guni
npm_version: 2.2.0
community_fetched_at: 2026-07-14T14:40:34.370Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "sendSms",
      "options": [
        {
          "name": "Send SMS",
          "value": "sendSms",
          "action": "Send an SMS",
          "description": "Send a text message to one or more phone numbers"
        },
        {
          "name": "Send MMS",
          "value": "sendMms",
          "action": "Send an MMS",
          "description": "Send a multimedia message with a media URL"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send SMS",
      "value": "sendSms",
      "action": "Send an SMS",
      "description": "Send a text message to one or more phone numbers"
    },
    {
      "name": "Send MMS",
      "value": "sendMms",
      "action": "Send an MMS",
      "description": "Send a multimedia message with a media URL"
    }
  ]

npm_readme:
  # n8n-nodes-guni

  A community node for [n8n](https://n8n.io/) that lets you send SMS and MMS via the [Guni API](https://docs.gunisms.com.au/api).

  ## Features

  - Send promotional or notification **SMS**
  - Send promotional or notification **MMS** (with media URL)
  - Dynamic sender ID selection from your Guni account

  ## Installation

  Install from npm (self-hosted n8n):

  ```bash
  npm install n8n-nodes-guni
  ```

  Or search for **Guni SMS & MMS** in the n8n community nodes panel.

  ## Credentials

  To use this node you need a Guni API token.

  1. [Sign up](https://app.gunisms.com.au/signup) for a Guni account (if you don't have one).
  2. [Generate an API token](https://help.gunisms.com.au/kb/how-to-generate-api-token/) from your Guni dashboard.
  3. In n8n, add a new **Guni API** credential and paste your token.

  The node validates the token automatically when you save the credential.

  Want to send using your business name? [Set up a sender ID](https://help.gunisms.com.au/kb/set-sender-id/).

  ## Operations

  ### SMS

  - **Send SMS** — Send text messages to one or multiple phone numbers.
    - Campaign type: Promotional or Notification.
    - Sender ID: Choose from your account's sender IDs.
    - Unicode support: Optionally allow Unicode characters.

  ### MMS

  - **Send MMS** — Send multimedia messages with a media URL.
    - Campaign type: Promotional or Notification.
    - Sender ID: Choose from your account's sender IDs.
    - On success, output includes `messageId` (campaign/bulk id), `status`, `sentTo`, `message`, `media`, and `campaignType`.

  ## Usage

  1. Add the **Guni SMS & MMS** node to your workflow.
  2. Select the operation (Send SMS or Send MMS).
  3. Choose your Sender ID.
  4. Choose the Campaign Type.
  5. Enter your message text (or pass it from a previous node).
  6. For MMS, also provide a Media URL.
  7. Provide input data with contacts:

  **SMS example:**

  ```json
  {
    "contacts": ["61439554019", "61439543139"],
    "message": "Hello, this is a test SMS"
  }
  ```

  **MMS example:**

  ```json
  {
    "contacts": ["61439543031", "61439551969"],
    "message": "Hello, this is a test MMS",
    "media": "https://example.com/image.png"
  }
  ```

  8. Execute the workflow.

  ## Compatibility

  - Minimum n8n version: 1.0.0
  - Tested with n8n 1.x and 2.x

  ## Upgrading from 2.0.x

  - **Failed sends are real errors:** API and validation failures now **fail the node** (with `NodeApiError` / `NodeOperationError`) instead of returning an output item with `success: false`. Use n8n's **Continue On Fail** (node settings) or an **Error Workflow** if you need the old "soft failure" behavior.
  - **Item linking:** Successful outputs include `pairedItem` so downstream nodes and expressions resolve the correct input item.
  - **Authentication:** The node now uses `httpRequestWithAuthentication` with the `IAuthenticateGeneric` credential pattern, aligning with n8n best practices.

  ## Version history

  - **2.2.1** — Fixed MMS output: `messageId` and `status` are populated from the API response (`queueResponse.addedBulk`).
  - **2.2.0** — Production API URL, `continueOnFail()` support, contacts parameter for standalone use, sender ID lookup optimized, `group: ['output']`, codex category updated to Communication, n8n scanner verified.
  - **2.1.0** — n8n-standard auth (`httpRequestWithAuthentication`), `pairedItem` linking, proper `NodeApiError`/`NodeOperationError`, `subtitle`, UX copy aligned with n8n guidelines, GitHub Actions publish with provenance.
  - **2.0.x** — Prior stable line.
  - **1.0.2** — Initial release.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Guni API documentation](https://docs.gunisms.com.au/api)
  - [Guni help center](https://help.gunisms.com.au/)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Sends SMS and MMS messages through the Guni API from within n8n workflows. It supports promotional or notification campaigns and can use sender IDs from the user's Guni account.","capabilities":["Send SMS to one or multiple phone numbers","Send MMS with a media URL","Choose campaign type: Promotional or Notification","Select a sender ID from the connected Guni account","Optionally allow Unicode characters in SMS","Return MMS delivery/output details such as messageId, status, sentTo, message, media, and campaignType"],"authentication":"Guni API token required via an n8n Guni API credential","commonUseCases":["Sending promotional text messages to contacts","Sending notification SMS alerts from a workflow","Sending multimedia marketing or informational messages","Using a business sender ID for branded messaging"],"limitations":["Requires a valid Guni API token and Guni account","MMS requires a media URL","Failed API or validation sends now fail the node rather than returning a soft-failure output item","Sender IDs must be configured in the Guni account before they can be selected"],"relatedNodes":[]}


node_type: @sinch/n8n-nodes-sinch.sinch
package_name: @sinch/n8n-nodes-sinch
display_name: Sinch
description: Send and manage omnichannel messages via Sinch Conversations API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: asein_sinch
author_github_url: https://github.com/sinch/n8n-sinch.git
npm_package_name: @sinch/n8n-nodes-sinch
npm_version: 1.1.0
community_fetched_at: 2026-07-14T14:40:34.371Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Message",
          "value": "message",
          "description": "Send and manage messages"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many messages",
          "description": "Retrieve messages from conversations"
        },
        {
          "name": "Send",
          "value": "send",
          "action": "Send a message",
          "description": "Send an SMS message via Conversations API"
        },
        {
          "name": "Send WhatsApp Template",
          "value": "sendWhatsAppTemplate",
          "action": "Send a WhatsApp template message",
          "description": "Send an approved WhatsApp template message via Conversations API"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many messages",
      "description": "Retrieve messages from conversations",
      "resource": "message"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send a message",
      "description": "Send an SMS message via Conversations API",
      "resource": "message"
    },
    {
      "name": "Send WhatsApp Template",
      "value": "sendWhatsAppTemplate",
      "action": "Send a WhatsApp template message",
      "description": "Send an approved WhatsApp template message via Conversations API",
      "resource": "message"
    }
  ]

npm_readme:
  # n8n-nodes-sinch

  Community node for n8n to send and manage omnichannel messages via Sinch Conversations API.

  ## Installation

  ### Using n8n Community Nodes

  1. Open your n8n instance
  2. Go to **Settings** > **Community Nodes**
  3. Enter `@sinch/n8n-nodes-sinch`
  4. Click **Install**

  ### Manual Installation

  ```bash
  cd ~/.n8n
  npm install @sinch/n8n-nodes-sinch
  ```

  ## Compatibility

  - **n8n**: 1.0.0 or later
  - **Node.js**: 20.19 or later (up to 24.x)

  ## Features

  - **Send SMS messages** via Sinch Conversations API (routed through Econexus)
  - **Send WhatsApp Template Message** with approved templates from Sinch Provisioning API
  - **Get Many messages** with filtering and pagination
  - **Message Delivered trigger** via Econexus ISS webhook subscriptions
  - **OAuth2.0 authentication** with automatic token management
  - **Multi-region support** (US, EU, BR)
  - **Phone number normalization** to E.164 format
  - **Robust error handling** and validation

  ## Node Configuration

  ### Basic Information

  - **Display Name**: Sinch
  - **Name**: `sinch`
  - **Group**: `output`
  - **Inputs**: `main`
  - **Outputs**: `main`

  ### Operations

  #### Send Message

  Send SMS messages via Sinch Conversations API.

  **Fields:**
  - **To** (required) - Recipient phone number in E.164 format (e.g., +15551234567)
  - **Country** (optional) - Country for parsing local phone numbers without international prefix
  - **Message** (required, up to 1600 characters) - Message text to send
  - **SMS Sender** (optional) - Sender address (alphanumeric or phone number)
  - **Callback URL** (optional) - Webhook URL for delivery status updates
  - **Metadata** (optional) - Custom metadata to associate with the message (up to 1024 characters)

  #### Send WhatsApp Template Message

  Send an approved WhatsApp template via Sinch Conversation API. Templates are loaded from the Sinch Provisioning API; body placeholders (`{{1}}`, `{{2}}`, …) are shown as input fields after you select a template.

  **Fields:**
  - **To** (required) - Recipient WhatsApp number in E.164 format (e.g., +14155552671)
  - **WhatsApp Template Name or ID** (required) - Approved template from your Sinch project (value format: `templateName,languageCode`)
  - **Template Body Variable Count Name or ID** - Auto-loaded when the template changes; lists how many body variables the template expects
  - **Variable {{1}}** … **Variable {{20}}** - Shown based on the template variable count (up to 20 placeholders)

  **API endpoints used:**
  - List templates: `GET https://provisioning.api.sinch.com/v1/projects/{projectId}/whatsapp/templates?filterStates=APPROVED`
  - Template detail: `GET .../whatsapp/templates/{name}/languages/{language}`
  - Send: `POST https://{au|eu}.app.api.sinch.com/v1/econexus/sinch-build/v1/projects/{projectId}/messages:send`

  #### Get Many Messages

  Retrieve and filter messages from conversations.

  **Controls:**
  - **Return All** - Whether to return all results or only up to a given limit
  - **Limit** - Max number of results to return (default: 50)

  **Filters:**
  - **Contact ID** - Filter by contact ID
  - **Conversation ID** - Filter by conversation ID
  - **Start Time** - Filter messages after this timestamp
  - **End Time** - Filter messages before this timestamp
  - **Page Size** - Number of messages per page (max 1000, default: 10)
  - **Channel** - Filter by channel (SMS, WhatsApp, RCS)

  ### Sinch Trigger

  Webhook trigger for message delivery events.

  **Events:**
  - **Message Delivered** - Fires when a `MESSAGE_DELIVERY` webhook is received with status `DELIVERED`

  When a workflow is activated, the trigger registers an ISS subscription with Econexus. When the workflow is deactivated, the subscription is removed automatically.

  **Output fields:**
  - `messageId`, `conversationId`, `deliveryStatus`, `channel`, `contactIdentity`, `contactId`, `appId`, `projectId`, `eventTime`, `acceptedTime`, `metadata`

  ## Credentials

  ### Sinch Conversations API

  **Required Fields:**
  - **Key ID (Client ID)** - Your Sinch API Key ID from the dashboard
  - **Key Secret (Client Secret)** - Your Sinch API Key Secret from the dashboard
  - **Region** - Region where your Conversation API app was created (US, EU, or BR)
  - **Project ID** - Your Sinch Project ID from the dashboard
  - **App ID** - Your Sinch Conversation API App ID

  **Authentication:** OAuth2.0 (automatic token management)

  ### Getting Your Credentials

  1. Create a Sinch account at https://dashboard.sinch.com
  2. Create a project
  3. Generate API keys in Settings > Access Keys
  4. Create a Conversation API app
  5. Note your Project ID and App ID

  ## API Endpoints

  All Conversation API requests are routed through the Econexus Sinch Build proxy:

  - **US / BR**: `https://au.app.api.sinch.com/v1/econexus/sinch-build`
  - **EU**: `https://eu.app.api.sinch.com/v1/econexus/sinch-build`

  ISS webhook subscriptions:

  - **US / BR**: `https://au.app.api.sinch.com/v1/econexus/iss/subscriptions`
  - **EU**: `https://eu.app.api.sinch.com/v1/econexus/iss/subscriptions`

  ### Send Message

  **Endpoint**: `POST /v1/projects/{projectId}/messages:send`

  **Request Body:**
  ```json
  {
    "app_id": "your-app-id",
    "recipient": {
      "identified_by": {
        "channel_identities": [
          {
            "channel": "SMS",
            "identity": "+15551234567"
          }
        ]
      }
    },
    "message": {
      "text_message": {
        "text": "Hello from n8n!"
      }
    },
    "channel_priority_order": ["SMS"],
    "callback_url": "https://webhook.site/...",
    "message_metadata": "custom-id-123"
  }
  ```

  **Response:**
  ```json
  {
    "message_id": "msg-123",
    "accepted_time": "2024-01-01T00:00:00Z"
  }
  ```

  ### Get Many Messages

  **Endpoint**: `GET /v1/projects/{projectId}/messages`

  **Query Parameters:**
  - `app_id` (required)
  - `contact_id` (optional)
  - `conversation_id` (optional)
  - `start_time` (optional, ISO 8601)
  - `end_time` (optional, ISO 8601)
  - `page_size` (optional, max 1000)
  - `channel` (optional)

  ## Authentication

  OAuth2.0 authentication is automatically handled:
  1. Tokens are fetched from `https://{region}.auth.sinch.com/oauth2/token`
  2. Tokens are cached for 55 minutes (5-minute buffer before expiry)
  3. Tokens are automatically refreshed when expired
  4. Bearer tokens are used in Authorization headers
  5. Econexus proxy headers (`X-AUTH-SOURCE`, `X-SINCH-APP-ID`, `X-SINCH-PROJECT-ID`, `X-CLIENT-SOURCE`) are sent on all Econexus requests

  ## Phone Number Format

  ### E.164 Format

  Phone numbers must be in E.164 format:
  - **International format**: `+15551234567`
  - **Local format**: `5551234567` (requires Country field)

  ### Supported Formats

  - `+15551234567` (international format)
  - `15551234567` with Country = US -> `+15551234567`
  - `0437536808` with Country = AU -> `+61437536808`
  - `00` prefix is automatically converted to `+`

  ## Example Workflow

  ```json
  {
    "name": "Send SMS via Sinch",
    "nodes": [
      {
        "parameters": {
          "resource": "message",
          "operation": "send",
          "to": "+15551234567",
          "message": "Hello from n8n!",
          "additionalFields": {
            "callbackUrl": "https://webhook.site/unique-id"
          }
        },
        "type": "@sinch/n8n-nodes-sinch.sinch",
        "typeVersion": 1,
        "position": [250, 300],
        "id": "abc123",
        "name": "Sinch",
        "credentials": {
          "sinchApi": {
            "id": "1",
            "name": "Sinch Conversations API"
          }
        }
      }
    ],
    "connections": {}
  }
  ```

  ## Troubleshooting

  ### Common Issues

  - **401 Unauthorized**: Check your Key ID and Key Secret
  - **403 Forbidden**: Verify your Project ID matches the credentials
  - **404 Not Found**: Verify your App ID exists and region matches
  - **429 Rate Limit**: Implement backoff or check Sinch API rate limits
  - **Invalid phone number**: Ensure phone number is in E.164 format or provide Country field

  ### Error Codes

  | HTTP Code | Sinch Status | Description | Resolution |
  |-----------|--------------|-------------|------------|
  | 400 | INVALID_ARGUMENT | Malformed request body | Check app_id, project_id, message format |
  | 401 | UNAUTHENTICATED | Invalid credentials | Verify Key ID and Secret |
  | 403 | UNAUTHORIZED | No access to resource | Check project_id matches credentials |
  | 404 | NOT_FOUND | Resource not found | Verify app_id exists, region matches |
  | 429 | RESOURCE_EXHAUSTED | Rate limit exceeded | Implement backoff, check rate limits |
  | 500 | INTERNAL | Server error | Retry with exponential backoff |

  ## Resources

  - **Sinch Conversations API Docs**: https://developers.sinch.com/docs/conversation/
  - **Send Message Endpoint**: https://developers.sinch.com/docs/conversation/api-reference/conversation/messages/messages_sendmessage
  - **List Messages Endpoint**: https://developers.sinch.com/docs/conversation/api-reference/conversation/messages/messages_listmessages
  - **OAuth2.0 Guide**: https://developers.sinch.com/docs/conversation/api-reference/conversation/#oauth20-authentication
  - **Sinch Dashboard**: https://dashboard.sinch.com

  ## License

  MIT License

  ## Contributing

  Contributions, issues, and feature requests are welcome. Please open an issue on the [GitHub repository](https://github.com/sinch/n8n-sinch/issues) before submitting a pull request.

ai_documentation_summary:
  {"purpose":"Send and manage omnichannel messages through the Sinch Conversations API in n8n. It supports SMS, WhatsApp template messaging, message retrieval, and a delivery status trigger.","capabilities":["Send SMS messages via Sinch Conversations API","Send approved WhatsApp template messages with dynamic template variables","Get many messages with filtering, pagination, and channel-based filtering","Trigger workflows on message delivery events via ISS webhook subscription","Automatic phone number normalization to E.164 format","Multi-region support for US, EU, and BR"],"authentication":"OAuth2.0 with automatic token management; requires Key ID (Client ID), Key Secret (Client Secret), Region, Project ID, and App ID","commonUseCases":["Sending transactional or notification SMS messages","Sending WhatsApp templated messages to customers","Fetching message history and filtering by contact, conversation, time, or channel","Listening for delivered-message events to update workflow states"],"limitations":["WhatsApp messaging is limited to approved templates from Sinch Provisioning API","WhatsApp template variables are limited to up to 20 placeholders","SMS message text is limited to 1600 characters","Get Many Messages page size is capped at 1000"],"relatedNodes":[]}


node_type: n8n-nodes-preroll.preRoll
package_name: n8n-nodes-preroll
display_name: PreRoll.io
description: Interact with PreRoll.io — podcast production management
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: tro2789
author_github_url: https://github.com/tro2789/
npm_package_name: n8n-nodes-preroll
npm_version: 0.2.8
community_fetched_at: 2026-07-14T14:40:34.372Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "episode",
      "options": [
        {
          "name": "Activity",
          "value": "activity"
        },
        {
          "name": "AI",
          "value": "ai"
        },
        {
          "name": "Client",
          "value": "client"
        },
        {
          "name": "Dashboard",
          "value": "dashboard"
        },
        {
          "name": "Deliverable",
          "value": "deliverable"
        },
        {
          "name": "Episode",
          "value": "episode"
        },
        {
          "name": "Meeting Note",
          "value": "meetingNote"
        },
        {
          "name": "Pipeline Stage",
          "value": "pipelineStage"
        },
        {
          "name": "Show",
          "value": "show"
        },
        {
          "name": "Tag",
          "value": "tag"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a client",
          "description": "Create a client"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a client",
          "description": "Delete a client"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a client",
          "description": "Get a client"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many clients",
          "description": "Get many clients"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a client",
          "description": "Update a client"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "client"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a show",
          "description": "Create a show"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a show",
          "description": "Delete a show"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a show",
          "description": "Get a show"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many shows",
          "description": "Get many shows"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a show",
          "description": "Update a show"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "show"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an episode",
          "description": "Create an episode"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an episode",
          "description": "Delete an episode"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an episode",
          "description": "Get an episode"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many episodes",
          "description": "Get many episodes"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an episode",
          "description": "Update an episode"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "episode"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a deliverable",
          "description": "Create a deliverable"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a deliverable",
          "description": "Get a deliverable"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many deliverables",
          "description": "Get many deliverables"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a deliverable",
          "description": "Update a deliverable"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "deliverable"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a tag",
          "description": "Create a tag"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a tag",
          "description": "Delete a tag"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many tags",
          "description": "Get many tags"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a tag",
          "description": "Update a tag"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a meeting note",
          "description": "Create a meeting note"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many meeting notes",
          "description": "Get many meeting notes for a client"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "meetingNote"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many pipeline stages",
          "description": "Get many pipeline stages for a show"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pipelineStage"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get recent activity",
          "description": "Get recent activity for a show"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "activity"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getCredits",
      "options": [
        {
          "name": "Generate Content",
          "value": "generate",
          "action": "Generate AI content",
          "description": "Generate AI content from a transcript"
        },
        {
          "name": "Get Credits",
          "value": "getCredits",
          "action": "Get AI credits",
          "description": "Get AI credit balance"
        },
        {
          "name": "Get Transcription",
          "value": "getTranscription",
          "action": "Get transcription",
          "description": "Get transcription for an episode"
        },
        {
          "name": "Run Pipeline",
          "value": "runPipeline",
          "action": "Run AI pipeline",
          "description": "Run full AI pipeline (transcribe + generate)"
        },
        {
          "name": "Transcribe Episode",
          "value": "transcribe",
          "action": "Transcribe episode",
          "description": "Submit episode audio for transcription"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ai"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getOverview",
      "options": [
        {
          "name": "Get Overview",
          "value": "getOverview",
          "action": "Get dashboard overview",
          "description": "Get dashboard overview with stats, deadlines, and activity"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dashboard"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a client",
      "description": "Create a client",
      "resource": "client"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a client",
      "description": "Delete a client",
      "resource": "client"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a client",
      "description": "Get a client",
      "resource": "client"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many clients",
      "description": "Get many clients",
      "resource": "client"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a client",
      "description": "Update a client",
      "resource": "client"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a show",
      "description": "Create a show",
      "resource": "show"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a show",
      "description": "Delete a show",
      "resource": "show"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a show",
      "description": "Get a show",
      "resource": "show"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many shows",
      "description": "Get many shows",
      "resource": "show"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a show",
      "description": "Update a show",
      "resource": "show"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an episode",
      "description": "Create an episode",
      "resource": "episode"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an episode",
      "description": "Delete an episode",
      "resource": "episode"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an episode",
      "description": "Get an episode",
      "resource": "episode"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many episodes",
      "description": "Get many episodes",
      "resource": "episode"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an episode",
      "description": "Update an episode",
      "resource": "episode"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a deliverable",
      "description": "Create a deliverable",
      "resource": "deliverable"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a deliverable",
      "description": "Get a deliverable",
      "resource": "deliverable"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many deliverables",
      "description": "Get many deliverables",
      "resource": "deliverable"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a deliverable",
      "description": "Update a deliverable",
      "resource": "deliverable"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a tag",
      "description": "Create a tag",
      "resource": "tag"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a tag",
      "description": "Delete a tag",
      "resource": "tag"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many tags",
      "description": "Get many tags",
      "resource": "tag"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a tag",
      "description": "Update a tag",
      "resource": "tag"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a meeting note",
      "description": "Create a meeting note",
      "resource": "meetingNote"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many meeting notes",
      "description": "Get many meeting notes for a client",
      "resource": "meetingNote"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many pipeline stages",
      "description": "Get many pipeline stages for a show",
      "resource": "pipelineStage"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get recent activity",
      "description": "Get recent activity for a show",
      "resource": "activity"
    },
    {
      "name": "Generate Content",
      "value": "generate",
      "action": "Generate AI content",
      "description": "Generate AI content from a transcript",
      "resource": "ai"
    },
    {
      "name": "Get Credits",
      "value": "getCredits",
      "action": "Get AI credits",
      "description": "Get AI credit balance",
      "resource": "ai"
    },
    {
      "name": "Get Transcription",
      "value": "getTranscription",
      "action": "Get transcription",
      "description": "Get transcription for an episode",
      "resource": "ai"
    },
    {
      "name": "Run Pipeline",
      "value": "runPipeline",
      "action": "Run AI pipeline",
      "description": "Run full AI pipeline (transcribe + generate)",
      "resource": "ai"
    },
    {
      "name": "Transcribe Episode",
      "value": "transcribe",
      "action": "Transcribe episode",
      "description": "Submit episode audio for transcription",
      "resource": "ai"
    },
    {
      "name": "Get Overview",
      "value": "getOverview",
      "action": "Get dashboard overview",
      "description": "Get dashboard overview with stats, deadlines, and activity",
      "resource": "dashboard"
    }
  ]

npm_readme:
  # n8n-nodes-preroll

  n8n community node for [PreRoll](https://preroll.io) — podcast production management.

  Interact with your PreRoll instance from n8n workflows: manage clients, shows, episodes, deliverables, tags, and AI features. Includes a trigger node for real-time webhook events.

  [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 package name:** `n8n-nodes-preroll`

  ## Credentials

  You need a PreRoll API key to authenticate:

  1. Log in to your PreRoll instance
  2. Go to **Settings → API Keys**
  3. Click **Create API Key** and copy the key (starts with `pr_`)
  4. In n8n, create a new **PreRoll API** credential with your API key and base URL

  > API keys require a Pro or Studio plan.

  ## Nodes

  ### PreRoll

  The main node supports these resources and operations:

  | Resource | Operations |
  |----------|-----------|
  | **Client** | Get, Get Many, Create, Update, Delete |
  | **Show** | Get, Get Many, Create, Update, Delete |
  | **Episode** | Get, Get Many, Create, Update, Delete |
  | **Deliverable** | Get, Get Many, Create, Update |
  | **Tag** | Get Many, Create, Update, Delete |
  | **Meeting Note** | Get Many, Create |
  | **Pipeline Stage** | Get Many |
  | **Activity** | Get Many |
  | **AI** | Get Credits, Get Transcription, Transcribe Episode, Generate Content, Run Pipeline |
  | **Dashboard** | Get Overview |

  ### PreRoll Trigger

  Webhook-based trigger that starts workflows when events occur in PreRoll:

  - `episode.status_changed` — Episode status updated
  - `episode.stage_changed` — Episode moved to a different pipeline stage
  - `episode.published` — Episode published
  - `episode.scheduled` — Episode scheduled for publishing
  - `deliverable.submitted` — New deliverable submitted for review
  - `deliverable.approved` — Deliverable approved by client
  - `deliverable.revision_requested` — Client requested revisions on a deliverable
  - `deliverable.resubmitted` — Deliverable resubmitted after revision

  The trigger node automatically registers and deregisters webhook endpoints in PreRoll when the workflow is activated/deactivated.

  ## Example Workflows

  Import-ready workflow templates are in the [`examples/`](./examples/) directory:

  | Workflow | Description | File |
  |----------|-------------|------|
  | **Slack Notifications** | Get real-time Slack messages for episode and deliverable events | [`slack-notifications.json`](./examples/slack-notifications.json) |
  | **Todoist Episode Tasks** | Auto-create a Todoist task when a new episode is created | [`todoist-episode-tasks.json`](./examples/todoist-episode-tasks.json) |

  To import: in n8n, go to **Workflows → Import from File** and select the JSON file.

  See [`examples/README.md`](./examples/README.md) for setup instructions and a full webhook payload reference.

  ### More ideas

  - **Auto-transcribe new episodes** — PreRoll Trigger (`episode.stage_changed`) → IF (stage = "Editing") → PreRoll AI Transcribe
  - **Weekly episode report** — Schedule Trigger (every Monday) → PreRoll Dashboard → Email
  - **Stripe → client onboarding** — Stripe Trigger (checkout completed) → PreRoll Create Client → Create Show

  ## Development

  ```bash
  # Install dependencies
  npm install

  # Build
  npm run build

  # Link for local testing
  npm link
  cd ~/.n8n/custom
  npm link n8n-nodes-preroll
  ```

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Provides n8n integration with PreRoll.io for podcast production management. It lets workflows manage clients, shows, episodes, deliverables, tags, meeting notes, pipeline data, activity, dashboard info, and AI-related tasks, plus react to real-time PreRoll events via a trigger.","capabilities":["Client management: get, list, create, update, delete","Show management: get, list, create, update, delete","Episode management: get, list, create, update, delete","Deliverable management: get, list, create, update","Tag management: get, list, create, update, delete","Meeting note management: list, create","Pipeline stage listing","Activity listing","AI features: get credits, get transcription, transcribe episode, generate content, run pipeline","Dashboard overview retrieval"],"authentication":"PreRoll API key required (create a PreRoll API credential in n8n using the API key and base URL). API keys require a Pro or Studio plan.","commonUseCases":["Automatically create workflow actions when an episode status or stage changes","Send notifications or create tasks when deliverables are submitted, approved, or revised","Manage podcast clients, shows, episodes, and deliverables from n8n","Use PreRoll AI to transcribe episodes or generate content","Build reporting workflows using dashboard and activity data"],"limitations":["API keys are only available on Pro or Studio plans","Deliverable resource does not support delete operations","Meeting Note resource only supports get many and create","Pipeline Stage, Activity, and Dashboard resources are read-only/listing or overview only"],"relatedNodes":["Webhook Trigger","Slack","Todoist","Stripe","IF"]}


node_type: n8n-nodes-preroll.preRollTrigger
package_name: n8n-nodes-preroll
display_name: PreRoll.io Trigger
description: Triggers when events occur in PreRoll.io
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: tro2789
author_github_url: https://github.com/tro2789/
npm_package_name: n8n-nodes-preroll
npm_version: 0.2.8
community_fetched_at: 2026-07-14T14:40:34.373Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-preroll

  n8n community node for [PreRoll](https://preroll.io) — podcast production management.

  Interact with your PreRoll instance from n8n workflows: manage clients, shows, episodes, deliverables, tags, and AI features. Includes a trigger node for real-time webhook events.

  [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 package name:** `n8n-nodes-preroll`

  ## Credentials

  You need a PreRoll API key to authenticate:

  1. Log in to your PreRoll instance
  2. Go to **Settings → API Keys**
  3. Click **Create API Key** and copy the key (starts with `pr_`)
  4. In n8n, create a new **PreRoll API** credential with your API key and base URL

  > API keys require a Pro or Studio plan.

  ## Nodes

  ### PreRoll

  The main node supports these resources and operations:

  | Resource | Operations |
  |----------|-----------|
  | **Client** | Get, Get Many, Create, Update, Delete |
  | **Show** | Get, Get Many, Create, Update, Delete |
  | **Episode** | Get, Get Many, Create, Update, Delete |
  | **Deliverable** | Get, Get Many, Create, Update |
  | **Tag** | Get Many, Create, Update, Delete |
  | **Meeting Note** | Get Many, Create |
  | **Pipeline Stage** | Get Many |
  | **Activity** | Get Many |
  | **AI** | Get Credits, Get Transcription, Transcribe Episode, Generate Content, Run Pipeline |
  | **Dashboard** | Get Overview |

  ### PreRoll Trigger

  Webhook-based trigger that starts workflows when events occur in PreRoll:

  - `episode.status_changed` — Episode status updated
  - `episode.stage_changed` — Episode moved to a different pipeline stage
  - `episode.published` — Episode published
  - `episode.scheduled` — Episode scheduled for publishing
  - `deliverable.submitted` — New deliverable submitted for review
  - `deliverable.approved` — Deliverable approved by client
  - `deliverable.revision_requested` — Client requested revisions on a deliverable
  - `deliverable.resubmitted` — Deliverable resubmitted after revision

  The trigger node automatically registers and deregisters webhook endpoints in PreRoll when the workflow is activated/deactivated.

  ## Example Workflows

  Import-ready workflow templates are in the [`examples/`](./examples/) directory:

  | Workflow | Description | File |
  |----------|-------------|------|
  | **Slack Notifications** | Get real-time Slack messages for episode and deliverable events | [`slack-notifications.json`](./examples/slack-notifications.json) |
  | **Todoist Episode Tasks** | Auto-create a Todoist task when a new episode is created | [`todoist-episode-tasks.json`](./examples/todoist-episode-tasks.json) |

  To import: in n8n, go to **Workflows → Import from File** and select the JSON file.

  See [`examples/README.md`](./examples/README.md) for setup instructions and a full webhook payload reference.

  ### More ideas

  - **Auto-transcribe new episodes** — PreRoll Trigger (`episode.stage_changed`) → IF (stage = "Editing") → PreRoll AI Transcribe
  - **Weekly episode report** — Schedule Trigger (every Monday) → PreRoll Dashboard → Email
  - **Stripe → client onboarding** — Stripe Trigger (checkout completed) → PreRoll Create Client → Create Show

  ## Development

  ```bash
  # Install dependencies
  npm install

  # Build
  npm run build

  # Link for local testing
  npm link
  cd ~/.n8n/custom
  npm link n8n-nodes-preroll
  ```

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows when real-time events occur in PreRoll.io, a podcast production management platform. It also includes a companion node for managing PreRoll resources such as clients, shows, episodes, deliverables, tags, and AI-related actions.","capabilities":["Webhook trigger for PreRoll events","Automatically registers and deregisters webhook endpoints on workflow activation/deactivation","Responds to episode events such as status changed, stage changed, published, and scheduled","Responds to deliverable events such as submitted, approved, revision requested, and resubmitted","Supports PreRoll resource management for clients, shows, episodes, deliverables, tags, meeting notes, pipeline stages, activities, dashboard data, and AI features","AI operations including get credits, get transcription, transcribe episode, generate content, and run pipeline"],"authentication":"PreRoll API key required (create a PreRoll API credential with API key and base URL); API keys require a Pro or Studio plan.","commonUseCases":["Start workflows when an episode changes stage or gets published","Notify team members when deliverables are submitted, approved, or need revisions","Automate podcast production tasks such as transcription, content generation, and pipeline actions","Sync PreRoll events to external tools like Slack or Todoist"],"limitations":["API keys require a Pro or Studio plan","Trigger only supports the listed episode and deliverable webhook events"],"relatedNodes":["PreRoll","Webhook","IF","Slack","Todoist"]}


node_type: n8n-nodes-testmuai.testmuaiAgent
package_name: n8n-nodes-testmuai
display_name: TestMu AI (Formerly LambdaTest) Agent
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lambdatestdev
author_github_url: https://github.com/LambdaTest/
npm_package_name: n8n-nodes-testmuai
npm_version: 0.1.1
community_fetched_at: 2026-07-14T14:40:34.374Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Give your AI agent a real browser to work with on TestMu AI Browser Cloud. Opens URLs, clicks elements, fills forms, and captures screenshots — all through a single tool. The live session is visible on the TestMu dashboard.

npm_readme:
  # n8n-nodes-testmuai

  Verified n8n community node for [TestMu AI Browser Cloud](https://www.testmuai.com/browser-cloud/) (formerly LambdaTest). Lets your AI Agent drive real browsers — Chrome, Firefox, Safari, Edge — across Windows, macOS, and Linux. Every session runs live and can be viewed on the Browser Cloud dashboard with video replay, console logs, and network capture for full debugging visibility.

  ## What's in the package

  One node: **TestMu AI (Formerly LambdaTest) Agent** — a tool that any AI Agent calls to drive a real cloud browser. Connects to TestMu's cloud via the W3C WebDriver protocol over HTTPS, so it works inside n8n Cloud's verified-node sandbox.

  Looking for the script-runner or in-process Playwright agent? Those features live in the companion package [`n8n-nodes-browsercloud`](https://github.com/keys-github/n8n-browsercloud) (self-hosted n8n only).

  ## Install

  In your n8n instance:

  - **Self-hosted:** Settings → Community Nodes → Install → enter `n8n-nodes-testmuai`
  - **n8n Cloud:** Available in the Verified Community Nodes marketplace.

  ## Credentials

  Add a **TestMu AI (Formerly LambdaTest) API** credential with:

  - **Username** — your TestMu AI username
  - **Access Key** — your TestMu AI access key

  Find both in your TestMu account profile.

  ## How to use with an AI Agent

  ```
  [Trigger] → [AI Agent]
                ↑ Tools (sub-input on the bottom of the Agent node)
                [TestMu AI (Formerly LambdaTest) Agent]
                ↑ Chat Model
                [Gemini / Claude / OpenAI Chat Model]
  ```

  1. Add an **AI Agent** node.
  2. Wire any tool-calling-capable Chat Model (Gemini 2.5 Flash, GPT-4o, Claude Sonnet) into the Agent's Chat Model socket.
  3. Wire **TestMu AI (Formerly LambdaTest) Agent** into the Agent's Tools socket.
  4. Pick your TestMu credential (available on your TestMu AI dashboard) on the tool node.
  5. Configure browser, platform, region (US/EU), and version.
  6. Give the Agent a goal in its user message — e.g. "Open news.ycombinator.com and tell me the title of the top story."

  ### Suggested system message for the AI Agent

  ```
  You drive a real cloud browser via the TestMu AI Agent tool. Steps:

  1. Call navigate first to open the right URL.
  2. Click and type refer to elements by their ref number from the latest snapshot.
     Every tool response includes a fresh snapshot — use it.
  3. If an element's role contains "(readonly)", do NOT try to type into it.
     Click it instead — it usually opens a picker with a real input you can type into.
  4. Use get_text to extract content.
  5. When the goal is achieved, ALWAYS call action=release as your final tool call.
     This frees the cloud browser immediately instead of letting it idle-time out. You can also type "Release session after completion" in natural language to achieve the same.

  Never refer to refs from previous turns — refs are only valid against the latest snapshot.
  ```

  ## Actions exposed

  | Action | Purpose |
  |---|---|
  | `navigate` | Open a URL |
  | `snapshot` | Return a numbered list of interactive elements on the current page |
  | `click` | Click an element by its ref number |
  | `type` | Type text into an input by ref (optionally pressing Enter after) |
  | `get_text` | Read text from a ref or the whole page |
  | `screenshot` | Capture a base64 PNG of the current viewport (useful for vision models) |
  | `release` | End the cloud browser session. The AI Agent should call this when the goal is achieved. |

  After every action, the response includes a fresh page snapshot — so the AI Agent rarely needs to call `snapshot` separately between every click and type.

  ## Architecture notes

  - Pure HTTP — no third-party Node dependencies, no subprocess spawning, no in-process Playwright. All browser interaction goes through TestMu's WebDriver Hub via n8n's sandboxed `httpRequest` helper.
  - Session state lives in n8n's workflow static data, scoped by execution ID. Stale sessions auto-prune after 30 minutes.
  - Elements are tagged with `data-n8n-ref` attributes by the snapshot script so click / type can find them again reliably via a single CSS selector lookup.
  - Live session videos and console / network logs are visible on the TestMu AI's Browsercloud dashboard.

  ## Limitations vs the companion `n8n-nodes-browsercloud` package

  - No script-runner (cannot exist in the verified sandbox — would need `child_process` and `fs`).
  - No in-process Playwright (network roundtrip per action vs in-memory call).
  - Full-page screenshots return viewport-only (W3C WebDriver doesn't standardize full-page; we report `fullPageRequested: true` so callers know what was asked for).

  For workflows that need any of the above, install the companion `n8n-nodes-browsercloud` package on self-hosted n8n.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Provides an AI agent tool to control a real cloud browser on TestMu AI Browser Cloud. It lets workflows open URLs, click elements, fill forms, read page content, take screenshots, and release the browser session.","capabilities":["Navigate to URLs","Generate page snapshots with numbered interactive elements","Click elements by reference number","Type text into inputs by reference number, optionally pressing Enter","Extract text from elements or the whole page","Capture screenshots as base64 PNG","Release/end the browser session","Works with real browsers across Chrome, Firefox, Safari, and Edge on Windows, macOS, and Linux","Shows live sessions with video replay, console logs, and network capture in the TestMu dashboard"],"authentication":"TestMu AI API credential required using Username and Access Key","commonUseCases":["Automating website navigation and data extraction with an AI agent","Testing or interacting with real web applications in a cloud browser","Debugging browser workflows using live session visibility, screenshots, and logs"],"limitations":["No script-runner support","No in-process Playwright support","Full-page screenshots are viewport-only rather than true full-page captures","Requires the companion n8n-nodes-browsercloud package for script-runner or in-process Playwright features"],"relatedNodes":["AI Agent","Gemini Chat Model","Claude Chat Model","OpenAI Chat Model","n8n-nodes-browsercloud"]}


node_type: n8n-nodes-veridion.veridion
package_name: n8n-nodes-veridion
display_name: Veridion
description: Match and enrich company data using the Veridion API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: cosmin.veridion
author_github_url: https://github.com/cosmin-veridion/
npm_package_name: n8n-nodes-veridion
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.376Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "enrichCompany",
      "options": [
        {
          "name": "Enrich Company",
          "value": "enrichCompany",
          "action": "Enrich a company",
          "description": "Match a company and return its enriched Veridion profile"
        },
        {
          "name": "Company Search",
          "value": "searchCompanies",
          "action": "Search for companies",
          "description": "Discover companies by applying company-oriented search filters"
        },
        {
          "name": "Supplier Search",
          "value": "supplierSearch",
          "action": "Search for suppliers",
          "description": "Discover suppliers by product, service, and supplier-specific filters"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Enrich Company",
      "value": "enrichCompany",
      "action": "Enrich a company",
      "description": "Match a company and return its enriched Veridion profile"
    },
    {
      "name": "Company Search",
      "value": "searchCompanies",
      "action": "Search for companies",
      "description": "Discover companies by applying company-oriented search filters"
    },
    {
      "name": "Supplier Search",
      "value": "supplierSearch",
      "action": "Search for suppliers",
      "description": "Discover suppliers by product, service, and supplier-specific filters"
    }
  ]

npm_readme:
  # n8n-nodes-veridion

  An [n8n](https://n8n.io) community node for the Veridion company data APIs. It currently includes three operations inside a single `Veridion` node:

  - `Enrich Company`
  - `Company Search`
  - `Supplier Search`

  ---

  ## What it does

  - **Enrich Company** matches a known company and returns the enriched Veridion company profile.
  - **Company Search** discovers companies using location, industry, NAICS, keyword, and company-size filters.
  - **Supplier Search** discovers suppliers using grouped product keyword logic plus optional supplier and company-level filters.

  ---

  ## Installation

  ### Community Nodes UI (n8n ≥ 0.187)

  1. Open your n8n instance → **Settings → Community Nodes**.
  2. Click **Install a community node**.
  3. Enter `n8n-nodes-veridion` and confirm.

  ### Manual (self-hosted)

  ```bash
  cd ~/.n8n/custom   # or your n8n custom-extensions path
  npm install n8n-nodes-veridion
  ```

  Restart n8n after installation.

  ---

  ## Credentials

  Create a **Veridion API** credential in n8n and paste your Veridion API key into the **API Key** field. The key is sent via the `x-api-key` request header.

  ---

  ## Enrich Company

  ### Required

  | Parameter | Description | API field |
  |---|---|---|
  | Legal Name | Official registered name | `legal_names` (array) |
  | Commercial Name | Trading / brand name | `commercial_names` (array) |

  ### Optional

  | Parameter | Description | API field |
  |---|---|---|
  | Website | Company website domain or URL | `website` |
  | Address | Free-text address | `address_txt` |
  | Phone Number | Company phone number | `phone_number` |
  | Registry ID | Company registry or tax ID | `registry_id` |
  | Minimum Confidence Score | Match threshold 0–1 (default `0.6`) | `min_confidence_score` query param |

  Empty optional fields are stripped from the request body before sending.

  ---

  ## Search Operations

  ### Company Search

  - Shared filters: country, region, city, postcode, industries, NAICS, employee count, revenue, year founded, page size, pagination token
  - Company-only filters: keywords, exclude keywords, keyword strictness
  - Industry values are loaded live from `GET /industries/v0`

  ### Supplier Search

  - Shared filters: country, region, city, postcode, industries, NAICS, employee count, revenue, year founded, page size, pagination token
  - Supplier-only filters:
    - `Product Keywords Group 1`
    - `Product Keywords Group 2`
    - `Product Keywords Group 3`
    - `Product Exclude Keywords`
    - `Supplier Types`
    - `Proximity Address`
    - `Proximity Radius`
    - `Proximity Unit`
  - Supplier keyword groups follow the Make-style logic:
    - OR within a group
    - AND across groups

  ## Output structure

  ### Successful match (`HTTP 200`)

  The full Veridion company JSON object is passed through as the node output. Example top-level keys:

  ```json
  {
    "legal_name": "Acme Corporation",
    "website_domain": "acme.com",
    "main_country_code": "US",
    "employee_count": 520,
    "revenue_range": "10M-50M",
    "industries": ["Manufacturing", "Industrial Machinery"],
    ...
  }
  ```

  ### No match (`HTTP 202`)

  ```json
  {
    "matched": false,
    "reason": "No match found above the requested confidence threshold"
  }
  ```

  ### Errors

  `400` responses surface the API's error message as a descriptive `NodeApiError`. All other non-2xx statuses also throw a `NodeApiError` with the HTTP status code attached.

  ---

  ## Edge cases

  - If neither **Legal Name** nor **Commercial Name** is filled in, the node throws a descriptive error **before** making any API call.
  - `legal_names` and `commercial_names` are always sent as arrays (Veridion API requirement), even though the node accepts a single string.
  - Optional fields with empty string values are stripped from the request body.
  - Search responses can be returned either as one item per company or as a single full-response item, depending on `Output Mode`.

  ---

  ## Development

  ```bash
  git clone https://github.com/cosmin-veridion/n8n-nodes-veridion.git
  cd n8n-nodes-veridion
  npm install
  npm run build   # compile TypeScript → dist/
  npm run dev     # watch mode
  npm run lint    # ESLint check
  ```

  ---

  ## License

  MIT — see [LICENSE](LICENSE).

ai_documentation_summary:
  {"purpose":"Matches and enriches company data using the Veridion API. It also supports company discovery and supplier discovery through search operations.","capabilities":["Enrich Company: match a known company and return an enriched company profile","Company Search: search companies by location, industry, NAICS, keywords, employee count, revenue, and year founded","Supplier Search: search suppliers using grouped product keywords and optional supplier/company filters","Supports pagination and page size for search operations","Loads industry values dynamically from the Veridion industries endpoint","Supports proximity-based supplier search using address, radius, and unit filters"],"authentication":"Veridion API key required; configure a Veridion API credential in n8n and send the key in the x-api-key header","commonUseCases":["Enriching a company record from partial business information","Finding companies by geography, industry, or firmographic filters","Discovering suppliers based on product keywords and proximity"],"limitations":["Enrich Company requires at least Legal Name or Commercial Name before making an API call","No-match responses may return HTTP 202 with matched=false instead of a company profile","Search result output can vary by Output Mode, either one item per company or a single full-response item"],"relatedNodes":[]}


node_type: @itechnotion/n8n-nodes-headless-saas-infographics.headlessSaas
package_name: @itechnotion/n8n-nodes-headless-saas-infographics
display_name: Infographic Image Generator
description: Generate infographics, comics, cover images, social carousels and slide decks using PixlrAPI
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: itechnotion
author_github_url: https://github.com/itechnotion/n8n-nodes-headless-saas-infographics.git
npm_package_name: @itechnotion/n8n-nodes-headless-saas-infographics
npm_version: 1.0.9
community_fetched_at: 2026-07-14T14:40:34.377Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "infographic",
      "options": [
        {
          "name": "Comic",
          "value": "comic",
          "action": "Generate comic",
          "description": "Convert story or educational content into a comic panel (baoyu-comic)"
        },
        {
          "name": "Cover Image",
          "value": "coverImage",
          "action": "Generate cover image",
          "description": "Generate a hero/cover image for a blog or landing page (baoyu-cover-image)"
        },
        {
          "name": "Infographic",
          "value": "infographic",
          "action": "Generate infographic",
          "description": "Convert text into a structured visual infographic (baoyu-infographic)"
        },
        {
          "name": "Slide Deck",
          "value": "slideDeck",
          "action": "Generate slide deck",
          "description": "Generate a full business presentation deck (baoyu-slide-deck)"
        },
        {
          "name": "XHS / Social Carousel",
          "value": "xhsImages",
          "action": "Generate XHS carousel",
          "description": "Generate vertical carousel pages for social media (baoyu-xhs-images)"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Comic",
      "value": "comic",
      "action": "Generate comic",
      "description": "Convert story or educational content into a comic panel (baoyu-comic)"
    },
    {
      "name": "Cover Image",
      "value": "coverImage",
      "action": "Generate cover image",
      "description": "Generate a hero/cover image for a blog or landing page (baoyu-cover-image)"
    },
    {
      "name": "Infographic",
      "value": "infographic",
      "action": "Generate infographic",
      "description": "Convert text into a structured visual infographic (baoyu-infographic)"
    },
    {
      "name": "Slide Deck",
      "value": "slideDeck",
      "action": "Generate slide deck",
      "description": "Generate a full business presentation deck (baoyu-slide-deck)"
    },
    {
      "name": "XHS / Social Carousel",
      "value": "xhsImages",
      "action": "Generate XHS carousel",
      "description": "Generate vertical carousel pages for social media (baoyu-xhs-images)"
    }
  ]

npm_readme:
  # n8n-nodes-headless-saas-infographics

  An n8n community node for [Headless SaaS](https://headless-sass-bzzrfsh6ra-el.a.run.app) — generate infographics, comics, cover images, social carousels, and slide decks directly inside your n8n workflows using your API key.

  ---

  ## What this node does

  The **Headless SaaS** node lets you call the Headless SaaS image generation API directly from n8n. Choose from five generation types, configure style and layout options, and receive ready-to-use image URL(s) along with your remaining credit balance.

  ### Supported operations

  | Operation | Skill | Returns |
  |---|---|---|
  | Infographic | `baoyu-infographic` | Single image URL |
  | Comic | `baoyu-comic` | Single image URL |
  | Cover Image | `baoyu-cover-image` | Single image URL |
  | XHS / Social Carousel | `baoyu-xhs-images` | Array of image URLs |
  | Slide Deck | `baoyu-slide-deck` | Array of image URLs |

  ---

  ## Installation

  ### Community node (recommended)

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

  ```
  @itechnotion/n8n-nodes-headless-saas-infographics
  ```

  ### Manual (npm)

  ```bash
  npm install @itechnotion/n8n-nodes-headless-saas-infographics
  ```

  Or with pnpm:

  ```bash
  pnpm add @itechnotion/n8n-nodes-headless-saas-infographics
  ```

  ---

  ## Getting an API key

  1. Sign in to the [Headless SaaS dashboard](https://headless-sass-bzzrfsh6ra-el.a.run.app).
  2. Navigate to **API Keys** in the sidebar.
  3. Click **Generate Key** — your key will start with `pxl_live_`.
  4. Copy the key and store it somewhere safe (it won't be shown again).

  ---

  ## Credentials setup

  1. In n8n, open **Credentials → New Credential**.
  2. Search for **Headless SaaS API**.
  3. Paste your `pxl_live_...` key into the **API Key** field.
  4. Click **Save** — n8n will test the credential automatically.

  ---

  ## Operations reference

  ---

  ### 1. Infographic (`baoyu-infographic`)

  Automatically condenses textual content into highly scannable, visually structured maps and dashboards.

  - **Returns:** `imageUrl` (Single Image)

  ```json
  {
    "skill": "baoyu-infographic",
    "content": "Your markdown or body text...",
    "user": "optional_user_tracking_label",
    "options": {
      "language": "en",
      "layout": "bento-grid",
      "style": "retro-pop-grid"
    }
  }
  ```

  #### Available `layout` options

  | | | | |
  |---|---|---|---|
  | `bento-grid` | `binary-comparison` | `bridge` | `circular-flow` |
  | `comic-strip` | `comparison-matrix` | `dashboard` | `dense-modules` |
  | `funnel` | `hierarchical-layers` | `hub-spoke` | `iceberg` |
  | `isometric-map` | `jigsaw` | `linear-progression` | `periodic-table` |
  | `story-mountain` | `structural-breakdown` | `tree-branching` | `venn-diagram` |
  | `winding-roadmap` | | | |

  #### Available `style` options

  | | | | |
  |---|---|---|---|
  | `aged-academia` | `bold-graphic` | `chalkboard` | `claymation` |
  | `corporate-memphis` | `craft-handmade` | `cyberpunk-neon` | `ikea-manual` |
  | `kawaii` | `knolling` | `lego-brick` | `morandi-journal` |
  | `origami` | `pixel-art` | `pop-laboratory` | `retro-pop-grid` |
  | `storybook-watercolor` | `subway-map` | `technical-schematic` | `ui-wireframe` |

  ---

  ### 2. Comic (`baoyu-comic`)

  Converts any story or educational content into a hand-drawn knowledge comic panel.

  - **Returns:** `imageUrl` (Single Image)

  ```json
  {
    "skill": "baoyu-comic",
    "content": "Story content...",
    "options": {
      "language": "en",
      "art": "ligne-claire",
      "tone": "dramatic",
      "layout": "splash",
      "aspectRatio": "3:4"
    }
  }
  ```

  > **`aspectRatio` options:** `3:4`, `4:3`, `16:9`, `1:1`

  #### Available `art` (Art Styles)

  `chalk` · `ink-brush` · `ligne-claire` · `manga` · `realistic`

  #### Available `tone` (Emotional Tones)

  `action` · `dramatic` · `energetic` · `neutral` · `romantic` · `vintage` · `warm`

  #### Available `layout` (Panel Layouts)

  `cinematic` · `dense` · `mixed` · `splash` · `standard` · `webtoon`

  ---

  ### 3. Cover Image (`baoyu-cover-image`)

  Generates a hero/cover image optimised for a blog post or landing page header.

  - **Returns:** `imageUrl` (Single Image)

  ```json
  {
    "skill": "baoyu-cover-image",
    "content": "Article body...",
    "options": {
      "language": "en",
      "type": "hero",
      "palette": "cool",
      "rendering": "flat-vector",
      "mood": "balanced",
      "textDensity": "title-subtitle",
      "aspectRatio": "16:9"
    }
  }
  ```

  > **`mood` options:** `subtle`, `balanced`, `bold`  
  > **`textDensity` options:** `none`, `title-only`, `title-subtitle`, `text-rich`  
  > **`aspectRatio` options:** `16:9`, `4:3`, `1:1`, `9:16`

  #### Available `type` (Layout Types)

  `hero` · `conceptual` · `typography` · `metaphor` · `scene` · `minimal`

  #### Available `palette` (Color Palettes)

  `cool` · `dark` · `earth` · `elegant` · `mono` · `pastel` · `retro` · `vivid` · `warm`

  #### Available `rendering` (Visual Style)

  `chalk` · `digital` · `flat-vector` · `hand-drawn` · `painterly` · `pixel`

  ---

  ### 4. XHS / Social Carousel (`baoyu-xhs-images`)

  Generates an array of engaging, vertical carousel pages optimised for modern social media.

  - **Returns:** `imageUrls` (Array of Images)

  ```json
  {
    "skill": "baoyu-xhs-images",
    "content": "Content to transform into swipeable carousel...",
    "options": {
      "language": "en",
      "style": "notion",
      "layout": "canvas",
      "aspectRatio": "3:4"
    }
  }
  ```

  > **`aspectRatio` options:** `3:4`, `4:3`, `1:1`, `9:16`

  #### Available `style` (Visual Presets)

  `bold` · `chalkboard` · `cute` · `fresh` · `minimal` · `notion` · `pop` · `retro` · `study-notes` · `warm`

  #### Available `layout` (Information Hierarchy)

  `canvas` · `decorations` · `image-effects` · `typography`

  ---

  ### 5. Slide Deck (`baoyu-slide-deck`)

  Automatically generates a complete business presentation deck composed of multiple distinct slides.

  - **Returns:** `imageUrls` (Array of Images)

  ```json
  {
    "skill": "baoyu-slide-deck",
    "content": "Quarterly overview bullet points...",
    "options": {
      "language": "en",
      "style": "corporate",
      "aspectRatio": "16:9"
    }
  }
  ```

  > **`aspectRatio` options:** `16:9`, `4:3`, `1:1`

  #### Available `style` (Presentation Designs)

  | | | | |
  |---|---|---|---|
  | `blueprint` | `bold-editorial` | `chalkboard` | `corporate` |
  | `dark-atmospheric` | `editorial-infographic` | `fantasy-animation` | `intuition-machine` |
  | `minimal` | `notion` | `pixel-art` | `scientific` |
  | `sketch-notes` | `vector-illustration` | `vintage` | `watercolor` |

  ---

  ## Intelligent Auto-Selection (AI Director)

  If you are unsure which `style`, `palette`, or `layout` to use, simply **omit those keys** from your `options` object. The API will automatically run a preliminary Gemini Agent query to intelligently scan all available options and pick the best stylistic combination based on your content.

  ---

  ## Node output fields

  | Field | Description |
  |---|---|
  | `success` | `true` if generation succeeded |
  | `operation` | The operation used (e.g. `infographic`) |
  | `skill` | The skill string passed to the API |
  | `imageUrls` | Array of all generated image URLs |
  | `firstImageUrl` | Shortcut to the first image URL |
  | `imageUrl` | Alias for the first image URL (single-image operations) |
  | `creditsRemaining` | Credits remaining after this call |

  **Cost:** 1 credit per call.

  ---

  ## Example workflow

  ```
  [Manual Trigger]
        ↓
  [Set node]
    content = "A comparison of top 5 programming languages in 2025"
        ↓
  [Headless SaaS — Infographic]
    Layout: bento-grid
    Style:  bold-graphic
        ↓
  [Send Email / HTTP Request — use firstImageUrl]
  ```

  1. Add a **Manual Trigger** node.
  2. Add a **Set** node to define your `content` (or pass it from a previous step).
  3. Add the **Headless SaaS** node, select an operation, configure style options, and connect your credential.
  4. Run the workflow — the output will contain `firstImageUrl` (or `imageUrls` for multi-image operations) ready to use downstream.

  ---

  ## Error handling

  | HTTP status | Meaning |
  |---|---|
  | `401` | Invalid or missing API key |
  | `402` | Insufficient credits — top up your pack |
  | `400` | Missing `skill` or `content` field |
  | `502` | Generation failed upstream — retry |
  | `503` | Service temporarily unavailable |

  Enable **Continue On Fail** on the node to handle errors gracefully in your workflow.

  ---

  ## Supported languages

  | Code | Language |
  |---|---|
  | `en` | English |
  | `zh` | Chinese |
  | `es` | Spanish |
  | `fr` | French |
  | `de` | German |
  | `ja` | Japanese |
  | `ko` | Korean |
  | `pt` | Portuguese |

  ---

  ## Local development

  ```bash
  # Build the node
  pnpm run build

  # Link into your local n8n custom nodes directory
  mkdir -p ~/.n8n/custom
  cd ~/.n8n/custom
  npm install /absolute/path/to/n8n-nodes-headless-saas-infographics

  # Start n8n
  n8n start
  ```

  Then search for **Headless SaaS** in the node panel.

  ---

  ## License

  MIT © [Avkash Kakdia](mailto:avkash@itechnotion.com)

ai_documentation_summary:
  {"purpose":"Generates AI-powered visual content from text inside n8n workflows, including infographics, comics, cover images, social carousels, and slide decks. It calls the Headless SaaS image generation API and returns generated image URL(s) plus remaining credit balance.","capabilities":["Generate infographics from markdown or body text","Generate comic-style educational/story panels","Generate blog or landing-page cover images","Generate XHS/social carousel image sequences","Generate multi-slide presentation decks","Configure language, layout, style, tone, palette, rendering, and aspect ratio options","Return single image URLs or arrays of image URLs depending on operation"],"authentication":"API key required (Headless SaaS API key starting with pxl_live_)","commonUseCases":["Turn articles or notes into visual infographics","Create social media carousel posts from long-form content","Generate blog headers, cover images, and presentation slides","Convert stories or educational content into comics"],"limitations":["Requires a valid Headless SaaS API key and usage credits","Each operation only supports the specific skill/type mapped in the README","Some operation details may depend on the Headless SaaS API rather than n8n itself"],"relatedNodes":[]}


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

updated_at: 2026-07-14 14:40:34
author_name: sweeppea
author_github_url: https://github.com/Sweeppea-Development-Lab/sweeppea-n8n-nodes.git
npm_package_name: n8n-nodes-sweeppea
npm_version: 0.2.3
community_fetched_at: 2026-07-14T14:40:34.378Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "participant",
      "options": [
        {
          "name": "Participant",
          "value": "participant"
        },
        {
          "name": "Rule",
          "value": "rule"
        },
        {
          "name": "Sweepstake",
          "value": "sweepstake"
        },
        {
          "name": "Winner",
          "value": "winner"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Count",
          "value": "count",
          "action": "Count participants",
          "description": "Count participants in a sweepstake with optional filters"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a participant",
          "description": "Create a new participant in a sweepstake"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a participant",
          "description": "Delete a participant from a sweepstake"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a participant",
          "description": "Fetch a single participant by token, email or phone"
        },
        {
          "name": "Get Form Fields",
          "value": "getFormFields",
          "action": "Get sweepstake form fields",
          "description": "Get the entry form fields for a sweepstake"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many participants",
          "description": "Fetch many participants from a sweepstake"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "participant"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a rule",
          "description": "Create an official rules document for a sweepstake"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "rule"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Clone",
          "value": "clone",
          "action": "Clone a sweepstake",
          "description": "Duplicate an existing sweepstake with new dates and handler"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a sweepstake",
          "description": "Create a new sweepstake"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many sweepstakes",
          "description": "Fetch all sweepstakes for the authenticated account"
        },
        {
          "name": "Pause",
          "value": "pause",
          "action": "Pause a sweepstake",
          "description": "Pause an active sweepstake"
        },
        {
          "name": "Unpause",
          "value": "unpause",
          "action": "Unpause a sweepstake",
          "description": "Reactivate a paused sweepstake"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a sweepstake",
          "description": "Update an existing sweepstake name or dates"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sweepstake"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Draw",
          "value": "draw",
          "action": "Draw winners",
          "description": "Draw winners from a sweepstake using weighted random selection"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many winners",
          "description": "Fetch winners previously drawn from a sweepstake"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "winner"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Count",
      "value": "count",
      "action": "Count participants",
      "description": "Count participants in a sweepstake with optional filters",
      "resource": "participant"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a participant",
      "description": "Create a new participant in a sweepstake",
      "resource": "participant"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a participant",
      "description": "Delete a participant from a sweepstake",
      "resource": "participant"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a participant",
      "description": "Fetch a single participant by token, email or phone",
      "resource": "participant"
    },
    {
      "name": "Get Form Fields",
      "value": "getFormFields",
      "action": "Get sweepstake form fields",
      "description": "Get the entry form fields for a sweepstake",
      "resource": "participant"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many participants",
      "description": "Fetch many participants from a sweepstake",
      "resource": "participant"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a rule",
      "description": "Create an official rules document for a sweepstake",
      "resource": "rule"
    },
    {
      "name": "Clone",
      "value": "clone",
      "action": "Clone a sweepstake",
      "description": "Duplicate an existing sweepstake with new dates and handler",
      "resource": "sweepstake"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a sweepstake",
      "description": "Create a new sweepstake",
      "resource": "sweepstake"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many sweepstakes",
      "description": "Fetch all sweepstakes for the authenticated account",
      "resource": "sweepstake"
    },
    {
      "name": "Pause",
      "value": "pause",
      "action": "Pause a sweepstake",
      "description": "Pause an active sweepstake",
      "resource": "sweepstake"
    },
    {
      "name": "Unpause",
      "value": "unpause",
      "action": "Unpause a sweepstake",
      "description": "Reactivate a paused sweepstake",
      "resource": "sweepstake"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a sweepstake",
      "description": "Update an existing sweepstake name or dates",
      "resource": "sweepstake"
    },
    {
      "name": "Draw",
      "value": "draw",
      "action": "Draw winners",
      "description": "Draw winners from a sweepstake using weighted random selection",
      "resource": "winner"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many winners",
      "description": "Fetch winners previously drawn from a sweepstake",
      "resource": "winner"
    }
  ]

npm_readme:
  # Sweeppea Node for n8n

  Community node for integrating Sweeppea sweepstakes platform with n8n workflows.

  [Sweeppea](https://sweeppea.com) is a sweepstakes management platform that helps businesses create and manage promotional campaigns, contests, and giveaways.

  [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)
  - [AI Agent integration](#ai-agent-integration)
  - [Example workflows](#example-workflows)
  - [Resources](#resources)
  - [Version history](#version-history)

  ## Installation

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

  ## Operations

  The node groups operations into four resources. Every operation uses the same Sweeppea API V3 credential.

  ### Participant

  - **Count** — Aggregate counts (Participants / AMOE / Opt-Outs / Total) with optional date range
  - **Create** — Register a new participant in a sweepstake with dynamic field support
  - **Delete** — Remove a participant by `ParticipantToken`
  - **Get** — Fetch a single participant by email, phone or token
  - **Get Form Fields** — Retrieve the dynamic entry form fields for a sweepstake (useful for building chatbots or dynamic forms)
  - **Get Many** — Paginated list of participants with search and date filters

  ### Sweepstake

  - **Clone** — Duplicate an existing sweepstake (by Handler) with new dates and a new Handler
  - **Create** — Create a new sweepstake (SMS / Email / Social) with handler and date window
  - **Get Many** — Fetch every sweepstake on the authenticated account
  - **Pause** — Pause an active sweepstake
  - **Unpause** — Re-activate a paused sweepstake
  - **Update** — Patch name, start/end dates or start/end times

  ### Winner

  - **Draw** — Pick N winners using the weighted random algorithm, with optional group / spam / opt-out filters
  - **Get Many** — Paginated list of previously drawn winners with optional search

  ### Rule

  - **Create** — Submit an official rules HTML document for a sweepstake (first one is marked primary)

  ## Credentials

  You'll need to configure your Sweeppea API credentials:

  1. **API Token / API Key** — Your Sweeppea API authentication token
  2. **Environment** — Select your target environment:
     - **Production** (`https://api-v3.sweeppea.com`)
     - **Development** (for local testing with a custom API URL)

  ### How to get your API credentials

  1. Log in to your [Sweeppea Dashboard](https://app.sweeppea.com/api-dashboard)
  2. Navigate to the **API Keys** tab
  3. Generate or copy your API token
  4. Use this token in the n8n credential configuration

  The credential is tested against `POST /account/health-check`.

  ## Compatibility

  - Requires **Node.js 22.16+**
  - Tested with **n8n 2.20.x** and **n8n-workflow 2.16.x**
  - Supports the n8n AI Agent through the `usableAsTool` flag

  ## Usage

  ### Dynamic field support

  Each sweepstake can have different entry fields configured in the Sweeppea platform. Use **Participant → Get Form Fields** to fetch the schema, then **Participant → Create** to register data that matches it.

  **Example flow:**

  1. **Get Form Fields** — pull the required fields for a sweepstake.
  2. Build a dynamic form (or AI chatbot) that collects the required data.
  3. **Create** — register the participant with the collected data.

  ### Field name format

  When submitting participant data, field names must use underscores instead of spaces — that is what Sweeppea expects on the wire:

  - "First Name" → `First_Name`
  - "How did you find us?" → `How_did_you_find_us?`

  The body sent to `POST /participants/add` has this shape:

  ```json
  {
    "lang"             : "EN",
    "source"           : "n8n-integration",
    "sweepstakesToken" : "uuid-v4-string",
    "entryPageFields"  : {
      "KeyEmail"       : "user@example.com",
      "KeyPhoneNumber" : "1234567890",
      "BonusEntries"   : 0,
      "Fields"         : {
        "First_Name"    : "John",
        "Last_Name"     : "Doe",
        "Email"         : "user@example.com",
        "Mobile_Number" : "1234567890",
        "Custom_Field"  : "value"
      }
    }
  }
  ```

  ### Mandatory error handling for participant creation

  When using **Participant → Create**, configure error handling at the node level:

  1. Click on the Sweeppea node.
  2. Go to the **Settings** tab (not Parameters).
  3. Under **On Error**, change from "Stop Workflow" to **Continue**.

  ![Error Handling Configuration](examples/sweeppea-on-error-choose-continue.png)

  This lets the node pass error responses (duplicate entries, validation failures, etc.) as data to the next node so you can branch on them, instead of crashing the workflow. The 0.2.0 release standardises this behaviour across every operation — `Sweepstake not found` (404) and `Validation failed` (400) errors that previously short-circuited the workflow are now caught by the same `Continue On Fail` path.

  ## AI Agent integration

  The node is registered with `usableAsTool: true`, so the n8n **AI Agent** node can discover and invoke any of its operations as a tool.

  ### Quick start (community nodes as tools)

  On self-hosted n8n you may need to enable community-node tool usage. Set this environment variable on your n8n process:

  ```
  N8N_COMMUNITY_PACKAGES_ENABLED=true
  ```

  Then add a Sweeppea node to an AI Agent's tool list — n8n will expose every operation (e.g. `participant:create`, `winner:draw`) as a callable function.

  > **Heads up:** Some n8n 2.x users have reported empty responses when the AI Agent V3 calls community-node tools. If you hit this and the verification matrix below stays green for direct workflow invocation, the MCP server below is a battle-tested alternative.

  ### Advanced: connect the MCP Client Tool

  For Tier 2/3 operations not exposed by this node (Groups, Files, Notes, Calendar, Tickets, Billing, etc.) Sweeppea publishes a Streamable-HTTP MCP server at **`https://mcp.sweeppea.com`** (71 tools, v1.17.0+).

  In n8n, add an **MCP Client Tool** node to your AI Agent with:

  - **URL:** `https://mcp.sweeppea.com`
  - **Transport:** Streamable HTTP
  - **Auth:** Bearer (your Sweeppea API token, same one you use for the credential here)

  The MCP Client and the Sweeppea node coexist — use the node for the deterministic Tier 1 flows above and the MCP for everything else, especially conversational / admin tasks.

  ## Example workflows

  This package includes ready-to-import example workflows in the `/examples` folder:

  ### 1. Simple participant registration

  **File:** `sweeppea-create-participant.json`

  ![Simple Workflow](examples/sweeppea-create-participant.png)

  A straightforward workflow that collects participant data through an AI chatbot:

  - AI Agent asks for First Name, Last Name, Email, and Mobile Number conversationally
  - Transform node converts the collected data to Sweeppea API format
  - Creates participant in the sweepstake

  **How to use:**

  1. Import the workflow JSON file into your n8n instance.
  2. Configure your Sweeppea credentials.
  3. Replace `YOUR_SWEEPSTAKES_TOKEN_HERE` with your actual sweepstakes token.
  4. Activate the workflow.

  ### 2. Dynamic form registration

  **File:** `sweeppea-create-participant-dynamic-form.json`

  ![Dynamic Workflow](examples/sweeppea-create-participant-dynamic-form.png)

  An advanced workflow that automatically adapts to any sweepstake configuration:

  - Fetches the sweepstake form fields dynamically from the API
  - Builds a custom AI system prompt based on the field configuration
  - AI Agent collects all fields conversationally (even optional ones)
  - Transform node dynamically maps collected data to API format
  - Creates participant with all custom fields

  **How to use:**

  1. Import the workflow JSON file into your n8n instance.
  2. Configure your Sweeppea credentials.
  3. Replace `YOUR_SWEEPSTAKES_TOKEN_HERE` with your actual sweepstakes token (appears in two nodes).
  4. Activate the workflow.

  > The dynamic workflow automatically adapts to any sweepstake configuration, making it ideal for use across multiple campaigns with different field requirements.

  ### 3. v0.2.0 showcase — all 15 operations on one canvas

  **File:** `sweeppea-showcase.json`
  **Explainer:** [`sweeppea-showcase.md`](examples/sweeppea-showcase.md)

  End-to-end demo that exercises every operation the node exposes, grouped by resource into 5 colour-coded lanes. Designed for screenshots, code review, and local QA.

  ![Showcase full canvas](examples/sweeppea-showcase-canvas-full.png)

  A `Manual Trigger` feeds a `Set Config` node that stores the test `sweepstakesToken`, a per-execution unique email built from `$execution.id`, and the demo participant data. From there the flow fans out into:

  - **Lane 1 — Sweepstake**: Get Many → Pause → Unpause → Update (rename) → Update (revert). Create and Clone are present but disabled (would persist data).
  - **Lane 2 — Participant (read-only)**: Get Form Fields → Count → Get Many → Get (by email).
  - **Lane 3 — Participant CRUD round-trip**: Create → Get (just created) → Delete. The chain cleans up after itself.
  - **Lane 4 — Winner**: Get Many. Draw is disabled (would mark a real winner).
  - **Lane 5 — Rule**: Create is disabled (would persist a rules document).

  Top half of the canvas (Sweepstake + Participant read-only lanes):

  ![Showcase top half](examples/sweeppea-showcase-canvas-top.png)

  Bottom half (CRUD round-trip, Winner, Rule):

  ![Showcase bottom half](examples/sweeppea-showcase-canvas-bottom.png)

  After a successful run, every Sweeppea API call is verifiable in the Sweeppea dashboard: the test participants persist (with `n8n-demo-<execution.id>@example.com` as their email), the rename/revert round-trip leaves the sweepstake untouched, and Winner: Draw (when enabled) marks a real winner that shows up under the **Winners** tab.

  **How to use:**

  1. Import the JSON into your n8n instance (paste into the canvas or use the menu).
  2. Re-bind the Sweeppea API credential on any one node — n8n will offer to apply it to the rest.
  3. Replace the `sweepstakesToken` value in `Set Config` with one of your sweepstakes.
  4. Click **Execute workflow**. A clean run lights 11 nodes green; the 4 disabled nodes stay grey.
  5. To exercise a disabled op, click its toggle and execute again. Clean up the artefacts it creates from the Sweeppea dashboard.

  ### 4. Smart Registration v2 — conversational entry with live count

  **File:** `sweeppea-smart-registration-v2.json`

  Evolution of the v0.1 dynamic-form pattern with two new touches from v0.2.0:

  - **`Participant: Count`** runs before the AI conversation, so the bot can tell the user *"you'll be participant #N+1 once registered"* in real time.
  - **`Participant: Get Form Fields`** still drives the dynamic field collection, but the AI Agent's system prompt is rebuilt every turn with the current count baked in.

  Flow:

  ```
  Chat → Count → Get Form Fields → Build Dynamic Prompt → AI Agent → Switch
                                                                        ├─ ready → Transform → Register → Reply (success/duplicate/error)
                                                                        └─ continue → Reply (next question)
  ```

  The AI Agent collects required fields one at a time, validates email/phone, and emits a JSON action when ready. A Code node maps that JSON onto the `participant:create` body shape exactly the way the v0.1 example did, so existing prompt engineering carries over.

  ### 5. Customer Self-Service — read-only chatbot with Sweeppea tools

  **File:** `sweeppea-customer-self-service.json`

  A chat agent for **participants** of an existing sweepstake. The AI Agent has three Sweeppea nodes attached as tools (all read-only, no destructive ops):

  - **check_entry** — `Participant: Get` by email (answers *"am I in?"*)
  - **entry_count** — `Participant: Count` (answers *"how many people entered?"*)
  - **winners_list** — `Winner: Get Many` (answers *"who won?"*)

  Each tool uses n8n's `$fromAI()` for parameters the agent should fill (e.g. the email for `check_entry`), with the `sweepstakesToken` hard-coded since a self-service bot serves a single sweep.

  > Pick a chat model that reliably handles multi-step tool-calling. Smaller models may loop without ever invoking the tools.

  ### 6. Admin Command Bot — destructive ops by chat ⚠️

  **File:** `sweeppea-admin-command-bot.json`

  For the sweepstake **owner**, not for participants. Five Sweeppea tools attached, including destructive ones:

  - **list_sweeps** — `Sweepstake: Get Many` (no params, safe)
  - **pause_sweep** / **unpause_sweep** — `Sweepstake: Pause` / `Unpause`
  - **rename_sweep** — `Sweepstake: Update` (name only)
  - **draw_winners** — `Winner: Draw` (DESTRUCTIVE, marks real winners)

  The system prompt instructs the agent to confirm before any destructive action ("Are you sure you want to draw 3 winners from sweep X?") and to refer to sweeps by their handler/name rather than just the token. Run it against a test sweepstake until you trust the conversation flow.

  ### Dev-mode note

  If you're testing one of these workflows under `n8n-node dev` (the local development mode of `@n8n/node-cli`), n8n registers the package under the `CUSTOM.` namespace instead of `n8n-nodes-sweeppea.`. After importing, do a find-replace in the workflow JSON:

  ```
  n8n-nodes-sweeppea.sweeppea     → CUSTOM.sweeppea
  n8n-nodes-sweeppea.sweeppeaTool → CUSTOM.sweeppeaTool
  ```

  Users who install the node via `npm i n8n-nodes-sweeppea` don't need this — the published types work directly.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Sweeppea Platform](https://sweeppea.com)
  - [Sweeppea API V3 Documentation](https://apidocs.sweeppea.com)
  - [Sweeppea MCP Server Documentation](https://mcpdocs.sweeppea.com)

  ## Version history

  ### 0.2.3

  - **AI Agent tool-mode fix for `Participant → Create`**. The body inputs (`Email`, `Phone Number`, `Bonus Entries`, `Custom Fields`, plus `Language` / `Source` under a new `Create Options` collection) are now exposed as top-level node parameters, so an AI Agent can fill them via `$fromAI()` when the Sweeppea node is used as a tool.
  - Backwards compatible with v0.1 / v0.2 workflows: when the new parameters are left at their defaults (empty string / `0` / `{}`), the operation falls back to `items[i].json` exactly as before. The `Additional Fields → Use Input Data` toggle and the `entryPageFields` payload shape (underscored keys like `First_Name`) are unchanged.
  - Priority order: explicit node parameter > input item field > hardcoded default.

  ### 0.2.2

  - Addresses n8n community-node review feedback (no runtime behavior change):
    - Removed the dead `requestDefaults` block from the node description. This node is programmatic (`execute()`); every request already resolves its full URL through `sweeppeaApiRequest` → `httpRequestWithAuthentication`, so `requestDefaults` (a declarative-style config) was never consumed.
    - Codex `nodeVersion` set to the fixed schema value `"1.0"` (it is unrelated to the package's runtime version).
    - Codex `categories` reduced to supported values only: `Marketing & Content`, `Sales`, `Data & Storage`.

  ### 0.2.1

  - Adds a GitHub Actions publish workflow (`.github/workflows/publish.yml`) that runs lint + build and publishes to npm with **provenance attestation** on every `v*.*.*` tag push. Required for the n8n Verified Community Nodes program (effective May 1, 2026).
  - No functional changes versus 0.2.0; this release exists so the published package carries a provenance signature.

  ### 0.2.0

  - New build system based on `@n8n/node-cli` (TypeScript 5.9, ESLint 9, flat config); the legacy regex transpiler is gone.
  - Modular code layout under `nodes/Sweeppea/{descriptions,operations}/` plus a shared `GenericFunctions.ts` helper.
  - New resources and operations:
    - **Participant**: Count, Get, Get Many, Delete (plus the existing Create and Get Form Fields)
    - **Sweepstake**: Clone, Create, Get Many, Pause, Unpause, Update
    - **Winner**: Draw, Get Many
    - **Rule**: Create
  - AI Agent support via `usableAsTool: true`.
  - Unified error handling: all API failures are mapped to `NodeApiError` / `NodeOperationError`, and `Continue On Fail` now applies consistently to every operation (including 404 on Get Form Fields, which previously short-circuited even with the flag on).
  - Credential icon added (no change to credential schema; previously stored credentials keep working).
  - Requires Node.js 22.16+.

  ### 0.1.x

  - Initial release with `Participant → Get Form Fields` and `Participant → Create`.
  - Dynamic field loading based on sweepstake configuration (API V3).
  - Multi-environment support (production, development).
  - AI chatbot integration support.

  ## License

  [MIT](LICENSE)

  ---

  © 2026 Sweeppea Development Lab

ai_documentation_summary:
  {"purpose":"Integrates the Sweeppea sweepstakes management platform with n8n workflows to create, manage, and analyze promotional campaigns, contests, and giveaways. It also supports AI Agent usage as a callable tool.","capabilities":["Participant count aggregation with optional date range","Create, delete, retrieve, and list participants with search/date filters","Fetch dynamic sweepstake form fields for building forms or chatbots","Clone, create, pause, unpause, update, and list sweepstakes","Draw winners using weighted random selection with optional group/spam/opt-out filters","List previously drawn winners with optional search","Submit official rules HTML documents for a sweepstake","Expose all operations for n8n AI Agent tool integration"],"authentication":"API token/API key required using Sweeppea API V3 credentials; environment can be Production or Development (custom API URL).","commonUseCases":["Managing sweepstakes campaigns and lifecycle in n8n","Registering participants from forms or chatbots using dynamic field schemas","Drawing winners and reviewing winner history","Syncing or auditing participant and sweepstake data from Sweeppea","Using Sweeppea operations as tools inside an n8n AI Agent workflow"],"limitations":["Participant creation requires node-level error handling to be set to Continue so validation/duplicate-entry errors can be handled gracefully","Uses the Sweeppea API V3 credential only","Requires Node.js 22.16+ and tested versions of n8n 2.20.x / n8n-workflow 2.16.x","Some n8n AI Agent V3 setups may return empty responses for community-node tools"],"relatedNodes":["n8n AI Agent","MCP Client Tool"]}


