# nodes

node_type: n8n-nodes-ocean.ocean
package_name: n8n-nodes-ocean
display_name: Ocean.io
description: Find, enrich, and reveal company and people data from Ocean.io
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: bcharleson
author_github_url: https://github.com/bcharleson/
npm_package_name: n8n-nodes-ocean
npm_version: 1.0.8
community_fetched_at: 2026-07-14T14:40:34.641Z
ai_summary_generated_at: 2026-07-06 09:55:11
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "company",
      "options": [
        {
          "name": "Autocomplete",
          "value": "autocomplete",
          "description": "Low-cost lookup (0.1 credits/run) — match partial names, titles, and locations before Search or Enrich"
        },
        {
          "name": "Company",
          "value": "company",
          "description": "Find lookalike companies or enrich one company by website"
        },
        {
          "name": "Other",
          "value": "other",
          "description": "Check credit balance, download filter lists, or warmup domains"
        },
        {
          "name": "Person",
          "value": "person",
          "description": "Find lists of people or enrich one lead by name, email, or LinkedIn"
        },
        {
          "name": "Reveal",
          "value": "reveal",
          "description": "Get email addresses or phone numbers for people you already found"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search Companies",
          "value": "search",
          "action": "Search companies",
          "description": "Find companies similar to ones you already know — e.g. companies like topoffunnel.com (1 credit per result)"
        },
        {
          "name": "Enrich Company",
          "value": "enrich",
          "action": "Enrich company data",
          "description": "Look up one company by website domain — e.g. stripe.com returns firmographics (1 credit)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "company"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search People",
          "value": "search",
          "action": "Search people",
          "description": "Find a list of people matching job title, company, country, and other filters (1–3 credits per person)"
        },
        {
          "name": "Enrich Person",
          "value": "enrich",
          "action": "Enrich person data",
          "description": "Look up one person — fill in LinkedIn, email, name, or first + last name (3 credits per person)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "revealEmails",
      "options": [
        {
          "name": "Reveal Emails",
          "value": "revealEmails",
          "action": "Reveal emails",
          "description": "Get email addresses for people you already found via Search or Enrich (uses email credits, results arrive via webhook)"
        },
        {
          "name": "Reveal Phones",
          "value": "revealPhones",
          "action": "Reveal phones",
          "description": "Get phone numbers for people you already found via Search or Enrich (uses phone credits, results arrive via webhook)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reveal"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "companies",
      "options": [
        {
          "name": "Autocomplete Companies",
          "value": "companies",
          "action": "Autocomplete companies",
          "description": "Match partial company names to domain + name suggestions (0.1 credits/call) — use before Enrich or Search"
        },
        {
          "name": "Autocomplete Job Titles",
          "value": "jobTitles",
          "action": "Autocomplete job titles",
          "description": "Match partial titles to Ocean job-title keywords (0.1 credits/call) — use before Search People"
        },
        {
          "name": "Autocomplete Keywords",
          "value": "keywords",
          "action": "Autocomplete keywords",
          "description": "Match partial text to valid company-search keywords (0.1 credits/call)"
        },
        {
          "name": "Autocomplete Locations",
          "value": "locations",
          "action": "Autocomplete locations",
          "description": "Match city/region names to Ocean location values (0.1 credits/call)"
        },
        {
          "name": "Autocomplete Skills",
          "value": "skills",
          "action": "Autocomplete skills",
          "description": "Match partial text to valid people-search skills (0.1 credits/call)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "autocomplete"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getBalance",
      "options": [
        {
          "name": "Get Credit Balance",
          "value": "getBalance",
          "action": "Get credit balance",
          "description": "See how many Ocean credits you have left (free — no credits used)"
        },
        {
          "name": "Get Data Fields",
          "value": "getDataFields",
          "action": "Get data fields",
          "description": "Download Ocean's full list of industries, countries, and filter options (free — useful for reference)"
        },
        {
          "name": "Warmup Companies",
          "value": "warmupCompanies",
          "action": "Warmup companies",
          "description": "Pre-load company data so later searches on those domains run faster"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "other"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Search Companies",
      "value": "search",
      "action": "Search companies",
      "description": "Find companies similar to ones you already know — e.g. companies like topoffunnel.com (1 credit per result)",
      "resource": "company"
    },
    {
      "name": "Enrich Company",
      "value": "enrich",
      "action": "Enrich company data",
      "description": "Look up one company by website domain — e.g. stripe.com returns firmographics (1 credit)",
      "resource": "company"
    },
    {
      "name": "Search People",
      "value": "search",
      "action": "Search people",
      "description": "Find a list of people matching job title, company, country, and other filters (1–3 credits per person)",
      "resource": "person"
    },
    {
      "name": "Enrich Person",
      "value": "enrich",
      "action": "Enrich person data",
      "description": "Look up one person — fill in LinkedIn, email, name, or first + last name (3 credits per person)",
      "resource": "person"
    },
    {
      "name": "Reveal Emails",
      "value": "revealEmails",
      "action": "Reveal emails",
      "description": "Get email addresses for people you already found via Search or Enrich (uses email credits, results arrive via webhook)",
      "resource": "reveal"
    },
    {
      "name": "Reveal Phones",
      "value": "revealPhones",
      "action": "Reveal phones",
      "description": "Get phone numbers for people you already found via Search or Enrich (uses phone credits, results arrive via webhook)",
      "resource": "reveal"
    },
    {
      "name": "Autocomplete Companies",
      "value": "companies",
      "action": "Autocomplete companies",
      "description": "Match partial company names to domain + name suggestions (0.1 credits/call) — use before Enrich or Search",
      "resource": "autocomplete"
    },
    {
      "name": "Autocomplete Job Titles",
      "value": "jobTitles",
      "action": "Autocomplete job titles",
      "description": "Match partial titles to Ocean job-title keywords (0.1 credits/call) — use before Search People",
      "resource": "autocomplete"
    },
    {
      "name": "Autocomplete Keywords",
      "value": "keywords",
      "action": "Autocomplete keywords",
      "description": "Match partial text to valid company-search keywords (0.1 credits/call)",
      "resource": "autocomplete"
    },
    {
      "name": "Autocomplete Locations",
      "value": "locations",
      "action": "Autocomplete locations",
      "description": "Match city/region names to Ocean location values (0.1 credits/call)",
      "resource": "autocomplete"
    },
    {
      "name": "Autocomplete Skills",
      "value": "skills",
      "action": "Autocomplete skills",
      "description": "Match partial text to valid people-search skills (0.1 credits/call)",
      "resource": "autocomplete"
    },
    {
      "name": "Get Credit Balance",
      "value": "getBalance",
      "action": "Get credit balance",
      "description": "See how many Ocean credits you have left (free — no credits used)",
      "resource": "other"
    },
    {
      "name": "Get Data Fields",
      "value": "getDataFields",
      "action": "Get data fields",
      "description": "Download Ocean's full list of industries, countries, and filter options (free — useful for reference)",
      "resource": "other"
    },
    {
      "name": "Warmup Companies",
      "value": "warmupCompanies",
      "action": "Warmup companies",
      "description": "Pre-load company data so later searches on those domains run faster",
      "resource": "other"
    }
  ]

npm_readme:
  <p align="center">
    <a href="https://ocean.io" target="_blank">
      <img src="https://raw.githubusercontent.com/bcharleson/n8n-nodes-ocean/main/nodes/Ocean/ocean-logo.png" alt="Ocean.io" width="280" />
    </a>
  </p>

  <p align="center">
    <strong>Lookalike company &amp; people discovery for n8n</strong><br />
    Search, enrich, reveal, and normalize prospect data — directly inside your workflows.
  </p>

  <p align="center">
    <a href="https://www.npmjs.com/package/n8n-nodes-ocean"><img src="https://img.shields.io/npm/v/n8n-nodes-ocean.svg?style=flat-square" alt="npm version" /></a>
    <a href="https://www.npmjs.com/package/n8n-nodes-ocean"><img src="https://img.shields.io/npm/dm/n8n-nodes-ocean.svg?style=flat-square" alt="npm downloads" /></a>
    <a href="LICENSE.md"><img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" alt="MIT license" /></a>
    <a href="https://docs.n8n.io/integrations/community-nodes/"><img src="https://img.shields.io/badge/n8n-community_node-FF6D5A?style=flat-square&logo=n8n&logoColor=white" alt="n8n community node" /></a>
  </p>

  ---

  ## What is this?

  **n8n-nodes-ocean** is a community node that connects [n8n](https://n8n.io) to the [Ocean.io](https://ocean.io) API.

  [Ocean.io](https://ocean.io) specializes in **lookalike discovery** — finding companies and people similar to your best customers — plus **firmographic enrichment** and **contact reveal**. This node wraps those capabilities in a single, workflow-friendly **Ocean.io** node with clear helper text, dropdown filters, and patterns built for real automation (CRM sync, lead enrichment, outbound prospecting).

  > **Install:** `n8n-nodes-ocean` on npm · **Node name in n8n:** `Ocean.io`

  ---

  ## Why use it?

  | Use case | What you do in n8n |
  | --- | --- |
  | **Find lookalike companies** | Search from seed domains (e.g. `stripe.com`) with country, industry, and size filters |
  | **Enrich a lead or account** | Look up a company by domain or a person by name, email, or LinkedIn |
  | **Build prospect lists** | Search people by job title, company domain, and country |
  | **Fix messy CRM data** | Autocomplete company names, titles, and locations before a paid search |
  | **Get verified contact info** | Reveal work emails or phone numbers for people already found in Ocean |
  | **Guard credit spend** | Check balance before large runs; warmup domains for bulk jobs |

  Built for **backend automation** — not just API coverage. Every resource includes in-node guidance, sensible defaults, and execute-time validation so workflows fail clearly instead of silently.

  ---

  ## Operations overview

  **14 operations** across **5 resources**:

  | Resource | Operations | Best for |
  | --- | --- | --- |
  | **Company** | Search Companies, Enrich Company | Lookalike discovery & firmographics |
  | **Person** | Search People, Enrich Person | Prospect lists & lead enrichment |
  | **Reveal** | Reveal Emails, Reveal Phones | Verified contact discovery (async) |
  | **Autocomplete** | Companies, Job Titles, Keywords, Skills, Locations | Normalizing messy input before Search/Enrich |
  | **Other** | Get Credit Balance, Get Data Fields, Warmup Companies | Ops, reference data & performance prep |

  ---

  ## Installation

  ### n8n (recommended)

  1. Open **Settings → Community Nodes**
  2. Click **Install**
  3. Enter `n8n-nodes-ocean`
  4. Confirm and **restart n8n**

  [Official n8n community node install guide →](https://docs.n8n.io/integrations/community-nodes/installation/)

  ### Self-hosted / manual

  ```bash
  npm install n8n-nodes-ocean
  ```

  Set `N8N_CUSTOM_EXTENSIONS` to include the package path, then restart n8n.

  ---

  ## Authentication

  1. Get an API key from [Ocean.io → Settings → API Keys](https://app.ocean.io/)
  2. In n8n, add credentials of type **Ocean.io API**
  3. Paste your key and click **Test** (calls `GET /v2/credits/balance`)

  ---

  ## Resources & operations

  ### Company

  #### Search Companies
  Find companies similar to your seed domains — Ocean's core lookalike engine.

  - **Lookalike Domains** — comma-separated domains (e.g. `topoffunnel.com, stripe.com`); URLs normalized automatically
  - **Countries & Industries** — searchable dropdowns loaded from Ocean's data fields
  - **Employee count** — min/max filters
  - **Companies Filters JSON** — optional advanced filters

  #### Enrich Company
  Look up one company by website domain (e.g. `stripe.com`). Accepts full URLs — `https` and `www` are stripped automatically.

  ---

  ### Person

  #### Search People
  Build lists of prospects with filters that map to Ocean's v3 people search.

  - **Job Titles**, **Company Domains**, **Countries**
  - **Lookalike People** — LinkedIn handles for similarity search
  - **People Filters JSON** / **Companies Filters JSON** — advanced filters

  #### Enrich Person
  Look up one person. Provide **at least one** identifier:

  - LinkedIn URL
  - Email
  - Full name
  - First name + last name

  **Tip:** Name + work email (e.g. `Brandon Charleson` + `brandon@company.com`) works well for lead enrichment.

  ---

  ### Reveal

  Discover **verified** work emails or phone numbers for people you already found via Search or Enrich.

  > **Important:** Reveal is **asynchronous**. The node returns `{ "status": "in progress" }` immediately. Ocean delivers results to your **Webhook URL** when ready.

  **Requirements:**
  - **Ocean person IDs** from Search People or Enrich Person (`id` field in output)
  - **Webhook URL** — for in-workflow delivery, use `{{ $execution.resumeUrl }}` and add a **Wait** node (mode: *On Webhook Call*) after Reveal

  **Account note:** Reveal requires email/phone verification to be enabled on your Ocean.io organization. If disabled, the API returns `403`.

  ---

  ### Autocomplete

  Cheap, synchronous lookup to fix spelling before Search or Enrich.

  | Operation | Returns | Typical next step |
  | --- | --- | --- |
  | **Companies** | Name + domain suggestions | Enrich Company or Lookalike Domains |
  | **Job Titles** | Title strings | Search People → Job Titles |
  | **Keywords** | Keyword strings | Companies Filters JSON |
  | **Skills** | Skill strings | People Filters JSON |
  | **Locations** | City/region strings | Location filters |

  **Cost:** 0.1 credits per call (flat, not per suggestion). Does not return full profiles or contact info.

  ---

  ### Other

  | Operation | Cost | Purpose |
  | --- | --- | --- |
  | **Get Credit Balance** | Free | Check standard, email, and phone credit pools |
  | **Get Data Fields** | Free | Raw lists (industries, countries, etc.) — most users rely on in-node dropdowns instead |
  | **Warmup Companies** | Free | Pre-load domains before bulk search/enrich |

  ---

  ## Example workflows

  ### Lookalike company discovery
  ```
  Manual Trigger → Ocean.io (Company → Search Companies)
    Lookalike Domains: topoffunnel.com
    Limit: 25
  → Spreadsheet / CRM / Slack
  ```

  ### CRM lead enrichment
  ```
  HubSpot Trigger → Ocean.io (Person → Enrich Person)
    Person Name: {{ $json.firstname }} {{ $json.lastname }}
    Email: {{ $json.email }}
  → HubSpot (update contact)
  ```

  ### Normalize then enrich
  ```
  Google Sheets → Ocean.io (Autocomplete → Companies)
    Query: {{ $json.companyName }}
  → Set (pick best domain) → Ocean.io (Company → Enrich Company)
  ```

  ### Search → reveal email (async)
  ```
  Ocean.io (Person → Search People) → Ocean.io (Reveal → Reveal Emails)
    Ocean Person IDs: {{ $json.id }}
    Webhook URL: {{ $execution.resumeUrl }}
  → Wait (On Webhook Call) → CRM / sequencer
  ```

  ---

  ## Credit costs

  Rates below reflect Ocean.io's [v3 unified credit model](https://app.ocean.io/docs/getting-started/credits). Check your plan if you're on enterprise/legacy pricing.

  | Operation | Cost |
  | --- | --- |
  | Search Companies | 0.2 credits / company returned |
  | Search People | 0.2 credits / person returned |
  | Enrich Company | 0.1 credits / result |
  | Enrich Person | 0.1 credits / result |
  | Autocomplete (all types) | 0.1 credits / call |
  | Reveal Emails | 1 credit / email **found** |
  | Reveal Phones | 10 credits / phone **found** |
  | Get Credit Balance | Free |
  | Get Data Fields | Free |
  | Warmup Companies | Free |

  Use **Other → Get Credit Balance** before large batch runs.

  ---

  ## Developer setup

  ```bash
  git clone https://github.com/bcharleson/n8n-nodes-ocean.git
  cd n8n-nodes-ocean
  npm install
  npm run dev:full          # local n8n at http://localhost:5678
  npm run verify:audit      # build + package checks + n8n-node lint
  OCEAN_API_TOKEN=xxx npm run verify:e2e   # live API smoke test (optional)
  ```

  ---

  ## Error handling

  The node surfaces clear errors for common Ocean API responses:

  - Insufficient credits (`402`)
  - Invalid or missing API key (`403`)
  - Validation errors (`422`)
  - Reveal not enabled on account (`403`)

  Enable **Continue on Fail** on the node to capture errors per item instead of stopping the workflow.

  Ocean.io rate limit: **300 requests/minute**.

  ---

  ## Links

  | | |
  | --- | --- |
  | **npm** | https://www.npmjs.com/package/n8n-nodes-ocean |
  | **GitHub** | https://github.com/bcharleson/n8n-nodes-ocean |
  | **Ocean.io API docs** | https://docs.ocean.io/ |
  | **Ocean.io dashboard** | https://app.ocean.io/ |
  | **n8n community nodes** | https://docs.n8n.io/integrations/community-nodes/ |
  | **Report an issue** | https://github.com/bcharleson/n8n-nodes-ocean/issues |

  ---

  ## License

  [MIT](LICENSE.md)

  ## Support

  - **This node:** [Open a GitHub issue](https://github.com/bcharleson/n8n-nodes-ocean/issues)
  - **Ocean.io API:** [Ocean.io support](https://ocean.io/support)

ai_documentation_summary:
  {"purpose":"Connects n8n to the Ocean.io API for lookalike company and people discovery, enrichment, contact reveal, and data normalization inside workflows. It is designed for automated prospecting, CRM cleanup, and lead enrichment use cases.","capabilities":["Search Companies using lookalike seed domains with country, industry, employee count, and advanced filter support","Enrich Company by website domain or full URL","Search People by job title, company domain, country, and LinkedIn-based similarity search","Enrich Person using LinkedIn URL, email, full name, or first and last name","Reveal verified work emails or phone numbers for existing Ocean people records","Autocomplete companies, job titles, keywords, skills, and locations for input normalization","Get credit balance","Get data fields","Warmup companies for bulk operations"],"authentication":"API key required via Ocean.io API credentials in n8n","commonUseCases":["Find lookalike companies from seed domains for outbound prospecting","Enrich leads and accounts with firmographic or contact data","Build prospect lists from people search filters","Normalize messy CRM data before enrichment or search","Reveal verified contact information for known prospects"],"limitations":["Reveal operations are asynchronous and return immediately with an in-progress status","Reveal requires a webhook URL and typically a Wait node for in-workflow completion handling","Reveal requires email/phone verification to be enabled on the Ocean.io organization; otherwise requests return 403"],"relatedNodes":[]}


node_type: @open-banking-io/n8n-nodes-open-banking-io.openBankingIo
package_name: @open-banking-io/n8n-nodes-open-banking-io
display_name: Open Banking IO
description: Read bank accounts, balances and transactions from open-banking.io
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: open-banking.io
author_github_url: https://github.com/open-banking-io/n8n.git
npm_package_name: @open-banking-io/n8n-nodes-open-banking-io
npm_version: 0.2.1
community_fetched_at: 2026-07-14T14:40:34.642Z
ai_summary_generated_at: 2026-07-06 09:55:11
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "transaction",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Bank",
          "value": "bank"
        },
        {
          "name": "Connection",
          "value": "connection"
        },
        {
          "name": "Sync",
          "value": "sync"
        },
        {
          "name": "Transaction",
          "value": "transaction"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many accounts",
          "description": "List all accounts with decrypted details and balances"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many transactions",
          "description": "List an account statement with decrypted details"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transaction"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many connections",
          "description": "List bank connections (consents)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connection"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many banks",
          "description": "List available banks (ASPSPs)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "bank"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "account",
      "options": [
        {
          "name": "Sync Account",
          "value": "account",
          "action": "Sync an account",
          "description": "Pull fresh transactions for one account from the bank"
        },
        {
          "name": "Sync All",
          "value": "all",
          "action": "Sync all accounts",
          "description": "Pull fresh transactions for every account with an active session"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sync"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many accounts",
      "description": "List all accounts with decrypted details and balances",
      "resource": "account"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many transactions",
      "description": "List an account statement with decrypted details",
      "resource": "transaction"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many connections",
      "description": "List bank connections (consents)",
      "resource": "connection"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many banks",
      "description": "List available banks (ASPSPs)",
      "resource": "bank"
    },
    {
      "name": "Sync Account",
      "value": "account",
      "action": "Sync an account",
      "description": "Pull fresh transactions for one account from the bank",
      "resource": "sync"
    },
    {
      "name": "Sync All",
      "value": "all",
      "action": "Sync all accounts",
      "description": "Pull fresh transactions for every account with an active session",
      "resource": "sync"
    }
  ]

npm_readme:
  <p align="center">
    <a href="https://open-banking.io">
      <img src="https://raw.githubusercontent.com/open-banking-io/clients/main/.github/logo.png" alt="open-banking.io" height="56">
    </a>
  </p>

  # @open-banking-io/n8n-nodes-open-banking-io

  An [n8n](https://n8n.io) community node for [open-banking.io](https://open-banking.io).

  Pull your bank **accounts**, **balances** and **transactions** into n8n workflows.
  All sensitive data is decrypted **locally inside your n8n instance** using your
  exported private key — the open-banking.io service only ever returns ciphertext it
  cannot read (zero-knowledge), and your private key never leaves n8n or goes on the wire.

  This package has **zero runtime dependencies**: decryption uses the Web Crypto API
  built into Node, so it qualifies as a verified n8n community node.

  ## Nodes

  - **Open Banking IO** (action) — `Account: Get Many`, `Transaction: Get Many`
    (date range + auto-pagination via *Return All*), `Connection: Get Many`,
    `Bank: Get Many`, `Sync: Account` / `Sync: All`.
  - **Open Banking IO Trigger** (polling) — fires when new transactions arrive across
    all your accounts, remembering the last one seen between polls.

  ## Installation

  ### Self-hosted (any n8n)

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

  ```
  @open-banking-io/n8n-nodes-open-banking-io
  ```

  ### Manual / development

  ```bash
  npm install
  npm run build
  # then link into your n8n custom extensions folder (~/.n8n/custom)
  ```

  ## Credentials

  Create an **Open Banking IO API** credential and paste the **credentials bundle JSON**
  you exported from open-banking.io (or the CLI). It contains `apiBaseUrl`, `apiKey`
  and `encryptionKey.privateKey`. Click **Test** to verify it can reach the API.

  Optionally set **API Base URL Override** to point the credential at a different
  environment (e.g. `https://api.staging.open-banking.io` or a local instance) without
  re-exporting a bundle. Leave it empty to use the `apiBaseUrl` from the bundle.

  ## Usage notes

  - Monetary amounts are returned as **decimal strings** (e.g. `"828.13"`) — never as
    floats — so you don't lose precision. Convert deliberately if you need arithmetic.
  - *Transaction → Get Many* with **Return All** enabled pages through the whole
    statement automatically; otherwise it returns up to **Limit** rows.
  - The Trigger backfills *Initial Lookback (Days)* on its first run, then only emits
    transactions newer than the last one it saw.

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Reads bank accounts, balances, transactions, connections, and bank data from open-banking.io for use in n8n workflows. It also supports syncing account data and provides a trigger for new transaction events across all accounts.","capabilities":["Get many accounts","Get many transactions with date range filtering and Return All auto-pagination","Get many connections","Get many banks","Sync a single account","Sync all accounts","Trigger on new transactions across all accounts with polling and backfill lookback"],"authentication":"Open Banking IO API credential using an exported credentials bundle JSON containing apiBaseUrl, apiKey, and encryptionKey.privateKey; optional API Base URL Override supported","commonUseCases":["Import bank account and transaction data into workflows","Monitor accounts for new transactions","Sync banking data for downstream processing or reporting"],"limitations":["Sensitive data is decrypted locally in the n8n instance and requires the exported private key","Monetary amounts are returned as decimal strings, not floats","Transaction Get Many returns up to the Limit unless Return All is enabled","The trigger only checks for transactions newer than the last seen event after the initial lookback"],"relatedNodes":["Open Banking IO Trigger"]}


node_type: @open-banking-io/n8n-nodes-open-banking-io.openBankingIoTrigger
package_name: @open-banking-io/n8n-nodes-open-banking-io
display_name: Open Banking IO Trigger
description: Starts a workflow when new bank transactions arrive on open-banking.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: open-banking.io
author_github_url: https://github.com/open-banking-io/n8n.git
npm_package_name: @open-banking-io/n8n-nodes-open-banking-io
npm_version: 0.2.1
community_fetched_at: 2026-07-14T14:40:34.643Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  <p align="center">
    <a href="https://open-banking.io">
      <img src="https://raw.githubusercontent.com/open-banking-io/clients/main/.github/logo.png" alt="open-banking.io" height="56">
    </a>
  </p>

  # @open-banking-io/n8n-nodes-open-banking-io

  An [n8n](https://n8n.io) community node for [open-banking.io](https://open-banking.io).

  Pull your bank **accounts**, **balances** and **transactions** into n8n workflows.
  All sensitive data is decrypted **locally inside your n8n instance** using your
  exported private key — the open-banking.io service only ever returns ciphertext it
  cannot read (zero-knowledge), and your private key never leaves n8n or goes on the wire.

  This package has **zero runtime dependencies**: decryption uses the Web Crypto API
  built into Node, so it qualifies as a verified n8n community node.

  ## Nodes

  - **Open Banking IO** (action) — `Account: Get Many`, `Transaction: Get Many`
    (date range + auto-pagination via *Return All*), `Connection: Get Many`,
    `Bank: Get Many`, `Sync: Account` / `Sync: All`.
  - **Open Banking IO Trigger** (polling) — fires when new transactions arrive across
    all your accounts, remembering the last one seen between polls.

  ## Installation

  ### Self-hosted (any n8n)

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

  ```
  @open-banking-io/n8n-nodes-open-banking-io
  ```

  ### Manual / development

  ```bash
  npm install
  npm run build
  # then link into your n8n custom extensions folder (~/.n8n/custom)
  ```

  ## Credentials

  Create an **Open Banking IO API** credential and paste the **credentials bundle JSON**
  you exported from open-banking.io (or the CLI). It contains `apiBaseUrl`, `apiKey`
  and `encryptionKey.privateKey`. Click **Test** to verify it can reach the API.

  Optionally set **API Base URL Override** to point the credential at a different
  environment (e.g. `https://api.staging.open-banking.io` or a local instance) without
  re-exporting a bundle. Leave it empty to use the `apiBaseUrl` from the bundle.

  ## Usage notes

  - Monetary amounts are returned as **decimal strings** (e.g. `"828.13"`) — never as
    floats — so you don't lose precision. Convert deliberately if you need arithmetic.
  - *Transaction → Get Many* with **Return All** enabled pages through the whole
    statement automatically; otherwise it returns up to **Limit** rows.
  - The Trigger backfills *Initial Lookback (Days)* on its first run, then only emits
    transactions newer than the last one it saw.

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Starts a workflow when new bank transactions arrive from open-banking.io. The package also provides nodes for pulling bank accounts, balances, transactions, connections, and banks into n8n workflows.","capabilities":["Trigger workflow on new transactions across all linked accounts","Get many accounts","Get many balances","Get many transactions with date range filtering","Auto-paginate transaction retrieval with Return All","Get many connections","Get many banks","Sync a single account","Sync all accounts"],"authentication":"Open Banking IO API credential using a credentials bundle JSON containing apiBaseUrl, apiKey, and encryptionKey.privateKey; optional API Base URL Override supported","commonUseCases":["Start automations when new bank transactions are detected","Import bank transactions into n8n for finance or accounting workflows","Fetch balances and account data for dashboards or reporting","Synchronize account data from open-banking.io on demand"],"limitations":["The Trigger polls for new transactions rather than using real-time webhooks","Transaction amounts are returned as decimal strings, so arithmetic must be handled deliberately","Transaction Get Many returns only up to the specified Limit unless Return All is enabled","The Trigger only emits transactions newer than the last seen transaction after the initial lookback"],"relatedNodes":["Open Banking IO"]}


node_type: @ffmpeg-micro/n8n-nodes-ffmpeg-micro.ffmpegMicro
package_name: @ffmpeg-micro/n8n-nodes-ffmpeg-micro
display_name: FFmpeg Micro
description: Transcode video and audio, generate subtitles, and manage media files with the FFmpeg Micro API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: javidjamae
author_github_url: https://github.com/javidjamae/ffmpeg-micro-n8n-community-node.git
npm_package_name: @ffmpeg-micro/n8n-nodes-ffmpeg-micro
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.643Z
ai_summary_generated_at: 2026-07-06 09:55:11
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "transcode",
      "options": [
        {
          "name": "Transcode",
          "value": "transcode"
        },
        {
          "name": "Transcription",
          "value": "transcribe"
        },
        {
          "name": "File",
          "value": "file"
        },
        {
          "name": "Custom API Call",
          "value": "custom"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Cancel",
          "value": "cancel",
          "action": "Cancel a transcode job",
          "description": "Cancel a pending or running transcode job"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a transcode job",
          "description": "Queue a new video or audio transcode job"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a transcode job",
          "description": "Retrieve the status and details of a transcode job"
        },
        {
          "name": "Get Download URL",
          "value": "getDownloadUrl",
          "action": "Get a transcode download URL",
          "description": "Get a signed download URL for a completed transcode job"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List transcode jobs",
          "description": "List transcode jobs with optional filters"
        },
        {
          "name": "Wait for Completion",
          "value": "wait",
          "action": "Wait for a transcode job",
          "description": "Poll a transcode job until it reaches a terminal status"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transcode"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a transcription job",
          "description": "Generate an SRT subtitle file from a video or audio URL"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a transcription job",
          "description": "Retrieve the status of a transcription job"
        },
        {
          "name": "Get Download URL",
          "value": "getDownloadUrl",
          "action": "Get a transcription download URL",
          "description": "Get a signed URL to download the SRT subtitle file"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List transcription jobs",
          "description": "List transcription jobs"
        },
        {
          "name": "Wait for Completion",
          "value": "wait",
          "action": "Wait for a transcription job",
          "description": "Poll a transcription job until it reaches a terminal status"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transcribe"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload a file",
          "description": "Upload a file to FFmpeg Micro storage and get a gs:// URL to use as input for other operations"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "apiCall",
      "options": [
        {
          "name": "Make an API Call",
          "value": "apiCall",
          "action": "Make an API call",
          "description": "Call any FFmpeg Micro API endpoint. Authentication is handled for you."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "custom"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Cancel",
      "value": "cancel",
      "action": "Cancel a transcode job",
      "description": "Cancel a pending or running transcode job",
      "resource": "transcode"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a transcode job",
      "description": "Queue a new video or audio transcode job",
      "resource": "transcode"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a transcode job",
      "description": "Retrieve the status and details of a transcode job",
      "resource": "transcode"
    },
    {
      "name": "Get Download URL",
      "value": "getDownloadUrl",
      "action": "Get a transcode download URL",
      "description": "Get a signed download URL for a completed transcode job",
      "resource": "transcode"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List transcode jobs",
      "description": "List transcode jobs with optional filters",
      "resource": "transcode"
    },
    {
      "name": "Wait for Completion",
      "value": "wait",
      "action": "Wait for a transcode job",
      "description": "Poll a transcode job until it reaches a terminal status",
      "resource": "transcode"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a transcription job",
      "description": "Generate an SRT subtitle file from a video or audio URL",
      "resource": "transcribe"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a transcription job",
      "description": "Retrieve the status of a transcription job",
      "resource": "transcribe"
    },
    {
      "name": "Get Download URL",
      "value": "getDownloadUrl",
      "action": "Get a transcription download URL",
      "description": "Get a signed URL to download the SRT subtitle file",
      "resource": "transcribe"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List transcription jobs",
      "description": "List transcription jobs",
      "resource": "transcribe"
    },
    {
      "name": "Wait for Completion",
      "value": "wait",
      "action": "Wait for a transcription job",
      "description": "Poll a transcription job until it reaches a terminal status",
      "resource": "transcribe"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload a file",
      "description": "Upload a file to FFmpeg Micro storage and get a gs:// URL to use as input for other operations",
      "resource": "file"
    },
    {
      "name": "Make an API Call",
      "value": "apiCall",
      "action": "Make an API call",
      "description": "Call any FFmpeg Micro API endpoint. Authentication is handled for you.",
      "resource": "custom"
    }
  ]

npm_readme:
  # n8n-nodes-ffmpeg-micro

  This is an n8n community node for the [FFmpeg Micro](https://www.ffmpeg-micro.com) API. It lets you transcode video and audio, generate SRT subtitles with Whisper transcription, upload media files, and react to completed jobs, all from your n8n workflows.

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

  ## Installation

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

  For self-hosted n8n, install from Settings, then Community Nodes, using the package name `@ffmpeg-micro/n8n-nodes-ffmpeg-micro`.

  ## Credentials

  You need an FFmpeg Micro API key. Generate one in the [FFmpeg Micro dashboard](https://www.ffmpeg-micro.com/dashboard/api-keys). There is a free tier, so you can try the node without a paid plan.

  Create an "FFmpeg Micro API" credential in n8n and paste your key. The credential test makes a read-only call to verify it.

  ## Nodes

  ### FFmpeg Micro

  The main node. Operations by resource:

  | Resource | Operation | What it does |
  |---|---|---|
  | Transcode | Create | Queue a video or audio transcode job. Supports multiple inputs, per-input FFmpeg flags, custom FFmpeg options, virtual options like `@text-overlay` and `@quote-card`, and composition filter graphs for concat and crossfade. |
  | Transcode | Get | Fetch a job's status and details. |
  | Transcode | Get Download URL | Get a signed download URL for a completed job. |
  | Transcode | List | List jobs with status and date filters. |
  | Transcode | Cancel | Cancel a pending or running job. |
  | Transcode | Wait for Completion | Poll a job until it completes, fails, or is canceled. |
  | Transcription | Create | Generate SRT subtitles from a video or audio URL. Supports about 99 languages plus translate-to-English. |
  | Transcription | Get / Get Download URL / List / Wait for Completion | Same patterns as transcode. |
  | File | Upload | Upload a binary file to FFmpeg Micro storage. Returns a `gs://` URL you can use as transcode or transcription input. |
  | Custom API Call | Make an API Call | Call any FFmpeg Micro endpoint with authentication handled for you. |

  ### FFmpeg Micro Trigger

  A polling trigger that starts your workflow when transcode or transcription jobs reach completed or failed status. Failed jobs include the `error_message` field so you can route failures.

  ## Typical patterns

  **Short jobs, single workflow.** Upload a File, Create a transcode, Wait for Completion, Get Download URL. The wait operation polls every few seconds and works well for jobs that finish within a few minutes.

  **Long jobs, two workflows.** Workflow A creates the job and ends. Workflow B starts from the FFmpeg Micro Trigger and picks up when the job completes. This is the reliable pattern for large files and slow transcodes.

  **Subtitles.** Create a transcription with a video URL, wait for completion, then Get Download URL for the SRT file.

  ## Compatibility

  Requires n8n 1.x. Tested against the live FFmpeg Micro API.

  ## Resources

  * [FFmpeg Micro documentation](https://www.ffmpeg-micro.com/docs)
  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## Development

  ```bash
  npm install
  npm run dev     # loads the node in a local n8n at localhost:5678
  npm run lint
  npm run build
  ```

  Releases are published to npm through GitHub Actions with a provenance statement. Run `npm run release` to version, tag, and push.

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This node integrates n8n with the FFmpeg Micro API to transcode video/audio, generate SRT subtitles via Whisper transcription, upload media files, and monitor job completion. It also includes a trigger for reacting to completed or failed media jobs.","capabilities":["Queue video or audio transcode jobs","Fetch transcode job status and details","Get signed download URLs for completed jobs","List transcode jobs with status and date filters","Cancel pending or running transcode jobs","Wait/poll for transcode job completion, failure, or cancellation","Generate SRT subtitles from video or audio URLs","Get transcription job status and details","Get signed download URLs for completed transcription jobs","List transcription jobs with status and date filters"],"authentication":"API key required via an FFmpeg Micro API credential in n8n","commonUseCases":["Transcode uploaded media files and retrieve a downloadable output URL","Generate subtitles from audio or video content and download the SRT file","Build workflows that react to media job completion or failure using the trigger","Manage and monitor batch media processing jobs from n8n"],"limitations":["The wait operations poll every few seconds and are best suited for jobs that finish within a few minutes","Long-running jobs are recommended to be handled with a separate workflow and the trigger","Requires n8n 1.x"],"relatedNodes":["FFmpeg Micro Trigger"]}


node_type: @ffmpeg-micro/n8n-nodes-ffmpeg-micro.ffmpegMicroTrigger
package_name: @ffmpeg-micro/n8n-nodes-ffmpeg-micro
display_name: FFmpeg Micro Trigger
description: Starts a workflow when FFmpeg Micro jobs reach completed or failed status
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: javidjamae
author_github_url: https://github.com/javidjamae/ffmpeg-micro-n8n-community-node.git
npm_package_name: @ffmpeg-micro/n8n-nodes-ffmpeg-micro
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.644Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  # n8n-nodes-ffmpeg-micro

  This is an n8n community node for the [FFmpeg Micro](https://www.ffmpeg-micro.com) API. It lets you transcode video and audio, generate SRT subtitles with Whisper transcription, upload media files, and react to completed jobs, all from your n8n workflows.

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

  ## Installation

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

  For self-hosted n8n, install from Settings, then Community Nodes, using the package name `@ffmpeg-micro/n8n-nodes-ffmpeg-micro`.

  ## Credentials

  You need an FFmpeg Micro API key. Generate one in the [FFmpeg Micro dashboard](https://www.ffmpeg-micro.com/dashboard/api-keys). There is a free tier, so you can try the node without a paid plan.

  Create an "FFmpeg Micro API" credential in n8n and paste your key. The credential test makes a read-only call to verify it.

  ## Nodes

  ### FFmpeg Micro

  The main node. Operations by resource:

  | Resource | Operation | What it does |
  |---|---|---|
  | Transcode | Create | Queue a video or audio transcode job. Supports multiple inputs, per-input FFmpeg flags, custom FFmpeg options, virtual options like `@text-overlay` and `@quote-card`, and composition filter graphs for concat and crossfade. |
  | Transcode | Get | Fetch a job's status and details. |
  | Transcode | Get Download URL | Get a signed download URL for a completed job. |
  | Transcode | List | List jobs with status and date filters. |
  | Transcode | Cancel | Cancel a pending or running job. |
  | Transcode | Wait for Completion | Poll a job until it completes, fails, or is canceled. |
  | Transcription | Create | Generate SRT subtitles from a video or audio URL. Supports about 99 languages plus translate-to-English. |
  | Transcription | Get / Get Download URL / List / Wait for Completion | Same patterns as transcode. |
  | File | Upload | Upload a binary file to FFmpeg Micro storage. Returns a `gs://` URL you can use as transcode or transcription input. |
  | Custom API Call | Make an API Call | Call any FFmpeg Micro endpoint with authentication handled for you. |

  ### FFmpeg Micro Trigger

  A polling trigger that starts your workflow when transcode or transcription jobs reach completed or failed status. Failed jobs include the `error_message` field so you can route failures.

  ## Typical patterns

  **Short jobs, single workflow.** Upload a File, Create a transcode, Wait for Completion, Get Download URL. The wait operation polls every few seconds and works well for jobs that finish within a few minutes.

  **Long jobs, two workflows.** Workflow A creates the job and ends. Workflow B starts from the FFmpeg Micro Trigger and picks up when the job completes. This is the reliable pattern for large files and slow transcodes.

  **Subtitles.** Create a transcription with a video URL, wait for completion, then Get Download URL for the SRT file.

  ## Compatibility

  Requires n8n 1.x. Tested against the live FFmpeg Micro API.

  ## Resources

  * [FFmpeg Micro documentation](https://www.ffmpeg-micro.com/docs)
  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## Development

  ```bash
  npm install
  npm run dev     # loads the node in a local n8n at localhost:5678
  npm run lint
  npm run build
  ```

  Releases are published to npm through GitHub Actions with a provenance statement. Run `npm run release` to version, tag, and push.

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when FFmpeg Micro transcode or transcription jobs reach completed or failed status. It is a polling trigger that lets workflows react to finished jobs and inspect failures.","capabilities":["Polls FFmpeg Micro jobs for status changes","Triggers on completed jobs","Triggers on failed jobs","Exposes failed job error_message for routing","Supports both transcode and transcription job types"],"authentication":"FFmpeg Micro API key required via an n8n credential","commonUseCases":["Start a workflow after a long-running video or audio transcode finishes","Route successful and failed transcription or transcode jobs to different workflow paths","Continue processing after FFmpeg Micro completes subtitle generation or media conversion"],"limitations":["Polling-based trigger rather than real-time webhooks","Only reacts to completed or failed job statuses"],"relatedNodes":["FFmpeg Micro","Webhook","Wait"]}


node_type: n8n-nodes-realtyapi.realtyApi
package_name: n8n-nodes-realtyapi
display_name: RealtyAPI
description: Call any RealtyAPI real-estate provider and endpoint
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: realtyapi
author_github_url: https://github.com/realtyapi/
npm_package_name: n8n-nodes-realtyapi
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.645Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  # n8n-nodes-realtyapi

  An [n8n](https://n8n.io) community node for **[RealtyAPI](https://realtyapi.io)** — call any of
  RealtyAPI's 33 real-estate providers (Zillow, Redfin, Realtor, Zoopla, Rightmove, Bayut, and more)
  and 400+ endpoints directly from your workflows.

  ## Usage

  Pull real-estate data — property listings, valuations, agent and owner details, market stats, and
  more — from 33 providers (Zillow, Redfin, Realtor, Zoopla, Rightmove, Bayut, and more) without
  writing a single HTTP request.

  Add the **RealtyAPI** node to a workflow, then:

  1. **Pick a provider** from the API dropdown (e.g. Zillow).
  2. **Pick an endpoint** from the Endpoint dropdown (e.g. "By Property Address").
  3. **Fill in the fields** the node shows for that endpoint — required and optional inputs appear
     automatically, with dropdowns for any preset choices.
  4. **Run it.** The results flow straight into the next node in your workflow.

  Every provider and endpoint RealtyAPI offers is available in the dropdowns, and new ones show up on
  their own — so you always have the full, up-to-date catalog.

  ## Installation

  **n8n Cloud / self-hosted (GUI):** Settings → Community Nodes → Install → `n8n-nodes-realtyapi`.

  **Manual (self-hosted):**

  ```bash
  npm install n8n-nodes-realtyapi
  ```

  ## Credentials

  1. Get your API key (starts with `rt_`) from the [RealtyAPI dashboard](https://realtyapi.io).
  2. In n8n, create a **RealtyAPI API** credential and paste the key.

  The key is stored encrypted by n8n and sent only as the `x-realtyapi-key` header. It is never part
  of this open-source package.

  ## Local development

  ```bash
  npm install
  npm run build          # tsc + copy icons to dist/
  npm link               # then `npm link n8n-nodes-realtyapi` in your ~/.n8n/custom folder
  ```

  See the [n8n community node docs](https://docs.n8n.io/integrations/community-nodes/) for linking
  into a local n8n instance.

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Connects n8n workflows to RealtyAPI so you can query real-estate data from many providers and endpoints directly without writing HTTP requests. It supports pulling listings, valuations, agent/owner details, market stats, and similar property data.","capabilities":["Access 33 real-estate providers such as Zillow, Redfin, Realtor, Zoopla, Rightmove, and Bayut","Call 400+ RealtyAPI endpoints directly from n8n","Select provider and endpoint from dropdowns in the node UI","Automatically load required and optional fields for the chosen endpoint","Retrieve property listings, valuations, agent details, owner details, and market statistics"],"authentication":"API key required (RealtyAPI key starting with rt_), configured in n8n as a RealtyAPI API credential and sent as the x-realtyapi-key header","commonUseCases":["Fetching property listings from real-estate marketplaces","Looking up property valuations by address","Retrieving agent or owner details for a property","Collecting market statistics and other real-estate data"],"limitations":["Requires a valid RealtyAPI account and API key","Only supports providers and endpoints available through RealtyAPI"],"relatedNodes":[]}


node_type: n8n-nodes-shortgenius.shortGeniusTrigger
package_name: n8n-nodes-shortgenius
display_name: ShortGenius Trigger
description: Triggers when a ShortGenius lifecycle event fires
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: linh1211
author_github_url: https://github.com/ShortGenius/
npm_package_name: n8n-nodes-shortgenius
npm_version: 0.1.0
community_fetched_at: 2026-07-14T14:40:34.646Z
ai_summary_generated_at: 2026-07-06 09:55:11
npm_readme:
  # n8n-nodes-shortgenius

  n8n community node for [ShortGenius](https://shortgenius.com) — generate AI videos, images, and audio, and manage your ShortGenius account.

  ## Install

  In your n8n instance:

  ```
  npm install n8n-nodes-shortgenius
  ```

  Restart n8n. The package ships two nodes (`ShortGenius` and `ShortGenius Trigger`) and one credential type (`ShortGenius API`).

  ## Authentication

  1. Sign in to ShortGenius and open **Developers → API keys** at https://shortgenius.com/developers/keys to create an API key (it starts with `sg-`).
  2. In n8n, **Credentials → New → ShortGenius API** and paste the key, then hit **Test**. The default base URL (`https://api.shortgenius.com/v1`) is correct for production.
  3. ShortGenius is single-user — the API key alone authenticates. There is no organization to configure. The connection test calls `GET /credits`.

  ## Nodes

  ### ShortGenius (action)

  | Resource | Operations |
  |---|---|
  | Video | List, Get, Create, Draft, Draft From URL, Draft From Script, Draft Quiz, Draft News, Generate Topics |
  | Series | List, Get, Create |
  | Image | List, Get, Create, List Styles |
  | Audio | List, Get, Create Speech |
  | Voice | List, Get |
  | Music | List Genres, List Tracks |
  | Connection | List |
  | Credits | Get Balance |
  | Webhook | List Endpoints, Create Endpoint, Delete Endpoint |

  Videos are drafted first (write/review a script), then created (rendered). Created videos, generated images, and synthesized audio render asynchronously — poll the corresponding **Get** operation until the state is `completed`, or use the **ShortGenius Trigger** node to react to completion webhooks.

  ### ShortGenius Trigger

  Subscribes to ShortGenius lifecycle events and emits a workflow run per delivery, with the event's inner `data` payload as the item JSON. Supported events:

  - `video.created`
  - `video.completed`
  - `video.published`
  - `series.created`
  - `image.completed`
  - `audio.completed`
  - `*` (all events)

  Activating the trigger registers a webhook endpoint at ShortGenius pointing at the n8n production URL. Deactivating it deletes the endpoint so you do not leak orphan subscriptions. Every delivery is verified per-request (HMAC-SHA256 over `<timestamp>.<rawBody>`, 5-minute timestamp window) using the `ShortGenius-Signature` header.

  ## Use as an AI Agent tool

  The ShortGenius node is marked `usableAsTool`, so an n8n **AI Agent** can call it directly: add the AI Agent node, click the **Tool** connector, and pick **ShortGenius**. The agent can then draft and render videos, generate images, synthesize speech, and more from natural-language instructions.

  Self-hosted instances must allow community nodes as tools by setting the environment variable `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true`.

  ## Links

  - Integrations landing page: https://shortgenius.com/integrations/n8n
  - API docs: https://shortgenius.com/developers
  - Source: https://github.com/ShortGenius/shorts/tree/main/packages/n8n-node

  ## License

  MIT.

ai_documentation_summary:
  {"purpose":"ShortGenius Trigger listens for ShortGenius lifecycle webhooks and starts an n8n workflow whenever a matching event occurs. It delivers the event's inner data payload to the workflow as item JSON.","capabilities":["Subscribes to ShortGenius lifecycle events","Emits workflow runs for video, series, image, and audio events","Supports specific events such as video.created, video.completed, video.published, series.created, image.completed, audio.completed, and all events (*)","Automatically registers a webhook endpoint on activation","Automatically deletes the webhook endpoint on deactivation","Verifies incoming webhook deliveries with HMAC-SHA256 signatures"],"authentication":"API key required via the ShortGenius API credential (ShortGenius single-user API key starting with sg-). The trigger uses the webhook signature header (ShortGenius-Signature) for request verification.","commonUseCases":["Start a workflow when a ShortGenius video finishes rendering","React to image or audio generation completion events","Automate downstream actions when a new series or published video event occurs","Process all ShortGenius lifecycle events in a single workflow"],"limitations":["Only supports the listed lifecycle events and wildcard all-events subscription","Requires the n8n instance to be reachable via the production webhook URL for activation to work","Webhook verification uses a 5-minute timestamp window"],"relatedNodes":["ShortGenius","n8n AI Agent"]}


node_type: n8n-nodes-shortgenius.shortGenius
package_name: n8n-nodes-shortgenius
display_name: ShortGenius
description: Generate AI videos, images, and audio, and manage your ShortGenius account
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: linh1211
author_github_url: https://github.com/ShortGenius/
npm_package_name: n8n-nodes-shortgenius
npm_version: 0.1.0
community_fetched_at: 2026-07-14T14:40:34.647Z
ai_summary_generated_at: 2026-07-06 09:55:11
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "video",
      "options": [
        {
          "name": "Video",
          "value": "video"
        },
        {
          "name": "Series",
          "value": "series"
        },
        {
          "name": "Image",
          "value": "image"
        },
        {
          "name": "Audio",
          "value": "audio"
        },
        {
          "name": "Voice",
          "value": "voice"
        },
        {
          "name": "Music",
          "value": "music"
        },
        {
          "name": "Connection",
          "value": "connection"
        },
        {
          "name": "Credits",
          "value": "credits"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List videos",
          "description": "List the videos in your account"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a video",
          "description": "Get a single video by ID"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a video",
          "description": "Render a video from drafted content"
        },
        {
          "name": "Draft",
          "value": "draft",
          "action": "Draft a video",
          "description": "Write a video script from a topic"
        },
        {
          "name": "Draft From URL",
          "value": "draftUrl",
          "action": "Draft a video from a URL",
          "description": "Summarize a webpage into a video script"
        },
        {
          "name": "Draft From Script",
          "value": "draftScript",
          "action": "Draft a video from a script",
          "description": "Build scenes from your own script"
        },
        {
          "name": "Draft Quiz",
          "value": "draftQuiz",
          "action": "Draft a quiz video",
          "description": "Write a quiz video from a topic"
        },
        {
          "name": "Draft News",
          "value": "draftNews",
          "action": "Draft a news video",
          "description": "Write a news video from a topic"
        },
        {
          "name": "Generate Topics",
          "value": "topics",
          "action": "Generate video topics",
          "description": "Brainstorm video topic ideas"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "video"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List series",
          "description": "List the series in your account"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a series",
          "description": "Get a single series and its episodes by ID"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a series",
          "description": "Start a recurring, scheduled video series"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "series"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List images",
          "description": "List the images in your account"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an image",
          "description": "Get a single image by ID"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create an image",
          "description": "Generate an image from a prompt"
        },
        {
          "name": "List Styles",
          "value": "styles",
          "action": "List image styles",
          "description": "List the available image styles"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "image"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List audio",
          "description": "List the audio clips in your account"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an audio clip",
          "description": "Get a single audio clip by ID"
        },
        {
          "name": "Create Speech",
          "value": "speech",
          "action": "Create speech audio",
          "description": "Generate text-to-speech audio"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "audio"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List voices",
          "description": "List the available text-to-speech voices"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a voice",
          "description": "Get a single voice by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "voice"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "genres",
      "options": [
        {
          "name": "List Genres",
          "value": "genres",
          "action": "List music genres",
          "description": "List the available soundtrack genres"
        },
        {
          "name": "List Tracks",
          "value": "tracks",
          "action": "List tracks in a genre",
          "description": "List the soundtracks in a genre"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "music"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List connections",
          "description": "List your publishing connections"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connection"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Balance",
          "value": "get",
          "action": "Get the credit balance",
          "description": "Get your current credit balance"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "credits"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List Endpoints",
          "value": "list",
          "action": "List webhook endpoints"
        },
        {
          "name": "Create Endpoint",
          "value": "create",
          "action": "Create a webhook endpoint"
        },
        {
          "name": "Delete Endpoint",
          "value": "delete",
          "action": "Delete a webhook endpoint"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "List",
      "value": "list",
      "action": "List videos",
      "description": "List the videos in your account",
      "resource": "video"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a video",
      "description": "Get a single video by ID",
      "resource": "video"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a video",
      "description": "Render a video from drafted content",
      "resource": "video"
    },
    {
      "name": "Draft",
      "value": "draft",
      "action": "Draft a video",
      "description": "Write a video script from a topic",
      "resource": "video"
    },
    {
      "name": "Draft From URL",
      "value": "draftUrl",
      "action": "Draft a video from a URL",
      "description": "Summarize a webpage into a video script",
      "resource": "video"
    },
    {
      "name": "Draft From Script",
      "value": "draftScript",
      "action": "Draft a video from a script",
      "description": "Build scenes from your own script",
      "resource": "video"
    },
    {
      "name": "Draft Quiz",
      "value": "draftQuiz",
      "action": "Draft a quiz video",
      "description": "Write a quiz video from a topic",
      "resource": "video"
    },
    {
      "name": "Draft News",
      "value": "draftNews",
      "action": "Draft a news video",
      "description": "Write a news video from a topic",
      "resource": "video"
    },
    {
      "name": "Generate Topics",
      "value": "topics",
      "action": "Generate video topics",
      "description": "Brainstorm video topic ideas",
      "resource": "video"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List series",
      "description": "List the series in your account",
      "resource": "series"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a series",
      "description": "Get a single series and its episodes by ID",
      "resource": "series"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a series",
      "description": "Start a recurring, scheduled video series",
      "resource": "series"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List images",
      "description": "List the images in your account",
      "resource": "image"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an image",
      "description": "Get a single image by ID",
      "resource": "image"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an image",
      "description": "Generate an image from a prompt",
      "resource": "image"
    },
    {
      "name": "List Styles",
      "value": "styles",
      "action": "List image styles",
      "description": "List the available image styles",
      "resource": "image"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List audio",
      "description": "List the audio clips in your account",
      "resource": "audio"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an audio clip",
      "description": "Get a single audio clip by ID",
      "resource": "audio"
    },
    {
      "name": "Create Speech",
      "value": "speech",
      "action": "Create speech audio",
      "description": "Generate text-to-speech audio",
      "resource": "audio"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List voices",
      "description": "List the available text-to-speech voices",
      "resource": "voice"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a voice",
      "description": "Get a single voice by ID",
      "resource": "voice"
    },
    {
      "name": "List Genres",
      "value": "genres",
      "action": "List music genres",
      "description": "List the available soundtrack genres",
      "resource": "music"
    },
    {
      "name": "List Tracks",
      "value": "tracks",
      "action": "List tracks in a genre",
      "description": "List the soundtracks in a genre",
      "resource": "music"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List connections",
      "description": "List your publishing connections",
      "resource": "connection"
    },
    {
      "name": "Get Balance",
      "value": "get",
      "action": "Get the credit balance",
      "description": "Get your current credit balance",
      "resource": "credits"
    },
    {
      "name": "List Endpoints",
      "value": "list",
      "action": "List webhook endpoints",
      "resource": "webhook"
    },
    {
      "name": "Create Endpoint",
      "value": "create",
      "action": "Create a webhook endpoint",
      "resource": "webhook"
    },
    {
      "name": "Delete Endpoint",
      "value": "delete",
      "action": "Delete a webhook endpoint",
      "resource": "webhook"
    }
  ]

npm_readme:
  # n8n-nodes-shortgenius

  n8n community node for [ShortGenius](https://shortgenius.com) — generate AI videos, images, and audio, and manage your ShortGenius account.

  ## Install

  In your n8n instance:

  ```
  npm install n8n-nodes-shortgenius
  ```

  Restart n8n. The package ships two nodes (`ShortGenius` and `ShortGenius Trigger`) and one credential type (`ShortGenius API`).

  ## Authentication

  1. Sign in to ShortGenius and open **Developers → API keys** at https://shortgenius.com/developers/keys to create an API key (it starts with `sg-`).
  2. In n8n, **Credentials → New → ShortGenius API** and paste the key, then hit **Test**. The default base URL (`https://api.shortgenius.com/v1`) is correct for production.
  3. ShortGenius is single-user — the API key alone authenticates. There is no organization to configure. The connection test calls `GET /credits`.

  ## Nodes

  ### ShortGenius (action)

  | Resource | Operations |
  |---|---|
  | Video | List, Get, Create, Draft, Draft From URL, Draft From Script, Draft Quiz, Draft News, Generate Topics |
  | Series | List, Get, Create |
  | Image | List, Get, Create, List Styles |
  | Audio | List, Get, Create Speech |
  | Voice | List, Get |
  | Music | List Genres, List Tracks |
  | Connection | List |
  | Credits | Get Balance |
  | Webhook | List Endpoints, Create Endpoint, Delete Endpoint |

  Videos are drafted first (write/review a script), then created (rendered). Created videos, generated images, and synthesized audio render asynchronously — poll the corresponding **Get** operation until the state is `completed`, or use the **ShortGenius Trigger** node to react to completion webhooks.

  ### ShortGenius Trigger

  Subscribes to ShortGenius lifecycle events and emits a workflow run per delivery, with the event's inner `data` payload as the item JSON. Supported events:

  - `video.created`
  - `video.completed`
  - `video.published`
  - `series.created`
  - `image.completed`
  - `audio.completed`
  - `*` (all events)

  Activating the trigger registers a webhook endpoint at ShortGenius pointing at the n8n production URL. Deactivating it deletes the endpoint so you do not leak orphan subscriptions. Every delivery is verified per-request (HMAC-SHA256 over `<timestamp>.<rawBody>`, 5-minute timestamp window) using the `ShortGenius-Signature` header.

  ## Use as an AI Agent tool

  The ShortGenius node is marked `usableAsTool`, so an n8n **AI Agent** can call it directly: add the AI Agent node, click the **Tool** connector, and pick **ShortGenius**. The agent can then draft and render videos, generate images, synthesize speech, and more from natural-language instructions.

  Self-hosted instances must allow community nodes as tools by setting the environment variable `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true`.

  ## Links

  - Integrations landing page: https://shortgenius.com/integrations/n8n
  - API docs: https://shortgenius.com/developers
  - Source: https://github.com/ShortGenius/shorts/tree/main/packages/n8n-node

  ## License

  MIT.

ai_documentation_summary:
  {"purpose":"ShortGenius is an n8n community node for generating AI videos, images, and audio, and for managing ShortGenius account resources such as credits, connections, webhooks, and media assets. It also includes a trigger node for reacting to ShortGenius lifecycle events.","capabilities":["Draft, create, and manage videos","Generate video topics and draft videos from URL, script, quiz, or news","Create and manage series","Create and manage images, including listing available styles","Create speech audio and manage audio assets","List and manage voices","List music genres and tracks","Check account credits/balance","List webhook endpoints and create/delete endpoints","Subscribe to ShortGenius events via trigger node for completed/created/published workflows"],"authentication":"API key required (ShortGenius API key starting with 'sg-'); single-user authentication with no organization setup, using the ShortGenius API credential in n8n.","commonUseCases":["Automatically draft and render AI-generated videos from scripts or URLs","Generate images and speech audio in response to workflow inputs or AI Agent instructions","Monitor ShortGenius job completion events with a trigger and continue downstream automation","Check remaining credits before running media generation workflows","Manage ShortGenius webhooks and media resources from n8n"],"limitations":["Generated videos, images, and audio render asynchronously and must be polled with Get operations until completed, unless using the trigger node","The trigger requires webhook registration and production n8n URLs","Self-hosted instances must explicitly allow community nodes as tools to use this node with AI Agent","Webhook signature verification uses a 5-minute timestamp window"],"relatedNodes":["ShortGenius Trigger","n8n AI Agent"]}


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

updated_at: 2026-07-14 14:40:34
author_name: adamlauzon
author_github_url: https://github.com/Acrewity/acrewity-n8n.git
npm_package_name: @acrewity/n8n-nodes-acrewity
npm_version: 0.2.4
community_fetched_at: 2026-07-14T14:40:34.648Z
ai_summary_generated_at: 2026-07-09 06:09:49
description:
  Consume the Acrewity API - 22+ utility services for data conversion, PDF processing, QR codes, barcodes, and more

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "uuid_generator",
      "options": [
        {
          "name": "Barcode Generator",
          "value": "barcode_generator",
          "description": "Generate 1D barcodes (Code128, EAN, UPC, etc.)"
        },
        {
          "name": "Email",
          "value": "email_access",
          "description": "Send emails via SMTP"
        },
        {
          "name": "Excel to JSON",
          "value": "excel_to_json",
          "description": "Convert Excel files to JSON"
        },
        {
          "name": "HTML to Markdown",
          "value": "html_to_markdown",
          "description": "Convert HTML to Markdown"
        },
        {
          "name": "HTML to PDF",
          "value": "html_to_pdf",
          "description": "Convert HTML to PDF documents"
        },
        {
          "name": "Image Converter",
          "value": "image_converter",
          "description": "Convert images between formats"
        },
        {
          "name": "JSON Schema Validator",
          "value": "json_schema_validator",
          "description": "Validate JSON against schemas"
        },
        {
          "name": "JSON to Excel",
          "value": "json_to_excel",
          "description": "Convert JSON to Excel files"
        },
        {
          "name": "Markdown Table",
          "value": "markdown_table_generator",
          "description": "Generate Markdown tables"
        },
        {
          "name": "Markdown to HTML",
          "value": "markdown_to_html",
          "description": "Convert Markdown to HTML"
        },
        {
          "name": "PDF Extract Page",
          "value": "pdf_extract_page",
          "description": "Extract pages from PDFs"
        },
        {
          "name": "PDF Merge",
          "value": "pdf_merge",
          "description": "Merge multiple PDF files"
        },
        {
          "name": "PDF to HTML",
          "value": "pdf_to_html",
          "description": "Convert PDF to HTML"
        },
        {
          "name": "PDF to Markdown",
          "value": "pdf_to_markdown",
          "description": "Convert PDF to Markdown"
        },
        {
          "name": "QR Code",
          "value": "qr_code_generator",
          "description": "Generate QR codes"
        },
        {
          "name": "Regex Matcher",
          "value": "regex_matcher",
          "description": "Match patterns in text"
        },
        {
          "name": "Sitemap Generator",
          "value": "sitemap_generator",
          "description": "Extract links and generate XML sitemaps"
        },
        {
          "name": "Text Diff",
          "value": "text_diff",
          "description": "Compare two texts"
        },
        {
          "name": "Timezone Converter",
          "value": "timezone_converter",
          "description": "Convert between timezones"
        },
        {
          "name": "URL Encoder/Decoder",
          "value": "url_encoder_decoder",
          "description": "Encode or decode URLs"
        },
        {
          "name": "URL to Markdown",
          "value": "url_to_markdown",
          "description": "Convert web pages to Markdown"
        },
        {
          "name": "UUID Generator",
          "value": "uuid_generator",
          "description": "Generate unique identifiers"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generate_uuid",
      "options": [
        {
          "name": "Generate UUID",
          "value": "generate_uuid",
          "action": "Generate unique identifiers"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "uuid_generator"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generate_barcode",
      "options": [
        {
          "name": "Generate Barcode",
          "value": "generate_barcode",
          "action": "Generate a 1D barcode"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "barcode_generator"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "match_pattern",
      "options": [
        {
          "name": "Match Pattern",
          "value": "match_pattern",
          "action": "Match regex pattern in text"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "regex_matcher"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "compare_text",
      "options": [
        {
          "name": "Compare Text",
          "value": "compare_text",
          "action": "Compare two texts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "text_diff"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "encode",
      "options": [
        {
          "name": "Encode",
          "value": "encode",
          "action": "Url encode text"
        },
        {
          "name": "Decode",
          "value": "decode",
          "action": "Url decode text"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "url_encoder_decoder"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "convert_timezone",
      "options": [
        {
          "name": "Convert Timezone",
          "value": "convert_timezone",
          "action": "Convert time between timezones"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "timezone_converter"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generate",
      "options": [
        {
          "name": "Generate QR Code",
          "value": "generate",
          "action": "Generate a QR code"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "qr_code_generator"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "extract_links",
      "options": [
        {
          "name": "Extract Links",
          "value": "extract_links",
          "action": "Extract links from a web page"
        },
        {
          "name": "Generate Sitemap",
          "value": "generate_sitemap",
          "action": "Generate xml sitemap from ur ls"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sitemap_generator"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generate_table",
      "options": [
        {
          "name": "Generate Table",
          "value": "generate_table",
          "action": "Generate a markdown table"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "markdown_table_generator"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "validate_json",
      "options": [
        {
          "name": "Validate JSON",
          "value": "validate_json",
          "action": "Validate JSON against a schema"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "json_schema_validator"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "url_to_markdown",
      "options": [
        {
          "name": "Convert URL",
          "value": "url_to_markdown",
          "action": "Convert web page to markdown"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "url_to_markdown"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "convert",
      "options": [
        {
          "name": "Convert to PDF",
          "value": "convert",
          "action": "Convert HTML to PDF"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "html_to_pdf"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "convert",
      "options": [
        {
          "name": "Convert to Markdown",
          "value": "convert",
          "action": "Convert html to markdown"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "html_to_markdown"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "convert",
      "options": [
        {
          "name": "Convert to HTML",
          "value": "convert",
          "action": "Convert markdown to html"
        },
        {
          "name": "Convert to Fragment",
          "value": "fragment",
          "action": "Convert markdown to html fragment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "markdown_to_html"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "convert_image",
      "options": [
        {
          "name": "Convert Image",
          "value": "convert_image",
          "action": "Convert image format"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "image_converter"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "read_excel",
      "options": [
        {
          "name": "List Sheets",
          "value": "list_sheets",
          "action": "List all sheet names in excel file"
        },
        {
          "name": "Read Excel",
          "value": "read_excel",
          "action": "Read entire excel file"
        },
        {
          "name": "Read Sheet",
          "value": "read_sheet",
          "action": "Read specific sheet from excel file"
        },
        {
          "name": "Get Range",
          "value": "get_range",
          "action": "Get specific cell range from excel sheet"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "excel_to_json"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create_excel",
      "options": [
        {
          "name": "Create Excel",
          "value": "create_excel",
          "action": "Create excel from json"
        },
        {
          "name": "Create Multi-Sheet Excel",
          "value": "create_multi_sheet",
          "action": "Create excel with multiple sheets"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "json_to_excel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "merge",
      "options": [
        {
          "name": "Merge PDFs",
          "value": "merge",
          "action": "Merge multiple PDF files"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pdf_merge"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "extract",
      "options": [
        {
          "name": "Extract Page",
          "value": "extract",
          "action": "Extract a page from PDF"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pdf_extract_page"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "convert",
      "options": [
        {
          "name": "Convert to HTML",
          "value": "convert",
          "action": "Convert PDF to HTML"
        },
        {
          "name": "Get Metadata",
          "value": "metadata",
          "action": "Get PDF metadata"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pdf_to_html"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "convert",
      "options": [
        {
          "name": "Convert to Markdown",
          "value": "convert",
          "action": "Convert pdf to markdown"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pdf_to_markdown"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send_email",
      "options": [
        {
          "name": "Send Email",
          "value": "send_email",
          "action": "Send an email via SMTP"
        },
        {
          "name": "Fetch Emails (IMAP)",
          "value": "fetch_emails",
          "action": "Fetch emails from IMAP server"
        },
        {
          "name": "Fetch Emails (POP3)",
          "value": "fetch_emails_pop3",
          "action": "Fetch emails from POP3 server"
        },
        {
          "name": "Mark as Read",
          "value": "mark_as_read",
          "action": "Mark email as read via IMAP"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "email_access"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate UUID",
      "value": "generate_uuid",
      "action": "Generate unique identifiers",
      "resource": "uuid_generator"
    },
    {
      "name": "Generate Barcode",
      "value": "generate_barcode",
      "action": "Generate a 1D barcode",
      "resource": "barcode_generator"
    },
    {
      "name": "Match Pattern",
      "value": "match_pattern",
      "action": "Match regex pattern in text",
      "resource": "regex_matcher"
    },
    {
      "name": "Compare Text",
      "value": "compare_text",
      "action": "Compare two texts",
      "resource": "text_diff"
    },
    {
      "name": "Encode",
      "value": "encode",
      "action": "Url encode text",
      "resource": "url_encoder_decoder"
    },
    {
      "name": "Decode",
      "value": "decode",
      "action": "Url decode text",
      "resource": "url_encoder_decoder"
    },
    {
      "name": "Convert Timezone",
      "value": "convert_timezone",
      "action": "Convert time between timezones",
      "resource": "timezone_converter"
    },
    {
      "name": "Generate QR Code",
      "value": "generate",
      "action": "Generate a QR code",
      "resource": "qr_code_generator"
    },
    {
      "name": "Extract Links",
      "value": "extract_links",
      "action": "Extract links from a web page",
      "resource": "sitemap_generator"
    },
    {
      "name": "Generate Sitemap",
      "value": "generate_sitemap",
      "action": "Generate xml sitemap from ur ls",
      "resource": "sitemap_generator"
    },
    {
      "name": "Generate Table",
      "value": "generate_table",
      "action": "Generate a markdown table",
      "resource": "markdown_table_generator"
    },
    {
      "name": "Validate JSON",
      "value": "validate_json",
      "action": "Validate JSON against a schema",
      "resource": "json_schema_validator"
    },
    {
      "name": "Convert URL",
      "value": "url_to_markdown",
      "action": "Convert web page to markdown",
      "resource": "url_to_markdown"
    },
    {
      "name": "Convert to PDF",
      "value": "convert",
      "action": "Convert HTML to PDF",
      "resource": "html_to_pdf"
    },
    {
      "name": "Convert to Markdown",
      "value": "convert",
      "action": "Convert html to markdown",
      "resource": "html_to_markdown"
    },
    {
      "name": "Convert to HTML",
      "value": "convert",
      "action": "Convert markdown to html",
      "resource": "markdown_to_html"
    },
    {
      "name": "Convert to Fragment",
      "value": "fragment",
      "action": "Convert markdown to html fragment",
      "resource": "markdown_to_html"
    },
    {
      "name": "Convert Image",
      "value": "convert_image",
      "action": "Convert image format",
      "resource": "image_converter"
    },
    {
      "name": "List Sheets",
      "value": "list_sheets",
      "action": "List all sheet names in excel file",
      "resource": "excel_to_json"
    },
    {
      "name": "Read Excel",
      "value": "read_excel",
      "action": "Read entire excel file",
      "resource": "excel_to_json"
    },
    {
      "name": "Read Sheet",
      "value": "read_sheet",
      "action": "Read specific sheet from excel file",
      "resource": "excel_to_json"
    },
    {
      "name": "Get Range",
      "value": "get_range",
      "action": "Get specific cell range from excel sheet",
      "resource": "excel_to_json"
    },
    {
      "name": "Create Excel",
      "value": "create_excel",
      "action": "Create excel from json",
      "resource": "json_to_excel"
    },
    {
      "name": "Create Multi-Sheet Excel",
      "value": "create_multi_sheet",
      "action": "Create excel with multiple sheets",
      "resource": "json_to_excel"
    },
    {
      "name": "Merge PDFs",
      "value": "merge",
      "action": "Merge multiple PDF files",
      "resource": "pdf_merge"
    },
    {
      "name": "Extract Page",
      "value": "extract",
      "action": "Extract a page from PDF",
      "resource": "pdf_extract_page"
    },
    {
      "name": "Convert to HTML",
      "value": "convert",
      "action": "Convert PDF to HTML",
      "resource": "pdf_to_html"
    },
    {
      "name": "Get Metadata",
      "value": "metadata",
      "action": "Get PDF metadata",
      "resource": "pdf_to_html"
    },
    {
      "name": "Convert to Markdown",
      "value": "convert",
      "action": "Convert pdf to markdown",
      "resource": "pdf_to_markdown"
    },
    {
      "name": "Send Email",
      "value": "send_email",
      "action": "Send an email via SMTP",
      "resource": "email_access"
    },
    {
      "name": "Fetch Emails (IMAP)",
      "value": "fetch_emails",
      "action": "Fetch emails from IMAP server",
      "resource": "email_access"
    },
    {
      "name": "Fetch Emails (POP3)",
      "value": "fetch_emails_pop3",
      "action": "Fetch emails from POP3 server",
      "resource": "email_access"
    },
    {
      "name": "Mark as Read",
      "value": "mark_as_read",
      "action": "Mark email as read via IMAP",
      "resource": "email_access"
    }
  ]

npm_readme:
  # n8n-nodes-acrewity

  This is an n8n community node for [Acrewity](https://acrewity.com) - a unified API platform with 22+ utility services.

  ## Features

  This node provides access to all Acrewity API services:

  ### Data & Utilities
  - **UUID Generator** - Generate unique identifiers (v1, v4)
  - **Regex Matcher** - Pattern matching and text extraction
  - **Text Diff** - Compare two texts and highlight differences
  - **URL Encoder/Decoder** - Safely encode and decode URLs
  - **Timezone Converter** - Convert times between timezones
  - **JSON Schema Validator** - Validate JSON against schemas

  ### Content Processing
  - **URL to Markdown** - Convert web pages to Markdown
  - **HTML to Markdown** - Convert HTML content to Markdown
  - **Markdown to HTML** - Convert Markdown to HTML with syntax highlighting
  - **HTML to PDF** - Generate PDF documents from HTML

  ### Document Generation
  - **QR Code Generator** - Generate QR codes (PNG/SVG)
  - **Barcode Generator** - Generate 1D barcodes (Code128, EAN-13, EAN-8, UPC, Code39, ITF-14, Codabar)
  - **Markdown Table Generator** - Create formatted Markdown tables
  - **Sitemap Generator** - Extract links from web pages and generate XML sitemaps

  ### File Conversion
  - **Image Converter** - Convert between JPEG, PNG, WebP, BMP, GIF, ICO, TIFF
  - **Excel to JSON** - Parse Excel files to JSON
  - **JSON to Excel** - Create Excel files from JSON (single or multi-sheet, with cell positioning and formula support)

  ### PDF Operations
  - **PDF Merge** - Combine multiple PDF files
  - **PDF Extract Page** - Extract specific pages from PDFs
  - **PDF to HTML** - Convert PDFs to HTML
  - **PDF to Markdown** - Convert PDFs to Markdown

  ### Communication
  - **Email Access** - Send emails via SMTP, fetch emails via IMAP/POP3, mark as read

  ## Installation

  ### In n8n Desktop/Self-hosted

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

  ### Manual Installation

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

  ## Credentials

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

  1. Sign up at [acrewity.com](https://acrewity.com)
  2. Go to your Dashboard > API Keys
  3. Create a new API key
  4. Copy the key (starts with `ak_`)

  In n8n:
  1. Go to **Credentials**
  2. Create new **Acrewity API** credential
  3. Paste your API key

  ## Usage

  1. Add the **Acrewity** node to your workflow
  2. Select a **Resource** (service type)
  3. Select an **Operation**
  4. Fill in the required parameters
  5. Execute!

  ### Example: Generate UUIDs

  1. Resource: `UUID Generator`
  2. Operation: `Generate UUID`
  3. UUID Version: `Version 4 (Random)`
  4. Count: `5`

  ### Example: Convert HTML to PDF

  1. Resource: `HTML to PDF`
  2. Operation: `Convert to PDF`
  3. HTML Content: `<html><body><h1>Invoice #123</h1>...</body></html>`

  ## API Documentation

  Full API documentation is available at [acrewity.com/docs](https://acrewity.com/docs)

  ## Credits

  Each API operation costs **1 credit**. Check your credit balance in the Acrewity dashboard.

  ## Support

  - **Documentation**: [acrewity.com/docs](https://acrewity.com/docs)
  - **Issues**: [GitHub Issues](https://github.com/Acrewity/n8n-nodes-acrewity/issues)
  - **Contact**: [acrewity.com/contact](https://acrewity.com/contact)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Provides access to Acrewity's unified API platform for 22+ utility services in n8n. It supports data utilities, content and document conversion, PDF operations, and email-related tasks.","capabilities":["Generate UUIDs (v1, v4)","Match regex patterns and extract text","Compare text with diffs","Encode and decode URLs","Convert timezones","Validate JSON against schemas","Convert URL/HTML/Markdown content between formats","Generate PDFs from HTML","Create QR codes and barcodes","Generate Markdown tables and XML sitemaps"],"authentication":"API key required (Acrewity API key, pasted into the n8n Acrewity API credential)","commonUseCases":["Generating UUIDs, QR codes, or barcodes in automated workflows","Converting HTML, Markdown, PDFs, images, and spreadsheets between formats","Sending or retrieving emails through SMTP, IMAP, or POP3","Validating data, extracting text, and generating sitemaps or Markdown tables"],"limitations":["Each API operation costs 1 credit","Authentication requires an Acrewity account and API key"],"relatedNodes":[]}


node_type: n8n-nodes-llmpulse.llmPulse
package_name: n8n-nodes-llmpulse
display_name: LLM Pulse
description: Consume the LLM Pulse API: AI visibility analytics for ChatGPT, Perplexity, Gemini and more
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: llmpulse
author_github_url: https://github.com/LLM-Pulse/
npm_package_name: n8n-nodes-llmpulse
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.649Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "project",
      "options": [
        {
          "name": "Annotation",
          "value": "annotation"
        },
        {
          "name": "Citation",
          "value": "citation"
        },
        {
          "name": "Collection",
          "value": "collection"
        },
        {
          "name": "Competitor",
          "value": "competitor"
        },
        {
          "name": "Intelligence Task",
          "value": "intelligenceTask"
        },
        {
          "name": "Mention",
          "value": "mention"
        },
        {
          "name": "Metric",
          "value": "metrics"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Prompt",
          "value": "prompt"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project",
          "routing": {
            "request": {
              "url": "=/dimensions/projects/{{$parameter.projectId}}",
              "method": "GET"
            }
          },
          "description": "Get full details of a single project"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many projects",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "projects"
                  }
                }
              ]
            },
            "request": {
              "url": "/dimensions/projects",
              "method": "GET"
            }
          },
          "description": "List many projects the API key can access"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Assign Tags",
          "value": "assignTags",
          "action": "Assign tags to prompts",
          "routing": {
            "request": {
              "url": "/prompts/assign_tags",
              "method": "POST"
            }
          },
          "description": "Bulk-attach tags to prompts"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create prompts",
          "routing": {
            "request": {
              "url": "/prompts",
              "method": "POST"
            }
          },
          "description": "Bulk-create prompts in a project"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many prompts",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/dimensions/prompts",
              "method": "GET"
            }
          },
          "description": "List prompts of a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "prompt"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a competitor",
          "routing": {
            "request": {
              "url": "/competitors",
              "method": "POST"
            }
          },
          "description": "Add a competitor to a project"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many competitors",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "competitors"
                  }
                }
              ]
            },
            "request": {
              "url": "/dimensions/competitors",
              "method": "GET"
            }
          },
          "description": "List competitors of a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "competitor"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a collection",
          "routing": {
            "request": {
              "url": "/collections",
              "method": "POST"
            }
          },
          "description": "Create a tag/collection in a project"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many collections",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "collections"
                  }
                }
              ]
            },
            "request": {
              "url": "/dimensions/collections",
              "method": "GET"
            }
          },
          "description": "List tags/collections of a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "collection"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many mentions",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/dimensions/mentions",
              "method": "GET"
            }
          },
          "description": "List brand mentions of a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "mention"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many citations",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/dimensions/citations",
              "method": "GET"
            }
          },
          "description": "List brand citations of a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "citation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getSummary",
      "options": [
        {
          "name": "Get Share of Voice",
          "value": "getShareOfVoice",
          "action": "Get share of voice",
          "routing": {
            "request": {
              "url": "/metrics/sov",
              "method": "GET"
            }
          },
          "description": "Share of voice of the brand vs competitors"
        },
        {
          "name": "Get Summary",
          "value": "getSummary",
          "action": "Get a metrics summary",
          "routing": {
            "request": {
              "url": "/metrics/summary",
              "method": "GET"
            }
          },
          "description": "Aggregated metrics for a period"
        },
        {
          "name": "Get Timeseries",
          "value": "getTimeseries",
          "action": "Get metrics timeseries",
          "routing": {
            "request": {
              "url": "/metrics/timeseries",
              "method": "GET"
            }
          },
          "description": "Time-series metrics by day, week or month"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "metrics"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an intelligence task",
          "routing": {
            "request": {
              "url": "/intelligence_tasks",
              "method": "POST"
            }
          },
          "description": "Create a GEO Writer task (brief, article, update, PR insights or custom)"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an intelligence task",
          "routing": {
            "request": {
              "url": "=/intelligence_tasks/{{$parameter.taskId}}",
              "method": "GET"
            }
          },
          "description": "Get a GEO Writer task with its result"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many intelligence tasks",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/intelligence_tasks",
              "method": "GET"
            }
          },
          "description": "List GEO Writer tasks of a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "intelligenceTask"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an annotation",
          "routing": {
            "request": {
              "url": "/annotations",
              "method": "POST"
            }
          },
          "description": "Create a timeline annotation on the project charts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "annotation"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "routing": {
        "request": {
          "url": "=/dimensions/projects/{{$parameter.projectId}}",
          "method": "GET"
        }
      },
      "description": "Get full details of a single project",
      "resource": "project"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many projects",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "projects"
              }
            }
          ]
        },
        "request": {
          "url": "/dimensions/projects",
          "method": "GET"
        }
      },
      "description": "List many projects the API key can access",
      "resource": "project"
    },
    {
      "name": "Assign Tags",
      "value": "assignTags",
      "action": "Assign tags to prompts",
      "routing": {
        "request": {
          "url": "/prompts/assign_tags",
          "method": "POST"
        }
      },
      "description": "Bulk-attach tags to prompts",
      "resource": "prompt"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create prompts",
      "routing": {
        "request": {
          "url": "/prompts",
          "method": "POST"
        }
      },
      "description": "Bulk-create prompts in a project",
      "resource": "prompt"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many prompts",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/dimensions/prompts",
          "method": "GET"
        }
      },
      "description": "List prompts of a project",
      "resource": "prompt"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a competitor",
      "routing": {
        "request": {
          "url": "/competitors",
          "method": "POST"
        }
      },
      "description": "Add a competitor to a project",
      "resource": "competitor"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many competitors",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "competitors"
              }
            }
          ]
        },
        "request": {
          "url": "/dimensions/competitors",
          "method": "GET"
        }
      },
      "description": "List competitors of a project",
      "resource": "competitor"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a collection",
      "routing": {
        "request": {
          "url": "/collections",
          "method": "POST"
        }
      },
      "description": "Create a tag/collection in a project",
      "resource": "collection"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many collections",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "collections"
              }
            }
          ]
        },
        "request": {
          "url": "/dimensions/collections",
          "method": "GET"
        }
      },
      "description": "List tags/collections of a project",
      "resource": "collection"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many mentions",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/dimensions/mentions",
          "method": "GET"
        }
      },
      "description": "List brand mentions of a project",
      "resource": "mention"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many citations",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/dimensions/citations",
          "method": "GET"
        }
      },
      "description": "List brand citations of a project",
      "resource": "citation"
    },
    {
      "name": "Get Share of Voice",
      "value": "getShareOfVoice",
      "action": "Get share of voice",
      "routing": {
        "request": {
          "url": "/metrics/sov",
          "method": "GET"
        }
      },
      "description": "Share of voice of the brand vs competitors",
      "resource": "metrics"
    },
    {
      "name": "Get Summary",
      "value": "getSummary",
      "action": "Get a metrics summary",
      "routing": {
        "request": {
          "url": "/metrics/summary",
          "method": "GET"
        }
      },
      "description": "Aggregated metrics for a period",
      "resource": "metrics"
    },
    {
      "name": "Get Timeseries",
      "value": "getTimeseries",
      "action": "Get metrics timeseries",
      "routing": {
        "request": {
          "url": "/metrics/timeseries",
          "method": "GET"
        }
      },
      "description": "Time-series metrics by day, week or month",
      "resource": "metrics"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an intelligence task",
      "routing": {
        "request": {
          "url": "/intelligence_tasks",
          "method": "POST"
        }
      },
      "description": "Create a GEO Writer task (brief, article, update, PR insights or custom)",
      "resource": "intelligenceTask"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an intelligence task",
      "routing": {
        "request": {
          "url": "=/intelligence_tasks/{{$parameter.taskId}}",
          "method": "GET"
        }
      },
      "description": "Get a GEO Writer task with its result",
      "resource": "intelligenceTask"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many intelligence tasks",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/intelligence_tasks",
          "method": "GET"
        }
      },
      "description": "List GEO Writer tasks of a project",
      "resource": "intelligenceTask"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an annotation",
      "routing": {
        "request": {
          "url": "/annotations",
          "method": "POST"
        }
      },
      "description": "Create a timeline annotation on the project charts",
      "resource": "annotation"
    }
  ]

npm_readme:
  # n8n-nodes-llmpulse

  This is an n8n community node for [LLM Pulse](https://llmpulse.ai), the AI visibility analytics platform. It lets you read and write LLM Pulse data from your n8n workflows: projects, prompts, competitors, mentions, citations, metrics, GEO Writer tasks and timeline annotations. It also ships a trigger node that starts workflows in real time when new mentions, citations or other events happen in your account.

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

  ## Prerequisites

  - An LLM Pulse account on the Scale plan or above (API keys are available on Scale and Enterprise).
  - An API key, generated in the LLM Pulse app under Settings > API Keys. Keys look like `llmpulse_...`.

  API reference: [https://llmpulse.ai/api-docs](https://llmpulse.ai/api-docs)

  ## Installation

  ### Community nodes panel (recommended)

  1. In n8n, go to **Settings > Community Nodes**.
  2. Click **Install** and enter `n8n-nodes-llmpulse`.
  3. Accept the risks prompt and install.

  ### Manual install

  For self-hosted n8n instances:

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

  Restart n8n afterwards.

  ## Credentials

  Create a credential of type **LLM Pulse API** and paste your API key. The credential test calls `GET https://api.llmpulse.ai/api/v1/ping` to verify the key.

  ## LLM Pulse node: operations

  | Resource | Operation | Description |
  | --- | --- | --- |
  | Project | Get Many | List all projects the API key can access |
  | Project | Get | Get full details of a single project |
  | Prompt | Get Many | List prompts of a project, with filters (model, collection, locale, type, dates) |
  | Prompt | Create | Bulk-create prompts (up to 100 per call) |
  | Prompt | Assign Tags | Bulk-attach tags to prompts, optionally creating missing tags |
  | Competitor | Get Many | List competitors of a project |
  | Competitor | Create | Add a competitor (brand name, domain, matching names) |
  | Collection | Get Many | List tags/collections of a project |
  | Collection | Create | Create a tag/collection, optionally attaching prompts |
  | Mention | Get Many | List brand mentions, with filters and pagination |
  | Citation | Get Many | List brand citations, with filters and pagination |
  | Metric | Get Summary | Aggregated metrics (visibility, mentions, citations, sentiment and more) |
  | Metric | Get Timeseries | Time-series metrics by day, week or month |
  | Metric | Get Share of Voice | Share of voice of the brand vs competitors |
  | Intelligence Task | Get Many | List GEO Writer tasks |
  | Intelligence Task | Get | Get a GEO Writer task with its result |
  | Intelligence Task | Create | Create a GEO Writer task (brief, article, update, PR insights, custom) |
  | Annotation | Create | Create a timeline annotation on the project charts |

  Projects, competitors, collections and tags are selectable from dropdowns that load live data from your account. You can always switch to an expression and pass an ID instead.

  List operations support `page` and `per_page` (max 100) filters. Responses are unwrapped so each row becomes one n8n item.

  ## LLM Pulse Trigger node: events

  The trigger registers webhook subscriptions via `POST /api/v1/webhooks` when the workflow is activated and removes them when it is deactivated. One subscription is created per selected event.

  | Event | Fires when |
  | --- | --- |
  | Mention Created | Your brand is mentioned in an AI answer |
  | Competitor Mention Created | A competitor is mentioned in an AI answer |
  | Citation Created | Your domain is cited in an AI answer |
  | Prompt Execution Completed | A prompt finishes executing against an AI model |
  | Negative Sentiment Detected | A negative or very negative sentiment is detected |
  | Recommendation Completed | A recommendations run finishes |
  | Intelligence Task Completed | A GEO Writer task finishes |

  Each delivery has this envelope:

  ```json
  {
    "event": "mention.created",
    "occurred_at": "2026-06-11T10:30:00Z",
    "project_id": 42,
    "subscription_id": 7,
    "data": { }
  }
  ```

  ### Signature verification

  Deliveries are signed with an HMAC SHA-256 header:

  ```
  X-LLMPulse-Signature: sha256=<hex digest of the raw request body, keyed with the subscription secret>
  ```

  The trigger node verifies this signature by default (the **Verify Signature** option) and rejects non-matching requests with a 401. You can disable verification for local testing, but keep it on in production.

  ## Compatibility

  Tested with n8n 1.x. Requires Node.js 18.10 or newer to build.

  ## Development

  ```bash
  npm install
  npm run build   # tsc + copy icons and metadata to dist
  npm run lint    # eslint with eslint-plugin-n8n-nodes-base
  ```

  ## Resources

  - [LLM Pulse API documentation](https://llmpulse.ai/api-docs)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"LLM Pulse is an n8n community node for reading and writing AI visibility analytics data in LLM Pulse, including projects, prompts, competitors, mentions, citations, metrics, GEO Writer tasks, and annotations. It also includes a trigger node for real-time workflow execution when account events occur.","capabilities":["List and fetch projects","List, create, and bulk-create prompts","Assign tags to prompts in bulk","List and create competitors","List and create collections/tags","List mentions and citations with filters and pagination","Get summary, timeseries, and share of voice metrics","List, fetch, and create GEO Writer intelligence tasks","Create timeline annotations","Trigger workflows on mention, citation, sentiment, recommendation, and intelligence task events"],"authentication":"API key required via LLM Pulse API credential (LLM Pulse API key from Settings > API Keys; works on Scale plan or above).","commonUseCases":["Automating retrieval and reporting of AI visibility metrics","Creating or updating prompts, competitors, tags, and annotations from workflows","Monitoring brand mentions, citations, and sentiment in AI answers","Triggering workflows when GEO Writer tasks or prompt executions complete","Building dashboards or sync workflows around LLM Pulse project data"],"limitations":["API keys are only available on Scale and Enterprise plans","Prompt bulk-create is limited to 100 prompts per call","List operations support page and per_page filters with a maximum per_page of 100","Webhook signature verification can be disabled for local testing but is recommended for production"],"relatedNodes":["LLM Pulse Trigger","Webhook"]}


node_type: n8n-nodes-llmpulse.llmPulseTrigger
package_name: n8n-nodes-llmpulse
display_name: LLM Pulse Trigger
description: Starts the workflow when LLM Pulse 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: llmpulse
author_github_url: https://github.com/LLM-Pulse/
npm_package_name: n8n-nodes-llmpulse
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.650Z
ai_summary_generated_at: 2026-07-09 06:09:49
npm_readme:
  # n8n-nodes-llmpulse

  This is an n8n community node for [LLM Pulse](https://llmpulse.ai), the AI visibility analytics platform. It lets you read and write LLM Pulse data from your n8n workflows: projects, prompts, competitors, mentions, citations, metrics, GEO Writer tasks and timeline annotations. It also ships a trigger node that starts workflows in real time when new mentions, citations or other events happen in your account.

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

  ## Prerequisites

  - An LLM Pulse account on the Scale plan or above (API keys are available on Scale and Enterprise).
  - An API key, generated in the LLM Pulse app under Settings > API Keys. Keys look like `llmpulse_...`.

  API reference: [https://llmpulse.ai/api-docs](https://llmpulse.ai/api-docs)

  ## Installation

  ### Community nodes panel (recommended)

  1. In n8n, go to **Settings > Community Nodes**.
  2. Click **Install** and enter `n8n-nodes-llmpulse`.
  3. Accept the risks prompt and install.

  ### Manual install

  For self-hosted n8n instances:

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

  Restart n8n afterwards.

  ## Credentials

  Create a credential of type **LLM Pulse API** and paste your API key. The credential test calls `GET https://api.llmpulse.ai/api/v1/ping` to verify the key.

  ## LLM Pulse node: operations

  | Resource | Operation | Description |
  | --- | --- | --- |
  | Project | Get Many | List all projects the API key can access |
  | Project | Get | Get full details of a single project |
  | Prompt | Get Many | List prompts of a project, with filters (model, collection, locale, type, dates) |
  | Prompt | Create | Bulk-create prompts (up to 100 per call) |
  | Prompt | Assign Tags | Bulk-attach tags to prompts, optionally creating missing tags |
  | Competitor | Get Many | List competitors of a project |
  | Competitor | Create | Add a competitor (brand name, domain, matching names) |
  | Collection | Get Many | List tags/collections of a project |
  | Collection | Create | Create a tag/collection, optionally attaching prompts |
  | Mention | Get Many | List brand mentions, with filters and pagination |
  | Citation | Get Many | List brand citations, with filters and pagination |
  | Metric | Get Summary | Aggregated metrics (visibility, mentions, citations, sentiment and more) |
  | Metric | Get Timeseries | Time-series metrics by day, week or month |
  | Metric | Get Share of Voice | Share of voice of the brand vs competitors |
  | Intelligence Task | Get Many | List GEO Writer tasks |
  | Intelligence Task | Get | Get a GEO Writer task with its result |
  | Intelligence Task | Create | Create a GEO Writer task (brief, article, update, PR insights, custom) |
  | Annotation | Create | Create a timeline annotation on the project charts |

  Projects, competitors, collections and tags are selectable from dropdowns that load live data from your account. You can always switch to an expression and pass an ID instead.

  List operations support `page` and `per_page` (max 100) filters. Responses are unwrapped so each row becomes one n8n item.

  ## LLM Pulse Trigger node: events

  The trigger registers webhook subscriptions via `POST /api/v1/webhooks` when the workflow is activated and removes them when it is deactivated. One subscription is created per selected event.

  | Event | Fires when |
  | --- | --- |
  | Mention Created | Your brand is mentioned in an AI answer |
  | Competitor Mention Created | A competitor is mentioned in an AI answer |
  | Citation Created | Your domain is cited in an AI answer |
  | Prompt Execution Completed | A prompt finishes executing against an AI model |
  | Negative Sentiment Detected | A negative or very negative sentiment is detected |
  | Recommendation Completed | A recommendations run finishes |
  | Intelligence Task Completed | A GEO Writer task finishes |

  Each delivery has this envelope:

  ```json
  {
    "event": "mention.created",
    "occurred_at": "2026-06-11T10:30:00Z",
    "project_id": 42,
    "subscription_id": 7,
    "data": { }
  }
  ```

  ### Signature verification

  Deliveries are signed with an HMAC SHA-256 header:

  ```
  X-LLMPulse-Signature: sha256=<hex digest of the raw request body, keyed with the subscription secret>
  ```

  The trigger node verifies this signature by default (the **Verify Signature** option) and rejects non-matching requests with a 401. You can disable verification for local testing, but keep it on in production.

  ## Compatibility

  Tested with n8n 1.x. Requires Node.js 18.10 or newer to build.

  ## Development

  ```bash
  npm install
  npm run build   # tsc + copy icons and metadata to dist
  npm run lint    # eslint with eslint-plugin-n8n-nodes-base
  ```

  ## Resources

  - [LLM Pulse API documentation](https://llmpulse.ai/api-docs)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community node for LLM Pulse that lets n8n workflows read/write LLM Pulse data and react to LLM Pulse events in real time. The trigger node starts workflows when selected account events occur, such as mentions, citations, or task completions.","capabilities":["List and retrieve projects","List, create, and bulk-create prompts with filters","Assign tags to prompts in bulk","List and create competitors","List and create collections/tags","List mentions and citations with pagination and filters","Get aggregated metrics, timeseries metrics, and share of voice","List, retrieve, and create GEO Writer intelligence tasks","Create timeline annotations","Trigger workflows on webhook events such as mention created, citation created, prompt execution completed, negative sentiment detected, recommendation completed, and intelligence task completed"],"authentication":"API key required via an 'LLM Pulse API' credential","commonUseCases":["Monitor brand mentions, citations, and competitor mentions from AI answers","Automate reporting and analysis using LLM Pulse metrics and timelines","Create and manage prompts, competitors, tags, and annotations from n8n","Trigger downstream workflows when GEO Writer tasks or prompt executions complete"],"limitations":["Requires an LLM Pulse account on the Scale plan or above for API key access","List operations are limited to a maximum of 100 items per page","Trigger webhook verification can be disabled for local testing but is recommended for production"],"relatedNodes":["Webhook Trigger","HTTP Request"]}


node_type: n8n-nodes-loopquest.loopQuestTrigger
package_name: n8n-nodes-loopquest
display_name: LoopQuest Trigger
description: Starts the workflow when a LoopQuest verdict arrives
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: tomphillipsai
author_github_url: https://github.com/TomPhillipsLabs/
npm_package_name: n8n-nodes-loopquest
npm_version: 0.2.3
community_fetched_at: 2026-07-14T14:40:34.651Z
ai_summary_generated_at: 2026-07-09 06:09:49
npm_readme:
  # n8n-nodes-loopquest

  An [n8n](https://n8n.io) community node for [LoopQuest](https://loopquest.tomphillips.uk) — send AI output for gamified human-in-the-loop review and get a verdict back.

  ## Nodes

  - **LoopQuest** — *Create Review Task* (submit content for review) and *Get Task Status* (poll a task).
  - **LoopQuest Trigger** — starts a workflow when a verdict webhook arrives.

  ## Credentials

  Create a **LoopQuest API** credential with your workspace **API key** (LoopQuest → Workspaces → API keys) and, if self-hosting, your **Base URL**.

  ## The async pattern

  A human takes time, so *Create Review Task* returns immediately with a task id. The verdict arrives later. Two ways to handle it:

  - **Recommended:** add a **LoopQuest Trigger** node, copy its production webhook URL into the Create node's **Callback URL**, and the verdict starts a second workflow (with `external_id` + `source` for correlation).
  - Or poll with **Get Task Status**.

  ## Install (self-hosted n8n)

  Settings → Community Nodes → Install → `n8n-nodes-loopquest`.

  ## Develop / build

  ```bash
  npm install
  npm run build      # tsc -> dist/, then copies icons
  # link into a local n8n for testing:
  #   npm link  &&  (in ~/.n8n/nodes) npm link n8n-nodes-loopquest
  ```

  ## Verify the verdict signature

  LoopQuest signs webhooks (`X-LoopQuest-Signature`). To verify in n8n, add a Code node after the trigger using HMAC-SHA256 over the raw body with your `LOOPQUEST_WEBHOOK_SECRET` (see the LoopQuest docs at `/docs`).

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when a LoopQuest verdict webhook arrives. It is used in the human-in-the-loop review flow to continue automation after a review decision is returned.","capabilities":["Receives LoopQuest verdict webhooks","Triggers a workflow when a verdict arrives","Supports correlation with review tasks via external_id and source from the LoopQuest Create Review Task flow","Can be used with webhook signature verification (X-LoopQuest-Signature) in a follow-up Code node"],"authentication":"Uses a LoopQuest API credential with workspace API key; for self-hosted LoopQuest, a Base URL is also required.","commonUseCases":["Start a second workflow when a human review verdict is received","Handle asynchronous AI review decisions in a human-in-the-loop process","Verify incoming LoopQuest webhook signatures before processing the verdict"],"limitations":["This trigger only starts on verdict webhook events; it does not submit tasks or poll task status","Webhook signature verification is not built into the trigger and must be implemented separately in a Code node","For self-hosted LoopQuest instances, the Base URL must be configured in credentials"],"relatedNodes":["LoopQuest","LoopQuest Create Review Task","LoopQuest Get Task Status","Code"]}


node_type: n8n-nodes-loopquest.loopQuest
package_name: n8n-nodes-loopquest
display_name: LoopQuest
description: Submit AI output for human-in-the-loop review
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: tomphillipsai
author_github_url: https://github.com/TomPhillipsLabs/
npm_package_name: n8n-nodes-loopquest
npm_version: 0.2.3
community_fetched_at: 2026-07-14T14:40:34.653Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Review Task",
          "value": "create",
          "action": "Create a review task"
        },
        {
          "name": "Get Task Status",
          "value": "get",
          "action": "Get a task status"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Review Task",
      "value": "create",
      "action": "Create a review task"
    },
    {
      "name": "Get Task Status",
      "value": "get",
      "action": "Get a task status"
    }
  ]

npm_readme:
  # n8n-nodes-loopquest

  An [n8n](https://n8n.io) community node for [LoopQuest](https://loopquest.tomphillips.uk) — send AI output for gamified human-in-the-loop review and get a verdict back.

  ## Nodes

  - **LoopQuest** — *Create Review Task* (submit content for review) and *Get Task Status* (poll a task).
  - **LoopQuest Trigger** — starts a workflow when a verdict webhook arrives.

  ## Credentials

  Create a **LoopQuest API** credential with your workspace **API key** (LoopQuest → Workspaces → API keys) and, if self-hosting, your **Base URL**.

  ## The async pattern

  A human takes time, so *Create Review Task* returns immediately with a task id. The verdict arrives later. Two ways to handle it:

  - **Recommended:** add a **LoopQuest Trigger** node, copy its production webhook URL into the Create node's **Callback URL**, and the verdict starts a second workflow (with `external_id` + `source` for correlation).
  - Or poll with **Get Task Status**.

  ## Install (self-hosted n8n)

  Settings → Community Nodes → Install → `n8n-nodes-loopquest`.

  ## Develop / build

  ```bash
  npm install
  npm run build      # tsc -> dist/, then copies icons
  # link into a local n8n for testing:
  #   npm link  &&  (in ~/.n8n/nodes) npm link n8n-nodes-loopquest
  ```

  ## Verify the verdict signature

  LoopQuest signs webhooks (`X-LoopQuest-Signature`). To verify in n8n, add a Code node after the trigger using HMAC-SHA256 over the raw body with your `LOOPQUEST_WEBHOOK_SECRET` (see the LoopQuest docs at `/docs`).

ai_documentation_summary:
  {"purpose":"LoopQuest is an n8n community node for sending AI output to LoopQuest for gamified human-in-the-loop review and receiving a verdict back. It supports both webhook-driven and polling-based async review workflows.","capabilities":["Create Review Task: submit content for human review and receive a task id immediately","Get Task Status: poll for the current status and verdict of a review task","LoopQuest Trigger: start a workflow when a verdict webhook arrives","Supports callback URL-based async review flow with external_id and source correlation","Webhook signature verification support via X-LoopQuest-Signature and HMAC-SHA256"],"authentication":"API key required via LoopQuest API credential; self-hosted instances also require a Base URL","commonUseCases":["Submitting AI-generated content for human review before finalizing an action","Receiving verdicts from a human review workflow via webhook trigger","Polling review task status when webhook handling is not used","Correlating review results back to the originating workflow using external_id and source"],"limitations":["Create Review Task is asynchronous and returns immediately; verdict is not available right away","Webhook verification requires manual HMAC-SHA256 checking in a Code node","Self-hosted setups need a custom Base URL configured"],"relatedNodes":["LoopQuest Trigger","Code"]}


node_type: n8n-nodes-qorami.qorami
package_name: n8n-nodes-qorami
display_name: Qorami
description: Check an email before your workflow sends it: send / ask a human / block
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: silver2140
author_github_url: https://github.com/loicfontaine-max/
npm_package_name: n8n-nodes-qorami
npm_version: 0.2.3
community_fetched_at: 2026-07-14T14:40:34.654Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "verifyEmail",
      "options": [
        {
          "name": "Verify Email",
          "value": "verifyEmail",
          "action": "Verify an email before sending",
          "description": "Ask Qorami whether this email is safe to send"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Verify Email",
      "value": "verifyEmail",
      "action": "Verify an email before sending",
      "description": "Ask Qorami whether this email is safe to send"
    }
  ]

npm_readme:
  # n8n-nodes-qorami

  An [n8n](https://n8n.io) community node for **[Qorami](https://qorami.fr)** — the
  control point your workflow calls **before it sends an email**. Qorami answers
  **send**, **ask a human**, or **block**, with reasons, an audit trace, and (when
  relevant) a cleaned, safe-to-send version.

  Qorami never sends the email — your **Send Email** node does. Qorami only returns
  the decision.

  ## Install

  In n8n: **Settings → Community Nodes → Install**, then enter:

  ```
  n8n-nodes-qorami
  ```

  (Self-hosted n8n only; verified community nodes can also appear on n8n Cloud.)

  ## Credentials

  Create a **Qorami API** credential with your workspace **API key** — get one free
  (test credits, no card) at <https://qorami.fr/dashboard/>.

  ## Node: Qorami → Verify Email

  Inputs: **Recipient**, **Subject**, **Body**, and a **Policy Profile**
  (`general`, `sales`, `support`, `legal-finance`).

  The node returns the Qorami response, including:

  - `nextAction.type` → `send` | `request_human_confirmation` | `do_not_send`
  - `nextAction.reason` → why
  - `action.id` → the action to poll after a human review
  - `verification.remediation.safeBody` → a cleaned body when the email was risky
    only because of removable content (`safeToSend` tells you if it's sendable)

  ### Branch on the verdict

  Add an **IF** node after Qorami: condition
  `{{$json.nextAction.type}}` **equals** `send`.

  - **true** → continue to your **Send Email** node.
  - **false** → `request_human_confirmation`: notify a human with
    `{{$json.action.id}}`; `do_not_send`: stop / log `{{$json.nextAction.reason}}`.

  ### Send the cleaned version (optional)

  ```
  {{$json.verification.remediation.safeBody || $json.body}}
  ```

  Only when `{{$json.verification.remediation.safeToSend}}` is `true`.

  ## Use with the n8n AI Agent

  This node is exposed as a **tool** (`usableAsTool`), so an n8n **AI Agent** can be
  told to call Qorami before sending any email, and obey the verdict.

  ## Pricing

  1 traced verification = 1 credit; blocks are free. New accounts get free test
  credits. Full reference: <https://qorami.fr/docs>.

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Qorami is a pre-send email verification node for n8n that checks an email before your workflow sends it. It returns a verdict to send, ask a human, or block, along with reasons, an audit trace, and optionally a cleaned safe-to-send version.","capabilities":["Verify an email using recipient, subject, body, and a policy profile","Return a decision with nextAction.type values of send, request_human_confirmation, or do_not_send","Provide reasoning via nextAction.reason","Provide an action ID for human review workflows via action.id","Return remediation details including safeBody and safeToSend","Be used as a tool by n8n AI Agent workflows","Support branching logic in n8n based on the verification verdict"],"authentication":"Qorami API credential using a workspace API key","commonUseCases":["Validate outgoing emails before sending them from an n8n workflow","Route risky emails to human approval before delivery","Block unsafe emails and log the reason","Send a cleaned version of an email when Qorami marks it safe to send","Use as a guardrail tool for an n8n AI Agent that drafts or sends emails"],"limitations":["The node does not send emails itself; a separate Send Email node must handle delivery","Available policy profiles are limited to general, sales, support, and legal-finance","Self-hosted n8n is required for installation, though verified community nodes may also appear on n8n Cloud","One traced verification consumes one credit, while blocks are free"],"relatedNodes":["Send Email","IF","AI Agent"]}


node_type: @deepidealab/n8n-nodes-tracira.tracira
package_name: @deepidealab/n8n-nodes-tracira
display_name: Tracira
description: Log and inspect Tracira AI log data
category: Analytics
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: suryasanchez
author_github_url: https://github.com/deepidealab/n8n-nodes-tracira.git
npm_package_name: @deepidealab/n8n-nodes-tracira
npm_version: 0.8.2
community_fetched_at: 2026-07-14T14:40:34.655Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "log",
      "options": [
        {
          "name": "Log",
          "value": "log"
        },
        {
          "name": "API",
          "value": "api"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "log",
      "options": [
        {
          "name": "Create a Log",
          "value": "log",
          "action": "Create a log",
          "description": "Send an AI output to Tracira and create a log for evaluation. Returns a verdict, confidence score, and explanation based on your configured rules."
        },
        {
          "name": "Flag a Log",
          "value": "flag",
          "action": "Flag a log",
          "description": "Flag an evaluated log for human review, e.g. when an end-user reports an issue"
        },
        {
          "name": "Get a Log",
          "value": "get",
          "action": "Get a log",
          "description": "Fetch a single log by ID, including verdict, explanation, and human decision"
        },
        {
          "name": "Search Logs",
          "value": "search",
          "action": "Search logs",
          "description": "Return a filtered list of logs from Tracira. Filter by status, project, task name, or date range."
        },
        {
          "name": "Set a Decision",
          "value": "setDecision",
          "action": "Set a decision",
          "description": "Approve, reject, or send a flagged log back to the AI with a comment"
        },
        {
          "name": "Upload a File",
          "value": "upload",
          "action": "Upload a file",
          "description": "Upload a large file directly to Tracira storage, then attach it to a log by key"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "log"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "call",
      "options": [
        {
          "name": "Call",
          "value": "call",
          "action": "Make an API call",
          "description": "Perform an arbitrary authenticated Tracira API request"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "api"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create a Log",
      "value": "log",
      "action": "Create a log",
      "description": "Send an AI output to Tracira and create a log for evaluation. Returns a verdict, confidence score, and explanation based on your configured rules.",
      "resource": "log"
    },
    {
      "name": "Flag a Log",
      "value": "flag",
      "action": "Flag a log",
      "description": "Flag an evaluated log for human review, e.g. when an end-user reports an issue",
      "resource": "log"
    },
    {
      "name": "Get a Log",
      "value": "get",
      "action": "Get a log",
      "description": "Fetch a single log by ID, including verdict, explanation, and human decision",
      "resource": "log"
    },
    {
      "name": "Search Logs",
      "value": "search",
      "action": "Search logs",
      "description": "Return a filtered list of logs from Tracira. Filter by status, project, task name, or date range.",
      "resource": "log"
    },
    {
      "name": "Set a Decision",
      "value": "setDecision",
      "action": "Set a decision",
      "description": "Approve, reject, or send a flagged log back to the AI with a comment",
      "resource": "log"
    },
    {
      "name": "Upload a File",
      "value": "upload",
      "action": "Upload a file",
      "description": "Upload a large file directly to Tracira storage, then attach it to a log by key",
      "resource": "log"
    },
    {
      "name": "Call",
      "value": "call",
      "action": "Make an API call",
      "description": "Perform an arbitrary authenticated Tracira API request",
      "resource": "api"
    }
  ]

npm_readme:
  # @deepidealab/n8n-nodes-tracira

  This is an n8n community node for Tracira.

  Tracira monitors AI outputs from your automations, evaluates them against rules, and lets you inspect log results from inside n8n workflows.

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

  ## Installation

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

  Install package name:

  ```text
  @deepidealab/n8n-nodes-tracira
  ```

  If you already installed the legacy unscoped package `n8n-nodes-tracira`, uninstall it and install the scoped package instead.

  For local development:

  ```bash
  npm install
  npm run verify
  ```

  ## Operations

  The package ships two nodes: **Tracira** (actions) and **Tracira Trigger** (watch decisions).

  ### Tracira Trigger

  Starts a workflow the moment a log gets a verdict or a human decision in Tracira. Pick which events to watch - the default (`approved` / `rejected` / `sent back for changes`) fires once a human has decided, the usual choice for approval flows; `flagged`, `passed`, and `error` evaluation events are opt-in. Activating the workflow registers the trigger with Tracira automatically (visible under Integrations → Connected triggers); deactivating removes it. Decision events include the AI `output` and the log `metadata`, so an approval workflow can deliver the approved reply with no extra lookup.

  The typical human-in-the-loop pattern uses two workflows: workflow A creates the log (AI step → `Create a Log`, Wait for Verdict off), and workflow B starts with the Tracira Trigger, filters on `decision = approved`, and delivers the output.

  ### Tracira (actions)

  The node supports the `Log` resource with these operations (named to match the Tracira Make app modules):

  - `Create a Log`: Send an AI output to Tracira and create a log for evaluation. Waits for the verdict by default; supports async (fire-and-forget) mode, callback URL with event filtering, and all standard context fields. `Project Name` and `Task Name` offer a searchable dropdown of your existing Tracira projects/tasks, or accept a new name typed manually.
  - `Get a Log`: Fetch a single log by ID.
  - `Search Logs`: List logs with filters such as status, project, task, and date range.
  - `Set a Decision`: `Approve` or `Reject` a flagged log, or `Send Back for Changes` with a comment. The comment is delivered to the downstream automation, which regenerates the output and resubmits it with the `Create a Log` operation's `Revision Of` field set to the original log ID — forming a revision chain.
  - `Flag a Log`: Flag an evaluated log for human review — for example when an end-user reports an issue with an AI response. The log re-enters the pending-review queue and notification channels fire.
  - `Upload a File`: Upload a large file (PDF, image, audio) directly to Tracira storage and get back a `key`. Use it for files over ~3 MB that exceed the request size limit; map a binary field (e.g. `data`). Supports up to 32 MB. Pass the returned `key` to the `Create a Log` operation's `Input Attachments` or `Output Attachments` field.

  The `Create a Log` operation also has `Input Attachments` (files the AI received) and `Output Attachments` (media the AI produced: generated images, synthesized audio, rendered documents) fields, each with three sources: `Upload File` (send a binary field inline with the request — keep under ~3 MB), `From URL` (a publicly accessible HTTPS URL), or `Tracira Upload` (a `key` from the `Upload a File` operation, for large files). `AI Output` text is required unless an `Output Attachment` carries a media-only output.

  The `Create a Log` operation's optional `Action (Gate Mode)` field gates a **proposed action** on human review. When your AI decides to run something with side effects (issue a refund, delete a record), fill in the action's `Name`, a plain-language `Summary`, and optional `Parameters (JSON)`. Reviewers approve or reject the action in Tracira before your workflow executes it, and data-field rules can gate it via paths like `action.params.amount`. Combine with a `Callback URL` so the workflow runs the action only after approval.

  The node also supports the `API` resource with:

  - `Call`: Make an arbitrary authenticated request to the Tracira API.

  ### Sync vs async

  By default the `Create a Log` operation **waits for the verdict** (`Wait for Verdict` is on): Tracira evaluates inline and responds with the full `{ ok, id, status, verdict, confidenceScore, explanation }` so you can branch on `status` or `verdict` in the same workflow execution. Evaluation is capped at 30 seconds.

  Turn **Wait for Verdict** off for fire-and-forget logging: Tracira responds immediately with HTTP `202` and `{ ok, id, status: "pending" }`, then evaluates in the background. Use this for high-volume logging where you don't need the verdict inline.

  ## Keeping this node in sync with the Tracira API

  The Tracira Make custom app (`make-app/` in the main repo) is the reference integration. When the Tracira API changes — new webhook fields, renamed endpoints, new status values — both the Make app and this n8n node must be updated together.

  ## Credentials

  Use the `Tracira API` credential.

  You need a workspace webhook token from your Tracira dashboard:

  1. Open Tracira.
  2. Go to the integrations/token area of your workspace.
  3. Copy the webhook token.
  4. Paste it into the `Workspace Token` field in n8n.

  The credential test calls `GET /api/verify` on Tracira and sends the token as an `Authorization: Bearer <token>` header.

  ## Compatibility

  This package is being set up against the current n8n community-node tooling and Tracira API endpoints available as of March 7, 2026.

  ## Usage

  Typical pattern:

  1. Run your AI step in n8n.
  2. Send the model output to `Tracira -> Log -> Create a Log`.
  3. Branch on the returned `status`, `verdict`, or `confidenceScore`.
  4. Optionally query historic logs with `Get a Log` or `Search Logs`.

  ## Example workflow

  An importable example workflow is available at [examples/log-and-branch.workflow.json](./examples/log-and-branch.workflow.json).

  The example does this:

  1. Starts from a manual trigger.
  2. Logs an execution to Tracira.
  3. Branches with an `If` node based on the returned `status`.

  ## Verification notes

  This package is structured to align with n8n's verification guidance:

  - Built with the `n8n-node` toolchain.
  - No runtime `dependencies` in `package.json`.
  - No access to environment variables or file system from node code.
  - MIT licensed.
  - Published from GitHub Actions with npm provenance configured in `.github/workflows/publish.yml`.
  - The published package is scanned with `@n8n/scan-community-package` after npm publication.

  Maintainer release instructions are documented in [PUBLISHING.md](./PUBLISHING.md).

  ### How n8n verification handles versions

  The verified listing on n8n Cloud is **pinned to one npm version with a tarball checksum** - publishing a new version to npm changes nothing on the n8n side. Each version must be (re)submitted through the [n8n Creator Portal](https://creators.n8n.io/); the previously verified version stays live during review, and self-hosted users installing by npm name get the latest npm version regardless. To see which version n8n currently has verified:

  ```bash
  curl -s "https://api.n8n.io/api/community-nodes?filters%5BpackageName%5D%5B%24eq%5D=%40deepidealab%2Fn8n-nodes-tracira" | python3 -m json.tool
  ```

  Look at `npmVersion` / `nodeVersions` in the response.

  ### Checklist for adding a new node to this package

  Every node class in this package must follow the conventions that got the existing nodes verified (several were explicit n8n review findings):

  1. **Codex, twice**: an inline `codex` block in the node description *and* a `<Node>.node.json` file next to the node. The `node` field must be fully qualified (`@deepidealab/n8n-nodes-tracira.<nodeName>`), and the category must be `Analytics` - n8n silently drops the unsupported `AI` category (0.8.1 review finding).
  2. **Error handling**: wrap HTTP failures in `NodeApiError` so the status code and response body survive into the n8n UI - in `execute()` *and* in trigger `webhookMethods` (attach/detach/checkExists). Bare re-throws were a 0.8.1 review finding; the `require-node-api-error` lint rule also flags bare `throw error` of a catch parameter even when `instanceof`-guarded - use `throw error instanceof NodeOperationError ? error : new NodeApiError(...)`.
  3. **Icons**: `tracira.svg` + `tracira.dark.svg` copied into the node's own folder (icon paths are relative to the node file).
  4. **`usableAsTool`**: set `true` on action nodes. Trigger nodes cannot be tools and the type forbids `false`, so exempt the `node-usable-as-tool` lint rule with an inline `eslint-disable-next-line` and a comment saying why.
  5. **Trigger nodes**: name them `<X> Trigger` / `<x>Trigger`, add `activationMessage` and `eventTriggerDescription`, keep the registration id in `getWorkflowStaticData('node')`, and make `checkExists` verify against the API (Tracira auto-prunes dead subscriptions, so a stale local id must re-register).
  6. **Register the node** in `package.json` → `n8n.nodes` (the `dist/...js` path) - the build does not do this for you.
  7. **Field naming and order**: manager-friendly labels matching the Make custom app ("Input Text", "Input Attachments", "AI Output", "Output Attachments"), ordered as the story of the log: project/task → what the AI received → what it produced → behaviour. Renaming a `displayName` is free; **never rename a parameter `name`** - that breaks existing workflows.
  8. **Verify locally** with `npm run lint` + `npm run build` (needs Node 22+; there is no test script, and `scan-community-package` only works on the published package - CI runs it post-publish).

  ## Releasing a new version

  1. Make changes, bump `package.json` version, update `CHANGELOG.md`.
  2. Commit and push to `main`.
  3. Run `gh release create vX.Y.Z --title "vX.Y.Z" --notes "..."` — this triggers the GitHub Actions publish workflow automatically.
  4. The workflow builds, publishes to npm with provenance, and runs the n8n package scan.

  Do **not** publish manually from a local machine — provenance requires the GitHub Actions trusted publisher.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Tracira](https://www.tracira.com)
  - [Tracira API schema](https://www.tracira.com/openapi.json)

  ## Version history

  ### 0.5.0

  `Wait for Verdict` is now on by default and promoted to a top-level field on the `Log` operation — the node waits for the evaluation result so you can branch on it immediately. Turn it off for fire-and-forget logging (async, HTTP `202`). Behavior change: existing `Log` steps that relied on the previous async default will now wait for the verdict.

  ### 0.4.0

  Add the `Flag` operation to the `Log` resource — flag an evaluated log for human review when an end-user reports an issue, matching the Make custom app.

  ### 0.3.1

  Add `Sync mode` and `Callback Events` options to the Log operation, matching the Make custom app.

  ### 0.3.0

  Rename terminology to match Tracira API: Execution→Log, Flow→Project, Check→Task. API paths updated from `/executions` to `/logs`. Breaking change — existing workflows must update the resource value and field names.

  ### 0.2.1

  Bring the n8n node surface back in line with the Make app by adding `Set Decision` and `Make API Call`, and make the decision endpoint token-authenticated for automation clients.

  ### 0.2.0

  Move the package to the `@deepidealab` npm scope so the node is published under the business organization instead of a personal npm account.

  ### 0.1.8

  Add codex categories and search aliases to improve Tracira discoverability in the editor node picker.

  ### 0.1.7

  Remove the invalid `Developer Tools` node category so Tracira remains visible in the editor on self-hosted n8n.

  ### 0.1.6

  Replace newer declarative node features with a plain execute-style implementation for broader self-hosted n8n compatibility.

  ### 0.1.5

  Reduce node-description metadata to older-safe fields for self-hosted n8n compatibility.

  ### 0.1.4

  Use a current npm CLI in the publish workflow to satisfy npm trusted publishing requirements.

  ### 0.1.3

  Force GitHub Actions to publish via npm trusted publishing instead of any inherited token environment.

  ### 0.1.2

  Allow GitHub Actions trusted publishing while continuing to block accidental local publishes.

  ### 0.1.1

  First GitHub Actions release with npm provenance and trusted publishing.

  ### 0.1.0

  Initial Tracira node setup with execution logging and read operations.

ai_documentation_summary:
  {"purpose":"Provides n8n workflow actions and a trigger for logging AI outputs to Tracira, evaluating them against rules, and inspecting or handling verdicts and human review decisions inside workflows.","capabilities":["Create AI logs for evaluation in Tracira","Fetch a single log by ID","Search logs with filters such as status, project, task, and date range","Approve, reject, or send back flagged logs for changes","Flag evaluated logs for human review","Upload large files to Tracira storage and reuse the returned key in logs","Make arbitrary authenticated API requests to the Tracira API","Trigger workflows on verdict or human decision events","Support synchronous verdict waiting or asynchronous fire-and-forget logging","Attach input and output files via upload, URL, or Tracira upload key"],"authentication":"Tracira API credential using a workspace webhook token sent as an Authorization: Bearer <token> header","commonUseCases":["Logging AI-generated responses for automated evaluation and review","Building human-in-the-loop approval workflows for AI outputs or proposed side-effect actions","Searching and inspecting Tracira logs from within n8n","Uploading and attaching large media files to AI logs","Triggering downstream automation when a log is approved, rejected, flagged, or passes evaluation"],"limitations":["Inline synchronous evaluation is capped at 30 seconds","Binary file uploads in the request should stay under about 3 MB; larger files must use the Upload a File operation","Supports up to 32 MB for direct Tracira file uploads","Decision-triggered workflows depend on Tracira registered triggers being active"],"relatedNodes":["Tracira Trigger"]}


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

updated_at: 2026-07-14 14:40:34
author_name: boost.space
author_github_url: https://github.com/boostspace/
npm_package_name: n8n-nodes-boostspace
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.656Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "record",
      "options": [
        {
          "name": "API Call",
          "value": "apiCall"
        },
        {
          "name": "Custom Module",
          "value": "customModule"
        },
        {
          "name": "Field",
          "value": "field"
        },
        {
          "name": "Record",
          "value": "record"
        },
        {
          "name": "Space",
          "value": "space"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a record",
          "description": "Creates a new record"
        },
        {
          "name": "Create Bulk",
          "value": "createBulk",
          "action": "Create records in bulk",
          "description": "Creates multiple records at once"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a record",
          "description": "Deletes a record"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a record",
          "description": "Returns a single record by ID"
        },
        {
          "name": "Get by Remote ID",
          "value": "getByRemoteId",
          "action": "Get a record by remote ID",
          "description": "Returns a record by its remote application ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many records",
          "description": "Returns a list of records"
        },
        {
          "name": "Sync",
          "value": "sync",
          "action": "Synchronize a record",
          "description": "Creates or updates a record by remote ID (upsert)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a record",
          "description": "Updates an existing record"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "record"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a space",
          "description": "Creates a new space"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a space",
          "description": "Deletes a space"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a space",
          "description": "Returns a single space"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many spaces",
          "description": "Returns a list of spaces"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a space",
          "description": "Updates an existing space"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "space"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a custom module",
          "description": "Creates a new custom module"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a custom module",
          "description": "Deletes a custom module"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a custom module",
          "description": "Returns a single custom module"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many custom modules",
          "description": "Returns a list of custom modules"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a custom module",
          "description": "Updates an existing custom module"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customModule"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a field",
          "description": "Creates a new custom field input"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a field",
          "description": "Deletes a custom field input"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a field",
          "description": "Returns a single custom field input"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many fields",
          "description": "Returns custom fields for a space"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a field",
          "description": "Updates a custom field input"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "field"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "make",
      "options": [
        {
          "name": "Make",
          "value": "make",
          "action": "Make an API call",
          "description": "Makes an arbitrary authenticated API call"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "apiCall"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a record",
      "description": "Creates a new record",
      "resource": "record"
    },
    {
      "name": "Create Bulk",
      "value": "createBulk",
      "action": "Create records in bulk",
      "description": "Creates multiple records at once",
      "resource": "record"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a record",
      "description": "Deletes a record",
      "resource": "record"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a record",
      "description": "Returns a single record by ID",
      "resource": "record"
    },
    {
      "name": "Get by Remote ID",
      "value": "getByRemoteId",
      "action": "Get a record by remote ID",
      "description": "Returns a record by its remote application ID",
      "resource": "record"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many records",
      "description": "Returns a list of records",
      "resource": "record"
    },
    {
      "name": "Sync",
      "value": "sync",
      "action": "Synchronize a record",
      "description": "Creates or updates a record by remote ID (upsert)",
      "resource": "record"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a record",
      "description": "Updates an existing record",
      "resource": "record"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a space",
      "description": "Creates a new space",
      "resource": "space"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a space",
      "description": "Deletes a space",
      "resource": "space"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a space",
      "description": "Returns a single space",
      "resource": "space"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many spaces",
      "description": "Returns a list of spaces",
      "resource": "space"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a space",
      "description": "Updates an existing space",
      "resource": "space"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a custom module",
      "description": "Creates a new custom module",
      "resource": "customModule"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a custom module",
      "description": "Deletes a custom module",
      "resource": "customModule"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a custom module",
      "description": "Returns a single custom module",
      "resource": "customModule"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many custom modules",
      "description": "Returns a list of custom modules",
      "resource": "customModule"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a custom module",
      "description": "Updates an existing custom module",
      "resource": "customModule"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a field",
      "description": "Creates a new custom field input",
      "resource": "field"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a field",
      "description": "Deletes a custom field input",
      "resource": "field"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a field",
      "description": "Returns a single custom field input",
      "resource": "field"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many fields",
      "description": "Returns custom fields for a space",
      "resource": "field"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a field",
      "description": "Updates a custom field input",
      "resource": "field"
    },
    {
      "name": "Make",
      "value": "make",
      "action": "Make an API call",
      "description": "Makes an arbitrary authenticated API call",
      "resource": "apiCall"
    }
  ]

npm_readme:
  # n8n-nodes-boostspace

  This is an n8n community node for [Boost.space](https://boost.space) — a data synchronization and management platform. It lets you manage records, spaces, custom modules, and fields, and react to Boost.space events in your [n8n](https://n8n.io) workflows.

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

  ## Installation

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

  1. In n8n, go to **Settings → Community Nodes**.
  2. Select **Install** and enter `n8n-nodes-boostspace`.
  3. Agree to the risks of using community nodes and select **Install**.

  ## Credentials

  The node authenticates against the Boost.space API with:

  - **API Token** — create one in your Boost.space account; see [token creation](https://docs.boost.space/knowledge-base/system/connections/token-creation/).
  - **System Key** — the subdomain of your Boost.space system (`https://<system-key>.boost.space`).

  ## Operations

  ### Boost.space node

  | Resource | Operations |
  | --- | --- |
  | Record | Create, Create Bulk, Get, Get Many, Get by Remote ID, Update, Sync, Delete |
  | Space | Get, Get Many |
  | Custom Module | Create, Get, Get Many, Update, Delete |
  | Field | Create, Get Many, Update, Delete |
  | API Call | Make a custom authenticated request to any Boost.space API endpoint |

  ### Boost.space Trigger node

  Starts a workflow when a Boost.space event occurs:

  - Record Created / Updated / Deleted (or any of the three)
  - Module Created / Updated / Deleted (or any of the three)

  ## Compatibility

  Requires n8n version 1.0 or newer.

  ## Resources

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

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with the Boost.space API to manage data synchronization and administration tasks. It supports working with records, spaces, custom modules, and fields, and can also trigger workflows based on Boost.space events.","capabilities":["Create, create bulk, get, get many, get by remote ID, update, sync, and delete records","Get and get many spaces","Create, get, get many, update, and delete custom modules","Create, get many, update, and delete fields","Make custom authenticated API calls to any Boost.space endpoint","Trigger workflows on record created, updated, or deleted events","Trigger workflows on module created, updated, or deleted events"],"authentication":"API Token plus System Key (Boost.space subdomain)","commonUseCases":["Synchronizing records between Boost.space and other systems","Managing Boost.space spaces, custom modules, and fields from n8n","Starting workflows when Boost.space data changes"],"limitations":["Requires n8n version 1.0 or newer"],"relatedNodes":[]}


node_type: n8n-nodes-boostspace.boostspaceTrigger
package_name: n8n-nodes-boostspace
display_name: Boost.space Trigger
description: Starts the workflow when a Boost.space 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: boost.space
author_github_url: https://github.com/boostspace/
npm_package_name: n8n-nodes-boostspace
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.657Z
ai_summary_generated_at: 2026-07-09 06:09:49
npm_readme:
  # n8n-nodes-boostspace

  This is an n8n community node for [Boost.space](https://boost.space) — a data synchronization and management platform. It lets you manage records, spaces, custom modules, and fields, and react to Boost.space events in your [n8n](https://n8n.io) workflows.

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

  ## Installation

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

  1. In n8n, go to **Settings → Community Nodes**.
  2. Select **Install** and enter `n8n-nodes-boostspace`.
  3. Agree to the risks of using community nodes and select **Install**.

  ## Credentials

  The node authenticates against the Boost.space API with:

  - **API Token** — create one in your Boost.space account; see [token creation](https://docs.boost.space/knowledge-base/system/connections/token-creation/).
  - **System Key** — the subdomain of your Boost.space system (`https://<system-key>.boost.space`).

  ## Operations

  ### Boost.space node

  | Resource | Operations |
  | --- | --- |
  | Record | Create, Create Bulk, Get, Get Many, Get by Remote ID, Update, Sync, Delete |
  | Space | Get, Get Many |
  | Custom Module | Create, Get, Get Many, Update, Delete |
  | Field | Create, Get Many, Update, Delete |
  | API Call | Make a custom authenticated request to any Boost.space API endpoint |

  ### Boost.space Trigger node

  Starts a workflow when a Boost.space event occurs:

  - Record Created / Updated / Deleted (or any of the three)
  - Module Created / Updated / Deleted (or any of the three)

  ## Compatibility

  Requires n8n version 1.0 or newer.

  ## Resources

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

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node integrates Boost.space with n8n to manage Boost.space data and trigger workflows based on Boost.space events. The Trigger node specifically starts a workflow when records or modules are created, updated, or deleted.","capabilities":["Trigger workflows on Record Created, Updated, or Deleted events","Trigger workflows on Module Created, Updated, or Deleted events","Manage records with create, bulk create, get, get many, get by remote ID, update, sync, and delete operations","Manage spaces with get and get many operations","Manage custom modules with create, get, get many, update, and delete operations","Manage fields with create, get many, update, and delete operations","Make custom authenticated API calls to any Boost.space API endpoint"],"authentication":"API Token and System Key (Boost.space subdomain)","commonUseCases":["Automatically start workflows when Boost.space records change","Sync Boost.space data with other systems via record create/update/delete operations","Create or maintain custom modules and fields in Boost.space from n8n","Fetch and update Boost.space spaces, records, and modules within automated workflows"],"limitations":["Requires n8n version 1.0 or newer"],"relatedNodes":["n8n Trigger nodes","HTTP Request node"]}


node_type: @workiom/n8n-nodes-workiom.workiom
package_name: @workiom/n8n-nodes-workiom
display_name: Workiom
description: Read and write data in Workiom
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: ozdirfan
author_github_url: https://github.com/workiom/n8n-nodes-workiom.git
npm_package_name: @workiom/n8n-nodes-workiom
npm_version: 0.5.1
community_fetched_at: 2026-07-14T14:40:34.657Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "record",
      "options": [
        {
          "name": "App",
          "value": "app"
        },
        {
          "name": "List",
          "value": "list"
        },
        {
          "name": "Record",
          "value": "record"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get an app by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many apps"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "app"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a list by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "list"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a record"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a record"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a record by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many records"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a record partial"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "record"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get",
      "value": "get",
      "action": "Get an app by ID",
      "resource": "app"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many apps",
      "resource": "app"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a list by ID",
      "resource": "list"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a record",
      "resource": "record"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a record",
      "resource": "record"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a record by ID",
      "resource": "record"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many records",
      "resource": "record"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a record partial",
      "resource": "record"
    }
  ]

npm_readme:
  # n8n-nodes-workiom

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

  [Workiom](https://workiom.com) is a no-code platform for building data-driven business applications — lists, forms, automations, and dashboards — without writing code.

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

  In short: **Settings → Community Nodes → Install** → search for `@workiom/n8n-nodes-workiom`.

  ---

  ## Operations

  ### Workiom (action node)

  | Resource | Operations |
  |---|---|
  | **App** | Get, Get Many |
  | **List** | Get |
  | **Record** | Create, Get, Get Many, Update, Delete |

  **Record: Get Many** supports pagination (limit / skip), field projection (return only the fields you need), full-text quick search, and field-level filters with 13 operators (Is, Contains, Greater Than, In, Is Empty, …).

  **Record: Create / Update** render a live typed field form — date pickers, toggles, and dropdowns for Select, Status, User, and Linked-List fields — loaded directly from your list schema. Update starts with an empty form; add only the fields you want to patch.

  ### Workiom Trigger (webhook node)

  Fires when a record is **created** or **updated** in a Workiom list. Activating the workflow automatically registers the subscription with Workiom — no manual Automation setup required.

  ---

  ## Credentials

  Create a **Workiom API** credential in n8n:

  | Field | Description |
  |---|---|
  | **Access Token** | Your Workiom API key — find it in Workiom under **Profile → API Keys**. Sent as the `X-Api-Key` header. |
  | **Base URL** | Leave as `https://api.workiom.com` unless you are on a self-hosted or staging instance. |

  ---

  ## Compatibility

  Tested against **n8n 1.x** (1.30 and later). Requires `n8nNodesApiVersion: 1`.

  No known incompatibilities with earlier 1.x releases. Not tested against n8n 0.x.

  ---

  ## Usage

  ### Setting up the Workiom Trigger

  1. Add the **Workiom Trigger** node to your workflow, choose **New Record** or **Updated Record**, and select the App and List.
  2. Activate the workflow. n8n registers the subscription with Workiom automatically — no need to build a matching Automation by hand.
  3. Records now fire the workflow automatically. Deactivating the workflow removes the subscription again.

  ### Updating only specific fields

  The **Update Record** operation starts with an empty field form. Click **Add field** to select each field you want to change. Fields you leave out are not sent to the API — Workiom only overwrites what you include.

  ### Field types and values

  | Field type | What to pass |
  |---|---|
  | Text, Email, Website, Phone | Plain string |
  | Number, Currency, Count, Progress | Numeric value |
  | DateTime | ISO 8601 string, e.g. `2024-06-01T09:00:00` |
  | Boolean | `true` / `false` |
  | Select, Status, Multi-Select | Option name or option ID — the node renders a dropdown |
  | User, Multi-User | Select from the dropdown (user ID is sent automatically) |
  | Linked List | Select from the dropdown (record ID is sent automatically) |

  ---

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Workiom documentation](https://help.workiom.com)
  - [Workiom API reference](https://api.workiom.com/swagger)

  ---

  ## Version history

  ### 0.5.1
  - HTTP errors from the Workiom API now show the actual status code and error body in n8n, instead of a generic error.

  ### 0.5.0
  - Create Record, Update Record, and Get Many field/filter dropdowns now refresh immediately when you change the List, instead of requiring the node to be closed and reopened.
  - Create Record starts with only required fields shown; add optional fields via "Add field" (matches Update Record).

  ### 0.4.1
  - Update Record field form starts empty — add only the fields you want to patch.
  - Fields load as soon as the list is selected.
  - Removed build artefacts from the published package.

  ### 0.4.0
  - Added field projection to Record "Get Many" — return only the fields you need.
  - Removed List "Get Many" (replaced by App "Get" which includes all lists).

  ### 0.3.0
  - Human-readable field names in all record responses (field IDs are mapped to names).
  - Enriched App and List `get` output.
  - Added `In` / `Not In` filter operators.
  - Webhook trigger maps field IDs to names in the output payload.

ai_documentation_summary:
  {"purpose":"Provides n8n integration with Workiom to read and write app data and react to record changes. It supports managing apps, lists, and records, plus a webhook trigger for created or updated records.","capabilities":["Get one or many Apps","Get a List","Create, get, get many, update, and delete Records","Record get-many with pagination (limit/skip)","Record get-many with field projection","Record get-many with full-text quick search","Record get-many with field-level filters and multiple operators","Create and update records with typed field inputs based on list schema","Trigger workflows on record created or updated events via webhook"],"authentication":"Workiom API key required. Use a Workiom API credential with an Access Token from Profile → API Keys, sent as the X-Api-Key header. Base URL defaults to https://api.workiom.com.","commonUseCases":["Sync Workiom records with other apps or databases","Create or update Workiom records from workflow inputs","Filter and retrieve records for reporting or automation","Trigger downstream workflows when a Workiom record is created or updated"],"limitations":["Workiom Trigger supports only record created and updated events","Record update uses patch-style behavior and only overwrites fields that are included","Not tested against n8n 0.x","No List get-many operation; it was removed and replaced by App get including all lists"],"relatedNodes":["Workiom Trigger","HTTP Request"]}


node_type: @workiom/n8n-nodes-workiom.workiomTrigger
package_name: @workiom/n8n-nodes-workiom
display_name: Workiom Trigger
description: Triggers when a record is created or updated in Workiom
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: ozdirfan
author_github_url: https://github.com/workiom/n8n-nodes-workiom.git
npm_package_name: @workiom/n8n-nodes-workiom
npm_version: 0.5.1
community_fetched_at: 2026-07-14T14:40:34.659Z
ai_summary_generated_at: 2026-07-09 06:09:49
npm_readme:
  # n8n-nodes-workiom

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

  [Workiom](https://workiom.com) is a no-code platform for building data-driven business applications — lists, forms, automations, and dashboards — without writing code.

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

  In short: **Settings → Community Nodes → Install** → search for `@workiom/n8n-nodes-workiom`.

  ---

  ## Operations

  ### Workiom (action node)

  | Resource | Operations |
  |---|---|
  | **App** | Get, Get Many |
  | **List** | Get |
  | **Record** | Create, Get, Get Many, Update, Delete |

  **Record: Get Many** supports pagination (limit / skip), field projection (return only the fields you need), full-text quick search, and field-level filters with 13 operators (Is, Contains, Greater Than, In, Is Empty, …).

  **Record: Create / Update** render a live typed field form — date pickers, toggles, and dropdowns for Select, Status, User, and Linked-List fields — loaded directly from your list schema. Update starts with an empty form; add only the fields you want to patch.

  ### Workiom Trigger (webhook node)

  Fires when a record is **created** or **updated** in a Workiom list. Activating the workflow automatically registers the subscription with Workiom — no manual Automation setup required.

  ---

  ## Credentials

  Create a **Workiom API** credential in n8n:

  | Field | Description |
  |---|---|
  | **Access Token** | Your Workiom API key — find it in Workiom under **Profile → API Keys**. Sent as the `X-Api-Key` header. |
  | **Base URL** | Leave as `https://api.workiom.com` unless you are on a self-hosted or staging instance. |

  ---

  ## Compatibility

  Tested against **n8n 1.x** (1.30 and later). Requires `n8nNodesApiVersion: 1`.

  No known incompatibilities with earlier 1.x releases. Not tested against n8n 0.x.

  ---

  ## Usage

  ### Setting up the Workiom Trigger

  1. Add the **Workiom Trigger** node to your workflow, choose **New Record** or **Updated Record**, and select the App and List.
  2. Activate the workflow. n8n registers the subscription with Workiom automatically — no need to build a matching Automation by hand.
  3. Records now fire the workflow automatically. Deactivating the workflow removes the subscription again.

  ### Updating only specific fields

  The **Update Record** operation starts with an empty field form. Click **Add field** to select each field you want to change. Fields you leave out are not sent to the API — Workiom only overwrites what you include.

  ### Field types and values

  | Field type | What to pass |
  |---|---|
  | Text, Email, Website, Phone | Plain string |
  | Number, Currency, Count, Progress | Numeric value |
  | DateTime | ISO 8601 string, e.g. `2024-06-01T09:00:00` |
  | Boolean | `true` / `false` |
  | Select, Status, Multi-Select | Option name or option ID — the node renders a dropdown |
  | User, Multi-User | Select from the dropdown (user ID is sent automatically) |
  | Linked List | Select from the dropdown (record ID is sent automatically) |

  ---

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Workiom documentation](https://help.workiom.com)
  - [Workiom API reference](https://api.workiom.com/swagger)

  ---

  ## Version history

  ### 0.5.1
  - HTTP errors from the Workiom API now show the actual status code and error body in n8n, instead of a generic error.

  ### 0.5.0
  - Create Record, Update Record, and Get Many field/filter dropdowns now refresh immediately when you change the List, instead of requiring the node to be closed and reopened.
  - Create Record starts with only required fields shown; add optional fields via "Add field" (matches Update Record).

  ### 0.4.1
  - Update Record field form starts empty — add only the fields you want to patch.
  - Fields load as soon as the list is selected.
  - Removed build artefacts from the published package.

  ### 0.4.0
  - Added field projection to Record "Get Many" — return only the fields you need.
  - Removed List "Get Many" (replaced by App "Get" which includes all lists).

  ### 0.3.0
  - Human-readable field names in all record responses (field IDs are mapped to names).
  - Enriched App and List `get` output.
  - Added `In` / `Not In` filter operators.
  - Webhook trigger maps field IDs to names in the output payload.

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows when a record is created or updated in a Workiom list, and also provides action operations for managing Workiom apps, lists, and records.","capabilities":["Trigger workflows on new record creation in Workiom lists","Trigger workflows on record updates in Workiom lists","Get App details","Get Many Apps","Get List details","Create records","Get records","Get many records with pagination, field projection, quick search, and filters","Update records with patch-style field selection","Delete records"],"authentication":"Workiom API key required via n8n Workiom API credential; uses Access Token sent as X-Api-Key header, with optional custom Base URL.","commonUseCases":["Start a workflow when a Workiom record is added or changed","Sync or process Workiom list data inside n8n","Create, update, or delete Workiom records from an automation","Query Workiom records with filters and limited fields for downstream processing"],"limitations":["Workiom Trigger supports only record creation and record update events","Not tested against n8n 0.x","Requires n8nNodesApiVersion 1"],"relatedNodes":["Workiom (action node)"]}


node_type: n8n-nodes-mercateer.mercateer
package_name: n8n-nodes-mercateer
display_name: Mercateer
description: AI front-office for trades and home-services: calls, quotes, appointments, omnichannel inbox
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: mercateer-blake
author_github_url: https://github.com/ShortGenius/
npm_package_name: n8n-nodes-mercateer
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.659Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "contact",
      "options": [
        {
          "name": "Appointment",
          "value": "appointment"
        },
        {
          "name": "Call",
          "value": "call"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Conversation",
          "value": "conversation"
        },
        {
          "name": "Me",
          "value": "me"
        },
        {
          "name": "Price Book",
          "value": "priceBook"
        },
        {
          "name": "Quote",
          "value": "quote"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a contact",
          "description": "Create a contact (de-dupes by email)"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a contact",
          "description": "Delete a contact by ID"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a contact",
          "description": "Get a single contact by ID"
        },
        {
          "name": "List / Search",
          "value": "list",
          "action": "List or search contacts",
          "description": "List contacts, optionally filtered by a search term"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a contact",
          "description": "Update a contact by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a conversation",
          "description": "Get a conversation with its contact and messages"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List conversations",
          "description": "List inbox conversations"
        },
        {
          "name": "Reply",
          "value": "reply",
          "action": "Reply to a conversation",
          "description": "Post an operator reply (requires a user-scoped token)"
        },
        {
          "name": "Set Status",
          "value": "setStatus",
          "action": "Set a conversation status",
          "description": "Set the conversation status and/or tags"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "conversation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a quote",
          "description": "Persist a pre-priced quote"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a quote",
          "description": "Delete a quote by ID"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a quote",
          "description": "Get a single quote by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List quotes",
          "description": "List quotes for an organization"
        },
        {
          "name": "Update Status",
          "value": "updateStatus",
          "action": "Update a quote status",
          "description": "Mark a quote as draft, presented, accepted, or expired"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "quote"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Availability",
          "value": "availability",
          "action": "Get open booking windows",
          "description": "Open booking windows over the next week (conflict-aware)"
        },
        {
          "name": "Book",
          "value": "book",
          "action": "Book an appointment",
          "description": "Book atomically with a conflict check"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an appointment",
          "description": "Get a single appointment by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List appointments",
          "description": "List appointments for an organization"
        },
        {
          "name": "Reschedule",
          "value": "reschedule",
          "action": "Reschedule an appointment",
          "description": "Reschedule an appointment (conflict-checked)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "appointment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listServices",
      "options": [
        {
          "name": "List Services",
          "value": "listServices",
          "action": "List price book services",
          "description": "List the published price-book services"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "priceBook"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a call",
          "description": "Get a call with transcript, summary, evaluation, and collected data"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List calls",
          "description": "List voice calls for an organization"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "call"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create Endpoint",
          "value": "create",
          "action": "Create a webhook endpoint"
        },
        {
          "name": "Delete Endpoint",
          "value": "delete",
          "action": "Delete a webhook endpoint"
        },
        {
          "name": "List Endpoints",
          "value": "list",
          "action": "List webhook endpoints"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get the authenticated identity"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "me"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a contact",
      "description": "Create a contact (de-dupes by email)",
      "resource": "contact"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a contact",
      "description": "Delete a contact by ID",
      "resource": "contact"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a contact",
      "description": "Get a single contact by ID",
      "resource": "contact"
    },
    {
      "name": "List / Search",
      "value": "list",
      "action": "List or search contacts",
      "description": "List contacts, optionally filtered by a search term",
      "resource": "contact"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a contact",
      "description": "Update a contact by ID",
      "resource": "contact"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a conversation",
      "description": "Get a conversation with its contact and messages",
      "resource": "conversation"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List conversations",
      "description": "List inbox conversations",
      "resource": "conversation"
    },
    {
      "name": "Reply",
      "value": "reply",
      "action": "Reply to a conversation",
      "description": "Post an operator reply (requires a user-scoped token)",
      "resource": "conversation"
    },
    {
      "name": "Set Status",
      "value": "setStatus",
      "action": "Set a conversation status",
      "description": "Set the conversation status and/or tags",
      "resource": "conversation"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a quote",
      "description": "Persist a pre-priced quote",
      "resource": "quote"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a quote",
      "description": "Delete a quote by ID",
      "resource": "quote"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a quote",
      "description": "Get a single quote by ID",
      "resource": "quote"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List quotes",
      "description": "List quotes for an organization",
      "resource": "quote"
    },
    {
      "name": "Update Status",
      "value": "updateStatus",
      "action": "Update a quote status",
      "description": "Mark a quote as draft, presented, accepted, or expired",
      "resource": "quote"
    },
    {
      "name": "Availability",
      "value": "availability",
      "action": "Get open booking windows",
      "description": "Open booking windows over the next week (conflict-aware)",
      "resource": "appointment"
    },
    {
      "name": "Book",
      "value": "book",
      "action": "Book an appointment",
      "description": "Book atomically with a conflict check",
      "resource": "appointment"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an appointment",
      "description": "Get a single appointment by ID",
      "resource": "appointment"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List appointments",
      "description": "List appointments for an organization",
      "resource": "appointment"
    },
    {
      "name": "Reschedule",
      "value": "reschedule",
      "action": "Reschedule an appointment",
      "description": "Reschedule an appointment (conflict-checked)",
      "resource": "appointment"
    },
    {
      "name": "List Services",
      "value": "listServices",
      "action": "List price book services",
      "description": "List the published price-book services",
      "resource": "priceBook"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a call",
      "description": "Get a call with transcript, summary, evaluation, and collected data",
      "resource": "call"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List calls",
      "description": "List voice calls for an organization",
      "resource": "call"
    },
    {
      "name": "Create Endpoint",
      "value": "create",
      "action": "Create a webhook endpoint",
      "resource": "webhook"
    },
    {
      "name": "Delete Endpoint",
      "value": "delete",
      "action": "Delete a webhook endpoint",
      "resource": "webhook"
    },
    {
      "name": "List Endpoints",
      "value": "list",
      "action": "List webhook endpoints",
      "resource": "webhook"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get the authenticated identity",
      "resource": "me"
    }
  ]

npm_readme:
  # n8n-nodes-mercateer

  n8n community node for [Mercateer](https://mercateer.com), the AI front-office for trades and home-services businesses. It answers calls, quotes from a price book, books appointments, and runs an omnichannel inbox.

  ## Install

  In your n8n instance:

  ```
  npm install n8n-nodes-mercateer
  ```

  Restart n8n. The package ships two nodes (`Mercateer` and `Mercateer Trigger`) and one credential type (`Mercateer API`).

  ## Authentication

  1. Sign in to Mercateer at https://mercateer.com.
  2. Open **Settings → Developer** and create an API key.
  3. In n8n, **Credentials → New → Mercateer API** and paste the key. The default base URL (`https://api.mercateer.com/v1/mercateer`) is correct for production.

  Most operations need your organization ID. Run the **Me → Get** operation (or call `GET /v1/me`) and use `memberships[0].orgId`.

  ## Nodes

  ### Mercateer (action)

  | Resource | Operations |
  |---|---|
  | Contact      | List / Search, Get, Create, Update, Delete |
  | Conversation | List, Get, Reply, Set Status |
  | Quote        | List, Get, Create, Update Status, Delete |
  | Appointment  | List, Get, Availability, Book, Reschedule |
  | Price Book   | List Services |
  | Call         | List, Get |
  | Webhook      | List Endpoints, Create Endpoint, Delete Endpoint |
  | Me           | Get |

  ### Mercateer Trigger

  Subscribes to Mercateer front-office events and emits a workflow run per delivery. Supported events:

  - `conversation.started`
  - `conversation.handoff_requested`
  - `conversation.closed`
  - `lead.captured`
  - `contact.created`
  - `quote.accepted`
  - `appointment.booked`
  - `appointment.rescheduled`
  - `call.completed`
  - `*` (all events)

  Activating the trigger registers a webhook endpoint at Mercateer pointing at the n8n production URL. Deactivating it deletes the endpoint so you do not leak orphan subscriptions. Signatures are verified per-delivery (HMAC-SHA256, 5-minute timestamp window).

  ## Example workflows

  **Post new leads to Slack.** Add the **Mercateer Trigger** node and select the **Lead Captured** event, then connect a **Slack** node set to *Send a message*. Every caller the agent captures lands in your team channel in real time.

  **Log completed calls to a spreadsheet.** Use the **Mercateer Trigger** with the **Call Completed** event, then a **Google Sheets** node set to *Append row*. Map the caller, summary, and duration into columns to keep a running call log.

  **Book jobs from a website form.** Start with an **n8n Form Trigger** (or any inbound webhook), then add the **Mercateer** node with **Appointment → Book** to drop the request straight onto your calendar. Run **Appointment → Availability** first if you want to offer open slots back to the customer.

  **Sync new contacts to your CRM.** Trigger on **Contact Created**, then map the contact into a HubSpot, Pipedrive, or Google Contacts node so every caller is captured in your system of record.

  ## Links

  - Marketing landing page: https://mercateer.com/integrations/n8n
  - API docs: https://developers.mercateer.com
  - OpenAPI: https://api.mercateer.com/v1/openapi.json
  - Status: https://status.mercateer.com

  ## License

  MIT.

ai_documentation_summary:
  {"purpose":"Mercateer is an AI front-office platform for trades and home-services businesses. In n8n, it lets you manage calls, quotes, appointments, contacts, and omnichannel inbox events, or trigger workflows from Mercateer activity.","capabilities":["Contact management: list/search, get, create, update, delete","Conversation management: list, get, reply, set status","Quote management: list, get, create, update status, delete","Appointment management: list, get availability, book, reschedule","Price book access: list services","Call records: list and get","Webhook endpoint management: list, create, delete","Get current user/org details via Me → Get","Trigger workflows from Mercateer events such as lead captured, conversation started, appointment booked, and call completed","Webhook signature verification for trigger deliveries using HMAC-SHA256 with a 5-minute timestamp window"],"authentication":"API key required (Mercateer API credential). Create an API key in Mercateer Developer settings and paste it into n8n; most operations also require an organization ID from Me → Get.","commonUseCases":["Capture new leads from Mercateer and send them to Slack, CRM, or other systems","Log completed calls into Google Sheets or another database","Book or reschedule appointments from inbound forms or webhooks","Sync new contacts into a CRM such as HubSpot, Pipedrive, or Google Contacts","Reply to or manage customer conversations from n8n workflows"],"limitations":["Most operations require an organization ID, which must be retrieved separately from Me → Get","Trigger subscriptions depend on Mercateer webhook endpoints being created and deleted when the trigger is activated/deactivated"],"relatedNodes":["Mercateer Trigger","Slack","Google Sheets","n8n Form Trigger","HubSpot"]}


node_type: n8n-nodes-mercateer.mercateerTrigger
package_name: n8n-nodes-mercateer
display_name: Mercateer Trigger
description: Triggers when a Mercateer front-office event fires
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: mercateer-blake
author_github_url: https://github.com/ShortGenius/
npm_package_name: n8n-nodes-mercateer
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.661Z
ai_summary_generated_at: 2026-07-09 06:09:49
npm_readme:
  # n8n-nodes-mercateer

  n8n community node for [Mercateer](https://mercateer.com), the AI front-office for trades and home-services businesses. It answers calls, quotes from a price book, books appointments, and runs an omnichannel inbox.

  ## Install

  In your n8n instance:

  ```
  npm install n8n-nodes-mercateer
  ```

  Restart n8n. The package ships two nodes (`Mercateer` and `Mercateer Trigger`) and one credential type (`Mercateer API`).

  ## Authentication

  1. Sign in to Mercateer at https://mercateer.com.
  2. Open **Settings → Developer** and create an API key.
  3. In n8n, **Credentials → New → Mercateer API** and paste the key. The default base URL (`https://api.mercateer.com/v1/mercateer`) is correct for production.

  Most operations need your organization ID. Run the **Me → Get** operation (or call `GET /v1/me`) and use `memberships[0].orgId`.

  ## Nodes

  ### Mercateer (action)

  | Resource | Operations |
  |---|---|
  | Contact      | List / Search, Get, Create, Update, Delete |
  | Conversation | List, Get, Reply, Set Status |
  | Quote        | List, Get, Create, Update Status, Delete |
  | Appointment  | List, Get, Availability, Book, Reschedule |
  | Price Book   | List Services |
  | Call         | List, Get |
  | Webhook      | List Endpoints, Create Endpoint, Delete Endpoint |
  | Me           | Get |

  ### Mercateer Trigger

  Subscribes to Mercateer front-office events and emits a workflow run per delivery. Supported events:

  - `conversation.started`
  - `conversation.handoff_requested`
  - `conversation.closed`
  - `lead.captured`
  - `contact.created`
  - `quote.accepted`
  - `appointment.booked`
  - `appointment.rescheduled`
  - `call.completed`
  - `*` (all events)

  Activating the trigger registers a webhook endpoint at Mercateer pointing at the n8n production URL. Deactivating it deletes the endpoint so you do not leak orphan subscriptions. Signatures are verified per-delivery (HMAC-SHA256, 5-minute timestamp window).

  ## Example workflows

  **Post new leads to Slack.** Add the **Mercateer Trigger** node and select the **Lead Captured** event, then connect a **Slack** node set to *Send a message*. Every caller the agent captures lands in your team channel in real time.

  **Log completed calls to a spreadsheet.** Use the **Mercateer Trigger** with the **Call Completed** event, then a **Google Sheets** node set to *Append row*. Map the caller, summary, and duration into columns to keep a running call log.

  **Book jobs from a website form.** Start with an **n8n Form Trigger** (or any inbound webhook), then add the **Mercateer** node with **Appointment → Book** to drop the request straight onto your calendar. Run **Appointment → Availability** first if you want to offer open slots back to the customer.

  **Sync new contacts to your CRM.** Trigger on **Contact Created**, then map the contact into a HubSpot, Pipedrive, or Google Contacts node so every caller is captured in your system of record.

  ## Links

  - Marketing landing page: https://mercateer.com/integrations/n8n
  - API docs: https://developers.mercateer.com
  - OpenAPI: https://api.mercateer.com/v1/openapi.json
  - Status: https://status.mercateer.com

  ## License

  MIT.

ai_documentation_summary:
  {"purpose":"Triggers workflows when Mercateer front-office events occur, and supports Mercateer API actions for managing contacts, conversations, quotes, appointments, calls, webhooks, and account info.","capabilities":["Triggers on Mercateer events such as conversation.started, lead.captured, contact.created, quote.accepted, appointment.booked, call.completed, and all events (*)","Automatically registers and removes a Mercateer webhook endpoint when the trigger is activated or deactivated","Verifies trigger delivery signatures using HMAC-SHA256 with a 5-minute timestamp window","Contact management: list/search, get, create, update, delete","Conversation management: list, get, reply, set status","Quote management: list, get, create, update status, delete","Appointment management: list, get, check availability, book, reschedule","Price book service listing","Call listing and retrieval","Webhook endpoint management: list, create, delete"],"authentication":"API key required (Mercateer API credential with a developer-generated key)","commonUseCases":["Capture new leads or contacts from Mercateer and sync them to Slack, CRM, or other systems","Log completed calls to spreadsheets or other record-keeping tools","Book, reschedule, or check availability for appointments from forms or inbound webhooks","Build event-driven automations for Mercateer conversations, quotes, and appointments","Manage Mercateer data such as contacts, conversations, quotes, calls, and webhooks from n8n"],"limitations":["Most operations require the organization ID, which must be obtained via Me → Get or GET /v1/me","Trigger subscriptions depend on Mercateer webhook registration and use the n8n production URL"],"relatedNodes":["Mercateer","Slack","Google Sheets","HubSpot","Pipedrive"]}


node_type: @itservtechnology/n8n-nodes-itoc360.itoc360
package_name: @itservtechnology/n8n-nodes-itoc360
display_name: ITOC360
description: Send alert and resolve events to ITOC360
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: talhabektas
author_github_url: https://github.com/talhabektas/n8n-nodes-itoc360.git
npm_package_name: @itservtechnology/n8n-nodes-itoc360
npm_version: 0.1.5
community_fetched_at: 2026-07-14T14:40:34.662Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "alert",
      "options": [
        {
          "name": "Resolve Alert",
          "value": "resolve",
          "action": "Resolve an alert",
          "description": "Resolve an existing alert in ITOC360"
        },
        {
          "name": "Send Alert",
          "value": "alert",
          "action": "Send an alert",
          "description": "Trigger a new alert in ITOC360"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Resolve Alert",
      "value": "resolve",
      "action": "Resolve an alert",
      "description": "Resolve an existing alert in ITOC360"
    },
    {
      "name": "Send Alert",
      "value": "alert",
      "action": "Send an alert",
      "description": "Trigger a new alert in ITOC360"
    }
  ]

npm_readme:
  # n8n-nodes-itoc360

  This is an n8n community node. It lets you send alerts to [ITOC360](https://itoc360.com) from your n8n workflows.

  ITOC360 is an alert routing and on-call management platform. It ingests alerts from monitoring, observability, CI/CD, and security tools, correlates them into incidents, and routes them to the right on-call responders through escalation policies and multi-channel notifications.

  [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

  - **Send Alert** — Trigger a new alert in ITOC360.
  - **Resolve Alert** — Resolve an existing alert in ITOC360.

  Alerts sent with the same **Title**, **Host**, and **Source** are grouped together, so a Resolve Alert with matching values will close the alert opened by a previous Send Alert.

  ### Fields

  | Field | Required | Description |
  | --- | --- | --- |
  | Title | Yes | Short summary of the alert |
  | Host | Yes | Source host or system identifier |
  | Severity | Yes | `low`, `medium`, `high`, or `critical` |
  | Message | No | Detailed alert message |
  | Source | No | n8n workflow name or identifier |
  | Timestamp | No | ISO 8601 timestamp |

  ## Credentials

  To use this node you need an ITOC360 account with an n8n source:

  1. In ITOC360, go to **Sources**, click **Create Source**, and select **n8n** from the list.
  2. Copy the source's **webhook URL** and **token**.
  3. In n8n, create new **ITOC360 API** credentials and paste the webhook URL and token.

  ## Compatibility

  Tested with n8n 2.28.5 and Node.js 22+.
  ## Usage

  Add the **ITOC360** node to a workflow, select **Send Alert**, and fill in the title, host, and severity. When the workflow runs, the alert appears in ITOC360 and is routed according to your escalation policy. Use **Resolve Alert** with the same title, host, and source to close it.

  ## Resources

  - [ITOC360 n8n integration guide](https://docs.itoc360.com/integrations/inbound-integrations/workflow-and-automation/n8n-integration)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [ITOC360 documentation](https://docs.itoc360.com)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Sends alerts from n8n workflows to ITOC360 for incident routing and on-call management, and can also resolve previously sent alerts. It is used to create and close alerts in ITOC360 based on workflow events.","capabilities":["Send Alert operation to trigger a new alert in ITOC360","Resolve Alert operation to close an existing alert in ITOC360","Groups alerts by matching Title, Host, and Source to correlate send and resolve events","Supports alert fields including Title, Host, Severity, Message, Source, and Timestamp"],"authentication":"ITOC360 API credentials required: webhook URL and token from an ITOC360 n8n source","commonUseCases":["Forwarding monitoring or observability alerts from n8n to ITOC360","Sending CI/CD or security notifications into an on-call incident workflow","Resolving incidents in ITOC360 when a workflow condition clears"],"limitations":["Alerts can only be resolved when Title, Host, and Source match the original alert","Severity is limited to low, medium, high, or critical","Requires an existing ITOC360 account and configured n8n source"],"relatedNodes":[]}


node_type: n8n-nodes-socialapi.socialApi
package_name: n8n-nodes-socialapi
display_name: SocialAPI
description: Manage social accounts, posts, and the inbox via SocialAPI
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: noooste
author_github_url: https://github.com/SocialAPI-AI/
npm_package_name: n8n-nodes-socialapi
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.663Z
ai_summary_generated_at: 2026-07-09 06:09:49
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Brand",
          "value": "brand"
        },
        {
          "name": "Comment",
          "value": "comment"
        },
        {
          "name": "Conversation",
          "value": "conversation"
        },
        {
          "name": "Media",
          "value": "media"
        },
        {
          "name": "Mention",
          "value": "mention"
        },
        {
          "name": "Post",
          "value": "post"
        },
        {
          "name": "Review",
          "value": "review"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Connect",
          "value": "connect",
          "action": "Start an account connection"
        },
        {
          "name": "Disconnect",
          "value": "disconnect",
          "action": "Disconnect an account"
        },
        {
          "name": "Exchange OAuth",
          "value": "exchange",
          "action": "Exchange an authorization code"
        },
        {
          "name": "Get Limits",
          "value": "getLimits",
          "action": "Get account usage limits"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many accounts"
        },
        {
          "name": "List Pages",
          "value": "listPages",
          "action": "List account pages"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a post"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a post"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a post"
        },
        {
          "name": "Get Constraints",
          "value": "getConstraints",
          "action": "Get publishing constraints"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many posts"
        },
        {
          "name": "Get Metrics",
          "value": "getMetrics",
          "action": "Get post metrics"
        },
        {
          "name": "Publish Draft",
          "value": "publish",
          "action": "Publish a draft post"
        },
        {
          "name": "Retry",
          "value": "retry",
          "action": "Retry a failed post"
        },
        {
          "name": "Unpublish",
          "value": "unpublish",
          "action": "Unpublish a post"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a post"
        },
        {
          "name": "Validate",
          "value": "validate",
          "action": "Validate a post"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "post"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a comment"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many comments on a post"
        },
        {
          "name": "Get Replies",
          "value": "getReplies",
          "action": "Get replies to a comment"
        },
        {
          "name": "Hide",
          "value": "hide",
          "action": "Hide a comment"
        },
        {
          "name": "Like",
          "value": "like",
          "action": "Like a comment"
        },
        {
          "name": "List Commented Posts",
          "value": "listPosts",
          "action": "List posts that have comments"
        },
        {
          "name": "Private Reply",
          "value": "privateReply",
          "action": "Send a private reply"
        },
        {
          "name": "Reply",
          "value": "reply",
          "action": "Reply to a comment"
        },
        {
          "name": "Unhide",
          "value": "unhide",
          "action": "Unhide a comment"
        },
        {
          "name": "Unlike",
          "value": "unlike",
          "action": "Unlike a comment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "comment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a conversation"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many conversations"
        },
        {
          "name": "List Messages",
          "value": "listMessages",
          "action": "List messages"
        },
        {
          "name": "Mark Read",
          "value": "markRead",
          "action": "Mark a conversation as read"
        },
        {
          "name": "Send Message",
          "value": "send",
          "action": "Send a direct message"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a conversation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "conversation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many reviews"
        },
        {
          "name": "Reply",
          "value": "reply",
          "action": "Reply to a review"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "review"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many mentions"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "mention"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a brand"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a brand"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many brands"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a brand"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "brand"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a media item"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many media items"
        },
        {
          "name": "Get Storage Usage",
          "value": "storage",
          "action": "Get storage usage"
        },
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload a media file"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "media"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Connect",
      "value": "connect",
      "action": "Start an account connection",
      "resource": "account"
    },
    {
      "name": "Disconnect",
      "value": "disconnect",
      "action": "Disconnect an account",
      "resource": "account"
    },
    {
      "name": "Exchange OAuth",
      "value": "exchange",
      "action": "Exchange an authorization code",
      "resource": "account"
    },
    {
      "name": "Get Limits",
      "value": "getLimits",
      "action": "Get account usage limits",
      "resource": "account"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many accounts",
      "resource": "account"
    },
    {
      "name": "List Pages",
      "value": "listPages",
      "action": "List account pages",
      "resource": "account"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a post",
      "resource": "post"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a post",
      "resource": "post"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a post",
      "resource": "post"
    },
    {
      "name": "Get Constraints",
      "value": "getConstraints",
      "action": "Get publishing constraints",
      "resource": "post"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many posts",
      "resource": "post"
    },
    {
      "name": "Get Metrics",
      "value": "getMetrics",
      "action": "Get post metrics",
      "resource": "post"
    },
    {
      "name": "Publish Draft",
      "value": "publish",
      "action": "Publish a draft post",
      "resource": "post"
    },
    {
      "name": "Retry",
      "value": "retry",
      "action": "Retry a failed post",
      "resource": "post"
    },
    {
      "name": "Unpublish",
      "value": "unpublish",
      "action": "Unpublish a post",
      "resource": "post"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a post",
      "resource": "post"
    },
    {
      "name": "Validate",
      "value": "validate",
      "action": "Validate a post",
      "resource": "post"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a comment",
      "resource": "comment"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many comments on a post",
      "resource": "comment"
    },
    {
      "name": "Get Replies",
      "value": "getReplies",
      "action": "Get replies to a comment",
      "resource": "comment"
    },
    {
      "name": "Hide",
      "value": "hide",
      "action": "Hide a comment",
      "resource": "comment"
    },
    {
      "name": "Like",
      "value": "like",
      "action": "Like a comment",
      "resource": "comment"
    },
    {
      "name": "List Commented Posts",
      "value": "listPosts",
      "action": "List posts that have comments",
      "resource": "comment"
    },
    {
      "name": "Private Reply",
      "value": "privateReply",
      "action": "Send a private reply",
      "resource": "comment"
    },
    {
      "name": "Reply",
      "value": "reply",
      "action": "Reply to a comment",
      "resource": "comment"
    },
    {
      "name": "Unhide",
      "value": "unhide",
      "action": "Unhide a comment",
      "resource": "comment"
    },
    {
      "name": "Unlike",
      "value": "unlike",
      "action": "Unlike a comment",
      "resource": "comment"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a conversation",
      "resource": "conversation"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many conversations",
      "resource": "conversation"
    },
    {
      "name": "List Messages",
      "value": "listMessages",
      "action": "List messages",
      "resource": "conversation"
    },
    {
      "name": "Mark Read",
      "value": "markRead",
      "action": "Mark a conversation as read",
      "resource": "conversation"
    },
    {
      "name": "Send Message",
      "value": "send",
      "action": "Send a direct message",
      "resource": "conversation"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a conversation",
      "resource": "conversation"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many reviews",
      "resource": "review"
    },
    {
      "name": "Reply",
      "value": "reply",
      "action": "Reply to a review",
      "resource": "review"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many mentions",
      "resource": "mention"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a brand",
      "resource": "brand"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a brand",
      "resource": "brand"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many brands",
      "resource": "brand"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a brand",
      "resource": "brand"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a media item",
      "resource": "media"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many media items",
      "resource": "media"
    },
    {
      "name": "Get Storage Usage",
      "value": "storage",
      "action": "Get storage usage",
      "resource": "media"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload a media file",
      "resource": "media"
    }
  ]

npm_readme:
  # n8n-nodes-socialapi

  [n8n](https://n8n.io) community nodes for [SocialAPI.ai](https://social-api.ai). Manage social accounts, publish posts, work the unified inbox (comments, DMs, reviews, mentions), and trigger workflows on real-time events.

  ## Installation

  Install from inside n8n:

  1. Open **Settings** (gear icon, bottom-left).
  2. Go to **Community Nodes**.
  3. Click **Install a community node**.
  4. Enter `n8n-nodes-socialapi` and click **Install**.

  The **SocialAPI** action node and the **SocialAPI Trigger** node will appear in your node panel after installation.

  ## Credential setup

  1. Log in to [SocialAPI.ai](https://social-api.ai) and open **Settings > API Keys**.
  2. Click **Create key**. Your key starts with `sapi_key_`. Copy it now (it is shown only once).
  3. In n8n, open **Credentials** and create a new **SocialAPI API** credential.
  4. Paste your key into **API Key** and leave **Base URL** at the default (`https://api.social-api.ai`).
  5. Click **Test** to verify the credential hits your account.

  ## Resource and operation reference

  ### Account

  | Operation | Description |
  |---|---|
  | Connect | Start an OAuth connection for a platform |
  | Disconnect | Disconnect a connected account |
  | Exchange OAuth | Exchange an authorization code for a token |
  | Get Limits | Get usage limits for an account |
  | Get Many | List connected accounts (optionally filtered by Brand ID) |
  | List Pages | List pages associated with an account |

  ### Post

  | Operation | Description |
  |---|---|
  | Create | Create a post (draft, scheduled, or publish-now) |
  | Delete | Delete a post |
  | Get | Get a single post by ID |
  | Get Constraints | Fetch per-platform publishing constraints |
  | Get Many | List posts with optional filters (status, platform, date range, search) |
  | Get Metrics | Refresh and return live engagement metrics for a post |
  | Publish Draft | Publish a saved draft immediately |
  | Retry | Retry a failed post delivery |
  | Unpublish | Unpublish a published post (optionally from specific accounts only) |
  | Update | Update a post's text or scheduled time |
  | Validate | Validate post content against platform constraints before publishing |

  ### Comment

  | Operation | Description |
  |---|---|
  | Delete | Delete a comment |
  | Get Many | Get comments on a specific post |
  | Get Replies | Get replies to a specific comment |
  | Hide | Hide a comment |
  | Like | Like a comment |
  | List Commented Posts | List inbox posts that have comments |
  | Private Reply | Send a private DM reply to a comment author |
  | Reply | Reply to a comment (at post level or as a thread reply) |
  | Unhide | Unhide a previously hidden comment |
  | Unlike | Unlike a comment |

  ### Conversation (DM)

  | Operation | Description |
  |---|---|
  | Get | Get a single conversation by ID |
  | Get Many | List conversations (filterable by account or platform) |
  | List Messages | List messages in a conversation |
  | Mark Read | Mark a conversation as read |
  | Send Message | Send a direct message in a conversation |
  | Update | Update conversation metadata (e.g. mark read/unread) |

  ### Review

  | Operation | Description |
  |---|---|
  | Get Many | List reviews (filterable by account) |
  | Reply | Post a reply to a review |

  Note: only listing and replying are available over the API. Update/delete reply are not supported.

  ### Mention

  | Operation | Description |
  |---|---|
  | Get Many | List mentions for a specific account |

  ### Brand

  | Operation | Description |
  |---|---|
  | Create | Create a brand (a logical grouping of accounts) |
  | Delete | Delete a brand |
  | Get Many | List all brands |
  | Update | Rename a brand |

  Note: there is no get-single-brand operation. Use Get Many to retrieve brand details.

  ### Media

  | Operation | Description |
  |---|---|
  | Delete | Delete a media item |
  | Get Many | List uploaded media items |
  | Get Storage Usage | Get current storage usage for your account |
  | Upload | Upload a file using the presigned flow (presign, PUT to storage, verify). Supports binary data from a previous node or a URL. No file size cap. |

  ## SocialAPI Trigger

  The **SocialAPI Trigger** node starts a workflow when a SocialAPI event fires (e.g. `comment.received`, `dm.received`, `review.received`, `post.published`).

  **Important: the trigger requires a publicly reachable n8n instance.** SocialAPI must be able to deliver HTTP POST requests to your n8n webhook URL. Use n8n Cloud, or a self-hosted instance with a public domain and HTTPS. The trigger will not work from a local `localhost` instance unless you expose it via a tunnel (e.g. ngrok).

  When a workflow using the trigger node is activated, it registers a webhook with SocialAPI automatically. When you deactivate the workflow, the webhook is removed.

  ## Example workflows

  ### 1. Publish a scheduled post to Instagram and LinkedIn

  This workflow creates a post scheduled for a future date, targeting multiple connected accounts.

  1. Add a **Manual Trigger** (or any trigger that provides post content).
  2. Add a **SocialAPI** node. Set **Resource** to `Post` and **Operation** to `Create`.
  3. Fill in **Text** with the post body.
  4. Under **Targets**, add one entry per account: set **Account ID** to your Instagram account ID and another entry for your LinkedIn account ID.
  5. Under **Additional Fields**, set **Schedule At** to the desired publish time (ISO 8601 or a datetime expression).
  6. Execute the workflow. The post is created as `scheduled` and will publish at the specified time.

  To publish immediately instead of scheduling, set **Publish Now** to `true` under Additional Fields and omit the Schedule At date.

  ### 2. Auto-reply to new comments via the SocialAPI Trigger

  This workflow listens for new comments and posts an automatic reply.

  1. Add a **SocialAPI Trigger** node. Select `comment.received` in the **Events** field.
  2. (Optional) Set **Account ID Filter** to limit the trigger to a specific connected account.
  3. Add an **IF** node. Check `{{ $json.data.is_reply }}` equals `false` to skip replies and avoid loops.
  4. On the `true` (non-reply) branch, add a **SocialAPI** node. Set **Resource** to `Comment` and **Operation** to `Reply`.
  5. Set **Inbox Post ID** to `{{ $json.data.post_id }}` and **Text** to your automated reply message.
  6. Activate the workflow. Each new top-level comment triggers an auto-reply.

  Note: activating the workflow registers the webhook with SocialAPI. Your n8n instance must be publicly reachable for delivery to succeed.

  ### 3. Upload a large video then publish it as a post

  This workflow uploads a video file (any size) to SocialAPI storage and then creates a post that includes the video.

  1. Add a **Read Binary File** node (or an **HTTP Request** node set to return binary data) to load your video file.
  2. Add a **SocialAPI** node. Set **Resource** to `Media` and **Operation** to `Upload`.
     - Set **Source** to `Binary File` and **Input Binary Field** to `data` (or the binary property name from step 1).
     - The node runs the three-step presigned upload: it fetches a presigned URL, PUTs the file directly to storage, and then verifies the upload. The returned item includes a `media_id`.
  3. Add a second **SocialAPI** node. Set **Resource** to `Post` and **Operation** to `Create`.
  4. Set **Text** to the post caption.
  5. Under **Targets**, add the account(s) to publish to.
  6. Under **Additional Fields**, set **Media IDs** to `{{ $json.media_id }}` (the ID returned by the Upload step).
  7. Set **Publish Now** to `true` to publish immediately, or set **Schedule At** to schedule it.
  8. Execute the workflow. The video is uploaded and the post is created with it attached.

  ## License

  MIT. See [LICENSE](LICENSE).

ai_documentation_summary:
  {"purpose":"SocialAPI n8n community node for managing social accounts, publishing and moderating content, and handling unified inbox interactions across supported social platforms. It also includes a trigger node for real-time workflow automation on SocialAPI events.","capabilities":["Manage connected social accounts: connect, disconnect, exchange OAuth codes, get limits, list accounts, and list pages","Create, update, delete, validate, publish, unpublish, retry, and fetch social posts and engagement metrics","Moderate comments: list, reply, private reply, like/unlike, hide/unhide, delete, and fetch replies","Handle direct messages and conversations: list conversations, get conversation details, list messages, send messages, mark read, and update conversation metadata","List and reply to reviews","List mentions for an account","Create, update, delete, and list brands","Upload, list, and delete media; check storage usage","Trigger workflows on events such as comment.received, dm.received, review.received, and post.published"],"authentication":"API key required (SocialAPI API credential using a key starting with sapi_key_; base URL defaults to https://api.social-api.ai)","commonUseCases":["Schedule or publish posts to multiple social accounts from n8n","Automatically respond to comments or direct messages using the SocialAPI Trigger","Monitor and manage a unified social inbox for comments, DMs, reviews, and mentions","Organize connected accounts into brands and manage media assets for publishing"],"limitations":["Trigger requires a publicly reachable n8n instance; localhost will not work unless exposed via a tunnel","No get-single-brand operation; brand details must be retrieved via Get Many","Reviews API only supports listing and replying; update/delete reply are not supported"],"relatedNodes":["SocialAPI Trigger","Manual Trigger"]}


node_type: n8n-nodes-socialapi.socialApiTrigger
package_name: n8n-nodes-socialapi
display_name: SocialAPI Trigger
description: Starts a workflow on SocialAPI events (comments, DMs, reviews, mentions, posts)
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: noooste
author_github_url: https://github.com/SocialAPI-AI/
npm_package_name: n8n-nodes-socialapi
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.665Z
ai_summary_generated_at: 2026-07-09 06:09:49
npm_readme:
  # n8n-nodes-socialapi

  [n8n](https://n8n.io) community nodes for [SocialAPI.ai](https://social-api.ai). Manage social accounts, publish posts, work the unified inbox (comments, DMs, reviews, mentions), and trigger workflows on real-time events.

  ## Installation

  Install from inside n8n:

  1. Open **Settings** (gear icon, bottom-left).
  2. Go to **Community Nodes**.
  3. Click **Install a community node**.
  4. Enter `n8n-nodes-socialapi` and click **Install**.

  The **SocialAPI** action node and the **SocialAPI Trigger** node will appear in your node panel after installation.

  ## Credential setup

  1. Log in to [SocialAPI.ai](https://social-api.ai) and open **Settings > API Keys**.
  2. Click **Create key**. Your key starts with `sapi_key_`. Copy it now (it is shown only once).
  3. In n8n, open **Credentials** and create a new **SocialAPI API** credential.
  4. Paste your key into **API Key** and leave **Base URL** at the default (`https://api.social-api.ai`).
  5. Click **Test** to verify the credential hits your account.

  ## Resource and operation reference

  ### Account

  | Operation | Description |
  |---|---|
  | Connect | Start an OAuth connection for a platform |
  | Disconnect | Disconnect a connected account |
  | Exchange OAuth | Exchange an authorization code for a token |
  | Get Limits | Get usage limits for an account |
  | Get Many | List connected accounts (optionally filtered by Brand ID) |
  | List Pages | List pages associated with an account |

  ### Post

  | Operation | Description |
  |---|---|
  | Create | Create a post (draft, scheduled, or publish-now) |
  | Delete | Delete a post |
  | Get | Get a single post by ID |
  | Get Constraints | Fetch per-platform publishing constraints |
  | Get Many | List posts with optional filters (status, platform, date range, search) |
  | Get Metrics | Refresh and return live engagement metrics for a post |
  | Publish Draft | Publish a saved draft immediately |
  | Retry | Retry a failed post delivery |
  | Unpublish | Unpublish a published post (optionally from specific accounts only) |
  | Update | Update a post's text or scheduled time |
  | Validate | Validate post content against platform constraints before publishing |

  ### Comment

  | Operation | Description |
  |---|---|
  | Delete | Delete a comment |
  | Get Many | Get comments on a specific post |
  | Get Replies | Get replies to a specific comment |
  | Hide | Hide a comment |
  | Like | Like a comment |
  | List Commented Posts | List inbox posts that have comments |
  | Private Reply | Send a private DM reply to a comment author |
  | Reply | Reply to a comment (at post level or as a thread reply) |
  | Unhide | Unhide a previously hidden comment |
  | Unlike | Unlike a comment |

  ### Conversation (DM)

  | Operation | Description |
  |---|---|
  | Get | Get a single conversation by ID |
  | Get Many | List conversations (filterable by account or platform) |
  | List Messages | List messages in a conversation |
  | Mark Read | Mark a conversation as read |
  | Send Message | Send a direct message in a conversation |
  | Update | Update conversation metadata (e.g. mark read/unread) |

  ### Review

  | Operation | Description |
  |---|---|
  | Get Many | List reviews (filterable by account) |
  | Reply | Post a reply to a review |

  Note: only listing and replying are available over the API. Update/delete reply are not supported.

  ### Mention

  | Operation | Description |
  |---|---|
  | Get Many | List mentions for a specific account |

  ### Brand

  | Operation | Description |
  |---|---|
  | Create | Create a brand (a logical grouping of accounts) |
  | Delete | Delete a brand |
  | Get Many | List all brands |
  | Update | Rename a brand |

  Note: there is no get-single-brand operation. Use Get Many to retrieve brand details.

  ### Media

  | Operation | Description |
  |---|---|
  | Delete | Delete a media item |
  | Get Many | List uploaded media items |
  | Get Storage Usage | Get current storage usage for your account |
  | Upload | Upload a file using the presigned flow (presign, PUT to storage, verify). Supports binary data from a previous node or a URL. No file size cap. |

  ## SocialAPI Trigger

  The **SocialAPI Trigger** node starts a workflow when a SocialAPI event fires (e.g. `comment.received`, `dm.received`, `review.received`, `post.published`).

  **Important: the trigger requires a publicly reachable n8n instance.** SocialAPI must be able to deliver HTTP POST requests to your n8n webhook URL. Use n8n Cloud, or a self-hosted instance with a public domain and HTTPS. The trigger will not work from a local `localhost` instance unless you expose it via a tunnel (e.g. ngrok).

  When a workflow using the trigger node is activated, it registers a webhook with SocialAPI automatically. When you deactivate the workflow, the webhook is removed.

  ## Example workflows

  ### 1. Publish a scheduled post to Instagram and LinkedIn

  This workflow creates a post scheduled for a future date, targeting multiple connected accounts.

  1. Add a **Manual Trigger** (or any trigger that provides post content).
  2. Add a **SocialAPI** node. Set **Resource** to `Post` and **Operation** to `Create`.
  3. Fill in **Text** with the post body.
  4. Under **Targets**, add one entry per account: set **Account ID** to your Instagram account ID and another entry for your LinkedIn account ID.
  5. Under **Additional Fields**, set **Schedule At** to the desired publish time (ISO 8601 or a datetime expression).
  6. Execute the workflow. The post is created as `scheduled` and will publish at the specified time.

  To publish immediately instead of scheduling, set **Publish Now** to `true` under Additional Fields and omit the Schedule At date.

  ### 2. Auto-reply to new comments via the SocialAPI Trigger

  This workflow listens for new comments and posts an automatic reply.

  1. Add a **SocialAPI Trigger** node. Select `comment.received` in the **Events** field.
  2. (Optional) Set **Account ID Filter** to limit the trigger to a specific connected account.
  3. Add an **IF** node. Check `{{ $json.data.is_reply }}` equals `false` to skip replies and avoid loops.
  4. On the `true` (non-reply) branch, add a **SocialAPI** node. Set **Resource** to `Comment` and **Operation** to `Reply`.
  5. Set **Inbox Post ID** to `{{ $json.data.post_id }}` and **Text** to your automated reply message.
  6. Activate the workflow. Each new top-level comment triggers an auto-reply.

  Note: activating the workflow registers the webhook with SocialAPI. Your n8n instance must be publicly reachable for delivery to succeed.

  ### 3. Upload a large video then publish it as a post

  This workflow uploads a video file (any size) to SocialAPI storage and then creates a post that includes the video.

  1. Add a **Read Binary File** node (or an **HTTP Request** node set to return binary data) to load your video file.
  2. Add a **SocialAPI** node. Set **Resource** to `Media` and **Operation** to `Upload`.
     - Set **Source** to `Binary File` and **Input Binary Field** to `data` (or the binary property name from step 1).
     - The node runs the three-step presigned upload: it fetches a presigned URL, PUTs the file directly to storage, and then verifies the upload. The returned item includes a `media_id`.
  3. Add a second **SocialAPI** node. Set **Resource** to `Post` and **Operation** to `Create`.
  4. Set **Text** to the post caption.
  5. Under **Targets**, add the account(s) to publish to.
  6. Under **Additional Fields**, set **Media IDs** to `{{ $json.media_id }}` (the ID returned by the Upload step).
  7. Set **Publish Now** to `true` to publish immediately, or set **Schedule At** to schedule it.
  8. Execute the workflow. The video is uploaded and the post is created with it attached.

  ## License

  MIT. See [LICENSE](LICENSE).

ai_documentation_summary:
  {"purpose":"Starts a workflow when SocialAPI events occur, such as new comments, direct messages, reviews, mentions, or published posts. It is used to automate responses and actions based on real-time SocialAPI activity.","capabilities":["Triggers workflows on SocialAPI webhook events","Supports events such as comment.received, dm.received, review.received, and post.published","Automatically registers a webhook when the workflow is activated","Automatically removes the webhook when the workflow is deactivated"],"authentication":"API key required via a SocialAPI API credential (API key starts with sapi_key_).","commonUseCases":["Auto-replying to new comments","Starting workflows when a direct message or review is received","Reacting to post publication events in real time"],"limitations":["Requires a publicly reachable n8n instance with HTTPS","Will not work on localhost unless exposed through a tunnel such as ngrok"],"relatedNodes":["SocialAPI"]}


node_type: n8n-nodes-xmemory.xmemory
package_name: n8n-nodes-xmemory
display_name: Xmemory
description: Memory operations via Xmemory API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: alexgxmemory
author_github_url: https://github.com/xmemory-ai/
npm_package_name: n8n-nodes-xmemory
npm_version: 0.8.1
community_fetched_at: 2026-07-14T14:40:34.666Z
ai_summary_generated_at: 2026-07-14 15:01:34
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "read",
      "options": [
        {
          "name": "Read",
          "value": "read",
          "action": "Read from instance",
          "description": "Query memory from an instance"
        },
        {
          "name": "Write",
          "value": "write",
          "action": "Write to instance",
          "description": "Write text into an instance"
        },
        {
          "name": "Create Instance",
          "value": "create_instance",
          "action": "Create instance",
          "description": "Create a new Xmemory instance from schema"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Read",
      "value": "read",
      "action": "Read from instance",
      "description": "Query memory from an instance"
    },
    {
      "name": "Write",
      "value": "write",
      "action": "Write to instance",
      "description": "Write text into an instance"
    },
    {
      "name": "Create Instance",
      "value": "create_instance",
      "action": "Create instance",
      "description": "Create a new Xmemory instance from schema"
    }
  ]

npm_readme:
  # n8n-nodes-xmemory

  **xmemory** is a memory interface with natural-language inputs and outputs, backed by schema under the hood.

  Community n8n node for [xmemory](https://xmemory.ai) `read`, `write`, and `create instance` operations. [This overview](https://xmemory.ai/integration-overview/) gives detailed description of xmemory.

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

  ## Installation

  Check out [installation guide](https://xmemory.ai/n8n) and register your interest at [xmemory website](https://xmemory.ai) to get an API key.

  ## Operations

  - `Create Instance`: Calls `POST /clusters/{cluster_id}/instances`. Pick a **Cluster** (from the list by name, or by ID), and provide an **Instance Name** and a valid XMD **Schema** (JSON or YAML). Xmemory requires a schema to create an instance.
  - `Write`: Calls `POST /instances/{instance_id}/write`. Writes text into memory using the instance schema. `Fast` (default) and `deep` extraction modes are supported. Optionally pass a **Trace ID** and toggle **Diff Engine**.
  - `Read`: Calls `POST /instances/{instance_id}/read`. Queries memory using a free-form natural-language query. Supported modes: `single-answer` (short summary), `raw-tables` (structured SQL-like representation), `xresponse` (schema-based structured response). Optionally restrict the read to specific objects via **Scope Objects** (identified by their user-defined primary key) together with a **Relations Scope** (`no_relations` or `all_relations`), and pass a **Trace ID**.

  Every operation returns the xmemory API payload directly: the response envelope (`{ids, items, errors, console_url}`) is unwrapped, so downstream nodes receive the operation result (read result, `write_id`, created instance, …). Errors are raised as node errors.

  ### How account errors surface

  When the xmemory accounts API rejects a call, the node turns the structured error envelope (`errors[0].code` / `details`) into a readable node-error message rather than a bare HTTP status:

  - **Quota exhausted** (`HTTP 402`, code `QUOTA_EXCEEDED`): the message notes the daily or monthly limit and, when the server provides one, a `retry after Ns` hint. This is **not** retried automatically — the tenant has used up its plan allowance.
  - **Trial ended / subscription lapsed** (`HTTP 402`, code `TRIAL_ENDED`): the message hints to subscribe to continue. Not retryable.
  - **Rate limited** (`HTTP 429`, code `RATE_LIMITED`): a genuine velocity limit; the message labels it as such. n8n's HTTP layer may itself retry `429`s, but the node adds no extra retry logic.

  If you enable workflow-level **Retry On Fail**, note that quota and trial errors are not transient and will keep failing until the underlying account state changes.

  ## Credentials

  - `Base URL`: xmemory API base URL, for example `https://api.xmemory.ai`.
  - `API Key`: API key used to authenticate against the xmemory API (sent as `Authorization: Bearer <key>`). Register your interest at [xmemory.ai](https://xmemory.ai); we will reach out to discuss your scenario and issue an API key.

  ## Resources

  - [tutorial for xmemory usage from n8n](https://xmemory.ai/n8n/)
  - [xmemory documentation](https://xmemory.ai/integration-overview/)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

  ## Compatibility

  This package targets the current community-node API version (`n8nNodesApiVersion: 1`). Validate against the n8n version you run in your environment.

  ## Releasing

  Releases are manual and version-driven:

  1. Bump the `version` in `package.json` via a pull request and merge it to `main`.
  2. Run the **Publish** workflow (`Actions` → `Publish` → `Run workflow`, or `gh workflow run publish.yml`).

  The workflow publishes the current `package.json` version to npm and then pushes a matching git tag (`X.Y.Z`). If a tag for that version already exists, the run fails — bump the version first.

ai_documentation_summary:
  {"purpose":"Provides n8n operations for using xmemory as a natural-language memory interface backed by schemas. It can create memory instances, write text into memory, and query memory through the Xmemory API.","capabilities":["Create xmemory instances in a selected cluster using an instance name and XMD schema in JSON or YAML","Write text into a memory instance using the instance schema","Choose fast or deep extraction mode for write operations","Optionally pass a trace ID during write operations","Optionally enable or disable the Diff Engine during write operations","Read/query memory using free-form natural-language queries","Use read modes including single-answer, raw-tables, and xresponse","Restrict read operations to specific scope objects by user-defined primary key","Configure relations scope for reads using no_relations or all_relations","Returns unwrapped Xmemory API operation results directly to downstream nodes"],"authentication":"API key required. Configure the Xmemory API Base URL and an API Key sent as Authorization: Bearer <key>.","commonUseCases":["Create a new schema-backed memory instance for an application or workflow","Store user messages, notes, events, or other text into structured memory","Query stored memory using natural language and receive summaries or structured responses","Extract structured data from text using fast or deep extraction modes","Scope memory reads to specific objects and optionally include related objects"],"limitations":["Creating an instance requires a valid XMD schema","API key access requires registering interest with xmemory.ai","Quota exhausted and trial ended errors are not retried automatically and will keep failing until the account state changes","The node adds no extra retry logic for rate limits beyond any retry behavior provided by n8n's HTTP layer","Package targets n8n community-node API version 1; compatibility should be validated against the user's n8n version"],"relatedNodes":[]}


node_type: n8n-nodes-trestle.trestle
package_name: n8n-nodes-trestle
display_name: Trestle
description: Validate phone numbers, emails, and contacts using Trestle APIs.
category: Community
development_style: declarative
version: 2
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: trestleiq
author_github_url: https://github.com/TrestleIQ/
npm_package_name: n8n-nodes-trestle
npm_version: 0.2.8
community_fetched_at: 2026-07-14T14:40:34.667Z
ai_summary_generated_at: 2026-07-14 15:01:34
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "phoneValidation",
      "options": [
        {
          "name": "Phone Validation",
          "value": "phoneValidation",
          "description": "Validate phone numbers and get activity scores"
        },
        {
          "name": "Real Contact",
          "value": "realContact",
          "description": "Comprehensive contact verification and grading"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "validate",
      "options": [
        {
          "name": "Validate Phone Number",
          "value": "validate",
          "action": "Validate phone numbers",
          "description": "Validates phone numbers from input data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "phoneValidation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "verify",
      "options": [
        {
          "name": "Verify Contact",
          "value": "verify",
          "action": "Verify contact information",
          "description": "Verify and grade phone, email, and address information"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "realContact"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Validate Phone Number",
      "value": "validate",
      "action": "Validate phone numbers",
      "description": "Validates phone numbers from input data",
      "resource": "phoneValidation"
    },
    {
      "name": "Verify Contact",
      "value": "verify",
      "action": "Verify contact information",
      "description": "Verify and grade phone, email, and address information",
      "resource": "realContact"
    }
  ]

npm_readme:
  # n8n-nodes-trestle

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

  Trestle provides advanced phone validation and contact verification APIs with real-time activity scoring, fraud detection, and comprehensive contact data enrichment.

  [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

  ### Phone Validation (International)
  - **Validate Phone Number** - Validates international phone numbers from input data and returns comprehensive metadata including:
    - Activity score (0-100) indicating phone connectivity
    - Line type (Mobile, Landline, VoIP, etc.)
    - Carrier information
    - Country details
    - Prepaid status
    - Optional litigator checks

  ### Real Contact (US Only)
  - **Verify Contact** - Comprehensive contact verification that validates and grades:
    - Phone numbers with activity scoring
    - Email addresses with deliverability checks and age scoring
    - Physical addresses
    - Name matching across all contact points
    - Contact quality grading (A-F scale)
    - Optional fraud and litigator risk assessments

  ## Credentials

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

  1. Sign up for a Trestle account at [trestleiq.com](https://trestleiq.com)
  2. Generate your API key from the Trestle dashboard
  3. In n8n, create a new credential of type "Trestle API"
  4. Enter your API key in the credential configuration

  ## Compatibility
  for 
  This node is compatible with n8n version 1.0.0 and above.

  ## Usage

  ### Phone Validation
  1. Add the Trestle node to your workflow
  2. Select "Phone Validation" as the resource
  3. Configure your Trestle API credentials
  4. Set the "Phone Numbers Field" to the input field containing phone numbers
  5. Optionally, provide a country hint using ISO-3166 alpha-2 country code (e.g., US)
  6. Enable litigator checks if needed (additional cost)
  7. Execute the node to validate phone numbers and retrieve activity scores

  ### Real Contact Verification
  1. Add the Trestle node to your workflow
  2. Select "Real Contact" as the resource
  3. Configure your Trestle API credentials
  4. Map input fields for required data:
     - **Name Field** - Field containing contact names
     - **Phone Number Field** - Field containing phone numbers
  5. Map optional fields:
     - **Email Field** - Email addresses
     - **Address Field** - Street addresses
     - **City Field**, **State Field**, **Postal Code Field** - Address components
  6. Enable additional checks:
     - **Email Deliverability** - Verify email deliverability (additional cost)
     - **Email Age Score** - Get email age scoring (additional cost)
     - **Litigator Check** - Check for litigation risk (additional cost)
  7. Execute the node for comprehensive contact verification and grading

  ## Key Features

  - **Real-time Activity Scoring** - Unique 0-100 phone activity scores to identify disconnected numbers
  - **Batch Processing** - Process multiple contacts from input data streams
  - **Comprehensive Validation** - Phone, email, and address verification in one API
  - **Risk Assessment** - Fraud detection and litigator risk identification
  - **Quality Grading** - A-F contact quality scores for lead qualification
  - **Global Coverage** - International phone validation; US-only contact verification

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Trestle Phone Validation API documentation](https://trestle-api.redoc.ly/Current/tag/Phone-Validation-API)
  * [Trestle Real Contact API documentation](https://trestle-api.redoc.ly/Current/tag/Real-Contact-API)
  * [Trestle API Documentation](https://trestle-api.redoc.ly/)

ai_documentation_summary:
  {"purpose":"Provides access to Trestle APIs in n8n for validating phone numbers and verifying contacts. It supports phone activity scoring, carrier and line type lookup, email deliverability checks, address verification, fraud/litigator risk assessment, and contact quality grading.","capabilities":["Validate international phone numbers","Return phone activity score from 0-100","Identify phone line type such as mobile, landline, or VoIP","Return carrier and country metadata for phone numbers","Check prepaid phone status","Run optional litigator checks on phone numbers","Verify US contact records using name and phone number","Validate email addresses with deliverability checks","Return email age scoring","Verify physical addresses"],"authentication":"API key required using Trestle API credentials in n8n","commonUseCases":["Validate lead phone numbers before sales outreach","Detect disconnected, inactive, VoIP, or risky phone numbers","Enrich contact records with carrier, country, line type, and activity metadata","Verify US contacts by combining name, phone, email, and address checks","Score contact quality for lead qualification"],"limitations":["Real Contact verification is US only","Phone Validation supports international numbers, but contact verification does not","Some checks such as litigator checks, email deliverability, and email age scoring may incur additional cost","Requires n8n version 1.0.0 or above"],"relatedNodes":[]}


node_type: @rmyndharis/n8n-nodes-openwa.openWa
package_name: @rmyndharis/n8n-nodes-openwa
display_name: OpenWA
description: Interact with OpenWA WhatsApp API Gateway
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: yudhiarmyndharis
author_github_url: https://github.com/rmyndharis/OpenWA-n8n.git
npm_package_name: @rmyndharis/n8n-nodes-openwa
npm_version: 0.7.2
community_fetched_at: 2026-07-14T14:40:34.667Z
ai_summary_generated_at: 2026-07-14 15:01:34
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Message",
          "value": "message"
        },
        {
          "name": "Session",
          "value": "session"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStatus",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new session"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a session"
        },
        {
          "name": "Force Kill",
          "value": "forceKill",
          "action": "Force-kill a stuck session"
        },
        {
          "name": "Get QR",
          "value": "getQr",
          "action": "Get the QR code for authentication"
        },
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get session status"
        },
        {
          "name": "List All",
          "value": "listAll",
          "action": "List all sessions"
        },
        {
          "name": "Request Pairing Code",
          "value": "requestPairingCode",
          "action": "Request a phone pairing code"
        },
        {
          "name": "Start",
          "value": "start",
          "action": "Start a session"
        },
        {
          "name": "Stop",
          "value": "stop",
          "action": "Stop a session"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "session"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendText",
      "options": [
        {
          "name": "Cancel Batch",
          "value": "cancelBatch",
          "action": "Cancel a bulk batch"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a message"
        },
        {
          "name": "Get Batch Status",
          "value": "getBatchStatus",
          "action": "Get bulk batch status"
        },
        {
          "name": "React",
          "value": "react",
          "action": "React to a message"
        },
        {
          "name": "Reply",
          "value": "reply",
          "action": "Reply to a message"
        },
        {
          "name": "Send Audio",
          "value": "sendAudio",
          "action": "Send an audio or voice message"
        },
        {
          "name": "Send Bulk",
          "value": "sendBulk",
          "action": "Send messages in bulk"
        },
        {
          "name": "Send Contact",
          "value": "sendContact",
          "action": "Send a contact card"
        },
        {
          "name": "Send Document",
          "value": "sendDocument",
          "action": "Send a document"
        },
        {
          "name": "Send Image",
          "value": "sendImage",
          "action": "Send an image"
        },
        {
          "name": "Send Location",
          "value": "sendLocation",
          "action": "Send a location"
        },
        {
          "name": "Send Sticker",
          "value": "sendSticker",
          "action": "Send a sticker"
        },
        {
          "name": "Send Text",
          "value": "sendText",
          "action": "Send a text message"
        },
        {
          "name": "Send Video",
          "value": "sendVideo",
          "action": "Send a video"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "checkExists",
      "options": [
        {
          "name": "Block",
          "value": "block",
          "action": "Block a contact"
        },
        {
          "name": "Check Exists",
          "value": "checkExists",
          "action": "Check if number exists on WhatsApp"
        },
        {
          "name": "Get Info",
          "value": "getInfo",
          "action": "Get contact information"
        },
        {
          "name": "Get Phone",
          "value": "getPhone",
          "action": "Resolve a contact phone number"
        },
        {
          "name": "Get Profile Picture",
          "value": "getProfilePicture",
          "action": "Get a contact profile picture"
        },
        {
          "name": "Unblock",
          "value": "unblock",
          "action": "Unblock a contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a webhook"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a webhook"
        },
        {
          "name": "Test",
          "value": "test",
          "action": "Send a test delivery to a webhook"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a webhook"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new session",
      "resource": "session"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a session",
      "resource": "session"
    },
    {
      "name": "Force Kill",
      "value": "forceKill",
      "action": "Force-kill a stuck session",
      "resource": "session"
    },
    {
      "name": "Get QR",
      "value": "getQr",
      "action": "Get the QR code for authentication",
      "resource": "session"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get session status",
      "resource": "session"
    },
    {
      "name": "List All",
      "value": "listAll",
      "action": "List all sessions",
      "resource": "session"
    },
    {
      "name": "Request Pairing Code",
      "value": "requestPairingCode",
      "action": "Request a phone pairing code",
      "resource": "session"
    },
    {
      "name": "Start",
      "value": "start",
      "action": "Start a session",
      "resource": "session"
    },
    {
      "name": "Stop",
      "value": "stop",
      "action": "Stop a session",
      "resource": "session"
    },
    {
      "name": "Cancel Batch",
      "value": "cancelBatch",
      "action": "Cancel a bulk batch",
      "resource": "message"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a message",
      "resource": "message"
    },
    {
      "name": "Get Batch Status",
      "value": "getBatchStatus",
      "action": "Get bulk batch status",
      "resource": "message"
    },
    {
      "name": "React",
      "value": "react",
      "action": "React to a message",
      "resource": "message"
    },
    {
      "name": "Reply",
      "value": "reply",
      "action": "Reply to a message",
      "resource": "message"
    },
    {
      "name": "Send Audio",
      "value": "sendAudio",
      "action": "Send an audio or voice message",
      "resource": "message"
    },
    {
      "name": "Send Bulk",
      "value": "sendBulk",
      "action": "Send messages in bulk",
      "resource": "message"
    },
    {
      "name": "Send Contact",
      "value": "sendContact",
      "action": "Send a contact card",
      "resource": "message"
    },
    {
      "name": "Send Document",
      "value": "sendDocument",
      "action": "Send a document",
      "resource": "message"
    },
    {
      "name": "Send Image",
      "value": "sendImage",
      "action": "Send an image",
      "resource": "message"
    },
    {
      "name": "Send Location",
      "value": "sendLocation",
      "action": "Send a location",
      "resource": "message"
    },
    {
      "name": "Send Sticker",
      "value": "sendSticker",
      "action": "Send a sticker",
      "resource": "message"
    },
    {
      "name": "Send Text",
      "value": "sendText",
      "action": "Send a text message",
      "resource": "message"
    },
    {
      "name": "Send Video",
      "value": "sendVideo",
      "action": "Send a video",
      "resource": "message"
    },
    {
      "name": "Block",
      "value": "block",
      "action": "Block a contact",
      "resource": "contact"
    },
    {
      "name": "Check Exists",
      "value": "checkExists",
      "action": "Check if number exists on WhatsApp",
      "resource": "contact"
    },
    {
      "name": "Get Info",
      "value": "getInfo",
      "action": "Get contact information",
      "resource": "contact"
    },
    {
      "name": "Get Phone",
      "value": "getPhone",
      "action": "Resolve a contact phone number",
      "resource": "contact"
    },
    {
      "name": "Get Profile Picture",
      "value": "getProfilePicture",
      "action": "Get a contact profile picture",
      "resource": "contact"
    },
    {
      "name": "Unblock",
      "value": "unblock",
      "action": "Unblock a contact",
      "resource": "contact"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a webhook",
      "resource": "webhook"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a webhook",
      "resource": "webhook"
    },
    {
      "name": "Test",
      "value": "test",
      "action": "Send a test delivery to a webhook",
      "resource": "webhook"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a webhook",
      "resource": "webhook"
    }
  ]

npm_readme:
  <p align="center">
    <img src="https://raw.githubusercontent.com/rmyndharis/OpenWA/main/docs/logo/openwa_logo.webp" alt="OpenWA Logo" width="180"/>
  </p>

  <h1 align="center">n8n-nodes-openwa</h1>

  <p align="center">
    <strong>n8n community nodes for the <a href="https://github.com/rmyndharis/OpenWA">OpenWA</a> WhatsApp API Gateway</strong>
  </p>

  <p align="center">
    <a href="#-installation">Installation</a> •
    <a href="#-credentials">Credentials</a> •
    <a href="#-nodes">Nodes</a> •
    <a href="#-example-workflows">Examples</a> •
    <a href="#-compatibility">Compatibility</a>
  </p>

  <p align="center">
    <a href="https://www.npmjs.com/package/@rmyndharis/n8n-nodes-openwa"><img src="https://img.shields.io/npm/v/@rmyndharis/n8n-nodes-openwa.svg?color=blue" alt="npm version"/></a>
    <a href="https://www.npmjs.com/package/@rmyndharis/n8n-nodes-openwa"><img src="https://img.shields.io/npm/dm/@rmyndharis/n8n-nodes-openwa.svg" alt="npm downloads"/></a>
    <a href="https://github.com/rmyndharis/OpenWA-n8n/actions/workflows/ci.yml"><img src="https://github.com/rmyndharis/OpenWA-n8n/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"/></a>
    <img src="https://img.shields.io/badge/n8n-community_node-EA4B71.svg" alt="n8n community node"/>
    <img src="https://img.shields.io/badge/OpenWA-%E2%89%A5%200.4.0-25D366.svg" alt="OpenWA >= 0.4.0"/>
    <img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"/>
  </p>

  ---

  ## ✨ Overview

  Two n8n nodes that connect your workflows to a self-hosted [OpenWA](https://github.com/rmyndharis/OpenWA) WhatsApp API Gateway — send and receive WhatsApp messages, manage contacts, and react to events in real time.

  | Node               | Type    | Purpose                                                    |
  | ------------------ | ------- | ---------------------------------------------------------- |
  | **OpenWA**         | Action  | Send messages, check contacts, manage sessions and webhooks |
  | **OpenWA Trigger** | Trigger | Start workflows on incoming messages and session events |

  ---

  ## 📦 Installation

  ### Community Nodes (recommended)

  1. In n8n, open **Settings → Community Nodes**
  2. Select **Install**
  3. Enter `@rmyndharis/n8n-nodes-openwa` and accept the risk prompt
  4. Restart n8n

  ### Manual

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

  ---

  ## 🔑 Credentials

  Create an **OpenWA API** credential:

  | Field          | Description                                                                                          |
  | -------------- | ---------------------------------------------------------------------------------------------------- |
  | **Server URL** | OpenWA server URL, without a trailing slash or `/api`. Defaults to `http://localhost:2785` for a local server (e.g. `https://wa.example.com` behind a reverse proxy). Use HTTPS in production. |
  | **API Key**    | API key from your OpenWA dashboard. Sent as the `X-API-Key` header.                                  |

  The credential is validated with an authenticated `GET /api/sessions` request, so an invalid API key fails the test.

  > **API key role:** send-message and webhook operations require an **OPERATOR**-role key (the default). A read-only **VIEWER** key passes the credential test but returns `403` when sending or managing webhooks. VIEWER-safe operations: Session → Get Status / List All, and Contact → Check Exists / Get Info. An **ADMIN** key (the first-boot default) also works for every operation.

  > **Per-key scoping:** the server enforces each key's `allowedIps` and `allowedSessions`. An IP-whitelisted key must allow the n8n host's IP, and a session-restricted key returns `401` for operations on sessions outside its allow-list. Configure these on the server, not in the node.

  ---

  ## 🧩 Nodes

  ### OpenWA (action)

  | Resource    | Operation           | Description                                   |
  | ----------- | ------------------- | --------------------------------------------- |
  | **Session** | Create              | Create a new session (returns its UUID)       |
  | **Session** | Start               | Start a session and connect to WhatsApp       |
  | **Session** | Stop                | Stop a session and disconnect                 |
  | **Session** | Force Kill          | Force-kill a stuck session's engine           |
  | **Session** | Delete              | Delete a session                              |
  | **Session** | Get QR              | Get the QR code for scanning authentication   |
  | **Session** | Request Pairing Code| Get an 8-char phone linking code              |
  | **Session** | Get Status          | Get the status of a session                   |
  | **Session** | List All            | List all sessions                             |
  | **Message** | Send Text           | Send a text message                           |
  | **Message** | Send Image          | Send an image (binary, URL, or Base64)        |
  | **Message** | Send Video          | Send a video (binary, URL, or Base64)         |
  | **Message** | Send Document       | Send a document / file                        |
  | **Message** | Send Audio          | Send an audio file or a voice note (PTT)      |
  | **Message** | Send Sticker        | Send a sticker (WebP)                         |
  | **Message** | Send Location       | Send a location pin                           |
  | **Message** | Send Contact        | Send a contact card (vCard)                   |
  | **Message** | Reply               | Reply to a message, quoting it                |
  | **Message** | React               | Add or remove an emoji reaction               |
  | **Message** | Delete              | Delete / revoke a message                     |
  | **Message** | Send Bulk           | Send up to 100 messages as a throttled batch  |
  | **Message** | Get Batch Status    | Poll a bulk batch's progress                  |
  | **Message** | Cancel Batch        | Cancel a running bulk batch                   |
  | **Contact** | Check Exists        | Check whether a number is on WhatsApp         |
  | **Contact** | Get Info            | Get contact information                       |
  | **Contact** | Get Profile Picture | Get a contact's profile-photo URL             |
  | **Contact** | Get Phone           | Resolve a contact's phone number              |
  | **Contact** | Block               | Block a contact                               |
  | **Contact** | Unblock             | Unblock a contact                             |
  | **Webhook** | Create              | Register a webhook (optional signing secret)  |
  | **Webhook** | Update              | Update a webhook (partial — only changed fields) |
  | **Webhook** | Test                | Send a test delivery to a webhook             |
  | **Webhook** | Delete              | Remove a webhook                              |

  > **Base64 media:** when sending an image, document, or audio clip from a **Base64** source, also set the **MIME Type** field (e.g. `image/png`, `application/pdf`, `audio/ogg; codecs=opus`) — OpenWA requires a MIME type for base64 payloads. The **Binary** source fills it in automatically from the binary metadata, and the **URL** source needs nothing extra.

  > **Mentions** (server **≥ 0.7.14**): Send Text, Send Image, Send Video, and Send Document accept an optional **Mentions** list of WhatsApp IDs (e.g. `628123456789@c.us`). For each one to render as an @mention, the message text or caption must also contain the matching `@628123456789` token. Leave the list empty on older servers.

  > **Message actions:** Reply, React, and Delete act on an existing message identified by its full serialized ID (e.g. `true_628123456789@c.us_3EB0…`) — the value returned by the send operations and delivered by the Trigger. React with an empty **Emoji** to remove your reaction; Delete defaults to revoking for everyone.

  > **Bulk send:** provide **Messages (JSON)** as an array of up to 100 items. The media object nests under the `type` key, and `caption` sits alongside it on `content`:
  >
  > ```json
  > [
  >   { "chatId": "628123456789@c.us", "type": "text", "content": { "text": "Hello" } },
  >   { "chatId": "628123456789@c.us", "type": "image", "content": { "image": { "url": "https://example.com/a.jpg" }, "caption": "Hi" } }
  > ]
  > ```
  >
  > Media (`image`/`video`/`audio`/`document`) uses `url` or `base64` (add `mimetype` for base64) — there is no binary source in bulk. Send Bulk returns a `batchId` immediately and sends in the background; poll **Get Batch Status** until the status is `completed`, `cancelled`, or `failed`, or stop it early with **Cancel Batch**.

  > **Voice notes** (server **≥ 0.7.17**): Send Audio has a **Send as Voice Note** toggle. When on, the clip is delivered as a true WhatsApp voice note (the microphone bubble with a waveform) instead of a plain audio file. Voice notes require `audio/ogg; codecs=opus` audio for reliable playback. Leave the toggle off (plain audio file) on older servers.

  **Example — send a text message**

  1. Add an **OpenWA** node
  2. Select the **Message** resource and **Send Text** operation
  3. Configure **Session ID** (`default`), **Chat ID** (`628123456789@c.us`), and **Message**

  > **Provisioning a session:** sessions are identified by a **UUID** (returned by **Create**, **Get Status**, or **List All**). A full end-to-end flow is **Create → Start → Get QR** (scan) or **Request Pairing Code** (enter on the phone) → wait for `session.authenticated`. The Trigger can listen for `session.qr` and `session.authenticated` events; these session operations are what drive those state transitions.

  ### OpenWA Trigger

  Starts a workflow when the selected events arrive on your session.

  | Event                   | Description                           |
  | ----------------------- | ------------------------------------- |
  | `message.received`      | New incoming message                  |
  | `message.sent`          | Message successfully sent             |
  | `message.ack`           | Message delivery / read acknowledgement |
  | `message.failed`        | Message failed to send                |
  | `message.revoked`       | Message deleted for everyone          |
  | `message.reaction`      | Reaction added to or removed from a message (server **≥ 0.7.2**) |
  | `session.status`        | Session status changed                |
  | `session.qr`            | QR code generated for scanning        |
  | `session.authenticated` | Session authenticated                 |
  | `session.disconnected`  | Session lost connection               |
  | `group.join`            | Participant joined a group — _reserved: accepted on subscribe but not yet emitted by OpenWA_ |
  | `group.leave`           | Participant left a group — _reserved: not yet emitted_ |
  | `group.update`          | Group metadata changed — _reserved: not yet emitted_ |

  #### 🔐 Signature verification

  The Trigger has an optional **Webhook Secret**. When set, the secret is registered with OpenWA at webhook creation, and OpenWA signs every delivery with HMAC-SHA256 in the `X-OpenWA-Signature: sha256=<hex>` header. The node verifies each delivery against the raw request body and rejects (HTTP 401) any that fail. Leave it empty to skip verification.

  > Changing or clearing the secret takes effect on the next activation — deactivate and reactivate the workflow to re-register it.

  #### Trigger output

  ```json
  {
    "event": "message.received",
    "timestamp": "2024-01-15T10:30:00Z",
    "sessionId": "default",
    "idempotencyKey": "a1b2c3d4-...",
    "deliveryId": "e5f6a7b8-...",
    "data": {
      "id": "3EB0F5A2B4C...",
      "chatId": "628123456789@c.us",
      "from": "628123456789@c.us",
      "body": "Hello!",
      "type": "text",
      "timestamp": 1705312200
    }
  }
  ```

  > **Payload notes**
  >
  > - Each delivery is an envelope (`event`, `timestamp`, `sessionId`, `idempotencyKey`, `deliveryId`, …); the actual event payload is under `data`. Read message fields from `data` (e.g. `data.body`, `data.chatId`).
  > - Read the message identifier from `data.id` (incoming payloads use `id`, not `messageId`).
  > - OpenWA retries failed deliveries with the same `deliveryId` — de-duplicate on it if your downstream actions aren't idempotent.
  > - Message `type` is engine-neutral: voice notes are `voice`, shared contacts are `contact`, and plain chats are `text`.
  > - **Check Exists** returns `whatsappId`, the engine-canonical chat id, which may differ from the number you sent (for example an `@lid` id).

  ---

  ## 📡 Example Workflows

  | Pattern         | Flow                                                              |
  | --------------- | ----------------------------------------------------------------- |
  | Auto-reply      | `[OpenWA Trigger]` → `[IF: keyword]` → `[OpenWA: Send Text]`       |
  | Session monitor | `[OpenWA Trigger: session.disconnected]` → `[Slack: Alert]`        |
  | Lead capture    | `[OpenWA Trigger]` → `[Google Sheets: Append]` → `[OpenWA: Send Text]` |

  ---

  ## 🔗 Compatibility

  Requires an OpenWA server **≥ 0.4.0** — the webhook event contract and HMAC signature verification the Trigger relies on landed in v0.4.0. Verified against OpenWA **v0.8.13**.

  > The **Message Reaction** event requires server **≥ 0.7.2**. Selecting it against an older
  > server returns a 400 when the webhook is created.

  ---

  ## 🛠 Development

  ```bash
  npm install      # install dependencies
  npm run build    # compile TypeScript + copy icons
  npm run dev      # watch mode
  npm run lint     # ESLint
  npm test         # build + signature-verification unit tests
  ```

  ---

  ## 📚 Links

  - [OpenWA Server](https://github.com/rmyndharis/OpenWA) — the WhatsApp API Gateway
  - [OpenWA Documentation](https://github.com/rmyndharis/OpenWA/tree/main/docs)
  - [OpenWA API Reference](https://github.com/rmyndharis/OpenWA/blob/main/docs/06-api-specification.md)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)

  ---

  ## 📄 License

  [MIT](./LICENSE) — free for personal and commercial use.

  ---

  <div align="center">

  [📦 npm](https://www.npmjs.com/package/@rmyndharis/n8n-nodes-openwa) · [🐛 Report Bug](https://github.com/rmyndharis/OpenWA-n8n/issues) · [💡 Request Feature](https://github.com/rmyndharis/OpenWA-n8n/issues)

  <br/>

  <sub>Built for the <a href="https://github.com/rmyndharis/OpenWA">OpenWA</a> community.</sub>

  </div>

ai_documentation_summary:
  {"purpose":"Connects n8n workflows to a self-hosted OpenWA WhatsApp API Gateway to manage WhatsApp sessions, send messages, check contacts, and manage webhooks.","capabilities":["Create, start, stop, force-kill, delete, list, and check status of WhatsApp sessions","Retrieve QR codes for WhatsApp authentication","Request phone pairing codes","Send text messages","Send images, videos, documents, audio, voice notes, and WebP stickers","Send location pins and contact cards","Reply to messages and quote originals","Add or remove emoji reactions","Delete or revoke messages","Send bulk messages as throttled batches"],"authentication":"OpenWA API credential with Server URL and API Key. The API key is sent as the X-API-Key header and validated with an authenticated GET /api/sessions request.","commonUseCases":["Send WhatsApp notifications or alerts from n8n workflows","Automate customer support replies over WhatsApp","Send media, documents, locations, and contact cards through WhatsApp","Manage OpenWA WhatsApp sessions from n8n","Run bulk WhatsApp messaging campaigns with throttling"],"limitations":["Requires a self-hosted OpenWA WhatsApp API Gateway server","Send-message and webhook operations require an OPERATOR or ADMIN API key; VIEWER keys are limited to read-only operations and return 403 for sending or webhook management","API keys may be restricted by allowed IPs and allowed sessions on the OpenWA server, which can cause 401 errors if n8n or the target session is not allowed","Bulk sending supports up to 100 messages per batch","Server URL should be provided without a trailing slash or /api"],"relatedNodes":["OpenWA Trigger"]}


node_type: @rmyndharis/n8n-nodes-openwa.openWaTrigger
package_name: @rmyndharis/n8n-nodes-openwa
display_name: OpenWA Trigger
description: Starts workflow when OpenWA 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: yudhiarmyndharis
author_github_url: https://github.com/rmyndharis/OpenWA-n8n.git
npm_package_name: @rmyndharis/n8n-nodes-openwa
npm_version: 0.7.2
community_fetched_at: 2026-07-14T14:40:34.668Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  <p align="center">
    <img src="https://raw.githubusercontent.com/rmyndharis/OpenWA/main/docs/logo/openwa_logo.webp" alt="OpenWA Logo" width="180"/>
  </p>

  <h1 align="center">n8n-nodes-openwa</h1>

  <p align="center">
    <strong>n8n community nodes for the <a href="https://github.com/rmyndharis/OpenWA">OpenWA</a> WhatsApp API Gateway</strong>
  </p>

  <p align="center">
    <a href="#-installation">Installation</a> •
    <a href="#-credentials">Credentials</a> •
    <a href="#-nodes">Nodes</a> •
    <a href="#-example-workflows">Examples</a> •
    <a href="#-compatibility">Compatibility</a>
  </p>

  <p align="center">
    <a href="https://www.npmjs.com/package/@rmyndharis/n8n-nodes-openwa"><img src="https://img.shields.io/npm/v/@rmyndharis/n8n-nodes-openwa.svg?color=blue" alt="npm version"/></a>
    <a href="https://www.npmjs.com/package/@rmyndharis/n8n-nodes-openwa"><img src="https://img.shields.io/npm/dm/@rmyndharis/n8n-nodes-openwa.svg" alt="npm downloads"/></a>
    <a href="https://github.com/rmyndharis/OpenWA-n8n/actions/workflows/ci.yml"><img src="https://github.com/rmyndharis/OpenWA-n8n/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"/></a>
    <img src="https://img.shields.io/badge/n8n-community_node-EA4B71.svg" alt="n8n community node"/>
    <img src="https://img.shields.io/badge/OpenWA-%E2%89%A5%200.4.0-25D366.svg" alt="OpenWA >= 0.4.0"/>
    <img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"/>
  </p>

  ---

  ## ✨ Overview

  Two n8n nodes that connect your workflows to a self-hosted [OpenWA](https://github.com/rmyndharis/OpenWA) WhatsApp API Gateway — send and receive WhatsApp messages, manage contacts, and react to events in real time.

  | Node               | Type    | Purpose                                                    |
  | ------------------ | ------- | ---------------------------------------------------------- |
  | **OpenWA**         | Action  | Send messages, check contacts, manage sessions and webhooks |
  | **OpenWA Trigger** | Trigger | Start workflows on incoming messages and session events |

  ---

  ## 📦 Installation

  ### Community Nodes (recommended)

  1. In n8n, open **Settings → Community Nodes**
  2. Select **Install**
  3. Enter `@rmyndharis/n8n-nodes-openwa` and accept the risk prompt
  4. Restart n8n

  ### Manual

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

  ---

  ## 🔑 Credentials

  Create an **OpenWA API** credential:

  | Field          | Description                                                                                          |
  | -------------- | ---------------------------------------------------------------------------------------------------- |
  | **Server URL** | OpenWA server URL, without a trailing slash or `/api`. Defaults to `http://localhost:2785` for a local server (e.g. `https://wa.example.com` behind a reverse proxy). Use HTTPS in production. |
  | **API Key**    | API key from your OpenWA dashboard. Sent as the `X-API-Key` header.                                  |

  The credential is validated with an authenticated `GET /api/sessions` request, so an invalid API key fails the test.

  > **API key role:** send-message and webhook operations require an **OPERATOR**-role key (the default). A read-only **VIEWER** key passes the credential test but returns `403` when sending or managing webhooks. VIEWER-safe operations: Session → Get Status / List All, and Contact → Check Exists / Get Info. An **ADMIN** key (the first-boot default) also works for every operation.

  > **Per-key scoping:** the server enforces each key's `allowedIps` and `allowedSessions`. An IP-whitelisted key must allow the n8n host's IP, and a session-restricted key returns `401` for operations on sessions outside its allow-list. Configure these on the server, not in the node.

  ---

  ## 🧩 Nodes

  ### OpenWA (action)

  | Resource    | Operation           | Description                                   |
  | ----------- | ------------------- | --------------------------------------------- |
  | **Session** | Create              | Create a new session (returns its UUID)       |
  | **Session** | Start               | Start a session and connect to WhatsApp       |
  | **Session** | Stop                | Stop a session and disconnect                 |
  | **Session** | Force Kill          | Force-kill a stuck session's engine           |
  | **Session** | Delete              | Delete a session                              |
  | **Session** | Get QR              | Get the QR code for scanning authentication   |
  | **Session** | Request Pairing Code| Get an 8-char phone linking code              |
  | **Session** | Get Status          | Get the status of a session                   |
  | **Session** | List All            | List all sessions                             |
  | **Message** | Send Text           | Send a text message                           |
  | **Message** | Send Image          | Send an image (binary, URL, or Base64)        |
  | **Message** | Send Video          | Send a video (binary, URL, or Base64)         |
  | **Message** | Send Document       | Send a document / file                        |
  | **Message** | Send Audio          | Send an audio file or a voice note (PTT)      |
  | **Message** | Send Sticker        | Send a sticker (WebP)                         |
  | **Message** | Send Location       | Send a location pin                           |
  | **Message** | Send Contact        | Send a contact card (vCard)                   |
  | **Message** | Reply               | Reply to a message, quoting it                |
  | **Message** | React               | Add or remove an emoji reaction               |
  | **Message** | Delete              | Delete / revoke a message                     |
  | **Message** | Send Bulk           | Send up to 100 messages as a throttled batch  |
  | **Message** | Get Batch Status    | Poll a bulk batch's progress                  |
  | **Message** | Cancel Batch        | Cancel a running bulk batch                   |
  | **Contact** | Check Exists        | Check whether a number is on WhatsApp         |
  | **Contact** | Get Info            | Get contact information                       |
  | **Contact** | Get Profile Picture | Get a contact's profile-photo URL             |
  | **Contact** | Get Phone           | Resolve a contact's phone number              |
  | **Contact** | Block               | Block a contact                               |
  | **Contact** | Unblock             | Unblock a contact                             |
  | **Webhook** | Create              | Register a webhook (optional signing secret)  |
  | **Webhook** | Update              | Update a webhook (partial — only changed fields) |
  | **Webhook** | Test                | Send a test delivery to a webhook             |
  | **Webhook** | Delete              | Remove a webhook                              |

  > **Base64 media:** when sending an image, document, or audio clip from a **Base64** source, also set the **MIME Type** field (e.g. `image/png`, `application/pdf`, `audio/ogg; codecs=opus`) — OpenWA requires a MIME type for base64 payloads. The **Binary** source fills it in automatically from the binary metadata, and the **URL** source needs nothing extra.

  > **Mentions** (server **≥ 0.7.14**): Send Text, Send Image, Send Video, and Send Document accept an optional **Mentions** list of WhatsApp IDs (e.g. `628123456789@c.us`). For each one to render as an @mention, the message text or caption must also contain the matching `@628123456789` token. Leave the list empty on older servers.

  > **Message actions:** Reply, React, and Delete act on an existing message identified by its full serialized ID (e.g. `true_628123456789@c.us_3EB0…`) — the value returned by the send operations and delivered by the Trigger. React with an empty **Emoji** to remove your reaction; Delete defaults to revoking for everyone.

  > **Bulk send:** provide **Messages (JSON)** as an array of up to 100 items. The media object nests under the `type` key, and `caption` sits alongside it on `content`:
  >
  > ```json
  > [
  >   { "chatId": "628123456789@c.us", "type": "text", "content": { "text": "Hello" } },
  >   { "chatId": "628123456789@c.us", "type": "image", "content": { "image": { "url": "https://example.com/a.jpg" }, "caption": "Hi" } }
  > ]
  > ```
  >
  > Media (`image`/`video`/`audio`/`document`) uses `url` or `base64` (add `mimetype` for base64) — there is no binary source in bulk. Send Bulk returns a `batchId` immediately and sends in the background; poll **Get Batch Status** until the status is `completed`, `cancelled`, or `failed`, or stop it early with **Cancel Batch**.

  > **Voice notes** (server **≥ 0.7.17**): Send Audio has a **Send as Voice Note** toggle. When on, the clip is delivered as a true WhatsApp voice note (the microphone bubble with a waveform) instead of a plain audio file. Voice notes require `audio/ogg; codecs=opus` audio for reliable playback. Leave the toggle off (plain audio file) on older servers.

  **Example — send a text message**

  1. Add an **OpenWA** node
  2. Select the **Message** resource and **Send Text** operation
  3. Configure **Session ID** (`default`), **Chat ID** (`628123456789@c.us`), and **Message**

  > **Provisioning a session:** sessions are identified by a **UUID** (returned by **Create**, **Get Status**, or **List All**). A full end-to-end flow is **Create → Start → Get QR** (scan) or **Request Pairing Code** (enter on the phone) → wait for `session.authenticated`. The Trigger can listen for `session.qr` and `session.authenticated` events; these session operations are what drive those state transitions.

  ### OpenWA Trigger

  Starts a workflow when the selected events arrive on your session.

  | Event                   | Description                           |
  | ----------------------- | ------------------------------------- |
  | `message.received`      | New incoming message                  |
  | `message.sent`          | Message successfully sent             |
  | `message.ack`           | Message delivery / read acknowledgement |
  | `message.failed`        | Message failed to send                |
  | `message.revoked`       | Message deleted for everyone          |
  | `message.reaction`      | Reaction added to or removed from a message (server **≥ 0.7.2**) |
  | `session.status`        | Session status changed                |
  | `session.qr`            | QR code generated for scanning        |
  | `session.authenticated` | Session authenticated                 |
  | `session.disconnected`  | Session lost connection               |
  | `group.join`            | Participant joined a group — _reserved: accepted on subscribe but not yet emitted by OpenWA_ |
  | `group.leave`           | Participant left a group — _reserved: not yet emitted_ |
  | `group.update`          | Group metadata changed — _reserved: not yet emitted_ |

  #### 🔐 Signature verification

  The Trigger has an optional **Webhook Secret**. When set, the secret is registered with OpenWA at webhook creation, and OpenWA signs every delivery with HMAC-SHA256 in the `X-OpenWA-Signature: sha256=<hex>` header. The node verifies each delivery against the raw request body and rejects (HTTP 401) any that fail. Leave it empty to skip verification.

  > Changing or clearing the secret takes effect on the next activation — deactivate and reactivate the workflow to re-register it.

  #### Trigger output

  ```json
  {
    "event": "message.received",
    "timestamp": "2024-01-15T10:30:00Z",
    "sessionId": "default",
    "idempotencyKey": "a1b2c3d4-...",
    "deliveryId": "e5f6a7b8-...",
    "data": {
      "id": "3EB0F5A2B4C...",
      "chatId": "628123456789@c.us",
      "from": "628123456789@c.us",
      "body": "Hello!",
      "type": "text",
      "timestamp": 1705312200
    }
  }
  ```

  > **Payload notes**
  >
  > - Each delivery is an envelope (`event`, `timestamp`, `sessionId`, `idempotencyKey`, `deliveryId`, …); the actual event payload is under `data`. Read message fields from `data` (e.g. `data.body`, `data.chatId`).
  > - Read the message identifier from `data.id` (incoming payloads use `id`, not `messageId`).
  > - OpenWA retries failed deliveries with the same `deliveryId` — de-duplicate on it if your downstream actions aren't idempotent.
  > - Message `type` is engine-neutral: voice notes are `voice`, shared contacts are `contact`, and plain chats are `text`.
  > - **Check Exists** returns `whatsappId`, the engine-canonical chat id, which may differ from the number you sent (for example an `@lid` id).

  ---

  ## 📡 Example Workflows

  | Pattern         | Flow                                                              |
  | --------------- | ----------------------------------------------------------------- |
  | Auto-reply      | `[OpenWA Trigger]` → `[IF: keyword]` → `[OpenWA: Send Text]`       |
  | Session monitor | `[OpenWA Trigger: session.disconnected]` → `[Slack: Alert]`        |
  | Lead capture    | `[OpenWA Trigger]` → `[Google Sheets: Append]` → `[OpenWA: Send Text]` |

  ---

  ## 🔗 Compatibility

  Requires an OpenWA server **≥ 0.4.0** — the webhook event contract and HMAC signature verification the Trigger relies on landed in v0.4.0. Verified against OpenWA **v0.8.13**.

  > The **Message Reaction** event requires server **≥ 0.7.2**. Selecting it against an older
  > server returns a 400 when the webhook is created.

  ---

  ## 🛠 Development

  ```bash
  npm install      # install dependencies
  npm run build    # compile TypeScript + copy icons
  npm run dev      # watch mode
  npm run lint     # ESLint
  npm test         # build + signature-verification unit tests
  ```

  ---

  ## 📚 Links

  - [OpenWA Server](https://github.com/rmyndharis/OpenWA) — the WhatsApp API Gateway
  - [OpenWA Documentation](https://github.com/rmyndharis/OpenWA/tree/main/docs)
  - [OpenWA API Reference](https://github.com/rmyndharis/OpenWA/blob/main/docs/06-api-specification.md)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)

  ---

  ## 📄 License

  [MIT](./LICENSE) — free for personal and commercial use.

  ---

  <div align="center">

  [📦 npm](https://www.npmjs.com/package/@rmyndharis/n8n-nodes-openwa) · [🐛 Report Bug](https://github.com/rmyndharis/OpenWA-n8n/issues) · [💡 Request Feature](https://github.com/rmyndharis/OpenWA-n8n/issues)

  <br/>

  <sub>Built for the <a href="https://github.com/rmyndharis/OpenWA">OpenWA</a> community.</sub>

  </div>

ai_documentation_summary:
  {"purpose":"Starts n8n workflows when events occur in a self-hosted OpenWA WhatsApp API Gateway, such as incoming WhatsApp messages and session events.","capabilities":["Trigger workflows on incoming WhatsApp messages","Trigger workflows on OpenWA session events","React to OpenWA events in real time via webhook-based integration"],"authentication":"OpenWA API credential with Server URL and API Key sent as the X-API-Key header. Webhook/trigger operations require an OPERATOR or ADMIN API key.","commonUseCases":["Build WhatsApp chatbots that respond to incoming messages","Run automations when a WhatsApp session changes state","Route received WhatsApp messages into n8n workflows for processing, notifications, or CRM updates"],"limitations":["Requires a self-hosted OpenWA WhatsApp API Gateway","Webhook operations require an OPERATOR or ADMIN API key; VIEWER keys are read-only and may return 403","API keys may be restricted by allowed IPs or allowed sessions on the OpenWA server","Designed for OpenWA version 0.4.0 or later"],"relatedNodes":["OpenWA"]}


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

updated_at: 2026-07-14 14:40:34
author_name: connectthink
author_github_url: https://github.com/d4sign-tech/n8n-integration-node.git
npm_package_name: @d4sign/n8n-nodes-d4sign
npm_version: 1.0.10
community_fetched_at: 2026-07-14T14:40:34.669Z
ai_summary_generated_at: 2026-07-14 15:01:34
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Document List",
          "value": "document"
        },
        {
          "name": "Document Pins",
          "value": "documentPins"
        },
        {
          "name": "Document Tags",
          "value": "documentTags"
        },
        {
          "name": "Document Upload",
          "value": "documentUpload"
        },
        {
          "name": "Document Watchers",
          "value": "documentWatchers"
        },
        {
          "name": "Document Webhooks",
          "value": "documentWebhooks"
        },
        {
          "name": "Document Workflow",
          "value": "documentActions"
        },
        {
          "name": "Group",
          "value": "group"
        },
        {
          "name": "Safe",
          "value": "safe"
        },
        {
          "name": "Signatory",
          "value": "signatory"
        },
        {
          "name": "Template",
          "value": "template"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "List Documents",
          "value": "getAll",
          "action": "List documents",
          "description": "List documents in the account"
        },
        {
          "name": "List Documents in Safe/Folder",
          "value": "getAllInSafe",
          "action": "List documents in a safe/folder",
          "description": "List documents in a safe (and optionally a folder)"
        },
        {
          "name": "Get Document",
          "value": "get",
          "action": "Get a document",
          "description": "Get a document by UUID"
        },
        {
          "name": "Get Document Dimensions",
          "value": "getDimensions",
          "action": "Get document dimensions",
          "description": "Get document dimensions by UUID"
        },
        {
          "name": "List Documents by Phase",
          "value": "getStatus",
          "action": "List documents by phase",
          "description": "List all documents in a phase (status)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send to Signers",
          "value": "send",
          "action": "Send a document to signers",
          "description": "Send a document to its signers"
        },
        {
          "name": "Cancel Document",
          "value": "cancel",
          "action": "Cancel a document",
          "description": "Cancel a document"
        },
        {
          "name": "Download Document",
          "value": "download",
          "action": "Download a document",
          "description": "Request a download link and fetch the file"
        },
        {
          "name": "Add Highlight",
          "value": "addHighlight",
          "action": "Add highlight",
          "description": "Add a highlighted clause to a document"
        },
        {
          "name": "Resend Signature Link",
          "value": "resend",
          "action": "Resend signature link",
          "description": "Resend the signing link to a signer"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "documentActions"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listPins",
      "options": [
        {
          "name": "List Pins",
          "value": "listPins",
          "action": "List pins",
          "description": "List document pins by UUID"
        },
        {
          "name": "Add Pins",
          "value": "addPins",
          "action": "Add pins",
          "description": "Add signature pins (markers) to a document"
        },
        {
          "name": "Remove Pins",
          "value": "removePins",
          "action": "Remove pins",
          "description": "Remove signature pins (markers) from a document"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "documentPins"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listTags",
      "options": [
        {
          "name": "List Tags",
          "value": "listTags",
          "action": "List tags",
          "description": "List tags of a document"
        },
        {
          "name": "Add Tag",
          "value": "addTag",
          "action": "Add a tag",
          "description": "Add a tag to a document"
        },
        {
          "name": "Remove Tag",
          "value": "removeTag",
          "action": "Remove a tag",
          "description": "Remove a tag from a document"
        },
        {
          "name": "Add Urgent Tag",
          "value": "addUrgent",
          "action": "Add urgent tag",
          "description": "Mark a document as urgent"
        },
        {
          "name": "Remove Urgent Tag",
          "value": "removeUrgent",
          "action": "Remove urgent tag",
          "description": "Remove urgent mark from a document"
        },
        {
          "name": "Erase Tags",
          "value": "eraseTags",
          "action": "Erase tags",
          "description": "Remove all tags from a document"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "documentTags"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "uploadDocument",
      "options": [
        {
          "name": "Upload Document",
          "value": "uploadDocument",
          "action": "Upload a document",
          "description": "Upload a new document to a safe using Binary Property or Base64 content."
        },
        {
          "name": "Upload Attachment",
          "value": "uploadAttachment",
          "action": "Upload an attachment",
          "description": "Attach a file to an existing document using Binary Property or Base64 content."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "documentUpload"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listWatchers",
      "options": [
        {
          "name": "List Watchers",
          "value": "listWatchers",
          "action": "List watchers",
          "description": "List watchers (observers) of a document"
        },
        {
          "name": "Add Watcher",
          "value": "addWatcher",
          "action": "Add a watcher",
          "description": "Add a watcher (observer) to a document"
        },
        {
          "name": "Remove Watcher",
          "value": "removeWatcher",
          "action": "Remove a watcher",
          "description": "Remove a watcher (observer) from a document"
        },
        {
          "name": "Erase Watchers",
          "value": "eraseWatchers",
          "action": "Erase watchers",
          "description": "Remove all watchers from a document"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "documentWatchers"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listWebhooks",
      "options": [
        {
          "name": "List Webhooks",
          "value": "listWebhooks",
          "action": "List webhooks",
          "description": "List document webhooks by UUID"
        },
        {
          "name": "Set Webhook",
          "value": "setWebhook",
          "action": "Set webhook",
          "description": "Register a webhook URL for a document"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "documentWebhooks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Signatory",
          "value": "add",
          "action": "Add a signatory",
          "description": "Add a new signatory to a document"
        },
        {
          "name": "Get Signatories",
          "value": "getAll",
          "action": "List signatories",
          "description": "List all signatories of a document"
        },
        {
          "name": "Remove Signatory",
          "value": "remove",
          "action": "Remove a signatory",
          "description": "Remove a signatory from a document"
        },
        {
          "name": "Add Signer Info",
          "value": "addInfo",
          "action": "Add signer info",
          "description": "Register additional information for a signer (display name, docs, birthday)"
        },
        {
          "name": "Change Signer Email",
          "value": "changeEmail",
          "action": "Change signer email",
          "description": "Change the email of a signer already added to the document"
        },
        {
          "name": "Change Signer Access Code",
          "value": "changePasswordCode",
          "action": "Change signer access code",
          "description": "Change the access code (password) for a signer"
        },
        {
          "name": "Change Signer SMS Number",
          "value": "changeSmsNumber",
          "action": "Change signer SMS number",
          "description": "Change the SMS number for a signer"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "signatory"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createDocumentWord",
      "options": [
        {
          "name": "Create Document from HTML Template",
          "value": "createDocumentHtml",
          "action": "Create a document from an HTML template",
          "description": "Create a new document from an HTML template"
        },
        {
          "name": "List Templates",
          "value": "listTemplates",
          "action": "List templates",
          "description": "List all templates available in the safe"
        },
        {
          "name": "Create Document from Word Template",
          "value": "createDocumentWord",
          "action": "Create a document from a Word template",
          "description": "Create a new document from a Word template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "List Safes",
          "value": "getAll",
          "action": "List safes",
          "description": "List all safes (vaults) in the account"
        },
        {
          "name": "List Folders",
          "value": "listFolders",
          "action": "List folders",
          "description": "List all folders inside a safe (vault)"
        },
        {
          "name": "Create Folder",
          "value": "createFolder",
          "action": "Create a folder",
          "description": "Create a folder (or subfolder) inside a safe"
        },
        {
          "name": "Rename Folder",
          "value": "renameFolder",
          "action": "Rename a folder",
          "description": "Rename a folder (or subfolder) inside a safe"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "safe"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "List Groups",
          "value": "getAll",
          "action": "List groups",
          "description": "List signature groups inside a safe"
        },
        {
          "name": "Get Group Details",
          "value": "getDetails",
          "action": "Get group details",
          "description": "Retrieve details of a specific signature group"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "group"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "List Documents",
      "value": "getAll",
      "action": "List documents",
      "description": "List documents in the account",
      "resource": "document"
    },
    {
      "name": "List Documents in Safe/Folder",
      "value": "getAllInSafe",
      "action": "List documents in a safe/folder",
      "description": "List documents in a safe (and optionally a folder)",
      "resource": "document"
    },
    {
      "name": "Get Document",
      "value": "get",
      "action": "Get a document",
      "description": "Get a document by UUID",
      "resource": "document"
    },
    {
      "name": "Get Document Dimensions",
      "value": "getDimensions",
      "action": "Get document dimensions",
      "description": "Get document dimensions by UUID",
      "resource": "document"
    },
    {
      "name": "List Documents by Phase",
      "value": "getStatus",
      "action": "List documents by phase",
      "description": "List all documents in a phase (status)",
      "resource": "document"
    },
    {
      "name": "Send to Signers",
      "value": "send",
      "action": "Send a document to signers",
      "description": "Send a document to its signers",
      "resource": "documentActions"
    },
    {
      "name": "Cancel Document",
      "value": "cancel",
      "action": "Cancel a document",
      "description": "Cancel a document",
      "resource": "documentActions"
    },
    {
      "name": "Download Document",
      "value": "download",
      "action": "Download a document",
      "description": "Request a download link and fetch the file",
      "resource": "documentActions"
    },
    {
      "name": "Add Highlight",
      "value": "addHighlight",
      "action": "Add highlight",
      "description": "Add a highlighted clause to a document",
      "resource": "documentActions"
    },
    {
      "name": "Resend Signature Link",
      "value": "resend",
      "action": "Resend signature link",
      "description": "Resend the signing link to a signer",
      "resource": "documentActions"
    },
    {
      "name": "List Pins",
      "value": "listPins",
      "action": "List pins",
      "description": "List document pins by UUID",
      "resource": "documentPins"
    },
    {
      "name": "Add Pins",
      "value": "addPins",
      "action": "Add pins",
      "description": "Add signature pins (markers) to a document",
      "resource": "documentPins"
    },
    {
      "name": "Remove Pins",
      "value": "removePins",
      "action": "Remove pins",
      "description": "Remove signature pins (markers) from a document",
      "resource": "documentPins"
    },
    {
      "name": "List Tags",
      "value": "listTags",
      "action": "List tags",
      "description": "List tags of a document",
      "resource": "documentTags"
    },
    {
      "name": "Add Tag",
      "value": "addTag",
      "action": "Add a tag",
      "description": "Add a tag to a document",
      "resource": "documentTags"
    },
    {
      "name": "Remove Tag",
      "value": "removeTag",
      "action": "Remove a tag",
      "description": "Remove a tag from a document",
      "resource": "documentTags"
    },
    {
      "name": "Add Urgent Tag",
      "value": "addUrgent",
      "action": "Add urgent tag",
      "description": "Mark a document as urgent",
      "resource": "documentTags"
    },
    {
      "name": "Remove Urgent Tag",
      "value": "removeUrgent",
      "action": "Remove urgent tag",
      "description": "Remove urgent mark from a document",
      "resource": "documentTags"
    },
    {
      "name": "Erase Tags",
      "value": "eraseTags",
      "action": "Erase tags",
      "description": "Remove all tags from a document",
      "resource": "documentTags"
    },
    {
      "name": "Upload Document",
      "value": "uploadDocument",
      "action": "Upload a document",
      "description": "Upload a new document to a safe using Binary Property or Base64 content.",
      "resource": "documentUpload"
    },
    {
      "name": "Upload Attachment",
      "value": "uploadAttachment",
      "action": "Upload an attachment",
      "description": "Attach a file to an existing document using Binary Property or Base64 content.",
      "resource": "documentUpload"
    },
    {
      "name": "List Watchers",
      "value": "listWatchers",
      "action": "List watchers",
      "description": "List watchers (observers) of a document",
      "resource": "documentWatchers"
    },
    {
      "name": "Add Watcher",
      "value": "addWatcher",
      "action": "Add a watcher",
      "description": "Add a watcher (observer) to a document",
      "resource": "documentWatchers"
    },
    {
      "name": "Remove Watcher",
      "value": "removeWatcher",
      "action": "Remove a watcher",
      "description": "Remove a watcher (observer) from a document",
      "resource": "documentWatchers"
    },
    {
      "name": "Erase Watchers",
      "value": "eraseWatchers",
      "action": "Erase watchers",
      "description": "Remove all watchers from a document",
      "resource": "documentWatchers"
    },
    {
      "name": "List Webhooks",
      "value": "listWebhooks",
      "action": "List webhooks",
      "description": "List document webhooks by UUID",
      "resource": "documentWebhooks"
    },
    {
      "name": "Set Webhook",
      "value": "setWebhook",
      "action": "Set webhook",
      "description": "Register a webhook URL for a document",
      "resource": "documentWebhooks"
    },
    {
      "name": "Add Signatory",
      "value": "add",
      "action": "Add a signatory",
      "description": "Add a new signatory to a document",
      "resource": "signatory"
    },
    {
      "name": "Get Signatories",
      "value": "getAll",
      "action": "List signatories",
      "description": "List all signatories of a document",
      "resource": "signatory"
    },
    {
      "name": "Remove Signatory",
      "value": "remove",
      "action": "Remove a signatory",
      "description": "Remove a signatory from a document",
      "resource": "signatory"
    },
    {
      "name": "Add Signer Info",
      "value": "addInfo",
      "action": "Add signer info",
      "description": "Register additional information for a signer (display name, docs, birthday)",
      "resource": "signatory"
    },
    {
      "name": "Change Signer Email",
      "value": "changeEmail",
      "action": "Change signer email",
      "description": "Change the email of a signer already added to the document",
      "resource": "signatory"
    },
    {
      "name": "Change Signer Access Code",
      "value": "changePasswordCode",
      "action": "Change signer access code",
      "description": "Change the access code (password) for a signer",
      "resource": "signatory"
    },
    {
      "name": "Change Signer SMS Number",
      "value": "changeSmsNumber",
      "action": "Change signer SMS number",
      "description": "Change the SMS number for a signer",
      "resource": "signatory"
    },
    {
      "name": "Create Document from HTML Template",
      "value": "createDocumentHtml",
      "action": "Create a document from an HTML template",
      "description": "Create a new document from an HTML template",
      "resource": "template"
    },
    {
      "name": "List Templates",
      "value": "listTemplates",
      "action": "List templates",
      "description": "List all templates available in the safe",
      "resource": "template"
    },
    {
      "name": "Create Document from Word Template",
      "value": "createDocumentWord",
      "action": "Create a document from a Word template",
      "description": "Create a new document from a Word template",
      "resource": "template"
    },
    {
      "name": "List Safes",
      "value": "getAll",
      "action": "List safes",
      "description": "List all safes (vaults) in the account",
      "resource": "safe"
    },
    {
      "name": "List Folders",
      "value": "listFolders",
      "action": "List folders",
      "description": "List all folders inside a safe (vault)",
      "resource": "safe"
    },
    {
      "name": "Create Folder",
      "value": "createFolder",
      "action": "Create a folder",
      "description": "Create a folder (or subfolder) inside a safe",
      "resource": "safe"
    },
    {
      "name": "Rename Folder",
      "value": "renameFolder",
      "action": "Rename a folder",
      "description": "Rename a folder (or subfolder) inside a safe",
      "resource": "safe"
    },
    {
      "name": "List Groups",
      "value": "getAll",
      "action": "List groups",
      "description": "List signature groups inside a safe",
      "resource": "group"
    },
    {
      "name": "Get Group Details",
      "value": "getDetails",
      "action": "Get group details",
      "description": "Retrieve details of a specific signature group",
      "resource": "group"
    }
  ]

npm_readme:
  # @d4sign/n8n-nodes-d4sign

  Community node to integrate n8n with the D4Sign API.

  ## Requirements

  - n8n with support for community nodes
  - valid D4Sign API credentials (`tokenAPI` and `cryptKey`)

  ## Installation

  Install in your n8n custom nodes environment:

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

  ## Credential Setup

  Create a credential of type `D4Sign API` and fill:

  - `tokenAPI`
  - `cryptKey`

  Credential fields are masked in the UI and n8n stores credentials encrypted at rest.

  ## Supported Resources

  - Document List
  - Document Workflow
  - Document Pins
  - Document Tags
  - Document Upload
  - Document Watchers
  - Document Webhooks
  - Signatory
  - Template
  - Safe
  - Group

  ## Upload Document (Binary) Quick Start

  1. Add an `HTTP Request` node and download a file with `Response Format = File`.
  2. Add `D4Sign` node with:
     - `Resource = Document Upload`
     - `Operation = Upload Document`
     - `Content Source = Binary Property`
     - `Binary Property = data` (or the property name from previous node)
  3. Select `Safe` and optional `Folder`.
  4. Execute workflow.

  ## Example Workflow (Sanitized)

  This repository includes a sanitized example exported from a real test flow:

  - [examples/workflows/d4sign-upload-main-document-sanitized.json](examples/workflows/d4sign-upload-main-document-sanitized.json)

  Sanitization applied:

  - removed workflow and node IDs
  - removed `meta`, `versionId`, `active`, `pinData`
  - removed credential IDs
  - replaced environment-specific UUIDs with placeholders where needed

  ## Common Troubleshooting

  - `File empty. Check the document path.`
    - confirm previous node outputs real binary data
    - confirm `Binary Property` name matches the binary key (usually `data`)
    - set `File Name` explicitly (example: `contract.pdf`)
  - `Safe UUID must be a valid UUID`
    - select Safe from dropdown or use a valid UUID
  - `Base64 content is malformed`
    - ensure the base64 input is valid and complete

  ## Development

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

  ## Publishing

  Package name follows the n8n standard:

  - `@d4sign/n8n-nodes-d4sign`

  For Creator Portal verification, n8n requires publish via GitHub Actions with provenance.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Integrates n8n with the D4Sign API to manage documents, signatures, templates, safes, groups, and related signing workflow features.","capabilities":["List documents","Manage document workflows","Manage document pins","Manage document tags","Upload documents from binary data","Manage document watchers","Manage document webhooks","Manage signatories","Manage templates","Manage safes"],"authentication":"D4Sign API credentials required: tokenAPI and cryptKey","commonUseCases":["Upload a document downloaded by an HTTP Request node as binary data","Send documents through D4Sign signing workflows","Manage signatories, watchers, tags, and webhooks for documents","Work with D4Sign templates, safes, and groups"],"limitations":["Document upload from binary requires a valid binary property from a previous node","Safe UUID must be valid or selected from the dropdown","Base64 input must be valid and complete when using base64 content"],"relatedNodes":["HTTP Request"]}


node_type: n8n-nodes-lumatrack.lumaTrackTrigger
package_name: n8n-nodes-lumatrack
display_name: LumaTrack Trigger
description: Starts a workflow when LumaTrack sends a webhook event (held runs, period closes, and more)
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lumatrack
author_github_url: https://github.com/LumaTrack/
npm_package_name: n8n-nodes-lumatrack
npm_version: 0.3.0
community_fetched_at: 2026-07-14T14:40:34.669Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # n8n-nodes-lumatrack

  Record every workflow execution as a run event in [LumaTrack](https://lumatrack.io),
  the system of record for automation value. Drop the node at the end of a
  workflow (and on the error path, with Status set to Failure) and the value
  report builds itself.

  ## Install

  In n8n: Settings, Community Nodes, Install, enter `n8n-nodes-lumatrack`.

  ## Credentials

  - Base URL: your LumaTrack host
  - API key: Settings, API keys in LumaTrack (shown once at creation)

  ## Fields

  Two nodes ship in this package: **LumaTrack** (operations: Record Run,
  Get ROI Summary; usable as an AI Agent tool) and **LumaTrack Trigger**
  (starts workflows from LumaTrack webhook events, signature-verified).

  | Record Run field | Notes |
  |---|---|
  | Automation | Dropdown of your automations, or a slug by expression |
  | Status | Success or Failure. Report failures too: they cost money and save nothing |
  | Failure reason | Root cause for failures; powers the failure-reason Pareto |
  | Units from input items | One run for the whole execution, units = input item count (the after-a-loop pattern) |
  | Units processed | Records/items the execution worked through; -1 omits (server default 1). Drives per-unit valuation |
  | Executed at | ISO 8601 for evidence that happened earlier; empty = now |
  | Duration (seconds) | Optional wall-clock runtime |
  | External ID | Defaults to the n8n execution ID, making retries idempotent |
  | AI usage | Model + tokens, priced server-side; metered or subscription billing |
  | Metered usage | Per-unit cost-component consumption by name |
  | Metadata | Arbitrary JSON kept with the run |

  The trigger node verifies X-LumaTrack-Signature (HMAC-SHA256 of the exact
  body) with your webhook endpoint's secret; register the trigger's URL in
  LumaTrack under Settings, Webhooks.

  Sub-workflows report as their own executions (their execution IDs are the
  idempotency default). A node inside a loop dedupes every iteration into one
  run; aggregate first and report once with Units processed, or set External
  ID to `={{ $execution.id }}-{{ $itemIndex }}`.

  Build from source: `npm install && npm run build`.

ai_documentation_summary:
  {"purpose":"Starts n8n workflows when LumaTrack sends webhook events such as held runs, period closes, and other automation value events. Incoming webhooks are signature-verified for authenticity.","capabilities":["Receive webhook events from LumaTrack","Trigger workflows from LumaTrack events","Verify X-LumaTrack-Signature using HMAC-SHA256 of the exact request body","Provide a trigger URL to register in LumaTrack under Settings > Webhooks"],"authentication":"Webhook endpoint secret for HMAC-SHA256 signature verification; LumaTrack credentials also use Base URL and API key","commonUseCases":["Start workflows when LumaTrack sends lifecycle or reporting events","React to held run events","React to period close events","Build automation monitoring or follow-up workflows from LumaTrack webhooks"],"limitations":["Webhook URL must be registered manually in LumaTrack settings","Signature verification depends on the exact raw request body and the webhook endpoint secret"],"relatedNodes":["LumaTrack","Webhook"]}


node_type: n8n-nodes-lumatrack.lumaTrack
package_name: n8n-nodes-lumatrack
display_name: LumaTrack
description: Record automation run events in LumaTrack, or read the value summary
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lumatrack
author_github_url: https://github.com/LumaTrack/
npm_package_name: n8n-nodes-lumatrack
npm_version: 0.3.0
community_fetched_at: 2026-07-14T14:40:34.670Z
ai_summary_generated_at: 2026-07-14 15:01:34
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "recordRun",
      "options": [
        {
          "name": "Get ROI Summary",
          "value": "getSummary",
          "action": "Get the ROI summary",
          "description": "The organization's realized value summary"
        },
        {
          "name": "Record Run",
          "value": "recordRun",
          "action": "Record a run event",
          "description": "Report one execution (success or failure) to the value ledger"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get ROI Summary",
      "value": "getSummary",
      "action": "Get the ROI summary",
      "description": "The organization's realized value summary"
    },
    {
      "name": "Record Run",
      "value": "recordRun",
      "action": "Record a run event",
      "description": "Report one execution (success or failure) to the value ledger"
    }
  ]

npm_readme:
  # n8n-nodes-lumatrack

  Record every workflow execution as a run event in [LumaTrack](https://lumatrack.io),
  the system of record for automation value. Drop the node at the end of a
  workflow (and on the error path, with Status set to Failure) and the value
  report builds itself.

  ## Install

  In n8n: Settings, Community Nodes, Install, enter `n8n-nodes-lumatrack`.

  ## Credentials

  - Base URL: your LumaTrack host
  - API key: Settings, API keys in LumaTrack (shown once at creation)

  ## Fields

  Two nodes ship in this package: **LumaTrack** (operations: Record Run,
  Get ROI Summary; usable as an AI Agent tool) and **LumaTrack Trigger**
  (starts workflows from LumaTrack webhook events, signature-verified).

  | Record Run field | Notes |
  |---|---|
  | Automation | Dropdown of your automations, or a slug by expression |
  | Status | Success or Failure. Report failures too: they cost money and save nothing |
  | Failure reason | Root cause for failures; powers the failure-reason Pareto |
  | Units from input items | One run for the whole execution, units = input item count (the after-a-loop pattern) |
  | Units processed | Records/items the execution worked through; -1 omits (server default 1). Drives per-unit valuation |
  | Executed at | ISO 8601 for evidence that happened earlier; empty = now |
  | Duration (seconds) | Optional wall-clock runtime |
  | External ID | Defaults to the n8n execution ID, making retries idempotent |
  | AI usage | Model + tokens, priced server-side; metered or subscription billing |
  | Metered usage | Per-unit cost-component consumption by name |
  | Metadata | Arbitrary JSON kept with the run |

  The trigger node verifies X-LumaTrack-Signature (HMAC-SHA256 of the exact
  body) with your webhook endpoint's secret; register the trigger's URL in
  LumaTrack under Settings, Webhooks.

  Sub-workflows report as their own executions (their execution IDs are the
  idempotency default). A node inside a loop dedupes every iteration into one
  run; aggregate first and report once with Units processed, or set External
  ID to `={{ $execution.id }}-{{ $itemIndex }}`.

  Build from source: `npm install && npm run build`.

ai_documentation_summary:
  {"purpose":"Records n8n workflow execution events in LumaTrack to track automation value and ROI, and can read ROI summaries. It is intended to be placed at the end of workflows and on error paths to report success or failure runs.","capabilities":["Record Run events for automations","Get ROI Summary from LumaTrack","Report run status as Success or Failure","Capture failure reasons for failure analysis","Set units processed manually or from input item count","Record execution timestamp, duration, and external ID for idempotency","Track AI usage including model and token counts","Track metered usage by cost component name","Attach arbitrary JSON metadata to runs","Usable as an AI Agent tool"],"authentication":"API key required, with Base URL and API key from LumaTrack Settings > API keys. The related trigger uses a webhook secret to verify X-LumaTrack-Signature via HMAC-SHA256.","commonUseCases":["Report successful workflow executions to LumaTrack","Report failed executions from an error path with failure reason","Build automation ROI and value reports automatically","Track per-unit value by reporting units processed","Track AI token usage or metered cost-component usage for automation runs"],"limitations":["API keys are shown only once when created in LumaTrack","A node inside a loop deduplicates every iteration into one run unless External ID is customized, such as using execution ID plus item index","Sub-workflows report as their own executions with their own execution IDs as the default idempotency key","Units processed set to -1 omits the value and uses the server default of 1"],"relatedNodes":["LumaTrack Trigger","AI Agent"]}


node_type: @crawlbase/n8n-nodes-crawlbase.crawlbase
package_name: @crawlbase/n8n-nodes-crawlbase
display_name: Crawlbase
description: Crawl a URL with Crawlbase Crawling API
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: crawlbase
author_github_url: https://github.com/crawlbase/n8n-nodes-crawlbase.git
npm_package_name: @crawlbase/n8n-nodes-crawlbase
npm_version: 1.2.6
community_fetched_at: 2026-07-14T14:40:34.671Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # n8n-nodes-crawlbase

  Crawlbase node for [n8n](https://n8n.io). Crawl web pages with native **Crawlbase API** credentials and the **Crawling API** — no need to wire a generic HTTP Request node by hand.

  ## Features

  - **Native credentials** — Add your Crawlbase API token once and use it across workflows; **Test connection** validates the token.
  - **Crawling API** — Single node for GET/POST/PUT with URL (from parameter or from each input item).
  - **Options** — Optional Crawling API parameters (for example `format`, `page_wait`, `country`, `request_headers`, cookies, `device`, scraper, screenshot, store, async, and JS rendering helpers), **request body** for POST/PUT, and an HTTP **timeout** on the client (not a Crawlbase query parameter). See [Crawling API parameters](https://crawlbase.com/docs/crawling-api/parameters) for the full list and behavior.
  - **Normalized output** — Each item returns `statusCode`, `headers`, `body`, and `metadata` (including `originalStatus`, `cbStatus`, `url` where provided by the API).

  ## Installation

  ### In n8n (Community nodes)

  1. In n8n, go to **Settings** → **Community nodes** → **Install a community node**.
  2. Enter: `n8n-nodes-crawlbase`.
  3. Install and restart if prompted.

  ### From source

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

  Then in n8n, add the path to this package (the directory containing this README) as a community node in **Settings** → **Community nodes**, or use `npm run dev` to run n8n with this node loaded locally.

  ## Credentials

  1. Add a **Crawlbase API** credential (search for “Crawlbase” in the credential list).
  2. Enter your **API Token** from the [Crawlbase dashboard](https://crawlbase.com/dashboard).
  3. Click **Test connection** to confirm the token works.

  ## First crawl

  1. Add a **Crawlbase** node to your workflow.
  2. Select your Crawlbase API credential.
  3. Enter a **URL** (e.g. `https://example.com`) or choose **From input item field** and set the field name.
  4. Choose **Method** (GET/POST/PUT) and **Response format** (HTML, JSON, or Markdown).
  5. Run the workflow. The node outputs `statusCode`, `headers`, `body`, and `metadata` for each URL.

  ## Item-list mode

  - Set **URL Source** to **From input item field** and specify the field that contains the URL (e.g. `url`).
  - Connect an input that provides one item per URL. The node runs one Crawling API request per item and returns one output item per input item.

  ## Rate limits and retries

  Crawlbase applies rate limits depending on your plan. To avoid failures:

  - Use n8n’s **Retry On Fail** on the Crawlbase node (node settings).
  - Set **Wait Between Tries** to at least 1 second (or higher if you hit limits).
  - For many URLs, consider splitting work (e.g. Loop Over Items / batching) so you don’t send bursts of requests.

  ## Example workflow

  See [example-workflow.json](./example-workflow.json) for a workflow that crawls a single public URL and returns HTML. Import it in n8n via **Workflows** → **Import from file**.

  ## Links

  - [Crawlbase Crawling API docs](https://crawlbase.com/docs/crawling-api)
  - [Crawlbase dashboard](https://crawlbase.com/dashboard)
  - [n8n community nodes](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n Creator Portal](https://creators.n8n.io/nodes)

  ## License

  MIT

  ---

  Copyright 2026 Crawlbase

ai_documentation_summary:
  {"purpose":"Crawlbase is an n8n community node for crawling web pages using the Crawlbase Crawling API without manually configuring an HTTP Request node. It supports crawling a single URL or one URL per input item and returns normalized crawl results.","capabilities":["Authenticate with native Crawlbase API credentials","Test API token connection","Crawl URLs using the Crawlbase Crawling API","Support GET, POST, and PUT methods","Use a static URL parameter or read URLs from an input item field","Process item lists with one Crawling API request per input item","Configure response formats including HTML, JSON, and Markdown","Set Crawling API options such as format, page_wait, country, request_headers, cookies, device, scraper, screenshot, store, async, and JavaScript rendering helpers","Send request body data for POST and PUT requests","Configure client-side HTTP timeout"],"authentication":"API token required via native Crawlbase API credentials","commonUseCases":["Crawl a single public URL and retrieve HTML, JSON, or Markdown","Crawl multiple URLs from incoming n8n items","Scrape or render web pages using Crawlbase Crawling API parameters","Send POST or PUT crawl requests with a request body","Capture response metadata such as original status, Crawlbase status, and resolved URL"],"limitations":["Crawlbase rate limits apply depending on the user's plan","For many URLs, workflows may need retries, wait intervals, or batching to avoid request bursts"],"relatedNodes":["HTTP Request","Loop Over Items"]}


node_type: n8n-nodes-nostr.nostr
package_name: n8n-nodes-nostr
display_name: Nostr
description: Publish, query and encrypt on the Nostr protocol
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: jstaab
author_github_url: https://github.com/coracle-social/
npm_package_name: n8n-nodes-nostr
npm_version: 1.0.4
community_fetched_at: 2026-07-14T14:40:34.671Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # n8n-nodes-nostr

  An [n8n](https://n8n.io) community node package for the
  [Nostr](https://github.com/nostr-protocol/nostr) protocol. Create and sign
  events, fetch them by filter, encrypt and decrypt with NIP-44, encode and
  decode NIP-19 entities, authenticate to relays with NIP-42, and trigger
  workflows from a live event subscription.

  It ships as a self-contained package with **no runtime dependencies**: the
  cryptography Node's standard library does not provide (BIP-340 schnorr, bech32)
  is vendored into the package and compiled from source. See
  [Why vendored crypto](#why-vendored-crypto).

  ## Nodes

  This package provides two nodes and one credential.

  - **Nostr** — an action node with three resources (Event, Encryption, Utility).
  - **Nostr Trigger** — starts a workflow when a matching event arrives on your
    relays.
  - **Nostr Private Key API** — the credential holding your secret key and default
    relays.

  ## Installation

  Requires a **self-hosted** n8n. The package is on npm and passes
  `@n8n/scan-community-package`, n8n's own analyser, but it has not been submitted
  for verification — and unverified community nodes are not offered on n8n Cloud.

  **Community Nodes UI** — Settings → Community Nodes → Install, enter
  `n8n-nodes-nostr`. Requires an Owner or Admin account.

  **Manually** — in your n8n custom-extensions directory (default `~/.n8n/custom`):

  ```bash
  cd ~/.n8n/custom
  npm init -y            # only if this directory has no package.json yet
  npm install n8n-nodes-nostr
  ```

  Restart n8n. See the n8n docs on
  [installing community nodes](https://docs.n8n.io/integrations/community-nodes/installation-and-management.md).

  ## Credentials

  | Field | Description |
  | --- | --- |
  | **Private Key** | Your Nostr secret key as an `nsec1…` (bech32) or 64-character hex string. Stored encrypted by n8n and never logged. Masked in the UI. |
  | **Default Relays** | Relays used whenever a node leaves its **Relays** field empty. One URL per line. |

  The credential's **Test** button issues one HTTP request to your first relay's
  NIP-11 info document to confirm the relay is reachable — n8n's community-node
  verification requires a declarative credential test, and a Nostr key has no
  endpoint of its own to probe. Key validation itself is local and network-free: the
  nodes declare a `testedBy` method that checks the key's format and derives its
  `npub` without any network call.

  The credential is optional for read-only work (getting events, decoding). It is
  required for anything that signs or encrypts: creating, signing, and NIP-44
  encrypt/decrypt.

  ## Nostr (action node)

  Pick a **Resource**, then an **Operation**.

  ### Event

  - **Create** — build and sign an event (or pass a fully-formed raw event) and
    broadcast it to relays. Returns one result **per relay** (see
    [Relay semantics](#relay-semantics)).
  - **Get** — fetch the single newest event matching a filter. Forces `limit` 1 and
    returns one item, or nothing when no event matches.
  - **Get Many** — fetch stored events matching a filter. Terminates
    deterministically on `limit`, on end-of-stored-events, or on a wall-clock
    timeout, and dedups across relays.
  - **Sign** — finalize and sign an event offline, without touching the network.
    Returns the signed event, its `id`, `pubkey`, and optionally an `nevent`.

  Both **Create** and **Sign** accept either **Fields** mode (`kind`, `content`,
  `tags`) or **Raw Event JSON** mode. A raw event that already carries a valid `id`
  and `sig` is published as-is; otherwise it is finalized with your credential.

  A profile is just a kind-0 event and a relay list a kind-10002 event, so **Get**
  with the right `kinds` fetches either; parse the JSON `content` in a downstream
  node.

  ### Encryption (NIP-44)

  - **Encrypt** — encrypt plaintext to a peer's public key. Returns
    `{ ciphertext, version: 'nip44' }`.
  - **Decrypt** — decrypt a NIP-44 payload from a peer. Returns `{ plaintext }`.

  Both derive the conversation key from your secret key and the peer's public key,
  so both require a credential. No relays are involved.

  ### Utility (NIP-19)

  - **Decode** — decode any `npub` / `nsec` / `note` / `nprofile` / `nevent` /
    `naddr` into `{ type, data }`, expanding hex, pubkeys, and relay hints.
  - **Encode** — build an `npub` / `note` / `nprofile` / `nevent` / `naddr` from its
    parts. Encoding an `nsec` is deliberately not offered: a workflow should never
    move a secret key around as output.

  No network, no credential.

  ## Nostr Trigger

  Subscribes to your relays and emits an item for each matching event.

  | Option | Default | Notes |
  | --- | --- | --- |
  | **Relays** | credential defaults | One URL per line. |
  | **Filter** (Fields or Raw JSON) | `kinds: 1` | Live tail — no `limit`/`until`. |
  | **Authenticate** | `true` | Perform NIP-42 AUTH when a relay requires it. |
  | **Overlap Seconds** | `60` | On restart, rewind the subscription start by this much so events near the cutover are not missed. |
  | **Include Historical** | `false` | On first activation, also deliver events from before now. |
  | **Emit Envelope** | `false` | Wrap output as `{ event, relay }` instead of the flat event. |
  | **Max Seen IDs** | `5000` | Bound on the in-memory dedup set. |

  Deduplication uses the event `id` as the native n8n deduplication key, so the
  same event arriving from several relays fires the workflow once. The
  subscription position (`lastCreatedAt`) and a bounded set of seen ids are
  persisted in the workflow's static data, so a save/deploy/restart resumes with a
  deliberate overlap window instead of replaying or dropping events. Using
  **Execute step** in the editor runs a single bounded query and stops, rather than
  opening a live tail.

  ## A worked example

  **Cross-post to Nostr when a webhook fires.**

  1. **Webhook** node receives a payload with a `message` field.
  2. **Nostr** node — Resource **Event**, Operation **Create**:
     - `inputMode`: **Fields**
     - `kind`: `1`
     - `content`: `={{ $json.message }}`
     - `relays`: leave empty to use your credential's default relays
     - credential: your **Nostr Private Key API**
  3. Inspect the output: an object with the signed `event` and a `results` array —
     one entry per relay with `relay`, `ok`, `reason`, and `durationMs` — plus
     `accepted` and `rejected` (arrays of relay URLs) and the `allAccepted` /
     `anyAccepted` booleans.

  To react to replies, add a **Nostr Trigger** with `kinds: 1` and a `#p` tag
  filter set to your own pubkey.

  ## Relay semantics

  Nostr is not request/response, and these nodes surface that faithfully instead of
  hiding it:

  - **Create returns per-relay results, never one boolean.** Each relay
    independently accepts or rejects an event with its own reason. Acceptance on
    one relay is not acceptance on another, so the node returns the full
    `results[]` array plus `accepted` / `rejected` / `allAccepted` / `anyAccepted`.
    A rejection is **data**, not a workflow error. Enable **Split Results Into
    Items** to emit one item per relay.
  - **Queries always terminate.** `EOSE` (end of stored events) is advisory, and
    some relays never send it. Termination is driven by an explicit `limit`
    **and** a wall-clock `timeoutMs`, so a query never hangs.
  - **Duplicates are expected and removed.** The same event arriving from N relays
    is deduplicated by `event.id`. For replaceable and addressable kinds (0, 3,
    10002, 30000–39999) the newest `created_at` wins, tie-broken by lowest `id`.
  - **NIP-42 AUTH is handled in the connection layer.** Relays may demand a signed
    kind-22242 challenge before accepting a `REQ` or `EVENT`. When
    **Authenticate** is on and a credential is present, the node authenticates
    both eagerly (on an `AUTH` challenge) and reactively (on an `auth-required`
    rejection), retries the blocked frame once, and otherwise records
    `auth-required` as a per-relay reason. A read-only subscription can authenticate
    too. Missing credentials only raise an error when the operation itself strictly
    requires signing.

  ## Why vendored crypto

  n8n's verified community node guidelines favor packages with no runtime
  dependencies. Node's standard library covers SHA-256, HMAC, HKDF, and ChaCha20,
  but not the BIP-340 schnorr signatures every Nostr event needs, nor bech32 for
  NIP-19. Rather than add runtime dependencies, this package vendors the minimal
  source it needs — `@noble/curves`, `@noble/hashes`, and `@scure/base` — into
  `vendor/` and compiles it with its own TypeScript build. ChaCha20 for NIP-44
  uses Node's built-in `node:crypto`.

  The result: `package.json` has `"dependencies": {}`, and the only Node built-in
  used at runtime is `node:crypto`. Provenance, versions, tarball hashes, and the
  exact deviations from upstream are documented in
  [`VENDOR.md`](./VENDOR.md); the full upstream license texts are in
  [`THIRD_PARTY_LICENSES.md`](./THIRD_PARTY_LICENSES.md). The vendored crypto is
  proven byte-for-byte against the published BIP-340, SHA-256, HMAC, HKDF, bech32,
  and NIP-44 v2 spec vectors in the test suite.

  ## License

  [MIT](./LICENSE) © 2026 Jonathan Staab. Vendored and adapted third-party code
  retains its own licenses; see [`THIRD_PARTY_LICENSES.md`](./THIRD_PARTY_LICENSES.md).

  The node icons are the Nostr community icon by Andrea Nicolini, from
  [mbarulli/nostr-logo](https://github.com/mbarulli/nostr-logo), released under
  CC0 1.0 (public domain).

ai_documentation_summary:
  {"purpose":"Provides n8n nodes for working with the Nostr protocol: creating, signing, publishing, querying, encrypting/decrypting events, encoding/decoding NIP-19 entities, and triggering workflows from live Nostr subscriptions.","capabilities":["Create and sign Nostr events from fields or raw event JSON","Broadcast events to one or more relays","Fetch the newest event matching a filter","Fetch many stored events with limit, end-of-stored-events, timeout handling, and cross-relay deduplication","Sign events offline without network access","Encrypt plaintext using NIP-44 to a peer public key","Decrypt NIP-44 payloads from a peer","Decode NIP-19 entities including npub, nsec, note, nprofile, nevent, and naddr","Encode NIP-19 entities including npub, note, nprofile, nevent, and naddr","Authenticate to relays using NIP-42"],"authentication":"Uses a Nostr Private Key API credential containing a private key as nsec1 bech32 or 64-character hex plus optional default relays. Credential is optional for read-only operations and decoding, but required for creating, signing, encrypting, and decrypting. Relay authentication can use NIP-42.","commonUseCases":["Publish Nostr events when another workflow event occurs","Query relays for notes, profiles, relay lists, or other event kinds","Sign Nostr events offline before publishing elsewhere","Encrypt and decrypt direct-message-style payloads with NIP-44","Convert between Nostr hex identifiers and NIP-19 bech32 entities"],"limitations":["Requires self-hosted n8n; unverified community nodes are not available on n8n Cloud","Encoding nsec secret keys is deliberately not supported","Credential test only checks relay reachability via the first relay's NIP-11 document; private key validation is local"],"relatedNodes":["Nostr Trigger","Webhook"]}


node_type: n8n-nodes-nostr.nostrTrigger
package_name: n8n-nodes-nostr
display_name: Nostr Trigger
description: Starts a workflow when a matching Nostr event arrives
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: jstaab
author_github_url: https://github.com/coracle-social/
npm_package_name: n8n-nodes-nostr
npm_version: 1.0.4
community_fetched_at: 2026-07-14T14:40:34.672Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # n8n-nodes-nostr

  An [n8n](https://n8n.io) community node package for the
  [Nostr](https://github.com/nostr-protocol/nostr) protocol. Create and sign
  events, fetch them by filter, encrypt and decrypt with NIP-44, encode and
  decode NIP-19 entities, authenticate to relays with NIP-42, and trigger
  workflows from a live event subscription.

  It ships as a self-contained package with **no runtime dependencies**: the
  cryptography Node's standard library does not provide (BIP-340 schnorr, bech32)
  is vendored into the package and compiled from source. See
  [Why vendored crypto](#why-vendored-crypto).

  ## Nodes

  This package provides two nodes and one credential.

  - **Nostr** — an action node with three resources (Event, Encryption, Utility).
  - **Nostr Trigger** — starts a workflow when a matching event arrives on your
    relays.
  - **Nostr Private Key API** — the credential holding your secret key and default
    relays.

  ## Installation

  Requires a **self-hosted** n8n. The package is on npm and passes
  `@n8n/scan-community-package`, n8n's own analyser, but it has not been submitted
  for verification — and unverified community nodes are not offered on n8n Cloud.

  **Community Nodes UI** — Settings → Community Nodes → Install, enter
  `n8n-nodes-nostr`. Requires an Owner or Admin account.

  **Manually** — in your n8n custom-extensions directory (default `~/.n8n/custom`):

  ```bash
  cd ~/.n8n/custom
  npm init -y            # only if this directory has no package.json yet
  npm install n8n-nodes-nostr
  ```

  Restart n8n. See the n8n docs on
  [installing community nodes](https://docs.n8n.io/integrations/community-nodes/installation-and-management.md).

  ## Credentials

  | Field | Description |
  | --- | --- |
  | **Private Key** | Your Nostr secret key as an `nsec1…` (bech32) or 64-character hex string. Stored encrypted by n8n and never logged. Masked in the UI. |
  | **Default Relays** | Relays used whenever a node leaves its **Relays** field empty. One URL per line. |

  The credential's **Test** button issues one HTTP request to your first relay's
  NIP-11 info document to confirm the relay is reachable — n8n's community-node
  verification requires a declarative credential test, and a Nostr key has no
  endpoint of its own to probe. Key validation itself is local and network-free: the
  nodes declare a `testedBy` method that checks the key's format and derives its
  `npub` without any network call.

  The credential is optional for read-only work (getting events, decoding). It is
  required for anything that signs or encrypts: creating, signing, and NIP-44
  encrypt/decrypt.

  ## Nostr (action node)

  Pick a **Resource**, then an **Operation**.

  ### Event

  - **Create** — build and sign an event (or pass a fully-formed raw event) and
    broadcast it to relays. Returns one result **per relay** (see
    [Relay semantics](#relay-semantics)).
  - **Get** — fetch the single newest event matching a filter. Forces `limit` 1 and
    returns one item, or nothing when no event matches.
  - **Get Many** — fetch stored events matching a filter. Terminates
    deterministically on `limit`, on end-of-stored-events, or on a wall-clock
    timeout, and dedups across relays.
  - **Sign** — finalize and sign an event offline, without touching the network.
    Returns the signed event, its `id`, `pubkey`, and optionally an `nevent`.

  Both **Create** and **Sign** accept either **Fields** mode (`kind`, `content`,
  `tags`) or **Raw Event JSON** mode. A raw event that already carries a valid `id`
  and `sig` is published as-is; otherwise it is finalized with your credential.

  A profile is just a kind-0 event and a relay list a kind-10002 event, so **Get**
  with the right `kinds` fetches either; parse the JSON `content` in a downstream
  node.

  ### Encryption (NIP-44)

  - **Encrypt** — encrypt plaintext to a peer's public key. Returns
    `{ ciphertext, version: 'nip44' }`.
  - **Decrypt** — decrypt a NIP-44 payload from a peer. Returns `{ plaintext }`.

  Both derive the conversation key from your secret key and the peer's public key,
  so both require a credential. No relays are involved.

  ### Utility (NIP-19)

  - **Decode** — decode any `npub` / `nsec` / `note` / `nprofile` / `nevent` /
    `naddr` into `{ type, data }`, expanding hex, pubkeys, and relay hints.
  - **Encode** — build an `npub` / `note` / `nprofile` / `nevent` / `naddr` from its
    parts. Encoding an `nsec` is deliberately not offered: a workflow should never
    move a secret key around as output.

  No network, no credential.

  ## Nostr Trigger

  Subscribes to your relays and emits an item for each matching event.

  | Option | Default | Notes |
  | --- | --- | --- |
  | **Relays** | credential defaults | One URL per line. |
  | **Filter** (Fields or Raw JSON) | `kinds: 1` | Live tail — no `limit`/`until`. |
  | **Authenticate** | `true` | Perform NIP-42 AUTH when a relay requires it. |
  | **Overlap Seconds** | `60` | On restart, rewind the subscription start by this much so events near the cutover are not missed. |
  | **Include Historical** | `false` | On first activation, also deliver events from before now. |
  | **Emit Envelope** | `false` | Wrap output as `{ event, relay }` instead of the flat event. |
  | **Max Seen IDs** | `5000` | Bound on the in-memory dedup set. |

  Deduplication uses the event `id` as the native n8n deduplication key, so the
  same event arriving from several relays fires the workflow once. The
  subscription position (`lastCreatedAt`) and a bounded set of seen ids are
  persisted in the workflow's static data, so a save/deploy/restart resumes with a
  deliberate overlap window instead of replaying or dropping events. Using
  **Execute step** in the editor runs a single bounded query and stops, rather than
  opening a live tail.

  ## A worked example

  **Cross-post to Nostr when a webhook fires.**

  1. **Webhook** node receives a payload with a `message` field.
  2. **Nostr** node — Resource **Event**, Operation **Create**:
     - `inputMode`: **Fields**
     - `kind`: `1`
     - `content`: `={{ $json.message }}`
     - `relays`: leave empty to use your credential's default relays
     - credential: your **Nostr Private Key API**
  3. Inspect the output: an object with the signed `event` and a `results` array —
     one entry per relay with `relay`, `ok`, `reason`, and `durationMs` — plus
     `accepted` and `rejected` (arrays of relay URLs) and the `allAccepted` /
     `anyAccepted` booleans.

  To react to replies, add a **Nostr Trigger** with `kinds: 1` and a `#p` tag
  filter set to your own pubkey.

  ## Relay semantics

  Nostr is not request/response, and these nodes surface that faithfully instead of
  hiding it:

  - **Create returns per-relay results, never one boolean.** Each relay
    independently accepts or rejects an event with its own reason. Acceptance on
    one relay is not acceptance on another, so the node returns the full
    `results[]` array plus `accepted` / `rejected` / `allAccepted` / `anyAccepted`.
    A rejection is **data**, not a workflow error. Enable **Split Results Into
    Items** to emit one item per relay.
  - **Queries always terminate.** `EOSE` (end of stored events) is advisory, and
    some relays never send it. Termination is driven by an explicit `limit`
    **and** a wall-clock `timeoutMs`, so a query never hangs.
  - **Duplicates are expected and removed.** The same event arriving from N relays
    is deduplicated by `event.id`. For replaceable and addressable kinds (0, 3,
    10002, 30000–39999) the newest `created_at` wins, tie-broken by lowest `id`.
  - **NIP-42 AUTH is handled in the connection layer.** Relays may demand a signed
    kind-22242 challenge before accepting a `REQ` or `EVENT`. When
    **Authenticate** is on and a credential is present, the node authenticates
    both eagerly (on an `AUTH` challenge) and reactively (on an `auth-required`
    rejection), retries the blocked frame once, and otherwise records
    `auth-required` as a per-relay reason. A read-only subscription can authenticate
    too. Missing credentials only raise an error when the operation itself strictly
    requires signing.

  ## Why vendored crypto

  n8n's verified community node guidelines favor packages with no runtime
  dependencies. Node's standard library covers SHA-256, HMAC, HKDF, and ChaCha20,
  but not the BIP-340 schnorr signatures every Nostr event needs, nor bech32 for
  NIP-19. Rather than add runtime dependencies, this package vendors the minimal
  source it needs — `@noble/curves`, `@noble/hashes`, and `@scure/base` — into
  `vendor/` and compiles it with its own TypeScript build. ChaCha20 for NIP-44
  uses Node's built-in `node:crypto`.

  The result: `package.json` has `"dependencies": {}`, and the only Node built-in
  used at runtime is `node:crypto`. Provenance, versions, tarball hashes, and the
  exact deviations from upstream are documented in
  [`VENDOR.md`](./VENDOR.md); the full upstream license texts are in
  [`THIRD_PARTY_LICENSES.md`](./THIRD_PARTY_LICENSES.md). The vendored crypto is
  proven byte-for-byte against the published BIP-340, SHA-256, HMAC, HKDF, bech32,
  and NIP-44 v2 spec vectors in the test suite.

  ## License

  [MIT](./LICENSE) © 2026 Jonathan Staab. Vendored and adapted third-party code
  retains its own licenses; see [`THIRD_PARTY_LICENSES.md`](./THIRD_PARTY_LICENSES.md).

  The node icons are the Nostr community icon by Andrea Nicolini, from
  [mbarulli/nostr-logo](https://github.com/mbarulli/nostr-logo), released under
  CC0 1.0 (public domain).

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when a matching Nostr event arrives from configured relays. It maintains a live subscription with deduplication and restart resume behavior.","capabilities":["Subscribe to one or more Nostr relays for live matching events","Filter events using field-based filters or raw JSON filters","Use default relays from the Nostr Private Key API credential when relays are not specified","Perform NIP-42 AUTH when required by a relay","Include historical events on first activation if enabled","Resume after restart using persisted lastCreatedAt with an overlap window","Deduplicate events arriving from multiple relays by event id","Optionally emit output as an envelope containing both event and relay","Run a bounded query in editor Execute step mode instead of opening a live subscription"],"authentication":"Nostr Private Key API credential with a private key in nsec1 or 64-character hex format; required for NIP-42 relay authentication and default relay configuration, but relays can be provided directly for unauthenticated subscriptions.","commonUseCases":["Trigger workflows when new Nostr notes or events of specific kinds are published","Monitor multiple relays for events matching authors, kinds, tags, or other filters","React to Nostr activity such as mentions, profile updates, relay lists, or custom event kinds","Cross-post, notify, archive, or process incoming Nostr events in downstream n8n nodes"],"limitations":["Requires self-hosted n8n; unverified community nodes are not offered on n8n Cloud","Live trigger filters do not use limit or until","Deduplication uses a bounded in-memory/static-data seen-id set controlled by Max Seen IDs","Execute step in the editor runs a single bounded query and stops rather than maintaining a live tail"],"relatedNodes":["Nostr"]}


node_type: n8n-nodes-pingen2.pingenTrigger
package_name: n8n-nodes-pingen2
display_name: Pingen Trigger
description: Starts the workflow when Pingen pushes a webhook (pick one event type per node)
category: Communication
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: pingencom
author_github_url: https://github.com/pingencom/
npm_package_name: n8n-nodes-pingen2
npm_version: 0.2.4
community_fetched_at: 2026-07-14T14:40:34.673Z
ai_summary_generated_at: 2026-07-14 15:01:34
npm_readme:
  # n8n-nodes-pingen2

  Send physical postal mail directly from [n8n](https://n8n.io) workflows using the [Pingen](https://pingen.com) API.

  Invoices, reminders, contracts, any PDF — dispatched as real letters across Europe, Switzerland and the UK.

  ## Requirements

  - A [Pingen account](https://pingen.com) (free signup)
  - n8n 1.0+ running on Node.js ≥ 20.15

  ## Installation

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

  ```
  n8n-nodes-pingen2
  ```

  ## Setup

  ### 1. Create a Pingen API app

  1. Log in at [identity.pingen.com](https://identity.pingen.com) (or [identity-staging.pingen.com](https://identity-staging.pingen.com) for Staging)
  2. Go to **API Access → Create Developer-App** (Client Credentials flow)
  3. Copy the **Client ID** and **Client Secret**

  The node requests all scopes it needs (`letter batch organisation_read webhook`) at token-exchange time — no scope picker on the Pingen side.

  ### 2. Add credential in n8n

  In n8n: **Credentials → New →** pick either:

  - **Pingen OAuth2 API** (for production)
  - **Pingen Staging OAuth2 API** (for testing — no real letters sent, no credits consumed)

  Paste Client ID + Secret and save. These credentials extend n8n's built-in OAuth2 (client-credentials grant), so n8n obtains and refreshes the access token for you.

  ### 3. Use the Pingen node

  Add the **Pingen** node to your workflow. Pick **Environment** (Production or Staging) — this selects which credential the node uses. Then pick your **Organisation** from the dropdown (auto-loaded from your Pingen account).

  ## Testing in Staging

  Pingen provides a free staging environment for development. Letters sent against staging are **not printed or mailed** and **don't consume credits**.

  **Setup is separate from production:**

  1. Create a second app at [identity-staging.pingen.com](https://identity-staging.pingen.com)
  2. In n8n, create a second credential using **Pingen Staging OAuth2 API** (not Pingen OAuth2 API) — staging and production client IDs/secrets are not interchangeable
  3. In the Pingen node, set **Environment → Staging** — the node switches to `api-staging.pingen.com` and uses the staging credential automatically

  Switch back to **Environment → Production** when going live. Each environment uses its own credential, so there is no cross-contamination.

  ## Example use cases

  Ready-to-import workflow JSON lives in [`docs/examples/`](./docs/examples/README.md).

  ### 1. Send an invoice when a Stripe payment succeeds

  ```
  Stripe trigger (invoice.paid)
    → HTTP Request (download invoice PDF)
    → Pingen (Resource: Letter, Operation: Upload & Create, Auto Send: true)
  ```
  → [`docs/examples/stripe-invoice-letter.json`](./docs/examples/stripe-invoice-letter.json)

  ### 2. Monthly batch of reminders

  ```
  Cron (1st of month)
    → Postgres: fetch overdue customers → PDF generator
    → Pingen (Resource: Batch, Operation: Upload & Create)
    → Pingen (Resource: Batch, Operation: Send, per-country delivery products)
  ```
  → [`docs/examples/monthly-reminders-batch.json`](./docs/examples/monthly-reminders-batch.json)

  ### 3. React to a delivery event in real time

  ```
  Pingen Trigger (Event Type: Delivered, with webhook secret)
    → Slack: notify ops channel
  ```
  → [`docs/examples/delivery-webhook-to-slack.json`](./docs/examples/delivery-webhook-to-slack.json)

  Prefer this over cron polling — you get the event the moment Pingen emits it, the node verifies the HMAC signature for you, and there are no wasted API calls. Need polling anyway (e.g. to backfill events from before the workflow existed)? Use the **Letter Event → Get Delivered** operation with a `created_at[gte]` filter.

  ## Resources & Operations

  Pick a **Resource** (Letter / Batch / Letter Event), then an **Operation**. Fields appear below the Operation selector.

  ### Resource: Letter

  | Operation | Description |
  |---|---|
  | Upload & Create | Upload a PDF and create a letter. Enable Auto Send to dispatch immediately. |
  | Send | Send a previously created letter (useful if you want to review price/recipient first). |
  | Get | Fetch one letter by ID. |
  | Get Many | List letters in the organisation (with paging/sort/filter). |
  | Calculate Price | Compute cost for a given country + delivery product before sending. |
  | Cancel | Cancel a letter that hasn't been dispatched. |

  ### Resource: Batch

  | Operation | Description |
  |---|---|
  | Upload & Create | Upload a PDF containing multiple letters and create a batch. |
  | Send | Send a created batch — specify delivery product per recipient country. |
  | Get | Get one batch by ID. |
  | Get Many | List batches (with paging/sort/filter). |
  | Cancel | Cancel a batch not yet sent. |
  | Delete | Delete a batch. |
  | Get Statistics | Aggregate stats (letter count, status breakdown) for a batch. |

  ### Resource: Letter Event

  | Operation | Description |
  |---|---|
  | Get for Letter | Events for a specific letter (status changes, delivery milestones). |
  | Get Issues | All `issue` events across the organisation (e.g. failed validation, held mail). |
  | Get Undeliverable | All `undeliverable` events. |
  | Get Delivered | All `delivered` events. |
  | Get Sent | All `sent` events. |

  ## Receiving webhooks

  Use the **Pingen Trigger** node to start a workflow when Pingen pushes an event.

  ### Event types

  | Event | When it fires |
  |---|---|
  | `Issues` | Pre-send validation rejected the letter (content inspection failure, bad format, policy check). The letter is **not** dispatched. |
  | `Sent` | Letter handed off to the postal carrier. |
  | `Delivered` | Letter arrived at the recipient. |
  | `Undeliverable` | Carrier tried and failed — returned the letter (e.g. wrong address discovered at delivery). |

  ### Setup — one trigger per event type

  One Pingen Trigger node = one event type = one URL. This keeps each branch of your workflow focused on a single concern (single-responsibility) and surfaces which events you're subscribed to directly in the canvas.

  The trigger **registers and removes the webhook in Pingen for you** — when you activate the workflow n8n creates the subscription in your organisation, and when you deactivate it n8n deletes it. No manual setup in the Pingen panel.

  1. Drag a **Pingen Trigger** onto the canvas. Pick **Environment** and **Organisation** (same as the action node), then an **Event Type** (Issues / Sent / Delivered / Undeliverable). The Webhook URL's path ends in `/issues`, `/sent`, `/delivered` or `/undeliverable` so it is self-documenting.
  2. Generate a strong random string (max 32 chars) and paste it into **Webhook Secret** (e.g. `openssl rand -hex 16`). It is registered as the webhook's signing key and used to verify the HMAC-SHA256 signature on every incoming request.
  3. **Activate the workflow.** n8n registers the webhook in Pingen automatically — nothing to paste in the Pingen panel. (During editing, use **"Listen for test event"** + the Test URL as usual.)
  4. Need more event types? Add another Pingen Trigger and repeat — one per event type you care about.

  ### Test URL vs Production URL (how n8n webhooks work)

  The trigger node shows **two URLs**:

  | URL | When it is live | Expires | Use for |
  |---|---|---|---|
  | **Test URL** | Only while you're in the editor and clicked **"Listen for test event"** | 2 minutes or first event | Development / fast iteration. Pingen's **"Send test webhook"** button can target this while the listener is armed. |
  | **Production URL** | Only while the workflow is **active** (toggle top-right) | Never — as long as the workflow stays active | Production — real delivery events. Also works with Pingen's "Send test webhook" if you want to smoke-test a live deployment. |

  **This is an n8n platform constraint — not something this node can change.** Day-to-day testing uses the Test URL + "Listen for test event". Once you're happy, just **activate the workflow** — n8n registers the Production URL in Pingen for you.

  ### Output shape

  The node unwraps Pingen's JSON:API envelope so downstream nodes see flat fields:

  ```json
  {
    "eventType": "delivered",
    "id": "<webhook event uuid>",
    "type": "webhook_delivered",
    "url": "https://your.webhook/url",
    "created_at": "2020-11-19T09:42:48+0100",
    "letter_id": "<letter uuid>",
    "event_id": "<letters_events uuid>",
    "organisation_id": "<organisation uuid>"
  }
  ```

  `reason` is included for `issues` events; `corrected_address` for `undeliverable`. `included[]` is forwarded as-is when non-empty.

  ### Security

  HMAC-SHA256 signature is verified **first**, before any other request inspection — an unauthenticated caller gets a generic `401` without learning whether the content-type, body shape, or anything else matched. Comparison is timing-safe (`crypto.timingSafeEqual`).

  ### Retries

  If the webhook URL is unreachable or returns non-2xx, Pingen retries on a fixed schedule (1 min, 5 min, 10 min, 1 h, 2 h, 4 h) then gives up. Keep the workflow idempotent — the same event may arrive more than once on flapping connections.

  ## Registered mail

  Registered letters require a recipient address that overrides the one printed on the PDF. When you set **Delivery Product → Registered** in the Send or Upload & Create operation:

  - **Recipient Address** is **required** (throws an error if missing)
  - **Sender Address** is optional but recommended

  ## Address validation limits

  Pingen enforces strict character limits on registered-mail addresses. The node validates before submitting:

  | Field | Max length | Notes |
  |---|---|---|
  | Name | 45 | Required |
  | Street | 40 | Either street+number OR pobox required |
  | House number | 10 | |
  | PO Box | 45 | Alternative to street+number |
  | ZIP | 8 | Required |
  | City | 25 | Required |
  | Country | 2 | ISO 3166-1 alpha-2 (e.g. CH, DE, AT) — **uppercase required** |

  ## Preset IDs

  Pingen lets you pre-configure delivery defaults (product, print mode, address position…) as a **preset** in their web UI. Once created, the preset's UUID appears in the URL or API response.

  - Create presets at `app.pingen.com → Settings → Presets`
  - Paste the UUID into the **Preset ID** field on Upload & Create
  - Per-call parameters still override the preset

  ## Paging, Sorting, Filtering (Get Many, Letter Events)

  All "list" operations expose structured fields:

  | Field | Purpose |
  |---|---|
  | **Page Number** | 1-based page (leave 0 for server default) |
  | **Page Size** | Items per page (max 100) |
  | **Sort** | JSON:API sort expression, e.g. `-created_at,name` (prefix with `-` for descending) |
  | **Additional Filters** | Key/value pairs — each becomes `filter[key]=value` on the URL |

  Under the hood these compose into `?page[number]=2&page[limit]=50&sort=-created_at&filter[status]=sent`. See [Pingen API docs](https://api.pingen.com/documentation) for available filter/sort keys per endpoint.

  ## Error handling

  - Network / 5xx failures on idempotent requests (GET/PUT/DELETE/HEAD) are **retried up to 3 times** with exponential backoff + jitter.
  - POST / PATCH mutations include an **Idempotency-Key** header — retries are safe (Pingen deduplicates server-side).
  - `429 Too Many Requests` always retries and honours `Retry-After`.
  - Errors surface the Pingen message (`errors[].detail`, `errors[].title`, `error.message`, or `message`). Multiple errors are joined with `; `.
  - Enable **Continue On Fail** in the node settings to turn errors into output items instead of halting the workflow.

  ## FAQ

  **Why do I get `[403]` immediately?**
  The node requests the scopes `letter batch organisation_read webhook` at token exchange. If your Pingen plan doesn't grant one of those, Pingen returns 403. Check your plan's API access tier.

  **Staging credentials don't work against production (or vice versa). Why?**
  Pingen issues separate apps per environment. Create one at `identity.pingen.com` for production and another at `identity-staging.pingen.com` for staging — they have different Client IDs/Secrets and are not interchangeable.

  **How do I get a letter's tracking URL / delivery proof?**
  Use the **Letter — Get** operation; the returned `attributes` include tracking info. For delivery-triggered workflows use the **Pingen Trigger** node.

  ## License

  MIT — see [LICENSE](LICENSE).

  ## Contributing

  See [CONTRIBUTING.md](CONTRIBUTING.md) for local development, testing, and release workflow.

  ## About

  This is the **official Pingen package** for n8n, maintained by Pingen GmbH.

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow in real time when Pingen sends a webhook event for postal letter status changes. Each Pingen Trigger node subscribes to one event type and exposes one webhook URL.","capabilities":["Trigger workflows on Issues events for pre-send validation failures","Trigger workflows on Sent events when a letter is handed to the postal carrier","Trigger workflows on Delivered events when a letter reaches the recipient","Trigger workflows on Undeliverable events when delivery fails and the letter is returned","Verify Pingen webhook HMAC signatures when a webhook secret is configured","Support separate Production and Staging Pingen environments"],"authentication":"Pingen OAuth2 client-credentials credentials are required for Production or Staging; webhook events can also use a webhook secret for HMAC signature verification.","commonUseCases":["Notify a Slack or operations channel when a letter is delivered","React immediately to undeliverable or issue events without polling","Trigger follow-up workflows when postal mail is sent, delivered, or rejected","Use staging webhooks for testing without sending real letters or consuming credits"],"limitations":["One Pingen Trigger node handles one event type and one webhook URL","Webhook triggers only receive events emitted after the webhook exists; use Letter Event polling operations to backfill older events","Supported webhook event types are Issues, Sent, Delivered, and Undeliverable"],"relatedNodes":["Pingen","Slack","Stripe Trigger","HTTP Request","Cron"]}


