# nodes

node_type: n8n-nodes-geekflare-api.geekflare
package_name: n8n-nodes-geekflare-api
display_name: Geekflare
description: Web scraping, screenshots, DNS, SEO audits, security checks and more via the Geekflare API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: scorpiock
author_github_url: https://github.com/geekflare/
npm_package_name: n8n-nodes-geekflare-api
npm_version: 0.1.10
community_fetched_at: 2026-07-14T14:40:34.573Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "webscraping",
      "options": [
        {
          "name": "Broken Link Check",
          "value": "brokenlink",
          "description": "Find broken links on a webpage"
        },
        {
          "name": "DNS Record Lookup",
          "value": "dnsrecord",
          "description": "Retrieve DNS records for a domain"
        },
        {
          "name": "DNSSEC Check",
          "value": "dnssec",
          "description": "Verify DNSSEC configuration"
        },
        {
          "name": "HTTP Header Inspect",
          "value": "httpheader",
          "description": "Retrieve HTTP response headers"
        },
        {
          "name": "HTTP Protocol Check",
          "value": "httpprotocol",
          "description": "Detect which HTTP version a server uses"
        },
        {
          "name": "Lighthouse Audit",
          "value": "lighthouse",
          "description": "Run a Google Lighthouse performance audit"
        },
        {
          "name": "Load Time",
          "value": "loadtime",
          "description": "Measure full page load time"
        },
        {
          "name": "Meta Scraping",
          "value": "metascraping",
          "description": "Extract meta tags and Open Graph data"
        },
        {
          "name": "Mixed Content Check",
          "value": "mixedcontent",
          "description": "Detect HTTP resources on HTTPS pages"
        },
        {
          "name": "MTR Trace",
          "value": "mtr",
          "description": "Run an MTR network trace to a host"
        },
        {
          "name": "Open Port Scan",
          "value": "openport",
          "description": "Scan for open ports on a host"
        },
        {
          "name": "Ping",
          "value": "ping",
          "description": "Ping a host and measure latency"
        },
        {
          "name": "Redirect Chain Check",
          "value": "redirectcheck",
          "description": "Trace all redirects for a URL"
        },
        {
          "name": "Screenshot",
          "value": "screenshot",
          "description": "Capture a full screenshot of a webpage"
        },
        {
          "name": "Search",
          "value": "search",
          "description": "Perform a web, news, or image search"
        },
        {
          "name": "Site Up Check",
          "value": "up",
          "description": "Check if a website is online"
        },
        {
          "name": "TLS/SSL Scan",
          "value": "tlsscan",
          "description": "Analyze TLS/SSL certificate and configuration"
        },
        {
          "name": "TTFB Measurement",
          "value": "ttfb",
          "description": "Measure Time to First Byte"
        },
        {
          "name": "URL to PDF",
          "value": "url2pdf",
          "description": "Convert a webpage to a PDF file"
        },
        {
          "name": "Web Scraping",
          "value": "webscraping",
          "description": "Scrape content from any webpage"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Broken Link Check",
      "value": "brokenlink",
      "description": "Find broken links on a webpage"
    },
    {
      "name": "DNS Record Lookup",
      "value": "dnsrecord",
      "description": "Retrieve DNS records for a domain"
    },
    {
      "name": "DNSSEC Check",
      "value": "dnssec",
      "description": "Verify DNSSEC configuration"
    },
    {
      "name": "HTTP Header Inspect",
      "value": "httpheader",
      "description": "Retrieve HTTP response headers"
    },
    {
      "name": "HTTP Protocol Check",
      "value": "httpprotocol",
      "description": "Detect which HTTP version a server uses"
    },
    {
      "name": "Lighthouse Audit",
      "value": "lighthouse",
      "description": "Run a Google Lighthouse performance audit"
    },
    {
      "name": "Load Time",
      "value": "loadtime",
      "description": "Measure full page load time"
    },
    {
      "name": "Meta Scraping",
      "value": "metascraping",
      "description": "Extract meta tags and Open Graph data"
    },
    {
      "name": "Mixed Content Check",
      "value": "mixedcontent",
      "description": "Detect HTTP resources on HTTPS pages"
    },
    {
      "name": "MTR Trace",
      "value": "mtr",
      "description": "Run an MTR network trace to a host"
    },
    {
      "name": "Open Port Scan",
      "value": "openport",
      "description": "Scan for open ports on a host"
    },
    {
      "name": "Ping",
      "value": "ping",
      "description": "Ping a host and measure latency"
    },
    {
      "name": "Redirect Chain Check",
      "value": "redirectcheck",
      "description": "Trace all redirects for a URL"
    },
    {
      "name": "Screenshot",
      "value": "screenshot",
      "description": "Capture a full screenshot of a webpage"
    },
    {
      "name": "Search",
      "value": "search",
      "description": "Perform a web, news, or image search"
    },
    {
      "name": "Site Up Check",
      "value": "up",
      "description": "Check if a website is online"
    },
    {
      "name": "TLS/SSL Scan",
      "value": "tlsscan",
      "description": "Analyze TLS/SSL certificate and configuration"
    },
    {
      "name": "TTFB Measurement",
      "value": "ttfb",
      "description": "Measure Time to First Byte"
    },
    {
      "name": "URL to PDF",
      "value": "url2pdf",
      "description": "Convert a webpage to a PDF file"
    },
    {
      "name": "Web Scraping",
      "value": "webscraping",
      "description": "Scrape content from any webpage"
    }
  ]

npm_readme:
  # n8n-nodes-geekflare-api

  Official n8n community node for the [Geekflare API](https://geekflare.com/api/). Use Geekflare's web intelligence tools directly inside your n8n workflows no code required.

  ## What you can do

  - **Scrape** any webpage and get back clean HTML, Markdown, JSON, or LLM-ready text
  - **Capture screenshots** with full-page, Retina, and CAPTCHA-bypass support
  - **Search the web** with structured results and optional AI-grounded answers
  - **Convert URLs to PDF** with full layout control
  - **Run DNS, TLS, HTTP, and port diagnostics** on any domain
  - **Audit performance** with Lighthouse, TTFB, and load time checks
  - **Monitor uptime**, redirect chains, broken links, and mixed content

  ## Installation

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

  ```
  n8n-nodes-geekflare-api
  ```

  ## Get an API Key
   
  Sign up at [geekflare.com/api](https://geekflare.com/api) and copy your API key from the dashboard.

  ## Credentials Setup

  After installing the node:

  1. Open any workflow and add a **Geekflare** node
  2. Click **Create new credential** in the node panel
  3. Paste your API key and save

  ## Operations

  ### Web Scraping

  Scrape full page content from any URL. Returns HTML, Markdown, JSON, or LLM-optimised text.

  | Parameter      | Type                  | Default        | Description                                                                                          |
  | -------------- | --------------------- | -------------- | ---------------------------------------------------------------------------------------------------- |
  | `url` \*       | string                | —              | Target URL                                                                                           |
  | `formats`      | array                 | `["markdown"]` | Output formats (up to 3): `html`, `markdown`, `json`, `markdown-llm`, `html-llm`, `text`, `text-llm` |
  | `device`       | `desktop` \| `mobile` | `desktop`      | Device to emulate                                                                                    |
  | `proxyCountry` | string                | —              | Route through a country ISO code (e.g. `us`)                                                         |
  | `renderJS`     | boolean               | `true`         | Execute JavaScript before extracting. Disable for faster static scrapes                              |
  | `fileOutput`   | boolean               | `false`        | Return a download URL instead of inline content                                                      |
  | `blockAds`     | boolean               | `true`         | Block ads during scrape                                                                              |
  | `stealth`      | boolean               | `false`        | Bypass CAPTCHAs (slower)                                                                             |

  ---

  ### Meta Scraping

  Scrape meta tags — title, description, Open Graph, Twitter cards, and more.

  | Parameter      | Type                  | Default   | Description      |
  | -------------- | --------------------- | --------- | ---------------- |
  | `url` \*       | string                | —         | Target URL       |
  | `format`       | `json` \| `markdown`  | `json`    | Output format    |
  | `device`       | `desktop` \| `mobile` | `desktop` |                  |
  | `proxyCountry` | string                | —         | Country ISO code |
  | `renderJS`     | boolean               | `true`    |                  |
  | `fileOutput`   | boolean               | `false`   |                  |
  | `blockAds`     | boolean               | `true`    |                  |

  ---

  ### Screenshot

  Capture a screenshot of any website. Supports full-page, Retina, and AI-friendly link highlighting.

  | Parameter        | Type                      | Default   | Description                                                    |
  | ---------------- | ------------------------- | --------- | -------------------------------------------------------------- |
  | `url` \*         | string                    | —         | Target URL                                                     |
  | `device`         | `desktop` \| `mobile`     | `desktop` |                                                                |
  | `type`           | `png` \| `jpeg` \| `webp` | `png`     |                                                                |
  | `proxyCountry`   | string                    | —         | Country ISO code                                               |
  | `fullPage`       | boolean                   | `false`   |                                                                |
  | `blockAds`       | boolean                   | `true`    |                                                                |
  | `hideCookie`     | boolean                   | `true`    | Remove cookie banners                                          |
  | `skipCaptcha`    | boolean                   | `true`    | Bypass Cloudflare / reCAPTCHA                                  |
  | `addTimestamp`   | boolean                   | `false`   |                                                                |
  | `highlightLinks` | boolean                   | `false`   | Draw borders around links/buttons — great for AI vision models |
  | `pageHeight`     | number                    | —         | Custom page height (px)                                        |
  | `viewportWidth`  | number                    | —         | Viewport width (px, default 1366)                              |
  | `viewportHeight` | number                    | —         | Viewport height (px, default 768)                              |
  | `delay`          | number                    | —         | Seconds to wait after page load                                |
  | `quality`        | number                    | `90`      | Image quality 1–100                                            |
  | `scaleFactor`    | number                    | —         | Device pixel ratio (use 2–3 for Retina)                        |

  ---

  ### Search

  Search the web and return clean, structured results. Supports web, news, and image search with optional AI-grounded answers.

  | Parameter        | Type                              | Default | Description                                        |
  | ---------------- | --------------------------------- | ------- | -------------------------------------------------- |
  | `query` \*       | string                            | —       | Search query                                       |
  | `limit`          | number                            | `10`    | Number of results                                  |
  | `time`           | string                            | —       | Time filter: `any`, `d`, `w`, `m`, `y`, `d7`, `h6` |
  | `location`       | string                            | —       | Country ISO code to localise results               |
  | `source`         | `web` \| `news` \| `images`       | `web`   |                                                    |
  | `category`       | `general` \| `code` \| `research` | —       |                                                    |
  | `format`         | `json` \| `markdown` \| `html`    | `json`  |                                                    |
  | `includeDomains` | string                            | —       | Comma-separated domains to include                 |
  | `excludeDomains` | string                            | —       | Comma-separated domains to exclude                 |
  | `groundedAnswer` | boolean                           | `false` | Generate an AI answer synthesised from results     |
  | `scrape`         | boolean                           | `false` | Also scrape top result pages                       |
  | `scrapeLimit`    | number                            | —       | How many pages to scrape (requires `scrape: true`) |

  ---

  ### URL to PDF

  Convert any URL to a downloadable PDF.

  | Parameter      | Type                                           | Default    | Description                       |
  | -------------- | ---------------------------------------------- | ---------- | --------------------------------- |
  | `url` \*       | string                                         | —          | Target URL                        |
  | `device`       | `desktop` \| `mobile`                          | `desktop`  |                                   |
  | `format`       | `a4` `a3` `a5` `a6` `letter` `legal` `a0`–`a2` | `a4`       | Paper size                        |
  | `orientation`  | `portrait` \| `landscape`                      | `portrait` |                                   |
  | `proxyCountry` | string                                         | —          | Country ISO code                  |
  | `scale`        | number                                         | —          | Zoom level (e.g. `0.8` to shrink) |
  | `marginTop`    | number                                         | `25`       | Top margin (mm)                   |
  | `marginBottom` | number                                         | `25`       | Bottom margin (mm)                |
  | `marginLeft`   | number                                         | `25`       | Left margin (mm)                  |
  | `marginRight`  | number                                         | `25`       | Right margin (mm)                 |
  | `hideCookie`   | boolean                                        | `true`     | Remove cookie banners             |
  | `skipCaptcha`  | boolean                                        | `true`     | Bypass anti-bot challenges        |
  | `addTimestamp` | boolean                                        | `false`    |                                   |

  ---

  ### DNS Record Lookup

  Look up DNS records for a domain.

  | Parameter | Type                                                          | Default                              |
  | --------- | ------------------------------------------------------------- | ------------------------------------ |
  | `url` \*  | string                                                        | —                                    |
  | `types`   | array of `A` `AAAA` `CNAME` `MX` `NS` `SOA` `TXT` `CAA` `SRV` | `["A", "AAAA", "CNAME", "MX", "NS"]` |

  ---

  ### Site Up Check

  Check if a site is up or down.

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `proxyCountry`   | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### Redirect Chain Check

  Trace the full redirect chain of a URL.

  | Parameter      | Type   |
  | -------------- | ------ |
  | `url` \*       | string |
  | `proxyCountry` | string |

  ---

  ### Broken Link Check

  Find all broken links on a webpage.

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `proxyCountry`   | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### Open Port Scan

  Scan open ports on a host.

  | Parameter    | Type                           | Description                           |
  | ------------ | ------------------------------ | ------------------------------------- |
  | `url` \*     | string                         | Target URL or hostname                |
  | `topPorts`   | `50` `100` `500` `1000` `5000` | Scan top N common ports               |
  | `portRanges` | string                         | Custom ranges e.g. `80,443,1000-1010` |

  ---

  ### TLS/SSL Scan

  Inspect TLS/SSL configuration — protocols, ciphers, certificate details.

  | Parameter | Type   |
  | --------- | ------ |
  | `url` \*  | string |

  ---

  ### Lighthouse Audit

  Run a full Lighthouse audit — performance, SEO, accessibility, and best practices.

  | Parameter        | Type                  | Default   | Description                                               |
  | ---------------- | --------------------- | --------- | --------------------------------------------------------- |
  | `url` \*         | string                | —         |                                                           |
  | `device`         | `desktop` \| `mobile` | `desktop` |                                                           |
  | `proxyCountry`   | string                | —         | Country ISO code                                          |
  | `followRedirect` | boolean               | `false`   |                                                           |
  | `parameters`     | string                | —         | Extra Lighthouse CLI flags (e.g. `--only-categories=seo`) |

  ---

  ### Load Time

  Measure full page load time from any location.

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `proxyCountry`   | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### TTFB Measurement

  Measure Time To First Byte (TTFB).

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### HTTP Header Inspect

  Retrieve HTTP response headers for a URL.

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `proxyCountry`   | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### HTTP Protocol Check

  Check which HTTP protocol versions (HTTP/1.1, HTTP/2, HTTP/3) a server supports.

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### Mixed Content Check

  Detect mixed content issues (HTTP resources on HTTPS pages).

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `proxyCountry`   | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### DNSSEC Check

  Check if DNSSEC is enabled and properly configured for a domain.

  | Parameter | Type   |
  | --------- | ------ |
  | `url` \*  | string |

  ---

  ### MTR Trace

  Run an MTR (My Traceroute) network diagnostic test.

  | Parameter        | Type    | Default |
  | ---------------- | ------- | ------- |
  | `url` \*         | string  | —       |
  | `proxyCountry`   | string  | —       |
  | `followRedirect` | boolean | `false` |

  ---

  ### Ping

  Ping a host and return latency.

  | Parameter | Type   |
  | --------- | ------ |
  | `url` \*  | string |

  ---

  ## Links

  - [Geekflare API](https://geekflare.com/api/)
  - [API Documentation](https://docs.geekflare.com/api/intro)
  - [Dashboard](https://dash.geekflare.com/)
  - [Report Issues](https://geekflare.com/contact/?product=api&topic=bug)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"The Geekflare node provides access to Geekflare's web intelligence API inside n8n workflows. It supports scraping, screenshots, search, PDF conversion, diagnostics, and performance/security monitoring without code.","capabilities":["Scrape webpages into HTML, Markdown, JSON, or LLM-ready text","Scrape meta tags including title, description, Open Graph, and Twitter card data","Capture website screenshots with full-page, Retina, and CAPTCHA-bypass options","Search the web with structured results and optional AI-grounded answers","Convert URLs to PDF with layout control","Run DNS, TLS, HTTP, and port diagnostics","Audit performance with Lighthouse, TTFB, and load time checks","Monitor uptime, redirect chains, broken links, and mixed content"],"authentication":"API key required","commonUseCases":["Extract website content for downstream processing or AI analysis","Generate screenshots or PDFs of webpages for reporting and archival","Perform website health, security, and performance checks","Gather structured search results for enrichment or automation"],"limitations":["Scrape output formats are limited to up to 3 formats per request","Some features may be slower when using stealth/CAPTCHA-bypass options","The README excerpt is truncated, so not all operations and parameters may be listed"],"relatedNodes":[]}


node_type: @divyanshu007/n8n-nodes-ratelimiter.rateLimiter
package_name: @divyanshu007/n8n-nodes-ratelimiter
display_name: Rate Limiter
description: Throttle item flow to prevent hitting API rate limits (429 errors)
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: divyanshu007
author_github_url: https://github.com/guptadivyanshu765/n8n-nodes-ratelimiter.git
npm_package_name: @divyanshu007/n8n-nodes-ratelimiter
npm_version: 0.1.5
community_fetched_at: 2026-07-14T14:40:34.575Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-ratelimiter

  A utility node that sits between any two nodes in an n8n workflow and throttles the flow of items to prevent hitting API rate limits. Drop it in anywhere you're getting 429 errors — no credentials or external APIs required.

  ## Installation

  In n8n: **Settings → Community Nodes → Install** → enter `n8n-nodes-ratelimiter`

  ## Why you need it

  Most APIs enforce rate limits — for example, OpenAI allows 60 requests per minute on the free tier. When n8n processes a list of 200 items, it fires all 200 requests almost instantly, which triggers a flood of `429 Too Many Requests` errors and failed executions. The Rate Limiter node solves this by inserting a calculated pause between batches of items, spreading the load over time so you stay under the limit.

  ## Modes

  | Mode | Parameter | Example | Delay Inserted |
  |------|-----------|---------|----------------|
  | **Fixed Delay** | Delay (ms) | `500` | 500ms between every item |
  | **Requests Per Second** | Max RPS | `5` | 200ms between items |
  | **Requests Per Minute** | Max RPM | `60` | 1000ms between items |

  **Batch Size** lets you process multiple items before each pause. If an API allows bursts of 10, set Batch Size to `10` — the delay fires after every 10 items instead of every 1.

  **Add Metadata** appends a `_rateLimiter` field to each item's JSON for debugging:
  ```json
  {
    "_rateLimiter": {
      "itemIndex": 3,
      "batchNumber": 2,
      "delayApplied": 1000,
      "mode": "requestsPerMinute",
      "processedAt": "2024-01-15T10:30:00.000Z"
    }
  }
  ```

  ## Example Workflow

  ```
  OpenAI Batch Processor → Rate Limiter (60 req/min) → HTTP Request → Google Sheets
  ```

  Configure the Rate Limiter with:
  - Mode: `Requests Per Minute`
  - Max Requests Per Minute: `60`
  - Batch Size: `1`

  This ensures you never exceed 60 API calls per minute, eliminating 429 errors entirely.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A utility node that throttles item flow between n8n nodes to prevent hitting API rate limits and causing 429 errors. It inserts calculated delays between items or batches so workflows stay within API quotas.","capabilities":["Fixed delay throttling between items","Throttle by requests per second","Throttle by requests per minute","Batch processing with configurable batch size","Optional debug metadata added to each item via _rateLimiter"],"authentication":"None required; no credentials or external API access needed","commonUseCases":["Preventing 429 Too Many Requests errors in API-heavy workflows","Rate-limiting bulk item processing before HTTP/API request nodes","Spreading requests over time to comply with service quotas such as OpenAI limits"],"limitations":["Only delays item flow; it does not make API calls or manage external service credentials","Designed as an intermediate utility node between other nodes rather than a standalone integration"],"relatedNodes":["HTTP Request","OpenAI"]}


node_type: @nodrel-dev/n8n-nodes-ups.ups
package_name: @nodrel-dev/n8n-nodes-ups
display_name: UPS
description: Track shipments, validate addresses, rate, and create UPS shipments
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: noctissella
author_github_url: https://github.com/nodrel-dev/n8n-ups-node.git
npm_package_name: @nodrel-dev/n8n-nodes-ups
npm_version: 0.7.0
community_fetched_at: 2026-07-14T14:40:34.576Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "tracking",
      "options": [
        {
          "name": "Address",
          "value": "address"
        },
        {
          "name": "Shipping",
          "value": "shipping"
        },
        {
          "name": "Tracking",
          "value": "tracking"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "track",
      "options": [
        {
          "name": "Track",
          "value": "track",
          "action": "Track a shipment",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/track/v1/details/{{$parameter.trackingNumber}}",
              "method": "GET",
              "headers": {
                "transId": "={{ 'n8n-' + $now.toMillis() }}",
                "transactionSrc": "n8n-nodes-ups"
              },
              "ignoreHttpStatusErrors": true
            }
          },
          "description": "Get current status and scan history for a tracking number"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tracking"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "validate",
      "options": [
        {
          "name": "Validate",
          "value": "validate",
          "action": "Validate an address",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/addressvalidation/v2/3",
              "method": "POST",
              "ignoreHttpStatusErrors": true
            }
          },
          "description": "Validate and classify an address (residential/commercial)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "address"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getRates",
      "options": [
        {
          "name": "Get Rates",
          "value": "getRates",
          "action": "Get rate quotes",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/rating/v2409/Shoptimeintransit",
              "method": "POST",
              "ignoreHttpStatusErrors": true
            }
          },
          "description": "Get service options with published and negotiated rates plus transit times"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a shipment and get a label",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/shipments/v2409/ship",
              "method": "POST",
              "ignoreHttpStatusErrors": true
            }
          },
          "description": "Create a shipment and return the tracking number plus a label (and customs invoice for international)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "shipping"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Track",
      "value": "track",
      "action": "Track a shipment",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/track/v1/details/{{$parameter.trackingNumber}}",
          "method": "GET",
          "headers": {
            "transId": "={{ 'n8n-' + $now.toMillis() }}",
            "transactionSrc": "n8n-nodes-ups"
          },
          "ignoreHttpStatusErrors": true
        }
      },
      "description": "Get current status and scan history for a tracking number",
      "resource": "tracking"
    },
    {
      "name": "Validate",
      "value": "validate",
      "action": "Validate an address",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/addressvalidation/v2/3",
          "method": "POST",
          "ignoreHttpStatusErrors": true
        }
      },
      "description": "Validate and classify an address (residential/commercial)",
      "resource": "address"
    },
    {
      "name": "Get Rates",
      "value": "getRates",
      "action": "Get rate quotes",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/rating/v2409/Shoptimeintransit",
          "method": "POST",
          "ignoreHttpStatusErrors": true
        }
      },
      "description": "Get service options with published and negotiated rates plus transit times",
      "resource": "shipping"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a shipment and get a label",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/shipments/v2409/ship",
          "method": "POST",
          "ignoreHttpStatusErrors": true
        }
      },
      "description": "Create a shipment and return the tracking number plus a label (and customs invoice for international)",
      "resource": "shipping"
    }
  ]

npm_readme:
  <div align="center">

  # 📦 n8n-ups-node

  **Use the UPS REST API directly in your n8n workflows.**

  Track shipments · validate addresses · quote rates · create labels (with international customs forms) — against _your own_ UPS account, with no aggregator in the middle.

  [![npm version](https://img.shields.io/npm/v/@nodrel-dev/n8n-nodes-ups?logo=npm&color=cb3837)](https://www.npmjs.com/package/@nodrel-dev/n8n-nodes-ups)
  [![npm downloads](https://img.shields.io/npm/dm/@nodrel-dev/n8n-nodes-ups)](https://www.npmjs.com/package/@nodrel-dev/n8n-nodes-ups)
  [![CI](https://github.com/nodrel-dev/n8n-ups-node/actions/workflows/ci.yml/badge.svg)](https://github.com/nodrel-dev/n8n-ups-node/actions/workflows/ci.yml)
  [![license: MIT](https://img.shields.io/npm/l/@nodrel-dev/n8n-nodes-ups)](https://www.npmjs.com/package/@nodrel-dev/n8n-nodes-ups)
  [![published with provenance](https://img.shields.io/badge/published%20with-provenance-3b82f6?logo=npm)](https://www.npmjs.com/package/@nodrel-dev/n8n-nodes-ups#provenance)

  [Installation](#installation) · [Operations](#operations) · [Credentials](#credentials) · [Shipper Profiles](#shipper-profiles) · [Usage](#usage) · [npm](https://www.npmjs.com/package/@nodrel-dev/n8n-nodes-ups) · [UPS Developer Portal](https://developer.ups.com/) · [Report an issue](https://github.com/nodrel-dev/n8n-ups-node/issues)

  </div>

  ## What is this?

  This is an [n8n](https://n8n.io/) community node for the **UPS REST API**. It lets your workflows track shipments, validate addresses, quote rates, and create shipping labels — talking straight to UPS with your own API credentials.

  Because there's no aggregator in the middle, you get **your own negotiated rates** and UPS bills your account directly. [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/sustainable-use-license/) workflow automation platform.

  ### Highlights

  - 🚚 **Direct to UPS** — your API keys, your negotiated rates, your account billed. No aggregator markup or middleman.
  - 🏷️ **Labels as real binary** — Create returns a print-ready GIF / ZPL / EPL / SPL label as n8n binary data, not a base64 blob buried in JSON.
  - 🌍 **International built in** — cross-border Create assembles the UPS commercial-invoice customs forms and returns the UPS-generated invoice as a PDF binary alongside the label.
  - 🔑 **One credential, all four APIs** — a single UPS OAuth app entitles Track, Address Validation, Rating, and Ship, so there is exactly one credential to set up.
  - 🔀 **One sandbox / production switch** — a single credential field repoints every API request and the OAuth token URL together, so a call can never straddle environments.
  - 🔐 **Native OAuth2, no token code** — n8n performs the client-credentials exchange and refreshes the token for you.
  - 📦 **Zero runtime dependencies** — ships only `dist/`, published to npm with signed [provenance](https://docs.npmjs.com/generating-provenance-statements).

  ## Who it's for

  - **E-commerce & retail** — print labels at fulfillment, surface tracking to customers, and rate-shop services per order.
  - **3PLs & fulfillment ops** — automate shipping for many accounts and wire labels into existing pick-and-pack flows.
  - **Cross-border sellers** — generate the commercial invoice and customs forms UPS needs for international shipments, automatically.
  - **Finance & operations teams** — quote live negotiated rates inside approval and reconciliation workflows.
  - **Developers & integrators** — embed UPS tracking, address validation, rates, and labels into any n8n automation without hand-rolling OAuth.

  ## How it works

  The node sits between your workflow and UPS. A single **UPS OAuth2** credential holds your Client ID/Secret and the sandbox-or-production switch; n8n handles the token exchange, and every request is routed to the matching UPS host.

  ```mermaid
  flowchart LR
      subgraph wf["n8n workflow"]
          prev["Upstream node"] --> ups["UPS node"]
          ups --> down["Downstream node<br/>(Write Binary File,<br/>Send Email, …)"]
      end

      cred["UPS OAuth2 credential<br/>Client ID + Secret<br/>Sandbox (CIE) / Production"]
      cred -. "n8n exchanges and refreshes token" .-> ups

      ups -->|"HTTPS + bearer token"| api["UPS REST API<br/>(your account and rates)"]
  ```

  ### A typical workflow

  A common fulfillment pipeline wires the four operations together — clean the address, shop for a rate, buy the label, then hand the label binary to wherever it needs to go. Each step is a normal n8n node, so you can branch, filter, or store results at any point.

  ```mermaid
  flowchart LR
      trigger["Order trigger<br/>(Webhook / Sheets / DB)"] --> validate["UPS · Validate Address"]
      validate --> rates["UPS · Get Rates"]
      rates --> pick["Pick service<br/>(cheapest / fastest)"]
      pick --> create["UPS · Create Shipment"]
      create -->|"label binary"| save["Write Binary File<br/>/ Send Email"]
      create -->|"tracking number"| notify["Notify customer<br/>/ update order"]
      notify -.->|"later"| track["UPS · Track"]
  ```

  ## Installation

  Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation. In n8n, go to **Settings → Community Nodes → Install** and enter `@nodrel-dev/n8n-nodes-ups`.

  ## Operations

  The node exposes three resources — **Tracking**, **Address**, and **Shipping** — across four operations:

  | Resource | Operation | UPS endpoint | Returns |
  | --- | --- | --- | --- |
  | 📍 Tracking | **Track** | `GET /track/v1/details/{number}` | Current status + scan history, one inquiry number per item |
  | 🏠 Address | **Validate** | `POST /addressvalidation/v2/3` | Standardized `candidates[]`, `resolution`, residential/commercial `classification` |
  | 📦 Shipping | **Get Rates** | `POST /rating/v2409/Shoptimeintransit` | One item per eligible service — published + negotiated price, transit days, alerts |
  | 📦 Shipping | **Create** | `POST /shipments/v2409/ship` | Tracking number + charges, plus the label as binary (and the customs invoice PDF for international) |

  ```mermaid
  flowchart TD
      node["UPS node"]
      node --> tracking["📍 Tracking"]
      node --> address["🏠 Address"]
      node --> shipping["📦 Shipping"]

      tracking --> track["Track<br/>GET /track/v1/details/{number}"]
      address --> validate["Validate<br/>POST /addressvalidation/v2/3"]
      shipping --> rates["Get Rates<br/>POST /rating/v2409/Shoptimeintransit"]
      shipping --> create["Create<br/>POST /shipments/v2409/ship"]
  ```

  ### Tracking → Track

  Get the current status and scan history for one UPS inquiry number per item (`GET /track/v1/details/{number}`).

  - **Tracking Number** (required) — one inquiry number per input item.
  - **Detail** — _Detailed_ (status + scan history) or _Status Only_ (current status only).
  - **Locale** — e.g. `en_US`.

  Unknown numbers are flagged on their own item; with **Continue On Fail** the rest still process.

  ### Address → Validate

  Standardize an address and classify it residential vs commercial (`POST /addressvalidation/v2/3`).

  - Address line(s), city, state/province, postal code, country.
  - Returns one item with `resolution` (`valid` / `ambiguous` / `none`), a `classification` (UnClassified / Commercial / Residential), and standardized `candidates[]`.

  ### Shipping → Get Rates

  Quote published and negotiated rates with transit times for every eligible service (`POST /rating/v2409/Shoptimeintransit`).

  - **Account Number** (required) — your ShipperNumber; also requests negotiated rates. May instead be supplied by a [Shipper Profile](#shipper-profiles) credential.
  - Shipper / Ship To (and optional Ship From) addresses, package weight (+ unit) and optional dimensions (+ unit). The Shipper block can be filled from a [Shipper Profile](#shipper-profiles).
  - **Customs Value** — required when origin and destination countries differ (international).
  - Emits **one output item per service**, each with published + negotiated price, transit days, and any UPS alerts. If no negotiated rates are returned, a request-level alert is attached to the first item.

  ### Shipping → Create

  Buy a shipment and get a printable label plus tracking number (`POST /shipments/v2409/ship`).

  - **Account Number** (required; or supplied by a [Shipper Profile](#shipper-profiles)), **Service** (dropdown of UPS service codes; Ground/`03` default), Shipper / Ship To (and optional Ship From), package weight/dimensions, **Label Format** (GIF default; ZPL / EPL / SPL — no PDF label). The Shipper block can be filled from a [Shipper Profile](#shipper-profiles).
  - **International** (origin ≠ destination country) additionally requires the **Customs** fields (a collapsible group: reason for export, currency, terms of shipment, invoice number/date), the **Sold To** party, and at least one **Commodities** line.
  - Returns the tracking number and account/published charges, plus the **label** as a binary attachment (`label`); international shipments also return the **commercial invoice** PDF (`customsInvoice`). Label/invoice image data is never embedded as a string in the JSON output.

  Billing is to the shipper (transportation charges); international duties are billed to the receiver (DDU) in this version.

  ## Credentials

  You authenticate with a UPS **Client ID** and **Client Secret** using OAuth2 client-credentials. n8n performs the token exchange and refreshes the token automatically — you never handle tokens yourself.

  ### Prerequisites

  1. Create an application on the [UPS Developer Portal](https://developer.ups.com/).
  2. Note its **Client ID** and **Client Secret**. A single UPS OAuth app entitles all four APIs used here (Track, Address Validation, Rating, Ship), so one credential covers every operation.
  3. For Get Rates and Create you also need your UPS **account number** (ShipperNumber).

  ### Credential types

  The node authenticates with a single credential, **UPS OAuth2 API**, for all four operations. An optional, non-auth **UPS Shipper Profile API** credential can also be attached to supply reusable Shipper data (see [Shipper Profiles](#shipper-profiles)).

  | Credential type | Required | Used by |
  | --------------- | -------- | ------- |
  | `upsOAuth2Api`  | Yes | Track, Validate, Get Rates, Create (authenticates every request) |
  | `upsShipperProfileApi` | No | Get Rates, Create (fills the Shipper block; never authenticates) |

  ### Set up a credential in n8n

  1. Add a new **UPS OAuth2 API** credential.
  2. Set **Environment** to **Sandbox (CIE)** while developing, or **Production** for real shipments. This single switch points both the OAuth token URL and every API request at the matching UPS host, so a request can never straddle sandbox and production.
  3. Enter your **Client ID** and **Client Secret**.
  4. Save — n8n runs the credential test (an authenticated Track probe) and shows a green confirmation when the keys are valid. A `401/403` means the Client ID, Secret, or Environment is wrong.

  Grant type is OAuth2 **client credentials** (HTTP Basic, empty scope) — configured automatically; nothing to set by hand. Secrets live only in n8n's encrypted credential store; never hardcode them.

  > **Sandbox vs production:** credentials default to **Sandbox (CIE)** on purpose, so a half-configured connection can't hit a live account. Switch to **Production** only when you are ready to create real, billable shipments.

  ### Sandbox vs production hosts

  |  | Sandbox (CIE) | Production |
  | --- | --- | --- |
  | Token URL | `https://wwwcie.ups.com/security/v1/oauth/token` | `https://onlinetools.ups.com/security/v1/oauth/token` |
  | API base | `https://wwwcie.ups.com/api` | `https://onlinetools.ups.com/api` |

  The Customer Integration Environment (CIE) is limited test data — for example, address validation returns street-level results for **US NY/CA** addresses only, and Track returns a canned `DELIVERED` response for any well-formed `1Z` number.

  ### Shipper Profiles

  Re-entering the same Shipper block on every Get Rates and Create call is the biggest source of form friction — and getting the Shipper country wrong for the account makes UPS reject the call (`111617` Rate / `120120` Ship). An **optional** second credential, **UPS Shipper Profile API**, stores reusable Shipper data so you can swap the whole block (including the account number) by selecting a profile — handy when you ship from more than one registered account (e.g. a Canada-registered and a US account).

  - **What it holds:** Account Number (ShipperNumber), Shipper Name, Address (lines, city, state/province, postal, country), and Phone. It carries **no secret** and never authenticates a request — `UPS OAuth2 API` is still the only credential that talks to UPS. Keeping the account number here also keeps it out of the workflow JSON.
  - **How to use it:** create a **UPS Shipper Profile API** credential, fill the Shipper fields, then attach it to the UPS node (alongside the OAuth credential). Its **Test** button runs an offline check that the profile is internally usable.
  - **Precedence (per field):** an explicit value typed on the node **always wins**; a field left **blank** inherits from the profile; if neither supplies it, the built-in default applies (Shipper country falls back to `US`). So you can use a profile for most fields and still override one in place.
  - **Caveat:** profile values fill **at run time**, not in the editor — the fields stay blank in the form and are merged when the workflow executes. (Stock n8n has no way for a community node to write sibling editor fields; see [ADR-0005](docs/adr/0005-optional-shipper-profile-credential.md).)

  ## Compatibility

  - Requires n8n with `n8nNodesApiVersion: 1`.
  - Built and tested against the UPS REST API (Track v1, Address Validation v2, Rating v2409, Ship v2409).
  - The account number is never defaulted or hardcoded — it comes from the node field or an optional [Shipper Profile](#shipper-profiles) credential, and your API keys live only in the credential.

  ## Security & dependencies

  The published package ships only `dist/` with **zero runtime dependencies** (`n8n-workflow` is a peer, provided by your n8n instance). Any audit findings are confined to the build, test, and release tooling or the host-provided peer — none of them reach an installed node.

  Every release is published to npm with a signed **[provenance](https://docs.npmjs.com/generating-provenance-statements) attestation** through GitHub Actions [OIDC trusted publishing](https://docs.npmjs.com/trusted-publishers): no long-lived npm token is stored in the repo, and anyone can cryptographically verify that a given version was built by this workflow from this exact commit (see the **Provenance** panel on the [npm page](https://www.npmjs.com/package/@nodrel-dev/n8n-nodes-ups#provenance)).

  The package is also scanned with `npx @n8n/scan-community-package @nodrel-dev/n8n-nodes-ups` as part of the release process.

  ## AI-Agent tool usage

  The node sets `usableAsTool: true`, so every operation is callable from the AI-Agent **tool** path as well as the normal node path. An AI Agent can call any operation directly (for example "track 1Z…", or "rate this shipment"). Test new workflows through both the normal node path and the tool path.

  ## Usage

  ### Get Rates and Create

  Both operations share the same **Shipper**, **Ship From**, and **Ship To** address fields, so values carry over when you switch between them. Package dimensions (length/width/height) are optional and only sent to UPS when provided. Ship From defaults to the Shipper address and stays hidden until you turn on **Use a Different Ship-From Address** — switch it on only to override the physical origin (e.g. a warehouse or 3PL that differs from your account address); any field you leave blank still falls back to the matching Shipper value.

  ### The label binary (Create)

  Create returns the label as proper n8n **binary data** on the output property named `label` — not a base64 string buried in JSON. Under the hood, the node requests an inline base64 label, decodes it, and attaches it as binary so downstream nodes can print or save it directly. International shipments additionally return the UPS commercial invoice as a PDF binary on the property `customsInvoice`:

  ```mermaid
  sequenceDiagram
      participant WF as n8n workflow
      participant Node as UPS node
      participant Auth as OAuth2 (n8n-managed)
      participant API as UPS Ship API

      WF->>Node: Execute "Create"
      Node->>Auth: Need access token
      Auth-->>Node: Cached / refreshed token
      Node->>Node: createPreSend assembles ShipmentRequest<br/>(+ InternationalForms if cross-border)
      Node->>API: POST /shipments/v2409/ship (bearer token)
      API-->>Node: JSON + base64 label (+ base64 invoice)
      Node->>Node: createPostReceive decodes base64 →<br/>attach binary "label" (+ "customsInvoice"),<br/>surface charges
      Node-->>WF: JSON (tracking #, charges)<br/>+ binary label (+ invoice)
  ```

  Choose the format with **Label Format**:

  | Label Format | MIME type | Typical use |
  | --- | --- | --- |
  | GIF | `image/gif` | Default; preview / office printers |
  | ZPL | `text/plain` | Zebra thermal printers (4×6 stock) |
  | EPL | `text/plain` | Eltron thermal printers (4×6 stock) |
  | SPL | `text/plain` | SATO thermal printers (4×6 stock) |

  The tracking number and charge details are passed through on the main JSON output. Wire the `label` (and `customsInvoice`) binary into **Write Binary File**, **Send Email** (as an attachment), or any node that consumes binary data.

  ### Errors and Continue On Fail

  UPS error codes and messages are surfaced verbatim through n8n's error handling — classified as authentication, input, or transient — and the node honors **Continue On Fail**: failed items emit an `error` entry and the workflow keeps processing the rest. Non-fatal UPS alerts (for example "no negotiated rates returned") are surfaced as warnings without failing the item.

  ## Documentation

  Deeper docs for contributors and integrators live in [`docs/`](docs/):

  - [System Overview](docs/system-overview.md) — architecture, auth/environment model, request lifecycle (with diagrams).
  - [Integration Specification](docs/integration-spec.md) — endpoints, request/response shapes, enums, and error handling for all four operations.
  - [Data Model](docs/data-model.md) — the typed shapes the node assembles, and the node-parameter → UPS-field mapping.
  - [Architecture Decision Records](docs/adr/) — why the key design choices were made.
  - [n8n Community Node Gotchas](docs/n8n-gotchas.md) — hard-won build/release/verify traps.

  ## Development

  ```bash
  npm install      # install dev dependencies
  npm test         # run the pure-core unit tests (vitest)
  npm run lint     # n8n community-node lint (strict)
  npm run build    # compile to dist/
  npm run dev      # run locally inside n8n (Node.js >= 22.22)
  ```

  Releases are driven by [release-please](https://github.com/googleapis/release-please): merge the auto-generated release PR on `main` and the workflow tags, publishes to npm with provenance, and scans. Never run a release or `npm publish` locally.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [UPS Developer Portal](https://developer.ups.com/)
  - [UPS API catalog](https://developer.ups.com/api/reference)

  ## Version history

  See [CHANGELOG.md](CHANGELOG.md) for the full, per-release history (kept current automatically on each release).

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"An n8n community node for interacting directly with the UPS REST API. It supports shipment tracking, address validation, rate quoting, and creating shipments/labels using the user's own UPS account.","capabilities":["Track shipments","Validate addresses","Get shipping rates/quotes","Create shipments and labels","Return labels as binary data","Generate international customs forms and UPS commercial invoices for cross-border shipments","Use a single UPS OAuth2 credential for Tracking, Address Validation, Rating, and Shipping"],"authentication":"UPS OAuth2 (Client ID and Secret); n8n handles the client-credentials token exchange and refresh. The credential also includes a sandbox/production switch.","commonUseCases":["Automating fulfillment workflows that validate addresses, rate-shop, and create shipping labels","Showing shipment status updates in customer service or order management workflows","Generating international shipping documents such as customs forms and commercial invoices","Embedding live UPS negotiated rates into approval or reconciliation processes"],"limitations":["Supports UPS REST API operations only; no aggregator or middleware layer","README is truncated, so the exact list of all resources/operations is not fully visible"],"relatedNodes":[]}


node_type: n8n-nodes-appreviewbot.appReviewBot
package_name: n8n-nodes-appreviewbot
display_name: AppReviewBot
description: Fetch Apple App Store and Google Play reviews via the AppReviewBot API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: w3dev.co
author_github_url: https://github.com/AppReviewBot/
npm_package_name: n8n-nodes-appreviewbot
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:34.577Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "review",
      "options": [
        {
          "name": "App",
          "value": "app"
        },
        {
          "name": "Review",
          "value": "review"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many apps",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/apps",
              "method": "GET"
            }
          },
          "description": "Return many apps connected to your AppReviewBot organization"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "app"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get reviews for an app",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "=/apps/{{$parameter[\"appRef\"]}}/reviews",
              "method": "GET"
            }
          },
          "description": "Return reviews for a connected app, ordered by most recently updated"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "review"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many apps",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/apps",
          "method": "GET"
        }
      },
      "description": "Return many apps connected to your AppReviewBot organization",
      "resource": "app"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get reviews for an app",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "=/apps/{{$parameter[\"appRef\"]}}/reviews",
          "method": "GET"
        }
      },
      "description": "Return reviews for a connected app, ordered by most recently updated",
      "resource": "review"
    }
  ]

npm_readme:
  # n8n-nodes-appreviewbot

  An n8n community node for [AppReviewBot](https://appreviewbot.com) — fetch Apple App Store and Google Play reviews in your n8n workflows.

  Full setup guide: [n8n Integration docs](https://appreviewbot.com/docs/guides/n8n-integration)

  ## What it does

  AppReviewBot monitors app store reviews and surfaces them in real time. This node lets you:

  - **Fetch reviews** from any app connected to your AppReviewBot organization (Apple App Store & Google Play)
  - **List all connected apps** in your organization

  Pair the action node with n8n's built-in **Schedule Trigger** to run periodic review exports or alerts.

  ## Installation

  1. Open your n8n instance and go to **Settings → Community Nodes**
  2. Click **Install**
  3. Enter `n8n-nodes-appreviewbot` and click **Install**
  4. Restart n8n when prompted

  ## Credentials setup

  You need an AppReviewBot API key (format: `arb_...`).

  1. Log in to [dash.appreviewbot.com](https://dash.appreviewbot.com)
  2. Go to **Organization Settings → API Keys**
  3. Create or copy your API key
  4. In n8n, add a new **AppReviewBot API** credential and paste the key

  ## Operations

  ### AppReviewBot node (action)

  | Resource | Operation | Description |
  |----------|-----------|-------------|
  | App | Get Many | Return all apps connected to your organization |
  | Review | Get Many | Return reviews for a selected app |

  **Review — Get Many** supports:

  - **App selector**: pick from a list or enter the composite app reference (e.g. `apple_app_store__123456789`)
  - **Return All / Limit**: paginate automatically using cursor-based pagination (`starting_after`)
  - **Additional Fields**: filter by country (ISO 3166-1 alpha-2), rating (1–5 stars), from/to date range (filters on `content_updated_at`)

  See the [n8n Integration guide](https://appreviewbot.com/docs/guides/n8n-integration) for full setup details.

  ## Review object fields

  | Field | Description |
  |-------|-------------|
  | `id` | Review UUID |
  | `app_id` | App identifier |
  | `app_store` | `apple_app_store` or `google_play_store` |
  | `author_display_name` | Reviewer name |
  | `content_title` | Review title |
  | `content_body` | Review text |
  | `content_rating` | Star rating (1–5) |
  | `content_updated_at` | Unix timestamp of last update |
  | `reply_text` | Developer reply (if any) |
  | `country` | Two-letter country code |
  | `store_permalink` | Link to the review in the store |

  ## Development

  Install the n8n node CLI globally, then install project dependencies:

  ```bash
  npm install --global @n8n/node-cli
  npm install
  ```

  ## Available scripts

  | Script | Description |
  |--------|-------------|
  | `npm run dev` | Start n8n with this node loaded (hot-reload) |
  | `npm run build` | Compile TypeScript to `dist/` |
  | `npm run lint` | Check for linting errors |
  | `npm run lint:fix` | Auto-fix linting issues |
  | `npm run release` | Bump version, tag, and push (triggers npm publish via GitHub Actions) |

  ## Compatibility

  - n8n version: 1.0+
  - Node.js: 18+

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Fetch Apple App Store and Google Play reviews through the AppReviewBot API for use in n8n workflows. It can also list all apps connected to the user's AppReviewBot organization.","capabilities":["List all connected apps in the AppReviewBot organization","Fetch reviews for a selected app from Apple App Store or Google Play","Select apps from a list or by composite app reference","Paginate through reviews with Return All or Limit using cursor-based pagination","Filter reviews by country, star rating, and date range"],"authentication":"AppReviewBot API key required (format: arb_...)","commonUseCases":["Automated review monitoring and exports","Scheduled alerts for new or updated app store reviews"],"limitations":["Supports only apps connected to the user's AppReviewBot organization","Review filtering is limited to country, rating, and from/to date range on content_updated_at"],"relatedNodes":["Schedule Trigger"]}


node_type: n8n-nodes-usepdfmaker.usePdfMaker
package_name: n8n-nodes-usepdfmaker
display_name: UsePDFMaker
description: Convert HTML, URLs and documents to PDF using UsePDFMaker API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: usepdfmaker
author_github_url: https://github.com/usepdfmaker/
npm_package_name: n8n-nodes-usepdfmaker
npm_version: 1.0.14
community_fetched_at: 2026-07-14T14:40:34.578Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "htmlToPdf",
      "options": [
        {
          "name": "HTML to PDF",
          "value": "htmlToPdf",
          "action": "Convert HTML to PDF",
          "description": "Convert HTML content to PDF"
        },
        {
          "name": "URL to PDF",
          "value": "urlToPdf",
          "action": "Convert URL to PDF",
          "description": "Convert a URL to PDF"
        },
        {
          "name": "Document to PDF",
          "value": "documentToPdf",
          "action": "Convert document to PDF",
          "description": "Convert DOCX, XLSX or PPTX to PDF"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "HTML to PDF",
      "value": "htmlToPdf",
      "action": "Convert HTML to PDF",
      "description": "Convert HTML content to PDF"
    },
    {
      "name": "URL to PDF",
      "value": "urlToPdf",
      "action": "Convert URL to PDF",
      "description": "Convert a URL to PDF"
    },
    {
      "name": "Document to PDF",
      "value": "documentToPdf",
      "action": "Convert document to PDF",
      "description": "Convert DOCX, XLSX or PPTX to PDF"
    }
  ]

npm_readme:
  ﻿# n8n-nodes-usepdfmaker

  This is an n8n community node for [UsePDFMaker](https://usepdfmaker.com) — a developer-first PDF conversion REST API.

  ## Installation

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

  ## Operations

  - **HTML to PDF** — Convert HTML content to a PDF file
  - **URL to PDF** — Convert any web page URL to a PDF file
  - **Document to PDF** — Convert DOCX, XLSX, or PPTX files to PDF

  ## Credentials

  You need a UsePDFMaker API key. Get one for free at [app.usepdfmaker.com/dashboard](https://app.usepdfmaker.com/dashboard).

  In n8n, create a new **UsePDFMaker API** credential and paste your API key into the **API Key** field.

  ## Usage Example: HTML to PDF

  1. Add a **UsePDFMaker** node to your workflow.
  2. Select the **HTML to PDF** operation.
  3. In the **HTML Content** field, enter your HTML, for example:
  ```html
     <h1>Invoice #1024</h1>
     <p>Total due: $250.00</p>
  ```
  4. Connect your UsePDFMaker API credential.
  5. Run the node. The output will contain a binary field named `data` with the generated `output.pdf` file, which you can save, email, or upload using any other n8n node.

  ## Resources

  - [UsePDFMaker API Docs](https://usepdfmaker.com/docs)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Converts HTML, URLs, and office documents into PDF files using the UsePDFMaker API. It is designed for generating PDFs from web content or document inputs inside n8n workflows.","capabilities":["Convert HTML content to PDF","Convert a web page URL to PDF","Convert DOCX, XLSX, or PPTX documents to PDF","Output the generated PDF as binary data (data field)"],"authentication":"API key required (UsePDFMaker API credential)","commonUseCases":["Generate invoices, reports, or other documents from HTML templates","Save web pages as PDFs","Convert office documents to PDF for sharing or archiving"],"limitations":[],"relatedNodes":[]}


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

updated_at: 2026-07-14 14:40:34
author_name: vasyl-d
author_github_url: https://github.com/vasyl-d/ro-app-n8n.git
npm_package_name: n8n-nodes-roapp
npm_version: 1.0.13
community_fetched_at: 2026-07-14T14:40:34.578Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "catalog",
      "options": [
        {
          "name": "Asset",
          "value": "asset"
        },
        {
          "name": "Booking",
          "value": "booking"
        },
        {
          "name": "Catalog",
          "value": "catalog"
        },
        {
          "name": "Company",
          "value": "company"
        },
        {
          "name": "Estimate",
          "value": "estimate"
        },
        {
          "name": "Invoice",
          "value": "invoice"
        },
        {
          "name": "Lead",
          "value": "lead"
        },
        {
          "name": "Marketing",
          "value": "marketing"
        },
        {
          "name": "Order",
          "value": "order"
        },
        {
          "name": "Organization",
          "value": "organization"
        },
        {
          "name": "Person",
          "value": "person"
        },
        {
          "name": "Sale",
          "value": "sale"
        },
        {
          "name": "Warehouse",
          "value": "warehouse"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getInfo",
      "options": [
        {
          "name": "Get Employees",
          "value": "getEmployees",
          "action": "Get the employees of a company",
          "description": "Get the employees of a company"
        },
        {
          "name": "Get Info",
          "value": "getInfo",
          "action": "Get the comapany info",
          "description": "Get the comapany info"
        },
        {
          "name": "Get Legal Entities",
          "value": "getLegalEntities",
          "action": "Get the legal entities of a company",
          "description": "Get the legal entities of a company"
        },
        {
          "name": "Get License",
          "value": "getLicense",
          "action": "Get the license of a company",
          "description": "Get the license of a company"
        },
        {
          "name": "Get Location By ID",
          "value": "getLocationById",
          "action": "Get the location data",
          "description": "Get the location data"
        },
        {
          "name": "Get Location Resources",
          "value": "getLocationResources",
          "action": "Get resources for given location",
          "description": "Get resources for given location"
        },
        {
          "name": "Get Locations",
          "value": "getLocations",
          "action": "Get the locations of a company",
          "description": "Get the locations of a company"
        },
        {
          "name": "Get Taxes",
          "value": "getTaxes",
          "action": "Get the taxes of a company",
          "description": "Get the taxes of a company"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "company"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAdCampaigns",
      "options": [
        {
          "name": "Get Reviews",
          "value": "getReviews",
          "action": "Get customer reviews",
          "description": "Get customer reviews"
        },
        {
          "name": "Get Ad Campaigns",
          "value": "getAdCampaigns",
          "action": "Get ad campaigns"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "marketing"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new person",
          "description": "Create a new person"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a person",
          "description": "Delete a person"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a user",
          "description": "Get the data of a single user"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get persons",
          "description": "Get many person"
        },
        {
          "name": "Get Person Organization",
          "value": "getPersonOrganization",
          "action": "Get person organization"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a person",
          "description": "Update a person"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Item",
          "value": "createItem",
          "action": "Add order item",
          "description": "Add an item to an order"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create order",
          "description": "Create a new order"
        },
        {
          "name": "Create Comment",
          "value": "createComment",
          "action": "Create order comment",
          "description": "Add a comment to an order"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete order",
          "description": "Delete an order"
        },
        {
          "name": "Delete Item",
          "value": "deleteItem",
          "action": "Delete order item",
          "description": "Delete an order item"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get order",
          "description": "Get the data of a single order"
        },
        {
          "name": "Get Custom Fields",
          "value": "getCustomFields",
          "action": "Get order custom fields",
          "description": "Get the custom fields of an order"
        },
        {
          "name": "Get Items",
          "value": "getItems",
          "action": "Get order items",
          "description": "Get items for an order"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get orders",
          "description": "Get multiple orders"
        },
        {
          "name": "Get Public URL",
          "value": "getPublicUrl",
          "action": "Get order public URL",
          "description": "Get the public page URL of an order"
        },
        {
          "name": "Get Statuses",
          "value": "getStatuses",
          "action": "Get order statuses",
          "description": "Get the statuses of an order"
        },
        {
          "name": "Get Types",
          "value": "getTypes",
          "action": "Get order types",
          "description": "Get the types of an order"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update order",
          "description": "Update an order"
        },
        {
          "name": "Update Item",
          "value": "updateItem",
          "action": "Update order item",
          "description": "Update an order item"
        },
        {
          "name": "Update Status",
          "value": "updateStatus",
          "action": "Update order status",
          "description": "Update the status of an order"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "order"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create lead",
          "description": "Create a new lead"
        },
        {
          "name": "Create Comment",
          "value": "createComment",
          "action": "Create lead comment",
          "description": "Create lead comment"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a lead",
          "description": "Get the data of a single lead"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get leads",
          "description": "Get leads"
        },
        {
          "name": "Update Status",
          "value": "updateStatus",
          "action": "Update lead status",
          "description": "Update the lead status"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "lead"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an organization",
          "description": "Create an organization"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an organization",
          "description": "Delete an organization"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an organization",
          "description": "Get the data of a single organization"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get companies",
          "description": "Get companies"
        },
        {
          "name": "Get Organization People",
          "value": "getOrganizationPeople",
          "action": "Get persons connected with an organization",
          "description": "Get persons connected with an organization"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an organization",
          "description": "Update an organization"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "organization"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get sale by id",
          "description": "Get sale by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get sales",
          "description": "Get sales"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sale"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Item",
          "value": "createItem",
          "action": "Add invoice item",
          "description": "Add an item to an invoice"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create an invoice",
          "description": "Create an invoice"
        },
        {
          "name": "Create Comment",
          "value": "createComment",
          "action": "Create invoice comment",
          "description": "Add a comment to an invoice"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an invoice",
          "description": "Delete an invoice"
        },
        {
          "name": "Delete Item",
          "value": "deleteItem",
          "action": "Delete invoice item",
          "description": "Delete an item from an invoice"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an invoice",
          "description": "Get the data of a single invoice"
        },
        {
          "name": "Get Invoice Items",
          "value": "getItems",
          "action": "Get invoice items",
          "description": "Get the Items of a single invoice"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many invoices",
          "description": "Retrieve many invoices"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an invoice",
          "description": "Update an invoice"
        },
        {
          "name": "Update Item",
          "value": "updateItem",
          "action": "Update invoice item",
          "description": "Update an item in an invoice"
        },
        {
          "name": "Update Status",
          "value": "updateStatus",
          "action": "Update invoice status",
          "description": "Update the status of an invoice"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invoice"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create asset",
          "description": "Create a new asset"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an asset",
          "description": "Get the data of a single asset"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get assets",
          "description": "Get assets"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update asset",
          "description": "Update a new asset"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "asset"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Item",
          "value": "createItem",
          "action": "Add booking item",
          "description": "Add an item to a booking"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create booking",
          "description": "Create a new booking"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete booking",
          "description": "Delete a booking"
        },
        {
          "name": "Delete Item",
          "value": "deleteItem",
          "action": "Delete booking item",
          "description": "Delete a booking item"
        },
        {
          "name": "Get by ID",
          "value": "get",
          "action": "Get booking",
          "description": "Get the data of a single booking"
        },
        {
          "name": "Get Items",
          "value": "getItems",
          "action": "Get booking items",
          "description": "Get items for a booking"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get bookings",
          "description": "Get multiple bookings"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update booking",
          "description": "Update a booking"
        },
        {
          "name": "Update Item",
          "value": "updateItem",
          "action": "Update booking item",
          "description": "Update a booking item"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "booking"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Item",
          "value": "createItem",
          "action": "Add estimate item",
          "description": "Add an item to an estimate"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create estimate",
          "description": "Create a new estimate"
        },
        {
          "name": "Create Comment",
          "value": "createComment",
          "action": "Create estimate comment",
          "description": "Add a comment to an estimate"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete estimate",
          "description": "Delete an estimate"
        },
        {
          "name": "Delete Item",
          "value": "deleteItem",
          "action": "Delete estimate item",
          "description": "Delete an estimate item"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get estimate",
          "description": "Get the data of a single estimate"
        },
        {
          "name": "Get Custom Fields",
          "value": "getCustomFields",
          "action": "Get estimate custom fields",
          "description": "Get the custom fields of an estimate"
        },
        {
          "name": "Get Items",
          "value": "getItems",
          "action": "Get estimate items",
          "description": "Get items for an estimate"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get estimates",
          "description": "Get multiple estimates"
        },
        {
          "name": "Get Public URL",
          "value": "getPublicUrl",
          "action": "Get estimate public URL",
          "description": "Get the public page URL of an estimate"
        },
        {
          "name": "Get Statuses",
          "value": "getStatuses",
          "action": "Get estimate statuses",
          "description": "Get the statuses of an estimate"
        },
        {
          "name": "Get Types",
          "value": "getTypes",
          "action": "Get estimate types",
          "description": "Get the types of an estimate"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update estimate",
          "description": "Update an estimate"
        },
        {
          "name": "Update Item",
          "value": "updateItem",
          "action": "Update estimate item",
          "description": "Update an estimate item"
        },
        {
          "name": "Update Status",
          "value": "updateStatus",
          "action": "Update the status of an estimate",
          "description": "Update the status of an estimate"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "estimate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getWarehouses",
      "options": [
        {
          "name": "Get Warehouses",
          "value": "getWarehouses",
          "action": "Get warehouses"
        },
        {
          "name": "Get Stock",
          "value": "getStock",
          "action": "Get stock by warehouse",
          "description": "Get stock by warehouse"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "warehouse"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getServices",
      "options": [
        {
          "name": "Get Product by ID",
          "value": "getProductById",
          "action": "Get product by id"
        },
        {
          "name": "Get Products",
          "value": "getProducts",
          "action": "Get products",
          "description": "Retrieve a list of products"
        },
        {
          "name": "Get Products Categiories",
          "value": "getProductsCategories",
          "action": "Get products categiories",
          "description": "Retrieve a list of Products categories"
        },
        {
          "name": "Get Products Prices",
          "value": "getProductsPrices",
          "action": "Get products prices"
        },
        {
          "name": "Get Products Unit Of Measures",
          "value": "getProductsUOMs",
          "action": "Get products unit of measures"
        },
        {
          "name": "Get Service by ID",
          "value": "getServiceById",
          "action": "Get services by id",
          "description": "Retrieve service data"
        },
        {
          "name": "Get Services",
          "value": "getServices",
          "action": "Get services",
          "description": "Retrieve a list of services"
        },
        {
          "name": "Get Services Categiories",
          "value": "getServicesCategories",
          "action": "Get services categiories",
          "description": "Retrieve a list of services categories"
        },
        {
          "name": "Get Services Prices",
          "value": "getServicesPrices",
          "action": "Get services prices"
        },
        {
          "name": "Get Services Unit Of Measures",
          "value": "getServicesUOMs",
          "action": "Get services unit of measures"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "catalog"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Employees",
      "value": "getEmployees",
      "action": "Get the employees of a company",
      "description": "Get the employees of a company",
      "resource": "company"
    },
    {
      "name": "Get Info",
      "value": "getInfo",
      "action": "Get the comapany info",
      "description": "Get the comapany info",
      "resource": "company"
    },
    {
      "name": "Get Legal Entities",
      "value": "getLegalEntities",
      "action": "Get the legal entities of a company",
      "description": "Get the legal entities of a company",
      "resource": "company"
    },
    {
      "name": "Get License",
      "value": "getLicense",
      "action": "Get the license of a company",
      "description": "Get the license of a company",
      "resource": "company"
    },
    {
      "name": "Get Location By ID",
      "value": "getLocationById",
      "action": "Get the location data",
      "description": "Get the location data",
      "resource": "company"
    },
    {
      "name": "Get Location Resources",
      "value": "getLocationResources",
      "action": "Get resources for given location",
      "description": "Get resources for given location",
      "resource": "company"
    },
    {
      "name": "Get Locations",
      "value": "getLocations",
      "action": "Get the locations of a company",
      "description": "Get the locations of a company",
      "resource": "company"
    },
    {
      "name": "Get Taxes",
      "value": "getTaxes",
      "action": "Get the taxes of a company",
      "description": "Get the taxes of a company",
      "resource": "company"
    },
    {
      "name": "Get Reviews",
      "value": "getReviews",
      "action": "Get customer reviews",
      "description": "Get customer reviews",
      "resource": "marketing"
    },
    {
      "name": "Get Ad Campaigns",
      "value": "getAdCampaigns",
      "action": "Get ad campaigns",
      "resource": "marketing"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new person",
      "description": "Create a new person",
      "resource": "person"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a person",
      "description": "Delete a person",
      "resource": "person"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a user",
      "description": "Get the data of a single user",
      "resource": "person"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get persons",
      "description": "Get many person",
      "resource": "person"
    },
    {
      "name": "Get Person Organization",
      "value": "getPersonOrganization",
      "action": "Get person organization",
      "resource": "person"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a person",
      "description": "Update a person",
      "resource": "person"
    },
    {
      "name": "Add Item",
      "value": "createItem",
      "action": "Add order item",
      "description": "Add an item to an order",
      "resource": "order"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create order",
      "description": "Create a new order",
      "resource": "order"
    },
    {
      "name": "Create Comment",
      "value": "createComment",
      "action": "Create order comment",
      "description": "Add a comment to an order",
      "resource": "order"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete order",
      "description": "Delete an order",
      "resource": "order"
    },
    {
      "name": "Delete Item",
      "value": "deleteItem",
      "action": "Delete order item",
      "description": "Delete an order item",
      "resource": "order"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get order",
      "description": "Get the data of a single order",
      "resource": "order"
    },
    {
      "name": "Get Custom Fields",
      "value": "getCustomFields",
      "action": "Get order custom fields",
      "description": "Get the custom fields of an order",
      "resource": "order"
    },
    {
      "name": "Get Items",
      "value": "getItems",
      "action": "Get order items",
      "description": "Get items for an order",
      "resource": "order"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get orders",
      "description": "Get multiple orders",
      "resource": "order"
    },
    {
      "name": "Get Public URL",
      "value": "getPublicUrl",
      "action": "Get order public URL",
      "description": "Get the public page URL of an order",
      "resource": "order"
    },
    {
      "name": "Get Statuses",
      "value": "getStatuses",
      "action": "Get order statuses",
      "description": "Get the statuses of an order",
      "resource": "order"
    },
    {
      "name": "Get Types",
      "value": "getTypes",
      "action": "Get order types",
      "description": "Get the types of an order",
      "resource": "order"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update order",
      "description": "Update an order",
      "resource": "order"
    },
    {
      "name": "Update Item",
      "value": "updateItem",
      "action": "Update order item",
      "description": "Update an order item",
      "resource": "order"
    },
    {
      "name": "Update Status",
      "value": "updateStatus",
      "action": "Update order status",
      "description": "Update the status of an order",
      "resource": "order"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create lead",
      "description": "Create a new lead",
      "resource": "lead"
    },
    {
      "name": "Create Comment",
      "value": "createComment",
      "action": "Create lead comment",
      "description": "Create lead comment",
      "resource": "lead"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a lead",
      "description": "Get the data of a single lead",
      "resource": "lead"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get leads",
      "description": "Get leads",
      "resource": "lead"
    },
    {
      "name": "Update Status",
      "value": "updateStatus",
      "action": "Update lead status",
      "description": "Update the lead status",
      "resource": "lead"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an organization",
      "description": "Create an organization",
      "resource": "organization"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an organization",
      "description": "Delete an organization",
      "resource": "organization"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an organization",
      "description": "Get the data of a single organization",
      "resource": "organization"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get companies",
      "description": "Get companies",
      "resource": "organization"
    },
    {
      "name": "Get Organization People",
      "value": "getOrganizationPeople",
      "action": "Get persons connected with an organization",
      "description": "Get persons connected with an organization",
      "resource": "organization"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an organization",
      "description": "Update an organization",
      "resource": "organization"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get sale by id",
      "description": "Get sale by ID",
      "resource": "sale"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get sales",
      "description": "Get sales",
      "resource": "sale"
    },
    {
      "name": "Add Item",
      "value": "createItem",
      "action": "Add invoice item",
      "description": "Add an item to an invoice",
      "resource": "invoice"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an invoice",
      "description": "Create an invoice",
      "resource": "invoice"
    },
    {
      "name": "Create Comment",
      "value": "createComment",
      "action": "Create invoice comment",
      "description": "Add a comment to an invoice",
      "resource": "invoice"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an invoice",
      "description": "Delete an invoice",
      "resource": "invoice"
    },
    {
      "name": "Delete Item",
      "value": "deleteItem",
      "action": "Delete invoice item",
      "description": "Delete an item from an invoice",
      "resource": "invoice"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an invoice",
      "description": "Get the data of a single invoice",
      "resource": "invoice"
    },
    {
      "name": "Get Invoice Items",
      "value": "getItems",
      "action": "Get invoice items",
      "description": "Get the Items of a single invoice",
      "resource": "invoice"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many invoices",
      "description": "Retrieve many invoices",
      "resource": "invoice"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an invoice",
      "description": "Update an invoice",
      "resource": "invoice"
    },
    {
      "name": "Update Item",
      "value": "updateItem",
      "action": "Update invoice item",
      "description": "Update an item in an invoice",
      "resource": "invoice"
    },
    {
      "name": "Update Status",
      "value": "updateStatus",
      "action": "Update invoice status",
      "description": "Update the status of an invoice",
      "resource": "invoice"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create asset",
      "description": "Create a new asset",
      "resource": "asset"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an asset",
      "description": "Get the data of a single asset",
      "resource": "asset"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get assets",
      "description": "Get assets",
      "resource": "asset"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update asset",
      "description": "Update a new asset",
      "resource": "asset"
    },
    {
      "name": "Add Item",
      "value": "createItem",
      "action": "Add booking item",
      "description": "Add an item to a booking",
      "resource": "booking"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create booking",
      "description": "Create a new booking",
      "resource": "booking"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete booking",
      "description": "Delete a booking",
      "resource": "booking"
    },
    {
      "name": "Delete Item",
      "value": "deleteItem",
      "action": "Delete booking item",
      "description": "Delete a booking item",
      "resource": "booking"
    },
    {
      "name": "Get by ID",
      "value": "get",
      "action": "Get booking",
      "description": "Get the data of a single booking",
      "resource": "booking"
    },
    {
      "name": "Get Items",
      "value": "getItems",
      "action": "Get booking items",
      "description": "Get items for a booking",
      "resource": "booking"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get bookings",
      "description": "Get multiple bookings",
      "resource": "booking"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update booking",
      "description": "Update a booking",
      "resource": "booking"
    },
    {
      "name": "Update Item",
      "value": "updateItem",
      "action": "Update booking item",
      "description": "Update a booking item",
      "resource": "booking"
    },
    {
      "name": "Add Item",
      "value": "createItem",
      "action": "Add estimate item",
      "description": "Add an item to an estimate",
      "resource": "estimate"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create estimate",
      "description": "Create a new estimate",
      "resource": "estimate"
    },
    {
      "name": "Create Comment",
      "value": "createComment",
      "action": "Create estimate comment",
      "description": "Add a comment to an estimate",
      "resource": "estimate"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete estimate",
      "description": "Delete an estimate",
      "resource": "estimate"
    },
    {
      "name": "Delete Item",
      "value": "deleteItem",
      "action": "Delete estimate item",
      "description": "Delete an estimate item",
      "resource": "estimate"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get estimate",
      "description": "Get the data of a single estimate",
      "resource": "estimate"
    },
    {
      "name": "Get Custom Fields",
      "value": "getCustomFields",
      "action": "Get estimate custom fields",
      "description": "Get the custom fields of an estimate",
      "resource": "estimate"
    },
    {
      "name": "Get Items",
      "value": "getItems",
      "action": "Get estimate items",
      "description": "Get items for an estimate",
      "resource": "estimate"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get estimates",
      "description": "Get multiple estimates",
      "resource": "estimate"
    },
    {
      "name": "Get Public URL",
      "value": "getPublicUrl",
      "action": "Get estimate public URL",
      "description": "Get the public page URL of an estimate",
      "resource": "estimate"
    },
    {
      "name": "Get Statuses",
      "value": "getStatuses",
      "action": "Get estimate statuses",
      "description": "Get the statuses of an estimate",
      "resource": "estimate"
    },
    {
      "name": "Get Types",
      "value": "getTypes",
      "action": "Get estimate types",
      "description": "Get the types of an estimate",
      "resource": "estimate"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update estimate",
      "description": "Update an estimate",
      "resource": "estimate"
    },
    {
      "name": "Update Item",
      "value": "updateItem",
      "action": "Update estimate item",
      "description": "Update an estimate item",
      "resource": "estimate"
    },
    {
      "name": "Update Status",
      "value": "updateStatus",
      "action": "Update the status of an estimate",
      "description": "Update the status of an estimate",
      "resource": "estimate"
    },
    {
      "name": "Get Warehouses",
      "value": "getWarehouses",
      "action": "Get warehouses",
      "resource": "warehouse"
    },
    {
      "name": "Get Stock",
      "value": "getStock",
      "action": "Get stock by warehouse",
      "description": "Get stock by warehouse",
      "resource": "warehouse"
    },
    {
      "name": "Get Product by ID",
      "value": "getProductById",
      "action": "Get product by id",
      "resource": "catalog"
    },
    {
      "name": "Get Products",
      "value": "getProducts",
      "action": "Get products",
      "description": "Retrieve a list of products",
      "resource": "catalog"
    },
    {
      "name": "Get Products Categiories",
      "value": "getProductsCategories",
      "action": "Get products categiories",
      "description": "Retrieve a list of Products categories",
      "resource": "catalog"
    },
    {
      "name": "Get Products Prices",
      "value": "getProductsPrices",
      "action": "Get products prices",
      "resource": "catalog"
    },
    {
      "name": "Get Products Unit Of Measures",
      "value": "getProductsUOMs",
      "action": "Get products unit of measures",
      "resource": "catalog"
    },
    {
      "name": "Get Service by ID",
      "value": "getServiceById",
      "action": "Get services by id",
      "description": "Retrieve service data",
      "resource": "catalog"
    },
    {
      "name": "Get Services",
      "value": "getServices",
      "action": "Get services",
      "description": "Retrieve a list of services",
      "resource": "catalog"
    },
    {
      "name": "Get Services Categiories",
      "value": "getServicesCategories",
      "action": "Get services categiories",
      "description": "Retrieve a list of services categories",
      "resource": "catalog"
    },
    {
      "name": "Get Services Prices",
      "value": "getServicesPrices",
      "action": "Get services prices",
      "resource": "catalog"
    },
    {
      "name": "Get Services Unit Of Measures",
      "value": "getServicesUOMs",
      "action": "Get services unit of measures",
      "resource": "catalog"
    }
  ]

npm_readme:
  # n8n-nodes-roapp

  This is an n8n community node. It lets you use [ROapp.io API](https://roapp.readme.io/) and [Orderry API](https://orderry.readme.io/) in your n8n workflows.

  ROapp.io is a comprehensive business management platform that helps companies manage their operations including orders, invoices, bookings, customers, inventory, and more.

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

  [Installation](#installation)  
  [Operations](#operations)  
  [Credentials](#credentials)  
  [Compatibility](#compatibility)  
  [Usage](#usage)  
  [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.

  ## Credentials

  To use this node, you need to create [ROapp.io API](https://roapp.readme.io/) or [Orderry.com](https://app.orderry.com) credentials:

  1. Sign up for a ROapp.io or Orderry account at https://roapp.io/ or https://app.orderry.com
  2. Get an API access token from your account settings
  3. In n8n, create new credentials of type "Roapp API" or "Orderry API"
  4. Enter your Access Token in the credentials form

  The node uses Bearer token authentication, automatically adding the `Authorization: Bearer <your_token>` header to all API requests.

  ## Operations

  The Roapp node supports the following resources and operations:

  ### Core Operations (available for most resources)
  - **Get All**: Retrieve multiple records with filtering and pagination
  - **Get**: Retrieve a single record by ID
  - **Create**: Create a new record
  - **Update**: Update an existing record
  - **Delete**: Delete a record

  ### Specialized Operations
  - **Item Management**: For resources that support line items (Orders, Invoices, Bookings):
    - Create Item: Add an item to a parent record
    - Update Item: Modify an existing item
    - Delete Item: Remove an item from a parent record
  - **Status Updates**: Update the status of records (e.g., order status, invoice status)
  - **Comments**: Add comments to records
  - **Additional Operations**: Specific to certain resources (e.g., Get Public URL for orders, Get Types, Get Statuses)

  ## Compatibility

  - **Minimum n8n version**: 2.16.1
  - **Tested against**: n8n 2.16.1+
  - **Known incompatibilities**: None reported

  ## Usage

  ### Basic Workflow Example
  1. Set up your ROapp credentials as described above
  2. Add the Roapp node to your workflow
  3. Select the desired resource (e.g., "Invoice")
  4. Choose the operation (e.g., "Create")
  5. Configure the required fields for the operation
  6. Connect the node to other nodes in your workflow as needed

  ### Handling Pagination
  When using "Get All" operations, you can:
  - Set "Return All" to automatically paginate through all results
  - Or set a specific "Limit" to control how many records are returned

  ### Working with Custom Fields
  The node automatically handles custom fields for supported resources through the resource mapping feature.

  ## Resources

  The Roapp node provides access to the following [ROapp.io API](https://roapp.readme.io/) / [Orderry.com](https://app.orderry.com) resources:

  ### Business Operations
  - **Orders**: Manage customer orders, including items, status, payments
  - **Invoices**: Create and manage invoices, invoice items, and payment tracking
  - **Bookings**: Handle service bookings, appointments, and reservations
  - **Sales**: Track sales opportunities and pipeline management

  ### Customer & Contact Management
  - **Persons**: Manage individual customer/contact records
  - **Organizations**: Manage business accounts and company contacts
  - **Leads**: Track potential sales leads and prospects

  ### Product & Inventory
  - **Catalog**: Manage products and services
  - **Assets**: Track company assets and equipment
  - **Warehouse**: Manage inventory and warehouse operations

  ### Company & Configuration
  - **Company**: Access company information and settings
  - **Marketing**: Access marketing campaign data and analytics
  - **Deduplication**: Manage duplicate detection and merging rules

  ### Common Fields Across Resources
  Most resources support standard fields like:
  - ID, creation/update timestamps
  - Status and type classifications
  - Monetary values (prices, amounts, taxes)
  - References to related resources (customer IDs, product IDs, etc.)
  - Custom fields (configured in your ROapp.io account)

  ## Version history

  ### Version 1.0.0
  - Initial release
  - Support for all major [ROapp.io API](https://roapp.readme.io/) / [Orderry.com](https://app.orderry.com) resources
  - Full CRUD operations for each resource
  - Specialized operations for line items, status updates, and comments
  - Custom field handling and resource mapping
  - Secure authentication via Access Token

ai_documentation_summary:
  {"purpose":"Connects n8n workflows to the ROapp.io API for managing business operations like orders, invoices, bookings, customers, inventory, and related records.","capabilities":["Get All records with filtering and pagination","Get a single record by ID","Create new records","Update existing records","Delete records","Create, update, and delete line items for orders, invoices, and bookings","Update record status","Add comments to records","Retrieve additional resource-specific data such as public URLs, types, and statuses","Handle custom fields for supported resources"],"authentication":"Bearer token authentication using a ROapp.io API access token","commonUseCases":["Automating order, invoice, and booking management","Syncing customer and organization records with ROapp","Managing inventory, products, and warehouse data","Tracking sales leads and opportunities","Adding comments or updating statuses in business records"],"limitations":["Minimum n8n version is 2.16.1","No known incompatibilities are reported, but only n8n 2.16.1+ is tested"],"relatedNodes":[]}


node_type: @lucca/n8n-nodes-lucca.lucca
package_name: @lucca/n8n-nodes-lucca
display_name: Lucca
description: Lucca node
category: Community
development_style: declarative
version: 2
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lucca-front
author_github_url: https://github.com/LuccaSA/n8n-nodes-lucca.git
npm_package_name: @lucca/n8n-nodes-lucca
npm_version: 0.6.0
community_fetched_at: 2026-07-14T14:40:34.580Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Organization",
          "value": "Organization",
          "description": "Organization."
        },
        {
          "name": "Employee Job Qualifications",
          "value": "Employee Job Qualifications",
          "description": "Job qualifications & professions."
        },
        {
          "name": "Employee Occupation Categories",
          "value": "Employee Occupation Categories",
          "description": ""
        },
        {
          "name": "Employees",
          "value": "Employees",
          "description": "Employees."
        },
        {
          "name": "Employments",
          "value": "Employments",
          "description": "Employments & job-positions."
        },
        {
          "name": "Events",
          "value": "Events",
          "description": ""
        },
        {
          "name": "Webhooks",
          "value": "Webhooks",
          "description": "Webhooks."
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get Legal Entities",
          "value": "Get Legal Entities",
          "action": "List legal-entities",
          "routing": {
            "request": {
              "url": "=/lucca-api/legal-entities",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of legal-entities."
        },
        {
          "name": "Get Legal Entity",
          "value": "Get Legal Entity",
          "action": "Retrieve a legal-entity",
          "routing": {
            "request": {
              "url": "=/lucca-api/legal-entities/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a legal-entity."
        },
        {
          "name": "List Business Establishments",
          "value": "List Business Establishments",
          "action": "List business-establishments",
          "routing": {
            "request": {
              "url": "=/lucca-api/business-establishments",
              "method": "GET"
            }
          },
          "description": "List business-establishments."
        },
        {
          "name": "Get Business Establishment",
          "value": "Get Business Establishment",
          "action": "Retrieve a business-establishment",
          "routing": {
            "request": {
              "url": "=/lucca-api/business-establishments/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a business-establishment."
        },
        {
          "name": "Get Departments",
          "value": "Get Departments",
          "action": "List departments",
          "routing": {
            "request": {
              "url": "=/lucca-api/departments",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of departments."
        },
        {
          "name": "Get Department",
          "value": "Get Department",
          "action": "Retrieve a department",
          "routing": {
            "request": {
              "url": "=/lucca-api/departments/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single department by ID."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Organization"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get Professions",
          "value": "Get Professions",
          "action": "List professions",
          "routing": {
            "request": {
              "url": "=/lucca-api/professions",
              "method": "GET"
            }
          },
          "description": "List professions."
        },
        {
          "name": "Get Profession",
          "value": "Get Profession",
          "action": "Retrieve a profession",
          "routing": {
            "request": {
              "url": "=/lucca-api/professions/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a profession by its ID."
        },
        {
          "name": "Get Job Qualifications",
          "value": "Get Job Qualifications",
          "action": "List job-qualifications",
          "routing": {
            "request": {
              "url": "=/lucca-api/job-qualifications",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of job-qualifications."
        },
        {
          "name": "Get Job Qualification",
          "value": "Get Job Qualification",
          "action": "Retrieve a job-qualification",
          "routing": {
            "request": {
              "url": "=/lucca-api/job-qualifications/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a job-qualification by its ID."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Job Qualifications"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get Occupation Categories",
          "value": "Get Occupation Categories",
          "action": "List occupation-categories",
          "routing": {
            "request": {
              "url": "=/lucca-api/occupation-categories",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of occupation-categories."
        },
        {
          "name": "Get Occupation Category",
          "value": "Get Occupation Category",
          "action": "Retrieve an occupation-category",
          "routing": {
            "request": {
              "url": "=/lucca-api/occupation-categories/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve an occupation-category."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Occupation Categories"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get Employees",
          "value": "Get Employees",
          "action": "List employees",
          "routing": {
            "request": {
              "url": "=/lucca-api/employees",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of employees."
        },
        {
          "name": "Get Employee",
          "value": "Get Employee",
          "action": "Retrieve an employee",
          "routing": {
            "request": {
              "url": "=/lucca-api/employees/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single employee."
        },
        {
          "name": "Get Portrait",
          "value": "Get Portrait",
          "action": "Retrieve/Download a portrait",
          "routing": {
            "request": {
              "url": "=/lucca-api/portraits/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single employee portrait, either as a JSON representation, or the actual image file.\n\nBy default, the API returns a JSON representation. In order to download the image, you must send `Accept: image/*` HTTP request header."
        },
        {
          "name": "Get Employee Personal Records",
          "value": "Get Employee Personal Records",
          "action": "List employee-personal-records",
          "routing": {
            "request": {
              "url": "=/lucca-api/employee-personal-records",
              "method": "GET"
            }
          },
          "description": "Retrieve a paginated list of employee-personal-records."
        },
        {
          "name": "Get Employee Personal Record",
          "value": "Get Employee Personal Record",
          "action": "Retrieve an employee-personal-record",
          "routing": {
            "request": {
              "url": "=/lucca-api/employee-personal-records/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve an employee-personal-record."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Employees"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get Employments",
          "value": "Get Employments",
          "action": "List employments",
          "routing": {
            "request": {
              "url": "=/lucca-api/employments",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of employments."
        },
        {
          "name": "Get Employment",
          "value": "Get Employment",
          "action": "Retrieve an employment",
          "routing": {
            "request": {
              "url": "=/lucca-api/employments/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve an employment by its ID."
        },
        {
          "name": "Get Employment Templates",
          "value": "Get Employment Templates",
          "action": "List employment-templates",
          "routing": {
            "request": {
              "url": "=/lucca-api/employment-templates",
              "method": "GET"
            }
          },
          "description": "Retrieve a paginated list of employment-templates."
        },
        {
          "name": "Get Employment Template",
          "value": "Get Employment Template",
          "action": "Retrieve an employment-template",
          "routing": {
            "request": {
              "url": "=/lucca-api/employment-templates/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve an employment-template by its ID."
        },
        {
          "name": "Get Job Positions",
          "value": "Get Job Positions",
          "action": "List job-positions",
          "routing": {
            "request": {
              "url": "=/lucca-api/job-positions",
              "method": "GET"
            }
          },
          "description": "Retrieve a paginated list of job-positions."
        },
        {
          "name": "Get Job Position",
          "value": "Get Job Position",
          "action": "Retrieve a job-position",
          "routing": {
            "request": {
              "url": "=/lucca-api/job-positions/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve an job-position by its ID."
        },
        {
          "name": "Get Probationary Periods",
          "value": "Get Probationary Periods",
          "action": "List probationary-periods",
          "routing": {
            "request": {
              "url": "=/lucca-api/probationary-periods",
              "method": "GET"
            }
          },
          "description": "List probationary-periods."
        },
        {
          "name": "Get Probationary Period",
          "value": "Get Probationary Period",
          "action": "Retrieve a probationary-period",
          "routing": {
            "request": {
              "url": "=/lucca-api/probationary-periods/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a probationary-period by its ID."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get Events",
          "value": "Get Events",
          "action": "List events",
          "routing": {
            "request": {
              "url": "=/lucca-api/events",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of events."
        },
        {
          "name": "Get Event",
          "value": "Get Event",
          "action": "Retrieve an event",
          "routing": {
            "request": {
              "url": "=/lucca-api/events/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve an event by its ID."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Events"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get Webhook Endpoints",
          "value": "Get Webhook Endpoints",
          "action": "List webhook-endpoints",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-endpoints",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of webhook-endpoints."
        },
        {
          "name": "Post Webhook Endpoints",
          "value": "Post Webhook Endpoints",
          "action": "Create a webhook-endpoint",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-endpoints",
              "method": "POST"
            }
          },
          "description": "Create a new webhook-endpoint."
        },
        {
          "name": "Get Webhook Endpoint",
          "value": "Get Webhook Endpoint",
          "action": "Retrieve a webhook-endpoint",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-endpoints/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieves a single webhook-endpoint resource."
        },
        {
          "name": "Get Webhook Deliveries",
          "value": "Get Webhook Deliveries",
          "action": "List webhook-deliveries",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-deliveries",
              "method": "GET"
            }
          },
          "description": "Returns a paginated list of webhook-deliveries.\n\nTwo formats (i.e. Content-Types) are supported:\n1. the default application/json format ;\n2. a CloudEvent compliant format."
        },
        {
          "name": "Post Webhook Deliveries",
          "value": "Post Webhook Deliveries",
          "action": "Ping a webhook-endpoint",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-deliveries",
              "method": "POST"
            }
          },
          "description": "Sends a ping event to a webhook-endpoint in order to test it out."
        },
        {
          "name": "Get Webhook Delivery",
          "value": "Get Webhook Delivery",
          "action": "Retrieve a webhook-delivery",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-deliveries/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a webhook-delivery."
        },
        {
          "name": "Get Webhook Delivery Attempts",
          "value": "Get Webhook Delivery Attempts",
          "action": "List webhook-delivery-attempts",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-delivery-attempts",
              "method": "GET"
            }
          },
          "description": "Retrieve a paginated list of webhook-delivery-attempts."
        },
        {
          "name": "Get Webhook Delivery Attempt",
          "value": "Get Webhook Delivery Attempt",
          "action": "Retrieve a webhook-delivery-attempt",
          "routing": {
            "request": {
              "url": "=/lucca-api/webhook-delivery-attempts/{{$parameter[\"id\"]}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a webhook-delivery-attempt."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/legal-entities",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Organization"
          ],
          "operation": [
            "Get Legal Entities"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/legal-entities/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Organization"
          ],
          "operation": [
            "Get Legal Entity"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/business-establishments",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Organization"
          ],
          "operation": [
            "List Business Establishments"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/business-establishments/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Organization"
          ],
          "operation": [
            "Get Business Establishment"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/departments",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Organization"
          ],
          "operation": [
            "Get Departments"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/departments/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Organization"
          ],
          "operation": [
            "Get Department"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/professions",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Job Qualifications"
          ],
          "operation": [
            "Get Professions"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/professions/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Job Qualifications"
          ],
          "operation": [
            "Get Profession"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/occupation-categories",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Occupation Categories"
          ],
          "operation": [
            "Get Occupation Categories"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/occupation-categories/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Occupation Categories"
          ],
          "operation": [
            "Get Occupation Category"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/job-qualifications",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Job Qualifications"
          ],
          "operation": [
            "Get Job Qualifications"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/job-qualifications/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employee Job Qualifications"
          ],
          "operation": [
            "Get Job Qualification"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employees",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employees"
          ],
          "operation": [
            "Get Employees"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employees/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employees"
          ],
          "operation": [
            "Get Employee"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/portraits/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employees"
          ],
          "operation": [
            "Get Portrait"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employee-personal-records",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employees"
          ],
          "operation": [
            "Get Employee Personal Records"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employee-personal-records/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employees"
          ],
          "operation": [
            "Get Employee Personal Record"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employments",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Employments"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employments/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Employment"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employment-templates",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Employment Templates"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/employment-templates/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Employment Template"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/job-positions",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Job Positions"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/job-positions/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Job Position"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/probationary-periods",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Probationary Periods"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/probationary-periods/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Employments"
          ],
          "operation": [
            "Get Probationary Period"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/events",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Events"
          ],
          "operation": [
            "Get Events"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/events/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Events"
          ],
          "operation": [
            "Get Event"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/webhook-endpoints",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Get Webhook Endpoints"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "POST /lucca-api/webhook-endpoints",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Post Webhook Endpoints"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/webhook-endpoints/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Get Webhook Endpoint"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/webhook-deliveries",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Get Webhook Deliveries"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "POST /lucca-api/webhook-deliveries",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Post Webhook Deliveries"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/webhook-deliveries/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Get Webhook Delivery"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/webhook-delivery-attempts",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Get Webhook Delivery Attempts"
          ]
        }
      }
    },
    {
      "name": "operation",
      "type": "notice",
      "default": "",
      "displayName": "GET /lucca-api/webhook-delivery-attempts/{id}",
      "typeOptions": {
        "theme": "info"
      },
      "displayOptions": {
        "show": {
          "resource": [
            "Webhooks"
          ],
          "operation": [
            "Get Webhook Delivery Attempt"
          ]
        }
      }
    }
  ]

operations:
  [
    {
      "name": "Get Legal Entities",
      "value": "Get Legal Entities",
      "action": "List legal-entities",
      "routing": {
        "request": {
          "url": "=/lucca-api/legal-entities",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of legal-entities.",
      "resource": "Organization"
    },
    {
      "name": "Get Legal Entity",
      "value": "Get Legal Entity",
      "action": "Retrieve a legal-entity",
      "routing": {
        "request": {
          "url": "=/lucca-api/legal-entities/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a legal-entity.",
      "resource": "Organization"
    },
    {
      "name": "List Business Establishments",
      "value": "List Business Establishments",
      "action": "List business-establishments",
      "routing": {
        "request": {
          "url": "=/lucca-api/business-establishments",
          "method": "GET"
        }
      },
      "description": "List business-establishments.",
      "resource": "Organization"
    },
    {
      "name": "Get Business Establishment",
      "value": "Get Business Establishment",
      "action": "Retrieve a business-establishment",
      "routing": {
        "request": {
          "url": "=/lucca-api/business-establishments/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a business-establishment.",
      "resource": "Organization"
    },
    {
      "name": "Get Departments",
      "value": "Get Departments",
      "action": "List departments",
      "routing": {
        "request": {
          "url": "=/lucca-api/departments",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of departments.",
      "resource": "Organization"
    },
    {
      "name": "Get Department",
      "value": "Get Department",
      "action": "Retrieve a department",
      "routing": {
        "request": {
          "url": "=/lucca-api/departments/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single department by ID.",
      "resource": "Organization"
    },
    {
      "name": "Get Professions",
      "value": "Get Professions",
      "action": "List professions",
      "routing": {
        "request": {
          "url": "=/lucca-api/professions",
          "method": "GET"
        }
      },
      "description": "List professions.",
      "resource": "Employee Job Qualifications"
    },
    {
      "name": "Get Profession",
      "value": "Get Profession",
      "action": "Retrieve a profession",
      "routing": {
        "request": {
          "url": "=/lucca-api/professions/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a profession by its ID.",
      "resource": "Employee Job Qualifications"
    },
    {
      "name": "Get Job Qualifications",
      "value": "Get Job Qualifications",
      "action": "List job-qualifications",
      "routing": {
        "request": {
          "url": "=/lucca-api/job-qualifications",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of job-qualifications.",
      "resource": "Employee Job Qualifications"
    },
    {
      "name": "Get Job Qualification",
      "value": "Get Job Qualification",
      "action": "Retrieve a job-qualification",
      "routing": {
        "request": {
          "url": "=/lucca-api/job-qualifications/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a job-qualification by its ID.",
      "resource": "Employee Job Qualifications"
    },
    {
      "name": "Get Occupation Categories",
      "value": "Get Occupation Categories",
      "action": "List occupation-categories",
      "routing": {
        "request": {
          "url": "=/lucca-api/occupation-categories",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of occupation-categories.",
      "resource": "Employee Occupation Categories"
    },
    {
      "name": "Get Occupation Category",
      "value": "Get Occupation Category",
      "action": "Retrieve an occupation-category",
      "routing": {
        "request": {
          "url": "=/lucca-api/occupation-categories/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve an occupation-category.",
      "resource": "Employee Occupation Categories"
    },
    {
      "name": "Get Employees",
      "value": "Get Employees",
      "action": "List employees",
      "routing": {
        "request": {
          "url": "=/lucca-api/employees",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of employees.",
      "resource": "Employees"
    },
    {
      "name": "Get Employee",
      "value": "Get Employee",
      "action": "Retrieve an employee",
      "routing": {
        "request": {
          "url": "=/lucca-api/employees/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single employee.",
      "resource": "Employees"
    },
    {
      "name": "Get Portrait",
      "value": "Get Portrait",
      "action": "Retrieve/Download a portrait",
      "routing": {
        "request": {
          "url": "=/lucca-api/portraits/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single employee portrait, either as a JSON representation, or the actual image file.\n\nBy default, the API returns a JSON representation. In order to download the image, you must send `Accept: image/*` HTTP request header.",
      "resource": "Employees"
    },
    {
      "name": "Get Employee Personal Records",
      "value": "Get Employee Personal Records",
      "action": "List employee-personal-records",
      "routing": {
        "request": {
          "url": "=/lucca-api/employee-personal-records",
          "method": "GET"
        }
      },
      "description": "Retrieve a paginated list of employee-personal-records.",
      "resource": "Employees"
    },
    {
      "name": "Get Employee Personal Record",
      "value": "Get Employee Personal Record",
      "action": "Retrieve an employee-personal-record",
      "routing": {
        "request": {
          "url": "=/lucca-api/employee-personal-records/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve an employee-personal-record.",
      "resource": "Employees"
    },
    {
      "name": "Get Employments",
      "value": "Get Employments",
      "action": "List employments",
      "routing": {
        "request": {
          "url": "=/lucca-api/employments",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of employments.",
      "resource": "Employments"
    },
    {
      "name": "Get Employment",
      "value": "Get Employment",
      "action": "Retrieve an employment",
      "routing": {
        "request": {
          "url": "=/lucca-api/employments/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve an employment by its ID.",
      "resource": "Employments"
    },
    {
      "name": "Get Employment Templates",
      "value": "Get Employment Templates",
      "action": "List employment-templates",
      "routing": {
        "request": {
          "url": "=/lucca-api/employment-templates",
          "method": "GET"
        }
      },
      "description": "Retrieve a paginated list of employment-templates.",
      "resource": "Employments"
    },
    {
      "name": "Get Employment Template",
      "value": "Get Employment Template",
      "action": "Retrieve an employment-template",
      "routing": {
        "request": {
          "url": "=/lucca-api/employment-templates/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve an employment-template by its ID.",
      "resource": "Employments"
    },
    {
      "name": "Get Job Positions",
      "value": "Get Job Positions",
      "action": "List job-positions",
      "routing": {
        "request": {
          "url": "=/lucca-api/job-positions",
          "method": "GET"
        }
      },
      "description": "Retrieve a paginated list of job-positions.",
      "resource": "Employments"
    },
    {
      "name": "Get Job Position",
      "value": "Get Job Position",
      "action": "Retrieve a job-position",
      "routing": {
        "request": {
          "url": "=/lucca-api/job-positions/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve an job-position by its ID.",
      "resource": "Employments"
    },
    {
      "name": "Get Probationary Periods",
      "value": "Get Probationary Periods",
      "action": "List probationary-periods",
      "routing": {
        "request": {
          "url": "=/lucca-api/probationary-periods",
          "method": "GET"
        }
      },
      "description": "List probationary-periods.",
      "resource": "Employments"
    },
    {
      "name": "Get Probationary Period",
      "value": "Get Probationary Period",
      "action": "Retrieve a probationary-period",
      "routing": {
        "request": {
          "url": "=/lucca-api/probationary-periods/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a probationary-period by its ID.",
      "resource": "Employments"
    },
    {
      "name": "Get Events",
      "value": "Get Events",
      "action": "List events",
      "routing": {
        "request": {
          "url": "=/lucca-api/events",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of events.",
      "resource": "Events"
    },
    {
      "name": "Get Event",
      "value": "Get Event",
      "action": "Retrieve an event",
      "routing": {
        "request": {
          "url": "=/lucca-api/events/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve an event by its ID.",
      "resource": "Events"
    },
    {
      "name": "Get Webhook Endpoints",
      "value": "Get Webhook Endpoints",
      "action": "List webhook-endpoints",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-endpoints",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of webhook-endpoints.",
      "resource": "Webhooks"
    },
    {
      "name": "Post Webhook Endpoints",
      "value": "Post Webhook Endpoints",
      "action": "Create a webhook-endpoint",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-endpoints",
          "method": "POST"
        }
      },
      "description": "Create a new webhook-endpoint.",
      "resource": "Webhooks"
    },
    {
      "name": "Get Webhook Endpoint",
      "value": "Get Webhook Endpoint",
      "action": "Retrieve a webhook-endpoint",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-endpoints/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieves a single webhook-endpoint resource.",
      "resource": "Webhooks"
    },
    {
      "name": "Get Webhook Deliveries",
      "value": "Get Webhook Deliveries",
      "action": "List webhook-deliveries",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-deliveries",
          "method": "GET"
        }
      },
      "description": "Returns a paginated list of webhook-deliveries.\n\nTwo formats (i.e. Content-Types) are supported:\n1. the default application/json format ;\n2. a CloudEvent compliant format.",
      "resource": "Webhooks"
    },
    {
      "name": "Post Webhook Deliveries",
      "value": "Post Webhook Deliveries",
      "action": "Ping a webhook-endpoint",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-deliveries",
          "method": "POST"
        }
      },
      "description": "Sends a ping event to a webhook-endpoint in order to test it out.",
      "resource": "Webhooks"
    },
    {
      "name": "Get Webhook Delivery",
      "value": "Get Webhook Delivery",
      "action": "Retrieve a webhook-delivery",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-deliveries/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a webhook-delivery.",
      "resource": "Webhooks"
    },
    {
      "name": "Get Webhook Delivery Attempts",
      "value": "Get Webhook Delivery Attempts",
      "action": "List webhook-delivery-attempts",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-delivery-attempts",
          "method": "GET"
        }
      },
      "description": "Retrieve a paginated list of webhook-delivery-attempts.",
      "resource": "Webhooks"
    },
    {
      "name": "Get Webhook Delivery Attempt",
      "value": "Get Webhook Delivery Attempt",
      "action": "Retrieve a webhook-delivery-attempt",
      "routing": {
        "request": {
          "url": "=/lucca-api/webhook-delivery-attempts/{{$parameter[\"id\"]}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a webhook-delivery-attempt.",
      "resource": "Webhooks"
    }
  ]

npm_readme:
  # @lucca/n8n-nodes-lucca

  This is an n8n community node. It lets you use [Lucca](https://lucca.fr//) in your n8n workflows.

  Lucca is a HRIS solutions designed to automate administrative processes such as leave management, expense reports, time tracking, and employee data.

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

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

  ## Installation

  ### Requirements

  * **n8n**: Version 1.0.0 or later.
  * **mkcert**: For local development with HTTPS (optional but recommended).

  ### Local Development
  1. Clone this repository.
  2. Run `npm install` to install dependencies.
  ```
  # Without https (almost impossible to test webhooks locally)
  npm run dev # Start the n8n server in HTTP mode.
  ```
  ``` 
  # Optionnal but recommended for local development with HTTPS and a tunel:
  set WEBHOOK_URL=https://<your-tunnel-url>
  mkcert -install # Install the local CA (Certificate Authority) in your system trust store.
  npm run cert # Generate a local SSL certificate for localhost (creates cert.pem and key.pem).5
  npm run dev:https # Start the n8n server in HTTPS mode using the generated certificate.
  ```

  ### Install via n8n (Recommended)

  1. Open your n8n instance.
  2. Go to **Settings** > **Community Nodes**.
  3. Click on **Install**.
  4. Enter the package name: `@lucca/n8n-nodes-lucca`.

  ## Operations

  ### Lucca Node
  This node provides a generic interface to the Lucca Public API, allowing you to interact with various resources:
  - **Employees**, **JobPositions**, **Employments**, **Departments**, **LegalEntities**, **BusinessEstablishments**.
  - More resources to come

  ### Lucca Webhooks
  - **Webhook Trigger**: Receive real-time events from Lucca (e.g. department update, employee creation).

  ## Credentials

  This node uses OAuth2 for authentication.

  1. Create an API Key/Application in your Lucca instance (refer to [Lucca documentation](https://developers.lucca.fr/documentation/using-api/authentication#authentication-steps)).
  2. in n8n, create a new credential for **Lucca API**.
  3. Enter your **Lucca Domain** (e.g., `mydomain` for `https://mydomain.ilucca.net`).
  4. Enter your **Client ID** and **Client Secret**.

  ## Compatibility

  Tested with n8n version 2.12.3.

  ## Usage

  This node uses the OpenAPI definition to dynamically generate available operations.

  1. Select the **Lucca** node.
  2. Choose the **Resource** you want to interact with (e.g., Employees, Departments).
  3. Select the **Operation** (e.g., Get by ID, Create).
  4. Fill in the required parameters.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Lucca Developer Portal](https://developers.lucca-hr.com/)
  * [Lucca Website](https://www.lucca-hr.com/)

  ## Technical Details

  This node uses the [`@devlikeapro/n8n-openapi-node`](https://github.com/devlikeapro/n8n-openapi-node) library to bridge n8n with the Lucca API.

  **Why?**
  The Lucca Public API aims to be comprehensive, eventually covering many different domains (Core HR, Leaves, Time, etc.). Developing and maintaining specific n8n operations for hundreds of endpoints manually is not feasible.

  **How?**
  We include the official Open API specification (Swagger) for Lucca in the repository. The `@devlikeapro/n8n-openapi-node` library parses this specification to generate:
  1.  **Node Operations:** All API endpoints are automatically available as operations in the node.
  2.  **UI Parameters:** Input fields for the node are created based on the API parameters and schema.

  This approach ensures that the node stays up-to-date with the API definition and provides full coverage of the available features.

  > [!IMPORTANT]
  > **`@devlikeapro/n8n-openapi-node` is a build-time-only dependency — it is never loaded at runtime.**
  >
  > n8n Cloud does not allow community nodes to ship with runtime dependencies. To comply, the OpenAPI parsing happens at **build time**, not at run time:
  >
  > - **Build time** (`npm run generate`, run as part of `npm run build`): the script in
  >   [`lib/build/generateOpenApiProperties.cts`](lib/build/generateOpenApiProperties.cts) parses the Lucca OpenAPI spec
  >   with `@devlikeapro/n8n-openapi-node` and emits two static files — `nodes/Lucca/openApiProperties.json` and
  >   `nodes/Lucca/parametersOptions.json`. These JSON files are generated artifacts (git-ignored) and are produced
  >   fresh on every build.
  > - **Run time** (inside n8n): `Lucca.node.ts` simply imports those pre-generated JSON files. Neither
  >   `@devlikeapro/n8n-openapi-node` nor `openapi-types` is present in the published package — they live in
  >   `devDependencies` only, so the shipped node has **zero runtime dependencies**.
  >
  > Consequently, the build script lives in `lib/build/` (outside `nodes/`) and uses the `.cts` extension so it is
  > excluded from the n8n community-node lint rules, which forbid third-party imports and Node.js built-ins in node
  > source. If you change the OpenAPI spec, re-run `npm run generate` (or `npm run build`) to regenerate the JSON.

ai_documentation_summary:
  {"purpose":"The Lucca node lets you interact with the Lucca HRIS Public API in n8n workflows, including core HR resources and real-time webhook events. It dynamically exposes API operations based on Lucca's OpenAPI specification.","capabilities":["Access Lucca Public API resources","Work with Employees","Work with JobPositions","Work with Employments","Work with Departments","Work with LegalEntities","Work with BusinessEstablishments","Receive webhook-triggered events from Lucca","Dynamically generate available operations and input fields from OpenAPI spec","Support operations such as Get by ID and Create for exposed resources"],"authentication":"OAuth2 using Lucca API application credentials (Lucca Domain, Client ID, Client Secret)","commonUseCases":["Synchronize employee and department data between Lucca and other systems","Automate HR workflows such as onboarding and employee record updates","Receive and react to Lucca events like employee creation or department updates","Integrate leave management, expense, or time-related HR data into workflows"],"limitations":["Only the resources exposed by the included OpenAPI specification are available","The node is limited to Lucca Public API coverage and more resources are expected to come","Local webhook testing is difficult without HTTPS; mkcert and a tunnel are recommended","Generated API operation metadata must be regenerated after OpenAPI spec changes"],"relatedNodes":["Webhook Trigger","HTTP Request"]}


node_type: @lucca/n8n-nodes-lucca.luccaWebhooks
package_name: @lucca/n8n-nodes-lucca
display_name: Lucca Webhooks
description: Lucca webhooks node
category: Community
development_style: declarative
version: 2
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lucca-front
author_github_url: https://github.com/LuccaSA/n8n-nodes-lucca.git
npm_package_name: @lucca/n8n-nodes-lucca
npm_version: 0.6.0
community_fetched_at: 2026-07-14T14:40:34.581Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # @lucca/n8n-nodes-lucca

  This is an n8n community node. It lets you use [Lucca](https://lucca.fr//) in your n8n workflows.

  Lucca is a HRIS solutions designed to automate administrative processes such as leave management, expense reports, time tracking, and employee data.

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

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

  ## Installation

  ### Requirements

  * **n8n**: Version 1.0.0 or later.
  * **mkcert**: For local development with HTTPS (optional but recommended).

  ### Local Development
  1. Clone this repository.
  2. Run `npm install` to install dependencies.
  ```
  # Without https (almost impossible to test webhooks locally)
  npm run dev # Start the n8n server in HTTP mode.
  ```
  ``` 
  # Optionnal but recommended for local development with HTTPS and a tunel:
  set WEBHOOK_URL=https://<your-tunnel-url>
  mkcert -install # Install the local CA (Certificate Authority) in your system trust store.
  npm run cert # Generate a local SSL certificate for localhost (creates cert.pem and key.pem).5
  npm run dev:https # Start the n8n server in HTTPS mode using the generated certificate.
  ```

  ### Install via n8n (Recommended)

  1. Open your n8n instance.
  2. Go to **Settings** > **Community Nodes**.
  3. Click on **Install**.
  4. Enter the package name: `@lucca/n8n-nodes-lucca`.

  ## Operations

  ### Lucca Node
  This node provides a generic interface to the Lucca Public API, allowing you to interact with various resources:
  - **Employees**, **JobPositions**, **Employments**, **Departments**, **LegalEntities**, **BusinessEstablishments**.
  - More resources to come

  ### Lucca Webhooks
  - **Webhook Trigger**: Receive real-time events from Lucca (e.g. department update, employee creation).

  ## Credentials

  This node uses OAuth2 for authentication.

  1. Create an API Key/Application in your Lucca instance (refer to [Lucca documentation](https://developers.lucca.fr/documentation/using-api/authentication#authentication-steps)).
  2. in n8n, create a new credential for **Lucca API**.
  3. Enter your **Lucca Domain** (e.g., `mydomain` for `https://mydomain.ilucca.net`).
  4. Enter your **Client ID** and **Client Secret**.

  ## Compatibility

  Tested with n8n version 2.12.3.

  ## Usage

  This node uses the OpenAPI definition to dynamically generate available operations.

  1. Select the **Lucca** node.
  2. Choose the **Resource** you want to interact with (e.g., Employees, Departments).
  3. Select the **Operation** (e.g., Get by ID, Create).
  4. Fill in the required parameters.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Lucca Developer Portal](https://developers.lucca-hr.com/)
  * [Lucca Website](https://www.lucca-hr.com/)

  ## Technical Details

  This node uses the [`@devlikeapro/n8n-openapi-node`](https://github.com/devlikeapro/n8n-openapi-node) library to bridge n8n with the Lucca API.

  **Why?**
  The Lucca Public API aims to be comprehensive, eventually covering many different domains (Core HR, Leaves, Time, etc.). Developing and maintaining specific n8n operations for hundreds of endpoints manually is not feasible.

  **How?**
  We include the official Open API specification (Swagger) for Lucca in the repository. The `@devlikeapro/n8n-openapi-node` library parses this specification to generate:
  1.  **Node Operations:** All API endpoints are automatically available as operations in the node.
  2.  **UI Parameters:** Input fields for the node are created based on the API parameters and schema.

  This approach ensures that the node stays up-to-date with the API definition and provides full coverage of the available features.

  > [!IMPORTANT]
  > **`@devlikeapro/n8n-openapi-node` is a build-time-only dependency — it is never loaded at runtime.**
  >
  > n8n Cloud does not allow community nodes to ship with runtime dependencies. To comply, the OpenAPI parsing happens at **build time**, not at run time:
  >
  > - **Build time** (`npm run generate`, run as part of `npm run build`): the script in
  >   [`lib/build/generateOpenApiProperties.cts`](lib/build/generateOpenApiProperties.cts) parses the Lucca OpenAPI spec
  >   with `@devlikeapro/n8n-openapi-node` and emits two static files — `nodes/Lucca/openApiProperties.json` and
  >   `nodes/Lucca/parametersOptions.json`. These JSON files are generated artifacts (git-ignored) and are produced
  >   fresh on every build.
  > - **Run time** (inside n8n): `Lucca.node.ts` simply imports those pre-generated JSON files. Neither
  >   `@devlikeapro/n8n-openapi-node` nor `openapi-types` is present in the published package — they live in
  >   `devDependencies` only, so the shipped node has **zero runtime dependencies**.
  >
  > Consequently, the build script lives in `lib/build/` (outside `nodes/`) and uses the `.cts` extension so it is
  > excluded from the n8n community-node lint rules, which forbid third-party imports and Node.js built-ins in node
  > source. If you change the OpenAPI spec, re-run `npm run generate` (or `npm run build`) to regenerate the JSON.

ai_documentation_summary:
  {"purpose":"Provides n8n integration with Lucca, a HRIS platform, for interacting with Lucca API resources and receiving webhook events. It supports automated workflows around employee data and related HR operations.","capabilities":["Interact with Lucca Public API resources such as Employees","Interact with Lucca Public API resources such as JobPositions","Interact with Lucca Public API resources such as Employments","Interact with Lucca Public API resources such as Departments","Interact with Lucca Public API resources such as LegalEntities","Interact with Lucca Public API resources such as BusinessEstablishments","Receive real-time webhook events from Lucca","Dynamically generate operations and input fields from Lucca's OpenAPI specification"],"authentication":"OAuth2 using Lucca API application credentials: Lucca Domain, Client ID, and Client Secret.","commonUseCases":["Sync employee and organizational data between Lucca and other systems","Trigger workflows when Lucca webhook events occur, such as employee creation or department updates","Automate HR administration tasks using Lucca API data"],"limitations":["The README notes that more resources are coming, so the node does not yet cover all Lucca API domains","OpenAPI-based operations are generated at build time, so changes to the Lucca API specification require regenerating the node artifacts"],"relatedNodes":[]}


node_type: @wasapi/n8n-nodes-wasapi.wasapi
package_name: @wasapi/n8n-nodes-wasapi
display_name: Wasapi
description: Official integration of the Wasapi API for n8n
category: Community
development_style: declarative
version: 2
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: jpabloe
author_github_url: https://github.com/Vinix-Code-Dev/n8n-nodes-wasapi.git
npm_package_name: @wasapi/n8n-nodes-wasapi
npm_version: 4.0.1
community_fetched_at: 2026-07-14T14:40:34.582Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "contact",
      "options": [
        {
          "name": "Agent",
          "value": "agents",
          "action": "Get online agent",
          "description": "Get online agent information"
        },
        {
          "name": "Campaign",
          "value": "campaigns",
          "action": "Manage campaigns",
          "description": "Manage campaigns"
        },
        {
          "name": "Contact",
          "value": "contact",
          "action": "Manage contacts",
          "description": "Manage contacts"
        },
        {
          "name": "Custom Field",
          "value": "customFields",
          "action": "Manage custom fields",
          "description": "Manage custom fields"
        },
        {
          "name": "Label",
          "value": "labels",
          "action": "Manage label",
          "description": "Manage label"
        },
        {
          "name": "User",
          "value": "user",
          "action": "Get user information",
          "description": "Get user information"
        },
        {
          "name": "WhatsApp",
          "value": "whatsapp",
          "action": "Send WhatsApp messages",
          "description": "Send WhatsApp messages and attachments"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many campaigns",
          "description": "Get many campaigns"
        },
        {
          "name": "Get By UUID",
          "value": "getByUuid",
          "action": "Get a campaign by UUID",
          "description": "Get a campaign by UUID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "campaigns"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Add Label",
          "value": "addLabel",
          "action": "Add labels to a contact",
          "description": "Add labels to a contact"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new contact",
          "description": "Create a new contact"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a contact",
          "description": "Delete a contact"
        },
        {
          "name": "Export",
          "value": "export",
          "action": "Export contacts",
          "description": "Export contacts by email"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a contact",
          "description": "Get a contact"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many contacts",
          "description": "Get many contacts"
        },
        {
          "name": "Remove Label",
          "value": "removeLabel",
          "action": "Remove labels from a contact",
          "description": "Remove labels from a contact"
        },
        {
          "name": "Toggle Bot",
          "value": "toggleBot",
          "action": "Toggle bot status for a contact",
          "description": "Toggle bot status for a contact"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a contact",
          "description": "Update a contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many custom fields",
          "description": "Get many custom fields"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new custom field",
          "description": "Create a new custom field"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a custom field",
          "description": "Update a custom field"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a custom field",
          "description": "Delete a custom field"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customFields"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a label",
          "description": "Create a label"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a label",
          "description": "Delete a label"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get a label by ID",
          "description": "Get a label by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many labels",
          "description": "Get many labels"
        },
        {
          "name": "Search by Name",
          "value": "getSearch",
          "action": "Search labels by name",
          "description": "Search labels by name"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a label",
          "description": "Update a label"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "labels"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendMessage",
      "options": [
        {
          "name": "Send Message",
          "value": "sendMessage",
          "action": "Send a text message",
          "description": "Send a text message via WhatsApp"
        },
        {
          "name": "Send Template",
          "value": "sendTemplate",
          "action": "Send a template",
          "description": "Send a template via WhatsApp"
        },
        {
          "name": "Send Attachment",
          "value": "sendAttachment",
          "action": "Send a file or media",
          "description": "Send a file or media via WhatsApp"
        },
        {
          "name": "Send Flow",
          "value": "sendFlow",
          "action": "Send a flow",
          "description": "Send a flow via WhatsApp"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "whatsapp"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get User Information",
          "value": "get",
          "action": "Get user information",
          "description": "Get current user information"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Agents",
          "value": "get",
          "action": "Get online agents",
          "description": "Get online agents"
        },
        {
          "name": "Change Chat Status or Transfer",
          "value": "assignAgent",
          "action": "Change chat status or transfer",
          "description": "Change the status of a chat (open, closed, on hold) or transfer chat to an agent"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "agents"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many campaigns",
      "description": "Get many campaigns",
      "resource": "campaigns"
    },
    {
      "name": "Get By UUID",
      "value": "getByUuid",
      "action": "Get a campaign by UUID",
      "description": "Get a campaign by UUID",
      "resource": "campaigns"
    },
    {
      "name": "Add Label",
      "value": "addLabel",
      "action": "Add labels to a contact",
      "description": "Add labels to a contact",
      "resource": "contact"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new contact",
      "description": "Create a new contact",
      "resource": "contact"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a contact",
      "description": "Delete a contact",
      "resource": "contact"
    },
    {
      "name": "Export",
      "value": "export",
      "action": "Export contacts",
      "description": "Export contacts by email",
      "resource": "contact"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a contact",
      "description": "Get a contact",
      "resource": "contact"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many contacts",
      "description": "Get many contacts",
      "resource": "contact"
    },
    {
      "name": "Remove Label",
      "value": "removeLabel",
      "action": "Remove labels from a contact",
      "description": "Remove labels from a contact",
      "resource": "contact"
    },
    {
      "name": "Toggle Bot",
      "value": "toggleBot",
      "action": "Toggle bot status for a contact",
      "description": "Toggle bot status for a contact",
      "resource": "contact"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a contact",
      "description": "Update a contact",
      "resource": "contact"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many custom fields",
      "description": "Get many custom fields",
      "resource": "customFields"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new custom field",
      "description": "Create a new custom field",
      "resource": "customFields"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a custom field",
      "description": "Update a custom field",
      "resource": "customFields"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a custom field",
      "description": "Delete a custom field",
      "resource": "customFields"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a label",
      "description": "Create a label",
      "resource": "labels"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a label",
      "description": "Delete a label",
      "resource": "labels"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get a label by ID",
      "description": "Get a label by ID",
      "resource": "labels"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many labels",
      "description": "Get many labels",
      "resource": "labels"
    },
    {
      "name": "Search by Name",
      "value": "getSearch",
      "action": "Search labels by name",
      "description": "Search labels by name",
      "resource": "labels"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a label",
      "description": "Update a label",
      "resource": "labels"
    },
    {
      "name": "Send Message",
      "value": "sendMessage",
      "action": "Send a text message",
      "description": "Send a text message via WhatsApp",
      "resource": "whatsapp"
    },
    {
      "name": "Send Template",
      "value": "sendTemplate",
      "action": "Send a template",
      "description": "Send a template via WhatsApp",
      "resource": "whatsapp"
    },
    {
      "name": "Send Attachment",
      "value": "sendAttachment",
      "action": "Send a file or media",
      "description": "Send a file or media via WhatsApp",
      "resource": "whatsapp"
    },
    {
      "name": "Send Flow",
      "value": "sendFlow",
      "action": "Send a flow",
      "description": "Send a flow via WhatsApp",
      "resource": "whatsapp"
    },
    {
      "name": "Get User Information",
      "value": "get",
      "action": "Get user information",
      "description": "Get current user information",
      "resource": "user"
    },
    {
      "name": "Get Agents",
      "value": "get",
      "action": "Get online agents",
      "description": "Get online agents",
      "resource": "agents"
    },
    {
      "name": "Change Chat Status or Transfer",
      "value": "assignAgent",
      "action": "Change chat status or transfer",
      "description": "Change the status of a chat (open, closed, on hold) or transfer chat to an agent",
      "resource": "agents"
    }
  ]

npm_readme:
  <div align="center">
    <img src="public/bannerN8n.webp" alt="Wasapi n8n Integration Banner" width="100%"/>
  </div>

  # 🚀 Official Wasapi Nodes Package for n8n

  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
  [![n8n Community](https://img.shields.io/badge/n8n-Community%20Node-brightgreen)](https://n8n.io)

  > **The most complete Wasapi integration for n8n** - Connect your WhatsApp API workflows with powerful automation capabilities.

  ## 🏢 About Wasapi

  [Wasapi](https://wasapi.io) is an official WhatsApp Business API platform that acts as a **Meta Business Partner**, providing direct and reliable access to the WhatsApp Business API.

  ### ✅ Official Verification
  - **Meta Business Partner** certified
  - **WhatsApp Business API** official provider
  - **24/7 Support** for businesses
  - **Compliance** with Meta policies

  ## 📋 Description

  This n8n node package provides a complete and robust integration with the Wasapi API, allowing you to fully automate your WhatsApp workflows. With over 20 implemented operations, it covers all main Wasapi functionalities, from contact management to message and template sending.

  ### ✨ Key Features

  - 🔄 **Complete Integration**: All Wasapi operations available
  - 📱 **WhatsApp Business API**: Full support for messaging and templates
  - 👥 **Contact Management**: Complete CRUD with custom fields and labels
  - 🤖 **Agent Automation**: Agent assignment and management
  - 📊 **Templates and Flows**: WhatsApp template and flow sending
  - 🛡️ **Robust Validation**: Integrated validators for all data
  - 🚀 **Easy to Use**: Intuitive interface and complete documentation

  ## 🚀 Installation

  ### Option 1: Install from npm (Recommended)
  ```bash
  npm install @wasapi/n8n-nodes-wasapi@latest
  ```

  ### Option 2: Manual Installation
  1. Clone this repository
  2. Install dependencies: `npm install`
  3. Build the project: `npm run build`
  4. Copy the `dist` folder to your n8n installation

  ### Configuration
  1. In n8n, go to **Settings** > **Community Nodes**
  2. Click **Install a community node**
  3. Search for `@wasapi/n8n-nodes-wasapi@latest` or install from npm
  4. Configure your Wasapi credentials in the node

  ## 🔧 Available Operations

  ### Contact Management
  - Create Contact
  - Update Contact
  - Delete Contact
  - Get Contact
  - List Contacts
  - Add Custom Fields
  - Add Labels

  ### WhatsApp Operations
  - Send Message
  - Send Template
  - Send Flow
  - Get Templates
  - Get Flows

  ### Agent Management
  - List Agents
  - Assign Agent
  - Get Agent

  ### Campaign Management
  - Create Campaign
  - List Campaigns
  - Get Campaign

  ## 📄 License

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

  ## 🆘 Support

  - **Documentation**: [n8n Documentation](https://docs.n8n.io/)
  - **Issues**: [GitHub Issues](https://github.com/Vinix-Code-Dev/n8n-nodes-wasapi/issues)
  - **Discussions**: [GitHub Discussions](https://github.com/Vinix-Code-Dev/n8n-nodes-wasapi/discussions)
  - **Wasapi Support**: [Wasapi Help Center](https://ayuda.wasapi.io/es/articles/12292661-integracion-con-n8n)

  ## 🙏 Acknowledgments

  - [n8n](https://n8n.io/) team for the incredible automation platform
  - [Wasapi](https://wasapi.io) for providing their WhatsApp API wrapper
  - All contributors and community members

  ---

  <div align="center">

  **⭐ Give this repository a star if you find it useful! ⭐**

  Developed with ❤️ by **[juanalvarez.pro](https://juanalvarez.pro)**

  [![n8n](https://img.shields.io/badge/n8n-Community%20Node-brightgreen)](https://n8n.io)
  [![Wasapi](https://img.shields.io/badge/Wasapi-API%20Integration-blue)](https://wasapi.io)
  [![Developer](https://img.shields.io/badge/Developer-Juan%20Alvarez-purple)](https://juanalvarez.pro)

  </div>

ai_documentation_summary:
  {"purpose":"Official n8n integration for the Wasapi WhatsApp Business API. It enables automated WhatsApp workflows for contacts, messages, templates, agents, and campaigns.","capabilities":["Create, update, delete, get, and list contacts","Add custom fields and labels to contacts","Send WhatsApp messages, templates, and flows","Retrieve available templates and flows","List, assign, and get agents","Create, list, and get campaigns"],"authentication":"Wasapi credentials required; configure your Wasapi API credentials in n8n","commonUseCases":["Automating WhatsApp message sending and template delivery","Managing WhatsApp contacts with custom fields and labels","Assigning agents and managing campaign workflows"],"limitations":["No specific limitations or missing features are mentioned in the README"],"relatedNodes":[]}


node_type: n8n-nodes-dvelop.dvelopActions
package_name: n8n-nodes-dvelop
display_name: d.velop Actions
description: Execute d.velop Actions.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: phem
author_github_url: https://github.com/d-velop/
npm_package_name: n8n-nodes-dvelop
npm_version: 1.0.10
community_fetched_at: 2026-07-14T14:40:34.583Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "integrationplatform_integrationplatform_GET_DOCUMENT",
      "options": [
        {
          "name": "Download Document",
          "value": "integrationplatform_integrationplatform_GET_DOCUMENT",
          "action": "Downloads the document to the specified document ID",
          "description": "Downloads the specific document"
        },
        {
          "name": "Get Document Info",
          "value": "integrationplatform_integrationplatform_GET_DOCUMENT_INFO",
          "action": "Gets information of a document for the specified document ID",
          "description": "Gets information of a document for the specified document ID"
        },
        {
          "name": "Get User Info",
          "value": "integrationplatform_integrationplatform_GET_USER_INFO",
          "action": "Gets information about the specified user ID",
          "description": "Gets information about the specified user ID"
        },
        {
          "name": "Import Document (d.velop Inbound)",
          "value": "integrationplatform_inbound_CreateInboundBatch",
          "action": "Imports a document via d velop inbound",
          "description": "Imports a document via d.velop inbound"
        }
      ],
      "displayName": "Operation (Stable Action)",
      "placeholder": "Choose an Action",
      "displayOptions": {
        "show": {
          "actionMode": [
            "stable"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Download Document",
      "value": "integrationplatform_integrationplatform_GET_DOCUMENT",
      "action": "Downloads the document to the specified document ID",
      "description": "Downloads the specific document"
    },
    {
      "name": "Get Document Info",
      "value": "integrationplatform_integrationplatform_GET_DOCUMENT_INFO",
      "action": "Gets information of a document for the specified document ID",
      "description": "Gets information of a document for the specified document ID"
    },
    {
      "name": "Get User Info",
      "value": "integrationplatform_integrationplatform_GET_USER_INFO",
      "action": "Gets information about the specified user ID",
      "description": "Gets information about the specified user ID"
    },
    {
      "name": "Import Document (d.velop Inbound)",
      "value": "integrationplatform_inbound_CreateInboundBatch",
      "action": "Imports a document via d velop inbound",
      "description": "Imports a document via d.velop inbound"
    }
  ]

npm_readme:
  # @dvelop/n8n-nodes-dvelop

  This is an n8n community node. It lets you use d.velop documents in your n8n workflows.
  This is a community node and not affiliated with n8n GmbH. Use at your own risk.

  This project provides a gateway for hyperautomation by enabling seamless integration between the d.velop platform (https://www.d-velop.de) and external applications using n8n. The d.velop actions Node allows users to execute d.velop actions directly within n8n workflows, making it possible to automate document management, user operations, and custom process integrations. This enables powerful, flexible, and scalable automation across the entire d.velop ecosystem.

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

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

  ## 1. Installation

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

  ## 2. Operations

  - Download documents automatically
  - Import documents automatically to the DMS
  - Retrieve the metadata from documents
  - Retrieve user information

  ## 3. Credentials

  For every Action Node you want to execute, you need to have your credentials set up. Without them, the API would not have the required information to execute calls.

  <img width="1312" height="746" alt="image" src="https://github.com/user-attachments/assets/fe0a35f7-6bc2-4837-a995-02426ab822e5" />

  **3.1 Base URL**

  - This is just the Base URL of your instance, marked in blue (don't copy the last /)

  <img width="600" height="41" alt="image" src="https://github.com/user-attachments/assets/2e89a2b6-0387-4ab9-8891-3c4090b817f0" />

  **3.2 Authentication Method**

  - The Bearer Token is nothing else except the API key you can find in the d.velop instance configuration, under Login -> API key
  - There you have to create an API key. Keep in mind that the key only shows once, therefore you should save the key somewhere safe. Also keep this key for yourself and do **NOT** hand it out.

  **3.3 Allowed HTTP Request**

  - For the node to work you need to allow the HTTP requests.

  ## 4. Documentation

  To use this node in a workflow you need to open the **Nodes Panel** and search for _d.velop Actions_

  ---

  **4.1 Pick an Action Mode**

  - Here you can choose between 4 stable actions or your volatile actions.

  <img width="564" height="356" alt="image" src="https://github.com/user-attachments/assets/1ec54de7-e1f5-4294-9212-d784db8ac2dd" />

  ---

  **4.2 Stable Actions**

  Stable actions are predefined, and they will always be the same.

  They are the standard features such as:

  - Download a document
  - Get document info
  - Get user info
  - Import document

  ---

  **4.3 Volatile Actions**

  - Volatile actions aren't predefined and differ from d.velop user to user. They are actions that are not hard-coded and aren't a standard.
  - These actions can also be created in the Process Studio script tab, and can be used in this node.

  As an example:

  <img width="431" height="272" alt="image" src="https://github.com/user-attachments/assets/1cdbbc41-5fc8-4e31-9fef-df1055f0b2ab" />

  - Those are standard volatile Salesforce actions, and the Hello_World action is a script from the Process Studio.
  - These actions are dynamic and the payload that they carry isn't displayed.

  ---

  ## 5. Stable Actions in Detail

  This is going to showcase how the stable Actions work in detail.

  ---

  **5.1 Download Document**

  - To set up the download node manually, you just need to fill in the mandatory fields and you are ready to download the file.

  <img width="461" height="486" alt="image" src="https://github.com/user-attachments/assets/befacd4b-82ea-49f7-a901-d0096416a674" />

  - To find out what the _Repository_ string and the _Document_ID_ are, you need to open the document and copy the marked section.

  <img width="1226" height="708" alt="Download_Document" src="https://github.com/user-attachments/assets/ea17fb6d-8fae-4bc9-937d-825eb2a40349" />

  - The output will be displayed on the right side of the node.

  <img width="660" height="353" alt="image" src="https://github.com/user-attachments/assets/22da756b-d62f-4be9-b69d-5524355a9068" />

  **5.1.2 Workflow**

  <img width="2346" height="766" alt="image" src="https://github.com/user-attachments/assets/c2d338be-17e8-4770-8382-1ba075ea4538" />

  **_Webhook_**

  A webhook listens for responses from the Discord bot that has been set up. If the user requests a document, he can fulfill three parameters, two of which are mandatory.

  - Document ID:
  - Repository
  - Email (optional).

  **_AI-Agent_**

  - The Agent connected to the Ollama Chat Model is trained to convert these inputs into a string and filter out the important information.
  - The agent received the following prompt:

  ```bash
  You are a strict extraction engine.

  Your only task is to extract two or three values from the user message:

  - repositoryId
  - documentId
  - Email
  Rules:

  - Output ONLY valid JSON.
  - No explanations.
  - No markdown.
  - No extra text.
  - Always output both keys.
  - If a value is missing, use null.
  - Never invent values.
  - Extract exact values only from the input.

  Output format:

  {
    "repositoryId": "...",
    "documentId": "...",
    "email": "..."
  }
  ```

  **_Code in Java Script_**
  This is a compact code node for custom JavaScript. The node's content is as follows:

  ```bash
  const parsed = JSON.parse($json.output);

  return [
    {
      json: parsed
    }
  ];
  ```

  This small code block is responsible for parsing the string into individual objects. Therefore, they can be used subsequently.

  **_d.velop Actions - Download Document_**

  - This action facilitates the download of the document using the _repository_ and _document ID_.
  - Please note that neither of these is set manually, they are both set using a simple JavaScript expression.

  <img width="507" height="239" alt="image" src="https://github.com/user-attachments/assets/494a7f5e-4ef2-43d5-ab9f-9527a5c95cea" />

  **_IF-Statment_**

  - The IF statement is used to determine whether an email is given.

  <img width="884" height="312" alt="image" src="https://github.com/user-attachments/assets/616035c5-97bb-4bc6-b677-45d71f43d450" />
   
  ***Send a Message - Email = True***

  - The truePath system will send an email when an email exists, containing the data from the d.velop action.

  <img width="754" height="1102" alt="image" src="https://github.com/user-attachments/assets/c4106c48-57ff-430e-b817-4f7eca3077fb" />

  - If the email is successful, the user will receive a Discord verification message confirming the request.

  **_Send a Message - Email = False_**

  - This simply delegates the email aspect, ensuring that the message is transmitted directly to the intended Discord user.

  ---

  **5.2. Get Document Info**

  This action shows all the Information the Document has attached to it, for example:

  - Document ID
  - Document Location (URL)
  - Self Link
  - Delete Link
  - Main content Link
  - PDF Content Link
  - Update Link
  - Update with Content Link
  - Versions Link
  - LAs Modified Date
  - Last Alteration Date
  - Editor ID
  - Editor Name
  - Owner ID
  - Owner Name
  - Document CAption
  - File Name
  - File Type
  - Fike MINE Type
  - Document Number
  - Creation Date
  - File Size
  - Document State
  - Variant Number
  - Last Access Date
  - Document Categoty ID
  - Documnet Category Name
  - Retenition Date
  - Custom Properties
  - Source Categories

  **5.2.1 Setting up the Action**

  - To setup the Node manually, you just need to fill in the mandatory fields and you are ready to get the Document Info.

  <img width="577" height="501" alt="image" src="https://github.com/user-attachments/assets/54410412-5425-4aeb-addf-82db00a9c6ce" />

  - To find out what the _Repository_ string is, you need to open the Document you want to get the Information from, via. the n8n node and copy the red Marked Link section.

  - To identify the _Document ID_ you can, open te Details and Look for Document_Nr. This is also circled with a rectangle

  <img width="1226" height="708" alt="Download_Document" src="https://github.com/user-attachments/assets/ea17fb6d-8fae-4bc9-937d-825eb2a40349" />

  - The output will be Display in the Rightside of the Node:

  <img width="1401" height="878" alt="image" src="https://github.com/user-attachments/assets/360cf720-a709-47a9-a1ab-2b681ced2c20" />

  - This is a lot of JSON, so the whole Output wont be shown.

  **5.2.2 Workflow**

  <img width="3247" height="979" alt="image" src="https://github.com/user-attachments/assets/3a46e88f-11be-48e9-91a9-d9028e5e28b4" />

  **_Webhook_**

  A webhook listens for responses from the Discord bot that has been set up. If the user requests a document, he can fulfill three parameters, two of which are mandatory.

  - Document ID:
  - Repository
  - Specific_Metatada
  - Email (optional).

  **_AI-Agent_**

  - The Agent connected to the Ollama Chat Model is trained to convert these inputs into JSON and filter out the important information.
  - The agent received the following prompt:

  ```bash
  You are a strict extraction engine.

  Your only task is to extract the following values from the USER MESSAGE ONLY:

  repositoryId

  documentId

  email

  Metadata_Specific (user requested metadata fields)

  CRITICAL OUTPUT RULES:

  Output EXACTLY one valid JSON object.

  The output MUST start with { and MUST end with }.

  Do NOT output anything before {.

  Do NOT output anything after }.

  Do NOT output explanations.

  Do NOT output markdown.

  Do NOT output text outside the JSON.

  The JSON MUST be complete and properly closed.

  EXTRACTION RULES:

  Never invent values.

  Extract exact values only from the USER MESSAGE.

  Do NOT extract values from system data, API responses, or metadata objects.

  Only extract what the USER explicitly writes.

  METADATA RULES:

  Metadata = true if the user requests metadata.

  Metadata = false if the user does NOT request metadata.

  Metadata_Specific = null if the user did not request specific metadata fields.

  Metadata_Specific = array of strings if specific metadata fields are requested.

  If Metadata_Specific is not null, Metadata MUST be true.

  If a value is missing, use null.

  OUTPUT FORMAT (STRICT SCHEMA):

  {
  "repositoryId": "...",
  "documentId": "...",
  "email": "...",
  "Metadata_Specific": "..."
  }
  ```

  **_Code in Java Script_**

  This is a compact code node for custom JavaScript. The node's content is as follows:

  ```bash
  const parsed = JSON.parse($json.output);

  return [
    {
      json: parsed
    }
  ];
  ```

  This small code block is responsible for parsing the string into individual objects. Therefore, they can be used subsequently.

  **_d.velop Actions - Get Document Information_**

  - This action facilitates the download of the document using the _repository_ and _document ID_.
  - Please note that neither of these is set manually, they are both set using a simple JavaScript expression.

  <img width="1540" height="217" alt="image" src="https://github.com/user-attachments/assets/d0e253e9-da49-42b3-8099-3ff7f7e6434b" />

  **_AI-Agent1_**

  - This Agent is responsible for Filtering out the Information that the _Get Document Information_ is providing.
  - The Promt the the AI got is filled with all the Metadata that the Action Produces, so the AI has access to it
  - If the `{{ $('Code in JavaScript').item.json.Metadata_Specific[0] }}` is set to _null_ the whole Metadata conerning the document will be shown
    The Prompt:

  ```bash
  You are a metadata summarization engine.

  Your task is to summarize metadata values coming from the node input.

  The metadata source is:

  {{ $json.response.sourceProperties[0].key }} : {{ $json.response.sourceProperties[0].value }},
  {{ $json.response.sourceProperties[2].key }} : {{ $json.response.sourceProperties[2].displayValue }},
  {{ $json.response.sourceProperties[3].key }} : {{ $json.response.sourceProperties[3].value }},
  {{ $json.response.sourceProperties[4].key }} : {{ $json.response.sourceProperties[4].value }},
  {{ $json.response.sourceProperties[5].key }} : {{ $json.response.sourceProperties[5].value }},
  {{ $json.response.sourceProperties[6].key }} : {{ $json.response.sourceProperties[6].value }},
  {{ $json.response.sourceProperties[7].key }} : {{ $json.response.sourceProperties[7].value }},
  {{ $json.response.sourceProperties[8].key }} : {{ $json.response.sourceProperties[8].value }},
  {{ $json.response.sourceProperties[9].key }} : {{ $json.response.sourceProperties[9].value }},
  {{ $json.response.sourceProperties[10].key }} : {{ $json.response.sourceProperties[10].value }},
  {{ $json.response.sourceProperties[11].key }} : {{ $json.response.sourceProperties[11].value }},
  {{ $json.response.sourceProperties[12].key }} : {{ $json.response.sourceProperties[12].value }},
  {{ $json.response.sourceProperties[13].key }} : {{ $json.response.sourceProperties[13].value }},
  {{ $json.response.sourceProperties[14].key }} : {{ $json.response.sourceProperties[14].value }},
  {{ $json.response.sourceProperties[15].key }} : {{ $json.response.sourceProperties[15].value }},
  {{ $json.response.sourceProperties[16].key }} : {{ $json.response.sourceProperties[16].value }},
  {{ $json.response.sourceProperties[17].key }} : {{ $json.response.sourceProperties[17].value }},
  {{ $json.response.sourceProperties[18].key }} : {{ $json.response.sourceProperties[18].value }},
  {{ $json.response.sourceProperties[19].key }} : {{ $json.response.sourceProperties[19].displayValue }},
  {{ $json.response.sourceProperties[20].key }} : {{ $json.response.sourceProperties[20].value }},
  {{ $json.response.sourceProperties[21].key }} : {{ $json.response.sourceProperties[21].value }},
  {{ $json.response.sourceProperties[22].key }} : {{ $json.response.sourceProperties[22].value }},
  {{ $json.response.sourceProperties[23].key }} : {{ $json.response.sourceProperties[23].value }};

  User requested specific metadata:

  {{ $('Code in JavaScript').item.json.Metadata_Specific }}

  Rules:
  If Metdata is = null : {{ $('Code in JavaScript').item.json.Metadata_Specific[0] }}
  Print out Everything


  If Metadata_Specific is set: {{ $('Code in JavaScript').item.json.Metadata_Specific[0] }}

  Only summarize the requested metadata fields.

  Ignore all other metadata.

  If Metadata_Specific is null:

  Summarize ALL metadata fields.

  Only use the metadata provided above.

  Do NOT invent metadata.

  Do NOT explain anything.



  Output only the summary.
  ```

  **_IF-Statment_**

  - The IF statement is used to determine whether an email is given.

  <img width="884" height="312" alt="image" src="https://github.com/user-attachments/assets/616035c5-97bb-4bc6-b677-45d71f43d450" />
   
  ***Send a Message - Email = True***

  - The truePath system will send an email when an email exists, containing the data from Agents Output.

  <img width="768" height="705" alt="image" src="https://github.com/user-attachments/assets/38c78569-f2ab-406d-aaab-fa943bef0641" />

  - If the email is successful, the user will receive a Discord verification message confirming the request.

  <img width="1472" height="199" alt="image" src="https://github.com/user-attachments/assets/e884ae8e-6656-447b-b8d5-fd912bac9f9b" />

  **_Send a Message - Email = False_**

  - This simply delegates the email aspect, ensuring that the message is transmitted directly to the intended Discord user.

  **5.3. Get User Info**

  This action displays all the information associated with the user. Please find below a list of all the functions that this action returns:

  - getUserId – Returns the unique internal user ID
  - getExternalId – Returns the external user ID (if available)
  - getUserName – Returns the user's login username
  - getDisplayName – Returns the user's full display name
  - getGivenName – Returns the user's first name
  - getFamilyName – Returns the user's last name
  - getFormattedName – Returns the user's formatted full name
  - getPrimaryEmail – Returns the user's primary email address
  - getEmails – Returns all email addresses of the user
  - getProfileUrl – Returns the user's profile URL
  - getUserTitle – Returns the user's job title or position
  - getPhotos – Returns the user's profile photo information
  - getPhoneNumbers – Returns the user's phone numbers
  - getGroups – Returns all groups the user belongs to
  - getGroupIds – Returns the IDs of the user's groups
  - getGroupDisplayNames – Returns the names of the user's groups

  **5.3.1 Setting up the Action**

  - To set this Action up you just need the User_ID.

  <img width="580" height="421" alt="image" src="https://github.com/user-attachments/assets/21f70d38-d286-4653-b31a-b240af5f15fc" />

  - To Acquire the User_ID of a DMS User, you need to go in to the Configuration -> Administration -> User account and group management
  - From there you just need to click the User you want the ID From, and Copy the red marked section from the URL

  <img width="1047" height="781" alt="Screenshot 2026-02-19 110016" src="https://github.com/user-attachments/assets/ddb2a6bb-e8cd-48ec-ac35-dce8445d0b8a" />

  The output will be Displayed on the Output Tab:

  <img width="1365" height="1142" alt="image" src="https://github.com/user-attachments/assets/6311374e-0825-42fd-bb55-cb9887a3128f" />

  **5.3.2 Workflow**

  - This Workflow is a bit bigger and also Includes 2 Other Actions and a d.velop custom API Call. The _Get User Info_ Action cant be utilized to demonstrate a good Usecase alone.
    Senariao:

  If a User of the DMS Wants to download a specific Document, the Owner of that Document gets a E-Mail. To Approve or denie the Download request.

  <img width="2956" height="557" alt="image" src="https://github.com/user-attachments/assets/befc8b7b-da82-4a9d-935e-d3e1d165fd4a" />

  **_Webhook_**

  A webhook listens for responses from the Discord bot that has been set up. If the user requests a document, he can fulfill 2 parameters, both of them are mandatory:

  - Document ID
  - Repository

  **_AI-Agent_**

  - The Agent connected to the Ollama Chat Model is trained to convert these inputs into a string and filter out the important information.
  - The agent received the following prompt:

  ```bash
  You are a strict extraction engine.

  Your only task is to extract two or three values from the user message:

  - repositoryId
  - documentId
  Rules:

  - Output ONLY valid JSON.
  - No explanations.
  - No markdown.
  - No extra text.
  - Always output both keys.
  - If a value is missing, use null.
  - Never invent values.
  - Extract exact values only from the input.

  Output format:

  {
    "repositoryId": "...",
    "documentId": "...",
  }
  ```

  **_Code in Java Script_**
  This is a compact code node for custom JavaScript. The node's content is as follows:

  ```bash
  const parsed = JSON.parse($json.output);

  return [
    {
      json: parsed
    }
  ];
  ```

  This small code block is responsible for parsing the string into individual objects. Therefore, they can be used subsequently.

  **_d.velop Actions - Get Document Info_**

  - Here the repository and the Document ID's are enterd with a Statment
  - This node is Important because here you can get the DisplayValue from the Document Owner. This will be Utalised in the netxt node

  <img width="764" height="512" alt="image" src="https://github.com/user-attachments/assets/71184366-cf57-419a-baf5-fbf6512bedfd" />

  **_HTTP-Request_**

  - THis node is Basicly just a Custom api Call to the identityprivider API
  - The Variable is the Name of the Document Owner

    ```bash
    https://connect-for-n8n-test.d-velop.cloud/identityprovider/scim/users?filter=DisplayName eq "{{ $json.response.sourceProperties[2].displayValue }}"
    ```

  <img width="582" height="798" alt="image" src="https://github.com/user-attachments/assets/89d28697-57cb-4672-ba8d-975a056bb07a" />

  - If you run this call, you can get the ID, of the Document Owner

  **_d.velop Actions - Get User Info_**

  - In this Node the User_ID is being user to get the E-Mail from the Document Owner

  <img width="506" height="437" alt="image" src="https://github.com/user-attachments/assets/0aa9cc64-2108-4bc3-a314-88c36e42a3e2" />

  **_G-Mail Send a Message_**

  - With the E-Mail we got from the _Get User Info_ Action, we now can send a Approve request to the Document Owner
  - Tis E-Mail also Displays who is Requesting this Document

  <img width="495" height="698" alt="image" src="https://github.com/user-attachments/assets/7d2a6769-4a80-4b18-8544-f64527e4dc48" />

  **_IF True - Approved_**

  - If the Document Owner Approved the download the Workflow procceds to Download the Document using the _Download Document_ Action.

  <img width="500" height="560" alt="image" src="https://github.com/user-attachments/assets/33d896c6-4f6e-47eb-86f6-133d3e5c3d05" />

  - And the Discord Bot replies to the User who sent the request with the File attatched to the Message.

  <img width="492" height="1034" alt="image" src="https://github.com/user-attachments/assets/5f09b25d-80b0-418f-9fd7-6f7b6e761129" />

  **_IF False - Denied_**

  - If the Download Request was denied by the Owner, the bot sends a message that you request was denied.

  <img width="496" height="691" alt="image" src="https://github.com/user-attachments/assets/d8e9a75d-aae9-41fd-89a5-5297dc30d144" />

  ---

  **5.4. Import Document**

  This Action Allows you to Upload files directly to your DMS, using d.velop Inbound.
  The Action does not return Any Values, it just Uploads Files, so they can be Indexed.

  **5.4.1 Setting up the Wokflow**

  - To work with this Action, you need a Minimal Workflow:

  <img width="1423" height="536" alt="image" src="https://github.com/user-attachments/assets/1d0ccf5e-7a87-4e46-aa5f-de8c63943809" />

  - In order to Upload a file with the d.velop Action, you need a File in your Workflow.
  - As an small example the _"Read/Write Files from Disk"_ Node is Used to get a file in to the Workflow.

  **5.4.2 Setting up the Node**

  - This node in Paticular has an Input from The node before

  <img width="1162" height="753" alt="image" src="https://github.com/user-attachments/assets/3adb6883-d02f-4c18-9089-064a53aaa0ef" />

  **File Name**

  - The File name can either be set manually every Time, or you write a simple Java Script Expression:

    ```bash
    {{ $json.fileName }}
    ```

    **File Source**

  - When configuring the node, set the File Source to From N8n Binary. This means the file will be taken from the binary data of a previous node in your workflow.
  - Alternatively, you can use From Base64/String as the File Source. This option allows you to upload a file using its Base64-encoded content instead of binary data.

  **Input Binary Property**

  - The Input Binary Property defines the name of the binary field that contains the file. In most cases, this property is called: binary.

  **Import Profile**

  - In order to get the Import Profile you need to navigate to _configuration_ -> _Document Managment_ -> _Import_ -> _Importoption_ -> _Importprofile_

  <img width="1076" height="599" alt="image" src="https://github.com/user-attachments/assets/8bac4b1c-b63d-418c-b9a4-66be1800e3e8" />

  - In this setting you can Copy the red Marked _Import Profile_

  **5.4.3 DMS Inbound**

  - This action submits a file to d.velop Inbound for automatic import into the Document Management System (DMS).
  - Unlike the Download Document action, this action does not return any document data, it sends the file to d.velop and lets the configured import profile handle archiving and indexing.

  ## 6. Volatile Action in Detail

  - The following is an instructional guide to setting up volatile actions and loading the payload correctly.

  **6.1. Choose from your Actions**

  <img width="730" height="653" alt="image" src="https://github.com/user-attachments/assets/dff6ac75-d274-4e18-ac10-081af5e83ae0" />

  - If you chose your action you need to fill the Payload

  **6.2. Payload of an Action**

  - To ascertain the payload of an action, it is necessary to utilize an _API client_, such as _Bruno_. -> https://www.usebruno.com
  - To retrieve all volatile actions, run this API call with the _base URL_ and the _API key (token)_.
    <img width="556" height="240" alt="image" src="https://github.com/user-attachments/assets/cb0dbcce-4425-4fcc-906d-b3a643f2d430" />

  - If you execute this API call, you will receive a list of all the volatile actions.
  - In terms of testing, we will examine the Salesforce_getRecord action.

  ```bash
  {
      "id": "salesforce_get-record",
      "display_name": "Salesforce - Get Record",
      "tags": null,
      "description": "This operation gets a record.",
      "endpoint": "/actions/api/execute/salesforce_get-record",
      "execution_mode": "Synchron",
      "input_properties": [
        {
          "id": "objectApiName",
          "type": "String",
          "title": "Object API Name",
          "description": "",
          "required": true,
          "visibility": "Standard",
          "initial_value": "",
          "object_properties": null,
          "fixed_value_set": null,
          "data_query_url": "",
          "data_query_parameter": null
        },
        {
          "id": "recordId",
          "type": "String",
          "title": "Record ID",
          "description": "",
          "required": true,
          "visibility": "Standard",
          "initial_value": "",
          "object_properties": null,
          "fixed_value_set": null,
          "data_query_url": "",
          "data_query_parameter": null
        },
        {
          "id": "orgUrl",
          "type": "String",
          "title": "Salesforce Org URL",
          "description": "",
          "required": true,
          "visibility": "Advanced",
          "initial_value": "",
          "object_properties": null,
          "fixed_value_set": null,
          "data_query_url": "/salesforce/process/actions/values/orgs",
          "data_query_parameter": null
        }
      ],
      "output_properties": [
        {
          "id": "record",
          "type": "Object",
          "title": "Record",
          "description": "",
          "object_properties": null
        }
      ],
      "volatile": true
  ```

  - The payload consists of the _input_properties_. So in this instance the payload is:

  ```bash
  {
    "objectApiName": "Account",
    "recordId": "001XXXXXXXXXXXXXXX",
    "orgUrl": "https://your-org.salesforce.com"
  }
  ```

  **6.3 Assamble the Node**

  - The last step is to Paste the Payload in the Node of your desire, fill the properties wirh values and Execute the Node!

  <img width="939" height="577" alt="image" src="https://github.com/user-attachments/assets/3811a0fe-15e3-4093-93a5-c5f5d2ffd0cb" />

  ## 7. Error codes

  - This section describes the most common error code that may occur when using the d.velop Actions Node

  **7.1 Authentication Errors**

  | Error Code | Message      | Cause                           | Solution                          |
  | ---------- | ------------ | ------------------------------- | --------------------------------- |
  | 401        | Unauthorized | Invalid or missing Bearer Token | Verify API key in credentials     |
  | 403        | Forbidden    | Insufficient permissions        | Check user permissions in d.velop |
  | 400        | Bad Request  | Invalid Base URL or headers     | Verify Base URL and credentials   |

  Example response:

  ```bash
  {
    "error": "Unauthorized"
  }
  ```

  **7.2 Document Errors**

  | Error Code | Message              | Cause                   | Solution                 |
  | ---------- | -------------------- | ----------------------- | ------------------------ |
  | 404        | Document not found   | Invalid document ID     | Verify document ID       |
  | 404        | Repository not found | Invalid repository ID   | Verify repository string |
  | 400        | Invalid parameters   | Missing required fields | Check node configuration |

  **7.3 Import Errors**

  | Error Code | Message                | Cause                 | Solution                     |
  | ---------- | ---------------------- | --------------------- | ---------------------------- |
  | 400        | Invalid import profile | Wrong import profile  | Verify import profile        |
  | 400        | Missing binary data    | Binary property empty | Verify input binary property |
  | 413        | Payload too large      | File too large        | Reduce file size             |

  **7.4 Volatile Action Errors**

  | Error Code | Message               | Cause                  | Solution                 |
  | ---------- | --------------------- | ---------------------- | ------------------------ |
  | 400        | Invalid payload       | Missing payload fields | Verify payload structure |
  | 404        | Action not found      | Invalid action ID      | Verify action exists     |
  | 500        | Internal server error | Server-side issue      | Check d.velop system     |

  ## Compatibility

  Tested with n8n@2.12.1.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [d.velop Homepage](https://www.d-velop.de)
  - [d.velop Support](support@d-velop.de)

ai_documentation_summary:
  {"purpose":"Executes d.velop actions directly within n8n workflows to automate document management, user operations, and custom process integrations. It serves as a gateway between the d.velop platform and external applications.","capabilities":["Download documents","Import documents into the DMS","Retrieve document metadata","Retrieve user information","Execute stable predefined actions","Execute volatile/dynamic actions created in Process Studio"],"authentication":"API key required (used as a Bearer Token); requires the d.velop instance Base URL and allowing HTTP requests","commonUseCases":["Automatically download documents from d.velop","Automatically import documents into the DMS","Fetch document metadata in workflows","Look up user information from d.velop","Trigger custom d.velop process actions from n8n"],"limitations":["Volatile actions are user-specific and not predefined","Payload for volatile actions is dynamic and not displayed","Requires HTTP requests to be allowed for the node to work","API key is shown only once when created"],"relatedNodes":[]}


node_type: @mibo-ai/n8n-nodes-mibo-testing.miboTesting
package_name: @mibo-ai/n8n-nodes-mibo-testing
display_name: Mibo Testing
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: fpmirabile
author_github_url: https://github.com/mibo-ai/mibo-testing-n8n-node.git
npm_package_name: @mibo-ai/n8n-nodes-mibo-testing
npm_version: 1.0.3
community_fetched_at: 2026-07-14T14:40:34.584Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Capture every executed workflow node and send a canonical trace to Mibo Testing for semantic and procedural testing

npm_readme:
  # n8n-nodes-mibo-testing

  n8n community node for **Mibo Testing** - a platform for semantic and procedural testing of AI workflows.

  [![npm](https://img.shields.io/npm/v/@mibo-ai/n8n-nodes-mibo-testing)](https://www.npmjs.com/package/@mibo-ai/n8n-nodes-mibo-testing)

  - **Canonical OTEL-shaped trace**: emits one span per executed workflow node in the Mibo Custom API shape (`{spans: [...]}`), the same shape the dashboard renders. Works on **n8n Cloud and self-hosted** — no OTel SDK, no exporter, no host-level config.
  - **Automatic workflow capture**: discovers every executed node via the n8n API (when credentials carry an n8n API key) or via an upstream `Get Workflow` node. Auto-utility nodes (`stickyNote`, `noOp`, `wait`, …) are excluded.
  - **Parent linking**: `parent_span_id` follows the n8n connection graph so traces render as the workflow structure.
  - **Request-id correlation**: sets `x-request-id` from the manual override, then from incoming webhook headers, falling back to the n8n execution id.
  - **Passthrough**: input items pass through unchanged; only a `_miboTrace` summary is appended.

  > New here? Start with the [Quick Start Guide](./docs/quick-start.md) — 30-second setup plus troubleshooting for the most common errors (payload too large, wrong node names, API key issues).

  ## Installation

  ### Community Nodes (Recommended)

  1. Go to **Settings > Community Nodes** in your n8n instance
  2. Search for `@mibo-ai/n8n-nodes-mibo-testing`
  3. Click **Install**

  ### Manual Installation

  ```bash
  npm install @mibo-ai/n8n-nodes-mibo-testing
  ```

  Then restart your n8n instance.

  ## Configuration

  ### Credentials

  Create a new credential of type **Mibo Testing API** with the following fields:

  | Field | Required | Description |
  |-------|----------|-------------|
  | **API Key** | Yes | Your Mibo Testing API key. Find it in your Mibo Testing dashboard under **Settings > API Keys**. |
  | **n8n API Key** | No | Your n8n instance API key. Enables automatic workflow node detection without needing a separate "Get Workflow" node. To create one: open n8n, go to **Settings > API**, and click **Create an API Key**. The key only needs the **workflow:read** scope. |
  | **n8n API URL** | No | The URL of your n8n instance's REST API. Defaults to `http://localhost:5678/api/v1`, which works for most setups since the node runs inside n8n itself. Change only for n8n Cloud or custom deployments. |

  ### Node Setup

  Add the **Mibo Testing** node at the end of your workflow (or wherever you want to capture the trace). It always captures every executed node in the workflow — there are no filters or manual node lists to maintain.

  The node needs to know which nodes the workflow contains. It supports two sources, tried in this order:

  1. **n8n REST API (recommended)** — set **n8n API Key** in the credentials. Works out of the box on both n8n Cloud and self-hosted.
  2. **Upstream `Get Workflow` node** — connect an n8n `Get Workflow` node before the Mibo Testing node; its `nodes` and `connections` output are used as the fallback source.

  ```
  With n8n API credentials:
  [Trigger] --> [Your Nodes] --> [Mibo Testing]

  Without n8n API credentials:
  [Trigger] --> [Your Nodes] --> [Get Workflow] --> [Mibo Testing]
  ```

  If neither source is available, the node errors with a link to <https://docs.mibo-ai.com/n8n-node/setup/>.

  ### Node Parameters

  | Parameter | Description |
  |-----------|-------------|
  | **Agent ID** | Your agent UUID in Mibo Testing. Leave empty if the API key is already scoped to a single agent. |
  | **Request ID** | Override the `x-request-id` used to correlate this trace. Defaults to the incoming webhook header, falling back to the n8n execution id. |
  | **Include Metadata** | Add environment, version, and custom fields to the trace metadata. |

  ### Advanced Options

  | Option | Default | Description |
  |--------|---------|-------------|
  | Timeout (Seconds) | 30 | Maximum time to wait for the Mibo Testing server to respond. |

  ## Output

  The node passes through all input data unchanged, adding a `_miboTrace` object to each item:

  ```json
  {
    "original_field": "preserved",
    "_miboTrace": {
      "sent": true,
      "traceId": "abc-123",
      "platformId": "550e8400-...",
      "requestId": "req-456",
      "timestamp": "2026-03-08T10:30:00.000Z",
      "spansSent": 3,
      "payloadSize": "12.5 KB"
    }
  }
  ```

  ## Trace shape

  The node POSTs to `POST /public/traces` using the Mibo **Custom API** shape:

  ```json
  {
    "spans": [
      {
        "span_id": "<uuid>",
        "parent_span_id": null,
        "name": "Webhook",
        "attributes": {
          "n8n.node.type": "n8n-nodes-base.webhook",
          "n8n.node.status": "success",
          "n8n.node.output": "{\"body\":\"hi\"}"
        }
      },
      {
        "span_id": "<uuid>",
        "parent_span_id": "<webhook-span-id>",
        "name": "AI Agent",
        "attributes": {
          "n8n.node.type": "@n8n/n8n-nodes-langchain.agent",
          "n8n.node.status": "success",
          "n8n.node.output": "{\"output\":\"reply\"}"
        }
      }
    ],
    "externalMetadata": { "workflowId": "..." },
    "metadata": { "workflowId": "...", "workflowName": "...", "timestamp": "..." },
    "platformId": "<optional>"
  }
  ```

  `span.name` is the **n8n display name** of the node — the same string you see in the n8n editor and the same string Mibo `node_call` assertions match against. Identity (the `externalId` Mibo uses for create-or-replace correlation) is sent via the `x-request-id` HTTP header, not in the body. See <https://docs.mibo-ai.com/n8n-node/setup/> for the full reference.

  ---

  ## Development

  ### Prerequisites

  - Node.js >= 20
  - pnpm >= 10
  - Docker (for the default dev flow)

  ### Setup

  ```bash
  git clone https://github.com/mibo-ai/mibo-testing-n8n-node.git
  cd mibo-testing-n8n-node
  pnpm install
  ```

  ### Development

  The default dev flow runs n8n in Docker — no global installs needed.

  ```bash
  pnpm run dev
  ```

  Builds the node, starts n8n in Docker, and watches for source changes. Open http://localhost:5678 — reload the workflow in n8n to pick up rebuilt code.

  If you prefer running n8n directly on your machine (requires `n8n` installed globally):

  ```bash
  pnpm run dev:local
  ```

  ---

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Captures executed n8n workflow nodes and sends a canonical OTEL-shaped trace to Mibo Testing for semantic and procedural testing of AI workflows. It works in both n8n Cloud and self-hosted setups and passes workflow items through unchanged while appending trace metadata.","capabilities":["Emits one span per executed workflow node in Mibo Custom API trace format","Automatically discovers workflow nodes via the n8n REST API using an n8n API key","Falls back to an upstream Get Workflow node to obtain nodes and connections","Builds parent-child span relationships from the n8n connection graph","Correlates traces using x-request-id from manual override, webhook header, or execution ID","Excludes auto-utility nodes such as stickyNote, noOp, and wait","Optionally includes environment, version, and custom metadata","Passes input items through unchanged with a _miboTrace summary appended"],"authentication":"Requires a Mibo Testing API key. Optional n8n API key with workflow:read scope can be provided for automatic workflow discovery; otherwise an upstream Get Workflow node is needed. n8n API URL is configurable.","commonUseCases":["Sending workflow execution traces to Mibo Testing for AI workflow semantic/procedural testing","Capturing end-to-end node execution for debugging and validation","Testing workflow structure and node call assertions against recorded traces","Correlating workflow executions with request IDs from webhooks or execution IDs"],"limitations":["If neither an n8n API key nor an upstream Get Workflow node is available, the node errors","Only executed workflow nodes are captured; auto-utility nodes are excluded","The node is designed for trace emission and does not modify input items beyond adding _miboTrace","Large payloads may cause issues, as noted in the Quick Start troubleshooting"],"relatedNodes":["n8n Get Workflow","Webhook"]}


node_type: @polotno/n8n-nodes-polotno-studio.polotnoStudioTrigger
package_name: @polotno/n8n-nodes-polotno-studio
display_name: Polotno Studio Trigger
description: Starts the workflow when a Polotno Studio render completes or fails
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lavrton
author_github_url: https://github.com/polotno-project/n8n-nodes-polotno-studio.git
npm_package_name: @polotno/n8n-nodes-polotno-studio
npm_version: 0.2.3
community_fetched_at: 2026-07-14T14:40:34.585Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # @polotno/n8n-nodes-polotno-studio

  This is an n8n community node. It lets you render images and videos from your
  [Polotno Studio](https://polotno.com/studio) templates in your n8n workflows.

  Polotno Studio is a content-automation platform that turns design templates into
  on-brand images and videos via a simple API. This package adds a node to fill a
  template's dynamic fields and render it, plus a trigger that fires when a render
  completes.

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

  [Installation](#installation) · [Credentials](#credentials) · [Operations](#operations) · [Trigger](#trigger) · [Usage](#usage) · [Resources](#resources)

  ## Installation

  Follow the [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/)
  and use the package name `@polotno/n8n-nodes-polotno-studio`.

  ## Credentials

  You need a **project API key** from Polotno Studio. To find it, sign in to
  [Polotno Studio](https://polotno.com/studio), open the editor, open the project
  selector, click **Manage projects**, and copy the API key for your project.
  Keys start with `key_live_`.

  Create a **Polotno Studio API** credential and paste the key. n8n validates the
  key when you save the credential.

  ## Operations

  The **Polotno Studio** node has three resources:

  ### Image → Render

  Renders an image from a template.

  1. Pick a **Template** (search by name, paste a `tpl_…` ID, or paste a template URL).
  2. The template's **Fields** load automatically as typed inputs (text, image URL,
     color, toggle, …). Map values from earlier nodes or type them directly.
  3. Optionally set **Format** (PNG/JPEG/PDF), **Transparent**, and **Pixel Ratio**.
  4. **Wait for Completion** is on by default: the node waits for the render and
     outputs the final `image_url`. Turn it off to return the job immediately and
     continue via the trigger.

  ### Video → Render

  Renders a video (MP4/GIF) from a template. Same template + fields flow as images,
  plus **FPS** and **Duration**. Video renders are billed as `ceil(duration)`
  credits (1 per second; FPS does not affect cost) and can take longer — for long
  videos, turn **Wait for Completion** off and use the **Polotno Studio Trigger**
  instead.

  ### Image / Video → Get

  Fetches an existing render by its ID (`img_…` / `vid_…`) and returns its current
  state, including `image_url` / `video_url` once `status` is `completed`. Use this
  to retrieve a result from an **async** render (Render with *Wait for Completion*
  off, which returns only an `id`), to re-fetch what a webhook referenced, or to
  re-check a render that exceeded the wait window.

  ### Template → Get / Get Many

  List templates in your project (with optional **Name**, **Tag**, and archived
  filters) or fetch a single template by ID.

  ## Trigger

  The **Polotno Studio Trigger** starts a workflow when a render finishes. On
  activation it registers a webhook subscription with Polotno Studio; on
  deactivation it removes it. Choose which events to listen for:

  - `image.completed` / `image.failed`
  - `video.completed` / `video.failed`

  The event's payload object (the completed image or video) is emitted as the
  workflow item.

  ## Usage

  A common pattern:

  1. A trigger (e.g. a new row in a sheet) starts the workflow.
  2. **Polotno Studio → Image → Render**: choose a template, map the row's columns
     onto the template fields, keep **Wait for Completion** on.
  3. Use the returned `image_url` in the next step (post to social, email, upload, …).

  For high-volume or long video pipelines, render with **Wait for Completion** off
  and let the **Polotno Studio Trigger** continue the flow when each render
  completes.

  ## Compatibility

  Requires n8n 1.x. Tested against current n8n community-node tooling
  (`@n8n/node-cli`).

  ## Resources

  - [Polotno Studio API documentation](https://polotno.com/docs/overview)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when a Polotno Studio render completes or fails. The package also supports rendering images and videos from Polotno Studio templates and fetching template/render details.","capabilities":["Trigger workflow on image.completed, image.failed, video.completed, and video.failed events","Render images from Polotno Studio templates with dynamic fields","Render videos from Polotno Studio templates with FPS and duration settings","Wait for render completion or return an async job ID for later processing","Get the status and result of existing image or video renders by ID","List templates or fetch a single template by ID"],"authentication":"Project API key required (Polotno Studio API credential using a key_live_... project API key)","commonUseCases":["Continue a workflow automatically when a Polotno Studio render finishes","Generate branded images or videos from templates using data from earlier workflow steps","Handle long-running or high-volume video renders asynchronously with a trigger","Retrieve completed render URLs for posting, emailing, or uploading"],"limitations":["Video renders are billed as ceil(duration) credits; FPS does not affect cost","Long video renders may exceed the wait window, requiring async handling with the trigger","Template and render operations depend on Polotno Studio template IDs or URLs"],"relatedNodes":["Polotno Studio","Polotno Studio Trigger"]}


node_type: @polotno/n8n-nodes-polotno-studio.polotnoStudio
package_name: @polotno/n8n-nodes-polotno-studio
display_name: Polotno Studio
description: Render images and videos from Polotno Studio templates
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: lavrton
author_github_url: https://github.com/polotno-project/n8n-nodes-polotno-studio.git
npm_package_name: @polotno/n8n-nodes-polotno-studio
npm_version: 0.2.3
community_fetched_at: 2026-07-14T14:40:34.586Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "image",
      "options": [
        {
          "name": "Image",
          "value": "image"
        },
        {
          "name": "Template",
          "value": "template"
        },
        {
          "name": "Video",
          "value": "video"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "render",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get an image",
          "description": "Get an image render by ID"
        },
        {
          "name": "Render",
          "value": "render",
          "action": "Render an image",
          "description": "Render an image from a template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "image"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "render",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a video",
          "description": "Get a video render by ID"
        },
        {
          "name": "Render",
          "value": "render",
          "action": "Render a video",
          "description": "Render a video from a template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "video"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a template",
          "description": "Get a single template"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many templates",
          "description": "List templates in the project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get",
      "value": "get",
      "action": "Get an image",
      "description": "Get an image render by ID",
      "resource": "image"
    },
    {
      "name": "Render",
      "value": "render",
      "action": "Render an image",
      "description": "Render an image from a template",
      "resource": "image"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a video",
      "description": "Get a video render by ID",
      "resource": "video"
    },
    {
      "name": "Render",
      "value": "render",
      "action": "Render a video",
      "description": "Render a video from a template",
      "resource": "video"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a template",
      "description": "Get a single template",
      "resource": "template"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many templates",
      "description": "List templates in the project",
      "resource": "template"
    }
  ]

npm_readme:
  # @polotno/n8n-nodes-polotno-studio

  This is an n8n community node. It lets you render images and videos from your
  [Polotno Studio](https://polotno.com/studio) templates in your n8n workflows.

  Polotno Studio is a content-automation platform that turns design templates into
  on-brand images and videos via a simple API. This package adds a node to fill a
  template's dynamic fields and render it, plus a trigger that fires when a render
  completes.

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

  [Installation](#installation) · [Credentials](#credentials) · [Operations](#operations) · [Trigger](#trigger) · [Usage](#usage) · [Resources](#resources)

  ## Installation

  Follow the [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/)
  and use the package name `@polotno/n8n-nodes-polotno-studio`.

  ## Credentials

  You need a **project API key** from Polotno Studio. To find it, sign in to
  [Polotno Studio](https://polotno.com/studio), open the editor, open the project
  selector, click **Manage projects**, and copy the API key for your project.
  Keys start with `key_live_`.

  Create a **Polotno Studio API** credential and paste the key. n8n validates the
  key when you save the credential.

  ## Operations

  The **Polotno Studio** node has three resources:

  ### Image → Render

  Renders an image from a template.

  1. Pick a **Template** (search by name, paste a `tpl_…` ID, or paste a template URL).
  2. The template's **Fields** load automatically as typed inputs (text, image URL,
     color, toggle, …). Map values from earlier nodes or type them directly.
  3. Optionally set **Format** (PNG/JPEG/PDF), **Transparent**, and **Pixel Ratio**.
  4. **Wait for Completion** is on by default: the node waits for the render and
     outputs the final `image_url`. Turn it off to return the job immediately and
     continue via the trigger.

  ### Video → Render

  Renders a video (MP4/GIF) from a template. Same template + fields flow as images,
  plus **FPS** and **Duration**. Video renders are billed as `ceil(duration)`
  credits (1 per second; FPS does not affect cost) and can take longer — for long
  videos, turn **Wait for Completion** off and use the **Polotno Studio Trigger**
  instead.

  ### Image / Video → Get

  Fetches an existing render by its ID (`img_…` / `vid_…`) and returns its current
  state, including `image_url` / `video_url` once `status` is `completed`. Use this
  to retrieve a result from an **async** render (Render with *Wait for Completion*
  off, which returns only an `id`), to re-fetch what a webhook referenced, or to
  re-check a render that exceeded the wait window.

  ### Template → Get / Get Many

  List templates in your project (with optional **Name**, **Tag**, and archived
  filters) or fetch a single template by ID.

  ## Trigger

  The **Polotno Studio Trigger** starts a workflow when a render finishes. On
  activation it registers a webhook subscription with Polotno Studio; on
  deactivation it removes it. Choose which events to listen for:

  - `image.completed` / `image.failed`
  - `video.completed` / `video.failed`

  The event's payload object (the completed image or video) is emitted as the
  workflow item.

  ## Usage

  A common pattern:

  1. A trigger (e.g. a new row in a sheet) starts the workflow.
  2. **Polotno Studio → Image → Render**: choose a template, map the row's columns
     onto the template fields, keep **Wait for Completion** on.
  3. Use the returned `image_url` in the next step (post to social, email, upload, …).

  For high-volume or long video pipelines, render with **Wait for Completion** off
  and let the **Polotno Studio Trigger** continue the flow when each render
  completes.

  ## Compatibility

  Requires n8n 1.x. Tested against current n8n community-node tooling
  (`@n8n/node-cli`).

  ## Resources

  - [Polotno Studio API documentation](https://polotno.com/docs/overview)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Renders images and videos from Polotno Studio templates within n8n workflows. It can also fetch existing renders and trigger workflows when a render completes.","capabilities":["Render images from templates","Render videos from templates","Automatically map template fields from text, image URL, color, toggle, and other input types","Get existing image or video renders by ID and check render status","List templates in a project or fetch a template by ID","Support synchronous rendering with wait for completion","Support asynchronous rendering and continuation via trigger/webhook","Trigger workflows on image or video completed/failed events"],"authentication":"Project API key required (Polotno Studio API credential; key starts with key_live_).","commonUseCases":["Generate branded marketing images or videos from templates","Populate template fields from data in earlier workflow steps and render final assets","Handle long-running or high-volume renders asynchronously with a trigger","Retrieve completed render URLs for posting, emailing, or uploading"],"limitations":["Video renders are billed as ceil(duration) credits, one per second.","Long video renders may exceed the wait window, requiring asynchronous handling.","Requires n8n 1.x."],"relatedNodes":["Polotno Studio Trigger"]}


node_type: n8n-nodes-virtual-marketer.virtualMarketer
package_name: n8n-nodes-virtual-marketer
display_name: Virtual Marketer
description: Generate AI marketing text, list products and check word usage with Virtual Marketer
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: virtualmarketer
author_github_url: https://github.com/SGS-Virtual-Marketer-GmbH/
npm_package_name: n8n-nodes-virtual-marketer
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.586Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "ai",
      "options": [
        {
          "name": "AI Generation",
          "value": "ai",
          "description": "Generate AI-powered text"
        },
        {
          "name": "Model",
          "value": "product",
          "description": "List the available AI models"
        },
        {
          "name": "Usage",
          "value": "usage",
          "description": "Check word usage of your account"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generate",
      "options": [
        {
          "name": "Generate",
          "value": "generate",
          "action": "Generate AI text",
          "description": "Generate an AI-powered response for a product and input text"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ai"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List all models",
          "description": "Retrieve a list of all available AI models"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "product"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getWordCount",
      "options": [
        {
          "name": "Get Word Count",
          "value": "getWordCount",
          "action": "Get current word count",
          "description": "Retrieve the number of words generated in the current month"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "usage"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate",
      "value": "generate",
      "action": "Generate AI text",
      "description": "Generate an AI-powered response for a product and input text",
      "resource": "ai"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List all models",
      "description": "Retrieve a list of all available AI models",
      "resource": "product"
    },
    {
      "name": "Get Word Count",
      "value": "getWordCount",
      "action": "Get current word count",
      "description": "Retrieve the number of words generated in the current month",
      "resource": "usage"
    }
  ]

npm_readme:
  # n8n-nodes-virtual-marketer

  ![Virtual Marketer](https://raw.githubusercontent.com/SGS-Virtual-Marketer-GmbH/n8n-nodes-virtual-marketer/main/nodes/VirtualMarketer/virtualMarketer.svg)

  This is an [n8n](https://n8n.io/) community node. It lets you use the **[Virtual Marketer](https://virtual-marketer.de)** AI platform in your n8n workflows.

  Virtual Marketer generates AI-powered marketing text based on your configured AI models. With this node you can generate text, list your available AI models, and check your monthly word usage — all directly from n8n.

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

  ## Installation

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

  In short, in your n8n instance:

  1. Go to **Settings → Community Nodes**.
  2. Select **Install**.
  3. Enter `n8n-nodes-virtual-marketer` and confirm.

  The node will then be available in the node panel as **Virtual Marketer**.

  ## Credentials

  You need an **X-AUTH-TOKEN** from Virtual Marketer. This token is generated when your installation is complete — keep it secret.

  1. In n8n create a new **Virtual Marketer API** credential.
  2. Paste your API token.
  3. (Optional) Adjust the base URL — defaults to `https://api.virtual-marketer.de`.
  4. Use the **Test** button to verify the token works.

  ## Operations

  ### AI Generation

  - **Generate** — Generate AI-powered text for a chosen model and input text.
    - **Model** — loaded automatically as a dropdown from your account once the credential is set.
    - **Input Text (Segment)** — the query / text to process.
    - **Session ID** *(optional)* — for conversation tracking.
    - **Processing Type** *(optional)* — `default` or `stream`.

  ### Model

  - **List** — Retrieve all available AI models configured for your account.

  ### Usage

  - **Get Word Count** — Retrieve the number of words generated in the current month.

  ## Usage

  A typical flow: add the **Virtual Marketer** node, select **AI Generation → Generate**, pick an AI model from the preloaded dropdown, enter your input text, and run. The generated text is returned in the `text` field along with a `finish_reason`.

  This node is also usable as an [AI tool](https://docs.n8n.io/advanced-ai/) in agent workflows.

  ## Resources

  - [Virtual Marketer website](https://virtual-marketer.de)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE) © SGS Virtual Marketer GmbH — info@virtual-marketer.de

ai_documentation_summary:
  {"purpose":"Integrates the Virtual Marketer AI platform into n8n workflows to generate marketing text, list available AI models, and check monthly word usage. It can also be used as an AI tool in agent workflows.","capabilities":["Generate AI-powered text for a selected model","Load and select available AI models from the user account","List all configured AI models","Retrieve current month word usage / word count","Support optional session ID for conversation tracking","Support default or stream processing types"],"authentication":"X-AUTH-TOKEN API token required via Virtual Marketer API credential","commonUseCases":["Generating marketing copy or other AI-written content","Selecting or discovering available AI models for a workflow","Monitoring monthly AI word consumption","Using Virtual Marketer as an AI tool in agent-based workflows"],"limitations":["Requires a valid Virtual Marketer account token","Base URL is configurable but defaults to https://api.virtual-marketer.de","Model selection depends on the account's available configured models"],"relatedNodes":[]}


node_type: n8n-nodes-vidiq.vidIq
package_name: n8n-nodes-vidiq
display_name: VidIQ
description: YouTube & Instagram intelligence and AI content tools via vidIQ
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: hesham.us
author_github_url: https://github.com/TheFamousHesham/
npm_package_name: n8n-nodes-vidiq
npm_version: 0.2.2
community_fetched_at: 2026-07-14T14:40:34.587Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "keyword",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Channel",
          "value": "channel"
        },
        {
          "name": "Instagram",
          "value": "instagram"
        },
        {
          "name": "Job",
          "value": "job"
        },
        {
          "name": "Keyword",
          "value": "keyword"
        },
        {
          "name": "Studio & AI",
          "value": "studio"
        },
        {
          "name": "Trend",
          "value": "trend"
        },
        {
          "name": "Video",
          "value": "video"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getBalance",
      "options": [
        {
          "name": "Get Credit Balance",
          "value": "getBalance",
          "action": "Get credit balance",
          "description": "Check the user's current vidIQ credits balance"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "analytics",
      "options": [
        {
          "name": "Analytics",
          "value": "analytics",
          "action": "Get channel analytics",
          "description": "Retrieve time-series analytics metrics for a channel"
        },
        {
          "name": "Find Breakout",
          "value": "findBreakout",
          "action": "Find breakout channels",
          "description": "Discover rapidly growing breakout channels for a query"
        },
        {
          "name": "Find Similar",
          "value": "findSimilar",
          "action": "Find similar channels",
          "description": "Discover channels similar to a given niche"
        },
        {
          "name": "Get Many by IDs",
          "value": "getMany",
          "action": "Get many channels by ID",
          "description": "Fetch multiple channels by their YouTube IDs"
        },
        {
          "name": "Get My Channels",
          "value": "getMyChannels",
          "action": "Get my channels",
          "description": "List the channels owned by the authenticated user"
        },
        {
          "name": "Get Performance Trends",
          "value": "getPerformanceTrends",
          "action": "Get channel performance trends",
          "description": "Retrieve performance trend data for a channel"
        },
        {
          "name": "Get Stats",
          "value": "getStats",
          "action": "Get channel stats",
          "description": "Retrieve summary statistics for a channel"
        },
        {
          "name": "Get Videos",
          "value": "getVideos",
          "action": "Get channel videos",
          "description": "List videos published by a channel"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search channels",
          "description": "Search channels with rich filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "channel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "accountsFromOutliers",
      "options": [
        {
          "name": "Accounts From Outliers",
          "value": "accountsFromOutliers",
          "action": "Find accounts from outlier reels",
          "description": "Discover Instagram accounts behind outlier reels for a niche"
        },
        {
          "name": "Analyze Reel",
          "value": "analyzeReel",
          "action": "Analyze a reel",
          "description": "Watch and critique an Instagram reel"
        },
        {
          "name": "Find Outlier Reels",
          "value": "findOutlierReels",
          "action": "Find outlier reels",
          "description": "Search for outlier-performing Instagram reels"
        },
        {
          "name": "Get Profile",
          "value": "getProfile",
          "action": "Get a profile",
          "description": "Fetch an Instagram profile by handle"
        },
        {
          "name": "Get Profile Reels",
          "value": "getProfileReels",
          "action": "Get profile reels",
          "description": "Fetch the reels for an Instagram profile"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "instagram"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStatus",
      "options": [
        {
          "name": "Get Job Status",
          "value": "getStatus",
          "action": "Get job status",
          "description": "Check the status of an asynchronous job and retrieve its result"
        },
        {
          "name": "List Jobs",
          "value": "listJobs",
          "action": "List jobs",
          "description": "List your asynchronous vidIQ jobs, newest first"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "job"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "research",
      "options": [
        {
          "name": "Research",
          "value": "research",
          "action": "Research keywords",
          "description": "Find search volume, competition and related keyword opportunities"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "keyword"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "cloneVoiceUpload",
      "options": [
        {
          "name": "Clone Voice (Upload)",
          "value": "cloneVoiceUpload",
          "action": "Clone a voice from an uploaded audio sample",
          "description": "Create a cloned voice from an uploaded audio sample. Consumes vidIQ credits."
        },
        {
          "name": "Clone Voice From YouTube",
          "value": "cloneVoiceFromYoutube",
          "action": "Clone a voice from a video",
          "description": "Start a job that clones a voice from a YouTube video. Consumes vidIQ credits."
        },
        {
          "name": "Compose",
          "value": "compose",
          "action": "Compose a video from scenes",
          "description": "Render a video from scenes, voiceover, music, overlays and captions. Consumes vidIQ credits."
        },
        {
          "name": "Find B-Roll",
          "value": "findBroll",
          "action": "Find stock footage",
          "description": "Search for stock b-roll footage matching a query. Consumes vidIQ credits."
        },
        {
          "name": "Generate Clips",
          "value": "generateClips",
          "action": "Generate clips from a video",
          "description": "Start a job that cuts a long video into short clips. Consumes vidIQ credits."
        },
        {
          "name": "Generate Thumbnail",
          "value": "generateThumbnail",
          "action": "Generate a thumbnail",
          "description": "Start a job that generates a thumbnail for a video. Consumes vidIQ credits."
        },
        {
          "name": "Generate Titles",
          "value": "generateTitles",
          "action": "Generate video titles",
          "description": "Generate optimized title suggestions for a video. Consumes vidIQ credits."
        },
        {
          "name": "Generate Video",
          "value": "generateVideo",
          "action": "Generate a video",
          "description": "Start a job that generates a video from a prompt. Consumes vidIQ credits."
        },
        {
          "name": "Generate Voiceover",
          "value": "generateVoiceover",
          "action": "Generate a voiceover",
          "description": "Generate a voiceover audio track from a script. Consumes vidIQ credits."
        },
        {
          "name": "List Voices",
          "value": "listVoices",
          "action": "List available voices",
          "description": "List the voices available for voiceover generation"
        },
        {
          "name": "Refine Thumbnail",
          "value": "refineThumbnail",
          "action": "Refine a thumbnail",
          "description": "Start a job that refines an existing thumbnail with instructions. Consumes vidIQ credits."
        },
        {
          "name": "Score Thumbnail",
          "value": "scoreThumbnail",
          "action": "Score a thumbnail",
          "description": "Score how well a thumbnail is likely to perform. Consumes vidIQ credits."
        },
        {
          "name": "Score Title",
          "value": "scoreTitle",
          "action": "Score a title",
          "description": "Score how well a title is likely to perform. Consumes vidIQ credits."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "studio"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "categories",
      "options": [
        {
          "name": "Categories",
          "value": "categories",
          "action": "List trend categories",
          "description": "List all available trend category slugs with display names"
        },
        {
          "name": "Trending Videos",
          "value": "trendingVideos",
          "action": "Find trending videos",
          "description": "Find YouTube videos gaining views rapidly by views-per-hour velocity"
        },
        {
          "name": "Video Outliers",
          "value": "videoOutliers",
          "action": "Find video outliers",
          "description": "Find viral and overperforming videos exceeding their channel average"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "trend"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "analyze",
      "options": [
        {
          "name": "Analyze",
          "value": "analyze",
          "action": "Analyze a video",
          "description": "Watch a video and produce a scene-by-scene or custom analysis"
        },
        {
          "name": "Comments",
          "value": "comments",
          "action": "Get video comments",
          "description": "Fetch comment threads for a video or channel"
        },
        {
          "name": "Get Many by IDs",
          "value": "getMany",
          "action": "Get many videos by ID",
          "description": "Fetch metadata for a list of video IDs"
        },
        {
          "name": "Search YouTube",
          "value": "searchYoutube",
          "action": "Search videos",
          "description": "Search YouTube for videos, channels and playlists"
        },
        {
          "name": "Stats History",
          "value": "statsHistory",
          "action": "Get video stats history",
          "description": "Get time-series statistics for a video"
        },
        {
          "name": "Transcript",
          "value": "transcript",
          "action": "Get video transcript",
          "description": "Fetch the transcript for a video"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "video"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Credit Balance",
      "value": "getBalance",
      "action": "Get credit balance",
      "description": "Check the user's current vidIQ credits balance",
      "resource": "account"
    },
    {
      "name": "Analytics",
      "value": "analytics",
      "action": "Get channel analytics",
      "description": "Retrieve time-series analytics metrics for a channel",
      "resource": "channel"
    },
    {
      "name": "Find Breakout",
      "value": "findBreakout",
      "action": "Find breakout channels",
      "description": "Discover rapidly growing breakout channels for a query",
      "resource": "channel"
    },
    {
      "name": "Find Similar",
      "value": "findSimilar",
      "action": "Find similar channels",
      "description": "Discover channels similar to a given niche",
      "resource": "channel"
    },
    {
      "name": "Get Many by IDs",
      "value": "getMany",
      "action": "Get many channels by ID",
      "description": "Fetch multiple channels by their YouTube IDs",
      "resource": "channel"
    },
    {
      "name": "Get My Channels",
      "value": "getMyChannels",
      "action": "Get my channels",
      "description": "List the channels owned by the authenticated user",
      "resource": "channel"
    },
    {
      "name": "Get Performance Trends",
      "value": "getPerformanceTrends",
      "action": "Get channel performance trends",
      "description": "Retrieve performance trend data for a channel",
      "resource": "channel"
    },
    {
      "name": "Get Stats",
      "value": "getStats",
      "action": "Get channel stats",
      "description": "Retrieve summary statistics for a channel",
      "resource": "channel"
    },
    {
      "name": "Get Videos",
      "value": "getVideos",
      "action": "Get channel videos",
      "description": "List videos published by a channel",
      "resource": "channel"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search channels",
      "description": "Search channels with rich filters",
      "resource": "channel"
    },
    {
      "name": "Accounts From Outliers",
      "value": "accountsFromOutliers",
      "action": "Find accounts from outlier reels",
      "description": "Discover Instagram accounts behind outlier reels for a niche",
      "resource": "instagram"
    },
    {
      "name": "Analyze Reel",
      "value": "analyzeReel",
      "action": "Analyze a reel",
      "description": "Watch and critique an Instagram reel",
      "resource": "instagram"
    },
    {
      "name": "Find Outlier Reels",
      "value": "findOutlierReels",
      "action": "Find outlier reels",
      "description": "Search for outlier-performing Instagram reels",
      "resource": "instagram"
    },
    {
      "name": "Get Profile",
      "value": "getProfile",
      "action": "Get a profile",
      "description": "Fetch an Instagram profile by handle",
      "resource": "instagram"
    },
    {
      "name": "Get Profile Reels",
      "value": "getProfileReels",
      "action": "Get profile reels",
      "description": "Fetch the reels for an Instagram profile",
      "resource": "instagram"
    },
    {
      "name": "Get Job Status",
      "value": "getStatus",
      "action": "Get job status",
      "description": "Check the status of an asynchronous job and retrieve its result",
      "resource": "job"
    },
    {
      "name": "List Jobs",
      "value": "listJobs",
      "action": "List jobs",
      "description": "List your asynchronous vidIQ jobs, newest first",
      "resource": "job"
    },
    {
      "name": "Research",
      "value": "research",
      "action": "Research keywords",
      "description": "Find search volume, competition and related keyword opportunities",
      "resource": "keyword"
    },
    {
      "name": "Clone Voice (Upload)",
      "value": "cloneVoiceUpload",
      "action": "Clone a voice from an uploaded audio sample",
      "description": "Create a cloned voice from an uploaded audio sample. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Clone Voice From YouTube",
      "value": "cloneVoiceFromYoutube",
      "action": "Clone a voice from a video",
      "description": "Start a job that clones a voice from a YouTube video. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Compose",
      "value": "compose",
      "action": "Compose a video from scenes",
      "description": "Render a video from scenes, voiceover, music, overlays and captions. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Find B-Roll",
      "value": "findBroll",
      "action": "Find stock footage",
      "description": "Search for stock b-roll footage matching a query. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Generate Clips",
      "value": "generateClips",
      "action": "Generate clips from a video",
      "description": "Start a job that cuts a long video into short clips. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Generate Thumbnail",
      "value": "generateThumbnail",
      "action": "Generate a thumbnail",
      "description": "Start a job that generates a thumbnail for a video. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Generate Titles",
      "value": "generateTitles",
      "action": "Generate video titles",
      "description": "Generate optimized title suggestions for a video. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Generate Video",
      "value": "generateVideo",
      "action": "Generate a video",
      "description": "Start a job that generates a video from a prompt. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Generate Voiceover",
      "value": "generateVoiceover",
      "action": "Generate a voiceover",
      "description": "Generate a voiceover audio track from a script. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "List Voices",
      "value": "listVoices",
      "action": "List available voices",
      "description": "List the voices available for voiceover generation",
      "resource": "studio"
    },
    {
      "name": "Refine Thumbnail",
      "value": "refineThumbnail",
      "action": "Refine a thumbnail",
      "description": "Start a job that refines an existing thumbnail with instructions. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Score Thumbnail",
      "value": "scoreThumbnail",
      "action": "Score a thumbnail",
      "description": "Score how well a thumbnail is likely to perform. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Score Title",
      "value": "scoreTitle",
      "action": "Score a title",
      "description": "Score how well a title is likely to perform. Consumes vidIQ credits.",
      "resource": "studio"
    },
    {
      "name": "Categories",
      "value": "categories",
      "action": "List trend categories",
      "description": "List all available trend category slugs with display names",
      "resource": "trend"
    },
    {
      "name": "Trending Videos",
      "value": "trendingVideos",
      "action": "Find trending videos",
      "description": "Find YouTube videos gaining views rapidly by views-per-hour velocity",
      "resource": "trend"
    },
    {
      "name": "Video Outliers",
      "value": "videoOutliers",
      "action": "Find video outliers",
      "description": "Find viral and overperforming videos exceeding their channel average",
      "resource": "trend"
    },
    {
      "name": "Analyze",
      "value": "analyze",
      "action": "Analyze a video",
      "description": "Watch a video and produce a scene-by-scene or custom analysis",
      "resource": "video"
    },
    {
      "name": "Comments",
      "value": "comments",
      "action": "Get video comments",
      "description": "Fetch comment threads for a video or channel",
      "resource": "video"
    },
    {
      "name": "Get Many by IDs",
      "value": "getMany",
      "action": "Get many videos by ID",
      "description": "Fetch metadata for a list of video IDs",
      "resource": "video"
    },
    {
      "name": "Search YouTube",
      "value": "searchYoutube",
      "action": "Search videos",
      "description": "Search YouTube for videos, channels and playlists",
      "resource": "video"
    },
    {
      "name": "Stats History",
      "value": "statsHistory",
      "action": "Get video stats history",
      "description": "Get time-series statistics for a video",
      "resource": "video"
    },
    {
      "name": "Transcript",
      "value": "transcript",
      "action": "Get video transcript",
      "description": "Fetch the transcript for a video",
      "resource": "video"
    }
  ]

npm_readme:
  # n8n-nodes-vidiq

  An [n8n](https://n8n.io) community node for **[vidIQ](https://vidiq.com)** — bring YouTube &
  Instagram intelligence and vidIQ's AI content tools into your workflows: keyword research,
  video outliers, channel/video analytics, competitor discovery, trend analysis, plus AI title &
  thumbnail scoring/generation, voiceover, and video generation.

  > **Unofficial.** This is a community-built node and is **not affiliated with, endorsed by, or
  > supported by vidIQ**. "vidIQ" is a trademark of its respective owner.

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

  ---

  ## How it works

  vidIQ does not expose a traditional REST API. Its supported, API-key-authenticated programmatic
  surface is its **MCP server** (`https://mcp.vidiq.com/mcp`). This node speaks that protocol for you
  and presents clean, typed n8n operations — you never see MCP.

  > ⚠️ **Requires a vidIQ "Max" plan.** The API/MCP surface is only available on vidIQ's Max plan.
  >
  > ⚠️ **Generative operations consume vidIQ credits.** Anything under the **Studio & AI** resource
  > (title/thumbnail generation, video, clips, voiceover, b-roll) spends credits. Check your balance
  > with **Account → Get Credit Balance** before running them at scale.

  ## Installation

  ### n8n Cloud / Desktop (Community Nodes)
  **Settings → Community Nodes → Install**, then enter `n8n-nodes-vidiq`.

  ### Self-hosted (npm)
  ```bash
  npm install n8n-nodes-vidiq
  ```

  ## Credentials

  1. On a vidIQ **Max** plan, generate an API key (vidIQ → MCP / API access). It looks like
     `vidiq_xxxxxxxxxxxxxxxxxxxxxxxxx`.
  2. In n8n, create a **VidIQ API** credential and paste the key. The credential test calls
     `vidiq_balance`; an invalid key returns `401` and the test fails.

  The node sends the key as `Authorization: Bearer <key>`.

  ## Resources & operations (40 operations)

  | Resource | Operations |
  |---|---|
  | **Keyword** | Research |
  | **Trend** | Trending Videos · Video Outliers · Categories |
  | **Channel** | Get Stats · Search · Get Many by IDs · Get Videos · Get Performance Trends · Analytics · Find Similar · Find Breakout · Get My Channels |
  | **Video** | Get Many by IDs · Search YouTube · Stats History · Transcript · Comments · Analyze |
  | **Studio & AI** | Score Title · Score Thumbnail · Generate Titles · Generate Thumbnail · Refine Thumbnail · Generate Video · Generate Clips · Compose · Find B-Roll · List Voices · Generate Voiceover · Clone Voice (Upload) · Clone Voice From YouTube |
  | **Instagram** | Get Profile · Profile Reels · Find Outlier Reels · Accounts From Outliers · Analyze Reel |
  | **Account** | Get Credit Balance |
  | **Job** | Get Job Status · List Jobs |

  ## Notes & patterns

  - **IDs over URLs.** `Video ID`, `Reel`, and channel IDs accept a bare ID/shortcode (a full URL also
    works — vidIQ normalizes it), so you won't get errors from a missing `www.` or a trailing slash.
  - **Channel Analytics.** The `Channel` field is a dropdown of your vidIQ-linked channels (analytics
    are only available for channels you own). Dates use `YYYY-MM-DD`; metrics is a multi-select.
  - **Async renders (Studio & AI).** `Generate Video`, `Generate Clips`, `Compose`, the thumbnail
    generators and `Clone Voice From YouTube` run asynchronously and return a job object containing an
    `mcpJobId`. Poll it with **Job → Get Job Status**. For long renders, loop with n8n's **Wait** node
    + an **IF** node until the status is `completed` (or `failed`/`expired`). (n8n Cloud does not allow
    nodes to block while waiting, so the node does not poll internally.)
  - **Binary I/O.** Image/audio inputs (thumbnail scoring/generation, voice cloning, video frames)
    accept a **URL** or an n8n **Binary Property** via each field's *Input Type* selector. `Generate
    Voiceover` with output **URL and Audio** returns the MP3 as a downloadable **binary** attachment.
  - **Timeout.** Every operation has an **Options → Timeout (ms)** setting so a stalled request fails
    fast instead of hanging.
  - **Credits.** Read/analytics operations are cheap; generative Studio & AI operations cost more (each
    is labelled "Consumes vidIQ credits"). Watch **Account → Get Credit Balance**.
  - **Use as an AI tool.** The node is exposed as an n8n AI tool (`usableAsTool`), so an AI Agent can
    call vidIQ operations directly.

  ## Compatibility

  - Built with `@n8n/node-cli` in **strict** mode (verified-node ruleset), zero runtime dependencies.
  - Requires n8n with `n8nNodesApiVersion: 1`.

  ## Development

  ```bash
  npm install
  npm run build      # compile to dist/
  npm run lint       # n8n strict verification lint
  npm test           # offline unit tests (vitest)
  VIDIQ_API_KEY=vidiq_... npm run smoke   # optional live read-only smoke test
  ```

  Design notes: [`docs/superpowers/specs/2026-06-19-n8n-nodes-vidiq-design.md`](docs/superpowers/specs/2026-06-19-n8n-nodes-vidiq-design.md).

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Provides access to vidIQ’s YouTube and Instagram intelligence features plus AI content tools inside n8n workflows. It supports keyword research, analytics, trend and competitor analysis, and asynchronous generative tasks like title, thumbnail, voiceover, and video creation.","capabilities":["Keyword research","Trend analysis including trending videos, video outliers, and categories","Channel operations such as stats, search, performance trends, analytics, similar/breakout discovery, and getting owned channels","Video operations such as lookup by ID, YouTube search, transcript, comments, stats history, and analysis","Studio & AI operations including title scoring/generation, thumbnail scoring/generation/refinement, video generation, clip generation, composition, B-roll finding, voice listing, voiceover generation, and voice cloning","Instagram operations including profile lookup, profile reels, outlier reel discovery, account discovery from outliers, and reel analysis","Account credit balance lookup","Job status checking and job listing for asynchronous tasks","AI tool usage in n8n agents"],"authentication":"vidIQ API key required on a Max plan; the key is sent as Authorization: Bearer <key> and is used against vidIQ's MCP server.","commonUseCases":["Researching keywords, trends, and competitor content for YouTube strategy","Analyzing YouTube channels and videos for performance insights","Generating and scoring AI-assisted titles, thumbnails, voiceovers, clips, and videos","Monitoring Instagram reels and identifying outlier content","Polling async vidIQ AI jobs until completion"],"limitations":["Requires a vidIQ Max plan; the API/MCP surface is only available on that plan","vidIQ does not expose a traditional REST API; this node uses the MCP server instead","Generative Studio & AI operations consume vidIQ credits","Async generation jobs do not poll internally and must be checked with Job status nodes","Channel analytics are only available for channels the user owns"],"relatedNodes":["Wait","IF","AI Agent"]}


node_type: n8n-nodes-nimriz.nimrizTrigger
package_name: n8n-nodes-nimriz
display_name: Nimriz Trigger
description: Starts a workflow when a Nimriz 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: nimriz
author_github_url: https://github.com/memorajo/
npm_package_name: n8n-nodes-nimriz
npm_version: 1.1.0
community_fetched_at: 2026-07-14T14:40:34.589Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-nimriz

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

  Nimriz is a link management platform for creating and managing short links, tracking clicks and QR scans, and forwarding link events to your analytics and automation stack.

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

  ## Installation

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

  On self-hosted n8n you can install it from **Settings → Community Nodes** using the package name `n8n-nodes-nimriz`, or with npm in your n8n root:

  ```bash
  npm install n8n-nodes-nimriz
  ```

  Restart your n8n instance. The **Nimriz** and **Nimriz Trigger** nodes then appear in the nodes panel.

  ## Credentials

  Authentication can use Nimriz OAuth2 or a Nimriz **Workspace API key**.

  - For OAuth2, add a **Nimriz OAuth2 API** credential and enter the Client ID and Client Secret supplied for your n8n callback URL.
  - For API-key auth, create a key in your Nimriz dashboard under **Settings → Integrations → API access**, then add a **Nimriz API** credential in n8n and paste the key.

  Use the **Test** button to confirm the credential is valid. The credential is checked against `GET /api/v1/whoami`.

  ## Operations

  ### Link

  - **Create** - create a short link.
  - **Get** - get a single link by ID.
  - **Find** - find a link by its short URL.
  - **List** - list recent links in the workspace.
  - **Update Slug** - change a link's slug.
  - **Update Destination** - change a link's destination URL.
  - **Update Password** - set or remove a link's password.
  - **Update Expiration** - set, change, or remove a link's expiration.
  - **Check Slug** - check whether a slug is available on a domain.
  - **Get Analytics** - get click and scan analytics for a link.

  ### Connection

  Manage outbound integration connections (analytics/CDP/webhook destinations).

  - **Create**, **List**, **Get**, **Update**, **Delete**, **Test** - manage and test-send outbound connections.

  ## Triggers

  The **Nimriz Trigger** node starts a workflow when a Nimriz event fires. It registers a webhook in your workspace for the selected event:

  - **Link Created**
  - **Link Updated**
  - **Link Takedown Updated**
  - **Domain Verification Updated**
  - **Link Clicked**
  - **QR Code Scanned**

  ## Resources

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

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when a Nimriz event occurs. It registers a workspace webhook for selected Nimriz events such as link creation, updates, clicks, and QR scans.","capabilities":["Trigger workflows on Link Created events","Trigger workflows on Link Updated events","Trigger workflows on Link Takedown Updated events","Trigger workflows on Domain Verification Updated events","Trigger workflows on Link Clicked events","Trigger workflows on QR Code Scanned events"],"authentication":"Nimriz Workspace API key via a Nimriz API credential in n8n","commonUseCases":["Automate workflows when a short link is created or updated","Capture link click and QR scan events for analytics or downstream automation","React to domain verification or takedown changes in a Nimriz workspace"],"limitations":[],"relatedNodes":[]}


node_type: n8n-nodes-nimriz.nimriz
package_name: n8n-nodes-nimriz
display_name: Nimriz
description: Manage Nimriz short links and outbound connections
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: nimriz
author_github_url: https://github.com/memorajo/
npm_package_name: n8n-nodes-nimriz
npm_version: 1.1.0
community_fetched_at: 2026-07-14T14:40:34.589Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "link",
      "options": [
        {
          "name": "Connection",
          "value": "connection"
        },
        {
          "name": "Link",
          "value": "link"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Check Slug",
          "value": "checkSlug",
          "action": "Check slug availability",
          "description": "Check whether a slug is available on a domain"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a short link",
          "description": "Create a new short link"
        },
        {
          "name": "Find",
          "value": "find",
          "action": "Find a link by short URL",
          "description": "Find a link by its short URL"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a link",
          "description": "Get a single link by ID"
        },
        {
          "name": "Get Analytics",
          "value": "getAnalytics",
          "action": "Get link analytics",
          "description": "Get click and scan analytics for a link"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List links",
          "description": "List recent links in the workspace"
        },
        {
          "name": "Update Destination",
          "value": "updateDestination",
          "action": "Update a link destination",
          "description": "Update the destination URL of a link"
        },
        {
          "name": "Update Expiration",
          "value": "updateExpiration",
          "action": "Update a link expiration",
          "description": "Set or remove the expiration on a link"
        },
        {
          "name": "Update Password",
          "value": "updatePassword",
          "action": "Update a link password",
          "description": "Set or remove the password on a link"
        },
        {
          "name": "Update Slug",
          "value": "updateSlug",
          "action": "Update a link slug",
          "description": "Update the slug of a link"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "link"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a connection",
          "description": "Create a new outbound connection"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a connection",
          "description": "Delete an outbound connection"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a connection",
          "description": "Get a single outbound connection by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List connections",
          "description": "List outbound connections in the workspace"
        },
        {
          "name": "Test",
          "value": "test",
          "action": "Test a connection",
          "description": "Send a test event to an outbound connection"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a connection",
          "description": "Update an outbound connection"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connection"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Check Slug",
      "value": "checkSlug",
      "action": "Check slug availability",
      "description": "Check whether a slug is available on a domain",
      "resource": "link"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a short link",
      "description": "Create a new short link",
      "resource": "link"
    },
    {
      "name": "Find",
      "value": "find",
      "action": "Find a link by short URL",
      "description": "Find a link by its short URL",
      "resource": "link"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a link",
      "description": "Get a single link by ID",
      "resource": "link"
    },
    {
      "name": "Get Analytics",
      "value": "getAnalytics",
      "action": "Get link analytics",
      "description": "Get click and scan analytics for a link",
      "resource": "link"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List links",
      "description": "List recent links in the workspace",
      "resource": "link"
    },
    {
      "name": "Update Destination",
      "value": "updateDestination",
      "action": "Update a link destination",
      "description": "Update the destination URL of a link",
      "resource": "link"
    },
    {
      "name": "Update Expiration",
      "value": "updateExpiration",
      "action": "Update a link expiration",
      "description": "Set or remove the expiration on a link",
      "resource": "link"
    },
    {
      "name": "Update Password",
      "value": "updatePassword",
      "action": "Update a link password",
      "description": "Set or remove the password on a link",
      "resource": "link"
    },
    {
      "name": "Update Slug",
      "value": "updateSlug",
      "action": "Update a link slug",
      "description": "Update the slug of a link",
      "resource": "link"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a connection",
      "description": "Create a new outbound connection",
      "resource": "connection"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a connection",
      "description": "Delete an outbound connection",
      "resource": "connection"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a connection",
      "description": "Get a single outbound connection by ID",
      "resource": "connection"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List connections",
      "description": "List outbound connections in the workspace",
      "resource": "connection"
    },
    {
      "name": "Test",
      "value": "test",
      "action": "Test a connection",
      "description": "Send a test event to an outbound connection",
      "resource": "connection"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a connection",
      "description": "Update an outbound connection",
      "resource": "connection"
    }
  ]

npm_readme:
  # n8n-nodes-nimriz

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

  Nimriz is a link management platform for creating and managing short links, tracking clicks and QR scans, and forwarding link events to your analytics and automation stack.

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

  ## Installation

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

  On self-hosted n8n you can install it from **Settings → Community Nodes** using the package name `n8n-nodes-nimriz`, or with npm in your n8n root:

  ```bash
  npm install n8n-nodes-nimriz
  ```

  Restart your n8n instance. The **Nimriz** and **Nimriz Trigger** nodes then appear in the nodes panel.

  ## Credentials

  Authentication can use Nimriz OAuth2 or a Nimriz **Workspace API key**.

  - For OAuth2, add a **Nimriz OAuth2 API** credential and enter the Client ID and Client Secret supplied for your n8n callback URL.
  - For API-key auth, create a key in your Nimriz dashboard under **Settings → Integrations → API access**, then add a **Nimriz API** credential in n8n and paste the key.

  Use the **Test** button to confirm the credential is valid. The credential is checked against `GET /api/v1/whoami`.

  ## Operations

  ### Link

  - **Create** - create a short link.
  - **Get** - get a single link by ID.
  - **Find** - find a link by its short URL.
  - **List** - list recent links in the workspace.
  - **Update Slug** - change a link's slug.
  - **Update Destination** - change a link's destination URL.
  - **Update Password** - set or remove a link's password.
  - **Update Expiration** - set, change, or remove a link's expiration.
  - **Check Slug** - check whether a slug is available on a domain.
  - **Get Analytics** - get click and scan analytics for a link.

  ### Connection

  Manage outbound integration connections (analytics/CDP/webhook destinations).

  - **Create**, **List**, **Get**, **Update**, **Delete**, **Test** - manage and test-send outbound connections.

  ## Triggers

  The **Nimriz Trigger** node starts a workflow when a Nimriz event fires. It registers a webhook in your workspace for the selected event:

  - **Link Created**
  - **Link Updated**
  - **Link Takedown Updated**
  - **Domain Verification Updated**
  - **Link Clicked**
  - **QR Code Scanned**

  ## Resources

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

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Manages Nimriz short links and outbound connections in n8n workflows. It also supports triggering workflows from Nimriz events such as link clicks, QR scans, and link updates.","capabilities":["Create, get, find, list, and update short links","Update link slug, destination URL, password, and expiration","Check slug availability on a domain","Retrieve click and QR scan analytics for links","Create, list, get, update, delete, and test outbound connections","Trigger workflows on Nimriz events via webhook registration"],"authentication":"Workspace API key required. Add a Nimriz API credential in n8n using the API key from Nimriz dashboard (Settings → Integrations → API access); the key is validated with GET /api/v1/whoami.","commonUseCases":["Create and manage branded short links","Track link clicks and QR scans for analytics","Update link destinations or expiration settings automatically","Forward link events to analytics, CDP, or webhook destinations","Start workflows when Nimriz events occur"],"limitations":["Authentication is tied to a single workspace, so a workspace ID is not entered separately"],"relatedNodes":["Nimriz","Nimriz Trigger"]}


node_type: n8n-nodes-attestify.attestify
package_name: n8n-nodes-attestify
display_name: Attestify
description: Issue verifiable certificates with Attestify
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: novadyne
author_github_url: https://github.com/novadyne-hq/
npm_package_name: n8n-nodes-attestify
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.591Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "issue",
      "options": [
        {
          "name": "Issue Certificate",
          "value": "issue",
          "action": "Issue a verifiable certificate",
          "description": "Issue a verifiable certificate for one recipient"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Issue Certificate",
      "value": "issue",
      "action": "Issue a verifiable certificate",
      "description": "Issue a verifiable certificate for one recipient"
    }
  ]

npm_readme:
  # n8n-nodes-attestify

  **[Attestify](https://attestify.novadyne.ai) is an API to create verifiable certificates with a
  public verify page** — and this verified [n8n](https://n8n.io) community node issues them from any
  workflow. Each certificate gets a **permanent, tamper-evident public verification page** that
  anyone — an employer, a licensing board, the recipient themselves — can check in two clicks,
  with no account and no app.

  Unlike PDF or image certificate generators, whose output anyone can edit or photoshop, an
  Attestify certificate is backed by an **Ed25519-signed server-side record**: change one character
  and verification fails.

  - **Free, no signup, no API key** — the node ships with zero credentials.
  - **Permanent public verify page** per certificate (`verify_url` in the node output).
  - **Ed25519-signed record** (`signed_record_url`) verifiable against Attestify's published public key.
  - **Recipient PII stays on your side** — email is never stored in the signed record or shown publicly.

  Use it to turn any completion event in your workflow (a course finished, a webinar attended, a
  CEU earned) into a real certificate plus a verify URL you can drop into your completion emails,
  LMS, or spreadsheet.

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

  ## Installation

  Follow the [community-nodes install guide](https://docs.n8n.io/integrations/community-nodes/installation/),
  then enter the package name:

  ```
  n8n-nodes-attestify
  ```

  (Self-hosted n8n → **Settings → Community nodes → Install**.)

  ## Operation

  **Certificate → Issue Certificate** — issues one verifiable certificate per input item.

  | Field | Description |
  |---|---|
  | **Organization / Issuer** | Who is issuing the certificate (shown on the cert + verify page). |
  | **Course / Credential** | What was completed. |
  | **Recipient Name** | The recipient. Defaults to `{{ $json.name }}` so it maps straight from an incoming row. |
  | **Recipient Email** *(optional)* | Echoed back so you can join it to the verify URL for a mail-merge. **Never stored in the signed record and never shown on the public verify page** — recipient PII stays on your side. |
  | **Options → API Base URL** | Defaults to `https://attestify.novadyne.ai`. Change only for self-hosting/testing. |

  ### Output (per item)

  ```json
  {
    "cert_id": "…",
    "recipient_name": "Jane Doe",
    "recipient_email": "jane@example.com",
    "course": "4-Hour CE — Ethics",
    "issuer": "Acme Real Estate Academy",
    "verify_url": "https://attestify.novadyne.ai/cert/verify/…",
    "cert_image_url": "https://attestify.novadyne.ai/cert/c/….svg",
    "signed_record_url": "https://attestify.novadyne.ai/cert/c/….json"
  }
  ```

  Wire the output into a **Send Email** / Gmail / LMS node to deliver each recipient their
  `verify_url`. The `signed_record_url` is the Ed25519-signed record anyone can verify against
  Attestify's published public key — change one character in the certificate and verification fails.

  ## No account, no key

  The free Attestify service requires no signup and no API key, so this node ships with no
  credentials. A modest per-IP daily issuance cap applies (anti-abuse).

  ## Example

  `Schedule/Webhook → (your LMS "course completed" rows) → Attestify (Issue) → Gmail (send verify_url)`

  ## License

  [MIT](LICENSE) · Built by [Novadyne](https://novadyne.ai). Feedback welcome — it's early.

ai_documentation_summary:
  {"purpose":"Issues verifiable certificates through Attestify and returns public verification links plus signed certificate records for each input item. It is designed to turn workflow completion events into shareable, cryptographically verifiable certificates.","capabilities":["Issue one verifiable certificate per input item","Set organization/issuer displayed on the certificate and verify page","Set course/credential completed","Set recipient name, with default mapping from $json.name","Optionally include recipient email for downstream mail merge use","Configure API base URL for self-hosting or testing","Return certificate ID, verify URL, certificate image URL, and signed record URL"],"authentication":"None required; the free Attestify service requires no signup and no API key, so the node ships without credentials.","commonUseCases":["Issuing certificates after course completion or training events","Sending verify URLs in email workflows or LMS notifications","Creating signed records for audit-friendly credential verification","Generating certificates from spreadsheet, webhook, or schedule-based completion data"],"limitations":["A modest per-IP daily issuance cap applies to the free service","Recipient email is not stored in the signed record and is not shown on the public verify page","API base URL is only meant to be changed for self-hosting or testing"],"relatedNodes":["Send Email","Gmail","LMS"]}


node_type: @g-digital/n8n-nodes-gocertius.gocertius
package_name: @g-digital/n8n-nodes-gocertius
display_name: GoCertius
description: MCP server for GoCertius: certified evidence, dossiers, notifications and chats via AI agents.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: g-digital-bot
author_github_url: https://github.com/g-digital-by-Garrigues/GoCertius_MCP.git
npm_package_name: @g-digital/n8n-nodes-gocertius
npm_version: 1.3.4
community_fetched_at: 2026-07-14T14:40:34.592Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "caseFile",
      "options": [
        {
          "name": "Case File",
          "value": "caseFile"
        },
        {
          "name": "Evidence",
          "value": "evidence"
        },
        {
          "name": "Dossier Evidence",
          "value": "dossierEvidence"
        },
        {
          "name": "Dossier",
          "value": "dossier"
        },
        {
          "name": "Notification",
          "value": "notification"
        },
        {
          "name": "Chat",
          "value": "chat"
        },
        {
          "name": "Session",
          "value": "session"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "case_file_create",
      "options": [
        {
          "name": "Create Case File",
          "value": "case_file_create",
          "action": "Create Case File",
          "description": "Creates a new case file — the top-level container for all related operations (evidence, notifications, dossiers, chats). Call this first before any other operation. Generate a UUID v4 for `id`. For `useCaseId`, use the general GoCertius use case: `063a016a-1d62-4b7b-a24f-7cf4d1d289bf` unless a specific use case is required. Returns caseFileId needed for all subsequent calls."
        },
        {
          "name": "List Case File",
          "value": "case_file_list",
          "action": "List Case File",
          "description": "Lists all case files in your GoCertius account. Pass userId (from session_login or session_info) to scope results to your account. Returns paginated list with IDs, names, and status."
        },
        {
          "name": "Get Case File",
          "value": "case_file_get",
          "action": "Get Case File",
          "description": "Retrieves details of a specific case file. Requires: caseFileId. Use to verify a case file exists before creating evidence groups, dossiers, or notifications."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "caseFile"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "evidence_create",
      "options": [
        {
          "name": "Create Evidence",
          "value": "evidence_create",
          "action": "Create Evidence",
          "description": "Registers a NEW evidence record inside an evidence group. Requires: evidence_group_create → evidenceGroupId, case_file_create → caseFileId. Generate a UUID v4 for `id`. Compute the SHA-256 hex hash of the file BEFORE calling. Normal INTERNAL flow: call evidence_create with custodyType INTERNAL and NO fileUrl; the API returns uploadFileUrl, a presigned S3 URL. You MUST PUT the exact file bytes to uploadFileUrl, then verify with evidence_get/evidence_list, and ONLY THEN call evidence_seal. Do not seal an evidence group until every INTERNAL evidence file has been uploaded. Convenience flow: if you pass `fileUrl` (public HTTPS, no redirects, under 1 GiB), this tool downloads that URL and PUTs the bytes to uploadFileUrl for you. EXTERNAL flow: use custodyType EXTERNAL only when you intentionally register hash-only evidence; still generate a fresh UUID for each evidence. If an INTERNAL evidence creation/upload failed and you want to retry as EXTERNAL, create a NEW evidence id; do not reuse an id whose outcome is unknown. WARNING: the API sometimes returns {code:'EvidenceCreateError'} even when the evidence was successfully persisted — always verify with evidence_list before retrying."
        },
        {
          "name": "List Evidence",
          "value": "evidence_list",
          "action": "List Evidence",
          "description": "Lists all evidence records in a specific evidence group. Use to review uploaded documents before sealing the group, or to find a specific evidenceId. Requires: caseFileId and evidenceGroupId. Returns paginated list with IDs, titles, status, and timestamps."
        },
        {
          "name": "Seal Evidence",
          "value": "evidence_seal",
          "action": "Seal Evidence",
          "description": "Seal and certify an evidence group. Closes the group to new additions and triggers async timestamping. Returns immediately — the group transitions OPEN → CLOSING → CLOSED. Poll evidence_group_list until status is CLOSED before linking to a dossier."
        },
        {
          "name": "Get Evidence",
          "value": "evidence_get",
          "action": "Get Evidence",
          "description": "Retrieves a specific evidence record. Requires: evidence_create → evidenceId, evidence_group_create → evidenceGroupId, case_file_create → caseFileId. Returns status (COMPLETED|IN_PROCESS|ERROR), hash, and tspTimestamp when certified."
        },
        {
          "name": "Create Evidence Group",
          "value": "evidence_group_create",
          "action": "Create Evidence Group",
          "description": "Creates an evidence group inside a case file. Requires: case_file_create → caseFileId. Generate a UUID v4 for `id`. Set evidenceType to FILE, PHOTO, VIDEO, or WEB_PLUGIN. Returns evidenceGroupId. One group can contain multiple evidence records."
        },
        {
          "name": "List Evidence Group",
          "value": "evidence_group_list",
          "action": "List Evidence Group",
          "description": "Lists all evidence groups in a case file with their current status (OPEN, CLOSING, CLOSED). Use to find an existing group or check which groups are ready for sealing. Requires: caseFileId."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "evidence"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "dossier_evidence_link",
      "options": [
        {
          "name": "Link Dossier Evidence",
          "value": "dossier_evidence_link",
          "action": "Link Dossier Evidence",
          "description": "Links specific evidence items to a DRAFT dossier. Call once per case file containing evidences to link. After linking all evidences, call dossier_certify to finalize. For a single-group dossier, use dossier_group_certify instead (one step). Example: dossier_evidence_link({ caseFileId: '...', dossierId: '...', caseFileToLinkId: '...', ids: ['ev-uuid-1', 'ev-uuid-2'] })"
        },
        {
          "name": "Dossier Evidence List To Link",
          "value": "dossier_evidence_list_to_link",
          "action": "Dossier Evidence List To Link",
          "description": "Lists evidence items that are available to be linked to a dossier (CLOSED groups not yet linked). Requires: caseFileId and dossierId."
        },
        {
          "name": "List Dossier Evidence",
          "value": "dossier_evidence_list",
          "action": "List Dossier Evidence",
          "description": "Lists all evidence items linked to a dossier. Requires: caseFileId and dossierId."
        },
        {
          "name": "Get Dossier Evidence",
          "value": "dossier_evidence_get",
          "action": "Get Dossier Evidence",
          "description": "Retrieves details of a specific evidence item linked to a dossier. Requires: caseFileId, dossierId, evidenceId."
        },
        {
          "name": "Delete Dossier Evidence",
          "value": "dossier_evidence_delete",
          "action": "Delete Dossier Evidence",
          "description": "Removes an evidence item from a dossier. Only available while dossier is in DRAFT status. Requires: caseFileId, dossierId, evidenceId."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dossierEvidence"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "dossier_create",
      "options": [
        {
          "name": "Create Dossier",
          "value": "dossier_create",
          "action": "Create Dossier",
          "description": "Creates a dossier to aggregate certified evidence groups into a single tamper-evident PDF. Requires: case_file_create → caseFileId. Evidence groups must be in CLOSED status before linking. Generate a UUID v4 string for `id`. Returns dossierId. After creation, link evidence with dossier_evidence_link, then certify with dossier_certify."
        },
        {
          "name": "Update Dossier",
          "value": "dossier_update",
          "action": "Update Dossier",
          "description": "Updates the metadata of an existing dossier (name, template fields, expiry). Requires: dossier_create → dossierId, caseFileId. Only available while dossier is in DRAFT status."
        },
        {
          "name": "Certify Dossier",
          "value": "dossier_certify",
          "action": "Certify Dossier",
          "description": "Certifies a DRAFT dossier, locking in all its associated evidence groups. The dossier must be in DRAFT status. After certification it transitions to CERTIFIED and a tamper-evident PDF is generated. Prerequisites: the dossier must exist (dossier_create) and have evidence groups linked. Use dossier_group_certify instead if you want to create + certify in one step from a single evidence group. Example: dossier_certify({ caseFileId: '...', dossierId: '...' })"
        },
        {
          "name": "List Dossier",
          "value": "dossier_list",
          "action": "List Dossier",
          "description": "Lists all dossiers in a case file with their status and metadata. Use to find an existing dossierId or monitor certification progress. Requires: caseFileId. Returns paginated list with IDs, names, status, and creation dates."
        },
        {
          "name": "Get Dossier",
          "value": "dossier_get",
          "action": "Get Dossier",
          "description": "Retrieves the full details of a specific dossier including status, linked evidence, and download URLs. Use to check current state or get certificate download URLs after CERTIFIED. Requires: caseFileId and dossierId."
        },
        {
          "name": "List Dossier Template",
          "value": "dossier_template_list",
          "action": "List Dossier Template",
          "description": "Lists available dossier templates. No prerequisites. Returns template IDs and their translations per language. Use the returned id as dossierTemplateId in dossier_create."
        },
        {
          "name": "Preview Dossier",
          "value": "dossier_preview",
          "action": "Preview Dossier",
          "description": "Returns an HTML preview URL of a dossier before certification. Requires: caseFileId and dossierId."
        },
        {
          "name": "Dossier Document Url",
          "value": "dossier_document_url",
          "action": "Dossier Document Url",
          "description": "Returns the download URL for the certified dossier PDF. Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId."
        },
        {
          "name": "Dossier Package Url",
          "value": "dossier_package_url",
          "action": "Dossier Package Url",
          "description": "Returns the download URL for the full dossier package (PDF + evidence files). Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId."
        },
        {
          "name": "Dossier Visibility",
          "value": "dossier_visibility",
          "action": "Dossier Visibility",
          "description": "Updates the visibility (public/private) of a certified dossier. Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId."
        },
        {
          "name": "Delete Dossier",
          "value": "dossier_delete",
          "action": "Delete Dossier",
          "description": "Deletes a dossier. Available in DRAFT status (to discard before certification) or in CERTIFIED status (to permanently remove the certified dossier). Irreversible. Requires: caseFileId and dossierId."
        },
        {
          "name": "Certify Dossier Group",
          "value": "dossier_group_certify",
          "action": "Certify Dossier Group",
          "description": "Creates AND certifies a dossier from a single sealed evidence group in one call (express path). Requires: evidence_seal (CLOSED status), case_file_create → caseFileId, evidence_group_create → evidenceGroupId. Generate a UUID v4 string for `id`. Use when you have exactly one sealed evidence group and don't need multi-group aggregation. Returns dossierId immediately with CERTIFYING status → poll until CERTIFIED."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dossier"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "notification_document_add",
      "options": [
        {
          "name": "Add Notification Document",
          "value": "notification_document_add",
          "action": "Add Notification Document",
          "description": "Performs the notification_document_add operation. Review the API documentation for full field details."
        },
        {
          "name": "Create Notification Request",
          "value": "notification_request_create",
          "action": "Create Notification Request",
          "description": "Creates a certified notification request. Requires: case_file_create → caseFileId. Generate a UUID v4 for `id`. Set language to en_GB or es_ES. Returns notificationRequestId. Add at least one receiver with notification_receiver_add before sending. IMPORTANT: The `content` field must be valid HTML — plain text without HTML tags will not render on the recipient landing page. Only the following HTML formats are supported: paragraphs (<p>), bold (<strong>), italic (<em>), unordered lists (<ul><li>), ordered lists (<ol><li>). Do not use other HTML tags or CSS. Avoid special typographic characters (em dashes, smart quotes) in `subject`; use standard ASCII equivalents (hyphen, straight quotes) instead."
        },
        {
          "name": "Send Notification Request",
          "value": "notification_request_send",
          "action": "Send Notification Request",
          "description": "Trigger delivery of a certified notification to all added recipients. Returns immediately — delivery is async. Poll notification_request_status until status is DELIVERED before retrieving certificates."
        },
        {
          "name": "Notification Request Status",
          "value": "notification_request_status",
          "action": "Notification Request Status",
          "description": "Checks the delivery status of a certified notification. Requires: notificationRequestId, caseFileId. Returns status (CREATING|DRAFT|IN_PROCESS|SENT|PARTIALLY_READ|FULLY_READ|PARTIALLY_ANSWERED|FULLY_ANSWERED). Poll until status is SENT or beyond. Do not call notification_certificate_get while status is CREATING, DRAFT, or IN_PROCESS."
        },
        {
          "name": "Add Notification Receiver",
          "value": "notification_receiver_add",
          "action": "Add Notification Receiver",
          "description": "Adds a recipient to a notification request. Requires: notification_request_create → notificationRequestId, case_file_create → caseFileId. The `id` can be a UUID v4 or custom string (e.g. your internal user ID). Returns receiverId — save it for notification_certificate_get. Add all receivers before calling notification_request_send."
        },
        {
          "name": "Get Notification Certificate",
          "value": "notification_certificate_get",
          "action": "Get Notification Certificate",
          "description": "Creates or retrieves a PDF certificate for a specific notification receiver. Requires notification_request_send and notification_receiver_add. Generate a UUID v4 for `id` the first time and reuse that id when polling. This tool is idempotent: it first lists existing certificates for the receiver and, if `id` already exists, returns it instead of creating it again. If the certificate status is CERTIFIED, the response includes documentUrl when available. If it is CERTIFYING, poll this same tool with the same id."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "notification"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "chat_create",
      "options": [
        {
          "name": "Create Chat",
          "value": "chat_create",
          "action": "Create Chat",
          "description": "Creates a certified chat channel (Telegram). IMPORTANT: Chats can only be created in the user's personal case file (created automatically when the GoCertius account was opened). Do not use a manually created case file — use session_info → case_file_list to find the personal case file (oldest createdAt, owned by the user). Generate a UUID v4 for `id`. Set service to Telegram. Returns immediately and the chat may start in status `creating`; call chat_get and wait until it is registered/active before requesting the invitation URL or certificates."
        },
        {
          "name": "Get Chat",
          "value": "chat_get",
          "action": "Get Chat",
          "description": "Retrieves details of a certified chat. Requires: personal caseFileId and chat_create → chatId. Returns status, participants, and registeredAt timestamp. After chat_create, poll chat_get until status is active/registered and registeredAt is present; createdAt is not enough for certificate creation."
        },
        {
          "name": "Chat Invitation Url",
          "value": "chat_invitation_url",
          "action": "Chat Invitation Url",
          "description": "Returns the Telegram invitation URL for a certified chat. Requires: chat_create → chatId and the personal caseFileId. Do not call while chat_get still shows status `creating`; wait until the chat is registered/active, otherwise the API can answer Chat not found. Share the returned invitationUrl with participants so they can join the certified channel."
        },
        {
          "name": "Create Chat Certificate",
          "value": "chat_certificate_create",
          "action": "Create Chat Certificate",
          "description": "Creates a certificate of a range of messages from a certified chat. Requires: chat_create → chatId, personal caseFileId, chat_get → registeredAt, and messages already present in the Telegram channel. Generate a UUID v4 for `id`. Do not use createdAt as a substitute for registeredAt; if registeredAt is missing, the chat is not ready to certify. Specify chatMessagesFrom and chatMessagesTo as ISO timestamps (chatMessagesFrom must be AFTER registeredAt). ASYNC: poll chat_certificate_get until status === CERTIFIED."
        },
        {
          "name": "Get Chat Certificate",
          "value": "chat_certificate_get",
          "action": "Get Chat Certificate",
          "description": "Retrieves a certified chat certificate including its status, message range, and PDF download URL. Prerequisites: the certificate must have been created with chat_certificate_create. Returns documentUrl when status is CERTIFIED. Example: chat_certificate_get({ caseFileId: '...', chatId: '...', id: '...' })"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "chat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "session_login",
      "options": [
        {
          "name": "Login Session",
          "value": "session_login",
          "action": "Login Session",
          "description": "Authenticate with GoCertius. Reads MCP_AUTH_EMAIL to discover the auth type (Password or OpenId) for that account. For Password accounts: uses MCP_AUTH_PASSWORD to obtain a session JWT. For OpenId accounts: starts an Azure AD device flow — on the FIRST call returns a browser link and code for the user to approve with Microsoft Authenticator; call session_login AGAIN after approving to complete authentication."
        },
        {
          "name": "Session Info",
          "value": "session_info",
          "action": "Session Info",
          "description": "Returns the authenticated user's session info including userId, session type (Password or OpenId), and for OpenId sessions: issuer, clientId, and scopes. Use this to retrieve the userId (UUID) required by case_file_list and other user-scoped operations. Prerequisites: a valid session (call session_login first if needed). Example: session_info() → { userId: '...uuid...', type: 'Password' }"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "session"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Case File",
      "value": "case_file_create",
      "action": "Create Case File",
      "description": "Creates a new case file — the top-level container for all related operations (evidence, notifications, dossiers, chats). Call this first before any other operation. Generate a UUID v4 for `id`. For `useCaseId`, use the general GoCertius use case: `063a016a-1d62-4b7b-a24f-7cf4d1d289bf` unless a specific use case is required. Returns caseFileId needed for all subsequent calls.",
      "resource": "caseFile"
    },
    {
      "name": "List Case File",
      "value": "case_file_list",
      "action": "List Case File",
      "description": "Lists all case files in your GoCertius account. Pass userId (from session_login or session_info) to scope results to your account. Returns paginated list with IDs, names, and status.",
      "resource": "caseFile"
    },
    {
      "name": "Get Case File",
      "value": "case_file_get",
      "action": "Get Case File",
      "description": "Retrieves details of a specific case file. Requires: caseFileId. Use to verify a case file exists before creating evidence groups, dossiers, or notifications.",
      "resource": "caseFile"
    },
    {
      "name": "Create Evidence",
      "value": "evidence_create",
      "action": "Create Evidence",
      "description": "Registers a NEW evidence record inside an evidence group. Requires: evidence_group_create → evidenceGroupId, case_file_create → caseFileId. Generate a UUID v4 for `id`. Compute the SHA-256 hex hash of the file BEFORE calling. Normal INTERNAL flow: call evidence_create with custodyType INTERNAL and NO fileUrl; the API returns uploadFileUrl, a presigned S3 URL. You MUST PUT the exact file bytes to uploadFileUrl, then verify with evidence_get/evidence_list, and ONLY THEN call evidence_seal. Do not seal an evidence group until every INTERNAL evidence file has been uploaded. Convenience flow: if you pass `fileUrl` (public HTTPS, no redirects, under 1 GiB), this tool downloads that URL and PUTs the bytes to uploadFileUrl for you. EXTERNAL flow: use custodyType EXTERNAL only when you intentionally register hash-only evidence; still generate a fresh UUID for each evidence. If an INTERNAL evidence creation/upload failed and you want to retry as EXTERNAL, create a NEW evidence id; do not reuse an id whose outcome is unknown. WARNING: the API sometimes returns {code:'EvidenceCreateError'} even when the evidence was successfully persisted — always verify with evidence_list before retrying.",
      "resource": "evidence"
    },
    {
      "name": "List Evidence",
      "value": "evidence_list",
      "action": "List Evidence",
      "description": "Lists all evidence records in a specific evidence group. Use to review uploaded documents before sealing the group, or to find a specific evidenceId. Requires: caseFileId and evidenceGroupId. Returns paginated list with IDs, titles, status, and timestamps.",
      "resource": "evidence"
    },
    {
      "name": "Seal Evidence",
      "value": "evidence_seal",
      "action": "Seal Evidence",
      "description": "Seal and certify an evidence group. Closes the group to new additions and triggers async timestamping. Returns immediately — the group transitions OPEN → CLOSING → CLOSED. Poll evidence_group_list until status is CLOSED before linking to a dossier.",
      "resource": "evidence"
    },
    {
      "name": "Get Evidence",
      "value": "evidence_get",
      "action": "Get Evidence",
      "description": "Retrieves a specific evidence record. Requires: evidence_create → evidenceId, evidence_group_create → evidenceGroupId, case_file_create → caseFileId. Returns status (COMPLETED|IN_PROCESS|ERROR), hash, and tspTimestamp when certified.",
      "resource": "evidence"
    },
    {
      "name": "Create Evidence Group",
      "value": "evidence_group_create",
      "action": "Create Evidence Group",
      "description": "Creates an evidence group inside a case file. Requires: case_file_create → caseFileId. Generate a UUID v4 for `id`. Set evidenceType to FILE, PHOTO, VIDEO, or WEB_PLUGIN. Returns evidenceGroupId. One group can contain multiple evidence records.",
      "resource": "evidence"
    },
    {
      "name": "List Evidence Group",
      "value": "evidence_group_list",
      "action": "List Evidence Group",
      "description": "Lists all evidence groups in a case file with their current status (OPEN, CLOSING, CLOSED). Use to find an existing group or check which groups are ready for sealing. Requires: caseFileId.",
      "resource": "evidence"
    },
    {
      "name": "Link Dossier Evidence",
      "value": "dossier_evidence_link",
      "action": "Link Dossier Evidence",
      "description": "Links specific evidence items to a DRAFT dossier. Call once per case file containing evidences to link. After linking all evidences, call dossier_certify to finalize. For a single-group dossier, use dossier_group_certify instead (one step). Example: dossier_evidence_link({ caseFileId: '...', dossierId: '...', caseFileToLinkId: '...', ids: ['ev-uuid-1', 'ev-uuid-2'] })",
      "resource": "dossierEvidence"
    },
    {
      "name": "Dossier Evidence List To Link",
      "value": "dossier_evidence_list_to_link",
      "action": "Dossier Evidence List To Link",
      "description": "Lists evidence items that are available to be linked to a dossier (CLOSED groups not yet linked). Requires: caseFileId and dossierId.",
      "resource": "dossierEvidence"
    },
    {
      "name": "List Dossier Evidence",
      "value": "dossier_evidence_list",
      "action": "List Dossier Evidence",
      "description": "Lists all evidence items linked to a dossier. Requires: caseFileId and dossierId.",
      "resource": "dossierEvidence"
    },
    {
      "name": "Get Dossier Evidence",
      "value": "dossier_evidence_get",
      "action": "Get Dossier Evidence",
      "description": "Retrieves details of a specific evidence item linked to a dossier. Requires: caseFileId, dossierId, evidenceId.",
      "resource": "dossierEvidence"
    },
    {
      "name": "Delete Dossier Evidence",
      "value": "dossier_evidence_delete",
      "action": "Delete Dossier Evidence",
      "description": "Removes an evidence item from a dossier. Only available while dossier is in DRAFT status. Requires: caseFileId, dossierId, evidenceId.",
      "resource": "dossierEvidence"
    },
    {
      "name": "Create Dossier",
      "value": "dossier_create",
      "action": "Create Dossier",
      "description": "Creates a dossier to aggregate certified evidence groups into a single tamper-evident PDF. Requires: case_file_create → caseFileId. Evidence groups must be in CLOSED status before linking. Generate a UUID v4 string for `id`. Returns dossierId. After creation, link evidence with dossier_evidence_link, then certify with dossier_certify.",
      "resource": "dossier"
    },
    {
      "name": "Update Dossier",
      "value": "dossier_update",
      "action": "Update Dossier",
      "description": "Updates the metadata of an existing dossier (name, template fields, expiry). Requires: dossier_create → dossierId, caseFileId. Only available while dossier is in DRAFT status.",
      "resource": "dossier"
    },
    {
      "name": "Certify Dossier",
      "value": "dossier_certify",
      "action": "Certify Dossier",
      "description": "Certifies a DRAFT dossier, locking in all its associated evidence groups. The dossier must be in DRAFT status. After certification it transitions to CERTIFIED and a tamper-evident PDF is generated. Prerequisites: the dossier must exist (dossier_create) and have evidence groups linked. Use dossier_group_certify instead if you want to create + certify in one step from a single evidence group. Example: dossier_certify({ caseFileId: '...', dossierId: '...' })",
      "resource": "dossier"
    },
    {
      "name": "List Dossier",
      "value": "dossier_list",
      "action": "List Dossier",
      "description": "Lists all dossiers in a case file with their status and metadata. Use to find an existing dossierId or monitor certification progress. Requires: caseFileId. Returns paginated list with IDs, names, status, and creation dates.",
      "resource": "dossier"
    },
    {
      "name": "Get Dossier",
      "value": "dossier_get",
      "action": "Get Dossier",
      "description": "Retrieves the full details of a specific dossier including status, linked evidence, and download URLs. Use to check current state or get certificate download URLs after CERTIFIED. Requires: caseFileId and dossierId.",
      "resource": "dossier"
    },
    {
      "name": "List Dossier Template",
      "value": "dossier_template_list",
      "action": "List Dossier Template",
      "description": "Lists available dossier templates. No prerequisites. Returns template IDs and their translations per language. Use the returned id as dossierTemplateId in dossier_create.",
      "resource": "dossier"
    },
    {
      "name": "Preview Dossier",
      "value": "dossier_preview",
      "action": "Preview Dossier",
      "description": "Returns an HTML preview URL of a dossier before certification. Requires: caseFileId and dossierId.",
      "resource": "dossier"
    },
    {
      "name": "Dossier Document Url",
      "value": "dossier_document_url",
      "action": "Dossier Document Url",
      "description": "Returns the download URL for the certified dossier PDF. Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId.",
      "resource": "dossier"
    },
    {
      "name": "Dossier Package Url",
      "value": "dossier_package_url",
      "action": "Dossier Package Url",
      "description": "Returns the download URL for the full dossier package (PDF + evidence files). Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId.",
      "resource": "dossier"
    },
    {
      "name": "Dossier Visibility",
      "value": "dossier_visibility",
      "action": "Dossier Visibility",
      "description": "Updates the visibility (public/private) of a certified dossier. Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId.",
      "resource": "dossier"
    },
    {
      "name": "Delete Dossier",
      "value": "dossier_delete",
      "action": "Delete Dossier",
      "description": "Deletes a dossier. Available in DRAFT status (to discard before certification) or in CERTIFIED status (to permanently remove the certified dossier). Irreversible. Requires: caseFileId and dossierId.",
      "resource": "dossier"
    },
    {
      "name": "Certify Dossier Group",
      "value": "dossier_group_certify",
      "action": "Certify Dossier Group",
      "description": "Creates AND certifies a dossier from a single sealed evidence group in one call (express path). Requires: evidence_seal (CLOSED status), case_file_create → caseFileId, evidence_group_create → evidenceGroupId. Generate a UUID v4 string for `id`. Use when you have exactly one sealed evidence group and don't need multi-group aggregation. Returns dossierId immediately with CERTIFYING status → poll until CERTIFIED.",
      "resource": "dossier"
    },
    {
      "name": "Add Notification Document",
      "value": "notification_document_add",
      "action": "Add Notification Document",
      "description": "Performs the notification_document_add operation. Review the API documentation for full field details.",
      "resource": "notification"
    },
    {
      "name": "Create Notification Request",
      "value": "notification_request_create",
      "action": "Create Notification Request",
      "description": "Creates a certified notification request. Requires: case_file_create → caseFileId. Generate a UUID v4 for `id`. Set language to en_GB or es_ES. Returns notificationRequestId. Add at least one receiver with notification_receiver_add before sending. IMPORTANT: The `content` field must be valid HTML — plain text without HTML tags will not render on the recipient landing page. Only the following HTML formats are supported: paragraphs (<p>), bold (<strong>), italic (<em>), unordered lists (<ul><li>), ordered lists (<ol><li>). Do not use other HTML tags or CSS. Avoid special typographic characters (em dashes, smart quotes) in `subject`; use standard ASCII equivalents (hyphen, straight quotes) instead.",
      "resource": "notification"
    },
    {
      "name": "Send Notification Request",
      "value": "notification_request_send",
      "action": "Send Notification Request",
      "description": "Trigger delivery of a certified notification to all added recipients. Returns immediately — delivery is async. Poll notification_request_status until status is DELIVERED before retrieving certificates.",
      "resource": "notification"
    },
    {
      "name": "Notification Request Status",
      "value": "notification_request_status",
      "action": "Notification Request Status",
      "description": "Checks the delivery status of a certified notification. Requires: notificationRequestId, caseFileId. Returns status (CREATING|DRAFT|IN_PROCESS|SENT|PARTIALLY_READ|FULLY_READ|PARTIALLY_ANSWERED|FULLY_ANSWERED). Poll until status is SENT or beyond. Do not call notification_certificate_get while status is CREATING, DRAFT, or IN_PROCESS.",
      "resource": "notification"
    },
    {
      "name": "Add Notification Receiver",
      "value": "notification_receiver_add",
      "action": "Add Notification Receiver",
      "description": "Adds a recipient to a notification request. Requires: notification_request_create → notificationRequestId, case_file_create → caseFileId. The `id` can be a UUID v4 or custom string (e.g. your internal user ID). Returns receiverId — save it for notification_certificate_get. Add all receivers before calling notification_request_send.",
      "resource": "notification"
    },
    {
      "name": "Get Notification Certificate",
      "value": "notification_certificate_get",
      "action": "Get Notification Certificate",
      "description": "Creates or retrieves a PDF certificate for a specific notification receiver. Requires notification_request_send and notification_receiver_add. Generate a UUID v4 for `id` the first time and reuse that id when polling. This tool is idempotent: it first lists existing certificates for the receiver and, if `id` already exists, returns it instead of creating it again. If the certificate status is CERTIFIED, the response includes documentUrl when available. If it is CERTIFYING, poll this same tool with the same id.",
      "resource": "notification"
    },
    {
      "name": "Create Chat",
      "value": "chat_create",
      "action": "Create Chat",
      "description": "Creates a certified chat channel (Telegram). IMPORTANT: Chats can only be created in the user's personal case file (created automatically when the GoCertius account was opened). Do not use a manually created case file — use session_info → case_file_list to find the personal case file (oldest createdAt, owned by the user). Generate a UUID v4 for `id`. Set service to Telegram. Returns immediately and the chat may start in status `creating`; call chat_get and wait until it is registered/active before requesting the invitation URL or certificates.",
      "resource": "chat"
    },
    {
      "name": "Get Chat",
      "value": "chat_get",
      "action": "Get Chat",
      "description": "Retrieves details of a certified chat. Requires: personal caseFileId and chat_create → chatId. Returns status, participants, and registeredAt timestamp. After chat_create, poll chat_get until status is active/registered and registeredAt is present; createdAt is not enough for certificate creation.",
      "resource": "chat"
    },
    {
      "name": "Chat Invitation Url",
      "value": "chat_invitation_url",
      "action": "Chat Invitation Url",
      "description": "Returns the Telegram invitation URL for a certified chat. Requires: chat_create → chatId and the personal caseFileId. Do not call while chat_get still shows status `creating`; wait until the chat is registered/active, otherwise the API can answer Chat not found. Share the returned invitationUrl with participants so they can join the certified channel.",
      "resource": "chat"
    },
    {
      "name": "Create Chat Certificate",
      "value": "chat_certificate_create",
      "action": "Create Chat Certificate",
      "description": "Creates a certificate of a range of messages from a certified chat. Requires: chat_create → chatId, personal caseFileId, chat_get → registeredAt, and messages already present in the Telegram channel. Generate a UUID v4 for `id`. Do not use createdAt as a substitute for registeredAt; if registeredAt is missing, the chat is not ready to certify. Specify chatMessagesFrom and chatMessagesTo as ISO timestamps (chatMessagesFrom must be AFTER registeredAt). ASYNC: poll chat_certificate_get until status === CERTIFIED.",
      "resource": "chat"
    },
    {
      "name": "Get Chat Certificate",
      "value": "chat_certificate_get",
      "action": "Get Chat Certificate",
      "description": "Retrieves a certified chat certificate including its status, message range, and PDF download URL. Prerequisites: the certificate must have been created with chat_certificate_create. Returns documentUrl when status is CERTIFIED. Example: chat_certificate_get({ caseFileId: '...', chatId: '...', id: '...' })",
      "resource": "chat"
    },
    {
      "name": "Login Session",
      "value": "session_login",
      "action": "Login Session",
      "description": "Authenticate with GoCertius. Reads MCP_AUTH_EMAIL to discover the auth type (Password or OpenId) for that account. For Password accounts: uses MCP_AUTH_PASSWORD to obtain a session JWT. For OpenId accounts: starts an Azure AD device flow — on the FIRST call returns a browser link and code for the user to approve with Microsoft Authenticator; call session_login AGAIN after approving to complete authentication.",
      "resource": "session"
    },
    {
      "name": "Session Info",
      "value": "session_info",
      "action": "Session Info",
      "description": "Returns the authenticated user's session info including userId, session type (Password or OpenId), and for OpenId sessions: issuer, clientId, and scopes. Use this to retrieve the userId (UUID) required by case_file_list and other user-scoped operations. Prerequisites: a valid session (call session_login first if needed). Example: session_info() → { userId: '...uuid...', type: 'Password' }",
      "resource": "session"
    }
  ]

npm_readme:
  # GoCertius — n8n connector

  > MCP server for GoCertius: certified evidence, dossiers, notifications and chats via AI agents.

  Install this connector and use GoCertius operations as steps inside any n8n workflow. Each operation maps to one capability of the underlying GoCertius platform.

  ## Install (self-hosted n8n)

  ```bash
  npm install @g-digital/n8n-nodes-gocertius
  ```

  Then restart n8n. The node will appear in the Nodes panel under "GoCertius".

  ## Using with n8n AI Agent

  For AI-driven automation, configure an **n8n AI Agent node** with the following system prompt. It covers all lifecycle workflows: evidence creation, certified notifications, signature processes, dossier certification, and certified chats.

  **→ Full system prompt and workflow guide:** [`@g-digital/n8n-agent-system-prompt`](https://www.npmjs.com/package/@g-digital/mcp-gocertius) — see the `docs/n8n-agent-workflows/gocertius-ead-system-prompt.md` in [MCP_Market_Distribution](https://github.com/g-digital-by-Garrigues/MCP_Market_Distribution/blob/main/docs/n8n-agent-workflows/gocertius-ead-system-prompt.md).

  ### Quick system prompt snippet

  Paste this into your AI Agent node's **System Message**:

  ```
  You are a Digital Trust assistant using the GoCertius n8n connector.
  UUID generation: generate UUID v4 for all `id` fields you must supply.
  IDs from responses: never invent path parameters — always use values returned by previous tool calls.
  Async operations: after evidence_seal, dossier_certify, signature activation, and chat certification — poll the corresponding list/status tool until the terminal state is reached before proceeding.
  File uploads: when a tool returns uploadFileUrl or url, PUT the file bytes there with a separate HTTP Request node before calling the next step.
  See the full lifecycle guide at: https://github.com/g-digital-by-Garrigues/MCP_Market_Distribution/blob/main/docs/n8n-agent-workflows/gocertius-ead-system-prompt.md
  ```

  ## Operations

  | Operation | Description |
  |---|---|
  | `evidence_create` | Registers a NEW evidence record inside an evidence group. Requires: evidence_group_create → evidenceGroupId, case_file_create → caseFileId. Generate a UUID v4 for `id`. Compute the SHA-256 hex hash of the file BEFORE calling. Normal INTERNAL flow: call evidence_create with custodyType INTERNAL and NO fileUrl; the API returns uploadFileUrl, a presigned S3 URL. You MUST PUT the exact file bytes to uploadFileUrl, then verify with evidence_get/evidence_list, and ONLY THEN call evidence_seal. Do not seal an evidence group until every INTERNAL evidence file has been uploaded. Convenience flow: if you pass `fileUrl` (public HTTPS, no redirects, under 1 GiB), this tool downloads that URL and PUTs the bytes to uploadFileUrl for you. EXTERNAL flow: use custodyType EXTERNAL only when you intentionally register hash-only evidence; still generate a fresh UUID for each evidence. If an INTERNAL evidence creation/upload failed and you want to retry as EXTERNAL, create a NEW evidence id; do not reuse an id whose outcome is unknown. WARNING: the API sometimes returns {code:'EvidenceCreateError'} even when the evidence was successfully persisted — always verify with evidence_list before retrying. |
  | `evidence_list` | Lists all evidence records in a specific evidence group. Use to review uploaded documents before sealing the group, or to find a specific evidenceId. Requires: caseFileId and evidenceGroupId. Returns paginated list with IDs, titles, status, and timestamps. |
  | `evidence_seal` | Seal and certify an evidence group. Closes the group to new additions and triggers async timestamping. Returns immediately — the group transitions OPEN → CLOSING → CLOSED. Poll evidence_group_list until status is CLOSED before linking to a dossier. |
  | `evidence_get` | Retrieves a specific evidence record. Requires: evidence_create → evidenceId, evidence_group_create → evidenceGroupId, case_file_create → caseFileId. Returns status (COMPLETED|IN_PROCESS|ERROR), hash, and tspTimestamp when certified. |
  | `evidence_group_create` | Creates an evidence group inside a case file. Requires: case_file_create → caseFileId. Generate a UUID v4 for `id`. Set evidenceType to FILE, PHOTO, VIDEO, or WEB_PLUGIN. Returns evidenceGroupId. One group can contain multiple evidence records. |
  | `evidence_group_list` | Lists all evidence groups in a case file with their current status (OPEN, CLOSING, CLOSED). Use to find an existing group or check which groups are ready for sealing. Requires: caseFileId. |
  | `dossier_create` | Creates a dossier to aggregate certified evidence groups into a single tamper-evident PDF. Requires: case_file_create → caseFileId. Evidence groups must be in CLOSED status before linking. Generate a UUID v4 string for `id`. Returns dossierId. After creation, link evidence with dossier_evidence_link, then certify with dossier_certify. |
  | `dossier_update` | Updates the metadata of an existing dossier (name, template fields, expiry). Requires: dossier_create → dossierId, caseFileId. Only available while dossier is in DRAFT status. |
  | `dossier_certify` | Certifies a DRAFT dossier, locking in all its associated evidence groups. The dossier must be in DRAFT status. After certification it transitions to CERTIFIED and a tamper-evident PDF is generated. Prerequisites: the dossier must exist (dossier_create) and have evidence groups linked. Use dossier_group_certify instead if you want to create + certify in one step from a single evidence group. Example: dossier_certify({ caseFileId: '...', dossierId: '...' }) |
  | `dossier_list` | Lists all dossiers in a case file with their status and metadata. Use to find an existing dossierId or monitor certification progress. Requires: caseFileId. Returns paginated list with IDs, names, status, and creation dates. |
  | `dossier_get` | Retrieves the full details of a specific dossier including status, linked evidence, and download URLs. Use to check current state or get certificate download URLs after CERTIFIED. Requires: caseFileId and dossierId. |
  | `dossier_template_list` | Lists available dossier templates. No prerequisites. Returns template IDs and their translations per language. Use the returned id as dossierTemplateId in dossier_create. |
  | `dossier_preview` | Returns an HTML preview URL of a dossier before certification. Requires: caseFileId and dossierId. |
  | `dossier_document_url` | Returns the download URL for the certified dossier PDF. Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId. |
  | `dossier_package_url` | Returns the download URL for the full dossier package (PDF + evidence files). Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId. |
  | `dossier_visibility` | Updates the visibility (public/private) of a certified dossier. Requires: dossier_certify (CERTIFIED status), caseFileId, dossierId. |
  | `dossier_delete` | Deletes a dossier. Available in DRAFT status (to discard before certification) or in CERTIFIED status (to permanently remove the certified dossier). Irreversible. Requires: caseFileId and dossierId. |
  | `dossier_group_certify` | Creates AND certifies a dossier from a single sealed evidence group in one call (express path). Requires: evidence_seal (CLOSED status), case_file_create → caseFileId, evidence_group_create → evidenceGroupId. Generate a UUID v4 string for `id`. Use when you have exactly one sealed evidence group and don't need multi-group aggregation. Returns dossierId immediately with CERTIFYING status → poll until CERTIFIED. |
  | `dossier_evidence_link` | Links specific evidence items to a DRAFT dossier. Call once per case file containing evidences to link. After linking all evidences, call dossier_certify to finalize. For a single-group dossier, use dossier_group_certify instead (one step). Example: dossier_evidence_link({ caseFileId: '...', dossierId: '...', caseFileToLinkId: '...', ids: ['ev-uuid-1', 'ev-uuid-2'] }) |
  | `dossier_evidence_list_to_link` | Lists evidence items that are available to be linked to a dossier (CLOSED groups not yet linked). Requires: caseFileId and dossierId. |
  | `dossier_evidence_list` | Lists all evidence items linked to a dossier. Requires: caseFileId and dossierId. |
  | `dossier_evidence_get` | Retrieves details of a specific evidence item linked to a dossier. Requires: caseFileId, dossierId, evidenceId. |
  | `dossier_evidence_delete` | Removes an evidence item from a dossier. Only available while dossier is in DRAFT status. Requires: caseFileId, dossierId, evidenceId. |
  | `notification_document_add` | Performs the notification_document_add operation. Review the API documentation for full field details. |
  | `notification_request_create` | Creates a certified notification request. Requires: case_file_create → caseFileId. Generate a UUID v4 for `id`. Set language to en_GB or es_ES. Returns notificationRequestId. Add at least one receiver with notification_receiver_add before sending. IMPORTANT: The `content` field must be valid HTML — plain text without HTML tags will not render on the recipient landing page. Only the following HTML formats are supported: paragraphs (<p>), bold (<strong>), italic (<em>), unordered lists (<ul><li>), ordered lists (<ol><li>). Do not use other HTML tags or CSS. Avoid special typographic characters (em dashes, smart quotes) in `subject`; use standard ASCII equivalents (hyphen, straight quotes) instead. |
  | `notification_request_send` | Trigger delivery of a certified notification to all added recipients. Returns immediately — delivery is async. Poll notification_request_status until status is DELIVERED before retrieving certificates. |
  | `notification_request_status` | Checks the delivery status of a certified notification. Requires: notificationRequestId, caseFileId. Returns status (CREATING|DRAFT|IN_PROCESS|SENT|PARTIALLY_READ|FULLY_READ|PARTIALLY_ANSWERED|FULLY_ANSWERED). Poll until status is SENT or beyond. Do not call notification_certificate_get while status is CREATING, DRAFT, or IN_PROCESS. |
  | `notification_receiver_add` | Adds a recipient to a notification request. Requires: notification_request_create → notificationRequestId, case_file_create → caseFileId. The `id` can be a UUID v4 or custom string (e.g. your internal user ID). Returns receiverId — save it for notification_certificate_get. Add all receivers before calling notification_request_send. |
  | `notification_certificate_get` | Creates or retrieves a PDF certificate for a specific notification receiver. Requires notification_request_send and notification_receiver_add. Generate a UUID v4 for `id` the first time and reuse that id when polling. This tool is idempotent: it first lists existing certificates for the receiver and, if `id` already exists, returns it instead of creating it again. If the certificate status is CERTIFIED, the response includes documentUrl when available. If it is CERTIFYING, poll this same tool with the same id. |
  | `case_file_create` | Creates a new case file — the top-level container for all related operations (evidence, notifications, dossiers, chats). Call this first before any other operation. Generate a UUID v4 for `id`. For `useCaseId`, use the general GoCertius use case: `063a016a-1d62-4b7b-a24f-7cf4d1d289bf` unless a specific use case is required. Returns caseFileId needed for all subsequent calls. |
  | `case_file_list` | Lists all case files in your GoCertius account. Pass userId (from session_login or session_info) to scope results to your account. Returns paginated list with IDs, names, and status. |
  | `case_file_get` | Retrieves details of a specific case file. Requires: caseFileId. Use to verify a case file exists before creating evidence groups, dossiers, or notifications. |
  | `chat_create` | Creates a certified chat channel (Telegram). IMPORTANT: Chats can only be created in the user's personal case file (created automatically when the GoCertius account was opened). Do not use a manually created case file — use session_info → case_file_list to find the personal case file (oldest createdAt, owned by the user). Generate a UUID v4 for `id`. Set service to Telegram. Returns immediately and the chat may start in status `creating`; call chat_get and wait until it is registered/active before requesting the invitation URL or certificates. |
  | `chat_get` | Retrieves details of a certified chat. Requires: personal caseFileId and chat_create → chatId. Returns status, participants, and registeredAt timestamp. After chat_create, poll chat_get until status is active/registered and registeredAt is present; createdAt is not enough for certificate creation. |
  | `chat_invitation_url` | Returns the Telegram invitation URL for a certified chat. Requires: chat_create → chatId and the personal caseFileId. Do not call while chat_get still shows status `creating`; wait until the chat is registered/active, otherwise the API can answer Chat not found. Share the returned invitationUrl with participants so they can join the certified channel. |
  | `chat_certificate_create` | Creates a certificate of a range of messages from a certified chat. Requires: chat_create → chatId, personal caseFileId, chat_get → registeredAt, and messages already present in the Telegram channel. Generate a UUID v4 for `id`. Do not use createdAt as a substitute for registeredAt; if registeredAt is missing, the chat is not ready to certify. Specify chatMessagesFrom and chatMessagesTo as ISO timestamps (chatMessagesFrom must be AFTER registeredAt). ASYNC: poll chat_certificate_get until status === CERTIFIED. |
  | `chat_certificate_get` | Retrieves a certified chat certificate including its status, message range, and PDF download URL. Prerequisites: the certificate must have been created with chat_certificate_create. Returns documentUrl when status is CERTIFIED. Example: chat_certificate_get({ caseFileId: '...', chatId: '...', id: '...' }) |
  | `session_login` | Authenticate with GoCertius. Reads MCP_AUTH_EMAIL to discover the auth type (Password or OpenId) for that account. For Password accounts: uses MCP_AUTH_PASSWORD to obtain a session JWT. For OpenId accounts: starts an Azure AD device flow — on the FIRST call returns a browser link and code for the user to approve with Microsoft Authenticator; call session_login AGAIN after approving to complete authentication. |
  | `session_info` | Returns the authenticated user's session info including userId, session type (Password or OpenId), and for OpenId sessions: issuer, clientId, and scopes. Use this to retrieve the userId (UUID) required by case_file_list and other user-scoped operations. Prerequisites: a valid session (call session_login first if needed). Example: session_info() → { userId: '...uuid...', type: 'Password' } |

  ## Credentials

  This node requires a "GoCertius API" credential with the following fields:

  | Field | Description | Secret? |
  |---|---|---|
  | `API Base URL` | Base URL of the GoCertius REST API. Production default: `https://api-gocertius.gocertius.io` Leave blank only if you know your environment uses a different endpoint. | no |
  | `MCP_AUTH_EMAIL` | Your GoCertius account email (Flow 1). Configure one of Flow 1 or Flow 2. | no |
  | `MCP_AUTH_PASSWORD` | Your GoCertius account password (Flow 1, email/password accounts) (See https://www.gocertius.io for credential acquisition.) | yes |
  > **Need credentials?** Sign up or log in at [https://www.gocertius.io](https://www.gocertius.io).

  ## Use as an AI Agent tool

  This node is flagged `usableAsTool: true`, so any n8n AI Agent (n8n ≥ 1.79.0) can consume it dynamically: drag it into the workflow and wire its main output to an AI Agent's "Tool" input.

  For best results pair with an AI Agent node running **V2** — V3 has a known empty-tool-response bug in some recent n8n versions (see [n8n issue #26202](https://github.com/n8n-io/n8n/issues/26202)).

  ## License

  MIT. See [LICENSE](./LICENSE).

ai_documentation_summary:
  {"purpose":"GoCertius is an n8n connector/MCP server for managing digital trust workflows such as certified evidence, dossiers, notifications, and chats. It lets AI agents and workflows create, upload, seal, certify, and retrieve evidence and dossier records in GoCertius.","capabilities":["Create evidence records with internal or external custody modes","List and retrieve evidence within an evidence group","Create, list, get, update, and certify evidence groups and dossiers","Seal evidence groups to trigger asynchronous certification/timestamping","Work with file uploads via presigned upload URLs or direct fileUrl ingestion","Support AI-agent-driven lifecycle workflows for evidence, dossier, signature, notifications, and certified chats"],"authentication":"Not specified in the README","commonUseCases":["Registering and certifying digital evidence for legal or compliance workflows","Building dossiers from certified evidence groups and generating tamper-evident PDFs","Automating evidence sealing and dossier certification with an n8n AI Agent"],"limitations":["Many operations are asynchronous and require polling until a terminal state is reached","Internal evidence uploads require a separate PUT to the returned upload URL before sealing","Evidence groups must be CLOSED before being linked to or certified in a dossier","The README explicitly warns that evidence_create may return an error response even when the record was persisted, so verification via evidence_list is required"],"relatedNodes":["n8n AI Agent","HTTP Request"]}


node_type: n8n-nodes-infini-analytics.infiniAnalytics
package_name: n8n-nodes-infini-analytics
display_name: Infini Analytics
description: Monitor and debug your automation runs in Infini Analytics. https://analytics.infini.es/
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: raul_izquierdo
author_github_url: https://github.com/InfiniWorkspace/infinianalytics-conector-n8n.git
npm_package_name: n8n-nodes-infini-analytics
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.593Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-infini-analytics

  This is an n8n community node. It lets you use [Infini Analytics](https://analytics.infini.es) in your n8n workflows.

  Infini Analytics is a monitoring and observability platform for your n8n automations and AI agents. It lets you register lifecycle events (start, checkpoints, warnings, and end) during a workflow execution, giving you a full audit trail of every run directly in your Infini Analytics dashboard.

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

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

  ## Installation

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

  In short:

  1. Go to **Settings → Community Nodes**.
  2. Select **Install**.
  3. Enter `n8n-nodes-infini-analytics` and confirm.

  ## Operations

  The node supports a single **Register Event** operation. It sends an event to Infini Analytics for the given automation run.

  Supported event types:

  | Event Type | When to use |
  |---|---|
  | **Start** | At the beginning of an automation run |
  | **Event** | At key checkpoints during execution |
  | **Warning** | When a non-critical issue is detected |
  | **Error** | When an error occurs; registers the execution as failed |
  | **End** | At the completion of an automation run |

  ## Credentials

  To use this node you need an active **Infini Analytics** account. Your account provides the three values required to configure the node:

  | Value | Description |
  |---|---|
  | **Bearer Token** | Your API authentication token |
  | **Automation ID** | The unique identifier of the automation registered in Infini Analytics |
  | **Execution ID** | The unique identifier for the specific execution run |

  To set up credentials in n8n:

  1. Log in to [analytics.infini.es](https://analytics.infini.es) and retrieve your Bearer Token.
  2. In n8n, go to **Credentials → New Credential**.
  3. Search for **Infini Analytics API**.
  4. Enter your **Bearer Token** and save.

  ## Compatibility

  Tested against n8n **1.x** and above. Minimum recommended version: `1.0.0`.

  ## Usage

  The recommended pattern is to wrap your workflow with **Start** and **End** events, and add **Event** or **Warning** nodes at key steps in between.

  **Basic monitoring setup:**

  ```
  [Trigger] → [Infini Analytics: Start] → [...your workflow...] → [Infini Analytics: End]
  ```

  **With intermediate checkpoints and error handling:**

  ```
  [Trigger] → [Infini: Start] → [Step A] → [Infini: Event] → [Step B] → [Infini: End]
                                                   ↓ on error
                                            [Infini: Error]
  ```

  **Parameter tips:**

  - **Automation ID** and **Execution ID** are provided by your Infini Analytics account. Use them as static values or pass them dynamically via n8n expressions.
  - **Description** accepts free text and n8n expressions. Use it to include dynamic context, for example: `Processed {{ $json.count }} records`.
  - When **Event Type** is set to **Error**, two extra fields appear: **Error ID** (a short code identifying the error) and **Error Description** (a detailed description, typically the error message from the platform or language). Registering an **Error** event marks the execution as failed.
  - Enable **Continue on Fail** on the node if you want analytics failures to never block your main workflow.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Infini Analytics platform](https://analytics.infini.es)
  - [Infini website](https://infini.es)

  ## Maintenance

  This node is developed and maintained by the [Infini](https://infini.es) team. It is not open to external contributions. For support or issues, contact [mantenimiento@infini.es](mailto:mantenimiento@infini.es).

ai_documentation_summary:
  {"purpose":"Monitors and debugs n8n workflows by sending lifecycle events to Infini Analytics. It provides an audit trail of runs in the Infini Analytics dashboard for automations and AI agents.","capabilities":["Register Event operation","Send Start events at the beginning of a workflow run","Send Event checkpoints during execution","Send Warning events for non-critical issues","Send End events at workflow completion","Use automation and execution IDs as static values or dynamic expressions","Add descriptive free-text context with n8n expressions","Support Continue on Fail so analytics failures do not block the workflow"],"authentication":"Bearer token API authentication via Infini Analytics API credentials; requires an active Infini Analytics account, plus Automation ID and Execution ID values.","commonUseCases":["Track the start and end of an automation run","Add checkpoint events during long or complex workflows","Log warnings when a step encounters a non-critical issue","Build observability and auditing for n8n automations and AI agents"],"limitations":["Only a single operation is supported: Register Event","Requires an active Infini Analytics account","Tested against n8n 1.x and above only","Not open to external contributions"],"relatedNodes":["n8n community nodes"]}


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

updated_at: 2026-07-14 14:40:34
author_name: hookdeploy
author_github_url: https://github.com/hookdeploy/n8n.git
npm_package_name: n8n-nodes-hookdeploy
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.594Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "endpoint",
      "options": [
        {
          "name": "Endpoint",
          "value": "endpoint"
        },
        {
          "name": "Member",
          "value": "member"
        },
        {
          "name": "Request",
          "value": "request"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an endpoint",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/endpoints",
              "method": "POST"
            }
          },
          "description": "Create a new webhook endpoint"
        },
        {
          "name": "List Endpoints",
          "value": "getAll",
          "action": "List Endpoints",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/endpoints",
              "method": "GET"
            }
          },
          "description": "Retrieve many endpoints"
        },
        {
          "name": "Pause",
          "value": "pause",
          "action": "Pause an endpoint",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "=/endpoints/{{$parameter.endpointId}}",
              "body": {
                "paused": true
              },
              "method": "PATCH"
            }
          },
          "description": "Pause a webhook endpoint"
        },
        {
          "name": "Resume",
          "value": "resume",
          "action": "Resume an endpoint",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "=/endpoints/{{$parameter.endpointId}}",
              "body": {
                "paused": false
              },
              "method": "PATCH"
            }
          },
          "description": "Resume a paused webhook endpoint"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "endpoint"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "List Requests",
          "value": "getAll",
          "action": "List Requests",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "=/endpoints/{{$parameter.endpointId}}/requests",
              "method": "GET"
            }
          },
          "description": "Retrieve many captured requests for an endpoint"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a request",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "=/endpoints/{{$parameter.endpointId}}/requests/{{$parameter.requestId}}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single captured request"
        },
        {
          "name": "Replay",
          "value": "replay",
          "action": "Replay a request",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "=/endpoints/{{$parameter.endpointId}}/requests/{{$parameter.requestId}}/replay",
              "method": "POST"
            }
          },
          "description": "Replay a captured request to a target URL"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "request"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "invite",
      "options": [
        {
          "name": "Invite",
          "value": "invite",
          "action": "Invite a member",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/members/invite",
              "method": "POST"
            }
          },
          "description": "Invite a new organization member"
        },
        {
          "name": "Deactivate",
          "value": "deactivate",
          "action": "Deactivate a member",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/members/deactivate",
              "method": "POST"
            }
          },
          "description": "Deactivate an organization member"
        },
        {
          "name": "Reactivate",
          "value": "reactivate",
          "action": "Reactivate a member",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data"
                  }
                }
              ]
            },
            "request": {
              "url": "/members/reactivate",
              "method": "POST"
            }
          },
          "description": "Reactivate a deactivated organization member"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "member"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an endpoint",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/endpoints",
          "method": "POST"
        }
      },
      "description": "Create a new webhook endpoint",
      "resource": "endpoint"
    },
    {
      "name": "List Endpoints",
      "value": "getAll",
      "action": "List Endpoints",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/endpoints",
          "method": "GET"
        }
      },
      "description": "Retrieve many endpoints",
      "resource": "endpoint"
    },
    {
      "name": "Pause",
      "value": "pause",
      "action": "Pause an endpoint",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "=/endpoints/{{$parameter.endpointId}}",
          "body": {
            "paused": true
          },
          "method": "PATCH"
        }
      },
      "description": "Pause a webhook endpoint",
      "resource": "endpoint"
    },
    {
      "name": "Resume",
      "value": "resume",
      "action": "Resume an endpoint",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "=/endpoints/{{$parameter.endpointId}}",
          "body": {
            "paused": false
          },
          "method": "PATCH"
        }
      },
      "description": "Resume a paused webhook endpoint",
      "resource": "endpoint"
    },
    {
      "name": "List Requests",
      "value": "getAll",
      "action": "List Requests",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "=/endpoints/{{$parameter.endpointId}}/requests",
          "method": "GET"
        }
      },
      "description": "Retrieve many captured requests for an endpoint",
      "resource": "request"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a request",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "=/endpoints/{{$parameter.endpointId}}/requests/{{$parameter.requestId}}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single captured request",
      "resource": "request"
    },
    {
      "name": "Replay",
      "value": "replay",
      "action": "Replay a request",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "=/endpoints/{{$parameter.endpointId}}/requests/{{$parameter.requestId}}/replay",
          "method": "POST"
        }
      },
      "description": "Replay a captured request to a target URL",
      "resource": "request"
    },
    {
      "name": "Invite",
      "value": "invite",
      "action": "Invite a member",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/members/invite",
          "method": "POST"
        }
      },
      "description": "Invite a new organization member",
      "resource": "member"
    },
    {
      "name": "Deactivate",
      "value": "deactivate",
      "action": "Deactivate a member",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/members/deactivate",
          "method": "POST"
        }
      },
      "description": "Deactivate an organization member",
      "resource": "member"
    },
    {
      "name": "Reactivate",
      "value": "reactivate",
      "action": "Reactivate a member",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data"
              }
            }
          ]
        },
        "request": {
          "url": "/members/reactivate",
          "method": "POST"
        }
      },
      "description": "Reactivate a deactivated organization member",
      "resource": "member"
    }
  ]

npm_readme:
  # n8n-nodes-hookdeploy

  **Verified by n8n** — available on n8n Cloud and all self-hosted instances.

  [n8n](https://n8n.io) community node for [HookDeploy](https://hookdeploy.dev) — webhook capture, inspection, routing, and private tunnel infrastructure. Use it in workflows to manage endpoints, inspect captured webhook requests, replay traffic, and administer organization members.

  ## Installation

  ### Option 1: n8n nodes panel (recommended)

  On **n8n Cloud** or any **self-hosted** instance:

  1. Open the node picker in the workflow editor.
  2. Search for **HookDeploy**.
  3. Install with one click — verified nodes are available to all users.

  ### Option 2: Community Nodes (self-hosted manual install)

  For self-hosted instances that prefer manual installation, open **Settings → Community Nodes**, choose **Install**, and enter:

  ```
  n8n-nodes-hookdeploy
  ```

  Alternatively, install from the command line in your n8n environment:

  ```bash
  npm install n8n-nodes-hookdeploy
  ```

  Restart n8n after installation if the node does not appear immediately.

  ## Credentials

  1. Sign in to the [HookDeploy dashboard](https://hookdeploy.dev).
  2. Open **Settings → API Keys** (or your organization’s API key management page).
  3. Create an API key with the permissions you need.
  4. In n8n, add a **HookDeploy API** credential and paste the key (format: `hd_live_xxxx`).
  5. Use **Test** to confirm the key — a successful test calls `GET /v1/me` and returns your organization details.

  ## Supported operations

  | Resource | Operation | Description |
  | --- | --- | --- |
  | **Endpoint** | Create | Create a new webhook endpoint |
  | **Endpoint** | List Endpoints | List all endpoints |
  | **Endpoint** | Pause | Pause an endpoint by ID |
  | **Endpoint** | Resume | Resume a paused endpoint by ID |
  | **Request** | List Requests | List captured requests for an endpoint (supports `limit` and `before` cursor) |
  | **Request** | Get | Get a single captured request |
  | **Request** | Replay | Replay a captured request to a target URL |
  | **Member** | Invite | Invite a member by email and role |
  | **Member** | Deactivate | Deactivate a member by email |
  | **Member** | Reactivate | Reactivate a member by email |

  Member roles: `super_admin`, `admin`, `developer`, `viewer`, `finance`.

  ## Trigger events

  Use the **HookDeploy Trigger** node and choose an **Event** plus **Endpoint ID**:

  | Event | Webhook payload `event` | Description |
  | --- | --- | --- |
  | **New Webhook Received** | `request.received` | A webhook was captured on the endpoint |
  | **Forwarding Succeeded** | `forwarding.succeeded` | HookDeploy successfully forwarded a webhook to a destination |
  | **Forwarding Failed** | `forwarding.failed` | HookDeploy failed to forward a webhook to a destination |

  ## Development

  ```bash
  npm install --legacy-peer-deps
  npm run build
  npm run lint
  npm run dev
  ```

  `npm run dev` starts a local n8n instance at [http://localhost:5678](http://localhost:5678) with this node loaded.

  ## Links

  - [HookDeploy](https://hookdeploy.dev)
  - [HookDeploy API](https://api.hookdeploy.dev/v1)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE) — Copyright SnapStack Technologies Inc.

ai_documentation_summary:
  {"purpose":"HookDeploy is an n8n community node for managing HookDeploy’s webhook infrastructure. It lets workflows create and control endpoints, inspect and replay captured webhook requests, and administer organization members, with a trigger node for reacting to webhook and forwarding events.","capabilities":["Create webhook endpoints","List endpoints","Pause and resume endpoints by ID","List captured requests for an endpoint with limit and before cursor support","Get a single captured request","Replay a captured request to a target URL","Invite members by email and role","Deactivate members by email","Reactivate members by email","Trigger workflows on new webhook received events"],"authentication":"API key required (HookDeploy API credential using a key in the format hd_live_xxxx)","commonUseCases":["Managing webhook endpoints for testing and routing","Inspecting and replaying captured webhook traffic","Automating team member invitations and access management","Building workflows that react to incoming webhook capture and forwarding status events"],"limitations":["Community nodes require a self-hosted n8n instance; n8n Cloud does not support this unverified node","Trigger node requires selecting an Event and Endpoint ID"],"relatedNodes":["HookDeploy Trigger"]}


node_type: n8n-nodes-hookdeploy.hookDeployTrigger
package_name: n8n-nodes-hookdeploy
display_name: HookDeploy Trigger
description: Triggers when HookDeploy sends webhook events for an 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: hookdeploy
author_github_url: https://github.com/hookdeploy/n8n.git
npm_package_name: n8n-nodes-hookdeploy
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.595Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-hookdeploy

  **Verified by n8n** — available on n8n Cloud and all self-hosted instances.

  [n8n](https://n8n.io) community node for [HookDeploy](https://hookdeploy.dev) — webhook capture, inspection, routing, and private tunnel infrastructure. Use it in workflows to manage endpoints, inspect captured webhook requests, replay traffic, and administer organization members.

  ## Installation

  ### Option 1: n8n nodes panel (recommended)

  On **n8n Cloud** or any **self-hosted** instance:

  1. Open the node picker in the workflow editor.
  2. Search for **HookDeploy**.
  3. Install with one click — verified nodes are available to all users.

  ### Option 2: Community Nodes (self-hosted manual install)

  For self-hosted instances that prefer manual installation, open **Settings → Community Nodes**, choose **Install**, and enter:

  ```
  n8n-nodes-hookdeploy
  ```

  Alternatively, install from the command line in your n8n environment:

  ```bash
  npm install n8n-nodes-hookdeploy
  ```

  Restart n8n after installation if the node does not appear immediately.

  ## Credentials

  1. Sign in to the [HookDeploy dashboard](https://hookdeploy.dev).
  2. Open **Settings → API Keys** (or your organization’s API key management page).
  3. Create an API key with the permissions you need.
  4. In n8n, add a **HookDeploy API** credential and paste the key (format: `hd_live_xxxx`).
  5. Use **Test** to confirm the key — a successful test calls `GET /v1/me` and returns your organization details.

  ## Supported operations

  | Resource | Operation | Description |
  | --- | --- | --- |
  | **Endpoint** | Create | Create a new webhook endpoint |
  | **Endpoint** | List Endpoints | List all endpoints |
  | **Endpoint** | Pause | Pause an endpoint by ID |
  | **Endpoint** | Resume | Resume a paused endpoint by ID |
  | **Request** | List Requests | List captured requests for an endpoint (supports `limit` and `before` cursor) |
  | **Request** | Get | Get a single captured request |
  | **Request** | Replay | Replay a captured request to a target URL |
  | **Member** | Invite | Invite a member by email and role |
  | **Member** | Deactivate | Deactivate a member by email |
  | **Member** | Reactivate | Reactivate a member by email |

  Member roles: `super_admin`, `admin`, `developer`, `viewer`, `finance`.

  ## Trigger events

  Use the **HookDeploy Trigger** node and choose an **Event** plus **Endpoint ID**:

  | Event | Webhook payload `event` | Description |
  | --- | --- | --- |
  | **New Webhook Received** | `request.received` | A webhook was captured on the endpoint |
  | **Forwarding Succeeded** | `forwarding.succeeded` | HookDeploy successfully forwarded a webhook to a destination |
  | **Forwarding Failed** | `forwarding.failed` | HookDeploy failed to forward a webhook to a destination |

  ## Development

  ```bash
  npm install --legacy-peer-deps
  npm run build
  npm run lint
  npm run dev
  ```

  `npm run dev` starts a local n8n instance at [http://localhost:5678](http://localhost:5678) with this node loaded.

  ## Links

  - [HookDeploy](https://hookdeploy.dev)
  - [HookDeploy API](https://api.hookdeploy.dev/v1)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE) — Copyright SnapStack Technologies Inc.

ai_documentation_summary:
  {"purpose":"HookDeploy Trigger listens for HookDeploy webhook events for a specified endpoint and starts an n8n workflow when a matching event occurs. The package also includes nodes for managing HookDeploy endpoints, captured requests, and organization members.","capabilities":["Trigger workflows on HookDeploy events for an endpoint","Create, list, pause, and resume webhook endpoints","List captured requests for an endpoint with limit and cursor support","Get a single captured request","Replay a captured request to a target URL","Invite, deactivate, and reactivate organization members"],"authentication":"API key required via HookDeploy API credential (paste a HookDeploy API key such as hd_live_xxxx)","commonUseCases":["Capture and react to incoming webhook traffic in real time","Inspect and replay webhook requests for testing and debugging","Manage HookDeploy endpoints from within n8n workflows","Administer organization members and roles through automation"],"limitations":["Requires a self-hosted n8n instance; n8n Cloud does not support this unverified community node","Trigger requires selecting both an Event and an Endpoint ID","Member role values are limited to super_admin, admin, developer, viewer, and finance"],"relatedNodes":["Webhook Trigger","HTTP Request","n8n community nodes"]}


node_type: n8n-nodes-carly.carly
package_name: n8n-nodes-carly
display_name: Carly
description: Read and manage Carly booking pages, event types, calendars, and bookings
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: sarah-hirschfield
author_github_url: https://github.com/UseCarly/
npm_package_name: n8n-nodes-carly
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.596Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "profile",
      "options": [
        {
          "name": "Profile",
          "value": "profile"
        },
        {
          "name": "Calendars",
          "value": "calendars"
        },
        {
          "name": "Booking Pages",
          "value": "booking-pages"
        },
        {
          "name": "Event Types",
          "value": "event-types"
        },
        {
          "name": "Slots",
          "value": "slots"
        },
        {
          "name": "Bookings",
          "value": "bookings"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "whoami",
      "options": [
        {
          "name": "Whoami",
          "value": "whoami",
          "action": "Show the user the API key belongs to",
          "routing": {
            "request": {
              "url": "/whoami",
              "method": "GET"
            }
          },
          "description": "Show the user the API key belongs to"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "profile"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List connected calendars for the authenticated user",
          "routing": {
            "request": {
              "url": "/calendars",
              "method": "GET"
            }
          },
          "description": "List connected calendars for the authenticated user. The `selected` field mirrors the \"Check for conflicts on\" state in the web UI — calendars with `selected: true` count against booking-page availability."
        },
        {
          "name": "Select",
          "value": "select",
          "action": "Mark a calendar as counting against booking-page availability (\"Check for conflicts on\")",
          "routing": {
            "request": {
              "url": "/calendars/select",
              "body": {
                "selected": true
              },
              "method": "POST"
            }
          },
          "description": "Mark a calendar as counting against booking-page availability (\"Check for conflicts on\"). Requires the `booking_pages:write` scope. The flag is account-wide — every booking page on this calendar's integration will honor it on the next availability check."
        },
        {
          "name": "Unselect",
          "value": "unselect",
          "action": "Stop counting a calendar against booking-page availability",
          "routing": {
            "request": {
              "url": "/calendars/select",
              "body": {
                "selected": false
              },
              "method": "POST"
            }
          },
          "description": "Stop counting a calendar against booking-page availability. Requires the `booking_pages:write` scope. Inverse of `carly calendars select`."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "calendars"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List the authenticated user's booking pages (event types with public links)",
          "routing": {
            "request": {
              "url": "/booking-pages",
              "method": "GET"
            }
          },
          "description": "List the authenticated user's booking pages (event types with public links)"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a single booking page by its event type ID",
          "routing": {
            "request": {
              "url": "=/booking-pages/{{$parameter[\"eventTypeId\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single booking page by its event type ID"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new booking page",
          "routing": {
            "request": {
              "url": "/booking-pages",
              "method": "POST"
            }
          },
          "description": "Create a new booking page. Requires the `booking_pages:write` scope. Accepts nested fields (--availability, --custom-questions, --duration-options) as JSON."
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an existing booking page by its event type ID",
          "routing": {
            "request": {
              "url": "=/booking-pages/{{$parameter[\"eventTypeId\"]}}",
              "method": "PATCH"
            }
          },
          "description": "Update an existing booking page by its event type ID. Requires the `booking_pages:write` scope. Only fields you pass are updated. Nested fields (--availability, --custom-questions, --duration-options) accept JSON and replace the previous value."
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Deactivate (pause) a booking page by its event type ID",
          "routing": {
            "request": {
              "url": "=/booking-pages/{{$parameter[\"eventTypeId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deactivate (pause) a booking page by its event type ID. The server soft-deletes: the page is hidden from public booking (is_active=false) but the row is retained and the page can be re-activated via `update <id> --is-active true`. Requires the `booking_pages:write` scope."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "booking-pages"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List event types",
          "routing": {
            "request": {
              "url": "/event-types",
              "method": "GET"
            }
          },
          "description": "List event types. Without --username, returns the authenticated caller's own event types. With --username, returns that public profile's active event types."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "event-types"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List available booking slots in a time range",
          "routing": {
            "request": {
              "url": "/slots",
              "method": "GET"
            }
          },
          "description": "List available booking slots in a time range. Provide either --event-type-id, or both --username and --event-type-slug."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "slots"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List the authenticated user's bookings",
          "routing": {
            "request": {
              "url": "/bookings",
              "method": "GET"
            }
          },
          "description": "List the authenticated user's bookings. Supports filters for status, event type, and time range."
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a single booking by its UID",
          "routing": {
            "request": {
              "url": "=/bookings/{{$parameter[\"uid\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single booking by its UID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "bookings"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Whoami",
      "value": "whoami",
      "action": "Show the user the API key belongs to",
      "routing": {
        "request": {
          "url": "/whoami",
          "method": "GET"
        }
      },
      "description": "Show the user the API key belongs to",
      "resource": "profile"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List connected calendars for the authenticated user",
      "routing": {
        "request": {
          "url": "/calendars",
          "method": "GET"
        }
      },
      "description": "List connected calendars for the authenticated user. The `selected` field mirrors the \"Check for conflicts on\" state in the web UI — calendars with `selected: true` count against booking-page availability.",
      "resource": "calendars"
    },
    {
      "name": "Select",
      "value": "select",
      "action": "Mark a calendar as counting against booking-page availability (\"Check for conflicts on\")",
      "routing": {
        "request": {
          "url": "/calendars/select",
          "body": {
            "selected": true
          },
          "method": "POST"
        }
      },
      "description": "Mark a calendar as counting against booking-page availability (\"Check for conflicts on\"). Requires the `booking_pages:write` scope. The flag is account-wide — every booking page on this calendar's integration will honor it on the next availability check.",
      "resource": "calendars"
    },
    {
      "name": "Unselect",
      "value": "unselect",
      "action": "Stop counting a calendar against booking-page availability",
      "routing": {
        "request": {
          "url": "/calendars/select",
          "body": {
            "selected": false
          },
          "method": "POST"
        }
      },
      "description": "Stop counting a calendar against booking-page availability. Requires the `booking_pages:write` scope. Inverse of `carly calendars select`.",
      "resource": "calendars"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List the authenticated user's booking pages (event types with public links)",
      "routing": {
        "request": {
          "url": "/booking-pages",
          "method": "GET"
        }
      },
      "description": "List the authenticated user's booking pages (event types with public links)",
      "resource": "booking-pages"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a single booking page by its event type ID",
      "routing": {
        "request": {
          "url": "=/booking-pages/{{$parameter[\"eventTypeId\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single booking page by its event type ID",
      "resource": "booking-pages"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new booking page",
      "routing": {
        "request": {
          "url": "/booking-pages",
          "method": "POST"
        }
      },
      "description": "Create a new booking page. Requires the `booking_pages:write` scope. Accepts nested fields (--availability, --custom-questions, --duration-options) as JSON.",
      "resource": "booking-pages"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an existing booking page by its event type ID",
      "routing": {
        "request": {
          "url": "=/booking-pages/{{$parameter[\"eventTypeId\"]}}",
          "method": "PATCH"
        }
      },
      "description": "Update an existing booking page by its event type ID. Requires the `booking_pages:write` scope. Only fields you pass are updated. Nested fields (--availability, --custom-questions, --duration-options) accept JSON and replace the previous value.",
      "resource": "booking-pages"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Deactivate (pause) a booking page by its event type ID",
      "routing": {
        "request": {
          "url": "=/booking-pages/{{$parameter[\"eventTypeId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deactivate (pause) a booking page by its event type ID. The server soft-deletes: the page is hidden from public booking (is_active=false) but the row is retained and the page can be re-activated via `update <id> --is-active true`. Requires the `booking_pages:write` scope.",
      "resource": "booking-pages"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List event types",
      "routing": {
        "request": {
          "url": "/event-types",
          "method": "GET"
        }
      },
      "description": "List event types. Without --username, returns the authenticated caller's own event types. With --username, returns that public profile's active event types.",
      "resource": "event-types"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List available booking slots in a time range",
      "routing": {
        "request": {
          "url": "/slots",
          "method": "GET"
        }
      },
      "description": "List available booking slots in a time range. Provide either --event-type-id, or both --username and --event-type-slug.",
      "resource": "slots"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List the authenticated user's bookings",
      "routing": {
        "request": {
          "url": "/bookings",
          "method": "GET"
        }
      },
      "description": "List the authenticated user's bookings. Supports filters for status, event type, and time range.",
      "resource": "bookings"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a single booking by its UID",
      "routing": {
        "request": {
          "url": "=/bookings/{{$parameter[\"uid\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single booking by its UID",
      "resource": "bookings"
    }
  ]

npm_readme:
  # n8n-nodes-carly

  An [n8n](https://n8n.io) community node for [Carly](https://www.usecarly.com) — the AI scheduling assistant. Read and manage your booking pages, event types, calendars, bookings, and availability slots from n8n workflows.

  This node is **auto-generated** from the [`carly-cli`](https://github.com/usecarly/carly-cli) command definitions, so the n8n operations stay in lockstep with the CLI and MCP server — same API surface, no drift.

  ## Installation

  Follow the [community node installation guide](https://docs.n8n.io/integrations/community-nodes/installation/). In n8n: **Settings → Community Nodes → Install** and enter `n8n-nodes-carly`.

  ## Credentials

  Create a **Carly API** credential with an API key generated in the Carly dashboard (Booking Pages → "Generate API key"). Write operations (create/update/delete booking pages, calendar select/unselect) require a key with the `booking_pages:write` scope. Click **Test** on the credential to verify the key against `/whoami`.

  ## Operations

  | Resource | Operations |
  |---|---|
  | **Profile** | Whoami |
  | **Calendars** | List, Select, Unselect |
  | **Event Types** | List |
  | **Booking Pages** | List, Get, Create, Update, Delete |
  | **Bookings** | List, Get |
  | **Slots** | List |

  The node sets `usableAsTool: true`, so it can be attached to n8n's AI Agent node as a tool.

  ### Notes

  - **Booking page nested fields** (`availability`, `customQuestions`, `durationOptions`) are JSON inputs. See the field descriptions for the expected shape, e.g. `availability`: `[{"days":[1,2,3,4,5],"start_time":"09:00","end_time":"17:00"}]` (days: Sun=0 … Sat=6).
  - **Delete** soft-deletes (sets `is_active=false`); re-activate via **Update** with `isActive=true`.
  - **Slots List** requires either `eventTypeId`, or both `username` and `eventTypeSlug`, plus a `startTime`/`endTime` range.

  ## Resources

  - [Carly API docs](https://www.usecarly.com/developers)
  - [n8n community nodes docs](https://docs.n8n.io/integrations/#community-nodes)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Provides n8n workflows with access to Carly’s AI scheduling assistant API for managing booking pages, event types, calendars, bookings, and availability slots. It can also be used as a tool in n8n AI Agent workflows.","capabilities":["Profile lookup (Whoami)","List calendars","Select calendars","Unselect calendars","List event types","List booking pages","Get a booking page","Create booking pages","Update booking pages","Delete booking pages (soft delete)"],"authentication":"Carly API credential using an API key generated in the Carly dashboard; write operations require the booking_pages:write scope.","commonUseCases":["Automating creation and maintenance of Carly booking pages from n8n","Synchronizing calendars and availability for scheduling workflows","Looking up bookings, event types, and profile information in automated workflows","Using the node as a tool for an n8n AI Agent to query or manage scheduling data"],"limitations":["Write operations require the booking_pages:write scope","Delete is a soft delete only; it sets is_active=false and must be reactivated via Update","Slots List requires either eventTypeId or both username and eventTypeSlug, plus a startTime/endTime range","Some booking page fields such as availability, customQuestions, and durationOptions must be provided as JSON with specific shapes"],"relatedNodes":[]}


