# nodes

node_type: n8n-nodes-emailverify.emailVerify
package_name: n8n-nodes-emailverify
display_name: EmailVerify.io
description: Consume EmailVerify.io API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  {
  "type": "main"
  }
  ]

updated_at: 2026-07-14 14:40:34
author_name: shafinzaman
author_github_url: https://github.com/Clustox/
npm_package_name: n8n-nodes-emailverify
npm_version: 1.0.10
community_fetched_at: 2026-07-14T14:40:34.432Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "verifyEmail",
      "options": [
        {
          "name": "Verify Email",
          "value": "verifyEmail",
          "action": "Verify the validity of an email address",
          "description": "Verify the validity of an email address"
        },
        {
          "name": "Find Email",
          "value": "findEmail",
          "action": "Find an email address using a name and domain",
          "description": "Find an email address using a name and domain"
        },
        {
          "name": "Check Account Balance",
          "value": "checkBalance",
          "action": "Check your account balance and remaining credits",
          "description": "Check your account balance and remaining credits"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Verify Email",
      "value": "verifyEmail",
      "action": "Verify the validity of an email address",
      "description": "Verify the validity of an email address"
    },
    {
      "name": "Find Email",
      "value": "findEmail",
      "action": "Find an email address using a name and domain",
      "description": "Find an email address using a name and domain"
    },
    {
      "name": "Check Account Balance",
      "value": "checkBalance",
      "action": "Check your account balance and remaining credits",
      "description": "Check your account balance and remaining credits"
    }
  ]

npm_readme:
  # n8n-nodes-emailverify

  ![n8n.io - Workflow Automation](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png)

  This is an n8n community node that lets you use EmailVerify.io in your n8n workflows.

  # EmailVerify.io n8n Node

  🚀 Validate emails directly inside your n8n workflows using EmailVerify.io.

  - Verify emails in real-time
  - Detect disposable & risky emails
  - Clean lists automatically
  - Improve deliverability across workflows

  👉 Get free API key: https://emailverify.io

  ## Why EmailVerify.io?

  - ⚡ Sub-100ms API response
  - 🎯 High accuracy (SMTP-level verification)
  - 💰 10x cheaper than competitors
  - 🔌 Works with n8n, Zapier, APIs, SDKs

  ## 🚀 Get Started

  1. Get your API key → https://emailverify.io/api  
  2. Add EmailVerify node in n8n
     * Go to Settings → Community Nodes
     * Install: n8n-nodes-emailverify
     * Restart n8n
  3. Start validating emails instantly  

  🎁 Free credits available

  ## Example: Validate Signup Emails

  Workflow:
  Form → EmailVerify → CRM

  - Prevent fake users
  - Block disposable emails
  - Improve data quality

  ## Example: Clean Email Lists

  Workflow:
  Google Sheets → EmailVerify → Cleaned List

  - Remove invalid emails
  - Reduce bounce rate
  - Improve campaign ROI

  ## Example: Lead Qualification

  Workflow:
  Webhook → EmailVerify → Slack Notification

  - Validate leads instantly
  - Notify sales team
  - Prioritize real users    

  ## Detail Guide
  [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.

  1. Go to **Settings > Community Nodes**.
  2. Select **Install**.
  3. Enter `n8n-nodes-emailverify` in **Enter npm package name**.
  4. Agree to the [risks](https://docs.n8n.io/integrations/community-nodes/risks/) of using community nodes: select **I understand the risks of installing unverified code from a public source**.
  5. Select **Install**.

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

  ## Operations

  * **Verify Email**: Verify the validity of an email address
  * **Find Email**: Find an email address using a name and domain
  * **Check Account Balance**: Check your account balance and remaining credits

  ## Credentials

  You need to configure EmailVerify.io API credentials:

  1. Get your API key from [EmailVerify.io](https://emailverify.io)
  2. In n8n, go to **Credentials > New Credential**
  3. Search for "EmailVerify.io API"
  4. Enter your API key

  ## Compatibility

  Tested with n8n version 1.0.0 and above.

  ## Usage

  ### Verify Email

  This operation verifies whether an email address is valid.

  **Input Parameters:**
  - **Email**: The email address to verify (required)

  **Output:**
  Returns detailed information about the email address including:
  - Validity status
  - Deliverability information
  - Risk factors
  - Provider information

  ### Find Email

  This operation finds email addresses based on a person's name and domain.

  **Input Parameters:**
  - **Name**: The person's name (required)
  - **Domain**: The company domain (required)

  **Output:**
  Returns found email addresses and confidence scores.

  ### Check Account Balance

  This operation returns your current account balance and remaining credits.

  **Output:**
  Returns account information including available credits.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [EmailVerify.io API documentation](https://www.emailverify.io/api/docs/)
  * [EmailVerify.io website](https://emailverify.io)

  ## License

  [MIT](https://github.com/Clustox/n8n-nodes-emailverify/blob/main/LICENSE) 

ai_documentation_summary:
  {"purpose":"This node integrates EmailVerify.io with n8n to validate email addresses, find emails from a name and domain, and check account balance/credits. It helps improve email deliverability, reduce invalid signups, and clean email lists inside workflows.","capabilities":["Verify Email","Find Email","Check Account Balance","Detect disposable and risky emails","Return validity, deliverability, risk, and provider details","Return found email addresses with confidence scores"],"authentication":"EmailVerify.io API key required","commonUseCases":["Validating signup emails before creating CRM records","Cleaning email lists to reduce bounce rate","Qualifying leads by verifying email addresses","Checking available account credits before processing"],"limitations":["Tested with n8n version 1.0.0 and above","Requires an EmailVerify.io API key"],"relatedNodes":[]}


node_type: @geoterritories/n8n-nodes-geoterritories.geoTerritories
package_name: @geoterritories/n8n-nodes-geoterritories
display_name: GeoTerritories
description: n8n node to validate a geo point against a custom geo fence.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: shamika22
author_github_url: https://github.com/geoterritories/n8n-node-geoterritories.git
npm_package_name: @geoterritories/n8n-nodes-geoterritories
npm_version: 0.1.5
community_fetched_at: 2026-07-14T14:40:34.433Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "validate",
      "options": [
        {
          "name": "Validate",
          "value": "validate",
          "description": "Validate a geo location against a geo fence"
        }
      ],
      "required": true,
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "latitudeLongitude",
      "options": [
        {
          "name": "Validate Using Latitude and Longitude",
          "value": "latitudeLongitude",
          "action": "Validate a latitude longitude point against a geo fence",
          "description": "Validate a latitude/longitude point against a geo fence"
        }
      ],
      "required": true,
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Validate Using Latitude and Longitude",
      "value": "latitudeLongitude",
      "action": "Validate a latitude longitude point against a geo fence",
      "description": "Validate a latitude/longitude point against a geo fence"
    }
  ]

npm_readme:
  # Geo Territories n8n Node

  [![n8n community node](https://img.shields.io/badge/n8n-community%20node-ff69b4.svg)](https://n8n.io)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE.md)

  Stop managing complex tables of ZIP codes and postal codes. Start drawing visual territories.

  This custom n8n node integrates seamlessly with [Geo Territories](https://geoterritories.com/) to bring powerful, visual geofencing capabilities into your automated workflows. With this node, you can instantly validate address coordinate points against your custom-drawn geographic polygons (fences) to route leads, dispatch teams, filter serviceability, and much more.

  ---

  ## 🌟 Key Features

  *   **Visual Geofencing**: Check whether any geographical point (latitude and longitude) lies within your custom-drawn boundaries.
  *   **Flexible Matching Modes**: Validate points against:
      *   **One Fence**: A single selected territory/fence from a dynamic list.
      *   **Multiple Fences**: Multiple selected territories/fences.
      *   **All Fences**: All active territories defined in your account.
  *   **Dynamic Dropdowns**: Dynamically queries the Geo Territories API (`GET /fences`) to load your custom boundaries directly in n8n.
  *   **OAuth2 Authentication**: Secure connection via standard OAuth2 with PKCE flow.

  ---

  ## 🚀 Real-world Use Cases

  Integrating Geo Territories into n8n opens up thousands of operational possibilities:

  *   **Dynamic Lead Routing**: Automatically detect which sales representative's visual territory a new lead belongs to and instantly assign it in HubSpot, Salesforce, or Zoho.
  *   **Serviceability Filtering**: Run a prospect's address coordinates through the node. If they are outside your service boundary, automatically trigger a polite "Not in service area" email, saving time for your sales team.
  *   **Competitor Proximity Alerts**: Draw polygons around competitor locations and trigger Slack notifications or specialized conquest marketing campaigns if a lead registers within those boundaries.
  *   **Delivery Zone Surcharges**: Check if a Shopify order's shipping address is located inside a congestion or premium delivery zone to automatically append the correct surcharge.
  *   **Workforce Dispatching**: Automatically route maintenance, utility, or delivery tickets to the foreman or crew specifically responsible for that territory.
  *   **Fleet "No-Go" Zone Alerts**: Track fleet GPS coordinates in real-time and alert operations if a vehicle moves outside its authorized operational boundaries.


  ## 📖 Node Reference

  ### Resource: Validate

  This resource is designed to check geographic coordinates against your territories.

  #### Operation: Validate With Latitude and Longitude

  Check custom coordinates against one or more of your drawn geofences.

  | Parameter | Type | Required | Description |
  | :--- | :--- | :--- | :--- |
  | **Validate Against** | Options | Yes | Determine the lookup mode: `Validate Against One Fence`, `Validate Against Multiple Fences`, or `Validate Against All Fences`. |
  | **Fence List** | Dropdown | Yes | If validating against one/multiple fences, this dynamically displays all available fences queried from your Geo Territories account. |
  | **Latitude** | Number | Yes | The decimal latitude of the point to check (e.g., `40.7128`). |
  | **Longitude** | Number | Yes | The decimal longitude of the point to check (e.g., `-74.0060`). |

  ---

  ## 🛠️ Local Development & Testing

  If you are developing or testing this node package locally, follow these steps:

  ### 1. Install Dependencies
  ```bash
  npm install
  ```

  ### 2. Run the Local n8n Dev Environment
  Start n8n with this node package installed and hot-reloads active:
  ```bash
  npm run dev
  ```

  This will automatically build your typescript files into `dist/`, launch a local n8n instance, and rebuild the node whenever you save changes.

  ### 3. Build for Production
  When you are ready to compile the final package:
  ```bash
  npm run build
  ```

  ### 4. Code Quality & Linting
  Run the node linter:
  ```bash
  npm run lint
  ```
  Or fix common linting issues automatically:
  ```bash
  npm run lint:fix
  ```

  ---

  ## 🔗 Additional Resources

  *   **Official Website**: [Geo Territories](https://geoterritories.com/)
  *   **n8n Documentation**: [n8n Creating Nodes](https://docs.n8n.io/integrations/creating-nodes/)
  *   **Community Forums**: [n8n Community](https://community.n8n.io/)

  ---

  ## 📄 License

  This project is licensed under the [MIT License](LICENSE.md).

ai_documentation_summary:
  {"purpose":"Validates latitude/longitude points against custom geofences drawn in Geo Territories, allowing workflows to determine whether a location falls inside one or more territories.","capabilities":["Validate coordinates against one selected fence","Validate coordinates against multiple selected fences","Validate coordinates against all active fences","Load fence options dynamically from the Geo Territories API","Use OAuth2 authentication with PKCE flow"],"authentication":"OAuth2 with PKCE flow","commonUseCases":["Dynamic lead routing based on sales territory","Serviceability checks and out-of-service-area notifications","Delivery zone or surcharge determination","Workforce dispatching by territory","Fleet or vehicle no-go zone alerts"],"limitations":["Only validates geographic coordinates against fences; no other Geo Territories operations are described","Requires latitude and longitude as decimal numeric inputs"],"relatedNodes":[]}


node_type: @continuumtracker/n8n-nodes-continuum-tracker.continuumTracker
package_name: @continuumtracker/n8n-nodes-continuum-tracker
display_name: Continuum Tracker
description: Interact with the Continuum Tracker API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: standa
author_github_url: https://github.com/development-continuumtracker/n8n-nodes-continuum-tracker.git
npm_package_name: @continuumtracker/n8n-nodes-continuum-tracker
npm_version: 1.0.3
community_fetched_at: 2026-07-14T14:40:34.434Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "feedback",
      "options": [
        {
          "name": "Feedback",
          "value": "feedback"
        },
        {
          "name": "Me",
          "value": "me"
        },
        {
          "name": "Signal",
          "value": "signal"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Archive",
          "value": "archive",
          "action": "Archive a feedback",
          "routing": {
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks/{{$parameter.feedbackId}}",
              "method": "DELETE"
            }
          },
          "description": "Archive (soft-delete) a feedback"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a feedback",
          "routing": {
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks",
              "method": "POST"
            }
          },
          "description": "Create a new feedback"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a feedback",
          "routing": {
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks/{{$parameter.feedbackId}}",
              "method": "GET"
            }
          },
          "description": "Get a single feedback by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many feedbacks",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "items"
                  }
                }
              ]
            },
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks",
              "method": "GET"
            }
          },
          "description": "Get many feedbacks for a project"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a feedback",
          "routing": {
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks/{{$parameter.feedbackId}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing feedback"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "feedback"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a signal",
          "routing": {
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/signals",
              "method": "POST"
            }
          },
          "description": "Create a manual signal"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a signal",
          "routing": {
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/signals/{{$parameter.signalId}}",
              "method": "GET"
            }
          },
          "description": "Get a single signal by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many signals",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "items"
                  }
                }
              ]
            },
            "request": {
              "url": "=/v1/projects/{{$parameter.projectId}}/signals",
              "method": "GET"
            }
          },
          "description": "Get many signals for a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "signal"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get current user",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/v1/me",
              "method": "GET"
            }
          },
          "description": "Get the currently authenticated user"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "me"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Archive",
      "value": "archive",
      "action": "Archive a feedback",
      "routing": {
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks/{{$parameter.feedbackId}}",
          "method": "DELETE"
        }
      },
      "description": "Archive (soft-delete) a feedback",
      "resource": "feedback"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a feedback",
      "routing": {
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks",
          "method": "POST"
        }
      },
      "description": "Create a new feedback",
      "resource": "feedback"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a feedback",
      "routing": {
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks/{{$parameter.feedbackId}}",
          "method": "GET"
        }
      },
      "description": "Get a single feedback by ID",
      "resource": "feedback"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many feedbacks",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "items"
              }
            }
          ]
        },
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks",
          "method": "GET"
        }
      },
      "description": "Get many feedbacks for a project",
      "resource": "feedback"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a feedback",
      "routing": {
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/feedbacks/{{$parameter.feedbackId}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing feedback",
      "resource": "feedback"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a signal",
      "routing": {
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/signals",
          "method": "POST"
        }
      },
      "description": "Create a manual signal",
      "resource": "signal"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a signal",
      "routing": {
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/signals/{{$parameter.signalId}}",
          "method": "GET"
        }
      },
      "description": "Get a single signal by ID",
      "resource": "signal"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many signals",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "items"
              }
            }
          ]
        },
        "request": {
          "url": "=/v1/projects/{{$parameter.projectId}}/signals",
          "method": "GET"
        }
      },
      "description": "Get many signals for a project",
      "resource": "signal"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get current user",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/v1/me",
          "method": "GET"
        }
      },
      "description": "Get the currently authenticated user",
      "resource": "me"
    }
  ]

npm_readme:
  # @continuumtracker/n8n-nodes-continuum-tracker

  This is an n8n community node. It lets you interact with the [Continuum Tracker](https://www.continuumtracker.com) public API from your n8n workflows.

  **Continuum Tracker** is an AI-powered platform that helps product teams prioritize features by analyzing customer feedback and market data to inform strategic product development decisions. It automates feedback collection from multiple sources, clusters it into themes, and drives backlog prioritization based on market intelligence — built for product managers, investment funds and software agencies that need data-driven decision support.

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

  ![Preview](preview.png)

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

  ## Installation

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

  **Quick install (self-hosted n8n):**

  1. In n8n, go to **Settings → Community nodes**.
  2. Click **Install**.
  3. Enter the package name: `@continuumtracker/n8n-nodes-continuum-tracker`.
  4. Agree to the risks of using community nodes and click **Install**.

  After the install completes the **Continuum Tracker** node appears in the nodes panel.

  > **Note:** Community nodes are only available on self-hosted n8n instances. They are not available on n8n Cloud unless approved by n8n.

  ## Operations

  The node exposes the following resources and operations:

  - **Feedback**
    - Get Many — list feedbacks for a project (paginated, filterable)
    - Get — fetch a single feedback by ID (optionally with embedded painpoints)
    - Create — create a new feedback
    - Update — update an existing feedback
    - Archive — archive (soft-delete) a feedback
  - **Signal**
    - Get Many — list signals for a project (paginated, filterable)
    - Get — fetch a single signal by ID
    - Create — create a manual signal
  - **Me**
    - Get — get the currently authenticated user

  ## Credentials

  You need a Continuum Tracker API key to use this node.

  1. Sign in to [Continuum Tracker](https://app.continuumtracker.com).
  2. Go to **Settings → Access** (`/settings/access`).
  3. **Generate** a new API key (or rotate an existing one) and copy it.
  4. In n8n, create new credentials of type **Continuum Tracker API** and paste the key into the **Access Token** field.

  Authentication is sent as a bearer token in the `Authorization` header on every request.

  ## Usage

  A typical workflow: continuously pull customer feedback from a product-management tool like Productboard, Intercom, Zendesk or a typeform survey, and push it into Continuum Tracker so the AI engine can cluster it into themes and prioritize the backlog.

  1. **Trigger** — Productboard / Intercom / Zendesk webhook or a Schedule Trigger that polls the source every N minutes.
  2. **Source node** — fetch new feedback items (e.g. *Productboard → Get Notes*, *Intercom → List Conversations*).
  3. **Set / Edit Fields** — map the source fields onto Continuum Tracker's shape: `feedback_original` (the raw text), optional `name`, `author`, `author_type`, `source` (e.g. `"Productboard"`, `"Intercom"`).
  4. **Continuum Tracker** — Resource: `Feedback`, Operation: `Create`, Project: pick from list. Feeds the item into Continuum Tracker, which will automatically cluster it and turn it into prioritization signals.

  Tips:

  - For *Get Many* operations, toggle **Return All** to auto-paginate through every page; otherwise use **Limit** to cap the result count.
  - The node strips the paginator envelope and returns feedback/signal items directly, one item per n8n item.
  - The **Me** operation is useful as a credential health-check or to look up the authenticated organization context.

  ## Resources

  - [Continuum Tracker website](https://www.continuumtracker.com)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [CHANGELOG](CHANGELOG.md)

ai_documentation_summary:
  {"purpose":"This node lets n8n workflows interact with the Continuum Tracker public API. It is used to send feedback into Continuum Tracker and retrieve feedback, signals, and account information for product prioritization workflows.","capabilities":["Feedback resource: Get Many (paginated, filterable)","Feedback resource: Get by ID (optionally with embedded painpoints)","Feedback resource: Create","Feedback resource: Update","Feedback resource: Archive (soft-delete)","Signal resource: Get Many (paginated, filterable)","Signal resource: Get by ID","Signal resource: Create manual signal","Me resource: Get currently authenticated user","Supports automatic pagination via Return All"],"authentication":"API key required; create a Continuum Tracker API credential in n8n and provide the Access Token, which is sent as a bearer token in the Authorization header.","commonUseCases":["Ingest customer feedback from tools like Productboard, Intercom, Zendesk, or Typeform into Continuum Tracker","Automate feedback collection and push raw feedback into Continuum Tracker for clustering and prioritization","Retrieve feedback or signals for reporting, analysis, or downstream workflow processing","Check credential validity or authenticated organization context using the Me operation"],"limitations":["Community nodes are only available on self-hosted n8n instances unless approved for n8n Cloud","The node strips paginator envelopes and returns individual feedback/signal items directly"],"relatedNodes":["Schedule Trigger","Webhook","Set","Edit Fields"]}


node_type: n8n-nodes-oxapay.oxapayTrigger
package_name: n8n-nodes-oxapay
display_name: OxaPay Trigger
description: OxaPay Crypto Payment gateway
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: oxapay
author_github_url: https://github.com/OxaPay/
npm_package_name: n8n-nodes-oxapay
npm_version: 1.0.7
community_fetched_at: 2026-07-14T14:40:34.435Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # OxaPay for n8n

  Official OxaPay integration for n8n.

  This project provides **OxaPay** nodes for n8n so you can automate crypto payment flows, payouts, swaps, common OxaPay account utilities, and webhook-driven workflows directly inside n8n.

  ## Overview

  With this integration, you can connect n8n workflows to the OxaPay API and build automations such as:

  * Create a crypto payment invoice from an order
  * Receive payment updates through webhooks
  * Fetch payment and payout details
  * Query balances, prices, currencies, and networks
  * Generate swaps and retrieve swap rates
  * Trigger downstream workflows when OxaPay sends payment or payout callbacks

  The project currently includes:

  * **OxaPay** node

    * Payment operations
    * Payout operations
    * Swap operations
    * Common operations
  * **OxaPay Trigger** node

    * Receive OxaPay webhooks

  ---

  ## Operations

  ### Payment

  * Generate Invoice
  * Generate White Label payment details
  * Generate Static Address
  * Revoke Static Address
  * List Static Addresses
  * Get Payment Information
  * Search Payments
  * Get Payment Statistics
  * Get Accepted Currencies
  * Custom Payment API Call

  ### Payout

  * Generate Payout
  * Get Payout Information
  * Search Payouts
  * Custom Payout API Call

  ### Swap

  * Generate Swap
  * Calculate Swap
  * Get Swap Rate
  * Search Swaps
  * Get Swap Pairs
  * Custom Swap API Call

  ### Common

  * Get Account Balances
  * Get Prices
  * Get Supported Currencies
  * Get Supported Fiat Currencies
  * Get Supported Networks
  * Get System Status
  * Custom Common API Call

  ### Trigger

  * Listen for **payment** webhooks
  * Listen for **payout** webhooks
  * Auto-detect webhook type from payload

  ---

  ## Supported Credentials

  This integration uses three OxaPay credential types.

  ### OxaPay Merchant API Key

  Used for payment-related operations, such as creating invoices, retrieving payment information, searching payments, and validating payment webhooks.

  You can create or manage your Merchant API Key from the OxaPay Merchant Service page:

  https://app.oxapay.com/merchant-service

  ### OxaPay Payout API Key

  Used for payout-related operations, such as creating payouts, retrieving payout information, searching payouts, and validating payout webhooks.

  You can create or manage your Payout API Key from the OxaPay Payout Service page:

  https://app.oxapay.com/payout-service

  ### OxaPay General API Key

  Used for common and swap-related operations, such as retrieving balances, prices, currencies, networks, system status, and performing swap operations.

  You can create or manage your General API Key from the OxaPay Settings page:

  https://app.oxapay.com/settings

  ## Requirements

  Before using this integration, make sure you have:

  * A working **n8n** instance
  * An **OxaPay account**
  * At least one of the following API keys depending on your use case:

    * Merchant API Key
    * Payout API Key
    * General API Key

  ---

  ## Installation

  In your n8n instance:

  1. Go to **Settings**
  2. Open **Community Nodes**
  3. Select **Install**
  4. Enter the package name:

  ```text
  n8n-nodes-oxapay
  ```

  5. Confirm the installation

  For more details, see the n8n community nodes installation guide:

  https://docs.n8n.io/integrations/community-nodes/installation/

  ---

  ## Example Use Cases

  ### 1. Create invoice from an order

  Workflow idea:

  1. Receive a new order from Shopify, WooCommerce, or a form
  2. Use **OxaPay → Payment → Generate Invoice**
  3. Send the invoice URL to the customer by email or chat

  ### 2. Update order status when a payment is completed

  Workflow idea:

  1. Use **OxaPay Trigger** to receive payment updates
  2. Check the payment status in the webhook payload
  3. Update your CRM, database, or ecommerce platform
  4. Notify your team on Telegram, Slack, or Discord

  ### 3. Run automated payouts

  Workflow idea:

  1. Receive approved payout requests from your internal system
  2. Use **OxaPay → Payout → Generate Payout**
  3. Log the payout result in Airtable, Notion, or Google Sheets

  ### 4. Monitor balances and rates

  Workflow idea:

  1. Run a scheduled workflow in n8n
  2. Use **OxaPay → Common → Get Account Balances**
  3. Use **OxaPay → Common → Get Prices**
  4. Send a daily treasury summary to your team

  ### 5. Use swaps in automated treasury flows

  Workflow idea:

  1. Watch for treasury thresholds or incoming balances
  2. Use **Calculate Swap** or **Get Swap Rate**
  3. Trigger **Generate Swap** when policy conditions are met

  ---

  ## Example Workflows

  Example n8n workflow files are available in the `examples/` directory:

  - `create-invoice.workflow.json` — Create an OxaPay invoice from sample order data.
  - `payment-webhook.workflow.json` — Receive OxaPay payment webhook events and branch based on payment status.
  - `payout.workflow.json` — Create a payout request from sample recipient data.
  - `white-label-payment.workflow.json` — Generate OxaPay white-label payment details from sample order data.
  - `swap-rate.workflow.json` — Retrieve the swap rate for a supported currency pair.

  ---

  ## Development

  Install dependencies:

  ```bash
  npm install
  ```

  Build the package:

  ```bash
  npm run build
  ```
  Run lint checks:

  ```bash
  npm run lint
  ```
  Create a local package for testing:

  ```bash
  npm pack
  ```

  ## Troubleshooting

  ### The webhook fails HMAC verification

  Check the following:

  * the correct credential type is selected
  * the correct API key is configured
  * your proxy or n8n setup preserves the raw request body
  * the sender is actually OxaPay
  * the incoming `HMAC` header is present

  ### Payment operations fail with authentication errors

  Make sure you are using the **Merchant API Key** credential for payment operations.

  ### Payout operations fail with authentication errors

  Make sure you are using the **Payout API Key** credential for payout operations.

  ### Swap operations fail

  Make sure you are using the **General API Key** credential where required.

  ---

  ## License

  MIT

  ---

  ## Links

  * OxaPay website: [https://oxapay.com/](https://oxapay.com/)
  * OxaPay docs: [https://docs.oxapay.com/](https://docs.oxapay.com/)

  ---

  ## Disclaimer

  This project is an OxaPay integration for n8n and should be tested carefully before production use, especially for payout flows, webhook validation, and financial automation logic.

ai_documentation_summary:
  {"purpose":"Official OxaPay integration for n8n that automates crypto payment workflows, including invoices, payouts, swaps, common account utilities, and webhook-driven triggers. The OxaPay Trigger node specifically listens for OxaPay payment and payout webhooks.","capabilities":["Listen for payment webhooks","Listen for payout webhooks","Auto-detect webhook type from incoming payload","Validate payment webhooks with HMAC and Merchant API Key","Validate payout webhooks with HMAC and Payout API Key"],"authentication":"Requires OxaPay API credentials; the Trigger uses the appropriate OxaPay credential type depending on the webhook flow, with payment webhooks using the Merchant API Key and payout webhooks using the Payout API Key.","commonUseCases":["Trigger downstream workflows when an OxaPay payment is completed","Trigger downstream workflows when an OxaPay payout callback is received","Branch workflow logic based on payment or payout webhook status","Update external systems after OxaPay webhook events"],"limitations":["Webhook HMAC verification can fail if the raw request body is not preserved by the proxy or n8n setup","Webhook validation depends on the correct API key and credential type being configured","The trigger is limited to OxaPay payment and payout webhooks"],"relatedNodes":["OxaPay","Webhook"]}


node_type: n8n-nodes-oxapay.oxapay
package_name: n8n-nodes-oxapay
display_name: OxaPay
description: OxaPay Crypto Payment gateway
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: oxapay
author_github_url: https://github.com/OxaPay/
npm_package_name: n8n-nodes-oxapay
npm_version: 1.0.7
community_fetched_at: 2026-07-14T14:40:34.436Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "payment",
      "options": [
        {
          "name": "Payment",
          "value": "payment"
        },
        {
          "name": "Payout",
          "value": "payout"
        },
        {
          "name": "Swap",
          "value": "swap"
        },
        {
          "name": "Common",
          "value": "common"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateInvoice",
      "options": [
        {
          "name": "Generate Invoice Link",
          "value": "generateInvoice",
          "action": "Generate an Invoice Link",
          "description": "Generates a payment invoice and returns a payment URL based on the specified amount and options."
        },
        {
          "name": "Generate White Label",
          "value": "generateWhiteLabel",
          "action": "Generate a White Label Address",
          "description": "Generates fully branded payment details for seamless in-app payment processing without redirecting to an invoice URL."
        },
        {
          "name": "Generate Static Address",
          "value": "generateStaticAddress",
          "action": "Generate a Static Address",
          "description": "Generates a static address for a specific currency and network."
        },
        {
          "name": "Revoke Static Address",
          "value": "revokeStaticAddress",
          "action": "Revoke a Static Address",
          "description": "Disables the static wallet and prevents any further transactions from being credited to the specified address."
        },
        {
          "name": "List Static Addresses",
          "value": "listStaticAddresses",
          "action": "List Static Addresses",
          "description": "Returns a list of static addresses associated with a specific business."
        },
        {
          "name": "Get Payment Information",
          "value": "getPaymentInformation",
          "action": "Get Payment Information",
          "description": "Returns detailed information about a specific payment using its Track ID."
        },
        {
          "name": "Search Payments",
          "value": "listPayments",
          "action": "Search Payments",
          "description": "Returns a list of payment transactions based on filters."
        },
        {
          "name": "Get Payment Statistics",
          "value": "paymentstats",
          "action": "Get Payment Statistics",
          "description": "Returns aggregated payment statistics for a merchant grouped by cryptocurrency"
        },
        {
          "name": "Get Accepted Currencies",
          "value": "acceptedCurrencies",
          "action": "Get Accepted Currencies",
          "description": "Returns the list of cryptocurrencies configured in your OxaPay Merchant Service for accepting payments."
        },
        {
          "name": "Custom Payment API Call",
          "value": "customPaymentCall",
          "action": "Make a Custom Payment API Call",
          "description": "Performs an arbitrary authorized payment API call."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "payment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generatePayout",
      "options": [
        {
          "name": "Generate Payout",
          "value": "generatePayout",
          "action": "Generate Payout",
          "description": "Generates a cryptocurrency payout request, allowing you to transfer funds to a specified address."
        },
        {
          "name": "Get Payout Information",
          "value": "getPayoutInfo",
          "action": "Get Payout Information",
          "description": "Returns the details of a specific payout using its Track ID."
        },
        {
          "name": "Search Payouts",
          "value": "listPayouts",
          "action": "Search Payouts",
          "description": "Returns a list of payout transactions based on filters."
        },
        {
          "name": "Custom Payout API Call",
          "value": "customPayoutCall",
          "action": "Make a Custom Payout API Call",
          "description": "Performs an arbitrary authorized Payout API call."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "payout"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateSwap",
      "options": [
        {
          "name": "Generate a Swap Request",
          "value": "generateSwap",
          "action": "Generate Swap Request",
          "description": "Swaps your account assets."
        },
        {
          "name": "Get Swap Pairs",
          "value": "swapPairs",
          "action": "Get Swap Pairs",
          "description": "Returns a list of swappable cryptocurrencies along with their minimum swap amounts."
        },
        {
          "name": "Calculate a Swap",
          "value": "calculateSwap",
          "action": "Calculate Swap",
          "description": "Calculates how much cryptocurrency you will receive when swapping one currency for another."
        },
        {
          "name": "Get the Swap Rate",
          "value": "getSwapRate",
          "action": "Get the Swap Rate",
          "description": "Fetches real-time swap rates for cryptocurrency pairs supported by OxaPay."
        },
        {
          "name": "Search Swaps",
          "value": "searchSwaps",
          "action": "Search Swaps",
          "description": "Returns a list of swap transactions based on filters."
        },
        {
          "name": "Custom Swap API Call",
          "value": "customSwapCall",
          "action": "Make a Custom Swap API Call",
          "description": "Performs an arbitrary authorized Swap API call."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "swap"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAccountBalances",
      "options": [
        {
          "name": "Get the Account Balances",
          "value": "getAccountBalances",
          "action": "Get Account Balances",
          "description": "Returns the details of all wallets associated with a user."
        },
        {
          "name": "Get Prices",
          "value": "getPrices",
          "action": "Get Prices",
          "description": "Returns the current prices of all cryptocurrencies supported by OxaPay."
        },
        {
          "name": "Get Supported Currencies",
          "value": "getSupportedCurrencies",
          "action": "Get Supported Currencies",
          "description": "Calculates how much cryptocurrency you will receive when swapping one currency for another."
        },
        {
          "name": "Get Supported Fiat Currencies",
          "value": "getSupportedFiatCurrencies",
          "action": "Get Supported Fiat Currencies",
          "description": "Returns a list of supported fiat currencies."
        },
        {
          "name": "Get Supported Networks",
          "value": "getSupportedNetworks",
          "action": "Get Supported Networks",
          "description": "Returns a list of blockchain networks supported by OxaPay for cryptocurrency transactions."
        },
        {
          "name": "Get the System Status",
          "value": "getSystemStatus",
          "action": "Get System Status",
          "description": "Checks the current status of the OxaPay API."
        },
        {
          "name": "Custom Common API Call",
          "value": "customCommonCall",
          "action": "Make a Custom Common API Call",
          "description": "Performs an arbitrary authorized Common API call."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "common"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate Invoice Link",
      "value": "generateInvoice",
      "action": "Generate an Invoice Link",
      "description": "Generates a payment invoice and returns a payment URL based on the specified amount and options.",
      "resource": "payment"
    },
    {
      "name": "Generate White Label",
      "value": "generateWhiteLabel",
      "action": "Generate a White Label Address",
      "description": "Generates fully branded payment details for seamless in-app payment processing without redirecting to an invoice URL.",
      "resource": "payment"
    },
    {
      "name": "Generate Static Address",
      "value": "generateStaticAddress",
      "action": "Generate a Static Address",
      "description": "Generates a static address for a specific currency and network.",
      "resource": "payment"
    },
    {
      "name": "Revoke Static Address",
      "value": "revokeStaticAddress",
      "action": "Revoke a Static Address",
      "description": "Disables the static wallet and prevents any further transactions from being credited to the specified address.",
      "resource": "payment"
    },
    {
      "name": "List Static Addresses",
      "value": "listStaticAddresses",
      "action": "List Static Addresses",
      "description": "Returns a list of static addresses associated with a specific business.",
      "resource": "payment"
    },
    {
      "name": "Get Payment Information",
      "value": "getPaymentInformation",
      "action": "Get Payment Information",
      "description": "Returns detailed information about a specific payment using its Track ID.",
      "resource": "payment"
    },
    {
      "name": "Search Payments",
      "value": "listPayments",
      "action": "Search Payments",
      "description": "Returns a list of payment transactions based on filters.",
      "resource": "payment"
    },
    {
      "name": "Get Payment Statistics",
      "value": "paymentstats",
      "action": "Get Payment Statistics",
      "description": "Returns aggregated payment statistics for a merchant grouped by cryptocurrency",
      "resource": "payment"
    },
    {
      "name": "Get Accepted Currencies",
      "value": "acceptedCurrencies",
      "action": "Get Accepted Currencies",
      "description": "Returns the list of cryptocurrencies configured in your OxaPay Merchant Service for accepting payments.",
      "resource": "payment"
    },
    {
      "name": "Custom Payment API Call",
      "value": "customPaymentCall",
      "action": "Make a Custom Payment API Call",
      "description": "Performs an arbitrary authorized payment API call.",
      "resource": "payment"
    },
    {
      "name": "Generate Payout",
      "value": "generatePayout",
      "action": "Generate Payout",
      "description": "Generates a cryptocurrency payout request, allowing you to transfer funds to a specified address.",
      "resource": "payout"
    },
    {
      "name": "Get Payout Information",
      "value": "getPayoutInfo",
      "action": "Get Payout Information",
      "description": "Returns the details of a specific payout using its Track ID.",
      "resource": "payout"
    },
    {
      "name": "Search Payouts",
      "value": "listPayouts",
      "action": "Search Payouts",
      "description": "Returns a list of payout transactions based on filters.",
      "resource": "payout"
    },
    {
      "name": "Custom Payout API Call",
      "value": "customPayoutCall",
      "action": "Make a Custom Payout API Call",
      "description": "Performs an arbitrary authorized Payout API call.",
      "resource": "payout"
    },
    {
      "name": "Generate a Swap Request",
      "value": "generateSwap",
      "action": "Generate Swap Request",
      "description": "Swaps your account assets.",
      "resource": "swap"
    },
    {
      "name": "Get Swap Pairs",
      "value": "swapPairs",
      "action": "Get Swap Pairs",
      "description": "Returns a list of swappable cryptocurrencies along with their minimum swap amounts.",
      "resource": "swap"
    },
    {
      "name": "Calculate a Swap",
      "value": "calculateSwap",
      "action": "Calculate Swap",
      "description": "Calculates how much cryptocurrency you will receive when swapping one currency for another.",
      "resource": "swap"
    },
    {
      "name": "Get the Swap Rate",
      "value": "getSwapRate",
      "action": "Get the Swap Rate",
      "description": "Fetches real-time swap rates for cryptocurrency pairs supported by OxaPay.",
      "resource": "swap"
    },
    {
      "name": "Search Swaps",
      "value": "searchSwaps",
      "action": "Search Swaps",
      "description": "Returns a list of swap transactions based on filters.",
      "resource": "swap"
    },
    {
      "name": "Custom Swap API Call",
      "value": "customSwapCall",
      "action": "Make a Custom Swap API Call",
      "description": "Performs an arbitrary authorized Swap API call.",
      "resource": "swap"
    },
    {
      "name": "Get the Account Balances",
      "value": "getAccountBalances",
      "action": "Get Account Balances",
      "description": "Returns the details of all wallets associated with a user.",
      "resource": "common"
    },
    {
      "name": "Get Prices",
      "value": "getPrices",
      "action": "Get Prices",
      "description": "Returns the current prices of all cryptocurrencies supported by OxaPay.",
      "resource": "common"
    },
    {
      "name": "Get Supported Currencies",
      "value": "getSupportedCurrencies",
      "action": "Get Supported Currencies",
      "description": "Calculates how much cryptocurrency you will receive when swapping one currency for another.",
      "resource": "common"
    },
    {
      "name": "Get Supported Fiat Currencies",
      "value": "getSupportedFiatCurrencies",
      "action": "Get Supported Fiat Currencies",
      "description": "Returns a list of supported fiat currencies.",
      "resource": "common"
    },
    {
      "name": "Get Supported Networks",
      "value": "getSupportedNetworks",
      "action": "Get Supported Networks",
      "description": "Returns a list of blockchain networks supported by OxaPay for cryptocurrency transactions.",
      "resource": "common"
    },
    {
      "name": "Get the System Status",
      "value": "getSystemStatus",
      "action": "Get System Status",
      "description": "Checks the current status of the OxaPay API.",
      "resource": "common"
    },
    {
      "name": "Custom Common API Call",
      "value": "customCommonCall",
      "action": "Make a Custom Common API Call",
      "description": "Performs an arbitrary authorized Common API call.",
      "resource": "common"
    }
  ]

npm_readme:
  # OxaPay for n8n

  Official OxaPay integration for n8n.

  This project provides **OxaPay** nodes for n8n so you can automate crypto payment flows, payouts, swaps, common OxaPay account utilities, and webhook-driven workflows directly inside n8n.

  ## Overview

  With this integration, you can connect n8n workflows to the OxaPay API and build automations such as:

  * Create a crypto payment invoice from an order
  * Receive payment updates through webhooks
  * Fetch payment and payout details
  * Query balances, prices, currencies, and networks
  * Generate swaps and retrieve swap rates
  * Trigger downstream workflows when OxaPay sends payment or payout callbacks

  The project currently includes:

  * **OxaPay** node

    * Payment operations
    * Payout operations
    * Swap operations
    * Common operations
  * **OxaPay Trigger** node

    * Receive OxaPay webhooks

  ---

  ## Operations

  ### Payment

  * Generate Invoice
  * Generate White Label payment details
  * Generate Static Address
  * Revoke Static Address
  * List Static Addresses
  * Get Payment Information
  * Search Payments
  * Get Payment Statistics
  * Get Accepted Currencies
  * Custom Payment API Call

  ### Payout

  * Generate Payout
  * Get Payout Information
  * Search Payouts
  * Custom Payout API Call

  ### Swap

  * Generate Swap
  * Calculate Swap
  * Get Swap Rate
  * Search Swaps
  * Get Swap Pairs
  * Custom Swap API Call

  ### Common

  * Get Account Balances
  * Get Prices
  * Get Supported Currencies
  * Get Supported Fiat Currencies
  * Get Supported Networks
  * Get System Status
  * Custom Common API Call

  ### Trigger

  * Listen for **payment** webhooks
  * Listen for **payout** webhooks
  * Auto-detect webhook type from payload

  ---

  ## Supported Credentials

  This integration uses three OxaPay credential types.

  ### OxaPay Merchant API Key

  Used for payment-related operations, such as creating invoices, retrieving payment information, searching payments, and validating payment webhooks.

  You can create or manage your Merchant API Key from the OxaPay Merchant Service page:

  https://app.oxapay.com/merchant-service

  ### OxaPay Payout API Key

  Used for payout-related operations, such as creating payouts, retrieving payout information, searching payouts, and validating payout webhooks.

  You can create or manage your Payout API Key from the OxaPay Payout Service page:

  https://app.oxapay.com/payout-service

  ### OxaPay General API Key

  Used for common and swap-related operations, such as retrieving balances, prices, currencies, networks, system status, and performing swap operations.

  You can create or manage your General API Key from the OxaPay Settings page:

  https://app.oxapay.com/settings

  ## Requirements

  Before using this integration, make sure you have:

  * A working **n8n** instance
  * An **OxaPay account**
  * At least one of the following API keys depending on your use case:

    * Merchant API Key
    * Payout API Key
    * General API Key

  ---

  ## Installation

  In your n8n instance:

  1. Go to **Settings**
  2. Open **Community Nodes**
  3. Select **Install**
  4. Enter the package name:

  ```text
  n8n-nodes-oxapay
  ```

  5. Confirm the installation

  For more details, see the n8n community nodes installation guide:

  https://docs.n8n.io/integrations/community-nodes/installation/

  ---

  ## Example Use Cases

  ### 1. Create invoice from an order

  Workflow idea:

  1. Receive a new order from Shopify, WooCommerce, or a form
  2. Use **OxaPay → Payment → Generate Invoice**
  3. Send the invoice URL to the customer by email or chat

  ### 2. Update order status when a payment is completed

  Workflow idea:

  1. Use **OxaPay Trigger** to receive payment updates
  2. Check the payment status in the webhook payload
  3. Update your CRM, database, or ecommerce platform
  4. Notify your team on Telegram, Slack, or Discord

  ### 3. Run automated payouts

  Workflow idea:

  1. Receive approved payout requests from your internal system
  2. Use **OxaPay → Payout → Generate Payout**
  3. Log the payout result in Airtable, Notion, or Google Sheets

  ### 4. Monitor balances and rates

  Workflow idea:

  1. Run a scheduled workflow in n8n
  2. Use **OxaPay → Common → Get Account Balances**
  3. Use **OxaPay → Common → Get Prices**
  4. Send a daily treasury summary to your team

  ### 5. Use swaps in automated treasury flows

  Workflow idea:

  1. Watch for treasury thresholds or incoming balances
  2. Use **Calculate Swap** or **Get Swap Rate**
  3. Trigger **Generate Swap** when policy conditions are met

  ---

  ## Example Workflows

  Example n8n workflow files are available in the `examples/` directory:

  - `create-invoice.workflow.json` — Create an OxaPay invoice from sample order data.
  - `payment-webhook.workflow.json` — Receive OxaPay payment webhook events and branch based on payment status.
  - `payout.workflow.json` — Create a payout request from sample recipient data.
  - `white-label-payment.workflow.json` — Generate OxaPay white-label payment details from sample order data.
  - `swap-rate.workflow.json` — Retrieve the swap rate for a supported currency pair.

  ---

  ## Development

  Install dependencies:

  ```bash
  npm install
  ```

  Build the package:

  ```bash
  npm run build
  ```
  Run lint checks:

  ```bash
  npm run lint
  ```
  Create a local package for testing:

  ```bash
  npm pack
  ```

  ## Troubleshooting

  ### The webhook fails HMAC verification

  Check the following:

  * the correct credential type is selected
  * the correct API key is configured
  * your proxy or n8n setup preserves the raw request body
  * the sender is actually OxaPay
  * the incoming `HMAC` header is present

  ### Payment operations fail with authentication errors

  Make sure you are using the **Merchant API Key** credential for payment operations.

  ### Payout operations fail with authentication errors

  Make sure you are using the **Payout API Key** credential for payout operations.

  ### Swap operations fail

  Make sure you are using the **General API Key** credential where required.

  ---

  ## License

  MIT

  ---

  ## Links

  * OxaPay website: [https://oxapay.com/](https://oxapay.com/)
  * OxaPay docs: [https://docs.oxapay.com/](https://docs.oxapay.com/)

  ---

  ## Disclaimer

  This project is an OxaPay integration for n8n and should be tested carefully before production use, especially for payout flows, webhook validation, and financial automation logic.

ai_documentation_summary:
  {"purpose":"Integrates n8n with the OxaPay crypto payment gateway to automate invoices, payouts, swaps, account queries, and webhook-driven workflows. It also includes a trigger node for receiving OxaPay payment and payout callbacks.","capabilities":["Generate payment invoices, white-label payment details, and static addresses","Revoke and list static addresses","Retrieve, search, and analyze payment information and payment statistics","Retrieve accepted currencies","Generate payouts and retrieve/search payout information","Generate swaps, calculate swaps, get swap rates, search swaps, and get swap pairs","Get account balances, prices, supported currencies, supported fiat currencies, supported networks, and system status","Perform custom API calls for payment, payout, swap, and common endpoints","Receive OxaPay webhooks for payment and payout events with auto-detection of webhook type"],"authentication":"Three API key credential types are supported: OxaPay Merchant API Key for payment operations, OxaPay Payout API Key for payout operations, and OxaPay General API Key for common and swap operations.","commonUseCases":["Create a crypto invoice after a customer places an order","Update order or CRM status when a payment webhook is received","Automate payout requests and log results in external systems","Monitor balances, prices, currencies, and networks in scheduled treasury workflows","Execute swaps based on balance thresholds or treasury policy conditions"],"limitations":["Payment, payout, and swap features require the correct matching credential type","Webhook HMAC verification can fail if the raw request body is not preserved or the HMAC header is missing"],"relatedNodes":["OxaPay Trigger"]}


node_type: n8n-nodes-screenshotrender.screenshotRender
package_name: n8n-nodes-screenshotrender
display_name: ScreenshotRender
description: Capture website screenshots with the ScreenshotRender API
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: faridmth
author_github_url: https://github.com/Rid064/
npm_package_name: n8n-nodes-screenshotrender
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.438Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-screenshotrender

  An [n8n](https://n8n.io) community node for [ScreenshotRender](https://screenshotrender.com).
  Capture a screenshot of any web page from inside an n8n workflow. No headless
  browser to host, no infrastructure to manage.

  ## Installation

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

  ```
  n8n-nodes-screenshotrender
  ```

  ## Credentials

  You need a ScreenshotRender API key (starts with `sr-`). Get one for free at
  [screenshotrender.com/dashboard](https://screenshotrender.com/dashboard). The
  free tier includes 100 screenshots.

  Add it under **ScreenshotRender API** credentials in n8n.

  ## Node: ScreenshotRender

  Operation: **Capture**.

  | Field | Description |
  |---|---|
  | URL | The web page to capture (required) |
  | Full Page | Capture the whole scrollable page instead of just the viewport |
  | Wait (ms) | Wait after load before capturing, for late-rendering content |
  | Timeout (ms) | Maximum time to wait for the page before failing |

  The node returns the API JSON, including the `screenshot` URL, page `title`,
  `description`, `favicon`, and `tokensUsed`.

  ## Example

  Trigger → ScreenshotRender (URL: `https://example.com`, Full Page: on) →
  save `{{$json.data.screenshot}}` to Google Drive, Slack, or a database.

  ## Development

  ```bash
  npm install
  npm run build      # tsc + copy icons to dist/
  npm run lint       # n8n community lint rules
  ```

  Local testing:

  ```bash
  npm run build
  npm link
  # then in your n8n custom folder:
  #   npm link n8n-nodes-screenshotrender
  npx n8n start
  ```

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Captures website screenshots from within an n8n workflow using the ScreenshotRender API, without needing to run or manage a headless browser. The node returns screenshot and page metadata as API JSON.","capabilities":["Capture a screenshot of a specified URL","Capture the full scrollable page or just the visible viewport","Wait a configurable amount of time after page load before capturing","Set a timeout for page loading before failing","Return screenshot URL plus page metadata such as title, description, favicon, and tokens used"],"authentication":"ScreenshotRender API key required (starts with 'sr-'); configure it in n8n under ScreenshotRender API credentials.","commonUseCases":["Generate website screenshots for archival or reporting workflows","Save screenshot outputs to Google Drive, Slack, or a database","Capture rendered pages with late-loading content by using wait and full-page options"],"limitations":["Only supports the Capture operation","Requires a ScreenshotRender API key; free tier includes 100 screenshots"],"relatedNodes":["Google Drive","Slack"]}


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

updated_at: 2026-07-14 14:40:34
author_name: phacetlabs
author_github_url: https://github.com/spx-software/n8n-phacet-official.git
npm_package_name: n8n-nodes-phacet-official
npm_version: 0.3.0
community_fetched_at: 2026-07-14T14:40:34.439Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-phacet-official

  ![Phacet Logo](https://raw.githubusercontent.com/spx-software/n8n-phacet-official/main/nodes/Phacet/phacet.svg)

  This is an n8n community node for [Phacet](https://phacetlabs.com), the AI that prepares, reconciles and controls your financial data. Automate table operations; create rows, update data, retrieve results, and download files directly from your n8n workflows.

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

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

  ## Installation

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

  ### Community Nodes (n8n Cloud & Self-hosted)

  1. Go to **Settings > Community Nodes**
  2. Select **Install**
  3. Enter `n8n-nodes-phacet-official`
  4. Select **Install**

  Once installed, the Phacet node will be available in your node palette.

  ## Operations

  This package includes **two nodes**:

  - **Phacet**: manage rows in your Phacet tables
  - **Phacet Trigger**: start workflows when Phacet events occur (webhooks)

  ### Row Operations

  - **Create**: Create new rows in a table with dynamic column mapping (supports inline file upload)
  - **Update**: Update an existing row with new cell values
  - **Get**: Retrieve a row by its ID
  - **Get Cell Download URL**: Get a temporary download URL for a file stored in a file-type column

  ### Trigger Operations (Phacet Trigger)

  - **Row Calculation Completed** (`row.calculation.completed`)
  - **Row Calculation Failed** (`row.calculation.failed`)
  - **Row Created** (`row.created`)

  ## Credentials

  You need a Phacet API key to use this node.

  ### Getting your Phacet API Key

  1. Log in to your [Phacet account](https://app.phacetlabs.com)
  2. Go to **Settings > API**
  3. Generate a new API key
  4. Copy the API key

  ### Setting up the credential in n8n

  1. In n8n, create a new **Phacet API** credential
  2. Enter your API key in the **API Key** field
  3. Save the credential

  ## Compatibility

  - **n8n version**: 1.0.0 or later
  - **Node version**: 18.0.0 or later

  ## Usage

  ### Create Rows

  Use the **Create** operation to add new rows to your Phacet tables:

  1. Add the Phacet node to your workflow
  2. Select **Row** as the resource
  3. Select **Create** as the operation
  4. Choose your **Table** from the dynamic dropdown
  5. Choose your **Session** from the dynamic dropdown (based on selected table)
  6. Map your data to **Cells** using the dynamic column selector (Text and/or File)
  7. The node returns the created row information

  For file-type columns, you can pass a file directly — no separate upload step needed.

  ### Update Rows

  Use the **Update** operation to modify existing rows: select Row > Update, specify the Table and Row ID, then map your updated values to columns.

  ### Get Rows

  Use the **Get** operation to retrieve a row by its ID from a specific table.

  ### Get Cell Download URL

  Use the **Get Cell Download URL** operation to get a temporary download link for files stored in file-type columns.

  ### Phacet Trigger (Webhooks)

  Use **Phacet Trigger** to start a workflow when Phacet emits events:

  Supported events:

  - **Row Calculation Completed** (`row.calculation.completed`)
  - **Row Calculation Failed** (`row.calculation.failed`)
  - **Row Created** (`row.created`)

  1. Add **Phacet Trigger**
  2. Select an **Event**
  3. Select the **Table Name or ID**
  4. Activate the workflow (the node creates a webhook endpoint in Phacet)

  > Your n8n webhook URL must be publicly reachable by Phacet (important for self-hosted setups behind NAT/proxy).

  ### Dynamic Dropdowns

  This node features intelligent dynamic dropdowns that:

  - Load your available tables automatically
  - Show sessions based on your selected table
  - Display column names (not just IDs) for easy mapping
  - Update in real-time as you make selections

  ## Example Workflows

  ### Invoice Processing

  ```
  Email Trigger → Extract Attachments → Phacet Create Row (with invoice file) → Notification
  ```

  ### Bank Reconciliation

  ```
  SFTP/HTTP → Fetch bank statements → Phacet Create Row → Wait for calculation → Get Row results
  ```

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Phacet API Documentation](https://docs.phacetlabs.com/reference/authentication-1)
  - [Phacet Platform](https://phacetlabs.com)

  ## License

  [MIT](LICENSE.md)

  ---

  **Developed by [Phacet Labs](https://phacetlabs.com)**

ai_documentation_summary:
  {"purpose":"This node integrates n8n with Phacet to manage financial data rows and react to Phacet events. It supports both row operations and a trigger node that starts workflows when specified Phacet webhooks fire.","capabilities":["Create rows in Phacet tables with dynamic column mapping","Update existing rows","Get a row by ID","Get a temporary download URL for file-type cell contents","Trigger workflows on Phacet webhook events","Supports inline file upload when creating rows","Dynamic dropdowns for tables, sessions, and columns"],"authentication":"Phacet API key required","commonUseCases":["Invoice processing with file uploads into Phacet tables","Bank reconciliation workflows that create rows and wait for calculation events","Starting workflows when rows are created or calculations complete/fail in Phacet"],"limitations":["Phacet Trigger requires a publicly reachable n8n webhook URL, which is important for self-hosted setups behind NAT or a proxy"],"relatedNodes":["Webhook Trigger","Email Trigger","HTTP Request","SFTP"]}


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

updated_at: 2026-07-14 14:40:34
author_name: adam-ilcisak
author_github_url: https://github.com/ikisaka/
npm_package_name: n8n-nodes-resourceplanner
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.440Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "project",
      "options": [
        {
          "name": "Assignment",
          "value": "assignment"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Resource",
          "value": "resource"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an assignment",
          "description": "Create an assignment"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an assignment",
          "description": "Delete an assignment"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many assignments",
          "description": "Get many assignments"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an assignment",
          "description": "Update an assignment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "assignment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a project",
          "description": "Create a project"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a project",
          "description": "Delete a project"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project",
          "description": "Get a project"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many projects",
          "description": "Get many projects"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a project",
          "description": "Update a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a resource",
          "description": "Create a resource"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a resource",
          "description": "Delete a resource"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a resource",
          "description": "Get a resource"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many resources",
          "description": "Get many resources"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a resource",
          "description": "Update a resource"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "resource"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an assignment",
      "description": "Create an assignment",
      "resource": "assignment"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an assignment",
      "description": "Delete an assignment",
      "resource": "assignment"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many assignments",
      "description": "Get many assignments",
      "resource": "assignment"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an assignment",
      "description": "Update an assignment",
      "resource": "assignment"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a project",
      "description": "Create a project",
      "resource": "project"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a project",
      "description": "Delete a project",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "description": "Get a project",
      "resource": "project"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many projects",
      "description": "Get many projects",
      "resource": "project"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a project",
      "description": "Update a project",
      "resource": "project"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a resource",
      "description": "Create a resource",
      "resource": "resource"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a resource",
      "description": "Delete a resource",
      "resource": "resource"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a resource",
      "description": "Get a resource",
      "resource": "resource"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many resources",
      "description": "Get many resources",
      "resource": "resource"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a resource",
      "description": "Update a resource",
      "resource": "resource"
    }
  ]

npm_readme:
  # n8n-nodes-resourceplanner

  This is an n8n community node for [Resource Planner](https://www.resourceplanner.io/). It lets you automate Resource Planner projects, resources, and assignments from n8n workflows.

  Resource Planner is a workspace planning tool for managing project demand, team capacity, and scheduled assignments.

  [n8n](https://n8n.io/) is a workflow automation platform.

  ## Installation

  Install this package on a self-hosted n8n instance from npm:

  ```bash
  npm install n8n-nodes-resourceplanner
  ```

  You can also install it from the n8n UI:

  1. Open n8n.
  2. Go to Settings > Community Nodes.
  3. Select Install.
  4. Enter `n8n-nodes-resourceplanner`.
  5. Restart n8n if your deployment requires it.

  Unverified community nodes are available for self-hosted n8n. n8n Cloud requires the node to be submitted and accepted as a verified community node.

  ## Credentials

  This node uses a Resource Planner workspace API access key.

  To create one:

  1. Sign in to Resource Planner.
  2. Open Settings.
  3. Go to API access for REST clients.
  4. Generate a new API access key.
  5. Copy the value immediately. Resource Planner does not show the plaintext key again.

  In n8n, create a **Resource Planner API** credential:

  | Field | Value |
  | --- | --- |
  | Base URL | `https://resourceplanner.io` |
  | API Access Key | The workspace API access key generated in Resource Planner |

  Use the workspace API access key for REST clients. Do not use an embed key, MCP key, webhook secret, or outbound integration API key.

  ## Operations

  ### Assignment

  | Operation | Description |
  | --- | --- |
  | Create | Create an assignment for a project and resource |
  | Delete | Delete an assignment |
  | Get Many | List assignments, optionally filtered by project, resource, and date range |
  | Update | Update assignment dates, hours, note, task fields, project, resource, recurrence, or Time Off action |

  ### Project

  | Operation | Description |
  | --- | --- |
  | Create | Create a project |
  | Delete | Delete a project |
  | Get | Retrieve a project by ID |
  | Get Many | List projects |
  | Update | Update a project |

  ### Resource

  | Operation | Description |
  | --- | --- |
  | Create | Create a resource |
  | Delete | Delete a resource |
  | Get | Retrieve a resource by ID |
  | Get Many | List resources |
  | Update | Update a resource |

  ## Example Workflows

  ### Test the connection

  Use this first after installing the node:

  1. Add a Manual Trigger.
  2. Add Resource Planner.
  3. Set Resource to `Project`.
  4. Set Operation to `Get Many`.
  5. Set Return All to `false`.
  6. Set Limit to `10`.
  7. Execute the workflow.

  If credentials are valid, the node returns up to 10 projects from your workspace.

  ### Create a test resource

  1. Add a Manual Trigger.
  2. Add Resource Planner.
  3. Set Resource to `Resource`.
  4. Set Operation to `Create`.
  5. Set Name to `n8n Test Resource`.
  6. Add optional fields such as Capacity and Work Days.
  7. Execute the workflow.

  Delete the test resource from Resource Planner or by using the Resource Planner node's Resource > Delete operation.

  ### Daily assignment digest

  1. Add a Schedule Trigger.
  2. Add Resource Planner.
  3. Set Resource to `Assignment`.
  4. Set Operation to `Get Many`.
  5. Add Date From and Date To filters for the day you want to report.
  6. Send the resulting assignments to Slack, email, Notion, or another n8n node.

  ## Notes

  - Assignment project and resource fields load options from Resource Planner when credentials are configured.
  - JSON fields such as `comments`, `membership`, `resourceRates`, and `timeOff` must be valid JSON.
  - The Base URL should normally be `https://resourceplanner.io`. The node also tolerates `https://resourceplanner.io/api`, but the root URL is recommended.
  - Some fields require a Resource Planner Pro workspace or sufficient workspace permissions.

  ## Troubleshooting

  ### Couldn't connect with these settings

  Check:

  - The Base URL is `https://resourceplanner.io`.
  - The API Access Key is the workspace REST API access key.
  - The workspace has API access enabled.
  - The workspace has an active license if API access requires one.

  ### 401 Unauthorized

  The API key is missing, revoked, copied incorrectly, or from a different workspace. Generate a new key and update the n8n credential.

  ### 403 Forbidden

  The key is valid, but Resource Planner refused the action. Common causes are missing license, insufficient permissions, or trying to access a resource outside the workspace scope.

  ### Dynamic project or resource lists are empty

  Run Project > Get Many and Resource > Get Many first. If those return empty arrays, the workspace has no projects/resources or the API key cannot access them.

  ## Development

  Install dependencies:

  ```bash
  npm install
  ```

  Run the node locally with n8n:

  ```bash
  npm run dev
  ```

  Build:

  ```bash
  npm run build
  ```

  Lint:

  ```bash
  npm run lint
  ```

  Before publishing, run:

  ```bash
  npm run build
  npm run lint
  npm pack --dry-run
  ```

  ## Resources

  - [Resource Planner REST API access guide](https://resourceplanner.io/integration/api-access)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n community node publishing documentation](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/)

  ## Version History

  ### 0.1.0

  - Added Resource Planner credentials using workspace API access keys.
  - Added project, resource, and assignment operations.
  - Added dynamic project and resource option loading for assignment fields.

ai_documentation_summary:
  {"purpose":"An n8n community node that automates Resource Planner workspaces by managing projects, resources, and assignments. It is used to read, create, update, and delete planning data through the Resource Planner API.","capabilities":["Create, delete, retrieve, and list projects","Create, delete, retrieve, and list resources","Create, delete, list, and update assignments","Filter assignment lists by project, resource, and date range","Load project and resource options dynamically for assignment fields"],"authentication":"Resource Planner workspace API access key (REST API key) via n8n credential; Base URL is typically https://resourceplanner.io","commonUseCases":["Test API connectivity to a Resource Planner workspace","Automate creation and maintenance of projects, resources, and assignments","Generate daily assignment digests or reporting workflows","Sync planning data from Resource Planner to other tools like Slack, email, or Notion"],"limitations":["Requires a workspace API access key; embed keys, MCP keys, webhook secrets, and outbound integration API keys are not supported","Some fields require a Resource Planner Pro workspace or sufficient permissions","JSON fields such as comments, membership, resourceRates, and timeOff must be valid JSON","Dynamic project/resource lists depend on the API key having access and may be empty if no projects/resources are available","The node is an unverified community node for self-hosted n8n unless accepted as a verified node for n8n Cloud"],"relatedNodes":["Manual Trigger","Schedule Trigger","Slack","Email","Notion"]}


node_type: @evolution_infosystem/n8n-nodes-chatterfox.chatterfox
package_name: @evolution_infosystem/n8n-nodes-chatterfox
display_name: Chatterfox
description: Send WhatsApp messages via Chatterfox
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: dhruvin_03
author_github_url: https://github.com/Evolution-Infosystem/n8n-nodes-chatterfox.git
npm_package_name: @evolution_infosystem/n8n-nodes-chatterfox
npm_version: 0.1.39
community_fetched_at: 2026-07-14T14:40:34.441Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "sendMessage",
      "options": [
        {
          "name": "Send Message",
          "value": "sendMessage",
          "action": "Send a whats app message",
          "description": "Send a WhatsApp message to a phone number"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Message",
      "value": "sendMessage",
      "action": "Send a whats app message",
      "description": "Send a WhatsApp message to a phone number"
    }
  ]

npm_readme:
  # n8n-nodes-chatterfox

  n8n community node for [Chatterfox](https://chatterfox.co) — send WhatsApp messages from your n8n workflows.

  **Published package name:** `@evolution_infosystem/n8n-nodes-chatterfox` (underscore in the scope).

  ## Project structure

  ```
  n8n-nodes-chatterfox/
  ├── .github/
  │   └── workflows/
  │       └── publish.yml           # npm publish with provenance (CI)
  ├── credentials/
  │   ├── ChatterfoxApi.credentials.ts   # API key, Base URL, auth headers, credential test
  │   └── chatterfox-icon.svg            # Credential icon (co-located per n8n template)
  ├── nodes/
  │   └── Chatterfox/
  │       ├── Chatterfox.node.ts   # Send Message operation, load options, HTTP calls
  │       └── chatterfox-icon.svg  # Node icon (co-located per n8n template)
  ├── CHANGELOG.md         # Generated by auto-changelog during `npm run release`
  ├── package.json
  ├── README.md
  └── tsconfig.json
  ```

  ## Features

  - **Send Message** — Send WhatsApp messages using your Chatterfox account
  - **Credentials** — API Key and Base URL; WhatsApp accounts load from the Chatterfox API (name, phone, connected/disconnected status)
  - **Secure requests** — HTTP calls use n8n’s `httpRequestWithAuthentication` and credential-based header auth (`x-api-key` and `Authorization: Bearer …`)
  - **Clear errors** — HTTP failures surface in the n8n UI via `NodeApiError` (status and message from the API where available)
  - **Load-options diagnostics** — If accounts, timezones, or countries fail to load (wrong URL, API key, or network), the node logs a **warning** on the n8n server so you can diagnose empty dropdowns (see [Troubleshooting](#troubleshooting))
  - n8n expressions for dynamic recipient and message content
  - Optional attachments: **binary** from a previous node or **public file URLs**; optional scheduled send, timezone, and disappearing messages

  ## Prerequisites

  - Chatterfox account with at least one WhatsApp account (preferably **connected** for sending)
  - Chatterfox **API key** (create in the Chatterfox dashboard under API Keys)

  ## Installation

  ### Community node (recommended)

  Install the published package:

  ```bash
  npm install @evolution_infosystem/n8n-nodes-chatterfox
  ```

  Then enable it in n8n:

  - **Settings → Community nodes** — install from npm, or  
  - Set **`NODES_INCLUDE`** / your hosting provider’s equivalent so n8n loads the package.

  Restart n8n if required, then search the node palette for **Chatterfox**.

  ### Local development

  ```bash
  git clone <repository-url>
  cd n8n-nodes-chatterfox
  npm install
  npm run dev
  ```

  This runs n8n with the node loaded (via `@n8n/node-cli`). The package name must follow the `n8n-nodes-*` or `@scope/n8n-nodes-*` pattern (this repo uses `@evolution_infosystem/n8n-nodes-chatterfox`).

  Alternatively:

  ```bash
  npm run build:watch
  ```

  and point your n8n instance at the built output per n8n’s [custom nodes](https://docs.n8n.io/integrations/creating-nodes/) documentation.

  ## Configuration 

  ### Credentials (Chatterfox API)

  1. In n8n, create **Credentials → Chatterfox API**.
  2. **API Key** — from the Chatterfox dashboard.
  3. **Base URL** — defaults to `https://api.chatterfox.co/`. Change only if your backend uses another host (must match your Chatterfox environment).

  All API requests use this Base URL. Configure the correct URL in the credential (the node does not read a separate env var for the base URL).

  4. Use **Test** to verify the key. The test calls `POST {baseUrl}/api/v1/whatsapp/accounts` with your credentials.

  ### Node: Send Message

  1. **Credential** — Select your Chatterfox API credential.
  2. **WhatsApp Account** — Pick an account from the list (loaded from Chatterfox). Entries show name, phone, and active/inactive style status where available.
  3. **Country Code** + **Phone Number** — Recipient (dial code + local number). Supports expressions.
  4. **Message** — Required text (caption when files are attached). Supports expressions (e.g. `{{ $json.output }}`).
  5. **File Attachment Mode**
     - **No Files** — Text only (JSON request).
     - **Binary** — Files from the previous item’s binary fields; you can list property names or leave empty to attach all binaries present.
     - **File URLs** — One or more public `https://` URLs.
  6. **Scheduled Time** (optional) — ISO-style datetime; leave empty to send immediately.
  7. **Timezone** / **Disappearing Message** (optional) — As supported by your Chatterfox API.

  ### Binary attachments

  - If a listed binary property is missing or invalid, the node **logs a warning** and skips that file; check the execution log if attachments are missing.
  - If there are no binary properties to attach, the node errors or skips the item according to your workflow settings.

  ### Errors and “Continue on fail”

  - Validation issues (e.g. missing phone or message) show as clear operation errors.
  - HTTP/network/API errors from the Chatterfox API are shown using n8n’s API error formatting.
  - Enable **Continue on fail** on the node to return `{ success: false, error: "..." }` for failed items instead of stopping the workflow.

  ## Troubleshooting

  ### Empty dropdowns (WhatsApp accounts, timezone, country)

  The lists are loaded from your Chatterfox API using the credential **Base URL** and **API key**. If a dropdown is empty but send still might work with manual IDs, check:

  1. **Credential test** — Confirm **Test** succeeds on the Chatterfox credential.
  2. **Base URL** — Must match the environment that issued the API key (no trailing slash issues; the node normalizes the URL).
  3. **n8n server logs** — Failed load-options requests log warnings such as `Chatterfox: failed to load … for dropdown` with error details. Inspect your n8n instance logs (not only the execution panel).

  ## API reference (summary)

  | Use case | Method | Path (under Base URL) |
  |----------|--------|------------------------|
  | Credential test & account list | `POST` | `/api/v1/whatsapp/accounts` |
  | Timezones (dropdown) | `GET` | `/timezones` |
  | Countries (dropdown) | `GET` | `/countries` |
  | Send message | `POST` | `/api/v1/send-message` |

  Send message requests include your API key and account ID in the body (and multipart fields for binary uploads) as required by Chatterfox; authentication headers are applied through n8n credentials.

  Official API docs: [Chatterfox API documentation](https://api.chatterfox.co/platform/api/docs#).

  ## Icons

  Node and credential icons are **not** stored in a shared `assets/` folder. Each icon sits next to the file that references it (`file:chatterfox-icon.svg`), which matches the [n8n community node template](https://docs.n8n.io/integrations/creating-nodes/build/n8n-node/). `npm run build` (`n8n-node build`) copies those SVGs into `dist/nodes/Chatterfox/` and `dist/credentials/` for npm publish.

  ## Development

  ```bash
  npm install
  npm run build        # n8n-node build — compiles TS and copies co-located icons to dist/
  npm run build:watch  # TypeScript watch (re-run build after icon changes)
  npm run dev          # n8n with this node (dev)
  npm run lint         # Lint
  npm run lint:fix     # Lint with auto-fix
  ```

  Release tooling (optional, local): `npm run release` uses `n8n-node release` (release-it). Publishing with **npm provenance** for verification is expected from **GitHub Actions** — see below.

  ## Publishing (maintainers)

  Verified community nodes should be published from **GitHub Actions** with **npm provenance**. See [Trusted publishing](https://docs.npmjs.org/trusted-publishers) and the [n8n Creator Portal](https://creators.n8n.io/) requirements.

  ### One-time: authentication

  **Recommended — npm Trusted Publishing (OIDC)**

  1. On [npmjs.com](https://www.npmjs.com), open **Package → Access / Publishing → Trusted Publisher**.
  2. Choose **GitHub Actions** and match **exactly** (case-sensitive): GitHub org/user, repository name, workflow filename **`publish.yml`**.
  3. No **`NPM_TOKEN`** repository secret is required; the workflow uses short-lived OIDC on GitHub-hosted runners.

  **Alternative — automation token**

  1. Create an npm **granular** or **automation** token with publish rights for `@evolution_infosystem`.
  2. Add it as GitHub repository secret **`NPM_TOKEN`**.
  3. In `.github/workflows/publish.yml`, uncomment **`NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}`** on the publish step.

  ### Local walkthrough (interactive `npm run release`)

  Before cutting a release, a typical local session looks like this:

  ```bash
  npm run dev          # sanity-check the node in a local n8n instance
  npx n8n-node lint    # lint (same check CI runs)
  npm login            # authenticate npm (release-it checks npm auth once --publish is used)
  npm run build        # compile TypeScript and copy icons to dist/
  npm run release      # interactive n8n-node release (release-it)
  ```

  `npm run release` (`n8n-node release`) wraps `release-it`. Run **plainly** (no `--publish` flag) it never touches npm — it only bumps the version, updates `CHANGELOG.md`, commits, tags, and pushes. Passing `--publish` (i.e. `npm run release -- --publish`) additionally runs npm's auth/collaborator checks — hence `npm login` above — and adds an interactive "publish to npm" step.

  `release-it` walks through one prompt per step and expects `y`/`n` (default is **Yes** for all of them). A common answer sequence — bump, commit, tag and push everything, but let the **GitHub Actions** workflow do the actual npm publish with provenance instead of your own machine — is:

  | # | Prompt | Typical answer | Why |
  |---|--------|-----------------|-----|
  | 1 | `Select increment (next version):` | *(pick patch/minor/major)* | Not yes/no — arrow keys + Enter |
  | 2 | `Publish <package>@latest to npm?` | **No** | Skip publishing from your machine (no provenance) — CI publishes instead |
  | 3 | `Commit (Release x.y.z)?` | **Yes** | Commit the version bump + changelog |
  | 4 | `Tag (vx.y.z)?` | **Yes** | Create the `vx.y.z` git tag |
  | 5 | `Push?` | **Yes** | Push the commit and tag to `origin` |
  | 6 | `Create a release on GitHub (Release x.y.z)?` | **No** | Trigger the publish workflow manually instead (see next section) |

  After this, finish the release from CI as described below: trigger **Actions → Publish to npm → Run workflow**, or create the GitHub Release yourself.

  ### Release a new version (step by step)

  1. **Bump the version** (updates `package.json` and `package-lock.json`):

     ```bash
     npm version patch --no-git-tag-version
     ```

     Use `minor` or `major` instead of `patch` if appropriate. Commit the version bump with your other changes.

  2. **Push** to the default branch (e.g. `main`).

  3. **Publish from CI** — either:
     - **Actions → Publish to npm → Run workflow**, or  
     - Create a **GitHub Release** and publish it (the workflow also triggers on `release: published`).

     The workflow runs `npm ci`, `npm run build`, upgrades npm for OIDC/provenance, then **`npm publish --provenance --access public`** with **`RELEASE_MODE`** set so `prepublishOnly` (`n8n-node prerelease`) succeeds in CI.

  4. **Verify** on npm that the new version appears and **provenance** is listed for that version. Confirm the tarball includes `dist/nodes/Chatterfox/chatterfox-icon.svg` and `dist/credentials/chatterfox-icon.svg` (no root `assets/` folder).

  5. **Creator Portal** — Submit or resubmit that **same published version** for community verification if needed.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Sends WhatsApp messages from n8n workflows using a Chatterfox account. It supports text messages, optional file attachments, and scheduled delivery through the Chatterfox API.","capabilities":["Send WhatsApp messages","Load and select WhatsApp accounts from Chatterfox","Use dynamic expressions for recipient and message content","Attach files from previous node binaries","Attach public file URLs","Schedule messages for later sending","Configure timezone and disappearing message options","Perform credential test and load-options requests against the Chatterfox API","Return detailed API/validation errors in n8n"],"authentication":"API key required, configured in n8n credentials along with a Base URL; requests use header auth with x-api-key and Authorization: Bearer headers.","commonUseCases":["Send automated WhatsApp notifications from workflows","Deliver messages with optional attachments from upstream n8n nodes","Schedule WhatsApp messages for a specific time zone","Notify users or customers via Chatterfox based on workflow events"],"limitations":["Requires a Chatterfox account with at least one WhatsApp account","Base URL must match the Chatterfox environment issuing the API key","File URLs must be public HTTPS URLs","If binary attachment properties are missing or invalid, files are skipped with a warning","Some dropdown data depends on successful API access and may appear empty if the API key or Base URL is incorrect"],"relatedNodes":[]}


node_type: n8n-nodes-growbro.growbro
package_name: n8n-nodes-growbro
display_name: Growbro
description: Send WhatsApp messages through your Growbro account
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: growbro20
author_github_url: https://github.com/GeniusMundi10/n8n_growbro_node.git
npm_package_name: n8n-nodes-growbro
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.444Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Message",
          "value": "message"
        },
        {
          "name": "Template",
          "value": "template"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendText",
      "options": [
        {
          "name": "Send Text",
          "value": "sendText",
          "action": "Send a text message",
          "routing": {
            "request": {
              "url": "/api/public/v1/whatsapp/messages/text",
              "method": "POST"
            }
          }
        },
        {
          "name": "Send Template",
          "value": "sendTemplate",
          "action": "Send a template message",
          "routing": {
            "request": {
              "url": "/api/public/v1/whatsapp/messages/template",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List approved templates",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "templates"
                  }
                }
              ]
            },
            "request": {
              "url": "/api/public/v1/whatsapp/templates",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Text",
      "value": "sendText",
      "action": "Send a text message",
      "routing": {
        "request": {
          "url": "/api/public/v1/whatsapp/messages/text",
          "method": "POST"
        }
      },
      "resource": "message"
    },
    {
      "name": "Send Template",
      "value": "sendTemplate",
      "action": "Send a template message",
      "routing": {
        "request": {
          "url": "/api/public/v1/whatsapp/messages/template",
          "method": "POST"
        }
      },
      "resource": "message"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List approved templates",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "templates"
              }
            }
          ]
        },
        "request": {
          "url": "/api/public/v1/whatsapp/templates",
          "method": "GET"
        }
      },
      "resource": "template"
    }
  ]

npm_readme:
  # n8n-nodes-growbro

  n8n community node for [Growbro.ai](https://growbro.ai). Send WhatsApp messages and
  trigger workflows on incoming messages — all through your own Growbro account.

  This package adds two nodes:

  - **Growbro** (action) — send WhatsApp **text** and **template** messages, and list approved templates.
  - **Growbro Trigger** — starts a workflow whenever your WhatsApp number receives a message. It
    auto-registers its webhook with Growbro on activation and removes it on deactivation.

  ## Installation

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

  ```
  n8n-nodes-growbro
  ```

  (On n8n Cloud this requires the package to be verified by n8n.)

  ## Credentials

  Create a **Growbro API** credential:

  1. In the Growbro CRM, open **AI Code → API** and create an API key (starts with `gb_live_`).
     - For the **Trigger** node, the key must include the `webhook:manage` scope.
     - The AI must be on the **Pro** plan to register webhooks.
  2. In n8n, paste the key into the Growbro API credential. Leave **Base URL** as the default
     (`https://growbro-backend.fly.dev`) unless you self-host.

  The key is **scoped to one AI**, so you don't need to pass an `ai_id` — Growbro resolves it from the key.

  ## Action node — Growbro

  | Resource | Operation | Description |
  | --- | --- | --- |
  | Message | Send Text | Send a plain-text WhatsApp message |
  | Message | Send Template | Send an approved template (with optional `components`) |
  | Template | List | List approved templates |

  ## Trigger node — Growbro Trigger

  1. Add the **Growbro Trigger** node and select the events (e.g. *Message Received*).
  2. Activate the workflow — n8n registers its webhook URL with Growbro automatically.
  3. Each incoming WhatsApp message arrives as:

  ```json
  {
    "event": "message.received",
    "ai_id": "…",
    "from": "+919876543210",
    "contact": { "name": "Rahul" },
    "message": { "type": "text", "text": "I want to book a slot" },
    "message_id": "wamid….",
    "timestamp": "2026-06-02T12:00:00Z"
  }
  ```

  Each delivery is signed with an `X-Growbro-Signature` header
  (`sha256=HMAC(secret, body)`) you can verify against the subscription's signing secret.

  ## Build (for development / publishing)

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

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"Send WhatsApp messages through a Growbro account and trigger n8n workflows when incoming WhatsApp messages are received. It supports both outbound messaging and inbound webhook-based automation.","capabilities":["Send plain-text WhatsApp messages","Send approved WhatsApp template messages with optional components","List approved WhatsApp templates","Trigger workflows on incoming WhatsApp messages","Automatically register and remove the webhook on workflow activation/deactivation","Verify incoming webhook signatures via X-Growbro-Signature"],"authentication":"Growbro API key credential required. Create an API key in Growbro CRM (starts with gb_live_); the Trigger node requires webhook:manage scope and the AI must be on the Pro plan to register webhooks. Base URL defaults to https://growbro-backend.fly.dev unless self-hosted.","commonUseCases":["Send WhatsApp notifications or alerts from n8n workflows","Use approved WhatsApp templates for outbound messaging","Build automations that start when a customer sends a WhatsApp message","Route and process inbound WhatsApp support or sales inquiries"],"limitations":["Template messages must be approved templates","Trigger webhook registration requires the webhook:manage scope","Webhook registration requires the AI to be on the Pro plan","The package must be verified by n8n to install on n8n Cloud"],"relatedNodes":["Growbro Trigger"]}


node_type: n8n-nodes-growbro.growbroTrigger
package_name: n8n-nodes-growbro
display_name: Growbro Trigger
description: Starts the workflow when your Growbro WhatsApp number receives a message
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: growbro20
author_github_url: https://github.com/GeniusMundi10/n8n_growbro_node.git
npm_package_name: n8n-nodes-growbro
npm_version: 0.1.3
community_fetched_at: 2026-07-14T14:40:34.446Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-growbro

  n8n community node for [Growbro.ai](https://growbro.ai). Send WhatsApp messages and
  trigger workflows on incoming messages — all through your own Growbro account.

  This package adds two nodes:

  - **Growbro** (action) — send WhatsApp **text** and **template** messages, and list approved templates.
  - **Growbro Trigger** — starts a workflow whenever your WhatsApp number receives a message. It
    auto-registers its webhook with Growbro on activation and removes it on deactivation.

  ## Installation

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

  ```
  n8n-nodes-growbro
  ```

  (On n8n Cloud this requires the package to be verified by n8n.)

  ## Credentials

  Create a **Growbro API** credential:

  1. In the Growbro CRM, open **AI Code → API** and create an API key (starts with `gb_live_`).
     - For the **Trigger** node, the key must include the `webhook:manage` scope.
     - The AI must be on the **Pro** plan to register webhooks.
  2. In n8n, paste the key into the Growbro API credential. Leave **Base URL** as the default
     (`https://growbro-backend.fly.dev`) unless you self-host.

  The key is **scoped to one AI**, so you don't need to pass an `ai_id` — Growbro resolves it from the key.

  ## Action node — Growbro

  | Resource | Operation | Description |
  | --- | --- | --- |
  | Message | Send Text | Send a plain-text WhatsApp message |
  | Message | Send Template | Send an approved template (with optional `components`) |
  | Template | List | List approved templates |

  ## Trigger node — Growbro Trigger

  1. Add the **Growbro Trigger** node and select the events (e.g. *Message Received*).
  2. Activate the workflow — n8n registers its webhook URL with Growbro automatically.
  3. Each incoming WhatsApp message arrives as:

  ```json
  {
    "event": "message.received",
    "ai_id": "…",
    "from": "+919876543210",
    "contact": { "name": "Rahul" },
    "message": { "type": "text", "text": "I want to book a slot" },
    "message_id": "wamid….",
    "timestamp": "2026-06-02T12:00:00Z"
  }
  ```

  Each delivery is signed with an `X-Growbro-Signature` header
  (`sha256=HMAC(secret, body)`) you can verify against the subscription's signing secret.

  ## Build (for development / publishing)

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

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"The Growbro Trigger node starts an n8n workflow whenever a Growbro WhatsApp number receives an incoming message. It automatically registers and removes its webhook with Growbro when the workflow is activated or deactivated.","capabilities":["Triggers workflows on incoming WhatsApp messages","Supports selecting trigger events such as Message Received","Automatically registers the webhook URL with Growbro on activation","Automatically removes the webhook on deactivation","Delivers incoming message payloads including sender, contact, message content, message ID, and timestamp","Provides signed webhook deliveries via the X-Growbro-Signature header for verification"],"authentication":"Requires a Growbro API credential with an API key (starts with gb_live_). For the Trigger node, the key must include the webhook:manage scope, and the AI account must be on the Pro plan to register webhooks.","commonUseCases":["Start a workflow when a customer sends a WhatsApp message","Route incoming WhatsApp inquiries to support or automation flows","Capture and process WhatsApp leads or booking requests","Verify and handle signed inbound webhook events from Growbro"],"limitations":["Webhook registration for the Trigger node requires a Pro plan AI account","The API key is scoped to one AI, so it cannot be used across multiple AI accounts","n8n Cloud usage requires the package to be verified by n8n"],"relatedNodes":["Growbro"]}


node_type: n8n-nodes-ramsisa.ramsisa
package_name: n8n-nodes-ramsisa
display_name: Ramsisa
description: Generate and manage Ramsisa field visit schedules.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: framawy
author_github_url: https://github.com/Ramsisa/
npm_package_name: n8n-nodes-ramsisa
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.453Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "generateAndWait",
      "options": [
        {
          "name": "Download Schedule CSV",
          "value": "download",
          "action": "Download schedule CSV",
          "description": "Download the generated schedule as a CSV binary attachment"
        },
        {
          "name": "Generate Schedule",
          "value": "generate",
          "action": "Generate a schedule",
          "description": "Submit a new schedule generation request (returns immediately with a schedule_id)"
        },
        {
          "name": "Generate Schedule (Wait for Completion)",
          "value": "generateAndWait",
          "action": "Generate a schedule and wait for completion",
          "description": "Submit a schedule, then poll until it completes or fails. Returns the final status (and optionally the CSV) in a single synchronous step. Use when you don't want to wire up a webhook trigger."
        },
        {
          "name": "Get Schedule Status",
          "value": "getStatus",
          "action": "Get schedule status",
          "description": "Check the status of a previously submitted schedule"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Download Schedule CSV",
      "value": "download",
      "action": "Download schedule CSV",
      "description": "Download the generated schedule as a CSV binary attachment"
    },
    {
      "name": "Generate Schedule",
      "value": "generate",
      "action": "Generate a schedule",
      "description": "Submit a new schedule generation request (returns immediately with a schedule_id)"
    },
    {
      "name": "Generate Schedule (Wait for Completion)",
      "value": "generateAndWait",
      "action": "Generate a schedule and wait for completion",
      "description": "Submit a schedule, then poll until it completes or fails. Returns the final status (and optionally the CSV) in a single synchronous step. Use when you don't want to wire up a webhook trigger."
    },
    {
      "name": "Get Schedule Status",
      "value": "getStatus",
      "action": "Get schedule status",
      "description": "Check the status of a previously submitted schedule"
    }
  ]

npm_readme:
  # n8n-nodes-ramsisa

  An [n8n](https://n8n.io/) community node for the [Ramsisa](https://ramsisa.com/) field visit scheduling API.

  Generate tiered, territory-aware field-visit schedules directly from your n8n workflows. Works for any team that visits the same set of locations on a recurring cadence — sales reps to retail accounts, field-service techs to customer sites, auditors to branches, medical reps to clinics, inspectors to properties. Pulls the location list from any source n8n already supports (Google Sheets, Airtable, HubSpot, Salesforce, Postgres, …), submits the generation request to Ramsisa, and returns the schedule — either synchronously (the `Wait for Completion` operation polls and downloads the CSV in one step) or asynchronously by handing the completion event off to n8n's built-in `Webhook` node.

  ## Installation

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

  ```
  n8n-nodes-ramsisa
  ```

  Requires n8n `>= 1.123` (or 2.x) on Node `>= 22.16`.

  ## Credentials

  Create a **Ramsisa API** credential with:

  | Field       | Default                        | Description                                                                                          |
  | ----------- | ------------------------------ | ---------------------------------------------------------------------------------------------------- |
  | Base URL    | `https://schedule.ramsisa.com` | Root URL of your Ramsisa instance (no `/api` suffix).                                                |
  | API Version | `v1`                           | API version this connection targets. Pinned so future major versions don't break existing workflows. |
  | API Key     | _(required)_                   | Bearer token from your Ramsisa organization admin.                                                   |

  The credential test hits `GET {baseUrl}/api/{apiVersion}/health/` to validate connectivity.

  ## Node

  ### Ramsisa (action node)

  | Operation                               | What it does                                                                                                                                                              |
  | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | Generate Schedule                       | `POST /schedules/generate/` — submits locations + month, returns `schedule_id` and `status`. Async; provide a `webhook_url` if you want to react to completion in n8n.    |
  | Generate Schedule (Wait for Completion) | `POST /schedules/generate/` then polls `GET /schedules/{id}/` until terminal. Optionally downloads the CSV. Synchronous — no webhook wiring needed.                       |
  | Get Schedule Status                     | `GET /schedules/{id}/` — poll status.                                                                                                                                     |
  | Download Schedule CSV                   | `GET /schedules/{id}/download/` — fetch the completed CSV as a binary attachment.                                                                                         |

  ## Recommended workflow shape

  For most flows, the synchronous **Generate Schedule (Wait for Completion)** operation is the simplest path — one node, one CSV out:

  ```
  [Google Sheets: locations] → [Ramsisa: Generate Schedule (Wait for Completion)] → [Send Email] / [Slack] / [HubSpot]
  ```

  For long-running schedules where you don't want to hold an n8n execution open, hand the completion event off to n8n's built-in **Webhook** node:

  ```
  [Google Sheets: locations] → [Ramsisa: Generate Schedule (webhook_url = n8n Webhook URL)]

                                      ↓ (Ramsisa POSTs here when done)

  [Webhook (n8n built-in, POST)] → [Ramsisa: Get Schedule Status] → [Ramsisa: Download Schedule CSV] → [Send Email] / [Slack] / [HubSpot]
  ```

  The async path relies on the Ramsisa server emitting an absolute `download_url` (configured server-side via `SCHEDULE_PUBLIC_BASE_URL`). The completion payload includes `schedule_id`, `status`, and `download_url` — feed any of these into the rest of your workflow directly.

  ## Compatibility matrix

  | `n8n-nodes-ramsisa` version | Ramsisa API version | n8n version       | Node version |
  | --------------------------- | ------------------- | ----------------- | ------------ |
  | `0.1.x`                     | `v1`                | `>= 1.123` or 2.x | `>= 22.16`   |

  ## Local development

  ```bash
  cd n8n-nodes-ramsisa
  npm install
  npm run build
  ```

  Link into a local n8n install for testing:

  ```bash
  npm link
  cd ~/.n8n/custom    # or wherever your n8n custom-nodes folder is
  npm link n8n-nodes-ramsisa
  ```

  Then restart n8n.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"This node connects n8n to the Ramsisa field visit scheduling API to generate territory-aware visit schedules. It can run synchronously or asynchronously and return the resulting schedule status or CSV output.","capabilities":["Generate schedule from submitted locations and month","Generate schedule and wait for completion in one step","Poll schedule status by schedule ID","Download completed schedule as CSV binary","Support async completion via webhook URL"],"authentication":"Ramsisa API credential using a required API key (Bearer token), with configurable Base URL and API version","commonUseCases":["Create recurring field visit schedules for sales, service, audit, medical, or inspection teams","Pull location data from sources like Google Sheets, Airtable, HubSpot, Salesforce, or Postgres and generate schedules","Use webhook-based async workflows for long-running schedule generation","Download and distribute completed schedule CSVs to email, Slack, or CRM tools"],"limitations":["Requires n8n version >= 1.123 or 2.x and Node >= 22.16","Async workflows depend on Ramsisa server-side configuration for an absolute download URL via SCHEDULE_PUBLIC_BASE_URL","Credential test only validates connectivity against the Ramsisa health endpoint"],"relatedNodes":["Webhook","Google Sheets","Airtable","HubSpot","Salesforce"]}


node_type: @approx-tech/n8n-nodes-approx.approx
package_name: @approx-tech/n8n-nodes-approx
display_name: Approx
description: Automate Approx construction cost-estimation and quantity-takeoff workflows.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: hibrahimyucedal
author_github_url: https://github.com/Approx-Tech/n8n-nodes-approx.git
npm_package_name: @approx-tech/n8n-nodes-approx
npm_version: 0.5.1
community_fetched_at: 2026-07-14T14:40:34.454Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "project",
      "options": [
        {
          "name": "Authority",
          "value": "authority",
          "description": "Pricing authorities"
        },
        {
          "name": "File",
          "value": "file",
          "description": "Download a file by blob ID"
        },
        {
          "name": "Original File",
          "value": "originalFile",
          "description": "AutoCAD / source files attached to a work-group type"
        },
        {
          "name": "Pricing",
          "value": "pricing",
          "description": "Unit prices inside a pricing library"
        },
        {
          "name": "Pricing Library",
          "value": "pricingLibrary",
          "description": "Pricing libraries available to the tenant"
        },
        {
          "name": "Project",
          "value": "project",
          "description": "Approx project (top-level resource)"
        },
        {
          "name": "Property",
          "value": "property",
          "description": "Properties inside a project"
        },
        {
          "name": "Property Type",
          "value": "propertyType",
          "description": "Property-type tree exposed by a takeoff template or project"
        },
        {
          "name": "Report",
          "value": "report",
          "description": "Project reports (generate, poll, download)"
        },
        {
          "name": "Report Template",
          "value": "reportTemplate",
          "description": "Report templates belonging to a takeoff template"
        },
        {
          "name": "Static File",
          "value": "staticFile",
          "description": "Static (image/PDF) files attached to a property"
        },
        {
          "name": "Takeoff Template",
          "value": "takeoffTemplate",
          "description": "Takeoff templates"
        },
        {
          "name": "Work Group Type",
          "value": "workGroupType",
          "description": "Work-group types derived from a project’s takeoff template"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an authority",
          "description": "Create a new authority"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an authority",
          "description": "Delete an authority by ID"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an authority",
          "description": "Retrieve an authority by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many authorities",
          "description": "List all authorities for the tenant"
        },
        {
          "name": "Update Logo",
          "value": "updateLogo",
          "action": "Update an authority logo",
          "description": "Update an authority logo (Base64)"
        },
        {
          "name": "Update Name",
          "value": "updateName",
          "action": "Update an authority name",
          "description": "Update an authority name"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "authority"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "download",
      "options": [
        {
          "name": "Download",
          "value": "download",
          "action": "Download a file",
          "description": "Download a file by blob ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an original file",
          "description": "Delete an original file"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many original files",
          "description": "List original files for a work-group type"
        },
        {
          "name": "Upload Many",
          "value": "uploadMany",
          "action": "Upload many original files",
          "description": "Bulk-upload up to 100 files per request"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "originalFile"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a static file",
          "description": "Delete a static file"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many static files",
          "description": "List static files attached to a property"
        },
        {
          "name": "Upload Many",
          "value": "uploadMany",
          "action": "Upload many static files",
          "description": "Bulk-upload up to 100 files per request"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "staticFile"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many pricing libraries",
          "description": "List pricing libraries available to the tenant"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pricingLibrary"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many pricings",
          "description": "List unit prices inside a library"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pricing"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a project",
          "description": "Create a new project"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a project",
          "description": "Delete a project"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a project",
          "description": "Retrieve a project by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many projects",
          "description": "List projects (paginated)"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a project",
          "description": "Update a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a property",
          "description": "Create a single property"
        },
        {
          "name": "Create Many",
          "value": "createMany",
          "action": "Create many properties",
          "description": "Bulk-create properties"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a property",
          "description": "Delete a property"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a property",
          "description": "Get a property by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many properties",
          "description": "List properties of a project (paginated)"
        },
        {
          "name": "Update Multiplier",
          "value": "updateMultiplier",
          "action": "Update a property multiplier",
          "description": "Set the multiplier on a multiplexable property"
        },
        {
          "name": "Update Name",
          "value": "updateName",
          "action": "Update a property name",
          "description": "Rename a property"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "property"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getByTakeoffTemplate",
      "options": [
        {
          "name": "Get by Project",
          "value": "getByProject",
          "action": "Get property types by project",
          "description": "Get the root property type (with descendants) for a project"
        },
        {
          "name": "Get by Takeoff Template",
          "value": "getByTakeoffTemplate",
          "action": "Get property types by takeoff template",
          "description": "Get the root property type (with descendants) defined on a takeoff template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "propertyType"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a report",
          "description": "Queue a new report for a project"
        },
        {
          "name": "Download",
          "value": "download",
          "action": "Download a report",
          "description": "Download a completed report (returns ZIP). Fails with 409 if not completed."
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a report",
          "description": "Get report metadata (status, timestamps)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "report"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many report templates",
          "description": "List report templates belonging to a takeoff template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reportTemplate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a takeoff template",
          "description": "Retrieve a takeoff template by ID"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many takeoff templates",
          "description": "List takeoff templates for the tenant in a given culture"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "takeoffTemplate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many work group types",
          "description": "List work-group types for a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "workGroupType"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an authority",
      "description": "Create a new authority",
      "resource": "authority"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an authority",
      "description": "Delete an authority by ID",
      "resource": "authority"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an authority",
      "description": "Retrieve an authority by ID",
      "resource": "authority"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many authorities",
      "description": "List all authorities for the tenant",
      "resource": "authority"
    },
    {
      "name": "Update Logo",
      "value": "updateLogo",
      "action": "Update an authority logo",
      "description": "Update an authority logo (Base64)",
      "resource": "authority"
    },
    {
      "name": "Update Name",
      "value": "updateName",
      "action": "Update an authority name",
      "description": "Update an authority name",
      "resource": "authority"
    },
    {
      "name": "Download",
      "value": "download",
      "action": "Download a file",
      "description": "Download a file by blob ID",
      "resource": "file"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an original file",
      "description": "Delete an original file",
      "resource": "originalFile"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many original files",
      "description": "List original files for a work-group type",
      "resource": "originalFile"
    },
    {
      "name": "Upload Many",
      "value": "uploadMany",
      "action": "Upload many original files",
      "description": "Bulk-upload up to 100 files per request",
      "resource": "originalFile"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a static file",
      "description": "Delete a static file",
      "resource": "staticFile"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many static files",
      "description": "List static files attached to a property",
      "resource": "staticFile"
    },
    {
      "name": "Upload Many",
      "value": "uploadMany",
      "action": "Upload many static files",
      "description": "Bulk-upload up to 100 files per request",
      "resource": "staticFile"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many pricing libraries",
      "description": "List pricing libraries available to the tenant",
      "resource": "pricingLibrary"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many pricings",
      "description": "List unit prices inside a library",
      "resource": "pricing"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a project",
      "description": "Create a new project",
      "resource": "project"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a project",
      "description": "Delete a project",
      "resource": "project"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a project",
      "description": "Retrieve a project by ID",
      "resource": "project"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many projects",
      "description": "List projects (paginated)",
      "resource": "project"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a project",
      "description": "Update a project",
      "resource": "project"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a property",
      "description": "Create a single property",
      "resource": "property"
    },
    {
      "name": "Create Many",
      "value": "createMany",
      "action": "Create many properties",
      "description": "Bulk-create properties",
      "resource": "property"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a property",
      "description": "Delete a property",
      "resource": "property"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a property",
      "description": "Get a property by ID",
      "resource": "property"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many properties",
      "description": "List properties of a project (paginated)",
      "resource": "property"
    },
    {
      "name": "Update Multiplier",
      "value": "updateMultiplier",
      "action": "Update a property multiplier",
      "description": "Set the multiplier on a multiplexable property",
      "resource": "property"
    },
    {
      "name": "Update Name",
      "value": "updateName",
      "action": "Update a property name",
      "description": "Rename a property",
      "resource": "property"
    },
    {
      "name": "Get by Project",
      "value": "getByProject",
      "action": "Get property types by project",
      "description": "Get the root property type (with descendants) for a project",
      "resource": "propertyType"
    },
    {
      "name": "Get by Takeoff Template",
      "value": "getByTakeoffTemplate",
      "action": "Get property types by takeoff template",
      "description": "Get the root property type (with descendants) defined on a takeoff template",
      "resource": "propertyType"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a report",
      "description": "Queue a new report for a project",
      "resource": "report"
    },
    {
      "name": "Download",
      "value": "download",
      "action": "Download a report",
      "description": "Download a completed report (returns ZIP). Fails with 409 if not completed.",
      "resource": "report"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a report",
      "description": "Get report metadata (status, timestamps)",
      "resource": "report"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many report templates",
      "description": "List report templates belonging to a takeoff template",
      "resource": "reportTemplate"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a takeoff template",
      "description": "Retrieve a takeoff template by ID",
      "resource": "takeoffTemplate"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many takeoff templates",
      "description": "List takeoff templates for the tenant in a given culture",
      "resource": "takeoffTemplate"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many work group types",
      "description": "List work-group types for a project",
      "resource": "workGroupType"
    }
  ]

npm_readme:
  # @approx-tech/n8n-nodes-approx

  [![npm version](https://img.shields.io/npm/v/@approx-tech/n8n-nodes-approx.svg)](https://www.npmjs.com/package/@approx-tech/n8n-nodes-approx)

  n8n community node for [Approx](https://approx.one) — automate construction
  cost-estimation and quantity-takeoff workflows.

  > **Heads-up — breaking change in 0.5.0:** the five previous nodes
  > (`Approx Project`, `Approx Report`, `Approx Unit Price`, `Approx Authority`,
  > `Approx Template`) have been consolidated into a **single `Approx` node**.
  > Every former node is now a **Resource** inside that node. The credential has
  > also been renamed (`approxApi` → `approxOAuth2Api`) and now uses n8n's
  > built-in OAuth2 client-credentials flow. See [Migrating from 0.4.x](#migrating-from-04x).

  ---

  ## Contents

  - [Install](#install)
  - [Credentials](#credentials)
  - [Resources and operations](#resources-and-operations)
  - [Usage example: list projects, generate a report, download the ZIP](#usage-example-list-projects-generate-a-report-download-the-zip)
  - [Sample success outputs](#sample-success-outputs)
  - [Migrating from 0.4.x](#migrating-from-04x)
  - [License](#license)
  - [Support](#support)

  ---

  ## Install

  ### Self-hosted n8n

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

  ```
  @approx-tech/n8n-nodes-approx
  ```

  …and click **Install**. Restart n8n if it doesn't reload automatically.

  Or from the host shell:

  ```bash
  npm install @approx-tech/n8n-nodes-approx
  ```

  ### n8n Cloud

  The package will appear in the verified community catalogue once approved.

  ---

  ## Credentials

  Approx authenticates with Auth0 **Machine-to-Machine** (client-credentials)
  tokens. Ask your Approx contact for a `client_id`/`client_secret` issued by the
  Approx Auth0 tenant.

  In n8n: **Credentials → New → Approx OAuth2 API**.

  | Field | Required | Default | Description |
  | --- | :---: | --- | --- |
  | Client ID | ✅ | — | Auth0 M2M application client id (inherited from OAuth2 API). |
  | Client Secret | ✅ | — | Auth0 M2M application client secret (inherited from OAuth2 API). |
  | Auth0 Domain | ✅ | `auth.approx.cloud` | Approx Auth0 tenant domain (no protocol). |
  | Audience | ✅ | `https://approx.azurewebsites.net` | API audience configured in Auth0. Sent as `audience` in the token request body. |
  | Base URL | ✅ | `https://approx.azurewebsites.net` | Approx API base URL (no trailing slash). |

  n8n handles fetching, caching and refreshing the bearer token — there is no
  custom token code in this package. Click **Save**: n8n will issue a test
  request to `GET /api/integrations/projects?dqb.take=1` and confirm the
  credential works.

  ---

  ## Resources and operations

  Every former node is now a **Resource** on the single `Approx` node. Choose the
  resource, then the operation, then fill in the parameters.

  | Resource | Operations | Approx API endpoint(s) |
  | --- | --- | --- |
  | **Authority** | Get Many, Get, Create, Update Name, Update Logo, Delete | `/api/integrations/authorities[/{id}[/name\|logo]]` |
  | **File** | Download | `GET /api/integrations/files/{blobId}/download` |
  | **Original File** | Get Many, Upload Many, Delete | `/api/integrations/projects/{projectId}/original-files[:bulk\|/{id}]` |
  | **Pricing** | Get Many | `GET /api/integrations/pricing/libraries/{libraryId}/pricings` |
  | **Pricing Library** | Get Many | `GET /api/integrations/pricing/libraries` |
  | **Project** | Get Many, Get, Create, Update, Delete | `/api/integrations/projects[/{id}]` |
  | **Property** | Get Many, Get, Create, Create Many, Update Name, Update Multiplier, Delete | `/api/integrations/projects/{projectId}/properties[…]` |
  | **Property Type** | Get by Takeoff Template, Get by Project | `/api/integrations/templates/{takeoff/{id}\|projects/{id}}/property-types` |
  | **Report** | Create, Get, Download | `/api/integrations/reports[/{id}[/download]]` |
  | **Report Template** | Get Many | `GET /api/integrations/templates/takeoff/{id}/report-templates` |
  | **Static File** | Get Many, Upload Many, Delete | `/api/integrations/projects/{projectId}/static-files[:bulk\|/{id}]` |
  | **Takeoff Template** | Get Many, Get | `/api/integrations/templates/takeoff[/{id}]` |
  | **Work Group Type** | Get Many | `GET /api/integrations/projects/{projectId}/work-group-types` |

  List endpoints accept the optional **Query Options** collection
  (`Skip`, `Take`, `Order By`, `Where`) which is mapped to the standard Approx
  DQB query string (`dqb.skip`, `dqb.take`, `dqb.orderBy`, `dqb.where`).

  ---

  ## Usage example: list projects, generate a report, download the ZIP

  The workflow below walks the three most common Approx operations end-to-end:

  1. **Approx (Project: Get Many)** — fetch the first 5 projects.
  2. **Approx (Report: Create)** — queue a report for the first returned project.
  3. **Wait** — give the report queue ~30 s to finish.
  4. **Approx (Report: Download)** — download the generated ZIP into a binary
     field called `report`.

  ### Step-by-step (manual setup)

  1. Add a **Manual Trigger**.
  2. Add an **Approx** node:
     - Credential: select your **Approx OAuth2 API** credential
     - Resource: `Project`
     - Operation: `Get Many`
     - Query Options → Take: `5`
  3. Add another **Approx** node:
     - Resource: `Report`
     - Operation: `Create`
     - Project ID: `={{ $json.id }}` (expression — picks the id from the first node)
  4. Add a **Wait** node — `30 seconds` (Approx reports usually finish in
     seconds; for big projects use the Report → `Get` operation in a loop with
     `If status === "Completed"` instead).
  5. Add a third **Approx** node:
     - Resource: `Report`
     - Operation: `Download`
     - Report ID: `={{ $json.id }}`
     - Put Output File in Field: `report`

  Execute the workflow. The last node's output will contain `binary.report`
  holding the report ZIP, ready to be written to disk, uploaded to S3, sent over
  email, etc.

  ### Importable workflow JSON

  Copy the snippet below and in n8n press **Ctrl/Cmd + V** on an empty canvas
  (or use **Import from Clipboard**). Replace `REPLACE_WITH_CREDENTIAL_ID` with
  the id n8n assigns to your saved Approx OAuth2 API credential.

  ```json
  {
    "name": "Approx — generate and download a report",
    "nodes": [
      {
        "parameters": {},
        "id": "1",
        "name": "When clicking 'Test workflow'",
        "type": "n8n-nodes-base.manualTrigger",
        "typeVersion": 1,
        "position": [240, 300]
      },
      {
        "parameters": {
          "resource": "project",
          "operation": "getMany",
          "queryOptions": { "take": 5 }
        },
        "id": "2",
        "name": "List 5 projects",
        "type": "@approx-tech/n8n-nodes-approx.approx",
        "typeVersion": 1,
        "position": [480, 300],
        "credentials": {
          "approxOAuth2Api": {
            "id": "REPLACE_WITH_CREDENTIAL_ID",
            "name": "Approx OAuth2 API"
          }
        }
      },
      {
        "parameters": {
          "resource": "report",
          "operation": "create",
          "projectId": "={{ $json.id }}"
        },
        "id": "3",
        "name": "Queue report",
        "type": "@approx-tech/n8n-nodes-approx.approx",
        "typeVersion": 1,
        "position": [720, 300],
        "credentials": {
          "approxOAuth2Api": {
            "id": "REPLACE_WITH_CREDENTIAL_ID",
            "name": "Approx OAuth2 API"
          }
        }
      },
      {
        "parameters": { "amount": 30, "unit": "seconds" },
        "id": "4",
        "name": "Wait 30s",
        "type": "n8n-nodes-base.wait",
        "typeVersion": 1,
        "position": [960, 300]
      },
      {
        "parameters": {
          "resource": "report",
          "operation": "download",
          "reportId": "={{ $json.id }}",
          "binaryPropertyName": "report"
        },
        "id": "5",
        "name": "Download report ZIP",
        "type": "@approx-tech/n8n-nodes-approx.approx",
        "typeVersion": 1,
        "position": [1200, 300],
        "credentials": {
          "approxOAuth2Api": {
            "id": "REPLACE_WITH_CREDENTIAL_ID",
            "name": "Approx OAuth2 API"
          }
        }
      }
    ],
    "connections": {
      "When clicking 'Test workflow'": {
        "main": [[{ "node": "List 5 projects", "type": "main", "index": 0 }]]
      },
      "List 5 projects": {
        "main": [[{ "node": "Queue report", "type": "main", "index": 0 }]]
      },
      "Queue report": {
        "main": [[{ "node": "Wait 30s", "type": "main", "index": 0 }]]
      },
      "Wait 30s": {
        "main": [[{ "node": "Download report ZIP", "type": "main", "index": 0 }]]
      }
    }
  }
  ```

  ---

  ## Sample success outputs

  ### `Project: Get Many` (trimmed to one item)

  ```json
  {
    "id": "6d3a1f7e-1c2b-4f4c-9a7d-2b8d9d2f8a3e",
    "name": "Demo Villa — Antalya",
    "authorityId": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
    "takeoffTemplateId": "b3d20b6c-7d6f-4f02-9c54-3c1c1c5a4e22",
    "reportTemplateId": "f1b9c8e0-aa11-4af0-9c5d-5a2f3b4c6d70",
    "carriagePercentage": 0.04,
    "expandCustomPricings": false,
    "createdAt": "2026-05-21T08:14:33Z",
    "updatedAt": "2026-05-30T14:02:11Z"
  }
  ```

  ### `Project: Create`

  ```json
  {
    "id": "8f9a2b1c-aa00-4bbb-8e9c-1234567890ab",
    "name": "New Office Block — Istanbul",
    "authorityId": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
    "takeoffTemplateId": "b3d20b6c-7d6f-4f02-9c54-3c1c1c5a4e22",
    "reportTemplateId": "f1b9c8e0-aa11-4af0-9c5d-5a2f3b4c6d70",
    "carriagePercentage": 0.04,
    "expandCustomPricings": false
  }
  ```

  ### `Report: Create`

  ```json
  {
    "id": "c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23",
    "projectId": "6d3a1f7e-1c2b-4f4c-9a7d-2b8d9d2f8a3e",
    "status": "Queued",
    "createdAt": "2026-06-02T16:18:00Z"
  }
  ```

  ### `Report: Get` (polled later)

  ```json
  {
    "id": "c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23",
    "projectId": "6d3a1f7e-1c2b-4f4c-9a7d-2b8d9d2f8a3e",
    "status": "Completed",
    "createdAt": "2026-06-02T16:18:00Z",
    "completedAt": "2026-06-02T16:18:22Z"
  }
  ```

  ### `Report: Download`

  ```json
  {
    "reportId": "c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23",
    "filename": "report-c7a4b6d2-9e1f-4c83-bd6e-7a8d9f0b1c23.zip",
    "mimeType": "application/zip"
  }
  ```

  …plus a `binary.report` field containing the actual ZIP bytes (default field
  name; configurable via **Put Output File in Field**).

  ### `Pricing Library: Get Many` (one item)

  ```json
  {
    "id": "lib-2025-istanbul",
    "name": "İBB 2025 Birim Fiyat Listesi",
    "authorityId": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
    "culture": "tr-TR"
  }
  ```

  ### `Authority: Get Many` (one item)

  ```json
  {
    "id": "0b8e5d59-3f72-4d4a-9e0d-4f7e6f1c2a91",
    "name": "Çevre, Şehircilik ve İklim Değişikliği Bakanlığı",
    "createdAt": "2025-01-12T10:00:00Z"
  }
  ```

  ### `Takeoff Template: Get Many` (one item)

  ```json
  {
    "id": "b3d20b6c-7d6f-4f02-9c54-3c1c1c5a4e22",
    "name": "Konut — Standart Şablon",
    "culture": "tr-TR",
    "version": 3
  }
  ```

  ---

  ## Migrating from 0.4.x

  Two breaking changes ship in 0.5.0; both are required to pass n8n community
  verification.

  ### 1. One node instead of five

  The previous five nodes are gone:

  | Old node | New resource (on the single `Approx` node) |
  | --- | --- |
  | Approx Project | `Project`, `Property`, `Work Group Type`, `Original File`, `Static File`, `File` |
  | Approx Report | `Report` |
  | Approx Unit Price | `Pricing`, `Pricing Library` |
  | Approx Authority | `Authority` |
  | Approx Template | `Takeoff Template`, `Report Template`, `Property Type` |

  In existing workflows, **delete the old node and add the new `Approx` node** in
  its place — the operation names and parameter names are unchanged, so you can
  copy values straight across.

  ### 2. Credential renamed and rewired to built-in OAuth2

  The credential class is now `ApproxOAuth2Api` (internal name
  `approxOAuth2Api`). n8n's built-in OAuth2 client-credentials grant is used —
  no custom token code lives in this package any more.

  **You must recreate the credential** (n8n cannot migrate between credential
  types). Create a new **Approx OAuth2 API** credential with the same
  `Client ID`, `Client Secret`, `Auth0 Domain`, `Audience` and `Base URL`
  values, then re-pick it on each `Approx` node.

  ---

  ## License

  [MIT](LICENSE).

  ## Support

  - Issues: <https://github.com/Approx-Tech/n8n-nodes-approx/issues>
  - Approx product: <https://approx.one>

ai_documentation_summary:
  {"purpose":"Provides a single n8n node for automating Approx construction cost-estimation and quantity-takeoff workflows, including project, report, pricing, template, file, and property management.","capabilities":["Project management: get many, get, create, update, delete","Report workflows: create, get, download report ZIP files","Authority management: get many, get, create, update name, update logo, delete","Property management: get many, get, create, create many, update name, update multiplier, delete","File handling: download files, upload/delete original files and static files","Pricing access: list pricing libraries and pricing entries","Template and metadata access: get takeoff templates, report templates, property types, and work group types","Supports list query options via DQB parameters: skip, take, order by, where"],"authentication":"OAuth2 client-credentials flow using an Approx OAuth2 API credential (Auth0 Machine-to-Machine); requires client ID, client secret, Auth0 domain, audience, and base URL.","commonUseCases":["List projects and generate/download a report","Manage project properties, files, and templates for quantity takeoff workflows","Retrieve pricing libraries and pricing data for construction estimates"],"limitations":["As of version 0.5.0, five former nodes were consolidated into a single Approx node, so workflows must use resources and operations instead of separate node types","List endpoints only support the standard Query Options collection mapped to DQB query parameters"],"relatedNodes":[]}


node_type: @peedief/n8n-nodes-peedief.peedief
package_name: @peedief/n8n-nodes-peedief
display_name: Peedief
description: Generate PDFs from HTML or Peedief templates
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: juned.khatri31
author_github_url: https://github.com/peedief/n8n-nodes-peedief.git
npm_package_name: @peedief/n8n-nodes-peedief
npm_version: 1.0.2
community_fetched_at: 2026-07-14T14:40:34.456Z
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": "Generate a PDF from HTML",
          "description": "Generate a PDF from raw HTML"
        },
        {
          "name": "Template to PDF",
          "value": "templateToPdf",
          "action": "Generate a PDF from a template",
          "description": "Generate a PDF from a saved Peedief template"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "HTML to PDF",
      "value": "htmlToPdf",
      "action": "Generate a PDF from HTML",
      "description": "Generate a PDF from raw HTML"
    },
    {
      "name": "Template to PDF",
      "value": "templateToPdf",
      "action": "Generate a PDF from a template",
      "description": "Generate a PDF from a saved Peedief template"
    }
  ]

npm_readme:
  # n8n-nodes-peedief

  Generate PDFs from Peedief inside n8n.

  ## Actions

  - **HTML to PDF**: send raw HTML to `POST /api/pdf`.
  - **Template to PDF**: render a saved Peedief template with JSON context through `POST /api/templates/by-name/:templateName/pdf`.

  Both actions authenticate with the `x-api-key` header and return Peedief's PDF metadata, including `downloadUrl`, `previewUrl`, `fileName`, and `fileSize`. You can optionally download the generated PDF into n8n binary data.

  ## Development

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

  `npm run dev` starts a local n8n instance with this node loaded.

  ## Credentials

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

  - **API Key**: your Peedief API key.
  - **Base URL**: your Peedief API URL, for example `https://peedief.com/api`.

  ## Private Install

  Build the package and install it into your n8n instance:

  ```bash
  npm run build
  npm pack
  ```

  Then install the generated `.tgz` package in n8n as a community/private node.

ai_documentation_summary:
  {"purpose":"Generates PDFs in n8n using Peedief, either from raw HTML or from saved Peedief templates with JSON context. It can return PDF metadata and optionally download the generated PDF as n8n binary data.","capabilities":["Convert raw HTML to PDF via POST /api/pdf","Render a saved Peedief template to PDF via POST /api/templates/by-name/:templateName/pdf","Pass JSON context data into template-based PDF generation","Return PDF metadata including downloadUrl, previewUrl, fileName, and fileSize","Optionally download the generated PDF into n8n binary data"],"authentication":"API key required via the x-api-key header using a Peedief API credential with API Key and Base URL fields","commonUseCases":["Generate invoices, reports, or documents from HTML content","Create PDFs from reusable templates populated with workflow data","Retrieve PDF links or store generated PDFs directly in n8n binary data"],"limitations":["Only two actions are documented: HTML to PDF and Template to PDF","Template generation requires a saved Peedief template name"],"relatedNodes":[]}


node_type: @saberapp/n8n-nodes-saber.saberTrigger
package_name: @saberapp/n8n-nodes-saber
display_name: Saber Trigger
description: Starts a workflow when Saber delivers new market signals
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: b-saber
author_github_url: https://github.com/saberapp/n8n-nodes-saber.git
npm_package_name: @saberapp/n8n-nodes-saber
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.457Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # n8n-nodes-saber

  This is an n8n community node. It lets you use the [Saber](https://saber.app) Platform API in your n8n workflows.

  Saber provides AI-powered research signals for companies and contacts — company and contact signals, market signals (job posts, LinkedIn posts, fundraising, investments, IPOs), company and contact lists, lead scoring, and email finding.

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

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

  ## Installation

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

  Once this node is verified, you can install it from the nodes panel in n8n. To install manually:

  ```bash
  npm install @saberapp/n8n-nodes-saber
  ```

  ## Credentials

  You authenticate with a Saber API key.

  1. Log in to your Saber account at [ai.saber.app](https://ai.saber.app).
  2. Open **Settings → API Keys**.
  3. Click **Create API Key** and copy the key (it looks like `sk_live_…`). It is shown only once.
  4. In n8n, create new **Saber API** credentials and paste the key.

  The **Base URL** field defaults to `https://api.saber.app` and should be left as-is unless you are instructed otherwise.

  ## Operations

  The **Saber** node exposes the full Saber public API, grouped into resources:

  | Resource | What you can do |
  | --- | --- |
  | Company Signal | Create AI research signals about a company by domain (synchronous or asynchronous), list, get, batch. |
  | Company Signal Template | Create and manage reusable signal templates. |
  | Company Signal Subscription | Schedule recurring signals and manage their actions. |
  | Company Signal Summary | Generate and list AI summaries across a domain's signals. |
  | Company List | Search companies and build, import, export, and manage company lists. |
  | Contact | Research a contact, find a verified email, and search contacts via LinkedIn Sales Navigator. |
  | Contact Signal | Create AI research signals about a contact (synchronous or asynchronous). |
  | Contact List | Build and manage contact lists. |
  | Market Signal Subscription | Monitor job posts, LinkedIn posts, fundraising, investments, and IPOs. |
  | Scoring | Manage scoring profiles, rules, assignments, and computed scores. |
  | Account | Read credit balance, connectors, and your organisation profile. |

  ### Tip: synchronous signals

  For company and contact signals, prefer the **synchronous** create operations. They wait for the AI research to finish and return the result in the same request — no webhook hosting or polling required. Use the **Timeout (Seconds)** field (max 900) under *Additional Fields* for long-running research.

  ## Trigger

  The **Saber Trigger** node starts a workflow when Saber delivers new **market signals**. When the workflow is activated, the node creates a Saber market-signal subscription pointed at the n8n webhook URL; when deactivated, it removes the subscription. Each delivered signal becomes one item.

  Choose the **Signal Type** (Job Posts, LinkedIn Post, Fundraising, Recent Investment, IPO), an optional polling interval, and optional filters.

  ## Compatibility

  - Requires n8n with `n8nNodesApiVersion` 1.
  - Tested against the Saber Platform API `v1`.

  ## Resources

  - [Saber Platform API reference (OpenAPI)](https://api.saber.app/v1/openapi.yaml)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## Development

  ```bash
  npm install
  npm run generate   # regenerate node operations from the public API spec
  npm run build
  npm run lint
  ```

  The operation surface in `nodes/Saber/generated.ts` is generated by `scripts/generate-operations.ts` from the public Saber API specification at `https://api.saber.app/v1/openapi.yaml`. Re-run `npm run generate` to pick up API changes. The generator and its `js-yaml` dependency are development-only — the published node has no runtime dependencies.

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Triggers an n8n workflow when Saber publishes new market signals. It creates and removes a Saber market-signal subscription automatically based on the workflow activation state.","capabilities":["Subscribe to new market signals as a trigger","Monitor signal types including Job Posts, LinkedIn Posts, Fundraising, Recent Investment, and IPO","Apply optional polling interval settings","Apply optional filters to incoming signals","Deliver each signal as a separate item to the workflow"],"authentication":"Saber API key required","commonUseCases":["Start a workflow when a new job post signal is detected","Automate actions when fundraising or investment signals appear","Track LinkedIn post or IPO market signals in real time"],"limitations":["Only supports market-signal triggers, not general Saber API operations","Requires n8nNodesApiVersion 1","Tested against Saber Platform API v1","Synchronous signal operations are available in the broader node, but not in this trigger node"],"relatedNodes":["Saber"]}


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

updated_at: 2026-07-14 14:40:34
author_name: b-saber
author_github_url: https://github.com/saberapp/n8n-nodes-saber.git
npm_package_name: @saberapp/n8n-nodes-saber
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.458Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Work with the Saber Platform API: company and contact research signals, market signals, lists, and scoring

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "companySignalTemplate",
      "options": [
        {
          "name": "Company Signal Template",
          "value": "companySignalTemplate"
        },
        {
          "name": "Company Signal Summary",
          "value": "companySignalSummary"
        },
        {
          "name": "Company Signal Subscription",
          "value": "companySignalSubscription"
        },
        {
          "name": "Company Signal",
          "value": "companySignal"
        },
        {
          "name": "Company List",
          "value": "companyList"
        },
        {
          "name": "Contact Signal",
          "value": "contactSignal"
        },
        {
          "name": "Contact List",
          "value": "contactList"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Market Signal Subscription",
          "value": "marketSignalSubscription"
        },
        {
          "name": "Scoring",
          "value": "scoring"
        },
        {
          "name": "Account",
          "value": "account"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listSignalTemplates",
      "options": [
        {
          "name": "List all signal templates for your organization",
          "value": "listSignalTemplates",
          "action": "List all signal templates for your organization",
          "description": "Retrieve a paginated list of signal templates for your organization."
        },
        {
          "name": "Create a signal template",
          "value": "createSignalTemplate",
          "action": "Create a signal template",
          "description": "Create a reusable signal template that can be referenced when creating signals."
        },
        {
          "name": "Get a signal template by ID",
          "value": "getSignalTemplate",
          "action": "Get a signal template by ID",
          "description": "Retrieve a specific signal template by ID"
        },
        {
          "name": "Update a signal template",
          "value": "updateSignalTemplate",
          "action": "Update a signal template",
          "description": "Update a signal template using PATCH semantics (partial update). This creates a new version of the template"
        },
        {
          "name": "Delete a signal template",
          "value": "deleteSignalTemplate",
          "action": "Delete a signal template",
          "description": "Soft-delete a signal template. The template will be marked as deleted but preserved for historical tracking."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "companySignalTemplate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getSignalSummaries",
      "options": [
        {
          "name": "List all AI-generated signal summaries for a domain, ordered by creation date (latest first)",
          "value": "getSignalSummaries",
          "action": "List all AI-generated signal summaries for a domain, ordered by creation date (latest first)",
          "description": "Retrieve all summaries that have been generated for a given domain with pagination support."
        },
        {
          "name": "Generate an AI summary consolidating insights from all completed company signals for a domain",
          "value": "generateSignalSummary",
          "action": "Generate an AI summary consolidating insights from all completed company signals for a domain",
          "description": "Generate an AI-powered summary of all completed signals for a given domain. The summary"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "companySignalSummary"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listSubscriptionLogs",
      "options": [
        {
          "name": "List signal executions for a subscription",
          "value": "listSubscriptionLogs",
          "action": "List signal executions for a subscription",
          "description": "Retrieve all signal executions that were triggered by a specific signal subscription."
        },
        {
          "name": "List all signal subscriptions for your organization",
          "value": "listSignalSubscriptions",
          "action": "List all signal subscriptions for your organization",
          "description": "Retrieve a paginated list of signal subscriptions. Each subscription is merged"
        },
        {
          "name": "Create a signal subscription",
          "value": "createSignalSubscription",
          "action": "Create a signal subscription",
          "description": "Create a subscription that schedules recurring signal executions."
        },
        {
          "name": "Get a signal subscription by ID",
          "value": "getSignalSubscription",
          "action": "Get a signal subscription by ID",
          "description": "Retrieve a single subscription merged with its signal template data."
        },
        {
          "name": "Update a signal subscription",
          "value": "updateSignalSubscription",
          "action": "Update a signal subscription",
          "description": "Update a subscription's schedule configuration and/or its underlying template fields."
        },
        {
          "name": "Start a signal subscription",
          "value": "startSignalSubscription",
          "action": "Start a signal subscription",
          "description": "Activate a stopped subscription. Begins recurring signal execution"
        },
        {
          "name": "Stop a signal subscription",
          "value": "stopSignalSubscription",
          "action": "Stop a signal subscription",
          "description": "Pause an active subscription so no further recurring executions occur."
        },
        {
          "name": "Trigger an immediate run of a signal subscription",
          "value": "triggerSignalSubscription",
          "action": "Trigger an immediate run of a signal subscription",
          "description": "Trigger an immediate execution of the subscription regardless of the cron schedule."
        },
        {
          "name": "List all actions for a subscription",
          "value": "listSubscriptionActions",
          "action": "List all actions for a subscription",
          "description": "Retrieve a paginated list of actions configured on a subscription."
        },
        {
          "name": "Create a subscription action",
          "value": "createSubscriptionAction",
          "action": "Create a subscription action",
          "description": "Create an action on a subscription. Actions define what happens when the"
        },
        {
          "name": "Get a subscription action by ID",
          "value": "getSubscriptionAction",
          "action": "Get a subscription action by ID",
          "description": "Retrieve a single action by its ID."
        },
        {
          "name": "Update a subscription action",
          "value": "updateSubscriptionAction",
          "action": "Update a subscription action",
          "description": "Replace the configuration of an existing action. The action type is"
        },
        {
          "name": "Delete a subscription action",
          "value": "deleteSubscriptionAction",
          "action": "Delete a subscription action",
          "description": "Permanently delete an action from a subscription."
        },
        {
          "name": "Pause a subscription action",
          "value": "pauseSubscriptionAction",
          "action": "Pause a subscription action",
          "description": "Disable an action so it is skipped during dispatch. The action"
        },
        {
          "name": "Unpause a subscription action",
          "value": "unpauseSubscriptionAction",
          "action": "Unpause a subscription action",
          "description": "Re-enable a paused action so it resumes being dispatched when the"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "companySignalSubscription"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createCompanySignalSync",
      "options": [
        {
          "name": "Create a company signal synchronously",
          "value": "createCompanySignalSync",
          "action": "Create a company signal synchronously",
          "description": "⭐ This is the recommended way to create signals and get results instead of async + webhooks."
        },
        {
          "name": "List company signals",
          "value": "listSignals",
          "action": "List company signals",
          "description": "Retrieve all signals with optional filtering by domain or companyId, pagination and filtering."
        },
        {
          "name": "Create a company signal asynchronously",
          "value": "createSignal",
          "action": "Create a company signal asynchronously",
          "description": "Submit a domain and question to create a new research signal. The AI will analyze the domain"
        },
        {
          "name": "Create company signals in batch",
          "value": "createSignalBatch",
          "action": "Create company signals in batch",
          "description": "Submit multiple signals and domains to create signals using a Cartesian product pattern."
        },
        {
          "name": "Get a company signal by ID",
          "value": "getSignal",
          "action": "Get a company signal by ID",
          "description": "Retrieve the current status and results of a signal. If the signal is completed,"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "companySignal"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "importCompanyList",
      "options": [
        {
          "name": "Import a company list from HubSpot",
          "value": "importCompanyList",
          "action": "Import a company list from HubSpot",
          "description": "Create a company list by importing companies directly from a connected"
        },
        {
          "name": "Preview expected company count and credit cost",
          "value": "countPreviewCompanyList",
          "action": "Preview expected company count and credit cost",
          "description": "Returns the number of companies that match a given filter and the Saber"
        },
        {
          "name": "List company lists",
          "value": "listCompanyLists",
          "action": "List company lists",
          "description": "Retrieve a paginated list of company lists belonging to the authenticated caller."
        },
        {
          "name": "Create a company list",
          "value": "createCompanyList",
          "action": "Create a company list",
          "description": "Create a named company list with a filter definition. The filter criteria"
        },
        {
          "name": "Get a company list by ID",
          "value": "getCompanyList",
          "action": "Get a company list by ID",
          "description": "Retrieve a single company list including its name and filter definition."
        },
        {
          "name": "Update a company list",
          "value": "updateCompanyList",
          "action": "Update a company list",
          "description": "Update the name and/or filter of an existing company list. Both fields"
        },
        {
          "name": "Delete a company list",
          "value": "deleteCompanyList",
          "action": "Delete a company list",
          "description": "Soft-delete a company list. The list will no longer appear in list"
        },
        {
          "name": "Get companies in a list",
          "value": "getCompanyListCompanies",
          "action": "Get companies in a list",
          "description": "Retrieve companies that belong to a company list, paginated. Companies"
        },
        {
          "name": "Export a company list as CSV",
          "value": "exportCompanyList",
          "action": "Export a company list as CSV",
          "description": "Export all companies in a list as a CSV file. Returns a"
        },
        {
          "name": "Search companies matching a filter",
          "value": "searchCompanies",
          "action": "Search companies matching a filter",
          "description": "Returns up to 50 companies that match the given filter criteria."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "companyList"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createContactSignalSync",
      "options": [
        {
          "name": "Create a contact signal synchronously",
          "value": "createContactSignalSync",
          "action": "Create a contact signal synchronously",
          "description": "⭐ This is the recommended way to create contact signals and get results instead of async + webhooks."
        },
        {
          "name": "List contact signals",
          "value": "listContactSignals",
          "action": "List contact signals",
          "description": "Retrieve all contact signals with optional filtering by LinkedIn URL, pagination and filtering."
        },
        {
          "name": "Create a contact signal asynchronously",
          "value": "createContactSignal",
          "action": "Create a contact signal asynchronously",
          "description": "Submit a LinkedIn URL and question to create a new research signal for an individual contact."
        },
        {
          "name": "Get a contact signal by ID",
          "value": "getContactSignal",
          "action": "Get a contact signal by ID",
          "description": "Retrieve the current status and results of a contact signal. If the signal is completed,"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contactSignal"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listContactLists",
      "options": [
        {
          "name": "List contact lists",
          "value": "listContactLists",
          "action": "List contact lists",
          "description": "List contact lists"
        },
        {
          "name": "Create a contact list",
          "value": "createContactList",
          "action": "Create a contact list",
          "description": "Creates a named contact list by running a live LinkedIn Sales Navigator search for the given company and filters, then storing the results as a persistent snapshot."
        },
        {
          "name": "Get a contact list by ID",
          "value": "getContactList",
          "action": "Get a contact list by ID",
          "description": "Get a contact list by ID"
        },
        {
          "name": "Rename a contact list",
          "value": "updateContactList",
          "action": "Rename a contact list",
          "description": "Rename a contact list"
        },
        {
          "name": "Delete a contact list and all its stored contacts",
          "value": "deleteContactList",
          "action": "Delete a contact list and all its stored contacts",
          "description": "Permanently deletes the contact list and all its stored contact snapshots."
        },
        {
          "name": "Get contacts in a contact list",
          "value": "getContactListContacts",
          "action": "Get contacts in a contact list",
          "description": "Returns the stored contact snapshot for the given list, paginated. Reads directly from the database — no Sales Navigator API call is made, so this is always fast and does not consume credits."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contactList"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "findEmail",
      "options": [
        {
          "name": "Find a verified email address for a contact at a domain",
          "value": "findEmail",
          "action": "Find a verified email address for a contact at a domain",
          "description": "Given a contact's full name and the domain of the company they"
        },
        {
          "name": "Get contact research by external ID",
          "value": "getContactResearchByExternalID",
          "action": "Get contact research by external ID",
          "description": "Retrieve a contact research request by external ID and external source. This endpoint allows you"
        },
        {
          "name": "Start a contact research job",
          "value": "createContactResearch",
          "action": "Start a contact research job",
          "description": "Submit contact details to create a new contact research request. The AI will gather information"
        },
        {
          "name": "Get contact research by ID",
          "value": "getContactResearch",
          "action": "Get contact research by ID",
          "description": "Retrieve a contact research request by ID, including its status and results if completed."
        },
        {
          "name": "Search contacts with LinkedIn Sales Navigator",
          "value": "searchContacts",
          "action": "Search contacts with LinkedIn Sales Navigator",
          "description": "Search for contacts using LinkedIn Sales Navigator. Optionally scoped to one or more companies"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listMarketSignalSubscriptions",
      "options": [
        {
          "name": "List all market signal subscriptions for your organization",
          "value": "listMarketSignalSubscriptions",
          "action": "List all market signal subscriptions for your organization",
          "description": "Retrieve a paginated list of market signal subscriptions. By default, deleted subscriptions"
        },
        {
          "name": "Create a market signal subscription to monitor job posts, LinkedIn posts, fundraising, investments, or IPOs",
          "value": "createMarketSignalSubscription",
          "action": "Create a market signal subscription to monitor job posts, LinkedIn posts, fundraising, investments, or IPOs",
          "description": "Create a subscription that continuously monitors external data sources and delivers matching signals"
        },
        {
          "name": "Get a market signal subscription by ID",
          "value": "getMarketSignalSubscription",
          "action": "Get a market signal subscription by ID",
          "description": "Retrieve a single market signal subscription including its filter configuration and status."
        },
        {
          "name": "Update a market signal subscription",
          "value": "updateMarketSignalSubscription",
          "action": "Update a market signal subscription",
          "description": "Partially update a subscription's configuration. All fields are optional; only provided"
        },
        {
          "name": "Delete a market signal subscription",
          "value": "deleteMarketSignalSubscription",
          "action": "Delete a market signal subscription",
          "description": "Soft-delete a subscription and stop signal delivery. The subscription will no longer"
        },
        {
          "name": "Pause a market signal subscription",
          "value": "pauseMarketSignalSubscription",
          "action": "Pause a market signal subscription",
          "description": "Pause an active subscription. No new signals will be delivered until the"
        },
        {
          "name": "Resume a paused market signal subscription",
          "value": "resumeMarketSignalSubscription",
          "action": "Resume a paused market signal subscription",
          "description": "Resume a paused subscription. Signal polling restarts and signals will"
        },
        {
          "name": "Trigger an immediate run of a market signal subscription",
          "value": "triggerMarketSignalSubscription",
          "action": "Trigger an immediate run of a market signal subscription",
          "description": "Trigger an immediate polling run for the subscription, regardless of the normal"
        },
        {
          "name": "List signals delivered by a market signal subscription",
          "value": "listMarketSignalSubscriptionSignals",
          "action": "List signals delivered by a market signal subscription",
          "description": "Retrieve a paginated list of signals that have been matched and stored by a subscription."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "marketSignalSubscription"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listScoringProfiles",
      "options": [
        {
          "name": "List scoring profiles",
          "value": "listScoringProfiles",
          "action": "List scoring profiles",
          "description": "List all scoring profiles for the authenticated organisation."
        },
        {
          "name": "Create a scoring profile",
          "value": "createScoringProfile",
          "action": "Create a scoring profile",
          "description": "Create a named, org-scoped scoring profile. A profile groups scoring rules for a"
        },
        {
          "name": "Get a scoring profile",
          "value": "getScoringProfile",
          "action": "Get a scoring profile",
          "description": "Get a scoring profile"
        },
        {
          "name": "Update a scoring profile",
          "value": "updateScoringProfile",
          "action": "Update a scoring profile",
          "description": "Rename or re-describe a profile. Profile type is immutable."
        },
        {
          "name": "Delete a scoring profile",
          "value": "deleteScoringProfile",
          "action": "Delete a scoring profile",
          "description": "Deletes the profile and cascades to its rules, assignments, and score results."
        },
        {
          "name": "List scoring rules for a profile",
          "value": "listScoringRules",
          "action": "List scoring rules for a profile",
          "description": "List scoring rules for a profile"
        },
        {
          "name": "Upsert a scoring rule",
          "value": "upsertScoringRule",
          "action": "Upsert a scoring rule",
          "description": "Create or replace the rule for (profileId, signalTemplateId, dimension). Triggers"
        },
        {
          "name": "Delete a scoring rule",
          "value": "deleteScoringRule",
          "action": "Delete a scoring rule",
          "description": "Removes the rule and triggers a recompute of every object assigned to the"
        },
        {
          "name": "List profile assignments for an object",
          "value": "listProfileAssignments",
          "action": "List profile assignments for an object",
          "description": "Returns every profile a given object is assigned to."
        },
        {
          "name": "Assign a profile to a single object",
          "value": "createProfileAssignment",
          "action": "Assign a profile to a single object",
          "description": "Links one company or contact to a scoring profile. Triggers immediate score"
        },
        {
          "name": "Assign a profile to many objects at once",
          "value": "bulkCreateProfileAssignments",
          "action": "Assign a profile to many objects at once",
          "description": "Links many company or contact IDs to a single profile in one call. Skips"
        },
        {
          "name": "Remove a profile assignment",
          "value": "deleteProfileAssignment",
          "action": "Remove a profile assignment",
          "description": "Removes the assignment and cleans up any score results computed for this"
        },
        {
          "name": "Read scores for one or more objects",
          "value": "getScores",
          "action": "Read scores for one or more objects",
          "description": "Returns one row per (profile, object, dimension) triple. Pass objectId"
        },
        {
          "name": "Trigger score recomputation",
          "value": "triggerScoreCompute",
          "action": "Trigger score recomputation",
          "description": "Triggers score recomputation for the given objects against the latest"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "scoring"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listConnectors",
      "options": [
        {
          "name": "List connectors and their connection status",
          "value": "listConnectors",
          "action": "List connectors and their connection status",
          "description": "Returns a list of all integrations (connectors) configured for your organization, along with"
        },
        {
          "name": "Get remaining credit balance",
          "value": "getCredits",
          "action": "Get remaining credit balance",
          "description": "Returns the remaining credits balance for your organization."
        },
        {
          "name": "Get your organisation profile",
          "value": "getOrganisation",
          "action": "Get your organisation profile",
          "description": "Returns the authenticated organisation's profile data: name, website, and description fields."
        },
        {
          "name": "Update your organisation profile",
          "value": "updateOrganisation",
          "action": "Update your organisation profile",
          "description": "Partially updates the authenticated organisation's profile. All fields are optional — only"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "List all signal templates for your organization",
      "value": "listSignalTemplates",
      "action": "List all signal templates for your organization",
      "description": "Retrieve a paginated list of signal templates for your organization.",
      "resource": "companySignalTemplate"
    },
    {
      "name": "Create a signal template",
      "value": "createSignalTemplate",
      "action": "Create a signal template",
      "description": "Create a reusable signal template that can be referenced when creating signals.",
      "resource": "companySignalTemplate"
    },
    {
      "name": "Get a signal template by ID",
      "value": "getSignalTemplate",
      "action": "Get a signal template by ID",
      "description": "Retrieve a specific signal template by ID",
      "resource": "companySignalTemplate"
    },
    {
      "name": "Update a signal template",
      "value": "updateSignalTemplate",
      "action": "Update a signal template",
      "description": "Update a signal template using PATCH semantics (partial update). This creates a new version of the template",
      "resource": "companySignalTemplate"
    },
    {
      "name": "Delete a signal template",
      "value": "deleteSignalTemplate",
      "action": "Delete a signal template",
      "description": "Soft-delete a signal template. The template will be marked as deleted but preserved for historical tracking.",
      "resource": "companySignalTemplate"
    },
    {
      "name": "List all AI-generated signal summaries for a domain, ordered by creation date (latest first)",
      "value": "getSignalSummaries",
      "action": "List all AI-generated signal summaries for a domain, ordered by creation date (latest first)",
      "description": "Retrieve all summaries that have been generated for a given domain with pagination support.",
      "resource": "companySignalSummary"
    },
    {
      "name": "Generate an AI summary consolidating insights from all completed company signals for a domain",
      "value": "generateSignalSummary",
      "action": "Generate an AI summary consolidating insights from all completed company signals for a domain",
      "description": "Generate an AI-powered summary of all completed signals for a given domain. The summary",
      "resource": "companySignalSummary"
    },
    {
      "name": "List signal executions for a subscription",
      "value": "listSubscriptionLogs",
      "action": "List signal executions for a subscription",
      "description": "Retrieve all signal executions that were triggered by a specific signal subscription.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "List all signal subscriptions for your organization",
      "value": "listSignalSubscriptions",
      "action": "List all signal subscriptions for your organization",
      "description": "Retrieve a paginated list of signal subscriptions. Each subscription is merged",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Create a signal subscription",
      "value": "createSignalSubscription",
      "action": "Create a signal subscription",
      "description": "Create a subscription that schedules recurring signal executions.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Get a signal subscription by ID",
      "value": "getSignalSubscription",
      "action": "Get a signal subscription by ID",
      "description": "Retrieve a single subscription merged with its signal template data.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Update a signal subscription",
      "value": "updateSignalSubscription",
      "action": "Update a signal subscription",
      "description": "Update a subscription's schedule configuration and/or its underlying template fields.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Start a signal subscription",
      "value": "startSignalSubscription",
      "action": "Start a signal subscription",
      "description": "Activate a stopped subscription. Begins recurring signal execution",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Stop a signal subscription",
      "value": "stopSignalSubscription",
      "action": "Stop a signal subscription",
      "description": "Pause an active subscription so no further recurring executions occur.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Trigger an immediate run of a signal subscription",
      "value": "triggerSignalSubscription",
      "action": "Trigger an immediate run of a signal subscription",
      "description": "Trigger an immediate execution of the subscription regardless of the cron schedule.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "List all actions for a subscription",
      "value": "listSubscriptionActions",
      "action": "List all actions for a subscription",
      "description": "Retrieve a paginated list of actions configured on a subscription.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Create a subscription action",
      "value": "createSubscriptionAction",
      "action": "Create a subscription action",
      "description": "Create an action on a subscription. Actions define what happens when the",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Get a subscription action by ID",
      "value": "getSubscriptionAction",
      "action": "Get a subscription action by ID",
      "description": "Retrieve a single action by its ID.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Update a subscription action",
      "value": "updateSubscriptionAction",
      "action": "Update a subscription action",
      "description": "Replace the configuration of an existing action. The action type is",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Delete a subscription action",
      "value": "deleteSubscriptionAction",
      "action": "Delete a subscription action",
      "description": "Permanently delete an action from a subscription.",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Pause a subscription action",
      "value": "pauseSubscriptionAction",
      "action": "Pause a subscription action",
      "description": "Disable an action so it is skipped during dispatch. The action",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Unpause a subscription action",
      "value": "unpauseSubscriptionAction",
      "action": "Unpause a subscription action",
      "description": "Re-enable a paused action so it resumes being dispatched when the",
      "resource": "companySignalSubscription"
    },
    {
      "name": "Create a company signal synchronously",
      "value": "createCompanySignalSync",
      "action": "Create a company signal synchronously",
      "description": "⭐ This is the recommended way to create signals and get results instead of async + webhooks.",
      "resource": "companySignal"
    },
    {
      "name": "List company signals",
      "value": "listSignals",
      "action": "List company signals",
      "description": "Retrieve all signals with optional filtering by domain or companyId, pagination and filtering.",
      "resource": "companySignal"
    },
    {
      "name": "Create a company signal asynchronously",
      "value": "createSignal",
      "action": "Create a company signal asynchronously",
      "description": "Submit a domain and question to create a new research signal. The AI will analyze the domain",
      "resource": "companySignal"
    },
    {
      "name": "Create company signals in batch",
      "value": "createSignalBatch",
      "action": "Create company signals in batch",
      "description": "Submit multiple signals and domains to create signals using a Cartesian product pattern.",
      "resource": "companySignal"
    },
    {
      "name": "Get a company signal by ID",
      "value": "getSignal",
      "action": "Get a company signal by ID",
      "description": "Retrieve the current status and results of a signal. If the signal is completed,",
      "resource": "companySignal"
    },
    {
      "name": "Import a company list from HubSpot",
      "value": "importCompanyList",
      "action": "Import a company list from HubSpot",
      "description": "Create a company list by importing companies directly from a connected",
      "resource": "companyList"
    },
    {
      "name": "Preview expected company count and credit cost",
      "value": "countPreviewCompanyList",
      "action": "Preview expected company count and credit cost",
      "description": "Returns the number of companies that match a given filter and the Saber",
      "resource": "companyList"
    },
    {
      "name": "List company lists",
      "value": "listCompanyLists",
      "action": "List company lists",
      "description": "Retrieve a paginated list of company lists belonging to the authenticated caller.",
      "resource": "companyList"
    },
    {
      "name": "Create a company list",
      "value": "createCompanyList",
      "action": "Create a company list",
      "description": "Create a named company list with a filter definition. The filter criteria",
      "resource": "companyList"
    },
    {
      "name": "Get a company list by ID",
      "value": "getCompanyList",
      "action": "Get a company list by ID",
      "description": "Retrieve a single company list including its name and filter definition.",
      "resource": "companyList"
    },
    {
      "name": "Update a company list",
      "value": "updateCompanyList",
      "action": "Update a company list",
      "description": "Update the name and/or filter of an existing company list. Both fields",
      "resource": "companyList"
    },
    {
      "name": "Delete a company list",
      "value": "deleteCompanyList",
      "action": "Delete a company list",
      "description": "Soft-delete a company list. The list will no longer appear in list",
      "resource": "companyList"
    },
    {
      "name": "Get companies in a list",
      "value": "getCompanyListCompanies",
      "action": "Get companies in a list",
      "description": "Retrieve companies that belong to a company list, paginated. Companies",
      "resource": "companyList"
    },
    {
      "name": "Export a company list as CSV",
      "value": "exportCompanyList",
      "action": "Export a company list as CSV",
      "description": "Export all companies in a list as a CSV file. Returns a",
      "resource": "companyList"
    },
    {
      "name": "Search companies matching a filter",
      "value": "searchCompanies",
      "action": "Search companies matching a filter",
      "description": "Returns up to 50 companies that match the given filter criteria.",
      "resource": "companyList"
    },
    {
      "name": "Create a contact signal synchronously",
      "value": "createContactSignalSync",
      "action": "Create a contact signal synchronously",
      "description": "⭐ This is the recommended way to create contact signals and get results instead of async + webhooks.",
      "resource": "contactSignal"
    },
    {
      "name": "List contact signals",
      "value": "listContactSignals",
      "action": "List contact signals",
      "description": "Retrieve all contact signals with optional filtering by LinkedIn URL, pagination and filtering.",
      "resource": "contactSignal"
    },
    {
      "name": "Create a contact signal asynchronously",
      "value": "createContactSignal",
      "action": "Create a contact signal asynchronously",
      "description": "Submit a LinkedIn URL and question to create a new research signal for an individual contact.",
      "resource": "contactSignal"
    },
    {
      "name": "Get a contact signal by ID",
      "value": "getContactSignal",
      "action": "Get a contact signal by ID",
      "description": "Retrieve the current status and results of a contact signal. If the signal is completed,",
      "resource": "contactSignal"
    },
    {
      "name": "List contact lists",
      "value": "listContactLists",
      "action": "List contact lists",
      "description": "List contact lists",
      "resource": "contactList"
    },
    {
      "name": "Create a contact list",
      "value": "createContactList",
      "action": "Create a contact list",
      "description": "Creates a named contact list by running a live LinkedIn Sales Navigator search for the given company and filters, then storing the results as a persistent snapshot.",
      "resource": "contactList"
    },
    {
      "name": "Get a contact list by ID",
      "value": "getContactList",
      "action": "Get a contact list by ID",
      "description": "Get a contact list by ID",
      "resource": "contactList"
    },
    {
      "name": "Rename a contact list",
      "value": "updateContactList",
      "action": "Rename a contact list",
      "description": "Rename a contact list",
      "resource": "contactList"
    },
    {
      "name": "Delete a contact list and all its stored contacts",
      "value": "deleteContactList",
      "action": "Delete a contact list and all its stored contacts",
      "description": "Permanently deletes the contact list and all its stored contact snapshots.",
      "resource": "contactList"
    },
    {
      "name": "Get contacts in a contact list",
      "value": "getContactListContacts",
      "action": "Get contacts in a contact list",
      "description": "Returns the stored contact snapshot for the given list, paginated. Reads directly from the database — no Sales Navigator API call is made, so this is always fast and does not consume credits.",
      "resource": "contactList"
    },
    {
      "name": "Find a verified email address for a contact at a domain",
      "value": "findEmail",
      "action": "Find a verified email address for a contact at a domain",
      "description": "Given a contact's full name and the domain of the company they",
      "resource": "contact"
    },
    {
      "name": "Get contact research by external ID",
      "value": "getContactResearchByExternalID",
      "action": "Get contact research by external ID",
      "description": "Retrieve a contact research request by external ID and external source. This endpoint allows you",
      "resource": "contact"
    },
    {
      "name": "Start a contact research job",
      "value": "createContactResearch",
      "action": "Start a contact research job",
      "description": "Submit contact details to create a new contact research request. The AI will gather information",
      "resource": "contact"
    },
    {
      "name": "Get contact research by ID",
      "value": "getContactResearch",
      "action": "Get contact research by ID",
      "description": "Retrieve a contact research request by ID, including its status and results if completed.",
      "resource": "contact"
    },
    {
      "name": "Search contacts with LinkedIn Sales Navigator",
      "value": "searchContacts",
      "action": "Search contacts with LinkedIn Sales Navigator",
      "description": "Search for contacts using LinkedIn Sales Navigator. Optionally scoped to one or more companies",
      "resource": "contact"
    },
    {
      "name": "List all market signal subscriptions for your organization",
      "value": "listMarketSignalSubscriptions",
      "action": "List all market signal subscriptions for your organization",
      "description": "Retrieve a paginated list of market signal subscriptions. By default, deleted subscriptions",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "Create a market signal subscription to monitor job posts, LinkedIn posts, fundraising, investments, or IPOs",
      "value": "createMarketSignalSubscription",
      "action": "Create a market signal subscription to monitor job posts, LinkedIn posts, fundraising, investments, or IPOs",
      "description": "Create a subscription that continuously monitors external data sources and delivers matching signals",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "Get a market signal subscription by ID",
      "value": "getMarketSignalSubscription",
      "action": "Get a market signal subscription by ID",
      "description": "Retrieve a single market signal subscription including its filter configuration and status.",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "Update a market signal subscription",
      "value": "updateMarketSignalSubscription",
      "action": "Update a market signal subscription",
      "description": "Partially update a subscription's configuration. All fields are optional; only provided",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "Delete a market signal subscription",
      "value": "deleteMarketSignalSubscription",
      "action": "Delete a market signal subscription",
      "description": "Soft-delete a subscription and stop signal delivery. The subscription will no longer",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "Pause a market signal subscription",
      "value": "pauseMarketSignalSubscription",
      "action": "Pause a market signal subscription",
      "description": "Pause an active subscription. No new signals will be delivered until the",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "Resume a paused market signal subscription",
      "value": "resumeMarketSignalSubscription",
      "action": "Resume a paused market signal subscription",
      "description": "Resume a paused subscription. Signal polling restarts and signals will",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "Trigger an immediate run of a market signal subscription",
      "value": "triggerMarketSignalSubscription",
      "action": "Trigger an immediate run of a market signal subscription",
      "description": "Trigger an immediate polling run for the subscription, regardless of the normal",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "List signals delivered by a market signal subscription",
      "value": "listMarketSignalSubscriptionSignals",
      "action": "List signals delivered by a market signal subscription",
      "description": "Retrieve a paginated list of signals that have been matched and stored by a subscription.",
      "resource": "marketSignalSubscription"
    },
    {
      "name": "List scoring profiles",
      "value": "listScoringProfiles",
      "action": "List scoring profiles",
      "description": "List all scoring profiles for the authenticated organisation.",
      "resource": "scoring"
    },
    {
      "name": "Create a scoring profile",
      "value": "createScoringProfile",
      "action": "Create a scoring profile",
      "description": "Create a named, org-scoped scoring profile. A profile groups scoring rules for a",
      "resource": "scoring"
    },
    {
      "name": "Get a scoring profile",
      "value": "getScoringProfile",
      "action": "Get a scoring profile",
      "description": "Get a scoring profile",
      "resource": "scoring"
    },
    {
      "name": "Update a scoring profile",
      "value": "updateScoringProfile",
      "action": "Update a scoring profile",
      "description": "Rename or re-describe a profile. Profile type is immutable.",
      "resource": "scoring"
    },
    {
      "name": "Delete a scoring profile",
      "value": "deleteScoringProfile",
      "action": "Delete a scoring profile",
      "description": "Deletes the profile and cascades to its rules, assignments, and score results.",
      "resource": "scoring"
    },
    {
      "name": "List scoring rules for a profile",
      "value": "listScoringRules",
      "action": "List scoring rules for a profile",
      "description": "List scoring rules for a profile",
      "resource": "scoring"
    },
    {
      "name": "Upsert a scoring rule",
      "value": "upsertScoringRule",
      "action": "Upsert a scoring rule",
      "description": "Create or replace the rule for (profileId, signalTemplateId, dimension). Triggers",
      "resource": "scoring"
    },
    {
      "name": "Delete a scoring rule",
      "value": "deleteScoringRule",
      "action": "Delete a scoring rule",
      "description": "Removes the rule and triggers a recompute of every object assigned to the",
      "resource": "scoring"
    },
    {
      "name": "List profile assignments for an object",
      "value": "listProfileAssignments",
      "action": "List profile assignments for an object",
      "description": "Returns every profile a given object is assigned to.",
      "resource": "scoring"
    },
    {
      "name": "Assign a profile to a single object",
      "value": "createProfileAssignment",
      "action": "Assign a profile to a single object",
      "description": "Links one company or contact to a scoring profile. Triggers immediate score",
      "resource": "scoring"
    },
    {
      "name": "Assign a profile to many objects at once",
      "value": "bulkCreateProfileAssignments",
      "action": "Assign a profile to many objects at once",
      "description": "Links many company or contact IDs to a single profile in one call. Skips",
      "resource": "scoring"
    },
    {
      "name": "Remove a profile assignment",
      "value": "deleteProfileAssignment",
      "action": "Remove a profile assignment",
      "description": "Removes the assignment and cleans up any score results computed for this",
      "resource": "scoring"
    },
    {
      "name": "Read scores for one or more objects",
      "value": "getScores",
      "action": "Read scores for one or more objects",
      "description": "Returns one row per (profile, object, dimension) triple. Pass objectId",
      "resource": "scoring"
    },
    {
      "name": "Trigger score recomputation",
      "value": "triggerScoreCompute",
      "action": "Trigger score recomputation",
      "description": "Triggers score recomputation for the given objects against the latest",
      "resource": "scoring"
    },
    {
      "name": "List connectors and their connection status",
      "value": "listConnectors",
      "action": "List connectors and their connection status",
      "description": "Returns a list of all integrations (connectors) configured for your organization, along with",
      "resource": "account"
    },
    {
      "name": "Get remaining credit balance",
      "value": "getCredits",
      "action": "Get remaining credit balance",
      "description": "Returns the remaining credits balance for your organization.",
      "resource": "account"
    },
    {
      "name": "Get your organisation profile",
      "value": "getOrganisation",
      "action": "Get your organisation profile",
      "description": "Returns the authenticated organisation's profile data: name, website, and description fields.",
      "resource": "account"
    },
    {
      "name": "Update your organisation profile",
      "value": "updateOrganisation",
      "action": "Update your organisation profile",
      "description": "Partially updates the authenticated organisation's profile. All fields are optional — only",
      "resource": "account"
    }
  ]

npm_readme:
  # n8n-nodes-saber

  This is an n8n community node. It lets you use the [Saber](https://saber.app) Platform API in your n8n workflows.

  Saber provides AI-powered research signals for companies and contacts — company and contact signals, market signals (job posts, LinkedIn posts, fundraising, investments, IPOs), company and contact lists, lead scoring, and email finding.

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

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

  ## Installation

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

  Once this node is verified, you can install it from the nodes panel in n8n. To install manually:

  ```bash
  npm install @saberapp/n8n-nodes-saber
  ```

  ## Credentials

  You authenticate with a Saber API key.

  1. Log in to your Saber account at [ai.saber.app](https://ai.saber.app).
  2. Open **Settings → API Keys**.
  3. Click **Create API Key** and copy the key (it looks like `sk_live_…`). It is shown only once.
  4. In n8n, create new **Saber API** credentials and paste the key.

  The **Base URL** field defaults to `https://api.saber.app` and should be left as-is unless you are instructed otherwise.

  ## Operations

  The **Saber** node exposes the full Saber public API, grouped into resources:

  | Resource | What you can do |
  | --- | --- |
  | Company Signal | Create AI research signals about a company by domain (synchronous or asynchronous), list, get, batch. |
  | Company Signal Template | Create and manage reusable signal templates. |
  | Company Signal Subscription | Schedule recurring signals and manage their actions. |
  | Company Signal Summary | Generate and list AI summaries across a domain's signals. |
  | Company List | Search companies and build, import, export, and manage company lists. |
  | Contact | Research a contact, find a verified email, and search contacts via LinkedIn Sales Navigator. |
  | Contact Signal | Create AI research signals about a contact (synchronous or asynchronous). |
  | Contact List | Build and manage contact lists. |
  | Market Signal Subscription | Monitor job posts, LinkedIn posts, fundraising, investments, and IPOs. |
  | Scoring | Manage scoring profiles, rules, assignments, and computed scores. |
  | Account | Read credit balance, connectors, and your organisation profile. |

  ### Tip: synchronous signals

  For company and contact signals, prefer the **synchronous** create operations. They wait for the AI research to finish and return the result in the same request — no webhook hosting or polling required. Use the **Timeout (Seconds)** field (max 900) under *Additional Fields* for long-running research.

  ## Trigger

  The **Saber Trigger** node starts a workflow when Saber delivers new **market signals**. When the workflow is activated, the node creates a Saber market-signal subscription pointed at the n8n webhook URL; when deactivated, it removes the subscription. Each delivered signal becomes one item.

  Choose the **Signal Type** (Job Posts, LinkedIn Post, Fundraising, Recent Investment, IPO), an optional polling interval, and optional filters.

  ## Compatibility

  - Requires n8n with `n8nNodesApiVersion` 1.
  - Tested against the Saber Platform API `v1`.

  ## Resources

  - [Saber Platform API reference (OpenAPI)](https://api.saber.app/v1/openapi.yaml)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## Development

  ```bash
  npm install
  npm run generate   # regenerate node operations from the public API spec
  npm run build
  npm run lint
  ```

  The operation surface in `nodes/Saber/generated.ts` is generated by `scripts/generate-operations.ts` from the public Saber API specification at `https://api.saber.app/v1/openapi.yaml`. Re-run `npm run generate` to pick up API changes. The generator and its `js-yaml` dependency are development-only — the published node has no runtime dependencies.

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"The Saber node connects n8n to the Saber Platform API for AI-powered company and contact research, market monitoring, list management, and lead scoring. It also includes a trigger for receiving new market signals into workflows.","capabilities":["Create company research signals by domain, including synchronous and asynchronous modes","List, get, batch, and manage company signals","Create and manage reusable company signal templates","Schedule and manage recurring company signal subscriptions","Generate and list AI summaries across a domain's signals","Search companies and build, import, export, and manage company lists","Research contacts, find verified emails, and search contacts via LinkedIn Sales Navigator","Create contact research signals by contact, including synchronous and asynchronous modes","Build and manage contact lists","Monitor market signals for job posts, LinkedIn posts, fundraising, recent investments, and IPOs"],"authentication":"Saber API key required","commonUseCases":["Research a company or contact before outreach","Automatically monitor funding, hiring, or LinkedIn activity for target accounts","Build and maintain lead or account lists from search and enrichment data","Create scoring workflows to prioritize leads or companies","Use a trigger to react to new market events as soon as Saber detects them"],"limitations":["Requires n8nNodesApiVersion 1","Tested against Saber Platform API v1","Synchronous research requests may need a timeout of up to 900 seconds for long-running jobs"],"relatedNodes":["Saber Trigger"]}


node_type: @mookielianhd/n8n-nodes-checkly.checklyTrigger
package_name: @mookielianhd/n8n-nodes-checkly
display_name: Checkly Trigger
description: Starts the workflow when Checkly sends a check alert
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: mookielian
author_github_url: https://github.com/MookieLian/n8n-nodes-checkly.git
npm_package_name: @mookielianhd/n8n-nodes-checkly
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.460Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  # @mookielianhd/n8n-nodes-checkly

  An [n8n](https://n8n.io) community node for [Checkly](https://www.checklyhq.com) — the synthetic monitoring and API checking platform. Manage checks, alert channels, dashboards and more, and trigger workflows when Checkly raises an alert.

  This package contains two nodes:

  - **Checkly** — a regular (action) node for the Checkly REST API.
  - **Checkly Trigger** — a webhook trigger that fires when a check fails, recovers, degrades, or an SSL certificate is expiring.

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

  ## Installation

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

  ## Credentials

  The nodes authenticate with a Checkly API key and your account ID.

  1. **API Key** — create a User or Service API key in Checkly under **User Settings → API keys** (or **Account Settings → API keys** for a service key).
  2. **Account ID** — copy it from **Account Settings → General**.

  Both values are sent on every request (`Authorization: Bearer <API Key>` and `X-Checkly-Account: <Account ID>`). Use the **Test** button on the credential to confirm they are valid.

  ## Operations

  The **Checkly** node supports the following resources and operations:

  | Resource | Operations |
  | --- | --- |
  | Check | Create (API / Browser), Get, Get Many, Update, Delete |
  | Check Group | Create, Get, Get Many, Update, Delete |
  | Check Result | Get, Get Many |
  | Check Status | Get, Get Many |
  | Alert Channel | Create, Get, Get Many, Delete, Subscribe |
  | Dashboard | Create, Get, Get Many, Update, Delete |
  | Snippet | Create, Get, Get Many, Update, Delete |
  | Environment Variable | Create, Get, Get Many, Update, Delete |
  | Maintenance Window | Create, Get, Get Many, Update, Delete |
  | Location | Get Many |
  | Runtime | Get, Get Many |

  Create and update operations expose the most common fields directly. For anything else the API
  accepts, use the **Additional Body Fields (JSON)** input (or, for alert channels, the **Config (JSON)**
  field) to supply the raw payload. See the [Checkly API reference](https://www.checklyhq.com/docs/api-reference/).

  ## Trigger

  The **Checkly Trigger** node listens for Checkly alerts via a webhook.

  When you activate a workflow containing this node, it automatically creates a **webhook alert channel**
  in your Checkly account pointing at the n8n webhook URL, and subscribes it according to the **Subscribe To**
  setting. When the workflow is deactivated, the alert channel is removed again.

  - **All Checks** — subscribes every existing check and auto-subscribes any checks created later.
  - **Specific Check** / **Specific Check Group** — subscribes only the selected check or group.

  Subscriptions are created via Checkly's dedicated subscriptions endpoint after the channel is made, so
  re-publishing the workflow re-applies them.

  - **Events** — choose which events fire the workflow (failed, recovered, degraded, SSL expiring).
  - **Verify Signature** — when enabled, requests whose `x-checkly-signature` header does not match the
    generated secret are rejected.

  ## Compatibility

  - Requires n8n with `n8nNodesApiVersion` 1.
  - Built and tested against the Checkly public API v1 (`https://api.checklyhq.com`).

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Checkly API reference](https://www.checklyhq.com/docs/api-reference/overview/)
  - [Checkly webhook alerting](https://www.checklyhq.com/docs/alerting-and-retries/webhooks/)

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when Checkly sends a check alert. The package also includes a separate action node for managing Checkly resources via the REST API.","capabilities":["Triggers workflows on Checkly alert events such as failed, recovered, degraded, and SSL expiring","Automatically creates and removes a webhook alert channel in Checkly when the workflow is activated or deactivated","Supports subscription scopes for all checks, a specific check, or a specific check group","Can verify incoming webhook signatures using the x-checkly-signature header","Provides Checkly REST API actions for checks, check groups, check results, check status, alert channels, dashboards, snippets, environment variables, maintenance windows, locations, and runtimes","Supports CRUD operations for many Checkly resources","Supports raw JSON payload fields for advanced API parameters"],"authentication":"Checkly API key and Account ID are required. The API key is sent as Authorization: Bearer <API Key> and the account ID as X-Checkly-Account: <Account ID>.","commonUseCases":["Alerting workflow automation when a Checkly check fails or recovers","Routing Checkly incidents to internal tools, chat apps, or ticketing systems","Managing Checkly checks, dashboards, alert channels, and related resources from n8n","Automating maintenance window or environment variable management in Checkly"],"limitations":["Requires n8nNodesApiVersion 1","Built and tested against Checkly public API v1 only","Some create and update fields are limited to common fields; other API parameters must be provided in raw JSON input"],"relatedNodes":["Checkly"]}


node_type: @mookielianhd/n8n-nodes-checkly.checkly
package_name: @mookielianhd/n8n-nodes-checkly
display_name: Checkly
description: Manage checks, alerts and monitoring resources in Checkly
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: mookielian
author_github_url: https://github.com/MookieLian/n8n-nodes-checkly.git
npm_package_name: @mookielianhd/n8n-nodes-checkly
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.461Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "check",
      "options": [
        {
          "name": "Alert Channel",
          "value": "alertChannel"
        },
        {
          "name": "Check",
          "value": "check"
        },
        {
          "name": "Check Group",
          "value": "checkGroup"
        },
        {
          "name": "Check Result",
          "value": "checkResult"
        },
        {
          "name": "Check Status",
          "value": "checkStatus"
        },
        {
          "name": "Dashboard",
          "value": "dashboard"
        },
        {
          "name": "Environment Variable",
          "value": "environmentVariable"
        },
        {
          "name": "Location",
          "value": "location"
        },
        {
          "name": "Maintenance Window",
          "value": "maintenanceWindow"
        },
        {
          "name": "Runtime",
          "value": "runtime"
        },
        {
          "name": "Snippet",
          "value": "snippet"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a check",
          "routing": {
            "send": {
              "preSend": [
                null,
                null
              ]
            },
            "request": {
              "url": "=/v1/checks/{{ $parameter.checkType === \"BROWSER\" ? \"browser\" : \"api\" }}",
              "method": "POST"
            }
          },
          "description": "Create a new API or Browser check"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a check",
          "routing": {
            "request": {
              "url": "=/v1/checks/{{ $parameter.checkId }}",
              "method": "DELETE"
            }
          },
          "description": "Delete a check"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a check",
          "routing": {
            "request": {
              "url": "=/v1/checks/{{ $parameter.checkId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single check by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many checks",
          "routing": {
            "request": {
              "url": "/v1/checks",
              "method": "GET"
            }
          },
          "description": "List checks in the account"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a check",
          "routing": {
            "send": {
              "preSend": [
                null,
                null
              ]
            },
            "request": {
              "url": "=/v1/checks/{{ $parameter.checkType === \"BROWSER\" ? \"browser\" : \"api\" }}/{{ $parameter.checkId }}",
              "method": "PUT"
            }
          },
          "description": "Update an existing API or Browser check"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "check"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a check group",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/check-groups",
              "method": "POST"
            }
          },
          "description": "Create a new check group"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a check group",
          "routing": {
            "request": {
              "url": "=/v1/check-groups/{{ $parameter.groupId }}",
              "method": "DELETE"
            }
          },
          "description": "Delete a check group"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a check group",
          "routing": {
            "request": {
              "url": "=/v1/check-groups/{{ $parameter.groupId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single check group by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many check groups",
          "routing": {
            "request": {
              "url": "/v1/check-groups",
              "method": "GET"
            }
          },
          "description": "List check groups in the account"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a check group",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "=/v1/check-groups/{{ $parameter.groupId }}",
              "method": "PUT"
            }
          },
          "description": "Update an existing check group"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "checkGroup"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a check result",
          "routing": {
            "request": {
              "url": "=/v1/check-results/{{ $parameter.checkId }}/{{ $parameter.checkResultId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single check result by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many check results",
          "routing": {
            "request": {
              "url": "=/v1/check-results/{{ $parameter.checkId }}",
              "method": "GET"
            }
          },
          "description": "List results for a check"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "checkResult"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a check status",
          "routing": {
            "request": {
              "url": "=/v1/check-statuses/{{ $parameter.checkId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve the current status of a single check"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many check statuses",
          "routing": {
            "request": {
              "url": "/v1/check-statuses",
              "method": "GET"
            }
          },
          "description": "List the current status of many checks"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "checkStatus"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an alert channel",
          "routing": {
            "request": {
              "url": "/v1/alert-channels",
              "method": "POST"
            }
          },
          "description": "Create a new alert channel"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an alert channel",
          "routing": {
            "request": {
              "url": "=/v1/alert-channels/{{ $parameter.alertChannelId }}",
              "method": "DELETE"
            }
          },
          "description": "Delete an alert channel"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an alert channel",
          "routing": {
            "request": {
              "url": "=/v1/alert-channels/{{ $parameter.alertChannelId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single alert channel by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many alert channels",
          "routing": {
            "request": {
              "url": "/v1/alert-channels",
              "method": "GET"
            }
          },
          "description": "List alert channels in the account"
        },
        {
          "name": "Subscribe",
          "value": "subscribe",
          "action": "Subscribe a check or group to an alert channel",
          "routing": {
            "request": {
              "url": "=/v1/alert-channels/{{ $parameter.alertChannelId }}/subscriptions",
              "method": "PUT"
            }
          },
          "description": "Attach a check or check group to an alert channel"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "alertChannel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a dashboard",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/dashboards",
              "method": "POST"
            }
          },
          "description": "Create a new dashboard"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a dashboard",
          "routing": {
            "request": {
              "url": "=/v1/dashboards/{{ $parameter.dashboardId }}",
              "method": "DELETE"
            }
          },
          "description": "Delete a dashboard"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a dashboard",
          "routing": {
            "request": {
              "url": "=/v1/dashboards/{{ $parameter.dashboardId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single dashboard by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many dashboards",
          "routing": {
            "request": {
              "url": "/v1/dashboards",
              "method": "GET"
            }
          },
          "description": "List dashboards in the account"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a dashboard",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "=/v1/dashboards/{{ $parameter.dashboardId }}",
              "method": "PUT"
            }
          },
          "description": "Update an existing dashboard"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dashboard"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a snippet",
          "routing": {
            "request": {
              "url": "/v1/snippets",
              "method": "POST"
            }
          },
          "description": "Create a new snippet"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a snippet",
          "routing": {
            "request": {
              "url": "=/v1/snippets/{{ $parameter.snippetId }}",
              "method": "DELETE"
            }
          },
          "description": "Delete a snippet"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a snippet",
          "routing": {
            "request": {
              "url": "=/v1/snippets/{{ $parameter.snippetId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single snippet by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many snippets",
          "routing": {
            "request": {
              "url": "/v1/snippets",
              "method": "GET"
            }
          },
          "description": "List snippets in the account"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a snippet",
          "routing": {
            "request": {
              "url": "=/v1/snippets/{{ $parameter.snippetId }}",
              "method": "PUT"
            }
          },
          "description": "Update an existing snippet"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "snippet"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an environment variable",
          "routing": {
            "request": {
              "url": "/v1/variables",
              "method": "POST"
            }
          },
          "description": "Create a new global environment variable"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an environment variable",
          "routing": {
            "request": {
              "url": "=/v1/variables/{{ encodeURIComponent($parameter.key) }}",
              "method": "DELETE"
            }
          },
          "description": "Delete an environment variable"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an environment variable",
          "routing": {
            "request": {
              "url": "=/v1/variables/{{ encodeURIComponent($parameter.key) }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single environment variable by key"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many environment variables",
          "routing": {
            "request": {
              "url": "/v1/variables",
              "method": "GET"
            }
          },
          "description": "List global environment variables"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an environment variable",
          "routing": {
            "request": {
              "url": "=/v1/variables/{{ encodeURIComponent($parameter.key) }}",
              "method": "PUT"
            }
          },
          "description": "Update an existing environment variable"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "environmentVariable"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a maintenance window",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/maintenance-windows",
              "method": "POST"
            }
          },
          "description": "Create a new maintenance window"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a maintenance window",
          "routing": {
            "request": {
              "url": "=/v1/maintenance-windows/{{ $parameter.windowId }}",
              "method": "DELETE"
            }
          },
          "description": "Delete a maintenance window"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a maintenance window",
          "routing": {
            "request": {
              "url": "=/v1/maintenance-windows/{{ $parameter.windowId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single maintenance window by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many maintenance windows",
          "routing": {
            "request": {
              "url": "/v1/maintenance-windows",
              "method": "GET"
            }
          },
          "description": "List maintenance windows in the account"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a maintenance window",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "=/v1/maintenance-windows/{{ $parameter.windowId }}",
              "method": "PUT"
            }
          },
          "description": "Update an existing maintenance window"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "maintenanceWindow"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many locations",
          "routing": {
            "request": {
              "url": "/v1/locations",
              "method": "GET"
            }
          },
          "description": "List many available public checking locations"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "location"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a runtime",
          "routing": {
            "request": {
              "url": "=/v1/runtimes/{{ $parameter.runtimeId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve a single runtime by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many runtimes",
          "routing": {
            "request": {
              "url": "/v1/runtimes",
              "method": "GET"
            }
          },
          "description": "List many available runtimes"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "runtime"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a check",
      "routing": {
        "send": {
          "preSend": [
            null,
            null
          ]
        },
        "request": {
          "url": "=/v1/checks/{{ $parameter.checkType === \"BROWSER\" ? \"browser\" : \"api\" }}",
          "method": "POST"
        }
      },
      "description": "Create a new API or Browser check",
      "resource": "check"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a check",
      "routing": {
        "request": {
          "url": "=/v1/checks/{{ $parameter.checkId }}",
          "method": "DELETE"
        }
      },
      "description": "Delete a check",
      "resource": "check"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a check",
      "routing": {
        "request": {
          "url": "=/v1/checks/{{ $parameter.checkId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single check by ID",
      "resource": "check"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many checks",
      "routing": {
        "request": {
          "url": "/v1/checks",
          "method": "GET"
        }
      },
      "description": "List checks in the account",
      "resource": "check"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a check",
      "routing": {
        "send": {
          "preSend": [
            null,
            null
          ]
        },
        "request": {
          "url": "=/v1/checks/{{ $parameter.checkType === \"BROWSER\" ? \"browser\" : \"api\" }}/{{ $parameter.checkId }}",
          "method": "PUT"
        }
      },
      "description": "Update an existing API or Browser check",
      "resource": "check"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a check group",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/check-groups",
          "method": "POST"
        }
      },
      "description": "Create a new check group",
      "resource": "checkGroup"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a check group",
      "routing": {
        "request": {
          "url": "=/v1/check-groups/{{ $parameter.groupId }}",
          "method": "DELETE"
        }
      },
      "description": "Delete a check group",
      "resource": "checkGroup"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a check group",
      "routing": {
        "request": {
          "url": "=/v1/check-groups/{{ $parameter.groupId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single check group by ID",
      "resource": "checkGroup"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many check groups",
      "routing": {
        "request": {
          "url": "/v1/check-groups",
          "method": "GET"
        }
      },
      "description": "List check groups in the account",
      "resource": "checkGroup"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a check group",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "=/v1/check-groups/{{ $parameter.groupId }}",
          "method": "PUT"
        }
      },
      "description": "Update an existing check group",
      "resource": "checkGroup"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a check result",
      "routing": {
        "request": {
          "url": "=/v1/check-results/{{ $parameter.checkId }}/{{ $parameter.checkResultId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single check result by ID",
      "resource": "checkResult"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many check results",
      "routing": {
        "request": {
          "url": "=/v1/check-results/{{ $parameter.checkId }}",
          "method": "GET"
        }
      },
      "description": "List results for a check",
      "resource": "checkResult"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a check status",
      "routing": {
        "request": {
          "url": "=/v1/check-statuses/{{ $parameter.checkId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve the current status of a single check",
      "resource": "checkStatus"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many check statuses",
      "routing": {
        "request": {
          "url": "/v1/check-statuses",
          "method": "GET"
        }
      },
      "description": "List the current status of many checks",
      "resource": "checkStatus"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an alert channel",
      "routing": {
        "request": {
          "url": "/v1/alert-channels",
          "method": "POST"
        }
      },
      "description": "Create a new alert channel",
      "resource": "alertChannel"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an alert channel",
      "routing": {
        "request": {
          "url": "=/v1/alert-channels/{{ $parameter.alertChannelId }}",
          "method": "DELETE"
        }
      },
      "description": "Delete an alert channel",
      "resource": "alertChannel"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an alert channel",
      "routing": {
        "request": {
          "url": "=/v1/alert-channels/{{ $parameter.alertChannelId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single alert channel by ID",
      "resource": "alertChannel"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many alert channels",
      "routing": {
        "request": {
          "url": "/v1/alert-channels",
          "method": "GET"
        }
      },
      "description": "List alert channels in the account",
      "resource": "alertChannel"
    },
    {
      "name": "Subscribe",
      "value": "subscribe",
      "action": "Subscribe a check or group to an alert channel",
      "routing": {
        "request": {
          "url": "=/v1/alert-channels/{{ $parameter.alertChannelId }}/subscriptions",
          "method": "PUT"
        }
      },
      "description": "Attach a check or check group to an alert channel",
      "resource": "alertChannel"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a dashboard",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/dashboards",
          "method": "POST"
        }
      },
      "description": "Create a new dashboard",
      "resource": "dashboard"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a dashboard",
      "routing": {
        "request": {
          "url": "=/v1/dashboards/{{ $parameter.dashboardId }}",
          "method": "DELETE"
        }
      },
      "description": "Delete a dashboard",
      "resource": "dashboard"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a dashboard",
      "routing": {
        "request": {
          "url": "=/v1/dashboards/{{ $parameter.dashboardId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single dashboard by ID",
      "resource": "dashboard"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many dashboards",
      "routing": {
        "request": {
          "url": "/v1/dashboards",
          "method": "GET"
        }
      },
      "description": "List dashboards in the account",
      "resource": "dashboard"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a dashboard",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "=/v1/dashboards/{{ $parameter.dashboardId }}",
          "method": "PUT"
        }
      },
      "description": "Update an existing dashboard",
      "resource": "dashboard"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a snippet",
      "routing": {
        "request": {
          "url": "/v1/snippets",
          "method": "POST"
        }
      },
      "description": "Create a new snippet",
      "resource": "snippet"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a snippet",
      "routing": {
        "request": {
          "url": "=/v1/snippets/{{ $parameter.snippetId }}",
          "method": "DELETE"
        }
      },
      "description": "Delete a snippet",
      "resource": "snippet"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a snippet",
      "routing": {
        "request": {
          "url": "=/v1/snippets/{{ $parameter.snippetId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single snippet by ID",
      "resource": "snippet"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many snippets",
      "routing": {
        "request": {
          "url": "/v1/snippets",
          "method": "GET"
        }
      },
      "description": "List snippets in the account",
      "resource": "snippet"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a snippet",
      "routing": {
        "request": {
          "url": "=/v1/snippets/{{ $parameter.snippetId }}",
          "method": "PUT"
        }
      },
      "description": "Update an existing snippet",
      "resource": "snippet"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an environment variable",
      "routing": {
        "request": {
          "url": "/v1/variables",
          "method": "POST"
        }
      },
      "description": "Create a new global environment variable",
      "resource": "environmentVariable"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an environment variable",
      "routing": {
        "request": {
          "url": "=/v1/variables/{{ encodeURIComponent($parameter.key) }}",
          "method": "DELETE"
        }
      },
      "description": "Delete an environment variable",
      "resource": "environmentVariable"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an environment variable",
      "routing": {
        "request": {
          "url": "=/v1/variables/{{ encodeURIComponent($parameter.key) }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single environment variable by key",
      "resource": "environmentVariable"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many environment variables",
      "routing": {
        "request": {
          "url": "/v1/variables",
          "method": "GET"
        }
      },
      "description": "List global environment variables",
      "resource": "environmentVariable"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an environment variable",
      "routing": {
        "request": {
          "url": "=/v1/variables/{{ encodeURIComponent($parameter.key) }}",
          "method": "PUT"
        }
      },
      "description": "Update an existing environment variable",
      "resource": "environmentVariable"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a maintenance window",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/maintenance-windows",
          "method": "POST"
        }
      },
      "description": "Create a new maintenance window",
      "resource": "maintenanceWindow"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a maintenance window",
      "routing": {
        "request": {
          "url": "=/v1/maintenance-windows/{{ $parameter.windowId }}",
          "method": "DELETE"
        }
      },
      "description": "Delete a maintenance window",
      "resource": "maintenanceWindow"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a maintenance window",
      "routing": {
        "request": {
          "url": "=/v1/maintenance-windows/{{ $parameter.windowId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single maintenance window by ID",
      "resource": "maintenanceWindow"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many maintenance windows",
      "routing": {
        "request": {
          "url": "/v1/maintenance-windows",
          "method": "GET"
        }
      },
      "description": "List maintenance windows in the account",
      "resource": "maintenanceWindow"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a maintenance window",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "=/v1/maintenance-windows/{{ $parameter.windowId }}",
          "method": "PUT"
        }
      },
      "description": "Update an existing maintenance window",
      "resource": "maintenanceWindow"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many locations",
      "routing": {
        "request": {
          "url": "/v1/locations",
          "method": "GET"
        }
      },
      "description": "List many available public checking locations",
      "resource": "location"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a runtime",
      "routing": {
        "request": {
          "url": "=/v1/runtimes/{{ $parameter.runtimeId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve a single runtime by ID",
      "resource": "runtime"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many runtimes",
      "routing": {
        "request": {
          "url": "/v1/runtimes",
          "method": "GET"
        }
      },
      "description": "List many available runtimes",
      "resource": "runtime"
    }
  ]

npm_readme:
  # @mookielianhd/n8n-nodes-checkly

  An [n8n](https://n8n.io) community node for [Checkly](https://www.checklyhq.com) — the synthetic monitoring and API checking platform. Manage checks, alert channels, dashboards and more, and trigger workflows when Checkly raises an alert.

  This package contains two nodes:

  - **Checkly** — a regular (action) node for the Checkly REST API.
  - **Checkly Trigger** — a webhook trigger that fires when a check fails, recovers, degrades, or an SSL certificate is expiring.

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

  ## Installation

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

  ## Credentials

  The nodes authenticate with a Checkly API key and your account ID.

  1. **API Key** — create a User or Service API key in Checkly under **User Settings → API keys** (or **Account Settings → API keys** for a service key).
  2. **Account ID** — copy it from **Account Settings → General**.

  Both values are sent on every request (`Authorization: Bearer <API Key>` and `X-Checkly-Account: <Account ID>`). Use the **Test** button on the credential to confirm they are valid.

  ## Operations

  The **Checkly** node supports the following resources and operations:

  | Resource | Operations |
  | --- | --- |
  | Check | Create (API / Browser), Get, Get Many, Update, Delete |
  | Check Group | Create, Get, Get Many, Update, Delete |
  | Check Result | Get, Get Many |
  | Check Status | Get, Get Many |
  | Alert Channel | Create, Get, Get Many, Delete, Subscribe |
  | Dashboard | Create, Get, Get Many, Update, Delete |
  | Snippet | Create, Get, Get Many, Update, Delete |
  | Environment Variable | Create, Get, Get Many, Update, Delete |
  | Maintenance Window | Create, Get, Get Many, Update, Delete |
  | Location | Get Many |
  | Runtime | Get, Get Many |

  Create and update operations expose the most common fields directly. For anything else the API
  accepts, use the **Additional Body Fields (JSON)** input (or, for alert channels, the **Config (JSON)**
  field) to supply the raw payload. See the [Checkly API reference](https://www.checklyhq.com/docs/api-reference/).

  ## Trigger

  The **Checkly Trigger** node listens for Checkly alerts via a webhook.

  When you activate a workflow containing this node, it automatically creates a **webhook alert channel**
  in your Checkly account pointing at the n8n webhook URL, and subscribes it according to the **Subscribe To**
  setting. When the workflow is deactivated, the alert channel is removed again.

  - **All Checks** — subscribes every existing check and auto-subscribes any checks created later.
  - **Specific Check** / **Specific Check Group** — subscribes only the selected check or group.

  Subscriptions are created via Checkly's dedicated subscriptions endpoint after the channel is made, so
  re-publishing the workflow re-applies them.

  - **Events** — choose which events fire the workflow (failed, recovered, degraded, SSL expiring).
  - **Verify Signature** — when enabled, requests whose `x-checkly-signature` header does not match the
    generated secret are rejected.

  ## Compatibility

  - Requires n8n with `n8nNodesApiVersion` 1.
  - Built and tested against the Checkly public API v1 (`https://api.checklyhq.com`).

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Checkly API reference](https://www.checklyhq.com/docs/api-reference/overview/)
  - [Checkly webhook alerting](https://www.checklyhq.com/docs/alerting-and-retries/webhooks/)

ai_documentation_summary:
  {"purpose":"A community n8n node for managing Checkly synthetic monitoring resources through the Checkly REST API, including checks, alert channels, dashboards, and related configuration. It also includes a trigger node that starts workflows when Checkly alert events occur.","capabilities":["Create, get, list, update, and delete checks (API and browser)","Manage check groups, check results, and check statuses","Create, get, list, delete, and subscribe alert channels","Create, get, list, update, and delete dashboards, snippets, environment variables, and maintenance windows","List locations and runtimes","Trigger workflows on Checkly events such as check failure, recovery, degradation, and SSL certificate expiring","Optionally verify webhook signatures for trigger security","Send raw JSON payloads for advanced API fields via Additional Body Fields or Config (JSON)"],"authentication":"Checkly API key plus Account ID; requests use Authorization: Bearer <API Key> and X-Checkly-Account: <Account ID>","commonUseCases":["Provision and maintain Checkly monitoring checks and check groups from workflows","Automate alert channel setup and subscription management","Sync dashboards, environment variables, snippets, and maintenance windows from n8n","Trigger automated workflows when Checkly detects outages or SSL issues","Monitor check outcomes and status history through API retrieval operations"],"limitations":["Advanced request fields not exposed directly must be provided as raw JSON","Trigger subscriptions are managed only when the workflow is activated or republished","Requires n8nNodesApiVersion 1","Built and tested against Checkly public API v1 only"],"relatedNodes":["n8n Webhook Trigger","n8n HTTP Request","Checkly Trigger"]}


node_type: n8n-nodes-aidenix.aidenix
package_name: n8n-nodes-aidenix
display_name: Aidenix
description: Evaluate business fit and generate outreach with Aidenix AI
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: aidenix
author_github_url: https://github.com/RosExpert/
npm_package_name: n8n-nodes-aidenix
npm_version: 0.1.15
community_fetched_at: 2026-07-14T14:40:34.462Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "businessFit",
      "options": [
        {
          "name": "Business Fit",
          "value": "businessFit",
          "action": "Evaluate business fit for a contact",
          "description": "Evaluate ICP fit for a contact and generate personalized outreach"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Business Fit",
      "value": "businessFit",
      "action": "Evaluate business fit for a contact",
      "description": "Evaluate ICP fit for a contact and generate personalized outreach"
    }
  ]

npm_readme:
  # n8n-nodes-aidenix

  [![npm version](https://img.shields.io/npm/v/n8n-nodes-aidenix.svg)](https://www.npmjs.com/package/n8n-nodes-aidenix)
  [![npm downloads](https://img.shields.io/npm/dm/n8n-nodes-aidenix.svg)](https://www.npmjs.com/package/n8n-nodes-aidenix)
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE.md)

  An [n8n](https://n8n.io) community node for [Aidenix](https://aidenix.com) — score each lead against your ICP and write a personalized first email and LinkedIn message, in your brand's voice, from real research, in a single workflow step.

  Drop in a LinkedIn slug or an email address. Aidenix researches the person across many data sources, scores fit against your ICP, and writes a first message that sounds like you wrote it for that one person — not a template with a name swapped in.

  ![Aidenix node — input parameters and the flat output it produces](./docs/screenshot1.png)

  ---

  ## Table of contents

  - [Why Aidenix](#why-aidenix)
  - [Features](#features)
  - [Prerequisites](#prerequisites)
  - [Installation](#installation)
  - [Credentials](#credentials)
  - [Quick start](#quick-start)
  - [Operations](#operations)
  - [Response schema](#response-schema)
  - [Common workflow patterns](#common-workflow-patterns)
  - [Error handling](#error-handling)
  - [Idempotency & retries](#idempotency--retries)
  - [Troubleshooting](#troubleshooting)
  - [Compatibility](#compatibility)
  - [Resources & support](#resources--support)
  - [License](#license)

  ---

  ## Why Aidenix

  Real personalization is the hard part of outbound, and a single merge tag doesn't deliver it. A name and a title dropped into a template reads as mass-produced, and prospects ignore it.

  Aidenix does the whole job in one node: it researches each lead across many data sources, scores fit against your ICP, and writes the first message in your brand's voice — composed from your own positioning and the lead's real context, not a snippet pasted into a template. You keep your sending tool and your strategy; Aidenix produces the message.

  - **Input**: `jane@acme.com` or `jane-doe-12345`
  - **Output**: fit score, person/company context, subject line, email body, LinkedIn DM, plus reasoning and Do/Don't guidance

  Open and licensed sources only — no traded PII, safe under GDPR and CCPA.

  Use it when you want genuinely personal first touches at scale, without building the research-and-writing pipeline yourself.

  ## Features

  - **Business Fit** — pass a LinkedIn slug or email; get an ICP fit score (0–100), a researched person summary, and a ready-to-send email + LinkedIn message written in your brand's voice.
  - **Built-in idempotency** — deterministic `Idempotency-Key` per item, so retried executions reuse the cached server response instead of paying for a duplicate AI run.
  - **Automatic retry** on `409 in_progress` (still computing) and `504 timeout`, with configurable backoff.
  - **Standard n8n error handling** via `NodeApiError`, with full **Continue On Fail** support.
  - **HTTPS-only by default**, with a runtime warning if a non-loopback Base URL is configured over plain HTTP.

  ## Prerequisites

  - An n8n instance (Cloud or self-hosted), **n8n v1.0+ recommended**.
  - An Aidenix account and an API token — see [Getting an API token](#getting-an-api-token).
  - For self-hosted n8n: Node.js **18.10+** (this matches n8n's own engine requirement).

  ## Installation

  ### n8n Cloud / self-hosted UI

  1. Open **Settings → Community Nodes**.
  2. Click **Install a community node**.
  3. Enter the package name:
     ```
     n8n-nodes-aidenix
     ```
  4. Accept the risk prompt and click **Install**.

  The Aidenix node appears in the node picker as **Aidenix**.

  ### Manual install (self-hosted, advanced)

  ```bash
  cd ~/.n8n/custom   # create if missing
  npm install n8n-nodes-aidenix
  # restart n8n
  ```

  ## Credentials

  ### Getting an API token

  1. Sign up or log in at [aidenix.com](https://aidenix.com).
  2. Open your **Profile → API Tokens**.
  3. Click **Generate token**, copy the value (it's shown only once — store it somewhere safe).
  4. In n8n, create a new **Aidenix API** credential and paste the token into the **API Token** field.

  ### Credential fields

  | Field      | Required | Default                  | Description                                                                                   |
  | ---------- | -------- | ------------------------ | --------------------------------------------------------------------------------------------- |
  | API Token  | Yes      | —                        | Token issued in the Aidenix dashboard. Stored encrypted by n8n; sent as `X-API-Token` header. |
  | Base URL   | No       | `https://api.aidenix.com` | Override only for dedicated tenants or self-hosted Aidenix.                                   |

  > **Security note:** the node refuses to log the token and warns if Base URL is plain HTTP to a non-loopback host. Keep Base URL on `https://` in all real environments.

  ## Quick start

  A minimal "score-and-send" workflow:

  1. Add a **Schedule Trigger** (or any trigger producing leads).
  2. Add a **Google Sheets / Airtable** node to read a list of leads — each row should have an `email` (or `linkedin_slug`) column.
  3. Add the **Aidenix** node:
     - **Operation**: `Business Fit`
     - **Query**: `={{ $json.email }}`
     - Leave **Options** at their defaults.
  4. Add an **IF** node:
     - Condition: `={{ $json.fit_score_pct }}` ≥ `70`
  5. On the `true` branch, add **Gmail / Outlook** with:
     - Subject: `={{ $json.email_subject }}`
     - Body: `={{ $json.email_message }}`

  That's the whole pipeline. Idempotency is on by default — re-running a *failed execution* reuses the cached Aidenix response instead of paying for it twice. Running the workflow again on the same lead in a new execution is a fresh computation.

  ## Operations

  ### Business Fit

  Evaluates ICP fit for a contact and generates personalized outreach.

  | Parameter | Type   | Required | Description                                                                  |
  | --------- | ------ | -------- | ---------------------------------------------------------------------------- |
  | Query     | string | Yes      | LinkedIn slug (`jane-doe-12345`) **or** email (`jane@acme.com`). Auto-detected. |

  #### Options

  | Option                   | Default        | Description                                                                                                                                |
  | ------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
  | Idempotency Key Strategy | Deterministic  | `Deterministic` — UUID v5 from `workflowId + executionId + itemIndex + query`. Replays reuse the cached response. `Random` — new UUID v4 per item. `Custom` — supply your own. |
  | Idempotency Key          | —              | Only used when strategy is `Custom`. Useful when the key comes from an upstream node, e.g. `={{ $json.idempotency_key }}`.                  |
  | Max Retries (409 / 504)  | 10             | Retries when the API responds with `409 in_progress` or `504 timeout`.                                                                     |
  | Retry Delay (Ms)         | 5000           | Delay between retries.                                                                                                                     |

  ## Response schema

  The node returns a flat JSON object per input item:

  ```json
  {
    "job_id": "9f1c…",
    "status": "completed",
    "query": "jane-doe-12345",
    "fit_score_pct": 82,
    "person_description": "Jane — CTO at a fintech startup, ~50 engineers, recently raised Series B.",
    "email_subject": "Quick question about your payment flow",
    "email_message": "Hi Jane, …",
    "linkedin_message": "Hi Jane, …",
    "logic_explanation": [
      "Role matches ICP (technical decision-maker)",
      "Company at the right stage (post-Series B)"
    ],
    "strategy": "Practical, problem-first approach",
    "strategy_do": ["Mention the specific pain", "Be concrete about ROI"],
    "strategy_dont": ["Don't open with generic claims", "Don't reference unrelated case studies"]
  }
  ```

  All fields are safe to reference directly in downstream nodes via `={{ $json.field_name }}`.

  ## Common workflow patterns

  ### 1. Trigger → Score → Conditional send

  ![Workflow: Execute → Aidenix → IF → Gmail / No-op](./docs/screenshot2.png)

  ```
  Trigger ─▶ Aidenix (Business Fit) ─▶ IF (fit_score_pct ≥ 70) ─▶ Gmail (send)
                                                                    └▶ No-op (skip)
  ```

  Score every lead, send only to those above your threshold, drop the rest. Swap the manual trigger for a Schedule or Webhook in production.

  ### 2. Webhook → Real-time enrichment for CRM

  ```
  Webhook (CRM "new lead") ─▶ Aidenix ─▶ HTTP Request (PATCH /crm/leads/{{id}})
  ```

  Push fit score and personalized copy back into HubSpot / Pipedrive in seconds.

  ### 3. LinkedIn slug enrichment from form fills

  ```
  Typeform Trigger ─▶ Aidenix (Query = ={{ $json.linkedin_url | extractSlug }}) ─▶ Slack (#sales)
  ```

  Notify sales the moment a high-fit lead fills out a form.

  ## Error handling

  The node maps Aidenix's HTTP responses into n8n's standard error flow:

  | Code | Meaning                              | Node behavior                                                                  |
  | ---- | ------------------------------------ | ------------------------------------------------------------------------------ |
  | 200  | Success                              | Body returned as-is.                                                           |
  | 409  | `in_progress` — still computing      | **Auto-retry** with the same `Idempotency-Key`.                                |
  | 504  | Timeout                              | **Auto-retry** with the same `Idempotency-Key`.                                |
  | 422  | Body mismatch on a reused key        | Raised as `NodeApiError`.                                                       |
  | 451  | Contact opted out / unavailable      | Raised as `NodeApiError`.                                                       |
  | 402  | Quota exhausted                      | Raised as `NodeApiError`. Top up in the Aidenix dashboard.                      |
  | 401  | Invalid or revoked token             | Raised as `NodeApiError`. Re-issue the token.                                   |

  Enable **Continue On Fail** on the node to push errored items into the success branch as `{ error, query, idempotencyKey }` — useful for partial-success batch workflows.

  ## Idempotency & retries

  The Aidenix API uses `Idempotency-Key` to deduplicate expensive AI runs. By default this node generates a deterministic key from `workflowId:executionId:itemIndex:query`, which means:

  - **Re-running a failed execution** reuses the previously-computed result for free.
  - **Running the same workflow on the same lead in a new execution** generates a *new* key — you'll get a fresh computation. This is usually what you want, since context (your ICP definition) may have changed.

  To force a single deterministic key across executions (e.g. "score this lead once per day, regardless of how many times the workflow fires"), switch the strategy to **Custom** and supply your own:

  ```
  ={{ $json.email + ':' + $now.format('yyyy-MM-dd') }}
  ```

  ## Troubleshooting

  **The node returns `409 in_progress` even after all retries.**
  Increase **Max Retries** or **Retry Delay** in the node options. Large batches can occasionally exceed the default 10×5s window during peak load.

  **`402 quota_exhausted`.**
  Your plan has run out of credits — top up in the Aidenix dashboard. The node will surface this immediately rather than silently degrading.

  **`401 unauthorized` after rotating the token.**
  n8n credentials cache. Re-open the credential in n8n, paste the new token, save.

  **The score looks wrong / outreach feels generic.**
  Open a ticket at [aidenix.com](https://aidenix.com) — fit scoring is tied to your account's ICP definition, which is configured outside n8n.

  **Base URL warning in execution logs.**
  You've set Base URL to a non-loopback `http://` host. Switch to `https://` — the warning means the API token is being sent in cleartext.

  ## Compatibility

  - **n8n**: tested on 1.x. Uses the v1 `INodeType` API.
  - **Node.js**: 18.10+ (matches n8n's `engines` requirement).
  - **Aidenix API**: this package is maintained alongside the API by the Aidenix team — versions are kept compatible.

  ## Resources & support

  - **Aidenix** — [aidenix.com](https://aidenix.com)
  - **API docs** — [aidenix.com/api](https://aidenix.com/api)
  - **n8n community nodes guide** — [docs.n8n.io/integrations/community-nodes](https://docs.n8n.io/integrations/community-nodes/)
  - **Issues & feature requests** — [GitHub issues](https://github.com/aidenixai/n8n-nodes-aidenix/issues)
  - **Email** — [info@aidenix.com](mailto:info@aidenix.com)

  ## License

  [MIT](./LICENSE.md) © Aidenix

ai_documentation_summary:
  {"purpose":"Evaluates a lead's business fit against your ICP and generates personalized outreach messages in your brand voice from researched context. It can take a LinkedIn slug or email address and return a fit score plus email/LinkedIn copy in one workflow step.","capabilities":["Score a lead against an ICP with a fit score from 0 to 100","Research person and company context from open/licensed data sources","Generate a personalized first email subject and body","Generate a personalized LinkedIn DM","Provide reasoning plus Do/Don't guidance for outreach","Built-in idempotency to reuse cached responses on retries","Automatic retry handling for 409 in_progress and 504 timeout responses","Continue On Fail support with standard n8n error handling"],"authentication":"API token required via Aidenix API credential; token is sent as the X-API-Token header. Base URL is optional, defaulting to https://api.aidenix.com.","commonUseCases":["Qualify outbound leads before sending outreach","Generate personalized first-touch email and LinkedIn messages at scale","Prioritize high-fit prospects in a lead list","Automate research-backed sales outreach from Google Sheets, Airtable, or other lead sources"],"limitations":["Only one operation is documented in the README: Business Fit","Input appears limited to a LinkedIn slug or email address","HTTPS is expected by default; plain HTTP to non-loopback hosts triggers a warning"],"relatedNodes":["Schedule Trigger","Google Sheets","Airtable","IF","Gmail"]}


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

updated_at: 2026-07-14 14:40:34
author_name: shivam-nayak
author_github_url: https://github.com/declaw-ai/
npm_package_name: n8n-nodes-declaw
npm_version: 0.2.4
community_fetched_at: 2026-07-14T14:40:34.463Z
ai_summary_generated_at: 2026-06-26 10:29:17
description:
  Run code securely in Firecracker microVM sandboxes — create sandboxes, execute commands, manage files

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "sandbox",
      "options": [
        {
          "name": "Code Interpreter",
          "value": "code"
        },
        {
          "name": "Command",
          "value": "command"
        },
        {
          "name": "File",
          "value": "file"
        },
        {
          "name": "Sandbox",
          "value": "sandbox"
        },
        {
          "name": "Snapshot",
          "value": "snapshot"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "execute",
      "options": [
        {
          "name": "Execute",
          "value": "execute",
          "action": "Execute code in a sandbox",
          "description": "Run Python or JavaScript code in a secure Firecracker microVM sandbox"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "code"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a sandbox",
          "description": "Create a new Firecracker microVM sandbox"
        },
        {
          "name": "Get Info",
          "value": "get",
          "action": "Get sandbox info",
          "description": "Get details of a sandbox"
        },
        {
          "name": "Kill",
          "value": "kill",
          "action": "Kill a sandbox",
          "description": "Destroy a sandbox"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List sandboxes",
          "description": "List all sandboxes"
        },
        {
          "name": "Pause",
          "value": "pause",
          "action": "Pause a sandbox",
          "description": "Pause (freeze) a running sandbox"
        },
        {
          "name": "Resume",
          "value": "resume",
          "action": "Resume a sandbox",
          "description": "Resume a paused sandbox"
        },
        {
          "name": "Set Timeout",
          "value": "setTimeout",
          "action": "Set sandbox timeout",
          "description": "Update the auto-kill timeout of a sandbox"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sandbox"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "run",
      "options": [
        {
          "name": "Run",
          "value": "run",
          "action": "Run a command",
          "description": "Run a command and wait for it to complete"
        },
        {
          "name": "Run Background",
          "value": "runBackground",
          "action": "Run a background command",
          "description": "Start a command in the background and return its PID"
        },
        {
          "name": "List Processes",
          "value": "listProcesses",
          "action": "List processes",
          "description": "List background processes in the sandbox"
        },
        {
          "name": "Kill Process",
          "value": "killProcess",
          "action": "Kill a process",
          "description": "Kill a background process by PID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "command"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "read",
      "options": [
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a file",
          "description": "Delete a file or directory"
        },
        {
          "name": "Exists",
          "value": "exists",
          "action": "Check if path exists",
          "description": "Check if a file or directory exists"
        },
        {
          "name": "List Directory",
          "value": "listDirectory",
          "action": "List directory contents",
          "description": "List files and directories at a path"
        },
        {
          "name": "Make Directory",
          "value": "makeDirectory",
          "action": "Create a directory",
          "description": "Create a directory (with parents)"
        },
        {
          "name": "Read",
          "value": "read",
          "action": "Read a file",
          "description": "Read a text file from the sandbox"
        },
        {
          "name": "Read Binary",
          "value": "readBinary",
          "action": "Read a binary file",
          "description": "Read a binary file (image, archive, etc.) from the sandbox"
        },
        {
          "name": "Write",
          "value": "write",
          "action": "Write a file",
          "description": "Write text content to a file in the sandbox"
        },
        {
          "name": "Write Batch",
          "value": "writeBatch",
          "action": "Write multiple files",
          "description": "Write multiple files at once"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a snapshot",
          "description": "Create a snapshot of the sandbox state"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List snapshots",
          "description": "List all snapshots for a sandbox"
        },
        {
          "name": "Restore",
          "value": "restore",
          "action": "Restore from snapshot",
          "description": "Restore a sandbox from a snapshot"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a snapshot",
          "description": "Delete a snapshot"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "snapshot"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Execute",
      "value": "execute",
      "action": "Execute code in a sandbox",
      "description": "Run Python or JavaScript code in a secure Firecracker microVM sandbox",
      "resource": "code"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a sandbox",
      "description": "Create a new Firecracker microVM sandbox",
      "resource": "sandbox"
    },
    {
      "name": "Get Info",
      "value": "get",
      "action": "Get sandbox info",
      "description": "Get details of a sandbox",
      "resource": "sandbox"
    },
    {
      "name": "Kill",
      "value": "kill",
      "action": "Kill a sandbox",
      "description": "Destroy a sandbox",
      "resource": "sandbox"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List sandboxes",
      "description": "List all sandboxes",
      "resource": "sandbox"
    },
    {
      "name": "Pause",
      "value": "pause",
      "action": "Pause a sandbox",
      "description": "Pause (freeze) a running sandbox",
      "resource": "sandbox"
    },
    {
      "name": "Resume",
      "value": "resume",
      "action": "Resume a sandbox",
      "description": "Resume a paused sandbox",
      "resource": "sandbox"
    },
    {
      "name": "Set Timeout",
      "value": "setTimeout",
      "action": "Set sandbox timeout",
      "description": "Update the auto-kill timeout of a sandbox",
      "resource": "sandbox"
    },
    {
      "name": "Run",
      "value": "run",
      "action": "Run a command",
      "description": "Run a command and wait for it to complete",
      "resource": "command"
    },
    {
      "name": "Run Background",
      "value": "runBackground",
      "action": "Run a background command",
      "description": "Start a command in the background and return its PID",
      "resource": "command"
    },
    {
      "name": "List Processes",
      "value": "listProcesses",
      "action": "List processes",
      "description": "List background processes in the sandbox",
      "resource": "command"
    },
    {
      "name": "Kill Process",
      "value": "killProcess",
      "action": "Kill a process",
      "description": "Kill a background process by PID",
      "resource": "command"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a file",
      "description": "Delete a file or directory",
      "resource": "file"
    },
    {
      "name": "Exists",
      "value": "exists",
      "action": "Check if path exists",
      "description": "Check if a file or directory exists",
      "resource": "file"
    },
    {
      "name": "List Directory",
      "value": "listDirectory",
      "action": "List directory contents",
      "description": "List files and directories at a path",
      "resource": "file"
    },
    {
      "name": "Make Directory",
      "value": "makeDirectory",
      "action": "Create a directory",
      "description": "Create a directory (with parents)",
      "resource": "file"
    },
    {
      "name": "Read",
      "value": "read",
      "action": "Read a file",
      "description": "Read a text file from the sandbox",
      "resource": "file"
    },
    {
      "name": "Read Binary",
      "value": "readBinary",
      "action": "Read a binary file",
      "description": "Read a binary file (image, archive, etc.) from the sandbox",
      "resource": "file"
    },
    {
      "name": "Write",
      "value": "write",
      "action": "Write a file",
      "description": "Write text content to a file in the sandbox",
      "resource": "file"
    },
    {
      "name": "Write Batch",
      "value": "writeBatch",
      "action": "Write multiple files",
      "description": "Write multiple files at once",
      "resource": "file"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a snapshot",
      "description": "Create a snapshot of the sandbox state",
      "resource": "snapshot"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List snapshots",
      "description": "List all snapshots for a sandbox",
      "resource": "snapshot"
    },
    {
      "name": "Restore",
      "value": "restore",
      "action": "Restore from snapshot",
      "description": "Restore a sandbox from a snapshot",
      "resource": "snapshot"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a snapshot",
      "description": "Delete a snapshot",
      "resource": "snapshot"
    }
  ]

npm_readme:
  # n8n-nodes-declaw

  This is an [n8n](https://n8n.io/) community node for [Declaw](https://declaw.ai) — secure Firecracker microVM sandboxes for AI agents and code execution.

  Run untrusted code safely, manage files, and control sandbox lifecycles directly from your n8n workflows. Works as both a regular workflow node **and** as an AI Agent tool.

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

  ## Nodes

  This package provides two nodes:

  | Node | Purpose |
  |------|---------|
  | **Declaw Code Interpreter** | One-shot secure code execution. Paste Python or JavaScript code, get output. Handles sandbox lifecycle automatically. |
  | **Declaw** | Low-level API access. Full control over sandbox CRUD, commands, files, and snapshots for advanced workflows. |

  ## Installation

  ### Self-hosted n8n

  Go to **Settings > Community Nodes** and install:

  ```
  n8n-nodes-declaw
  ```

  Or via CLI:

  ```bash
  npm install n8n-nodes-declaw
  ```

  ### n8n Cloud

  Search for "Declaw" in the community nodes catalog.

  ## Credentials

  You need a Declaw API key. Get one at [declaw.ai](https://declaw.ai) or via the CLI:

  ```bash
  declaw auth login
  ```

  Configure the credential with:
  - **API Key**: Your `dcl_...` key
  - **API URL**: `https://api.declaw.ai` (default) or your self-hosted endpoint

  ## Declaw Code Interpreter

  The simplest way to run code securely. Paste code, get output — no sandbox management needed.

  ### Parameters

  | Parameter | Description |
  |-----------|-------------|
  | Language | Python or JavaScript |
  | Code | The code to execute in the sandbox |

  ### Additional Options

  | Option | Description |
  |--------|-------------|
  | Timeout | Execution timeout in seconds (default: 30) |
  | Environment Variables | Key-value pairs injected into the sandbox |
  | Additional Files | JSON array of `{path, data}` files to upload before execution |
  | Output Files | Comma-separated file paths to download after execution |
  | Enable PII Protection | Detect and redact sensitive data (SSN, credit cards, emails) |
  | Enable Injection Defense | Block prompt injection attacks |
  | Network Egress Allowlist | Restrict outbound access to specific domains |
  | Security Policy (JSON) | Raw JSON security policy for full control |

  ### Example

  ```
  [Webhook] -> [Declaw Code Interpreter (Python)] -> [Respond]
  ```

  The node automatically: creates a sandbox, writes your code, executes it, downloads output files, kills the sandbox, and returns `{stdout, stderr, exit_code, output_files}`.

  ### As an AI Agent Tool

  The Code Interpreter works as an AI Agent tool — an LLM agent can write and execute code securely without any manual sandbox wiring:

  ```
  [Chat Trigger] -> [AI Agent] -> (tool) [Declaw Code Interpreter Tool]
  ```

  To enable on self-hosted n8n:

  ```
  N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
  ```

  ## Declaw (Low-Level API)

  For advanced workflows that need fine-grained control over sandbox lifecycles.

  ### Sandbox

  | Operation | Description |
  |-----------|-------------|
  | Create | Create a new Firecracker microVM sandbox |
  | Get Info | Get sandbox details |
  | List | List all sandboxes |
  | Kill | Destroy a sandbox |
  | Pause | Freeze a running sandbox |
  | Resume | Resume a paused sandbox |
  | Set Timeout | Update auto-kill timeout |

  ### Command

  | Operation | Description |
  |-----------|-------------|
  | Run | Execute a command and wait for stdout/stderr |
  | Run Background | Start a command in the background (returns PID) |
  | List Processes | List background processes |
  | Kill Process | Kill a process by PID |

  ### File

  | Operation | Description |
  |-----------|-------------|
  | Read | Read text file content |
  | Read Binary | Download a binary file (images, archives, etc.) |
  | Write | Write text to a file |
  | Write Batch | Write multiple files at once |
  | List Directory | List files and directories |
  | Exists | Check if a path exists |
  | Delete | Remove a file or directory |
  | Make Directory | Create a directory |

  ### Snapshot

  | Operation | Description |
  |-----------|-------------|
  | Create | Snapshot the current sandbox state |
  | List | List all snapshots |
  | Restore | Restore from a snapshot |
  | Delete | Delete a snapshot |

  ### Persistent Sandbox Pattern

  For AI agents that need to run multiple commands in the same sandbox (e.g., install packages then use them):

  ```
  [Chat Trigger] -> [Declaw: Create Sandbox] -> [AI Agent] -> [Declaw: Kill Sandbox]
                                                    |
                                              (tool) [Declaw Tool]
                                              (uses sandbox ID from Create)
  ```

  ## Security Features

  When creating a sandbox (either node), you can enable:

  - **PII Protection** — Detect and redact sensitive data (SSN, credit cards, emails, etc.) in sandbox network traffic
  - **Injection Defense** — Block prompt injection attacks with configurable sensitivity
  - **Network Policies** — Restrict outbound access to specific domains

  These can be configured via simple toggles or a raw JSON security policy for full control.

  ## Resources

  - [Declaw Documentation](https://docs.declaw.ai)
  - [n8n Community Nodes](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Provides secure Firecracker microVM sandbox management and code execution from n8n workflows. It supports both one-shot code interpretation and low-level control over sandboxes, commands, files, and snapshots, and can also be used as an AI Agent tool.","capabilities":["Securely execute Python or JavaScript code in a sandbox","Automatically create, run, and clean up sandboxes for one-shot code execution","Create, get info for, list, pause, resume, kill, and set timeout on sandboxes","Run commands in a sandbox synchronously or in the background","List and kill background processes","Read, write, batch write, list, check existence of, delete, and create directories/files","Create, list, restore, and delete sandbox snapshots","Upload additional files and download output files","Configure environment variables, execution timeout, and security policies","Enable PII protection, injection defense, and network egress allowlisting"],"authentication":"Declaw API key required (dcl_...); API URL can be set to the default Declaw API or a self-hosted endpoint","commonUseCases":["Running untrusted code securely inside n8n workflows","Using an AI agent to write and execute code in a sandbox","Managing a persistent sandbox for multi-step tasks like installing and using packages","Automating file operations and command execution in isolated environments","Creating and restoring snapshots for reproducible sandbox states"],"limitations":["Code Interpreter is limited to Python or JavaScript","Some AI Agent tool functionality on self-hosted n8n requires N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true"],"relatedNodes":["AI Agent","Chat Trigger","Webhook","Respond to Webhook"]}


node_type: @pdfless/n8n-nodes-pdfless.pdfless
package_name: @pdfless/n8n-nodes-pdfless
display_name: Pdfless
description: Generate PDF documents from HTML/CSS templates using PDFless
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: nicolaslawdune
author_github_url: https://github.com/Pdfless/n8n-nodes-pdfless.git
npm_package_name: @pdfless/n8n-nodes-pdfless
npm_version: 1.1.0
community_fetched_at: 2026-07-14T14:40:34.464Z
ai_summary_generated_at: 2026-06-26 10:29:17
npm_readme:
  ![Pdfless Logo](pdfless-logo.png)

  # n8n-nodes-pdfless

  This is an [n8n](https://n8n.io/) community node for [Pdfless](https://pdfless.com) – a scalable and easy way to generate PDFs from HTML and CSS.

  Create your templates and generate high-quality PDFs directly from your n8n workflows.

  # Prerequisites 
  Pdfless account is required, [sign up for free](https://www.pdfless.com) for free to create up to 50 pdfs/month. 

  ## Installation

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

  In your n8n instance:
  1. Go to **Settings** > **Community Nodes**
  2. Enter `@pdfless/n8n-nodes-pdfless`
  3. Click **Install**

  ## Operations

  ### Generate PDF

  Generate a PDF file based on a template identifier.

  | Parameter | Type | Required | Description |
  |-----------|------|----------|-------------|
  | `template_id` | string (GUID) | Yes | Unique identifier of the template used to generate the PDF |
  | `reference_id` | string | No | Identifier that correlates with data from your own system |
  | `payload` | JSON | No | Data in JSON format used to populate the template |

  #### Example

  ```json
  {
    "template_id": "d9b1e2f3-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
    "reference_id": "invoice-2024-0042",
    "payload": {
      "customer_name": "Acme Corp",
      "invoice_number": "INV-0042",
      "due_date": "2024-06-30",
      "items": [
        { "description": "Consulting", "quantity": 5, "unit_price": 150 },
        { "description": "Support", "quantity": 10, "unit_price": 75 }
      ],
      "total": 1500
    }
  }
  ```

  ### Generate PDF with encryption

  Generate a PDF file based on a template identifier, with optional encryption to protect and restrict access to the document.

  #### Encryption options

  | Parameter | Type | Description |
  |-----------|------|-------------|
  | `encryption_user_password` | string | If defined, the document will be encrypted and this password will be required to open it |
  | `encryption_owner_password` | string | Owner (permission) password that restricts access to certain document functionalities |
  | `encryption_allow_printing` | boolean | Allows the document to be printed |
  | `encryption_allow_modifying` | boolean | Allows the document to be modified |
  | `encryption_allow_modify_annotations` | boolean | Allows annotations to be added or edited |
  | `encryption_allow_content_copying` | boolean | Allows content to be copied from the document |
  | `encryption_allow_screenreaders` | boolean | Allows screen readers to access the document content |
  | `encryption_allow_form_filling` | boolean | Allows form fields to be filled in |
  | `encryption_allow_document_assembly` | boolean | Allows cross-document operations (page insertion, rotation, etc.) |

  All encryption parameters are optional. When `encryption_user_password` or `encryption_owner_password` is set, the PDF will be encrypted and permissions can be fine-tuned using the boolean flags above.

  #### Example

  ```json
  {
    "template_id": "d9b1e2f3-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
    "reference_id": "invoice-2024-0042",
    "payload": {
      "customer_name": "Acme Corp",
      "invoice_number": "INV-0042",
      "due_date": "2024-06-30",
      "total": 1500
    },
    "encryption_user_password": "<open_secret>",
    "encryption_owner_password": "<owner_secret>",
    "encryption_allow_printing": true,
    "encryption_allow_modifying": false,
    "encryption_allow_modify_annotations": false,
    "encryption_allow_content_copying": false,
    "encryption_allow_screenreaders": true,
    "encryption_allow_form_filling": false,
    "encryption_allow_document_assembly": false
  }
  ```

  ## Credentials

  You need a Pdfless API key. Get one at [app.pdfless.com](https://docs.pdfless.com/authentication).

  ## Resources

  - [Pdfless Website](https://pdfless.com)
  - [Pdfless API Documentation](https://docs.pdfless.com/pdfs)
  - [Native features](https://docs.pdfless.com/native-features)
  - [Smart widgets](https://docs.pdfless.com/widgets)
  - [PDFless Dashboard](https://app.pdfless.com)
  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Generates PDF documents from HTML/CSS templates in n8n workflows using the Pdfless service. It supports template-based PDF generation and optional PDF encryption controls.","capabilities":["Generate PDF from a template identifier","Pass JSON payload data to populate template fields","Include an optional reference ID for correlating generated PDFs with external systems","Generate encrypted PDFs","Configure user and owner passwords for PDF encryption","Set fine-grained PDF permissions such as printing, modifying, copying, screen reader access, form filling, and document assembly"],"authentication":"Pdfless API key required","commonUseCases":["Generating invoices, contracts, and reports from templates","Creating secure PDFs with restricted access and permissions","Producing PDFs from workflow data in automated business processes"],"limitations":["Requires a Pdfless account","Free tier is limited to up to 50 PDFs per month","PDF generation is template-based; the README does not describe creating templates inside the node"],"relatedNodes":[]}


node_type: n8n-nodes-simplescraper.simpleScraper
package_name: n8n-nodes-simplescraper
display_name: Simplescraper
description: Scrape web pages, run saved recipes, and extract structured data via Simplescraper
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: simplescraperapp
author_github_url: https://github.com/Simplescraper/
npm_package_name: n8n-nodes-simplescraper
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.465Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "recipe",
      "options": [
        {
          "name": "Page",
          "value": "page",
          "description": "Extract data from any URL without a saved recipe"
        },
        {
          "name": "Recipe",
          "value": "recipe",
          "description": "Work with saved Simplescraper recipes"
        },
        {
          "name": "URL",
          "value": "url",
          "description": "Discover URLs from a website sitemap"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "run",
      "options": [
        {
          "name": "Run",
          "value": "run",
          "action": "Run a recipe",
          "routing": {
            "request": {
              "url": "=/recipes/{{$parameter.recipeId}}/run",
              "method": "POST"
            }
          },
          "description": "Run a saved recipe against a URL and return scraped data"
        },
        {
          "name": "Get Latest Results",
          "value": "getLatest",
          "action": "Get latest results for a recipe",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/recipes/{{$parameter.recipeId}}/results-latest",
              "method": "GET"
            }
          },
          "description": "Fetch the most recent completed run for a recipe"
        },
        {
          "name": "Get History",
          "value": "getHistory",
          "action": "Get run history for a recipe",
          "routing": {
            "request": {
              "url": "=/recipes/{{$parameter.recipeId}}/results-history",
              "method": "GET"
            }
          },
          "description": "List the last 100 runs for a recipe"
        },
        {
          "name": "Get Results by ID",
          "value": "getResultsById",
          "action": "Get results by ID",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/results/{{$parameter.resultsId}}",
              "method": "GET"
            }
          },
          "description": "Fetch a run's results by its results_id (from an async Run or the New Results trigger)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "recipe"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "extractUrls",
      "options": [
        {
          "name": "Extract URLs",
          "value": "extractUrls",
          "action": "Extract all URLs from a website",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/extract-urls",
              "method": "POST"
            }
          },
          "description": "Discover all URLs on a site via its sitemap. No credits consumed."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "url"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "extract",
      "options": [
        {
          "name": "AI Extract",
          "value": "aiExtract",
          "action": "Extract structured data from a URL with a schema",
          "routing": {
            "request": {
              "url": "/smart-extract",
              "method": "POST"
            }
          },
          "description": "Use AI to extract structured data from a URL using a schema"
        },
        {
          "name": "Extract Data",
          "value": "extract",
          "action": "Extract data from a URL",
          "routing": {
            "request": {
              "url": "/extract",
              "method": "POST"
            }
          },
          "description": "Scrape a URL without a saved recipe and return content/data"
        },
        {
          "name": "Screenshot",
          "value": "screenshot",
          "action": "Capture a screenshot of a URL",
          "routing": {
            "request": {
              "url": "/screenshot",
              "method": "POST"
            }
          },
          "description": "Capture a pixel-perfect screenshot of any web page (1 credit)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "page"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Run",
      "value": "run",
      "action": "Run a recipe",
      "routing": {
        "request": {
          "url": "=/recipes/{{$parameter.recipeId}}/run",
          "method": "POST"
        }
      },
      "description": "Run a saved recipe against a URL and return scraped data",
      "resource": "recipe"
    },
    {
      "name": "Get Latest Results",
      "value": "getLatest",
      "action": "Get latest results for a recipe",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/recipes/{{$parameter.recipeId}}/results-latest",
          "method": "GET"
        }
      },
      "description": "Fetch the most recent completed run for a recipe",
      "resource": "recipe"
    },
    {
      "name": "Get History",
      "value": "getHistory",
      "action": "Get run history for a recipe",
      "routing": {
        "request": {
          "url": "=/recipes/{{$parameter.recipeId}}/results-history",
          "method": "GET"
        }
      },
      "description": "List the last 100 runs for a recipe",
      "resource": "recipe"
    },
    {
      "name": "Get Results by ID",
      "value": "getResultsById",
      "action": "Get results by ID",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/results/{{$parameter.resultsId}}",
          "method": "GET"
        }
      },
      "description": "Fetch a run's results by its results_id (from an async Run or the New Results trigger)",
      "resource": "recipe"
    },
    {
      "name": "Extract URLs",
      "value": "extractUrls",
      "action": "Extract all URLs from a website",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/extract-urls",
          "method": "POST"
        }
      },
      "description": "Discover all URLs on a site via its sitemap. No credits consumed.",
      "resource": "url"
    },
    {
      "name": "AI Extract",
      "value": "aiExtract",
      "action": "Extract structured data from a URL with a schema",
      "routing": {
        "request": {
          "url": "/smart-extract",
          "method": "POST"
        }
      },
      "description": "Use AI to extract structured data from a URL using a schema",
      "resource": "page"
    },
    {
      "name": "Extract Data",
      "value": "extract",
      "action": "Extract data from a URL",
      "routing": {
        "request": {
          "url": "/extract",
          "method": "POST"
        }
      },
      "description": "Scrape a URL without a saved recipe and return content/data",
      "resource": "page"
    },
    {
      "name": "Screenshot",
      "value": "screenshot",
      "action": "Capture a screenshot of a URL",
      "routing": {
        "request": {
          "url": "/screenshot",
          "method": "POST"
        }
      },
      "description": "Capture a pixel-perfect screenshot of any web page (1 credit)",
      "resource": "page"
    }
  ]

npm_readme:
  # n8n-nodes-simplescraper

  n8n community node for [Simplescraper](https://simplescraper.io). Scrape any URL, run saved scrape recipes, extract structured data with AI, capture screenshots, and discover URLs from sitemaps - without writing scraping code.


  ## Install

  In n8n: **Settings → Community Nodes → Install** → enter `n8n-nodes-simplescraper` and confirm.

  Self-hosted instances can also `npm install n8n-nodes-simplescraper` in their custom-nodes directory. The package follows the standard n8n community node convention.


  ## Credentials

  Get your API key from your [Simplescraper account page](https://simplescraper.io/dashboard/account). In n8n: **Credentials → New → Simplescraper API**, paste the key, save. The credential test hits `GET /recipes` - a green check means the key is valid.


  ## Operations


  ### Recipe

  Work with saved Simplescraper recipes.

  | Operation | What it does |
  |---|---|
  | **Run** | Runs a saved recipe. Optionally override the recipe's saved URL, or pass a list of URLs to scrape many pages through the recipe in one async run. Returns a `results_id` for long-running scrapes. |
  | **Get Latest Results** | Fetches the most recent scrape results for a recipe - one item per scraped row. |
  | **Get History** | Lists the last 100 runs of a recipe - one item per run. |
  | **Get Results by ID** | Fetches a run's results by its `results_id` (from an async Run or the New Results trigger) - one item per scraped row. |


  ### Page

  Scrape any URL without a saved recipe.

  | Operation | What it does |
  |---|---|
  | **Extract Data** | One-shot scrape of any URL. Optionally returns Markdown, raw HTML, and a screenshot URL. |
  | **AI Extract** | Uses AI to extract structured data from a URL given a schema (e.g. `name, price, availability`). |
  | **Screenshot** | Captures a pixel-perfect screenshot of any URL (1 credit). Returns a hosted URL by default. |


  ### URL

  | Operation | What it does |
  |---|---|
  | **Extract URLs** | Discovers all URLs from a website's sitemap - one item per URL. No credits consumed. |


  ## Example: scrape every blog post on a site

  Combine operations to discover blog URLs and extract their content as clean markdown:

  1. **URL > Extract URLs** with `https://simplescraper.io` - returns one item per URL in the site's sitemap. No credits consumed.
  2. **Filter** (n8n core node) keeping items where `{{ $json.url }}` contains `"blog"`.
  3. **Page > Extract Data** with `Include Markdown` enabled and URL set to `{{ $json.url }}` - pulls clean markdown from each filtered blog URL.

  Useful for content audits, SEO inventories, or building a RAG corpus from a public site's blog. The Extract URLs step is free; each blog scrape costs 2 credits.


  ## Long-running scrapes

  For recipes that take more than ~30 seconds, the **Run** operation uses async mode by default and returns immediately with a `results_id` and `status: "running"`. Use the **Get Results by ID** operation with that `results_id` to fetch the data once `status` becomes `completed`.

  AI Extract follows the same pattern - if the response status is `running`, poll `GET /v1/smart-extract/{extract_uid}`.


  ## Links

  - [Simplescraper](https://simplescraper.io) - the service
  - [API documentation](https://simplescraper.io/docs/api-guide) - endpoint reference
  - [Report a bug or request a feature](https://github.com/simplescraper/n8n-nodes-simplescraper/issues)
  - [npm package](https://www.npmjs.com/package/n8n-nodes-simplescraper)


  ## Changelog


  ### 0.2.0

  - **Get Results by ID** operation - fetch a run's results by `results_id`.
  - **URLs** field on the **Run a Recipe** operation - scrape many pages through one recipe in a single async run.
  - **Get Results by ID**, **Get Latest Results**, and **Extract URLs** return one item per record (per scraped row, per URL).
  - Renamed the Extract URLs action to "Extract all URLs from a website".


  ### 0.1.4

  - Packaging and verification fixes for n8n community-node verification (provenance, icon, listing metadata). No functional changes.


  ### 0.1.0

  - Initial release: Recipe, Page, and URL operations.


  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"A Simplescraper integration for n8n that can scrape web pages, run saved scrape recipes, extract structured data with AI, capture screenshots, and discover URLs from site sitemaps. It helps automate web data collection without writing scraping code.","capabilities":["Run saved Simplescraper recipes, including async runs for long-running scrapes","Override a recipe's saved URL or pass multiple URLs to scrape many pages in one run","Fetch latest recipe results, run history, or results by results_id","Extract data from any URL without a saved recipe","Return Markdown, raw HTML, and screenshot URL from page scrapes","Use AI to extract structured data from a URL based on a schema","Capture pixel-perfect screenshots of web pages","Extract all URLs from a website's sitemap, one item per URL"],"authentication":"API key required via Simplescraper API credential in n8n","commonUseCases":["Scraping blog posts or content pages for SEO audits","Building a structured dataset or RAG corpus from public web pages","Running repeatable scrapes from saved recipes and retrieving results later","Collecting screenshots or Markdown from pages for monitoring or documentation","Discovering site URLs from sitemaps before filtering and scraping"],"limitations":["Screenshot operation consumes 1 credit","Page extraction of blog/content pages may consume credits per scrape","Long-running recipe runs return immediately and may require polling by results_id","AI Extract may also return a running status and require polling","Extract URLs is limited to URLs discovered from a website's sitemap"],"relatedNodes":["Filter"]}


node_type: n8n-nodes-tacticalrmm.tacticalRmm
package_name: n8n-nodes-tacticalrmm
display_name: Tactical RMM
description: Get data from the Tactical RMM API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: redanthrax
author_github_url: https://github.com/redanthrax/tacticalrmm-node.git
npm_package_name: n8n-nodes-tacticalrmm
npm_version: 1.3.4
community_fetched_at: 2026-07-14T14:40:34.466Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "agent",
      "description": "The resource within the selected group",
      "displayName": "Resource",
      "typeOptions": {
        "loadOptionsMethod": "getResources",
        "loadOptionsDependsOn": [
          "resourceGroup"
        ]
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "request",
      "options": [
        {
          "name": "Request",
          "value": "request",
          "action": "Make a custom API request",
          "description": "Call any Tactical RMM REST endpoint"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customApi"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add Note",
          "value": "addNote",
          "action": "Add agent note",
          "description": "Add a note to the agent"
        },
        {
          "name": "Bulk Action",
          "value": "bulkAction",
          "action": "Bulk action on agents",
          "description": "Perform bulk action on multiple agents"
        },
        {
          "name": "Bulk Maintenance Mode",
          "value": "bulkMaintenanceMode",
          "action": "Set bulk maintenance mode",
          "description": "Set maintenance mode for multiple agents"
        },
        {
          "name": "Bulk Recovery",
          "value": "bulkRecovery",
          "action": "Get bulk recovery status",
          "description": "Get bulk agent recovery status"
        },
        {
          "name": "Bulk Update",
          "value": "bulkUpdate",
          "action": "Bulk update agents",
          "description": "Update multiple agents"
        },
        {
          "name": "Delete",
          "value": "deleteAgent",
          "action": "Delete an agent",
          "description": "Delete an agent"
        },
        {
          "name": "Delete Pending Actions",
          "value": "deletePendingActions",
          "action": "Delete pending actions",
          "description": "Clear pending actions for an agent"
        },
        {
          "name": "Get By Client",
          "value": "getByClient",
          "action": "Get agents by client",
          "description": "Get agents by Client"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get an agent by ID",
          "description": "Get a agent by ID"
        },
        {
          "name": "Get Checks",
          "value": "getChecks",
          "action": "Get agent checks",
          "description": "Get checks for agent"
        },
        {
          "name": "Get Event Log",
          "value": "getEventLog",
          "action": "Get agent event log",
          "description": "Get event log from agent"
        },
        {
          "name": "Get History",
          "value": "getHistory",
          "action": "Get agent history",
          "description": "Get agent history"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many agents",
          "description": "Retrieve many agents"
        },
        {
          "name": "Get Notes",
          "value": "getNotes",
          "action": "Get agent notes",
          "description": "Get notes for agent"
        },
        {
          "name": "Get Pending Actions",
          "value": "getPendingActions",
          "action": "Get pending actions",
          "description": "Get pending actions for an agent"
        },
        {
          "name": "Get Processes",
          "value": "getProcesses",
          "action": "Get agent processes",
          "description": "Get running processes on agent"
        },
        {
          "name": "Get Script History",
          "value": "getScriptHistory",
          "action": "Get script history",
          "description": "Get script execution history"
        },
        {
          "name": "Get Tasks",
          "value": "getTasks",
          "action": "Get agent tasks",
          "description": "Get scheduled tasks for agent"
        },
        {
          "name": "Get Versions",
          "value": "getVersions",
          "action": "Get agent versions",
          "description": "Get agent software versions"
        },
        {
          "name": "Ping",
          "value": "ping",
          "action": "Ping agent",
          "description": "Ping the agent"
        },
        {
          "name": "Reboot",
          "value": "reboot",
          "action": "Reboot an agent",
          "description": "Reboot an agent"
        },
        {
          "name": "Recover",
          "value": "recover",
          "action": "Recover agent",
          "description": "Recover a disconnected agent"
        },
        {
          "name": "Run Command",
          "value": "runCommand",
          "action": "Run command on agent",
          "description": "Execute a command on agent"
        },
        {
          "name": "Run Script",
          "value": "runScript",
          "action": "Run script on agent",
          "description": "Run a script on agent"
        },
        {
          "name": "Shutdown",
          "value": "shutdown",
          "action": "Shutdown an agent",
          "description": "Shutdown an agent"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an agent",
          "description": "Update an agent"
        },
        {
          "name": "Wake On LAN",
          "value": "wakeOnLan",
          "action": "Wake agent",
          "description": "Wake an agent via Wake-on-LAN"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "agent"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Delete",
          "value": "deleteAlert",
          "action": "Delete an alert",
          "description": "Delete an alert"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get an alert by ID",
          "description": "Get an alert by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many alerts",
          "description": "Retrieve many alerts"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an alert",
          "description": "Update an alert"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "alert"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an automation policy",
          "description": "Create a new automation policy"
        },
        {
          "name": "Delete",
          "value": "deleteAutomation",
          "action": "Delete an automation policy",
          "description": "Delete an automation policy"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get an automation policy by ID",
          "description": "Get an automation policy by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many automation policies",
          "description": "Retrieve many automation policies"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an automation policy",
          "description": "Update an automation policy"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "automation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a check",
          "description": "Create a new check"
        },
        {
          "name": "Delete",
          "value": "deleteCheck",
          "action": "Delete a check",
          "description": "Delete a check"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get a check by ID",
          "description": "Get a check by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many checks",
          "description": "Retrieve many checks"
        },
        {
          "name": "Reset",
          "value": "reset",
          "action": "Reset a check",
          "description": "Reset a check status"
        },
        {
          "name": "Run",
          "value": "run",
          "action": "Run checks",
          "description": "Run checks on an agent"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a check",
          "description": "Update a check"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "check"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a client",
          "description": "Create a new client"
        },
        {
          "name": "Delete",
          "value": "deleteClient",
          "action": "Delete a client",
          "description": "Delete a client"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get a client by ID",
          "description": "Get a client by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many clients",
          "description": "Retrieve many clients"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a client",
          "description": "Update a client"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "client"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a script",
          "description": "Create a new script"
        },
        {
          "name": "Create Snippet",
          "value": "createSnippet",
          "action": "Create snippet",
          "description": "Create a code snippet"
        },
        {
          "name": "Delete",
          "value": "deleteScript",
          "action": "Delete a script",
          "description": "Delete a script"
        },
        {
          "name": "Delete Snippet",
          "value": "deleteSnippet",
          "action": "Delete snippet",
          "description": "Delete a code snippet"
        },
        {
          "name": "Download",
          "value": "download",
          "action": "Download a script",
          "description": "Download script content"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get a script by ID",
          "description": "Get a script by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many scripts",
          "description": "Retrieve many scripts"
        },
        {
          "name": "Get Snippet By ID",
          "value": "getSnippetById",
          "action": "Get snippet by ID",
          "description": "Get a code snippet by ID"
        },
        {
          "name": "Get Snippets",
          "value": "getSnippets",
          "action": "Get snippets",
          "description": "Retrieve code snippets"
        },
        {
          "name": "Test",
          "value": "test",
          "action": "Test script",
          "description": "Test a script on an agent"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a script",
          "description": "Update a script"
        },
        {
          "name": "Update Snippet",
          "value": "updateSnippet",
          "action": "Update snippet",
          "description": "Update a code snippet"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "script"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Control",
          "value": "control",
          "action": "Control a service",
          "description": "Start, stop, or restart a service"
        },
        {
          "name": "Get By Name",
          "value": "getByName",
          "action": "Get a service by name",
          "description": "Get a service by name"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many services",
          "description": "Retrieve many services from an agent"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "service"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a site",
          "description": "Create a new site"
        },
        {
          "name": "Delete",
          "value": "deleteSite",
          "action": "Delete a site",
          "description": "Delete a site"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get a site by ID",
          "description": "Get a site by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many sites",
          "description": "Retrieve many sites"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a site",
          "description": "Update a site"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "site"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a task",
          "description": "Create a new task"
        },
        {
          "name": "Delete",
          "value": "deleteTask",
          "action": "Delete a task",
          "description": "Delete a task"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get a task by ID",
          "description": "Get a task by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many tasks",
          "description": "Retrieve many tasks"
        },
        {
          "name": "Run",
          "value": "run",
          "action": "Run a task",
          "description": "Run a task on demand"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a task",
          "description": "Update a task"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get By Agent",
          "value": "getByAgent",
          "action": "Get software by agent",
          "description": "Retrieve software by agent"
        },
        {
          "name": "Get Chocolatey Packages",
          "value": "getChocos",
          "action": "Get chocolatey packages",
          "description": "List available Chocolatey packages"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many software",
          "description": "Get many software across"
        },
        {
          "name": "Install",
          "value": "install",
          "action": "Install software",
          "description": "Install software on an agent"
        },
        {
          "name": "Install Globally",
          "value": "installGlobally",
          "action": "Install software globally",
          "description": "Install software across multiple agents"
        },
        {
          "name": "Uninstall",
          "value": "uninstall",
          "action": "Uninstall software",
          "description": "Uninstall software from an agent"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "software"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMany",
      "options": [
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many windows updates",
          "description": "Get Windows updates for an agent"
        },
        {
          "name": "Install",
          "value": "install",
          "action": "Install windows updates",
          "description": "Install Windows updates on an agent"
        },
        {
          "name": "Scan",
          "value": "scan",
          "action": "Scan for windows updates",
          "description": "Scan for Windows updates on an agent"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "winupdate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create alert template",
          "description": "Create an alert template"
        },
        {
          "name": "Delete",
          "value": "deleteTemplate",
          "action": "Delete alert template",
          "description": "Delete an alert template"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get alert template by ID",
          "description": "Get an alert template by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many alert templates",
          "description": "Get many alert templates"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update alert template",
          "description": "Update an alert template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "alertTemplate"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create API key",
          "description": "Create a new API key"
        },
        {
          "name": "Delete",
          "value": "deleteApiKey",
          "action": "Delete API key",
          "description": "Delete an API key"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many API keys",
          "description": "Get many API keys"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update API key",
          "description": "Update an API key"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "apiKey"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getDashInfo",
      "options": [
        {
          "name": "Clear Cache",
          "value": "clearCache",
          "action": "Clear cache",
          "description": "Clear the server cache"
        },
        {
          "name": "Get Dashboard Info",
          "value": "getDashInfo",
          "action": "Get dashboard info",
          "description": "Get dashboard information and statistics"
        },
        {
          "name": "Get Version",
          "value": "getVersion",
          "action": "Get version",
          "description": "Get TacticalRMM server version"
        },
        {
          "name": "Test Email",
          "value": "testEmail",
          "action": "Test email",
          "description": "Test email configuration"
        },
        {
          "name": "Test SMS",
          "value": "testSms",
          "action": "Test SMS",
          "description": "Test SMS configuration"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "core"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create deployment",
          "description": "Create a deployment"
        },
        {
          "name": "Delete",
          "value": "deleteDeployment",
          "action": "Delete deployment",
          "description": "Delete a deployment"
        },
        {
          "name": "Generate",
          "value": "generate",
          "action": "Generate installer",
          "description": "Generate agent installer"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get deployment by ID",
          "description": "Get a deployment by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many deployments",
          "description": "Get many deployments"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "deployment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create role",
          "description": "Create a new role"
        },
        {
          "name": "Delete",
          "value": "deleteRole",
          "action": "Delete role",
          "description": "Delete a role"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get role by ID",
          "description": "Get a role by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many roles",
          "description": "Get many roles"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update role",
          "description": "Update a role"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "role"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create user",
          "description": "Create a user"
        },
        {
          "name": "Delete",
          "value": "deleteUser",
          "action": "Delete user",
          "description": "Delete a user"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get user by ID",
          "description": "Get a user by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many users",
          "description": "Get many users"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update user",
          "description": "Update a user"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create report template",
          "description": "Create a report template"
        },
        {
          "name": "Delete",
          "value": "deleteReport",
          "action": "Delete report template",
          "description": "Delete a report template"
        },
        {
          "name": "Email",
          "value": "email",
          "action": "Email report",
          "description": "Email a report"
        },
        {
          "name": "Export",
          "value": "exportReport",
          "action": "Export report",
          "description": "Export a report"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get report template by ID",
          "description": "Get a report template by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many report templates",
          "description": "Get many report templates"
        },
        {
          "name": "Run",
          "value": "run",
          "action": "Run report",
          "description": "Run a report"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update report template",
          "description": "Update a report template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reporting"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getPendingActions",
      "options": [
        {
          "name": "Delete All Pending Actions",
          "value": "deleteAllPendingActions",
          "action": "Delete all pending actions"
        },
        {
          "name": "Delete Pending Action By ID",
          "value": "deletePendingActionById",
          "action": "Delete pending action by ID",
          "description": "Delete a specific pending action"
        },
        {
          "name": "Get Pending Action By ID",
          "value": "getPendingActionById",
          "action": "Get pending action by ID",
          "description": "Get a specific pending action"
        },
        {
          "name": "Get Pending Actions",
          "value": "getPendingActions",
          "action": "Get pending actions",
          "description": "Get all pending actions"
        },
        {
          "name": "Update Audit Log Settings",
          "value": "updateAuditSettings",
          "action": "Update audit log settings",
          "description": "Update audit log retention settings"
        },
        {
          "name": "Update Debug Log Settings",
          "value": "updateDebugSettings",
          "action": "Update debug log settings",
          "description": "Update debug log retention settings"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "logs"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Request",
      "value": "request",
      "action": "Make a custom API request",
      "description": "Call any Tactical RMM REST endpoint",
      "resource": "customApi"
    },
    {
      "name": "Add Note",
      "value": "addNote",
      "action": "Add agent note",
      "description": "Add a note to the agent",
      "resource": "agent"
    },
    {
      "name": "Bulk Action",
      "value": "bulkAction",
      "action": "Bulk action on agents",
      "description": "Perform bulk action on multiple agents",
      "resource": "agent"
    },
    {
      "name": "Bulk Maintenance Mode",
      "value": "bulkMaintenanceMode",
      "action": "Set bulk maintenance mode",
      "description": "Set maintenance mode for multiple agents",
      "resource": "agent"
    },
    {
      "name": "Bulk Recovery",
      "value": "bulkRecovery",
      "action": "Get bulk recovery status",
      "description": "Get bulk agent recovery status",
      "resource": "agent"
    },
    {
      "name": "Bulk Update",
      "value": "bulkUpdate",
      "action": "Bulk update agents",
      "description": "Update multiple agents",
      "resource": "agent"
    },
    {
      "name": "Delete",
      "value": "deleteAgent",
      "action": "Delete an agent",
      "description": "Delete an agent",
      "resource": "agent"
    },
    {
      "name": "Delete Pending Actions",
      "value": "deletePendingActions",
      "action": "Delete pending actions",
      "description": "Clear pending actions for an agent",
      "resource": "agent"
    },
    {
      "name": "Get By Client",
      "value": "getByClient",
      "action": "Get agents by client",
      "description": "Get agents by Client",
      "resource": "agent"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get an agent by ID",
      "description": "Get a agent by ID",
      "resource": "agent"
    },
    {
      "name": "Get Checks",
      "value": "getChecks",
      "action": "Get agent checks",
      "description": "Get checks for agent",
      "resource": "agent"
    },
    {
      "name": "Get Event Log",
      "value": "getEventLog",
      "action": "Get agent event log",
      "description": "Get event log from agent",
      "resource": "agent"
    },
    {
      "name": "Get History",
      "value": "getHistory",
      "action": "Get agent history",
      "description": "Get agent history",
      "resource": "agent"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many agents",
      "description": "Retrieve many agents",
      "resource": "agent"
    },
    {
      "name": "Get Notes",
      "value": "getNotes",
      "action": "Get agent notes",
      "description": "Get notes for agent",
      "resource": "agent"
    },
    {
      "name": "Get Pending Actions",
      "value": "getPendingActions",
      "action": "Get pending actions",
      "description": "Get pending actions for an agent",
      "resource": "agent"
    },
    {
      "name": "Get Processes",
      "value": "getProcesses",
      "action": "Get agent processes",
      "description": "Get running processes on agent",
      "resource": "agent"
    },
    {
      "name": "Get Script History",
      "value": "getScriptHistory",
      "action": "Get script history",
      "description": "Get script execution history",
      "resource": "agent"
    },
    {
      "name": "Get Tasks",
      "value": "getTasks",
      "action": "Get agent tasks",
      "description": "Get scheduled tasks for agent",
      "resource": "agent"
    },
    {
      "name": "Get Versions",
      "value": "getVersions",
      "action": "Get agent versions",
      "description": "Get agent software versions",
      "resource": "agent"
    },
    {
      "name": "Ping",
      "value": "ping",
      "action": "Ping agent",
      "description": "Ping the agent",
      "resource": "agent"
    },
    {
      "name": "Reboot",
      "value": "reboot",
      "action": "Reboot an agent",
      "description": "Reboot an agent",
      "resource": "agent"
    },
    {
      "name": "Recover",
      "value": "recover",
      "action": "Recover agent",
      "description": "Recover a disconnected agent",
      "resource": "agent"
    },
    {
      "name": "Run Command",
      "value": "runCommand",
      "action": "Run command on agent",
      "description": "Execute a command on agent",
      "resource": "agent"
    },
    {
      "name": "Run Script",
      "value": "runScript",
      "action": "Run script on agent",
      "description": "Run a script on agent",
      "resource": "agent"
    },
    {
      "name": "Shutdown",
      "value": "shutdown",
      "action": "Shutdown an agent",
      "description": "Shutdown an agent",
      "resource": "agent"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an agent",
      "description": "Update an agent",
      "resource": "agent"
    },
    {
      "name": "Wake On LAN",
      "value": "wakeOnLan",
      "action": "Wake agent",
      "description": "Wake an agent via Wake-on-LAN",
      "resource": "agent"
    },
    {
      "name": "Delete",
      "value": "deleteAlert",
      "action": "Delete an alert",
      "description": "Delete an alert",
      "resource": "alert"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get an alert by ID",
      "description": "Get an alert by ID",
      "resource": "alert"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many alerts",
      "description": "Retrieve many alerts",
      "resource": "alert"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an alert",
      "description": "Update an alert",
      "resource": "alert"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an automation policy",
      "description": "Create a new automation policy",
      "resource": "automation"
    },
    {
      "name": "Delete",
      "value": "deleteAutomation",
      "action": "Delete an automation policy",
      "description": "Delete an automation policy",
      "resource": "automation"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get an automation policy by ID",
      "description": "Get an automation policy by ID",
      "resource": "automation"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many automation policies",
      "description": "Retrieve many automation policies",
      "resource": "automation"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an automation policy",
      "description": "Update an automation policy",
      "resource": "automation"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a check",
      "description": "Create a new check",
      "resource": "check"
    },
    {
      "name": "Delete",
      "value": "deleteCheck",
      "action": "Delete a check",
      "description": "Delete a check",
      "resource": "check"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get a check by ID",
      "description": "Get a check by ID",
      "resource": "check"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many checks",
      "description": "Retrieve many checks",
      "resource": "check"
    },
    {
      "name": "Reset",
      "value": "reset",
      "action": "Reset a check",
      "description": "Reset a check status",
      "resource": "check"
    },
    {
      "name": "Run",
      "value": "run",
      "action": "Run checks",
      "description": "Run checks on an agent",
      "resource": "check"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a check",
      "description": "Update a check",
      "resource": "check"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a client",
      "description": "Create a new client",
      "resource": "client"
    },
    {
      "name": "Delete",
      "value": "deleteClient",
      "action": "Delete a client",
      "description": "Delete a client",
      "resource": "client"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get a client by ID",
      "description": "Get a client by ID",
      "resource": "client"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many clients",
      "description": "Retrieve many clients",
      "resource": "client"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a client",
      "description": "Update a client",
      "resource": "client"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a script",
      "description": "Create a new script",
      "resource": "script"
    },
    {
      "name": "Create Snippet",
      "value": "createSnippet",
      "action": "Create snippet",
      "description": "Create a code snippet",
      "resource": "script"
    },
    {
      "name": "Delete",
      "value": "deleteScript",
      "action": "Delete a script",
      "description": "Delete a script",
      "resource": "script"
    },
    {
      "name": "Delete Snippet",
      "value": "deleteSnippet",
      "action": "Delete snippet",
      "description": "Delete a code snippet",
      "resource": "script"
    },
    {
      "name": "Download",
      "value": "download",
      "action": "Download a script",
      "description": "Download script content",
      "resource": "script"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get a script by ID",
      "description": "Get a script by ID",
      "resource": "script"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many scripts",
      "description": "Retrieve many scripts",
      "resource": "script"
    },
    {
      "name": "Get Snippet By ID",
      "value": "getSnippetById",
      "action": "Get snippet by ID",
      "description": "Get a code snippet by ID",
      "resource": "script"
    },
    {
      "name": "Get Snippets",
      "value": "getSnippets",
      "action": "Get snippets",
      "description": "Retrieve code snippets",
      "resource": "script"
    },
    {
      "name": "Test",
      "value": "test",
      "action": "Test script",
      "description": "Test a script on an agent",
      "resource": "script"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a script",
      "description": "Update a script",
      "resource": "script"
    },
    {
      "name": "Update Snippet",
      "value": "updateSnippet",
      "action": "Update snippet",
      "description": "Update a code snippet",
      "resource": "script"
    },
    {
      "name": "Control",
      "value": "control",
      "action": "Control a service",
      "description": "Start, stop, or restart a service",
      "resource": "service"
    },
    {
      "name": "Get By Name",
      "value": "getByName",
      "action": "Get a service by name",
      "description": "Get a service by name",
      "resource": "service"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many services",
      "description": "Retrieve many services from an agent",
      "resource": "service"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a site",
      "description": "Create a new site",
      "resource": "site"
    },
    {
      "name": "Delete",
      "value": "deleteSite",
      "action": "Delete a site",
      "description": "Delete a site",
      "resource": "site"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get a site by ID",
      "description": "Get a site by ID",
      "resource": "site"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many sites",
      "description": "Retrieve many sites",
      "resource": "site"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a site",
      "description": "Update a site",
      "resource": "site"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a task",
      "description": "Create a new task",
      "resource": "task"
    },
    {
      "name": "Delete",
      "value": "deleteTask",
      "action": "Delete a task",
      "description": "Delete a task",
      "resource": "task"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get a task by ID",
      "description": "Get a task by ID",
      "resource": "task"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many tasks",
      "description": "Retrieve many tasks",
      "resource": "task"
    },
    {
      "name": "Run",
      "value": "run",
      "action": "Run a task",
      "description": "Run a task on demand",
      "resource": "task"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a task",
      "description": "Update a task",
      "resource": "task"
    },
    {
      "name": "Get By Agent",
      "value": "getByAgent",
      "action": "Get software by agent",
      "description": "Retrieve software by agent",
      "resource": "software"
    },
    {
      "name": "Get Chocolatey Packages",
      "value": "getChocos",
      "action": "Get chocolatey packages",
      "description": "List available Chocolatey packages",
      "resource": "software"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many software",
      "description": "Get many software across",
      "resource": "software"
    },
    {
      "name": "Install",
      "value": "install",
      "action": "Install software",
      "description": "Install software on an agent",
      "resource": "software"
    },
    {
      "name": "Install Globally",
      "value": "installGlobally",
      "action": "Install software globally",
      "description": "Install software across multiple agents",
      "resource": "software"
    },
    {
      "name": "Uninstall",
      "value": "uninstall",
      "action": "Uninstall software",
      "description": "Uninstall software from an agent",
      "resource": "software"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many windows updates",
      "description": "Get Windows updates for an agent",
      "resource": "winupdate"
    },
    {
      "name": "Install",
      "value": "install",
      "action": "Install windows updates",
      "description": "Install Windows updates on an agent",
      "resource": "winupdate"
    },
    {
      "name": "Scan",
      "value": "scan",
      "action": "Scan for windows updates",
      "description": "Scan for Windows updates on an agent",
      "resource": "winupdate"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create alert template",
      "description": "Create an alert template",
      "resource": "alertTemplate"
    },
    {
      "name": "Delete",
      "value": "deleteTemplate",
      "action": "Delete alert template",
      "description": "Delete an alert template",
      "resource": "alertTemplate"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get alert template by ID",
      "description": "Get an alert template by ID",
      "resource": "alertTemplate"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many alert templates",
      "description": "Get many alert templates",
      "resource": "alertTemplate"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update alert template",
      "description": "Update an alert template",
      "resource": "alertTemplate"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create API key",
      "description": "Create a new API key",
      "resource": "apiKey"
    },
    {
      "name": "Delete",
      "value": "deleteApiKey",
      "action": "Delete API key",
      "description": "Delete an API key",
      "resource": "apiKey"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many API keys",
      "description": "Get many API keys",
      "resource": "apiKey"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update API key",
      "description": "Update an API key",
      "resource": "apiKey"
    },
    {
      "name": "Clear Cache",
      "value": "clearCache",
      "action": "Clear cache",
      "description": "Clear the server cache",
      "resource": "core"
    },
    {
      "name": "Get Dashboard Info",
      "value": "getDashInfo",
      "action": "Get dashboard info",
      "description": "Get dashboard information and statistics",
      "resource": "core"
    },
    {
      "name": "Get Version",
      "value": "getVersion",
      "action": "Get version",
      "description": "Get TacticalRMM server version",
      "resource": "core"
    },
    {
      "name": "Test Email",
      "value": "testEmail",
      "action": "Test email",
      "description": "Test email configuration",
      "resource": "core"
    },
    {
      "name": "Test SMS",
      "value": "testSms",
      "action": "Test SMS",
      "description": "Test SMS configuration",
      "resource": "core"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create deployment",
      "description": "Create a deployment",
      "resource": "deployment"
    },
    {
      "name": "Delete",
      "value": "deleteDeployment",
      "action": "Delete deployment",
      "description": "Delete a deployment",
      "resource": "deployment"
    },
    {
      "name": "Generate",
      "value": "generate",
      "action": "Generate installer",
      "description": "Generate agent installer",
      "resource": "deployment"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get deployment by ID",
      "description": "Get a deployment by ID",
      "resource": "deployment"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many deployments",
      "description": "Get many deployments",
      "resource": "deployment"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create role",
      "description": "Create a new role",
      "resource": "role"
    },
    {
      "name": "Delete",
      "value": "deleteRole",
      "action": "Delete role",
      "description": "Delete a role",
      "resource": "role"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get role by ID",
      "description": "Get a role by ID",
      "resource": "role"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many roles",
      "description": "Get many roles",
      "resource": "role"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update role",
      "description": "Update a role",
      "resource": "role"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create user",
      "description": "Create a user",
      "resource": "user"
    },
    {
      "name": "Delete",
      "value": "deleteUser",
      "action": "Delete user",
      "description": "Delete a user",
      "resource": "user"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get user by ID",
      "description": "Get a user by ID",
      "resource": "user"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many users",
      "description": "Get many users",
      "resource": "user"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update user",
      "description": "Update a user",
      "resource": "user"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create report template",
      "description": "Create a report template",
      "resource": "reporting"
    },
    {
      "name": "Delete",
      "value": "deleteReport",
      "action": "Delete report template",
      "description": "Delete a report template",
      "resource": "reporting"
    },
    {
      "name": "Email",
      "value": "email",
      "action": "Email report",
      "description": "Email a report",
      "resource": "reporting"
    },
    {
      "name": "Export",
      "value": "exportReport",
      "action": "Export report",
      "description": "Export a report",
      "resource": "reporting"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get report template by ID",
      "description": "Get a report template by ID",
      "resource": "reporting"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many report templates",
      "description": "Get many report templates",
      "resource": "reporting"
    },
    {
      "name": "Run",
      "value": "run",
      "action": "Run report",
      "description": "Run a report",
      "resource": "reporting"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update report template",
      "description": "Update a report template",
      "resource": "reporting"
    },
    {
      "name": "Delete All Pending Actions",
      "value": "deleteAllPendingActions",
      "action": "Delete all pending actions",
      "resource": "logs"
    },
    {
      "name": "Delete Pending Action By ID",
      "value": "deletePendingActionById",
      "action": "Delete pending action by ID",
      "description": "Delete a specific pending action",
      "resource": "logs"
    },
    {
      "name": "Get Pending Action By ID",
      "value": "getPendingActionById",
      "action": "Get pending action by ID",
      "description": "Get a specific pending action",
      "resource": "logs"
    },
    {
      "name": "Get Pending Actions",
      "value": "getPendingActions",
      "action": "Get pending actions",
      "description": "Get all pending actions",
      "resource": "logs"
    },
    {
      "name": "Update Audit Log Settings",
      "value": "updateAuditSettings",
      "action": "Update audit log settings",
      "description": "Update audit log retention settings",
      "resource": "logs"
    },
    {
      "name": "Update Debug Log Settings",
      "value": "updateDebugSettings",
      "action": "Update debug log settings",
      "description": "Update debug log retention settings",
      "resource": "logs"
    }
  ]

npm_readme:
  # @redanthrax/n8n-nodes-tacticalrmm

  An n8n community node for integrating with the Tactical RMM API.

  Tactical RMM is a remote monitoring and management tool, built with Django and Vue.

  ## Development

  This repo uses **pnpm** with a committed lockfile and supply-chain controls in [`pnpm-workspace.yaml`](pnpm-workspace.yaml) (see [SECURITY.md](SECURITY.md)). After clone:

  ```bash
  corepack enable && corepack prepare pnpm@10.19.0 --activate
  pnpm install --frozen-lockfile
  pnpm run audit:supply-chain
  pnpm run build
  ```

  Use **pnpm only** for installs in this repo. With Corepack enabled, `npm install` and `yarn install` are rejected. Do not commit `package-lock.json` or `yarn.lock` (see [SECURITY.md](SECURITY.md)).

  ### API spec and catalog

  The OpenAPI spec lives at [`docs/swagger.yaml`](docs/swagger.yaml). Regenerate the endpoint catalog:

  ```bash
  pnpm run generate
  ```

  See [`docs/api-catalog.md`](docs/api-catalog.md) for every automation-facing endpoint. Use the **Custom API** resource for endpoints not covered by curated operations.

  ### Live preview with `n8n-node dev`

  ```bash
  n8n-node dev
  ```

  Requires **Node.js 22.22.3+**.

  ## Installation

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

  ```bash
  npm install @redanthrax/n8n-nodes-tacticalrmm
  ```

  ## Prerequisites

  - Tactical RMM instance with API access
  - Your Tactical RMM base URL (e.g. `https://api.example.com`)
  - A dedicated integration user, integration role, and API key (see setup below)

  ## Setup

  ### API access in Tactical RMM (recommended)

  Do not reuse a personal admin account for n8n. Create a dedicated integration setup with least privilege:

  1. **Integration role** — In Tactical RMM, create a role scoped only to the clients, sites, and actions your workflows need (read-only where possible).
  2. **Integration user** — Create a service/integration user account and assign only that role.
  3. **API key** — In **Settings → Global Settings → API Keys**, create a key for the integration user (not a day-to-day admin account).

  Rotate or revoke the API key if the n8n credential is exposed. Tighten the role if you add workflows later.

  ### Configuring credentials in n8n

  | Field | Example | Notes |
  |-------|---------|-------|
  | **Base API URL** | `https://api.example.com` | Your Tactical RMM server URL |
  | **API Key** | *(from API Keys settings)* | Key for the integration user; sent as `X-API-KEY` |

  ## Supported operations

  **129+ operations across 20 resources** (including Custom API for any path in the OpenAPI spec):

  ### Resource groups

  | Group | Resources |
  |-------|-----------|
  | **Agents** | Agent, Check, Service, Software, Task, Windows Update |
  | **Organization** | Client, Site, Deployment |
  | **Monitoring** | Alert, Alert Template |
  | **Automation** | Automation Policy, Script |
  | **Administration** | API Key, Core, Log, Role, User |
  | **Reporting** | Reporting |
  | **Advanced** | Custom API |

  ### Curated resources

  - [Agent](./docs/agents.md) (27 operations)
  - [Alert](./docs/alerts.md)
  - [Alert Template](./docs/alert-templates.md)
  - [API Key](./docs/api-keys.md)
  - [Automation](./docs/automation.md)
  - [Check](./docs/checks.md)
  - [Client](./docs/clients.md)
  - [Core](./docs/core.md)
  - [Deployment](./docs/deployments.md)
  - [Log](./docs/logs.md)
  - [Reporting](./docs/reporting.md)
  - [Role](./docs/roles.md)
  - [Script](./docs/scripts.md)
  - [Service](./docs/services.md)
  - [Site](./docs/sites.md)
  - [Software](./docs/software.md)
  - [Task](./docs/tasks.md)
  - [User](./docs/users.md)
  - [Windows Update](./docs/windows-updates.md)

  ### Custom API

  Call any documented REST endpoint (method, path, query, body). Full path list: [`docs/api-catalog.md`](docs/api-catalog.md).

  ## Resources

  - [Tactical RMM API documentation](https://docs.tacticalrmm.com/)
  - [n8n documentation](https://docs.n8n.io)
  - [Repository](https://github.com/redanthrax/tacticalrmm-node)

  ## Compatibility

  - n8n 0.199.0+
  - Tactical RMM 0.15.2+ (OpenAPI spec version 1.4.0 in `docs/swagger.yaml`)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"This node integrates n8n with the Tactical RMM API to retrieve and manage remote monitoring and management data. It provides curated operations for many Tactical RMM resources plus a Custom API option for any documented endpoint.","capabilities":["Access Tactical RMM data through 129+ operations across 20 resources","Manage and query Agents, Checks, Services, Software, Tasks, and Windows Updates","Work with Organization resources such as Clients, Sites, and Deployments","Handle Monitoring resources including Alerts and Alert Templates","Automate via Automation Policies and Scripts","Administer API Keys, Core settings, Logs, Roles, and Users","Run Reporting operations","Use Custom API to call any documented REST endpoint with method, path, query, and body"],"authentication":"API key required; configure the Tactical RMM Base API URL and an API Key sent as X-API-KEY for a dedicated integration user.","commonUseCases":["Monitoring and retrieving agent status, checks, and alerts","Automating administrative tasks in Tactical RMM such as scripts, policies, or user/role management","Pulling reporting and log data into n8n workflows","Calling Tactical RMM endpoints not covered by curated nodes via Custom API"],"limitations":["Requires a Tactical RMM instance with API access","Designed for Tactical RMM 0.15.2+ and n8n 0.199.0+","Custom API should only be used for documented REST endpoints in the OpenAPI spec"],"relatedNodes":[]}


node_type: n8n-nodes-socialapis.socialApis
package_name: n8n-nodes-socialapis
display_name: SocialAPIs
description: Access public data from major social platforms
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: socialapis
author_github_url: https://github.com/SocialAPIsHub/
npm_package_name: n8n-nodes-socialapis
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.467Z
ai_summary_generated_at: 2026-06-26 10:29:17
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "facebookPage",
      "options": [
        {
          "name": "Facebook Group",
          "value": "facebookGroup"
        },
        {
          "name": "Facebook Marketplace",
          "value": "marketplace"
        },
        {
          "name": "Facebook Media",
          "value": "facebookMedia"
        },
        {
          "name": "Facebook Page",
          "value": "facebookPage"
        },
        {
          "name": "Facebook Post",
          "value": "facebookPost"
        },
        {
          "name": "Facebook Search",
          "value": "facebookSearch"
        },
        {
          "name": "Meta Ads Library",
          "value": "metaAds"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getPageDetails",
      "options": [
        {
          "name": "Get Page ID",
          "value": "getPageId",
          "action": "Get a facebook page id",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.link}}"
              },
              "url": "/facebook/pages/id",
              "method": "GET"
            }
          },
          "description": "Retrieve the Facebook Page ID from a page link"
        },
        {
          "name": "Get Page Details",
          "value": "getPageDetails",
          "action": "Get facebook page details",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.link}}"
              },
              "url": "/facebook/pages/details",
              "method": "GET"
            }
          },
          "description": "Get detailed metadata: likes, followers, contact info"
        },
        {
          "name": "Get Page Posts",
          "value": "getPagePosts",
          "action": "Get facebook page posts",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.link}}"
              },
              "url": "/facebook/pages/posts",
              "method": "GET"
            }
          },
          "description": "Fetch recent posts with reactions, media, and comments. Returns 3 posts per call. Use end_cursor for more."
        },
        {
          "name": "Get Page Reels",
          "value": "getPageReels",
          "action": "Get facebook page reels",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.link}}"
              },
              "url": "/facebook/pages/reels",
              "method": "GET"
            }
          },
          "description": "Retrieve short-form video content (Reels) from a Page. Returns 3 reels per call. Use end_cursor for more."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebookPage"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getGroupDetails",
      "options": [
        {
          "name": "Get Group ID",
          "value": "getGroupId",
          "action": "Get a facebook group id",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.link}}"
              },
              "url": "/facebook/groups/id",
              "method": "GET"
            }
          },
          "description": "Retrieve the Group ID from a group link"
        },
        {
          "name": "Get Group Details",
          "value": "getGroupDetails",
          "action": "Get facebook group details",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.link}}"
              },
              "url": "/facebook/groups/details",
              "method": "GET"
            }
          },
          "description": "Get group metadata: name, members, description"
        },
        {
          "name": "Get Group Posts",
          "value": "getGroupPosts",
          "action": "Get facebook group posts",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.link}}"
              },
              "url": "/facebook/groups/posts",
              "method": "GET"
            }
          },
          "description": "Fetch recent posts from a group. Returns 3 posts per call. Use end_cursor for more."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebookGroup"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getPostDetails",
      "options": [
        {
          "name": "Get Comment Replies",
          "value": "getCommentReplies",
          "action": "Get facebook comment replies",
          "routing": {
            "request": {
              "qs": {
                "expansion_token": "={{$parameter.expansionToken}}",
                "comment_feedback_id": "={{$parameter.commentFeedbackId}}"
              },
              "url": "/facebook/posts/comments/replies",
              "method": "GET"
            }
          },
          "description": "Fetch replies to a specific comment. Requires comment_feedback_id and expansion_token from comments endpoint."
        },
        {
          "name": "Get Post Attachments",
          "value": "getPostAttachments",
          "action": "Get facebook post attachments",
          "routing": {
            "request": {
              "qs": {
                "post_id": "={{$parameter.postId}}"
              },
              "url": "/facebook/posts/attachments",
              "method": "GET"
            }
          },
          "description": "Get details of all media attachments for a given post"
        },
        {
          "name": "Get Post Comments",
          "value": "getPostComments",
          "action": "Get facebook post comments",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.postLink}}"
              },
              "url": "/facebook/posts/comments",
              "method": "GET"
            }
          },
          "description": "Retrieve top-level comments from a post or reel. Returns 10 comments per call. Use end_cursor for more."
        },
        {
          "name": "Get Post Details",
          "value": "getPostDetails",
          "action": "Get facebook post details",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.postLink}}"
              },
              "url": "/facebook/posts/details",
              "method": "GET"
            }
          },
          "description": "Get detailed data about a post including reactions, media, and user info"
        },
        {
          "name": "Get Post ID",
          "value": "getPostId",
          "action": "Get a facebook post id",
          "routing": {
            "request": {
              "qs": {
                "link": "={{$parameter.postLink}}"
              },
              "url": "/facebook/posts/id",
              "method": "GET"
            }
          },
          "description": "Extract the Facebook post ID from a given post link"
        },
        {
          "name": "Get Video Details",
          "value": "getVideoDetails",
          "action": "Get facebook video details",
          "routing": {
            "request": {
              "qs": {
                "video_id": "={{$parameter.videoId}}"
              },
              "url": "/facebook/posts/video",
              "method": "GET"
            }
          },
          "description": "Retrieve video metadata, feedback stats, and post context"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebookPost"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "searchPages",
      "options": [
        {
          "name": "Search Locations",
          "value": "searchLocations",
          "action": "Search facebook locations",
          "routing": {
            "request": {
              "qs": {
                "query": "={{$parameter.query}}"
              },
              "url": "/facebook/search/locations",
              "method": "GET"
            }
          },
          "description": "Search for locations. Returns location UIDs for filtering other search endpoints."
        },
        {
          "name": "Search Pages",
          "value": "searchPages",
          "action": "Search facebook pages",
          "routing": {
            "request": {
              "qs": {
                "query": "={{$parameter.query}}"
              },
              "url": "/facebook/search/pages",
              "method": "GET"
            }
          },
          "description": "Search for pages by keyword with optional location filtering. Returns 3 results per call. Use end_cursor for more."
        },
        {
          "name": "Search People",
          "value": "searchPeople",
          "action": "Search facebook people",
          "routing": {
            "request": {
              "qs": {
                "query": "={{$parameter.query}}"
              },
              "url": "/facebook/search/people",
              "method": "GET"
            }
          },
          "description": "Search for Facebook people/profiles by keyword. Returns 3 results per call. Use end_cursor for more."
        },
        {
          "name": "Search Posts",
          "value": "searchPosts",
          "action": "Search facebook posts",
          "routing": {
            "request": {
              "qs": {
                "query": "={{$parameter.query}}"
              },
              "url": "/facebook/search/posts",
              "method": "GET"
            }
          },
          "description": "Search for posts by keyword with optional location and time filters. Returns 3 results per call. Use end_cursor for more."
        },
        {
          "name": "Search Videos",
          "value": "searchVideos",
          "action": "Search facebook videos",
          "routing": {
            "request": {
              "qs": {
                "query": "={{$parameter.query}}"
              },
              "url": "/facebook/search/videos",
              "method": "GET"
            }
          },
          "description": "Search for Facebook videos by keyword. Returns 7 videos per call. Use end_cursor for more."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebookSearch"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "searchAds",
      "options": [
        {
          "name": "Get Ad Details",
          "value": "getAdDetails",
          "action": "Get ad archive details",
          "routing": {
            "request": {
              "qs": {
                "ad_archive_id": "={{$parameter.adArchiveId}}"
              },
              "url": "/facebook/ads/archive-details",
              "method": "GET"
            }
          },
          "description": "Get detailed info about a specific archived ad by archive ID"
        },
        {
          "name": "Get Page Ad Details",
          "value": "getPageAdDetails",
          "action": "Get page ad details",
          "routing": {
            "request": {
              "qs": {
                "page_id": "={{$parameter.pageId}}"
              },
              "url": "/facebook/ads/page-details",
              "method": "GET"
            }
          },
          "description": "Get detailed info about a specific Facebook page from the Ads Library"
        },
        {
          "name": "Get Supported Countries",
          "value": "getSupportedCountries",
          "action": "Get supported countries",
          "routing": {
            "request": {
              "url": "/facebook/ads/countries",
              "method": "GET"
            }
          },
          "description": "Get list of supported country codes for Meta Ads Library filtering"
        },
        {
          "name": "Search Ads",
          "value": "searchAds",
          "action": "Search the meta ads library",
          "routing": {
            "request": {
              "url": "/facebook/ads/search",
              "method": "GET"
            }
          },
          "description": "Search ads in the Meta Ad Library by keyword or page ID. Returns 10 ads per call. Use end_cursor for more."
        },
        {
          "name": "Search by Keyword",
          "value": "searchAdsByKeyword",
          "action": "Search ads by keyword",
          "routing": {
            "request": {
              "qs": {
                "query": "={{$parameter.adsQuery}}"
              },
              "url": "/facebook/ads/keywords",
              "method": "GET"
            }
          },
          "description": "Search for ads by keyword with optional country filter"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "metaAds"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "searchListings",
      "options": [
        {
          "name": "Find City Coordinates",
          "value": "findCityCoordinates",
          "action": "Find city coordinates",
          "routing": {
            "request": {
              "qs": {
                "city": "={{$parameter.cityName}}"
              },
              "url": "/facebook/marketplace/city-coordinates",
              "method": "GET"
            }
          },
          "description": "Get GPS coordinates for a city to use as location filters"
        },
        {
          "name": "Get Categories",
          "value": "getCategories",
          "action": "Get marketplace categories",
          "routing": {
            "request": {
              "url": "/facebook/marketplace/categories",
              "method": "GET"
            }
          },
          "description": "Get all Marketplace categories with seo_url and category ID values"
        },
        {
          "name": "Get Listing Details",
          "value": "getListingDetails",
          "action": "Get marketplace listing details",
          "routing": {
            "request": {
              "qs": {
                "listing_id": "={{$parameter.listingId}}"
              },
              "url": "/facebook/marketplace/listing",
              "method": "GET"
            }
          },
          "description": "Get detailed info about a single Marketplace listing"
        },
        {
          "name": "Get Seller Details",
          "value": "getSellerDetails",
          "action": "Get marketplace seller details",
          "routing": {
            "request": {
              "qs": {
                "seller_id": "={{$parameter.sellerId}}"
              },
              "url": "/facebook/marketplace/seller",
              "method": "GET"
            }
          },
          "description": "Get seller profile, ratings, reviews, and badges"
        },
        {
          "name": "Search Listings",
          "value": "searchListings",
          "action": "Search marketplace listings",
          "routing": {
            "request": {
              "url": "/facebook/marketplace/search",
              "method": "GET"
            }
          },
          "description": "Search Facebook Marketplace items with filters. Returns 24 items per call. Use end_cursor for more."
        },
        {
          "name": "Search Rentals",
          "value": "searchRentals",
          "action": "Search marketplace rentals",
          "routing": {
            "request": {
              "url": "/facebook/marketplace/rentals",
              "method": "GET"
            }
          },
          "description": "Search rental property listings with filters. Returns 24 items per call. Use end_cursor for more."
        },
        {
          "name": "Search Vehicles",
          "value": "searchVehicles",
          "action": "Search marketplace vehicles",
          "routing": {
            "request": {
              "url": "/facebook/marketplace/vehicles",
              "method": "GET"
            }
          },
          "description": "Search vehicle listings with filters. Returns 24 items per call. Use end_cursor for more."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "marketplace"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "downloadMedia",
      "options": [
        {
          "name": "Download Media",
          "value": "downloadMedia",
          "action": "Download facebook media",
          "routing": {
            "request": {
              "qs": {
                "url": "={{$parameter.url}}"
              },
              "url": "/facebook/media/download",
              "method": "GET"
            }
          },
          "description": "Download media (images, videos, audio) from Facebook URLs"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebookMedia"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Page ID",
      "value": "getPageId",
      "action": "Get a facebook page id",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.link}}"
          },
          "url": "/facebook/pages/id",
          "method": "GET"
        }
      },
      "description": "Retrieve the Facebook Page ID from a page link",
      "resource": "facebookPage"
    },
    {
      "name": "Get Page Details",
      "value": "getPageDetails",
      "action": "Get facebook page details",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.link}}"
          },
          "url": "/facebook/pages/details",
          "method": "GET"
        }
      },
      "description": "Get detailed metadata: likes, followers, contact info",
      "resource": "facebookPage"
    },
    {
      "name": "Get Page Posts",
      "value": "getPagePosts",
      "action": "Get facebook page posts",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.link}}"
          },
          "url": "/facebook/pages/posts",
          "method": "GET"
        }
      },
      "description": "Fetch recent posts with reactions, media, and comments. Returns 3 posts per call. Use end_cursor for more.",
      "resource": "facebookPage"
    },
    {
      "name": "Get Page Reels",
      "value": "getPageReels",
      "action": "Get facebook page reels",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.link}}"
          },
          "url": "/facebook/pages/reels",
          "method": "GET"
        }
      },
      "description": "Retrieve short-form video content (Reels) from a Page. Returns 3 reels per call. Use end_cursor for more.",
      "resource": "facebookPage"
    },
    {
      "name": "Get Group ID",
      "value": "getGroupId",
      "action": "Get a facebook group id",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.link}}"
          },
          "url": "/facebook/groups/id",
          "method": "GET"
        }
      },
      "description": "Retrieve the Group ID from a group link",
      "resource": "facebookGroup"
    },
    {
      "name": "Get Group Details",
      "value": "getGroupDetails",
      "action": "Get facebook group details",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.link}}"
          },
          "url": "/facebook/groups/details",
          "method": "GET"
        }
      },
      "description": "Get group metadata: name, members, description",
      "resource": "facebookGroup"
    },
    {
      "name": "Get Group Posts",
      "value": "getGroupPosts",
      "action": "Get facebook group posts",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.link}}"
          },
          "url": "/facebook/groups/posts",
          "method": "GET"
        }
      },
      "description": "Fetch recent posts from a group. Returns 3 posts per call. Use end_cursor for more.",
      "resource": "facebookGroup"
    },
    {
      "name": "Get Comment Replies",
      "value": "getCommentReplies",
      "action": "Get facebook comment replies",
      "routing": {
        "request": {
          "qs": {
            "expansion_token": "={{$parameter.expansionToken}}",
            "comment_feedback_id": "={{$parameter.commentFeedbackId}}"
          },
          "url": "/facebook/posts/comments/replies",
          "method": "GET"
        }
      },
      "description": "Fetch replies to a specific comment. Requires comment_feedback_id and expansion_token from comments endpoint.",
      "resource": "facebookPost"
    },
    {
      "name": "Get Post Attachments",
      "value": "getPostAttachments",
      "action": "Get facebook post attachments",
      "routing": {
        "request": {
          "qs": {
            "post_id": "={{$parameter.postId}}"
          },
          "url": "/facebook/posts/attachments",
          "method": "GET"
        }
      },
      "description": "Get details of all media attachments for a given post",
      "resource": "facebookPost"
    },
    {
      "name": "Get Post Comments",
      "value": "getPostComments",
      "action": "Get facebook post comments",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.postLink}}"
          },
          "url": "/facebook/posts/comments",
          "method": "GET"
        }
      },
      "description": "Retrieve top-level comments from a post or reel. Returns 10 comments per call. Use end_cursor for more.",
      "resource": "facebookPost"
    },
    {
      "name": "Get Post Details",
      "value": "getPostDetails",
      "action": "Get facebook post details",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.postLink}}"
          },
          "url": "/facebook/posts/details",
          "method": "GET"
        }
      },
      "description": "Get detailed data about a post including reactions, media, and user info",
      "resource": "facebookPost"
    },
    {
      "name": "Get Post ID",
      "value": "getPostId",
      "action": "Get a facebook post id",
      "routing": {
        "request": {
          "qs": {
            "link": "={{$parameter.postLink}}"
          },
          "url": "/facebook/posts/id",
          "method": "GET"
        }
      },
      "description": "Extract the Facebook post ID from a given post link",
      "resource": "facebookPost"
    },
    {
      "name": "Get Video Details",
      "value": "getVideoDetails",
      "action": "Get facebook video details",
      "routing": {
        "request": {
          "qs": {
            "video_id": "={{$parameter.videoId}}"
          },
          "url": "/facebook/posts/video",
          "method": "GET"
        }
      },
      "description": "Retrieve video metadata, feedback stats, and post context",
      "resource": "facebookPost"
    },
    {
      "name": "Search Locations",
      "value": "searchLocations",
      "action": "Search facebook locations",
      "routing": {
        "request": {
          "qs": {
            "query": "={{$parameter.query}}"
          },
          "url": "/facebook/search/locations",
          "method": "GET"
        }
      },
      "description": "Search for locations. Returns location UIDs for filtering other search endpoints.",
      "resource": "facebookSearch"
    },
    {
      "name": "Search Pages",
      "value": "searchPages",
      "action": "Search facebook pages",
      "routing": {
        "request": {
          "qs": {
            "query": "={{$parameter.query}}"
          },
          "url": "/facebook/search/pages",
          "method": "GET"
        }
      },
      "description": "Search for pages by keyword with optional location filtering. Returns 3 results per call. Use end_cursor for more.",
      "resource": "facebookSearch"
    },
    {
      "name": "Search People",
      "value": "searchPeople",
      "action": "Search facebook people",
      "routing": {
        "request": {
          "qs": {
            "query": "={{$parameter.query}}"
          },
          "url": "/facebook/search/people",
          "method": "GET"
        }
      },
      "description": "Search for Facebook people/profiles by keyword. Returns 3 results per call. Use end_cursor for more.",
      "resource": "facebookSearch"
    },
    {
      "name": "Search Posts",
      "value": "searchPosts",
      "action": "Search facebook posts",
      "routing": {
        "request": {
          "qs": {
            "query": "={{$parameter.query}}"
          },
          "url": "/facebook/search/posts",
          "method": "GET"
        }
      },
      "description": "Search for posts by keyword with optional location and time filters. Returns 3 results per call. Use end_cursor for more.",
      "resource": "facebookSearch"
    },
    {
      "name": "Search Videos",
      "value": "searchVideos",
      "action": "Search facebook videos",
      "routing": {
        "request": {
          "qs": {
            "query": "={{$parameter.query}}"
          },
          "url": "/facebook/search/videos",
          "method": "GET"
        }
      },
      "description": "Search for Facebook videos by keyword. Returns 7 videos per call. Use end_cursor for more.",
      "resource": "facebookSearch"
    },
    {
      "name": "Get Ad Details",
      "value": "getAdDetails",
      "action": "Get ad archive details",
      "routing": {
        "request": {
          "qs": {
            "ad_archive_id": "={{$parameter.adArchiveId}}"
          },
          "url": "/facebook/ads/archive-details",
          "method": "GET"
        }
      },
      "description": "Get detailed info about a specific archived ad by archive ID",
      "resource": "metaAds"
    },
    {
      "name": "Get Page Ad Details",
      "value": "getPageAdDetails",
      "action": "Get page ad details",
      "routing": {
        "request": {
          "qs": {
            "page_id": "={{$parameter.pageId}}"
          },
          "url": "/facebook/ads/page-details",
          "method": "GET"
        }
      },
      "description": "Get detailed info about a specific Facebook page from the Ads Library",
      "resource": "metaAds"
    },
    {
      "name": "Get Supported Countries",
      "value": "getSupportedCountries",
      "action": "Get supported countries",
      "routing": {
        "request": {
          "url": "/facebook/ads/countries",
          "method": "GET"
        }
      },
      "description": "Get list of supported country codes for Meta Ads Library filtering",
      "resource": "metaAds"
    },
    {
      "name": "Search Ads",
      "value": "searchAds",
      "action": "Search the meta ads library",
      "routing": {
        "request": {
          "url": "/facebook/ads/search",
          "method": "GET"
        }
      },
      "description": "Search ads in the Meta Ad Library by keyword or page ID. Returns 10 ads per call. Use end_cursor for more.",
      "resource": "metaAds"
    },
    {
      "name": "Search by Keyword",
      "value": "searchAdsByKeyword",
      "action": "Search ads by keyword",
      "routing": {
        "request": {
          "qs": {
            "query": "={{$parameter.adsQuery}}"
          },
          "url": "/facebook/ads/keywords",
          "method": "GET"
        }
      },
      "description": "Search for ads by keyword with optional country filter",
      "resource": "metaAds"
    },
    {
      "name": "Find City Coordinates",
      "value": "findCityCoordinates",
      "action": "Find city coordinates",
      "routing": {
        "request": {
          "qs": {
            "city": "={{$parameter.cityName}}"
          },
          "url": "/facebook/marketplace/city-coordinates",
          "method": "GET"
        }
      },
      "description": "Get GPS coordinates for a city to use as location filters",
      "resource": "marketplace"
    },
    {
      "name": "Get Categories",
      "value": "getCategories",
      "action": "Get marketplace categories",
      "routing": {
        "request": {
          "url": "/facebook/marketplace/categories",
          "method": "GET"
        }
      },
      "description": "Get all Marketplace categories with seo_url and category ID values",
      "resource": "marketplace"
    },
    {
      "name": "Get Listing Details",
      "value": "getListingDetails",
      "action": "Get marketplace listing details",
      "routing": {
        "request": {
          "qs": {
            "listing_id": "={{$parameter.listingId}}"
          },
          "url": "/facebook/marketplace/listing",
          "method": "GET"
        }
      },
      "description": "Get detailed info about a single Marketplace listing",
      "resource": "marketplace"
    },
    {
      "name": "Get Seller Details",
      "value": "getSellerDetails",
      "action": "Get marketplace seller details",
      "routing": {
        "request": {
          "qs": {
            "seller_id": "={{$parameter.sellerId}}"
          },
          "url": "/facebook/marketplace/seller",
          "method": "GET"
        }
      },
      "description": "Get seller profile, ratings, reviews, and badges",
      "resource": "marketplace"
    },
    {
      "name": "Search Listings",
      "value": "searchListings",
      "action": "Search marketplace listings",
      "routing": {
        "request": {
          "url": "/facebook/marketplace/search",
          "method": "GET"
        }
      },
      "description": "Search Facebook Marketplace items with filters. Returns 24 items per call. Use end_cursor for more.",
      "resource": "marketplace"
    },
    {
      "name": "Search Rentals",
      "value": "searchRentals",
      "action": "Search marketplace rentals",
      "routing": {
        "request": {
          "url": "/facebook/marketplace/rentals",
          "method": "GET"
        }
      },
      "description": "Search rental property listings with filters. Returns 24 items per call. Use end_cursor for more.",
      "resource": "marketplace"
    },
    {
      "name": "Search Vehicles",
      "value": "searchVehicles",
      "action": "Search marketplace vehicles",
      "routing": {
        "request": {
          "url": "/facebook/marketplace/vehicles",
          "method": "GET"
        }
      },
      "description": "Search vehicle listings with filters. Returns 24 items per call. Use end_cursor for more.",
      "resource": "marketplace"
    },
    {
      "name": "Download Media",
      "value": "downloadMedia",
      "action": "Download facebook media",
      "routing": {
        "request": {
          "qs": {
            "url": "={{$parameter.url}}"
          },
          "url": "/facebook/media/download",
          "method": "GET"
        }
      },
      "description": "Download media (images, videos, audio) from Facebook URLs",
      "resource": "facebookMedia"
    }
  ]

npm_readme:
  # n8n-nodes-socialapis

  ![n8n.io - Workflow Automation](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png)

  This is an n8n community node. It lets you access public social media data with [SocialAPIs](https://socialapis.io/)

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

  ## How to install

  ### Community Nodes

  For n8n version 0.187 and later, you can install this node through the Community Nodes panel:

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

  ## Credentials

  To use this node, you will need to authenticate with the SocialAPIs API.

  1. Sign up for a [SocialAPIs account](https://socialapis.io/)
  2. Copy API Token
  3. Create new credential in n8n
     - Use the SocialAPIs node
     - Under Credential to connect with, click Create New Credential
     - Paste API Token

  ## Supported resources and operations

  | Resource | Operations |
  | --- | --- |
  | **Facebook Page** | Get Page ID, Get Page Details, Get Page Posts, Get Page Reels |
  | **Facebook Post** | Get Post Details, Get Post Comments, Get Post Reactions |
  | **Facebook Group** | Get Group Details, Get Group Posts |
  | **Facebook Media** | Get Media Details |
  | **Facebook Search** | Search Pages, Search People, Search Posts, Search Videos, Search Locations |
  | **Meta Ads Library** | Search Ads, Search by Keyword, Get Ad Details, Get Page Ad Details, Get Supported Countries |
  | **Facebook Marketplace** | Browse listings, item details, categories, locations |

  ## Usage examples

  The examples below show how to wire the node into a workflow. Each example assumes you have already created a **SocialAPIs API** credential as described above.

  ### Example 1 — Fetch the latest posts from a Facebook Page

  Get the three most recent posts from the Nike Facebook Page, including reactions, media, and comment counts.

  1. Add a **Manual Trigger** node.
  2. Add a **SocialAPIs** node and connect it after the trigger.
  3. Configure the SocialAPIs node:
     - **Credential**: select your SocialAPIs credential
     - **Resource**: `Facebook Page`
     - **Operation**: `Get Page Posts`
     - **Page URL**: `https://www.facebook.com/nike`
  4. (Optional) Open **Additional Fields** and set:
     - **Timezone**: `America/New_York`
     - **After Time**: `2026-01-01T00:00:00Z`
  5. Execute the workflow. The node returns an array of posts. To page through more posts, copy `end_cursor` from the response into **Additional Fields → End Cursor** and run again, or feed it back in a loop using an **IF** + **Set** node.

  Equivalent node JSON (paste into n8n via *Import from clipboard*):

  ```json
  {
    "parameters": {
      "resource": "facebookPage",
      "operation": "getPagePosts",
      "link": "https://www.facebook.com/nike",
      "additionalFields": {
        "timezone": "America/New_York"
      }
    },
    "name": "SocialAPIs",
    "type": "n8n-nodes-socialapis.socialApis",
    "typeVersion": 1,
    "credentials": {
      "socialApisApi": {
        "name": "SocialAPIs account"
      }
    }
  }
  ```

  ### Example 2 — Search the Meta Ads Library by keyword

  Find active ads in the US that mention "running shoes", sorted by most recent.

  1. Add a **SocialAPIs** node to your workflow.
  2. Configure it:
     - **Resource**: `Meta Ads Library`
     - **Operation**: `Search Ads`
  3. Open **Additional Fields** and set:
     - **Query**: `running shoes`
     - **Country**: `US`
     - **Active Status**: `Active`
     - **Sort Data**: `Most Recent`
  4. Execute the workflow. The node returns up to 10 ads per call along with an `end_cursor` you can use for pagination.

  Equivalent node JSON:

  ```json
  {
    "parameters": {
      "resource": "metaAds",
      "operation": "searchAds",
      "additionalFields": {
        "query": "running shoes",
        "country": "US",
        "activeStatus": "Active",
        "sort_data": "recent"
      }
    },
    "name": "SocialAPIs",
    "type": "n8n-nodes-socialapis.socialApis",
    "typeVersion": 1,
    "credentials": {
      "socialApisApi": {
        "name": "SocialAPIs account"
      }
    }
  }
  ```

  ### Example 3 — Resolve a Page URL to a Page ID, then drill into its ads

  Two-step workflow: take a Facebook page link, resolve it to a numeric Page ID, then pull the page's ad-library record.

  1. **Manual Trigger** → **SocialAPIs (Get Page ID)**
     - **Resource**: `Facebook Page`
     - **Operation**: `Get Page ID`
     - **Page URL**: `https://www.facebook.com/nike`
  2. **SocialAPIs (Get Page Ad Details)** connected after step 1
     - **Resource**: `Meta Ads Library`
     - **Operation**: `Get Page Ad Details`
     - **Page ID**: `={{ $json.page_id }}` (an n8n expression that reads the ID from the previous node's output)
  3. Execute. The first node returns the Page ID, and the second uses that ID to fetch the page's Meta Ads Library profile.

  ### Tips

  - All "list" operations (page posts, reels, ads search, search pages, etc.) are cursor-paginated. Use the returned `end_cursor` value in **Additional Fields → End Cursor** to fetch the next page.
  - Use the **Search Locations** operation under *Facebook Search* to find a `location_uid` you can then pass into **Search Pages**, **Search People** or **Search Posts** to scope results geographically.
  - See the full list of endpoints, parameters and response shapes in the [SocialAPIs documentation](https://docs.socialapis.io/).

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [SocialAPIs Documentation](https://docs.socialapis.io/)
  * [Sign up for a SocialAPIs account](https://socialapis.io/)

ai_documentation_summary:
  {"purpose":"Provides access to public social media data through the SocialAPIs service. It can retrieve Facebook, Meta Ads Library, and Facebook Marketplace information for use in n8n workflows.","capabilities":["Get Facebook Page ID, details, posts, and reels","Get Facebook Post details, comments, and reactions","Get Facebook Group details and posts","Get Facebook Media details","Search Facebook pages, people, posts, videos, and locations","Search Meta Ads Library ads, ads by keyword, ad details, page ad details, and supported countries","Browse Facebook Marketplace listings, item details, categories, and locations","Cursor-based pagination for list operations using end_cursor"],"authentication":"API token required via SocialAPIs account credential","commonUseCases":["Monitoring recent posts from a Facebook Page","Searching the Meta Ads Library for ads by keyword or country","Resolving a Facebook Page URL to an ID and fetching its ad-library details","Looking up public Facebook search results or Marketplace listings"],"limitations":["Only accesses public social media data","List operations are cursor-paginated and require end_cursor for subsequent pages","Search and list calls may return limited results per request (for example, up to 10 ads per call in the examples)"],"relatedNodes":[]}


