# nodes

node_type: n8n-nodes-pdfco.PDFco Api
package_name: n8n-nodes-pdfco
display_name: PDF.co Api
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: artifex-dev
author_github_url: https://github.com/pdfdotco/
npm_package_name: n8n-nodes-pdfco
npm_version: 1.0.6
community_fetched_at: 2026-03-25T21:19:40.602Z
ai_summary_generated_at: 2026-03-25 22:47:20
description:
  Generate PDF, extract data from PDF, split PDF, merge PDF, convert PDF. Fill PDF forms, add text and images to pdf and much more with pdf.co!

properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "AI Invoice Parser",
      "options": [
        {
          "name": "AI Invoice Parser",
          "value": "AI Invoice Parser",
          "action": "AI Invoice Parser",
          "description": "Transform your invoice processing with our advanced AI. Enjoy quick, accurate data extraction that eliminates manual effort and saves you valuable time."
        },
        {
          "name": "URL/HTML to PDF",
          "value": "URL/HTML to PDF",
          "action": "URL/HTML to PDF",
          "description": "Convert HTML or URL to PDF with advanced options (e.g. layout, orientation). Supports HTML templates (Handlebar and Mustache)."
        },
        {
          "name": "Merge PDF",
          "value": "Merge PDF",
          "action": "Merge PDF",
          "description": "Combine multiple document formats into a single PDF. Supported formats include PDF, DOC, DOCX, XLS, JPG, PNG, and more."
        },
        {
          "name": "Split PDF",
          "value": "Split PDF",
          "action": "Split PDF",
          "description": "PDF Splitter that takes PDF file and splits into multiple PDF files using page index, page range, text search or barcode search"
        },
        {
          "name": "Convert To PDF",
          "value": "Convert to PDF",
          "action": "Convert to PDF",
          "description": "Convert a variety of formats such as URLs, HTML code, documents, spreadsheets, presentations, images, and more into PDF"
        },
        {
          "name": "Convert From PDF",
          "value": "Convert from PDF",
          "action": "Convert from PDF",
          "description": "Convert PDF pages to structured CSV, XML, JSON, Plain Text, Convert PDF to JPG, PDF to PNG, PDF to TIFF, and more"
        },
        {
          "name": "Add Text/Images to PDF",
          "value": "Add Text/Images to PDF",
          "action": "Add Text/Images to PDF",
          "description": "Add text, images, and annotations to PDF documents with precise positioning and styling options"
        },
        {
          "name": "Fill a PDF Form",
          "value": "Fill a PDF Form",
          "action": "Fill a PDF Form",
          "description": "Fill interactive PDF forms with text, checkboxes, and other form elements"
        },
        {
          "name": "PDF Information & Form Fields",
          "value": "PDF Information & Form Fields",
          "action": "PDF Information & Form Fields",
          "description": "Extract metadata and form field information from PDF documents"
        },
        {
          "name": "Compress PDF",
          "value": "Compress PDF",
          "action": "Compress PDF",
          "description": "Reduce PDF file size while maintaining quality"
        },
        {
          "name": "PDF Security",
          "value": "PDF Security",
          "action": "PDF Security",
          "description": "Add or remove password protection and security features from PDF documents"
        },
        {
          "name": "Rotate PDF Pages",
          "value": "Rotate PDF Pages",
          "action": "Rotate PDF Pages",
          "description": "Rotate PDF pages manually or automatically detect and fix rotation based on text analysis"
        },
        {
          "name": "Delete PDF Pages",
          "value": "Delete PDF Pages",
          "action": "Delete PDF Pages",
          "description": "Remove specific pages from a PDF document"
        },
        {
          "name": "Search in PDF",
          "value": "Search in PDF",
          "action": "Search in PDF",
          "description": "Search for specific text within PDF documents or scanned images"
        },
        {
          "name": "Search & Replace Text or Delete",
          "value": "Search & Replace Text or Delete",
          "description": "Search and delete text, replace text, or replace text with images in PDF documents"
        },
        {
          "name": "Barcode Reader",
          "value": "Barcode Reader",
          "description": "Decode barcodes from images or PDF documents swiftly and accurately"
        },
        {
          "name": "Barcode Generator",
          "value": "Barcode Generator",
          "description": "Generate various types of barcodes including QR codes, Code 128, Code 39, and more"
        },
        {
          "name": "Make PDF Searchable or Unsearchable",
          "value": "Make PDF Searchable or Unsearchable",
          "description": "Convert scanned PDF or image files into text-searchable PDFs using OCR or make them unsearchable/scanned"
        },
        {
          "name": "Upload File",
          "value": "Upload File to PDF.co",
          "action": "Upload File to PDF.co",
          "description": "Upload a file to PDF.co and get a URL"
        }
      ],
      "displayName": "Action",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "AI Invoice Parser",
      "value": "AI Invoice Parser",
      "action": "AI Invoice Parser",
      "description": "Transform your invoice processing with our advanced AI. Enjoy quick, accurate data extraction that eliminates manual effort and saves you valuable time."
    },
    {
      "name": "URL/HTML to PDF",
      "value": "URL/HTML to PDF",
      "action": "URL/HTML to PDF",
      "description": "Convert HTML or URL to PDF with advanced options (e.g. layout, orientation). Supports HTML templates (Handlebar and Mustache)."
    },
    {
      "name": "Merge PDF",
      "value": "Merge PDF",
      "action": "Merge PDF",
      "description": "Combine multiple document formats into a single PDF. Supported formats include PDF, DOC, DOCX, XLS, JPG, PNG, and more."
    },
    {
      "name": "Split PDF",
      "value": "Split PDF",
      "action": "Split PDF",
      "description": "PDF Splitter that takes PDF file and splits into multiple PDF files using page index, page range, text search or barcode search"
    },
    {
      "name": "Convert To PDF",
      "value": "Convert to PDF",
      "action": "Convert to PDF",
      "description": "Convert a variety of formats such as URLs, HTML code, documents, spreadsheets, presentations, images, and more into PDF"
    },
    {
      "name": "Convert From PDF",
      "value": "Convert from PDF",
      "action": "Convert from PDF",
      "description": "Convert PDF pages to structured CSV, XML, JSON, Plain Text, Convert PDF to JPG, PDF to PNG, PDF to TIFF, and more"
    },
    {
      "name": "Add Text/Images to PDF",
      "value": "Add Text/Images to PDF",
      "action": "Add Text/Images to PDF",
      "description": "Add text, images, and annotations to PDF documents with precise positioning and styling options"
    },
    {
      "name": "Fill a PDF Form",
      "value": "Fill a PDF Form",
      "action": "Fill a PDF Form",
      "description": "Fill interactive PDF forms with text, checkboxes, and other form elements"
    },
    {
      "name": "PDF Information & Form Fields",
      "value": "PDF Information & Form Fields",
      "action": "PDF Information & Form Fields",
      "description": "Extract metadata and form field information from PDF documents"
    },
    {
      "name": "Compress PDF",
      "value": "Compress PDF",
      "action": "Compress PDF",
      "description": "Reduce PDF file size while maintaining quality"
    },
    {
      "name": "PDF Security",
      "value": "PDF Security",
      "action": "PDF Security",
      "description": "Add or remove password protection and security features from PDF documents"
    },
    {
      "name": "Rotate PDF Pages",
      "value": "Rotate PDF Pages",
      "action": "Rotate PDF Pages",
      "description": "Rotate PDF pages manually or automatically detect and fix rotation based on text analysis"
    },
    {
      "name": "Delete PDF Pages",
      "value": "Delete PDF Pages",
      "action": "Delete PDF Pages",
      "description": "Remove specific pages from a PDF document"
    },
    {
      "name": "Search in PDF",
      "value": "Search in PDF",
      "action": "Search in PDF",
      "description": "Search for specific text within PDF documents or scanned images"
    },
    {
      "name": "Search & Replace Text or Delete",
      "value": "Search & Replace Text or Delete",
      "description": "Search and delete text, replace text, or replace text with images in PDF documents"
    },
    {
      "name": "Barcode Reader",
      "value": "Barcode Reader",
      "description": "Decode barcodes from images or PDF documents swiftly and accurately"
    },
    {
      "name": "Barcode Generator",
      "value": "Barcode Generator",
      "description": "Generate various types of barcodes including QR codes, Code 128, Code 39, and more"
    },
    {
      "name": "Make PDF Searchable or Unsearchable",
      "value": "Make PDF Searchable or Unsearchable",
      "description": "Convert scanned PDF or image files into text-searchable PDFs using OCR or make them unsearchable/scanned"
    },
    {
      "name": "Upload File",
      "value": "Upload File to PDF.co",
      "action": "Upload File to PDF.co",
      "description": "Upload a file to PDF.co and get a URL"
    }
  ]

npm_readme:
  # n8n-nodes-pdfco

  This is an n8n community node that enables you to integrate PDF.co's powerful PDF processing capabilities into your n8n workflows. PDF.co is a comprehensive PDF processing API that allows you to convert, merge, split, and manipulate PDF documents programmatically.

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

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

  ## Installation
  ### Community Nodes (Recommended)
  For users on n8n v0.187+, you can install this node directly from the n8n Community Nodes panel in the n8n editor:

  1. Open your n8n editor
  2. Go to Settings > Community Nodes
  3. Search for "n8n-nodes-pdfco"
  4. Click Install
  5. Reload the editor

  ### Manual Installation
  You can also install this node manually:

  1. Navigate to your n8n installation directory
  2. Run the following command:
  ```bash
  npm install n8n-nodes-pdfco
  ```
  3. Restart your n8n server


  ## Operations

  This node provides comprehensive PDF processing capabilities through PDF.co's API. Here are the available features:

  ### 1. AI-Powered Document Processing
  - AI Invoice Parser: Extract data from invoices using AI-powered parsing

  ### 2. URL/HTML to PDF Conversion
  - URL to PDF
  - HTML to PDF
  - HTML Template to PDF

  ### 3. PDF Merging
  - Merge multiple PDFs into one
  - Support for merging from different file formats (merge2)

  ### 4. PDF Splitting
  - Split by page number
  - Split by search text
  - Split by barcode

  ### 5. Document to PDF Conversion
  - Document to PDF (RTF, DOC, DOCX, TXT)
  - Spreadsheet to PDF (CSV, XLS, XLSX, TXT Spreadsheet)
  - Image to PDF (JPG, PNG, TIFF)
  - Email to PDF (MSG or EML)

  ### 6. PDF to Other Formats
  - PDF to CSV
  - PDF to HTML
  - PDF to Images (JPG, PNG, TIFF, WEBP)
  - PDF to JSON
  - PDF to Text
  - PDF to Excel (XLS/XLSX)
  - PDF to XML

  ### 7. PDF Modification
  - Add text annotations
  - Add images to PDF documents
  - Fill interactive PDF forms with data
  - Extract PDF metadata
  - Get form field information

  ### 8. PDF Optimization
  - Compress PDF files
  - Optimize PDF for web or storage
  - Remove password protection
  - Add password protection
  - Rotate pages in PDF documents
  - Remove specific pages from PDF

  ### 9. PDF Search and Text Operations
  - Search for text within PDF documents
  - Search and delete text
  - Search and replace text
  - Search and replace with image

  ### 10. Barcode Operations
  - Extract barcode data from PDFs
  - Generate barcodes in PDFs

  ### 11. PDF OCR and Searchability
  - Make scanned PDF searchable (OCR)
  - Make searchable PDF unsearchable

  ### 12. File Management
  - Standard file upload
  - Create file URL from input text/content
  - Upload from Base64 encoded data

  ## Credentials

  To use this node, you need a PDF.co API key. Here's how to get started:

  1. Sign up for a PDF.co account at [https://pdf.co](https://pdf.co)
  2. Navigate to your dashboard and obtain your API key
  3. In n8n, add your PDF.co credentials by providing your API key

  ## Usage

  This node allows you to automate PDF processing tasks in your n8n workflows. Here are some common use cases:

  - Process invoices using AI-powered parsing
  - Automatically convert HTML reports to PDF
  - Merge multiple PDF documents into a single file
  - Extract text from PDF documents for data processing
  - Add watermarks to PDF documents
  - Compress PDF files to reduce size
  - Secure PDFs with password protection
  - Convert various document formats to PDF
  - Extract data from PDFs to other formats
  - Manage and modify PDF documents programmatically

  For detailed examples and workflow templates, visit our [documentation](https://docs.pdf.co).

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [PDF.co API Documentation](https://docs.pdf.co)
  * [PDF.co Pricing](https://app.pdf.co/subscriptions)

  ## Version history

  ### 1.0.0
  - Initial release with comprehensive PDF processing capabilities
  - Full integration with PDF.co API services
  - Support for all core PDF operations including conversion, merging, and modification

  ### 1.0.1
  - Enhanced documentation with improved installation and usage instructions

  ### 1.0.2
  - Improved code stability and performance
  - Enhanced error handling and response management

  ### 1.0.3
  - Improved code stability and performance

  ### 1.0.4
  - AI Invoice Parser: Added support for custom field extraction, enabling more flexible and tailored data parsing. 
  - Added user-friendly descriptions for all PDF.co modules to help users better understand each feature's capabilities

  ### 1.0.5
  - Search PDF/Convert From PDF: Added support for the Inline option, enabling direct file output
  - Barcode Generator: Resolved an issue affecting barcode generation functionality.
  - Updated description links to point to new dedicated documentation

  ### 1.0.6
  - AI Invoice Parser: Clearer field descriptions and helpful usage hints

ai_documentation_summary:
  {"purpose":"This n8n community node integrates PDF.co's API to enable comprehensive PDF processing tasks including conversion, merging, splitting, data extraction, and document manipulation within automated workflows.","capabilities":["AI-powered invoice parsing and data extraction","Convert URLs, HTML, and various document formats to PDF","Merge multiple PDFs into a single document","Split PDFs by page number, search text, or barcode","Convert PDFs to CSV, HTML, images, JSON, text, Excel, and XML","Add text annotations and images to PDFs","Fill interactive PDF forms","Compress and optimize PDF files","Add or remove password protection","Rotate and delete specific pages"],"authentication":"API key required","commonUseCases":["Automated invoice data extraction","Converting HTML reports to PDF format","Consolidating multiple PDF documents","Extracting text from PDFs for database processing","Securing PDFs with password protection"],"limitations":["Requires a paid PDF.co API subscription","Limited to PDF.co's API rate limits and service availability"],"relatedNodes":["n8n-nodes-webhook","n8n-nodes-httpRequest","n8n-nodes-file"]}


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

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

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

npm_readme:
  # n8n-nodes-adyntel

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

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

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

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

  ## Installation

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

  In brief, you can install this node by:

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

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

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

  ## Operations

  ### Get Facebook Ads

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

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

  ## Credentials

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

  ### Prerequisites

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

  ### Setting up credentials

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

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

  ## Compatibility

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

  ## Usage

  ### Basic Example

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

  ### Using with Previous Nodes

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

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

  ### Example Use Cases

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

  ## Resources

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

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


node_type: @enginemailer/n8n-nodes-enginemailer.enginemailer
package_name: @enginemailer/n8n-nodes-enginemailer
display_name: Enginemailer
description: Consume Enginemailer API
category: Community
development_style: declarative
version: 1.0.1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: enginemailer
author_github_url: https://github.com/Enginemailer-Official/n8n-nodes-enginemailer.git
npm_package_name: @enginemailer/n8n-nodes-enginemailer
npm_version: 1.0.1
community_fetched_at: 2026-03-25T21:19:40.604Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-enginemailer

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

  Enginemailer is an all-in-one email marketing platform offering lead generation, marketing, transactional and automation features.

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

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

  ## Installation

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

  ## Operations

  - Subscriber
    - Add or update a subscriber
    - Deactivate a subscriber
    - Delete a subscriber
    - Find a subscriber
    - Send email
    - Tag a subscriber to subcategory
    - Untag a subscriber from subcategory

  ## Events

  - Subscriber
    - On autoresponder completed
    - On autoresponder triggered
    - On subscribed
    - On subscriber deleted
    - On subscriber's fields updated
    - On tagged with subcategory
    - On unsubscribed
    - On untagged with subcategory

  ## Credentials

  You can use these credentials to authenticate the following nodes:

  - Enginemailer
  - Enginemailer Trigger

  ### Prerequisites

  Create an [Enginemailer](https://www.enginemailer.com/) account.

  ### Supported authentication methods

  - API key

  ### Related resources

  Refer to [Enginemailer's API documentation](https://connect.enginemailer.com/n8n/index.html) for more information about the service.

  ### Using API Key

  To configure this credential, you'll need:

  - An **API Key**: Generate an API key from the **Enginemailer** account -> API Keys. Refer to the [API Authentication documentation](https://enginemailer.zendesk.com/hc/en-us/articles/360057634711-Manage-API-keys-for-your-account) for more detailed instructions.

  ## Compatibility

  - Tested against n8n version 1.103.2

  ### Node parameters

  Use these parameters to configure your node.

  #### Poll Times

  n8n's Enginemailer trigger node uses polling for check for updates on configured Enginemailer resources. The **Poll Times** parameter configures the querying frequency:

  - Every Minute
  - Every Hour
  - Every Day
  - Every Week
  - Every Month
  - Every X: Check for updates every given number of minutes or hours.
  - Custom: Customize the polling interval by providing a cron expression.
    Use the **Add Poll Time** button to add more polling intervals.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Enginemailer's API documentation](https://connect.enginemailer.com/n8n/index.html)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows with Enginemailer, an all-in-one email marketing platform, allowing users to manage subscribers and send emails programmatically.","capabilities":["Add or update email subscribers","Deactivate or delete subscribers","Search for specific subscribers","Send transactional emails","Tag and untag subscribers into subcategories","Trigger workflows on subscriber events (subscription, deletion, field updates, tagging, unsubscribing)"],"authentication":"API key","commonUseCases":["Automated lead generation and nurturing","Transactional email delivery (password resets, receipts)","Marketing campaign automation","Subscriber lifecycle management"],"limitations":["Community node (not official n8n node)","Requires separate Enginemailer account and API key setup"],"relatedNodes":["Enginemailer Trigger"]}


node_type: @respond-io/n8n-nodes-respond-io.respondio
package_name: @respond-io/n8n-nodes-respond-io
display_name: Respond.io
description: Read, update, write and delete data from Respond.io
category: Community
development_style: declarative
version: 1.6.0
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: respond.io
author_github_url: https://github.com/respond-io/n8n-integration.git
npm_package_name: @respond-io/n8n-nodes-respond-io
npm_version: 1.6.0
community_fetched_at: 2026-03-25T21:19:40.604Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-respondio

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

  Respond.io is a customer conversation management platform that helps businesses manage customer conversations across multiple channels like WhatsApp, Facebook Messenger, Instagram, and more. This node provides comprehensive integration with the Respond.io API to automate customer communication workflows.

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

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

  ## Installation

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

  ## Operations

  ### Respond.io Actions Node

  The Respond.io Actions node supports the following operations:

  #### Channels

  - **Get All Channels** - Retrieve all channels connected to your workspace

  #### Closing Notes

  - **Get All Closing Notes** - Retrieve all closing notes templates

  #### Comments

  - **Add Comment** - Add a comment to a conversation

  #### Contacts

  - **Create Contact** - Create a new contact
  - **Create or Update Contact** - Create or update an existing contact
  - **Update Contact** - Update an existing contact's information
  - **Find Contact** - Find a specific contact by identifier
  - **Get Many Contacts** - Retrieve multiple contacts with search filtering
  - **Add Tags** - Add tags to a contact
  - **Remove Tags** - Remove tags from a contact
  - **Add Space Tag** - Add a space tag to a contact
  - **Delete Space Tag** - Delete a space tag
  - **Update Space Tag** - Update a space tag
  - **Delete Contact** - Delete a contact
  - **Find Contact Channels** - Find channels associated with a contact

  #### Contact Fields

  - **Get All Custom Fields** - Retrieve all custom fields
  - **Find Custom Field** - Find a specific custom field
  - **Create Custom Field** - Create a new custom field

  #### Conversations

  - **Assign or Unassign Conversation** - Assign or unassign a conversation to/from a user
  - **Open or Close Conversation** - Open or close a conversation

  #### Lifecycle

  - **Update Contact Lifecycle** - Update a contact's lifecycle stage
  - **Remove Contact Lifecycle** - Remove a contact's lifecycle stage

  #### Messages

  - **Send Message** - Send a message to a contact (supports text, email, attachments, quick replies, WhatsApp templates, and custom payloads)
  - **Find Message** - Find a specific message by ID

  #### Users

  - **Find User** - Find a specific user by ID
  - **Get All Users** - Retrieve all users in the workspace

  ## Triggers

  ### Respond.io Trigger Node

  The Respond.io Trigger node can listen for the following events:

  - **New Incoming Message** - Triggered when a new message is received
  - **New Outgoing Message** - Triggered when a new outgoing message is sent
  - **New Comment** - Triggered when a new comment is added to a conversation
  - **Conversation Opened** - Triggered when a conversation is opened
  - **Conversation Closed** - Triggered when a conversation is closed
  - **New Contact** - Triggered when a new contact is created
  - **Contact Updated** - Triggered when a contact is updated
  - **Contact Assignee Updated** - Triggered when a contact's assignee is changed
  - **Contact Tag Updated** - Triggered when a contact's tags are modified
  - **Contact Lifecycle Updated** - Triggered when a contact's lifecycle stage changes

  ## Credentials

  To use this node, you need to authenticate with Respond.io. You'll need:

  1. **API Key** - Your Respond.io API key

  ### How to get your API Key

  1. Log in to your Respond.io account
  2. Go to **Settings** → **Integrations** → **N8N**
  3. Generate a new API key
  4. Copy the API key and use it in the credentials

  ## Compatibility

  - **Minimum n8n version**: 1.0.0
  - **Tested with n8n versions**: 1.0.0+
  - **Node.js version**: >=18.0.0

  ## Usage

  ### Basic Workflow Example

  1. **Set up a trigger** - Use the Respond.io Trigger node to listen for new incoming messages
  2. **Process the message** - Use the Respond.io Actions node to find the contact and send a response
  3. **Add automation** - Create workflows that automatically assign conversations, update contact information, or send follow-up messages

  ### Advanced Workflow Example

  1. **New message trigger** → **Find contact** → **Check contact tags** → **Send automated response** → **Assign to team member**

  ### Message Types Supported

  The Send Message operation supports multiple message types:

  - **Text messages** - Simple text messages
  - **Email messages** - Rich email content with subject and body
  - **Attachments** - Send files and media
  - **Quick replies** - Interactive quick reply buttons
  - **WhatsApp templates** - Pre-approved WhatsApp message templates
  - **Custom payloads** - Custom message formats for specific channels

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Respond.io API Documentation](https://developers.respond.io/)
  - [Respond.io Platform](https://respond.io/)

  ## Version history

  ### Version 1.0.0

  - Initial release
  - Support for all major Respond.io API operations
  - Webhook triggers for real-time events
  - Comprehensive contact and conversation management
  - Multi-channel message sending capabilities

ai_documentation_summary:
  {"purpose":"This n8n community node enables full CRUD operations on Respond.io customer conversation management data, including contacts, conversations, messages, and channels, as well as real-time event triggering.","capabilities":["Get all channels","Retrieve and manage closing notes templates","Create, update, find, and delete contacts","Manage contact tags and space tags","Manage custom fields","Assign/unassign conversations to users","Open or close conversations","Update contact lifecycle stages","Send messages (text, email, attachments, quick replies, WhatsApp templates, custom payloads)","Find messages by ID"],"authentication":"API Key required (Respond.io API Key via Credentials)","commonUseCases":["Automated customer support responses across WhatsApp, Facebook Messenger, and Instagram","Real-time workflow triggers when new customer messages arrive","Automated contact enrichment and tagging based on incoming message content","Conversation assignment and routing to team members","Multi-channel message delivery with attachments and quick replies"],"limitations":["Community node (not official n8n node)","Requires Respond.io API key access"],"relatedNodes":["Respond.io Trigger","Respond.io Actions","Respond.io Credentials"]}


node_type: n8n-nodes-midiacode.midiacode
package_name: n8n-nodes-midiacode
display_name: Midiacode
description: Consume Midiacode API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: lgavinho
author_github_url: https://github.com/midiacode-labs/
npm_package_name: n8n-nodes-midiacode
npm_version: 0.1.0
community_fetched_at: 2026-03-25T21:19:40.605Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "content",
      "options": [
        {
          "name": "Content",
          "value": "content"
        },
        {
          "name": "Push Notification",
          "value": "pushNotification"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create content",
          "routing": {
            "request": {
              "url": "/public/content/",
              "method": "POST"
            }
          },
          "description": "Create a new content item"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get content",
          "routing": {
            "request": {
              "url": "=/public/content/{{$parameter.contentId}}/",
              "method": "GET"
            }
          },
          "description": "Get a specific content item"
        },
        {
          "name": "Get Link",
          "value": "getLink",
          "action": "Get content link",
          "routing": {
            "request": {
              "url": "=/public/content/{{$parameter.contentId}}/link/",
              "method": "GET"
            }
          },
          "description": "Get content link data"
        },
        {
          "name": "Publish",
          "value": "publish",
          "action": "Publish content",
          "routing": {
            "request": {
              "url": "/public/content/publish/",
              "method": "POST"
            }
          },
          "description": "Publish content"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search contents",
          "routing": {
            "request": {
              "url": "=/public/workspace/{{$parameter.workspaceId}}/content",
              "method": "GET"
            }
          },
          "description": "Search contents of a workspace"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update content",
          "routing": {
            "request": {
              "url": "=/public/content/{{$parameter.contentId}}/",
              "method": "PATCH"
            }
          },
          "description": "Update an existing content item"
        },
        {
          "name": "Update Link",
          "value": "updateLink",
          "action": "Update content link",
          "routing": {
            "request": {
              "url": "=/public/content/{{$parameter.contentId}}/link/",
              "method": "PATCH"
            }
          },
          "description": "Update content link data"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "content"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send push notification",
          "routing": {
            "request": {
              "url": "/public/push-notification/",
              "method": "POST",
              "baseURL": "https://account.midiacode.pt"
            }
          },
          "description": "Send a push notification"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pushNotification"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create content",
      "routing": {
        "request": {
          "url": "/public/content/",
          "method": "POST"
        }
      },
      "description": "Create a new content item"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get content",
      "routing": {
        "request": {
          "url": "=/public/content/{{$parameter.contentId}}/",
          "method": "GET"
        }
      },
      "description": "Get a specific content item"
    },
    {
      "name": "Get Link",
      "value": "getLink",
      "action": "Get content link",
      "routing": {
        "request": {
          "url": "=/public/content/{{$parameter.contentId}}/link/",
          "method": "GET"
        }
      },
      "description": "Get content link data"
    },
    {
      "name": "Publish",
      "value": "publish",
      "action": "Publish content",
      "routing": {
        "request": {
          "url": "/public/content/publish/",
          "method": "POST"
        }
      },
      "description": "Publish content"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search contents",
      "routing": {
        "request": {
          "url": "=/public/workspace/{{$parameter.workspaceId}}/content",
          "method": "GET"
        }
      },
      "description": "Search contents of a workspace"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update content",
      "routing": {
        "request": {
          "url": "=/public/content/{{$parameter.contentId}}/",
          "method": "PATCH"
        }
      },
      "description": "Update an existing content item"
    },
    {
      "name": "Update Link",
      "value": "updateLink",
      "action": "Update content link",
      "routing": {
        "request": {
          "url": "=/public/content/{{$parameter.contentId}}/link/",
          "method": "PATCH"
        }
      },
      "description": "Update content link data"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send push notification",
      "routing": {
        "request": {
          "url": "/public/push-notification/",
          "method": "POST",
          "baseURL": "https://account.midiacode.pt"
        }
      },
      "description": "Send a push notification"
    }
  ]

npm_readme:
  # n8n-nodes-midiacode

  This is an n8n community node. It lets you consume the Midiacode API in your n8n workflows.

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

  ## Installation

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

  ## Credentials

  You need to set up the `midiacodeApi` credential.

  1.  Obtain your API Key from the Midiacode platform.
  2.  In n8n, create a new credential for **Midiacode API**.
  3.  Enter your API Key.

  ## Operations

  ### Content

  *   **Search**: Search contents of a workspace.
  *   **Create**: Create a new content item.
  *   **Get**: Get a specific content item.
  *   **Update**: Update an existing content item.
  *   **Get Link**: Get content link data.
  *   **Update Link**: Update content link data.
  *   **Publish**: Publish content.

  ## Parameters

  ### Common Parameters

  *   **Workspace ID**: The ID of the workspace.
  *   **Content ID**: The ID of the content.

  ### Create Content

  *   **Title**: The title of the content.
  *   **Content Type Slug**: The type of content (e.g., `url`, `video`, `pdf`).
  *   **Priority**: Priority of the content (default: `1`).
  *   **GS1 QR Code Enabled**: Enable GS1 QR Code (default: `false`).
  *   **GS1 AI**: GS1 Application Identifier (default: `01`).
  *   **Product EAN13**: EAN13 product code.
  *   **Product Variant**: Product variant.

  ### Update Link

  *   **URL**: The URL for the content link.
  *   **Title**: Title for the link.
  *   **Description**: Description for the link.
  *   **Collectible**: Whether the content is collectible (default: `true`).
  *   **Embedded on App**: Whether the content is embedded on the mobile app (default: `false`).
  *   **Private**: Whether the content is private (default: `false`).
  *   **Recommended**: Whether the content is recommended (default: `false`).
  *   **Shareable**: Whether the content is shareable (default: `true`).
  *   **Skip Content Cover**: Skip content cover on web (default: `false`).
  *   **Version**: Content version (default: `1.0`).

  ### Publish Content

  *   **Status**: Status to publish (`Draft`, `Published`, `Archived`).
  *   **Notification**: Send notification (default: `true`).
  *   **Change Message**: Message describing the change.

  ## Compatibility

  Compatible with n8n@1.0.0 or later.

  ## Testing

  This package includes comprehensive unit tests to ensure all operations work correctly.

  ### Running Tests

  To run the test suite:

  ```bash
  npm test
  ```

  To run tests with coverage:

  ```bash
  npm run test:coverage
  ```

  ## Resources

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

ai_documentation_summary:
  {"purpose":"This n8n community node enables users to interact with the Midiacode API for managing digital content, including searching, creating, updating, and publishing content items.","capabilities":["Search contents within a workspace","Create new content items with various types (URL, video, PDF)","Retrieve specific content items","Update existing content items","Retrieve content link data","Update content link data","Publish content with configurable status and notifications","Support for GS1 QR Code and EAN13 product codes","Configure content visibility and sharing settings"],"authentication":"API Key required","commonUseCases":["Automating content management for digital catalogs","Integrating product information with e-commerce workflows","Managing digital asset links and metadata","Automating content publishing and status updates"],"limitations":["Community node (not official n8n node)","Requires manual API key setup in n8n credentials"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.webhook"]}


node_type: @rogerrogerio/n8n-nodes-rogerroger.rogerRoger
package_name: @rogerrogerio/n8n-nodes-rogerroger
display_name: RogerRoger
description: Interact with RogerRoger API for Person, Organization and Task resources
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: royrr
author_github_url: https://github.com/RogerRogerHQ/n8n-nodes-rogerroger.git
npm_package_name: @rogerrogerio/n8n-nodes-rogerroger
npm_version: 1.10.0
community_fetched_at: 2026-03-25T21:19:40.606Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Person",
          "value": "person"
        },
        {
          "name": "Organization",
          "value": "organization"
        },
        {
          "name": "Task",
          "value": "task"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get person",
          "description": "Get person"
        },
        {
          "name": "Get many",
          "value": "getMany",
          "action": "Get many persons",
          "description": "Get many persons"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create person",
          "description": "Create person"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update person",
          "description": "Update person"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete person",
          "description": "Delete person"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "person"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get organization",
          "description": "Get organization"
        },
        {
          "name": "Get many",
          "value": "getMany",
          "action": "Get many organizations",
          "description": "Get many organizations"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create organization",
          "description": "Create organization"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update organization",
          "description": "Update organization"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete organization",
          "description": "Delete organization"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "organization"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get task",
          "description": "Get task"
        },
        {
          "name": "Get many",
          "value": "getMany",
          "action": "Get many tasks",
          "description": "Get many tasks"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create task",
          "description": "Create task"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update task",
          "description": "Update task"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete task",
          "description": "Delete task"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get tag",
          "description": "Get tag"
        },
        {
          "name": "Get many",
          "value": "getMany",
          "action": "Get many tags",
          "description": "Get many tags"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create tag",
          "description": "Create tag"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update tag",
          "description": "Update tag"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete tag",
          "description": "Delete tag"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get segment",
          "description": "Get segment"
        },
        {
          "name": "Get many",
          "value": "getMany",
          "action": "Get many segments",
          "description": "Get many segments"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create segment",
          "description": "Create segment"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update segment",
          "description": "Update segment"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete segment",
          "description": "Delete segment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "segment"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get",
      "value": "get",
      "action": "Get person",
      "description": "Get person"
    },
    {
      "name": "Get many",
      "value": "getMany",
      "action": "Get many persons",
      "description": "Get many persons"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create person",
      "description": "Create person"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update person",
      "description": "Update person"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete person",
      "description": "Delete person"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get organization",
      "description": "Get organization"
    },
    {
      "name": "Get many",
      "value": "getMany",
      "action": "Get many organizations",
      "description": "Get many organizations"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create organization",
      "description": "Create organization"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update organization",
      "description": "Update organization"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete organization",
      "description": "Delete organization"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get task",
      "description": "Get task"
    },
    {
      "name": "Get many",
      "value": "getMany",
      "action": "Get many tasks",
      "description": "Get many tasks"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create task",
      "description": "Create task"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update task",
      "description": "Update task"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete task",
      "description": "Delete task"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get tag",
      "description": "Get tag"
    },
    {
      "name": "Get many",
      "value": "getMany",
      "action": "Get many tags",
      "description": "Get many tags"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create tag",
      "description": "Create tag"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update tag",
      "description": "Update tag"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete tag",
      "description": "Delete tag"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get segment",
      "description": "Get segment"
    },
    {
      "name": "Get many",
      "value": "getMany",
      "action": "Get many segments",
      "description": "Get many segments"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create segment",
      "description": "Create segment"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update segment",
      "description": "Update segment"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete segment",
      "description": "Delete segment"
    }
  ]

npm_readme:
  # n8n-nodes-rogerroger

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

  RogerRoger is a collaborative task and communication platform designed to streamline workflows by turning emails and chats into actionable tasks for teams.

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

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

  ## Installation

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

  ## Operations

  The node supports the following operations:

  - Person
    - Get
    - Get many
    - Create
    - Update
    - Delete
  - Organization
    - Get
    - Get many
    - Create
    - Update
    - Delete
  - Task
    - Get
    - Get many
    - Create
    - Update
    - Delete

  ## Credentials

  The node supports the API Key authentication method that is required to authenticate with the RogerRoger API.

  ## Compatibility

  Tested against n8n version 1.95.3.

  ## Usage

  1. **Generate an API Key**: Visit the [RogerRoger API Admin](https://app.rogerroger.io/admin/api) to create your API key.

  2. **Set Up Credentials in n8n**:
     - Navigate to the RogerRoger node in your n8n workflow.
     - Create a new credential and enter the API key you generated.

  3. **Select a Resource**:
     - Choose one of the available resources you want to interact with: Person, Organization, or Task.

  4. **Choose an Operation**:
     - Select the operation you wish to perform (e.g., Get, Create, Update, Delete).
     - Provide the necessary data for the selected operation.

  5. **Execute the Node**:
     - Run the node to perform the selected operations on the RogerRoger platform.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [RogerRoger documentation](https://developer.rogerroger.io)

  ## Version history

  - 1.0.0: Initial release
  - 1.0.1: README updated
  - 1.0.2:
  	- Updated README
  	- Chore: Moved repository to public Github
  	- Text changes to improve consistancy between RogerRoger and N8N
  	- Add fields "dueDate" and "organizations" to task resource
  - 1.0.3:
  	- Wrong path specified for node in package.json
  - 1.0.4:
  	- Wrong path to credentials file specified in package.json 
  - 1.0.5:
  	- Add credential test code
  - 1.0.6:
  	- Fix X-API-KEY header
  - 1.0.7:
  	- Update test endpoint
  - 1.0.8:
  	- Provide rules for credential test
  - 1.0.9
  	- Bump version
  - 1.10.0
      - Added a resource locator to more easily find individual people, organizations, or tasks
      - Improved error reporting by using not only toast notifications but also the output window of n8n
      - Restructured and modularized the code to improve maintainability
      - Get many will now use "return all" and "limit" to provide a list of items

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the RogerRoger API to manage Person, Organization, and Task resources within automated workflows.","capabilities":["Retrieve single Person records","Retrieve multiple Person records","Create Person records","Update Person records","Delete Person records","Retrieve single Organization records","Retrieve multiple Organization records","Create Organization records","Update Organization records","Delete Organization records"],"authentication":"API Key required","commonUseCases":["Automating team task management via email and chat conversion","Syncing organizational data between systems","Tracking and managing person-related workflows"],"limitations":["Community node (may have less support than official nodes)","Requires manual API key generation from RogerRoger admin panel"],"relatedNodes":["n8n HTTP Request","n8n Webhook","n8n Code"]}


node_type: n8n-nodes-starfish.campingCare
package_name: n8n-nodes-starfish
display_name: Starfish (CampingCare/HotelCare)
description: Interact with the Starfish API for CampingCare and HotelCare
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: developerscampingcare
author_github_url: https://github.com/CampingCare/n8n-node.git
npm_package_name: n8n-nodes-starfish
npm_version: 2.0.2
community_fetched_at: 2026-03-25T21:19:40.607Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Accommodations API",
          "value": "accommodations"
        },
        {
          "name": "Administrations API",
          "value": "administrations"
        },
        {
          "name": "Availability API",
          "value": "availability"
        },
        {
          "name": "Categories API",
          "value": "categories"
        },
        {
          "name": "Contacts API",
          "value": "contacts"
        },
        {
          "name": "Exchange Rates API",
          "value": "exchangeRates"
        },
        {
          "name": "Invoices API",
          "value": "invoices"
        },
        {
          "name": "Kiosks API",
          "value": "kiosks"
        },
        {
          "name": "Ledgers API",
          "value": "ledgers"
        },
        {
          "name": "License Plates API",
          "value": "licensePlates"
        },
        {
          "name": "Logs API",
          "value": "logs"
        },
        {
          "name": "Price Calculation API",
          "value": "priceCalculation"
        },
        {
          "name": "Products API",
          "value": "products"
        },
        {
          "name": "Rates API",
          "value": "rates"
        },
        {
          "name": "Reservations API",
          "value": "reservations"
        },
        {
          "name": "Tags API",
          "value": "tags"
        },
        {
          "name": "Timezones API",
          "value": "timezones"
        },
        {
          "name": "Users API",
          "value": "users"
        },
        {
          "name": "Widgets API",
          "value": "widgets"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAccommodations",
      "options": [
        {
          "name": "Places",
          "value": "places",
          "action": "Places",
          "description": "Manage accommodation places"
        },
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage accommodation meta information"
        },
        {
          "name": "Get Accommodations",
          "value": "getAccommodations",
          "action": "Get accommodations",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
                "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "get_services": "={{ $parameter[\"get_services\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "/accommodations",
              "method": "GET"
            }
          },
          "description": "You can get your accommodations with the get accommodations method"
        },
        {
          "name": "Get Accommodation",
          "value": "getAccommodation",
          "action": "Get accommodation",
          "routing": {
            "request": {
              "qs": {
                "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
              "method": "GET"
            }
          },
          "description": "With this method you can retreive a single accommodation"
        },
        {
          "name": "Add Accommodation",
          "value": "addAccommodation",
          "action": "Add accommodation",
          "routing": {
            "request": {
              "url": "/accommodations",
              "body": {
                "name": "={{ $parameter[\"name\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "With this method you can add a new accommodation"
        },
        {
          "name": "Update Accommodation",
          "value": "updateAccommodation",
          "action": "Update accommodation",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"update_name\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
              },
              "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "With this method you can update an existing accommodation"
        },
        {
          "name": "Delete Accommodation",
          "value": "deleteAccommodation",
          "action": "Delete accommodation",
          "routing": {
            "request": {
              "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "With this method you can delete a single accommodation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "accommodations"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAdministrations",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage administration meta information"
        },
        {
          "name": "Age Tables",
          "value": "ageTables",
          "action": "Age tables",
          "description": "Get age tables for an administration"
        },
        {
          "name": "Get Places",
          "value": "getPlaces",
          "action": "Get places",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
              },
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}/places",
              "method": "GET"
            }
          },
          "description": "Get places for a specific administration"
        },
        {
          "name": "Get Administrations",
          "value": "getAdministrations",
          "action": "Get administrations",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}",
                "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
                "get_accommodations": "={{ $parameter[\"get_accommodations\"] || undefined }}"
              },
              "url": "/administrations",
              "method": "GET"
            }
          },
          "description": "You can retrieve the administrations of a specific user"
        },
        {
          "name": "Get Administration",
          "value": "getAdministration",
          "action": "Get administration",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}",
                "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
                "get_vat_tables": "={{ $parameter[\"get_vat_tables\"] || undefined }}"
              },
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single administration by id"
        },
        {
          "name": "Update Administration",
          "value": "updateAdministration",
          "action": "Update administration",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"update_name\"] || undefined }}"
              },
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update an administration by id"
        },
        {
          "name": "Add Administration",
          "value": "addAdministration",
          "action": "Add administration",
          "routing": {
            "request": {
              "url": "/administrations",
              "body": {
                "name": "={{ $parameter[\"name\"] }}",
                "type": "={{ $parameter[\"type\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new administration (full PMS or lite version)"
        },
        {
          "name": "Delete Administration",
          "value": "deleteAdministration",
          "action": "Delete administration",
          "routing": {
            "request": {
              "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete an administration by id"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "administrations"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStock",
      "options": [
        {
          "name": "Get Stock",
          "value": "getStock",
          "action": "Get stock",
          "routing": {
            "request": {
              "qs": {
                "from": "={{ $parameter[\"from\"] || undefined }}",
                "till": "={{ $parameter[\"till\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
              },
              "url": "/availability/stock",
              "method": "GET"
            }
          },
          "description": "Get availability stock for an accommodation"
        },
        {
          "name": "Get Places",
          "value": "getPlaces",
          "action": "Get places",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "backend": "={{ $parameter[\"backend\"] || undefined }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
              },
              "url": "/availability/places",
              "method": "GET"
            }
          },
          "description": "Get available places"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "availability"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getCategories",
      "options": [
        {
          "name": "Get Categories",
          "value": "getCategories",
          "action": "Get categories",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
                "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
                "status[2]": "={{ $parameter[\"status_2\"] || undefined }}"
              },
              "url": "/categories",
              "method": "GET"
            }
          },
          "description": "Get a list of categories from the system"
        },
        {
          "name": "Get Category",
          "value": "getCategory",
          "action": "Get category",
          "routing": {
            "request": {
              "url": "=/categories/{{$parameter[\"category_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single category by ID"
        },
        {
          "name": "Add Category",
          "value": "addCategory",
          "action": "Add category",
          "routing": {
            "request": {
              "url": "/categories",
              "body": {
                "name": "={{ $parameter[\"name\"] }}",
                "description": "={{ $parameter[\"description\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new category to the system"
        },
        {
          "name": "Update Category",
          "value": "updateCategory",
          "action": "Update category",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"update_name\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "description": "={{ $parameter[\"update_description\"] || undefined }}"
              },
              "url": "=/categories/{{$parameter[\"category_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update the category in the system"
        },
        {
          "name": "Delete Category",
          "value": "deleteCategory",
          "action": "Delete category",
          "routing": {
            "request": {
              "url": "=/categories/{{$parameter[\"category_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a category from the system"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "categories"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getContacts",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage contact meta information"
        },
        {
          "name": "Get Contacts",
          "value": "getContacts",
          "action": "Get contacts",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
              },
              "url": "/contacts",
              "method": "GET"
            }
          },
          "description": "Get a list of contacts for this administration"
        },
        {
          "name": "Get Contact",
          "value": "getContact",
          "action": "Get contact",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
              },
              "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single contact by id"
        },
        {
          "name": "Add Contact",
          "value": "addContact",
          "action": "Add contact",
          "routing": {
            "request": {
              "url": "/contacts",
              "body": {
                "city": "={{ $parameter[\"city\"] || undefined }}",
                "meta": "={{ $parameter[\"extraFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "email": "={{ $parameter[\"email\"] || undefined }}",
                "id_nr": "={{ $parameter[\"id_nr\"] || undefined }}",
                "phone": "={{ $parameter[\"phone\"] || undefined }}",
                "state": "={{ $parameter[\"state\"] || undefined }}",
                "gender": "={{ $parameter[\"gender\"] || undefined }}",
                "address": "={{ $parameter[\"address\"] || undefined }}",
                "company": "={{ $parameter[\"company\"] || undefined }}",
                "country": "={{ $parameter[\"country\"] || undefined }}",
                "id_type": "={{ $parameter[\"id_type\"] || undefined }}",
                "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
                "birthday": "={{ $parameter[\"birthday\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
                "vat_number": "={{ $parameter[\"vat_number\"] || undefined }}",
                "phone_mobile": "={{ $parameter[\"phone_mobile\"] || undefined }}",
                "address_number": "={{ $parameter[\"address_number\"] || undefined }}",
                "country_origin": "={{ $parameter[\"country_origin\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty contact or add parameters to a contact"
        },
        {
          "name": "Update Contact",
          "value": "updateContact",
          "action": "Update contact",
          "routing": {
            "request": {
              "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
              "body": {
                "city": "={{ $parameter[\"city\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "phone": "={{ $parameter[\"phone\"] || undefined }}",
                "gender": "={{ $parameter[\"gender\"] || undefined }}",
                "address": "={{ $parameter[\"address\"] || undefined }}",
                "company": "={{ $parameter[\"company\"] || undefined }}",
                "country": "={{ $parameter[\"country\"] || undefined }}",
                "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
                "address_number": "={{ $parameter[\"address_number\"] || undefined }}"
              },
              "method": "PUT"
            }
          },
          "description": "Update a contact, only provided parameters will be updated"
        },
        {
          "name": "Delete Contact",
          "value": "deleteContact",
          "action": "Delete contact",
          "routing": {
            "request": {
              "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a contact from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contacts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getExchangeRates",
      "options": [
        {
          "name": "Get Exchange Rates",
          "value": "getExchangeRates",
          "action": "Get exchange rates",
          "routing": {
            "request": {
              "qs": {
                "date": "={{ $parameter[\"date\"] || undefined }}",
                "source_currency": "={{ $parameter[\"source_currency\"] || undefined }}",
                "converted_currency": "={{ $parameter[\"converted_currency\"] || undefined }}"
              },
              "url": "/exchange_rates",
              "method": "GET"
            }
          },
          "description": "Get a list of exchange rates with optional filters"
        },
        {
          "name": "Exchange Value",
          "value": "exchangeValue",
          "action": "Exchange value",
          "routing": {
            "request": {
              "qs": {
                "value": "={{ $parameter[\"value\"] }}",
                "source_currency": "={{ $parameter[\"source_currency\"] }}",
                "converted_currency": "={{ $parameter[\"converted_currency\"] }}"
              },
              "url": "/exchange_rates/exchange_value",
              "method": "GET"
            }
          },
          "description": "Exchange a value from one currency to another"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "exchangeRates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getInvoices",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage invoice meta information"
        },
        {
          "name": "Get Invoices",
          "value": "getInvoices",
          "action": "Get invoices",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "invoice_id": "={{ $parameter[\"invoice_id_filter\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
                "create_date[0]": "={{ $parameter[\"create_date_from\"] || undefined }}",
                "create_date[1]": "={{ $parameter[\"create_date_to\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
                "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}"
              },
              "url": "/invoices",
              "method": "GET"
            }
          },
          "description": "Get a list of invoices for this administration"
        },
        {
          "name": "Get Invoice",
          "value": "getInvoice",
          "action": "Get invoice",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
                "get_vat_totals": "={{ $parameter[\"get_vat_totals\"] || undefined }}",
                "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_contact_meta": "={{ $parameter[\"get_contact_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "get_reservation_meta": "={{ $parameter[\"get_reservation_meta\"] || undefined }}"
              },
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single invoice by id"
        },
        {
          "name": "Add Invoice",
          "value": "addInvoice",
          "action": "Add invoice",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "url": "/invoices",
              "method": "POST"
            }
          },
          "description": "Add a new empty concept email to the administration"
        },
        {
          "name": "Update Invoice",
          "value": "updateInvoice",
          "action": "Update invoice",
          "routing": {
            "request": {
              "qs": {
                "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a invoice contact"
        },
        {
          "name": "Delete Invoice",
          "value": "deleteInvoice",
          "action": "Delete invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Remove a invoice from the administration"
        },
        {
          "name": "Finalize Invoice",
          "value": "finalizeInvoice",
          "action": "Finalize invoice",
          "routing": {
            "request": {
              "qs": {
                "delay": "={{ $parameter[\"delay\"] || undefined }}"
              },
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/finalize",
              "method": "POST"
            }
          },
          "description": "Invoices are started in status concept a can be changed"
        },
        {
          "name": "Cancel Delayed Finalized Invoice",
          "value": "cancelDelayedFinalizedInvoice",
          "action": "Cancel delayed finalized invoice",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/cancel_finalize",
              "method": "POST"
            }
          },
          "description": "Invoices are started in status concept a can be changed"
        },
        {
          "name": "Create Credit",
          "value": "createCredit",
          "action": "Create credit",
          "routing": {
            "request": {
              "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/credit",
              "method": "POST"
            }
          },
          "description": "Create a credit note for an invoice"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invoices"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getKiosks",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage kiosk meta information"
        },
        {
          "name": "Get Kiosks",
          "value": "getKiosks",
          "action": "Get kiosks",
          "routing": {
            "request": {
              "url": "/kiosks",
              "method": "GET"
            }
          },
          "description": "Get a list of kiosks for this administration"
        },
        {
          "name": "Get Kiosk",
          "value": "getKiosk",
          "action": "Get kiosk",
          "routing": {
            "request": {
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single kiosk by id"
        },
        {
          "name": "Update Kiosk",
          "value": "updateKiosk",
          "action": "Update kiosk",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] || undefined }}"
              },
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a kiosk, only provided parameters will be updated"
        },
        {
          "name": "Add Kiosk",
          "value": "addKiosk",
          "action": "Add kiosk",
          "routing": {
            "request": {
              "url": "/kiosks",
              "body": {
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "brand": "={{ $parameter[\"brand\"] || undefined }}",
                "api_key_id": "={{ $parameter[\"api_key_id\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty kiosk or add parameters to a kiosk"
        },
        {
          "name": "Delete Kiosk",
          "value": "deleteKiosk",
          "action": "Delete kiosk",
          "routing": {
            "request": {
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a kiosk from the administration by ID"
        },
        {
          "name": "Install Kiosk",
          "value": "installKiosk",
          "action": "Install kiosk",
          "routing": {
            "request": {
              "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}/install",
              "method": "POST"
            }
          },
          "description": "Installs a kiosk from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "kiosks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getLedgers",
      "options": [
        {
          "name": "Get Ledgers",
          "value": "getLedgers",
          "action": "Get ledgers",
          "routing": {
            "request": {
              "url": "/ledgers",
              "method": "GET"
            }
          },
          "description": "Get a list of ledgers for this administration"
        },
        {
          "name": "Get Ledger",
          "value": "getLedger",
          "action": "Get ledger",
          "routing": {
            "request": {
              "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single ledger by id"
        },
        {
          "name": "Add Ledger",
          "value": "addLedger",
          "action": "Add ledger",
          "routing": {
            "request": {
              "url": "/ledgers",
              "body": {
                "name": "={{ $parameter[\"name\"] }}",
                "type": "={{ $parameter[\"type\"] }}",
                "number": "={{ $parameter[\"number\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new ledger to the administration"
        },
        {
          "name": "Update Ledger",
          "value": "updateLedger",
          "action": "Update ledger",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "number": "={{ $parameter[\"number\"] || undefined }}"
              },
              "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a ledger, only provided parameters will be updated"
        },
        {
          "name": "Delete Ledger",
          "value": "deleteLedger",
          "action": "Delete ledger",
          "routing": {
            "request": {
              "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a ledger from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ledgers"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getLicensePlates",
      "options": [
        {
          "name": "Get License Plates",
          "value": "getLicensePlates",
          "action": "Get license plates",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "force_dates": "={{ $parameter[\"force_dates\"] || undefined }}",
                "license_plate": "={{ $parameter[\"license_plate\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
                "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
                "end_date_operator": "={{ $parameter[\"end_date_operator\"] || undefined }}",
                "start_date_operator": "={{ $parameter[\"start_date_operator\"] || undefined }}"
              },
              "url": "/license_plates",
              "method": "GET"
            }
          },
          "description": "Get a list of license plates from the system"
        },
        {
          "name": "Get License Plate",
          "value": "getLicensePlate",
          "action": "Get license plate",
          "routing": {
            "request": {
              "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single license plate by ID"
        },
        {
          "name": "Check Valid License Plate",
          "value": "checkValidLicensePlate",
          "action": "Check valid license plate",
          "routing": {
            "request": {
              "qs": {
                "plate": "={{ $parameter[\"plate\"] || undefined }}"
              },
              "url": "/license_plates/check_plate",
              "method": "GET"
            }
          },
          "description": "Validate a license plate"
        },
        {
          "name": "Add License Plate",
          "value": "addLicensePlate",
          "action": "Add license plate",
          "routing": {
            "request": {
              "url": "/license_plates",
              "body": {
                "plate": "={{ $parameter[\"plate\"] }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new license plate"
        },
        {
          "name": "Update License Plate",
          "value": "updateLicensePlate",
          "action": "Update license plate",
          "routing": {
            "request": {
              "qs": {
                "plate": "={{ $parameter[\"plate\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
                "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
              },
              "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing license plate"
        },
        {
          "name": "Delete License Plate",
          "value": "deleteLicensePlate",
          "action": "Delete license plate",
          "routing": {
            "request": {
              "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a license plate by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "licensePlates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getLogs",
      "options": [
        {
          "name": "Get Logs",
          "value": "getLogs",
          "action": "Get logs",
          "routing": {
            "request": {
              "url": "/api/logs",
              "method": "GET"
            }
          },
          "description": "Get a list of log entries"
        },
        {
          "name": "Add Log",
          "value": "addLog",
          "action": "Add log",
          "routing": {
            "request": {
              "url": "/logs",
              "body": {
                "type": "={{ $parameter[\"type\"] }}",
                "type_id": "={{ $parameter[\"type_id\"] }}",
                "severity": "={{ $parameter[\"severity\"] }}",
                "description": "={{ $parameter[\"description\"] }}"
              },
              "method": "POST"
            }
          },
          "description": "Add a new log entry"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "logs"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "calculatePrice",
      "options": [
        {
          "name": "Price Calculation",
          "value": "calculatePrice",
          "action": "Calculate price",
          "routing": {
            "request": {
              "qs": {
                "code": "={{ $parameter[\"code\"] || undefined }}",
                "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
                "card_id": "={{ $parameter[\"card_id\"] || undefined }}",
                "persons": "={{ $parameter[\"persons\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
                "timezone": "={{ $parameter[\"timezone\"] || undefined }}",
                "departure": "={{ $parameter[\"departure\"] || undefined }}",
                "age_tables": "={{ $parameter[\"age_tables\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "get_deposit": "={{ $parameter[\"get_deposit\"] || undefined }}",
                "get_options": "={{ $parameter[\"get_options\"] || undefined }}",
                "timeslot_id": "={{ $parameter[\"timeslot_id\"] || undefined }}",
                "birth_tables": "={{ $parameter[\"birth_tables\"] || undefined }}",
                "history_date": "={{ $parameter[\"history_date\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}",
                "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
                "get_taxes_price": "={{ $parameter[\"get_taxes_price\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
                "get_guests_price": "={{ $parameter[\"get_guests_price\"] || undefined }}",
                "search_alternative": "={{ $parameter[\"search_alternative\"] || undefined }}",
                "get_discounts_price": "={{ $parameter[\"get_discounts_price\"] || undefined }}",
                "get_available_places": "={{ $parameter[\"get_available_places\"] || undefined }}",
                "get_required_options_price": "={{ $parameter[\"get_required_options_price\"] || undefined }}"
              },
              "url": "/price_calculation",
              "method": "GET"
            }
          },
          "description": "With the price calculation API you can calculate a price"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "priceCalculation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getProducts",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage product meta information"
        },
        {
          "name": "Get Products",
          "value": "getProducts",
          "action": "Get products",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "deal_id": "={{ $parameter[\"deal_id\"] || undefined }}",
                "category": "={{ $parameter[\"category\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "/products",
              "method": "GET"
            }
          },
          "description": "Get a list of products for this administration"
        },
        {
          "name": "Get Product",
          "value": "getProduct",
          "action": "Get product",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
                "translations": "={{ $parameter[\"translations\"] || undefined }}"
              },
              "url": "=/products/{{$parameter[\"product_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single product by id"
        },
        {
          "name": "Update Product",
          "value": "updateProduct",
          "action": "Update product",
          "routing": {
            "request": {
              "qs": {
                "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "category": "={{ $parameter[\"category\"] || undefined }}",
                "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
                "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
              },
              "url": "=/products/{{$parameter[\"product_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a product, only provided parameters will be updated"
        },
        {
          "name": "Add Product",
          "value": "addProduct",
          "action": "Add product",
          "routing": {
            "request": {
              "url": "/products",
              "body": {
                "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "category": "={{ $parameter[\"category\"] || undefined }}",
                "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
                "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
                "description": "={{ $parameter[\"description\"] || undefined }}",
                "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty product or add parameters to a product"
        },
        {
          "name": "Delete Product",
          "value": "deleteProduct",
          "action": "Delete product",
          "routing": {
            "request": {
              "url": "=/products/{{$parameter[\"product_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Deletes a product from the administration by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "products"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getRates",
      "options": [
        {
          "name": "Prices",
          "value": "prices",
          "action": "Prices",
          "description": "HTTP methods for prices of a rate"
        },
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "HTTP methods for meta of a rate"
        },
        {
          "name": "Get Rates",
          "value": "getRates",
          "action": "Get rates",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}"
              },
              "url": "/rates",
              "method": "GET"
            }
          },
          "description": "Get a list of rates"
        },
        {
          "name": "Get Rate",
          "value": "getRate",
          "action": "Get rate",
          "routing": {
            "request": {
              "url": "=/rates/{{$parameter[\"rate_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single rate by ID"
        },
        {
          "name": "Update Rate",
          "value": "updateRate",
          "action": "Update rate",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] || undefined }}",
                "closed": "={{ $parameter[\"closed\"] !== undefined && $parameter[\"closed\"] !== \"\" ? $parameter[\"closed\"] : undefined }}",
                "rules[0]": "={{ $parameter[\"rules\"]?.table ? ( Array.isArray($parameter[\"rules\"].table) ? JSON.stringify({ type: $parameter[\"rules\"].table[0].type, amount: String($parameter[\"rules\"].table[0].amount) }) : JSON.stringify({ type: $parameter[\"rules\"].table.type, amount: String($parameter[\"rules\"].table.amount) }) ) : undefined }}",
                "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}",
                "maximum_stay": "={{ $parameter[\"maximum_stay\"] || undefined }}",
                "minimum_stay": "={{ $parameter[\"minimum_stay\"] || undefined }}"
              },
              "url": "=/rates/{{$parameter[\"rate_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update an existing rate"
        },
        {
          "name": "Add Rate",
          "value": "addRate",
          "action": "Add rate",
          "routing": {
            "request": {
              "url": "/rates",
              "body": "={{ Object.assign({}, ( $parameter.name ? { name: $parameter.name } : {} ), ( $parameter.status ? { status: $parameter.status } : {} ), ( $parameter.parent_id ? { parent_id: $parameter.parent_id } : {} ), ( $parameter.closed !== undefined && $parameter.closed !== \"\" ? { closed: $parameter.closed } : {} ), ( $parameter.minimum_stay ? { minimum_stay: $parameter.minimum_stay } : {} ), ( $parameter.maximum_stay ? { maximum_stay: $parameter.maximum_stay } : {} ), ($parameter.rules?.table ? { rules: (Array.isArray($parameter.rules.table) ? $parameter.rules.table.map(r => ({ type: r.type, amount: String(r.amount) })) : [{ type: $parameter.rules.table.type, amount: String($parameter.rules.table.amount) }]) } : {}) ) }}",
              "method": "POST"
            }
          },
          "description": "Create a new rate"
        },
        {
          "name": "Delete Rate",
          "value": "deleteRate",
          "action": "Delete rate",
          "routing": {
            "request": {
              "url": "=/rates/{{$parameter[\"rate_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a rate by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "rates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getReservations",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage reservation meta information"
        },
        {
          "name": "Get Reservations",
          "value": "getReservations",
          "action": "Get reservations",
          "routing": {
            "request": {
              "qs": {
                "type": "={{ $parameter[\"type\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "status": "={{ $parameter[\"status\"] || undefined }}",
                "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
                "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "group_id": "={{ $parameter[\"group_id\"] || undefined }}",
                "meta_key": "={{ $parameter[\"meta_key\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
                "departure": "={{ $parameter[\"departure\"] || undefined }}",
                "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
                "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
                "meta_value": "={{ $parameter[\"meta_value\"] || undefined }}",
                "create_date": "={{ $parameter[\"create_date\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "last_modified": "={{ $parameter[\"last_modified\"] || undefined }}",
                "meta_operator": "={{ $parameter[\"meta_operator\"] || undefined }}",
                "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
                "arrival_operator": "={{ $parameter[\"arrival_operator\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "departure_operator": "={{ $parameter[\"departure_operator\"] || undefined }}",
                "get_invoice_payment": "={{ $parameter[\"get_invoice_payment\"] || undefined }}",
                "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "last_modified_operator": "={{ $parameter[\"last_modified_operator\"] || undefined }}"
              },
              "url": "/reservations",
              "method": "GET"
            }
          },
          "description": "You have a lot of possibilities to get information about multiple reservations"
        },
        {
          "name": "Get Reservation",
          "value": "getReservation",
          "action": "Get reservation",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
                "get_booker": "={{ $parameter[\"get_booker\"] || undefined }}",
                "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
                "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
                "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
                "get_co_travelers": "={{ $parameter[\"get_co_travelers\"] || undefined }}",
                "get_invoice_meta": "={{ $parameter[\"get_invoice_meta\"] || undefined }}",
                "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
                "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
                "get_invoice_rowsfilter": "={{ $parameter[\"get_invoice_rowsfilter\"] || undefined }}"
              },
              "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
              "method": "GET"
            }
          },
          "description": "You also can get the individual reservation, it is possible to get extra data on the reservation when needed"
        },
        {
          "name": "Create Reservation",
          "value": "createReservation",
          "action": "Create reservation",
          "description": "Create a reservation using different methods"
        },
        {
          "name": "Delete Reservation",
          "value": "deleteReservation",
          "action": "Delete reservation",
          "routing": {
            "request": {
              "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a reservation by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reservations"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTags",
      "options": [
        {
          "name": "Get Tags",
          "value": "getTags",
          "action": "Get tags",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "search": "={{ $parameter[\"search\"] || undefined }}"
              },
              "url": "/tags",
              "method": "GET"
            }
          },
          "description": "Get a list of tags"
        },
        {
          "name": "Get Tag",
          "value": "getTag",
          "action": "Get tag",
          "routing": {
            "request": {
              "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
              "method": "GET"
            }
          },
          "description": "Get a single tag by ID"
        },
        {
          "name": "Add Tag",
          "value": "addTag",
          "action": "Add tag",
          "routing": {
            "request": {
              "qs": {
                "name": "={{ $parameter[\"name\"] }}"
              },
              "url": "/tags",
              "method": "POST"
            }
          },
          "description": "Add a new tag"
        },
        {
          "name": "Delete Tag",
          "value": "deleteTag",
          "action": "Delete tag",
          "routing": {
            "request": {
              "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
              "method": "DELETE"
            }
          },
          "description": "Delete a tag by ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tags"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTimezones",
      "options": [
        {
          "name": "Get Timezones",
          "value": "getTimezones",
          "action": "Get timezones",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "country_code": "={{ $parameter[\"country_code\"] || undefined }}"
              },
              "url": "/timezones",
              "method": "GET"
            }
          },
          "description": "Get a list of timezones with optional filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "timezones"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getUsers",
      "options": [
        {
          "name": "Meta",
          "value": "meta",
          "action": "Meta",
          "description": "Manage user meta information"
        },
        {
          "name": "Get Users",
          "value": "getUsers",
          "action": "Get users",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
                "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
                "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
              },
              "url": "/users",
              "method": "GET"
            }
          },
          "description": "Get a list of users for this administration"
        },
        {
          "name": "Get User",
          "value": "getUser",
          "action": "Get user",
          "routing": {
            "request": {
              "qs": {
                "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
                "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
                "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
              },
              "url": "=/users/{{$parameter[\"user_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single user by id"
        },
        {
          "name": "Update User",
          "value": "updateUser",
          "action": "Update user",
          "routing": {
            "request": {
              "qs": {
                "email": "={{ $parameter[\"email\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
              },
              "url": "=/users/{{$parameter[\"user_id\"]}}",
              "method": "PUT"
            }
          },
          "description": "Update a user, only provided parameters will be updated"
        },
        {
          "name": "Add User",
          "value": "addUser",
          "action": "Add user",
          "routing": {
            "request": {
              "url": "/users",
              "body": {
                "email": "={{ $parameter[\"email\"] || undefined }}",
                "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
                "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty user or add parameters to a user"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "users"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getWidgets",
      "options": [
        {
          "name": "Get Widgets",
          "value": "getWidgets",
          "action": "Get widgets",
          "routing": {
            "request": {
              "qs": {
                "area": "={{ $parameter[\"area\"] || undefined }}",
                "count": "={{ $parameter[\"count\"] || undefined }}",
                "limit": "={{ $parameter[\"limit\"] || undefined }}",
                "order": "={{ $parameter[\"order\"] || undefined }}",
                "offset": "={{ $parameter[\"offset\"] || undefined }}",
                "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
              },
              "url": "/widgets",
              "method": "GET"
            }
          },
          "description": "Get a list of widgets for this administration"
        },
        {
          "name": "Get Widget",
          "value": "getWidget",
          "action": "Get widget",
          "routing": {
            "request": {
              "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single widget by id"
        },
        {
          "name": "Add Widget",
          "value": "addWidget",
          "action": "Add widget",
          "routing": {
            "request": {
              "url": "/widgets",
              "body": {
                "url": "={{ $parameter[\"url\"] || undefined }}",
                "area": "={{ $parameter[\"area\"] || undefined }}",
                "data": "={{ $parameter[\"data\"] || undefined }}",
                "app_id": "={{ $parameter[\"app_id\"] || undefined }}"
              },
              "method": "POST"
            }
          },
          "description": "Add either a empty widget or add parameters to a widget"
        },
        {
          "name": "Delete Widget",
          "value": "deleteWidget",
          "action": "Delete widget",
          "routing": {
            "request": {
              "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete a widget by id"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "widgets"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Places",
      "value": "places",
      "action": "Places",
      "description": "Manage accommodation places"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage accommodation meta information"
    },
    {
      "name": "Get Accommodations",
      "value": "getAccommodations",
      "action": "Get accommodations",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
            "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "get_services": "={{ $parameter[\"get_services\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "/accommodations",
          "method": "GET"
        }
      },
      "description": "You can get your accommodations with the get accommodations method"
    },
    {
      "name": "Get Accommodation",
      "value": "getAccommodation",
      "action": "Get accommodation",
      "routing": {
        "request": {
          "qs": {
            "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
          "method": "GET"
        }
      },
      "description": "With this method you can retreive a single accommodation"
    },
    {
      "name": "Add Accommodation",
      "value": "addAccommodation",
      "action": "Add accommodation",
      "routing": {
        "request": {
          "url": "/accommodations",
          "body": {
            "name": "={{ $parameter[\"name\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "With this method you can add a new accommodation"
    },
    {
      "name": "Update Accommodation",
      "value": "updateAccommodation",
      "action": "Update accommodation",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"update_name\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
          },
          "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "With this method you can update an existing accommodation"
    },
    {
      "name": "Delete Accommodation",
      "value": "deleteAccommodation",
      "action": "Delete accommodation",
      "routing": {
        "request": {
          "url": "=/accommodations/{{$parameter[\"accommodation_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "With this method you can delete a single accommodation"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage administration meta information"
    },
    {
      "name": "Age Tables",
      "value": "ageTables",
      "action": "Age tables",
      "description": "Get age tables for an administration"
    },
    {
      "name": "Get Places",
      "value": "getPlaces",
      "action": "Get places",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
          },
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}/places",
          "method": "GET"
        }
      },
      "description": "Get places for a specific administration"
    },
    {
      "name": "Get Administrations",
      "value": "getAdministrations",
      "action": "Get administrations",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}",
            "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
            "get_accommodations": "={{ $parameter[\"get_accommodations\"] || undefined }}"
          },
          "url": "/administrations",
          "method": "GET"
        }
      },
      "description": "You can retrieve the administrations of a specific user"
    },
    {
      "name": "Get Administration",
      "value": "getAdministration",
      "action": "Get administration",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_media": "={{ $parameter[\"get_media\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}",
            "get_age_tables": "={{ $parameter[\"get_age_tables\"] || undefined }}",
            "get_vat_tables": "={{ $parameter[\"get_vat_tables\"] || undefined }}"
          },
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single administration by id"
    },
    {
      "name": "Update Administration",
      "value": "updateAdministration",
      "action": "Update administration",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"update_name\"] || undefined }}"
          },
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update an administration by id"
    },
    {
      "name": "Add Administration",
      "value": "addAdministration",
      "action": "Add administration",
      "routing": {
        "request": {
          "url": "/administrations",
          "body": {
            "name": "={{ $parameter[\"name\"] }}",
            "type": "={{ $parameter[\"type\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new administration (full PMS or lite version)"
    },
    {
      "name": "Delete Administration",
      "value": "deleteAdministration",
      "action": "Delete administration",
      "routing": {
        "request": {
          "url": "=/administrations/{{$parameter[\"admin_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete an administration by id"
    },
    {
      "name": "Get Stock",
      "value": "getStock",
      "action": "Get stock",
      "routing": {
        "request": {
          "qs": {
            "from": "={{ $parameter[\"from\"] || undefined }}",
            "till": "={{ $parameter[\"till\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
          },
          "url": "/availability/stock",
          "method": "GET"
        }
      },
      "description": "Get availability stock for an accommodation"
    },
    {
      "name": "Get Places",
      "value": "getPlaces",
      "action": "Get places",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "backend": "={{ $parameter[\"backend\"] || undefined }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}"
          },
          "url": "/availability/places",
          "method": "GET"
        }
      },
      "description": "Get available places"
    },
    {
      "name": "Get Categories",
      "value": "getCategories",
      "action": "Get categories",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "status[0]": "={{ $parameter[\"status_0\"] || undefined }}",
            "status[1]": "={{ $parameter[\"status_1\"] || undefined }}",
            "status[2]": "={{ $parameter[\"status_2\"] || undefined }}"
          },
          "url": "/categories",
          "method": "GET"
        }
      },
      "description": "Get a list of categories from the system"
    },
    {
      "name": "Get Category",
      "value": "getCategory",
      "action": "Get category",
      "routing": {
        "request": {
          "url": "=/categories/{{$parameter[\"category_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single category by ID"
    },
    {
      "name": "Add Category",
      "value": "addCategory",
      "action": "Add category",
      "routing": {
        "request": {
          "url": "/categories",
          "body": {
            "name": "={{ $parameter[\"name\"] }}",
            "description": "={{ $parameter[\"description\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new category to the system"
    },
    {
      "name": "Update Category",
      "value": "updateCategory",
      "action": "Update category",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"update_name\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "description": "={{ $parameter[\"update_description\"] || undefined }}"
          },
          "url": "=/categories/{{$parameter[\"category_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update the category in the system"
    },
    {
      "name": "Delete Category",
      "value": "deleteCategory",
      "action": "Delete category",
      "routing": {
        "request": {
          "url": "=/categories/{{$parameter[\"category_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a category from the system"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage contact meta information"
    },
    {
      "name": "Get Contacts",
      "value": "getContacts",
      "action": "Get contacts",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
          },
          "url": "/contacts",
          "method": "GET"
        }
      },
      "description": "Get a list of contacts for this administration"
    },
    {
      "name": "Get Contact",
      "value": "getContact",
      "action": "Get contact",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "get_reservations": "={{ $parameter[\"get_reservations\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "get_reservation_payment_terms": "={{ $parameter[\"get_reservation_payment_terms\"] || undefined }}"
          },
          "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single contact by id"
    },
    {
      "name": "Add Contact",
      "value": "addContact",
      "action": "Add contact",
      "routing": {
        "request": {
          "url": "/contacts",
          "body": {
            "city": "={{ $parameter[\"city\"] || undefined }}",
            "meta": "={{ $parameter[\"extraFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "email": "={{ $parameter[\"email\"] || undefined }}",
            "id_nr": "={{ $parameter[\"id_nr\"] || undefined }}",
            "phone": "={{ $parameter[\"phone\"] || undefined }}",
            "state": "={{ $parameter[\"state\"] || undefined }}",
            "gender": "={{ $parameter[\"gender\"] || undefined }}",
            "address": "={{ $parameter[\"address\"] || undefined }}",
            "company": "={{ $parameter[\"company\"] || undefined }}",
            "country": "={{ $parameter[\"country\"] || undefined }}",
            "id_type": "={{ $parameter[\"id_type\"] || undefined }}",
            "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
            "birthday": "={{ $parameter[\"birthday\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
            "vat_number": "={{ $parameter[\"vat_number\"] || undefined }}",
            "phone_mobile": "={{ $parameter[\"phone_mobile\"] || undefined }}",
            "address_number": "={{ $parameter[\"address_number\"] || undefined }}",
            "country_origin": "={{ $parameter[\"country_origin\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty contact or add parameters to a contact"
    },
    {
      "name": "Update Contact",
      "value": "updateContact",
      "action": "Update contact",
      "routing": {
        "request": {
          "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
          "body": {
            "city": "={{ $parameter[\"city\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "phone": "={{ $parameter[\"phone\"] || undefined }}",
            "gender": "={{ $parameter[\"gender\"] || undefined }}",
            "address": "={{ $parameter[\"address\"] || undefined }}",
            "company": "={{ $parameter[\"company\"] || undefined }}",
            "country": "={{ $parameter[\"country\"] || undefined }}",
            "zipcode": "={{ $parameter[\"zipcode\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}",
            "address_number": "={{ $parameter[\"address_number\"] || undefined }}"
          },
          "method": "PUT"
        }
      },
      "description": "Update a contact, only provided parameters will be updated"
    },
    {
      "name": "Delete Contact",
      "value": "deleteContact",
      "action": "Delete contact",
      "routing": {
        "request": {
          "url": "=/contacts/{{$parameter[\"contact_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a contact from the administration by ID"
    },
    {
      "name": "Get Exchange Rates",
      "value": "getExchangeRates",
      "action": "Get exchange rates",
      "routing": {
        "request": {
          "qs": {
            "date": "={{ $parameter[\"date\"] || undefined }}",
            "source_currency": "={{ $parameter[\"source_currency\"] || undefined }}",
            "converted_currency": "={{ $parameter[\"converted_currency\"] || undefined }}"
          },
          "url": "/exchange_rates",
          "method": "GET"
        }
      },
      "description": "Get a list of exchange rates with optional filters"
    },
    {
      "name": "Exchange Value",
      "value": "exchangeValue",
      "action": "Exchange value",
      "routing": {
        "request": {
          "qs": {
            "value": "={{ $parameter[\"value\"] }}",
            "source_currency": "={{ $parameter[\"source_currency\"] }}",
            "converted_currency": "={{ $parameter[\"converted_currency\"] }}"
          },
          "url": "/exchange_rates/exchange_value",
          "method": "GET"
        }
      },
      "description": "Exchange a value from one currency to another"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage invoice meta information"
    },
    {
      "name": "Get Invoices",
      "value": "getInvoices",
      "action": "Get invoices",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "invoice_id": "={{ $parameter[\"invoice_id_filter\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
            "create_date[0]": "={{ $parameter[\"create_date_from\"] || undefined }}",
            "create_date[1]": "={{ $parameter[\"create_date_to\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
            "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}"
          },
          "url": "/invoices",
          "method": "GET"
        }
      },
      "description": "Get a list of invoices for this administration"
    },
    {
      "name": "Get Invoice",
      "value": "getInvoice",
      "action": "Get invoice",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_payments": "={{ $parameter[\"get_payments\"] || undefined }}",
            "get_vat_totals": "={{ $parameter[\"get_vat_totals\"] || undefined }}",
            "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_contact_meta": "={{ $parameter[\"get_contact_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "get_reservation_meta": "={{ $parameter[\"get_reservation_meta\"] || undefined }}"
          },
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single invoice by id"
    },
    {
      "name": "Add Invoice",
      "value": "addInvoice",
      "action": "Add invoice",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "url": "/invoices",
          "method": "POST"
        }
      },
      "description": "Add a new empty concept email to the administration"
    },
    {
      "name": "Update Invoice",
      "value": "updateInvoice",
      "action": "Update invoice",
      "routing": {
        "request": {
          "qs": {
            "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a invoice contact"
    },
    {
      "name": "Delete Invoice",
      "value": "deleteInvoice",
      "action": "Delete invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Remove a invoice from the administration"
    },
    {
      "name": "Finalize Invoice",
      "value": "finalizeInvoice",
      "action": "Finalize invoice",
      "routing": {
        "request": {
          "qs": {
            "delay": "={{ $parameter[\"delay\"] || undefined }}"
          },
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/finalize",
          "method": "POST"
        }
      },
      "description": "Invoices are started in status concept a can be changed"
    },
    {
      "name": "Cancel Delayed Finalized Invoice",
      "value": "cancelDelayedFinalizedInvoice",
      "action": "Cancel delayed finalized invoice",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/cancel_finalize",
          "method": "POST"
        }
      },
      "description": "Invoices are started in status concept a can be changed"
    },
    {
      "name": "Create Credit",
      "value": "createCredit",
      "action": "Create credit",
      "routing": {
        "request": {
          "url": "=/invoices/{{$parameter[\"invoice_id\"]}}/credit",
          "method": "POST"
        }
      },
      "description": "Create a credit note for an invoice"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage kiosk meta information"
    },
    {
      "name": "Get Kiosks",
      "value": "getKiosks",
      "action": "Get kiosks",
      "routing": {
        "request": {
          "url": "/kiosks",
          "method": "GET"
        }
      },
      "description": "Get a list of kiosks for this administration"
    },
    {
      "name": "Get Kiosk",
      "value": "getKiosk",
      "action": "Get kiosk",
      "routing": {
        "request": {
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single kiosk by id"
    },
    {
      "name": "Update Kiosk",
      "value": "updateKiosk",
      "action": "Update kiosk",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] || undefined }}"
          },
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a kiosk, only provided parameters will be updated"
    },
    {
      "name": "Add Kiosk",
      "value": "addKiosk",
      "action": "Add kiosk",
      "routing": {
        "request": {
          "url": "/kiosks",
          "body": {
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "brand": "={{ $parameter[\"brand\"] || undefined }}",
            "api_key_id": "={{ $parameter[\"api_key_id\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty kiosk or add parameters to a kiosk"
    },
    {
      "name": "Delete Kiosk",
      "value": "deleteKiosk",
      "action": "Delete kiosk",
      "routing": {
        "request": {
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a kiosk from the administration by ID"
    },
    {
      "name": "Install Kiosk",
      "value": "installKiosk",
      "action": "Install kiosk",
      "routing": {
        "request": {
          "url": "=/kiosks/{{$parameter[\"kiosk_id\"]}}/install",
          "method": "POST"
        }
      },
      "description": "Installs a kiosk from the administration by ID"
    },
    {
      "name": "Get Ledgers",
      "value": "getLedgers",
      "action": "Get ledgers",
      "routing": {
        "request": {
          "url": "/ledgers",
          "method": "GET"
        }
      },
      "description": "Get a list of ledgers for this administration"
    },
    {
      "name": "Get Ledger",
      "value": "getLedger",
      "action": "Get ledger",
      "routing": {
        "request": {
          "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single ledger by id"
    },
    {
      "name": "Add Ledger",
      "value": "addLedger",
      "action": "Add ledger",
      "routing": {
        "request": {
          "url": "/ledgers",
          "body": {
            "name": "={{ $parameter[\"name\"] }}",
            "type": "={{ $parameter[\"type\"] }}",
            "number": "={{ $parameter[\"number\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new ledger to the administration"
    },
    {
      "name": "Update Ledger",
      "value": "updateLedger",
      "action": "Update ledger",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "number": "={{ $parameter[\"number\"] || undefined }}"
          },
          "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a ledger, only provided parameters will be updated"
    },
    {
      "name": "Delete Ledger",
      "value": "deleteLedger",
      "action": "Delete ledger",
      "routing": {
        "request": {
          "url": "=/ledgers/{{$parameter[\"ledger_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a ledger from the administration by ID"
    },
    {
      "name": "Get License Plates",
      "value": "getLicensePlates",
      "action": "Get license plates",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "force_dates": "={{ $parameter[\"force_dates\"] || undefined }}",
            "license_plate": "={{ $parameter[\"license_plate\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
            "get_reservation": "={{ $parameter[\"get_reservation\"] || undefined }}",
            "end_date_operator": "={{ $parameter[\"end_date_operator\"] || undefined }}",
            "start_date_operator": "={{ $parameter[\"start_date_operator\"] || undefined }}"
          },
          "url": "/license_plates",
          "method": "GET"
        }
      },
      "description": "Get a list of license plates from the system"
    },
    {
      "name": "Get License Plate",
      "value": "getLicensePlate",
      "action": "Get license plate",
      "routing": {
        "request": {
          "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single license plate by ID"
    },
    {
      "name": "Check Valid License Plate",
      "value": "checkValidLicensePlate",
      "action": "Check valid license plate",
      "routing": {
        "request": {
          "qs": {
            "plate": "={{ $parameter[\"plate\"] || undefined }}"
          },
          "url": "/license_plates/check_plate",
          "method": "GET"
        }
      },
      "description": "Validate a license plate"
    },
    {
      "name": "Add License Plate",
      "value": "addLicensePlate",
      "action": "Add license plate",
      "routing": {
        "request": {
          "url": "/license_plates",
          "body": {
            "plate": "={{ $parameter[\"plate\"] }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new license plate"
    },
    {
      "name": "Update License Plate",
      "value": "updateLicensePlate",
      "action": "Update license plate",
      "routing": {
        "request": {
          "qs": {
            "plate": "={{ $parameter[\"plate\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "end_date": "={{ $parameter[\"end_date\"] || undefined }}",
            "start_date": "={{ $parameter[\"start_date\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}"
          },
          "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing license plate"
    },
    {
      "name": "Delete License Plate",
      "value": "deleteLicensePlate",
      "action": "Delete license plate",
      "routing": {
        "request": {
          "url": "=/license_plates/{{$parameter[\"license_plate_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a license plate by ID"
    },
    {
      "name": "Get Logs",
      "value": "getLogs",
      "action": "Get logs",
      "routing": {
        "request": {
          "url": "/api/logs",
          "method": "GET"
        }
      },
      "description": "Get a list of log entries"
    },
    {
      "name": "Add Log",
      "value": "addLog",
      "action": "Add log",
      "routing": {
        "request": {
          "url": "/logs",
          "body": {
            "type": "={{ $parameter[\"type\"] }}",
            "type_id": "={{ $parameter[\"type_id\"] }}",
            "severity": "={{ $parameter[\"severity\"] }}",
            "description": "={{ $parameter[\"description\"] }}"
          },
          "method": "POST"
        }
      },
      "description": "Add a new log entry"
    },
    {
      "name": "Price Calculation",
      "value": "calculatePrice",
      "action": "Calculate price",
      "routing": {
        "request": {
          "qs": {
            "code": "={{ $parameter[\"code\"] || undefined }}",
            "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
            "card_id": "={{ $parameter[\"card_id\"] || undefined }}",
            "persons": "={{ $parameter[\"persons\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
            "timezone": "={{ $parameter[\"timezone\"] || undefined }}",
            "departure": "={{ $parameter[\"departure\"] || undefined }}",
            "age_tables": "={{ $parameter[\"age_tables\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "get_deposit": "={{ $parameter[\"get_deposit\"] || undefined }}",
            "get_options": "={{ $parameter[\"get_options\"] || undefined }}",
            "timeslot_id": "={{ $parameter[\"timeslot_id\"] || undefined }}",
            "birth_tables": "={{ $parameter[\"birth_tables\"] || undefined }}",
            "history_date": "={{ $parameter[\"history_date\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}",
            "reservation_id": "={{ $parameter[\"reservation_id\"] || undefined }}",
            "get_taxes_price": "={{ $parameter[\"get_taxes_price\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
            "get_guests_price": "={{ $parameter[\"get_guests_price\"] || undefined }}",
            "search_alternative": "={{ $parameter[\"search_alternative\"] || undefined }}",
            "get_discounts_price": "={{ $parameter[\"get_discounts_price\"] || undefined }}",
            "get_available_places": "={{ $parameter[\"get_available_places\"] || undefined }}",
            "get_required_options_price": "={{ $parameter[\"get_required_options_price\"] || undefined }}"
          },
          "url": "/price_calculation",
          "method": "GET"
        }
      },
      "description": "With the price calculation API you can calculate a price"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage product meta information"
    },
    {
      "name": "Get Products",
      "value": "getProducts",
      "action": "Get products",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "deal_id": "={{ $parameter[\"deal_id\"] || undefined }}",
            "category": "={{ $parameter[\"category\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "/products",
          "method": "GET"
        }
      },
      "description": "Get a list of products for this administration"
    },
    {
      "name": "Get Product",
      "value": "getProduct",
      "action": "Get product",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_tags": "={{ $parameter[\"get_tags\"] || undefined }}",
            "translations": "={{ $parameter[\"translations\"] || undefined }}"
          },
          "url": "=/products/{{$parameter[\"product_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single product by id"
    },
    {
      "name": "Update Product",
      "value": "updateProduct",
      "action": "Update product",
      "routing": {
        "request": {
          "qs": {
            "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "category": "={{ $parameter[\"category\"] || undefined }}",
            "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
            "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
          },
          "url": "=/products/{{$parameter[\"product_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a product, only provided parameters will be updated"
    },
    {
      "name": "Add Product",
      "value": "addProduct",
      "action": "Add product",
      "routing": {
        "request": {
          "url": "/products",
          "body": {
            "meta": "={{ $parameter[\"metaFields\"]?.field?.filter(f => f.value !== \"\" && f.value !== undefined)?.map(f => ({ key: f.key, value: f.value })) || [] }}",
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "category": "={{ $parameter[\"category\"] || undefined }}",
            "percentage": "={{ $parameter[\"percentage\"] || undefined }}",
            "price_incl": "={{ $parameter[\"price_incl\"] || undefined }}",
            "description": "={{ $parameter[\"description\"] || undefined }}",
            "vat_procent": "={{ $parameter[\"vat_procent\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty product or add parameters to a product"
    },
    {
      "name": "Delete Product",
      "value": "deleteProduct",
      "action": "Delete product",
      "routing": {
        "request": {
          "url": "=/products/{{$parameter[\"product_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Deletes a product from the administration by ID"
    },
    {
      "name": "Prices",
      "value": "prices",
      "action": "Prices",
      "description": "HTTP methods for prices of a rate"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "HTTP methods for meta of a rate"
    },
    {
      "name": "Get Rates",
      "value": "getRates",
      "action": "Get rates",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}"
          },
          "url": "/rates",
          "method": "GET"
        }
      },
      "description": "Get a list of rates"
    },
    {
      "name": "Get Rate",
      "value": "getRate",
      "action": "Get rate",
      "routing": {
        "request": {
          "url": "=/rates/{{$parameter[\"rate_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single rate by ID"
    },
    {
      "name": "Update Rate",
      "value": "updateRate",
      "action": "Update rate",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] || undefined }}",
            "closed": "={{ $parameter[\"closed\"] !== undefined && $parameter[\"closed\"] !== \"\" ? $parameter[\"closed\"] : undefined }}",
            "rules[0]": "={{ $parameter[\"rules\"]?.table ? ( Array.isArray($parameter[\"rules\"].table) ? JSON.stringify({ type: $parameter[\"rules\"].table[0].type, amount: String($parameter[\"rules\"].table[0].amount) }) : JSON.stringify({ type: $parameter[\"rules\"].table.type, amount: String($parameter[\"rules\"].table.amount) }) ) : undefined }}",
            "parent_id": "={{ $parameter[\"parent_id\"] || undefined }}",
            "maximum_stay": "={{ $parameter[\"maximum_stay\"] || undefined }}",
            "minimum_stay": "={{ $parameter[\"minimum_stay\"] || undefined }}"
          },
          "url": "=/rates/{{$parameter[\"rate_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update an existing rate"
    },
    {
      "name": "Add Rate",
      "value": "addRate",
      "action": "Add rate",
      "routing": {
        "request": {
          "url": "/rates",
          "body": "={{ Object.assign({}, ( $parameter.name ? { name: $parameter.name } : {} ), ( $parameter.status ? { status: $parameter.status } : {} ), ( $parameter.parent_id ? { parent_id: $parameter.parent_id } : {} ), ( $parameter.closed !== undefined && $parameter.closed !== \"\" ? { closed: $parameter.closed } : {} ), ( $parameter.minimum_stay ? { minimum_stay: $parameter.minimum_stay } : {} ), ( $parameter.maximum_stay ? { maximum_stay: $parameter.maximum_stay } : {} ), ($parameter.rules?.table ? { rules: (Array.isArray($parameter.rules.table) ? $parameter.rules.table.map(r => ({ type: r.type, amount: String(r.amount) })) : [{ type: $parameter.rules.table.type, amount: String($parameter.rules.table.amount) }]) } : {}) ) }}",
          "method": "POST"
        }
      },
      "description": "Create a new rate"
    },
    {
      "name": "Delete Rate",
      "value": "deleteRate",
      "action": "Delete rate",
      "routing": {
        "request": {
          "url": "=/rates/{{$parameter[\"rate_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a rate by ID"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage reservation meta information"
    },
    {
      "name": "Get Reservations",
      "value": "getReservations",
      "action": "Get reservations",
      "routing": {
        "request": {
          "qs": {
            "type": "={{ $parameter[\"type\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "status": "={{ $parameter[\"status\"] || undefined }}",
            "arrival": "={{ $parameter[\"arrival\"] || undefined }}",
            "admin_id": "={{ $parameter[\"admin_id\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "group_id": "={{ $parameter[\"group_id\"] || undefined }}",
            "meta_key": "={{ $parameter[\"meta_key\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "place_id": "={{ $parameter[\"place_id\"] || undefined }}",
            "departure": "={{ $parameter[\"departure\"] || undefined }}",
            "channel_id": "={{ $parameter[\"channel_id\"] || undefined }}",
            "contact_id": "={{ $parameter[\"contact_id\"] || undefined }}",
            "meta_value": "={{ $parameter[\"meta_value\"] || undefined }}",
            "create_date": "={{ $parameter[\"create_date\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "last_modified": "={{ $parameter[\"last_modified\"] || undefined }}",
            "meta_operator": "={{ $parameter[\"meta_operator\"] || undefined }}",
            "accommodation_id": "={{ $parameter[\"accommodation_id\"] || undefined }}",
            "arrival_operator": "={{ $parameter[\"arrival_operator\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "departure_operator": "={{ $parameter[\"departure_operator\"] || undefined }}",
            "get_invoice_payment": "={{ $parameter[\"get_invoice_payment\"] || undefined }}",
            "create_date_operator": "={{ $parameter[\"create_date_operator\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "last_modified_operator": "={{ $parameter[\"last_modified_operator\"] || undefined }}"
          },
          "url": "/reservations",
          "method": "GET"
        }
      },
      "description": "You have a lot of possibilities to get information about multiple reservations"
    },
    {
      "name": "Get Reservation",
      "value": "getReservation",
      "action": "Get reservation",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rows": "={{ $parameter[\"get_rows\"] || undefined }}",
            "get_booker": "={{ $parameter[\"get_booker\"] || undefined }}",
            "get_contact": "={{ $parameter[\"get_contact\"] || undefined }}",
            "get_invoices": "={{ $parameter[\"get_invoices\"] || undefined }}",
            "filter_root_meta": "={{ $parameter[\"filter_root_meta\"] || undefined }}",
            "get_co_travelers": "={{ $parameter[\"get_co_travelers\"] || undefined }}",
            "get_invoice_meta": "={{ $parameter[\"get_invoice_meta\"] || undefined }}",
            "get_payment_terms": "={{ $parameter[\"get_payment_terms\"] || undefined }}",
            "get_invoice_payments": "={{ $parameter[\"get_invoice_payments\"] || undefined }}",
            "get_invoice_rowsfilter": "={{ $parameter[\"get_invoice_rowsfilter\"] || undefined }}"
          },
          "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
          "method": "GET"
        }
      },
      "description": "You also can get the individual reservation, it is possible to get extra data on the reservation when needed"
    },
    {
      "name": "Create Reservation",
      "value": "createReservation",
      "action": "Create reservation",
      "description": "Create a reservation using different methods"
    },
    {
      "name": "Delete Reservation",
      "value": "deleteReservation",
      "action": "Delete reservation",
      "routing": {
        "request": {
          "url": "=/reservations/{{$parameter[\"reservation_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a reservation by ID"
    },
    {
      "name": "Get Tags",
      "value": "getTags",
      "action": "Get tags",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "search": "={{ $parameter[\"search\"] || undefined }}"
          },
          "url": "/tags",
          "method": "GET"
        }
      },
      "description": "Get a list of tags"
    },
    {
      "name": "Get Tag",
      "value": "getTag",
      "action": "Get tag",
      "routing": {
        "request": {
          "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
          "method": "GET"
        }
      },
      "description": "Get a single tag by ID"
    },
    {
      "name": "Add Tag",
      "value": "addTag",
      "action": "Add tag",
      "routing": {
        "request": {
          "qs": {
            "name": "={{ $parameter[\"name\"] }}"
          },
          "url": "/tags",
          "method": "POST"
        }
      },
      "description": "Add a new tag"
    },
    {
      "name": "Delete Tag",
      "value": "deleteTag",
      "action": "Delete tag",
      "routing": {
        "request": {
          "url": "={{ $parameter[\"resource\"] + \"/\" + $parameter[\"tagId\"] }}",
          "method": "DELETE"
        }
      },
      "description": "Delete a tag by ID"
    },
    {
      "name": "Get Timezones",
      "value": "getTimezones",
      "action": "Get timezones",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "country_code": "={{ $parameter[\"country_code\"] || undefined }}"
          },
          "url": "/timezones",
          "method": "GET"
        }
      },
      "description": "Get a list of timezones with optional filters"
    },
    {
      "name": "Meta",
      "value": "meta",
      "action": "Meta",
      "description": "Manage user meta information"
    },
    {
      "name": "Get Users",
      "value": "getUsers",
      "action": "Get users",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}",
            "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
            "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
          },
          "url": "/users",
          "method": "GET"
        }
      },
      "description": "Get a list of users for this administration"
    },
    {
      "name": "Get User",
      "value": "getUser",
      "action": "Get user",
      "routing": {
        "request": {
          "qs": {
            "get_meta": "={{ $parameter[\"get_meta\"] || undefined }}",
            "get_rights": "={{ $parameter[\"get_rights\"] || undefined }}",
            "get_administrations": "={{ $parameter[\"get_administrations\"] || undefined }}"
          },
          "url": "=/users/{{$parameter[\"user_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single user by id"
    },
    {
      "name": "Update User",
      "value": "updateUser",
      "action": "Update user",
      "routing": {
        "request": {
          "qs": {
            "email": "={{ $parameter[\"email\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
          },
          "url": "=/users/{{$parameter[\"user_id\"]}}",
          "method": "PUT"
        }
      },
      "description": "Update a user, only provided parameters will be updated"
    },
    {
      "name": "Add User",
      "value": "addUser",
      "action": "Add user",
      "routing": {
        "request": {
          "url": "/users",
          "body": {
            "email": "={{ $parameter[\"email\"] || undefined }}",
            "last_name": "={{ $parameter[\"last_name\"] || undefined }}",
            "first_name": "={{ $parameter[\"first_name\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty user or add parameters to a user"
    },
    {
      "name": "Get Widgets",
      "value": "getWidgets",
      "action": "Get widgets",
      "routing": {
        "request": {
          "qs": {
            "area": "={{ $parameter[\"area\"] || undefined }}",
            "count": "={{ $parameter[\"count\"] || undefined }}",
            "limit": "={{ $parameter[\"limit\"] || undefined }}",
            "order": "={{ $parameter[\"order\"] || undefined }}",
            "offset": "={{ $parameter[\"offset\"] || undefined }}",
            "order_by": "={{ $parameter[\"order_by\"] || undefined }}"
          },
          "url": "/widgets",
          "method": "GET"
        }
      },
      "description": "Get a list of widgets for this administration"
    },
    {
      "name": "Get Widget",
      "value": "getWidget",
      "action": "Get widget",
      "routing": {
        "request": {
          "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single widget by id"
    },
    {
      "name": "Add Widget",
      "value": "addWidget",
      "action": "Add widget",
      "routing": {
        "request": {
          "url": "/widgets",
          "body": {
            "url": "={{ $parameter[\"url\"] || undefined }}",
            "area": "={{ $parameter[\"area\"] || undefined }}",
            "data": "={{ $parameter[\"data\"] || undefined }}",
            "app_id": "={{ $parameter[\"app_id\"] || undefined }}"
          },
          "method": "POST"
        }
      },
      "description": "Add either a empty widget or add parameters to a widget"
    },
    {
      "name": "Delete Widget",
      "value": "deleteWidget",
      "action": "Delete widget",
      "routing": {
        "request": {
          "url": "=/widgets/{{$parameter[\"widget_id\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete a widget by id"
    }
  ]

npm_readme:
  # n8n-nodes-starfish

  This is an n8n community node. It lets you use the Starfish API (CampingCare/HotelCare) in your n8n workflows.

  Starfish is a comprehensive booking and reservation management platform for camping and hotel accommodations, providing APIs for managing contacts, reservations, accommodations, invoices, rates, and more.

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

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

  ## Installation

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

  ## Operations

  This package provides two nodes:

  ### Starfish (CampingCare/HotelCare) Node

  Regular node for making API calls:

  #### Accommodations API

  - **Get Accommodations** - List accommodations with filtering options
  - **Get Accommodation** - Retrieve a specific accommodation by ID
  - **Add Accommodation** - Create a new accommodation
  - **Update Accommodation** - Modify existing accommodation details
  - **Delete Accommodation** - Remove an accommodation
  - **Places** - Get places, get a single place, and update cleaning status (unknown, clean, wait_for_review, dirty)
  - **Meta Operations** - Manage accommodation metadata (get, update, delete)

  #### Administrations API

  - **Get Administrations** - List all administrations
  - **Get Administration** - Get details of a specific administration
  - **Add Administration** - Create a new administration (full PMS or lite version)
  - **Update Administration** - Modify administration details
  - **Delete Administration** - Remove an administration
  - **Get Places** - List places for a specific administration (filter, search, sort)
  - **Age Tables** - Retrieve and manage age table configurations
  - **Meta Operations** - Manage administration metadata

  #### Availability API

  - **Get Stock** - Check accommodation availability for specific date ranges
  - **Get Places** - Get available places/spots

  #### Categories API

  - **Get Categories** - List all categories
  - **Get Category** - Get a specific category by ID
  - **Add Category** - Create a new category
  - **Update Category** - Modify existing category
  - **Delete Category** - Remove a category

  #### Contacts API

  - **Get Contacts** - List contacts with filtering and pagination
  - **Get Contact** - Retrieve a specific contact by ID
  - **Add Contact** - Create a new contact with metadata support
  - **Update Contact** - Modify existing contact information
  - **Delete Contact** - Remove a contact
  - **Meta Operations** - Manage contact metadata

  #### Exchange Rates API

  - **Get Exchange Rates** - Get currency exchange rates for specific dates
  - **Exchange Value** - Convert amounts between currencies

  #### Invoices API

  - **Get Invoices** - List invoices with filters
  - **Get Invoice** - Get a specific invoice by ID
  - **Add Invoice** - Create a new invoice
  - **Update Invoice** - Modify existing invoice
  - **Delete Invoice** - Remove an invoice
  - **Finalize Invoice** - Finalize an invoice for payment
  - **Cancel Delayed Finalized Invoice** - Cancel a delayed finalization
  - **Create Credit** - Create a credit note for an invoice
  - **Add Rows** - Add line items to an invoice
  - **Meta Operations** - Manage invoice metadata

  #### Kiosks API

  - **Get Kiosks** - List all kiosks
  - **Get Kiosk** - Get a specific kiosk by ID
  - **Add Kiosk** - Create a new kiosk
  - **Update Kiosk** - Modify kiosk details
  - **Delete Kiosk** - Remove a kiosk
  - **Install Kiosk** - Install a kiosk
  - **Meta Operations** - Manage kiosk metadata

  #### Ledgers API

  - **Get Ledgers** - List all ledgers
  - **Get Ledger** - Get a specific ledger by ID
  - **Add Ledger** - Create a new ledger
  - **Update Ledger** - Modify ledger details
  - **Delete Ledger** - Remove a ledger

  #### License Plates API

  - **Get License Plates** - List license plates with filtering
  - **Get License Plate** - Get a specific license plate by ID
  - **Check Valid License Plate** - Validate a license plate
  - **Add License Plate** - Create a new license plate entry
  - **Update License Plate** - Modify existing license plate
  - **Delete License Plate** - Remove a license plate

  #### Logs API

  - **Get Logs** - Retrieve log entries
  - **Add Log** - Create a new log entry for tracking activities related to reservations, contacts, invoices, or accommodations

  #### Price Calculation API

  - **Calculate Price** - Get pricing information before creating a reservation with support for age tables, birthdates, discount codes, and channels

  #### Products API

  - **Get Products** - List all products with filtering options
  - **Get Product** - Get a specific product by ID
  - **Add Product** - Create a new product with multiple meta fields support
  - **Update Product** - Modify existing product details including meta fields
  - **Delete Product** - Remove a product
  - **Meta Operations** - Manage product metadata (get, update, delete)

  #### Rates API

  - **Get Rates** - List all rates
  - **Get Rate** - Get a specific rate by ID
  - **Add Rate** - Create a new rate
  - **Update Rate** - Modify existing rate
  - **Delete Rate** - Remove a rate
  - **Get Prices** - Retrieve prices for a specific rate and date range
  - **Update Prices** - Modify rate prices for specific dates
  - **Meta Operations** - Manage rate metadata

  #### Reservations API

  - **Get Reservations** - List all reservations with filtering
  - **Get Reservation** - Get a specific reservation by ID
  - **Create Reservation** - Create a new reservation (with price calculation or forced data)
  - **Delete Reservation** - Remove a reservation
  - **Meta Operations** - Manage reservation metadata

  #### Tags API

  - **Get Tags** - List all tags
  - **Get Tag** - Get a specific tag by ID
  - **Add Tag** - Create a new tag
  - **Delete Tag** - Remove a tag

  #### Timezones API

  - **Get Timezones** - List all available timezones

  #### Users API

  - **Get Users** - List all users
  - **Get User** - Get a specific user by ID
  - **Add User** - Create a new user
  - **Update User** - Modify user details
  - **Meta Operations** - Manage user metadata

  #### Widgets API

  - **Get Widgets** - List all widgets
  - **Get Widget** - Get a specific widget by ID
  - **Add Widget** - Create a new widget
  - **Update Widget** - Modify widget details
  - **Delete Widget** - Remove a widget

  ### Starfish (CampingCare/HotelCare) Trigger Node

  Webhook trigger node for real-time events:

  - Automatically creates and manages webhooks in Starfish
  - Supports multiple event types (reservations, contacts, invoices, etc.)
  - Receives real-time updates when data changes in Starfish
  - Includes signature validation for security

  ## Credentials

  ### Setting up API Credentials

  1. In n8n, go to **Credentials** > **New**
  2. Search for "Starfish (CampingCare/HotelCare) API"
  3. Enter your API credentials:
     - **API Key**: Your Starfish API key
     - **Webhook Secret** (optional): Value used to validate incoming webhooks; Starfish will echo it in the `X-Webhook-Secret` header and requests without it will be rejected.

  ### Obtaining Your API Key

  1. Log in to your Starfish dashboard (CampingCare or HotelCare)
  2. Navigate to Settings > API Keys
  3. Generate or copy your API key
  4. Paste it into the n8n credentials field

  The API key is used for authentication with all Starfish API endpoints. When provided, the webhook secret secures incoming webhooks.

  ## Compatibility

  - **Minimum n8n version:** 1.0.0
  - **Node.js version:** >= 20.15
  - **Tested with:** n8n 1.0.0+

  This node uses the Starfish API v21. Ensure your API key has access to the required endpoints.

  ## Usage

  ### Getting Started

  If you're new to n8n, check out the [Try it out](https://docs.n8n.io/try-it-out/) documentation to get started.

  ### Example 1: Create a Contact

  1. Add the "Starfish (CampingCare/HotelCare)" node
  2. Select **Resource**: Contacts API
  3. Select **Operation**: Add Contact
  4. Fill in required fields:
     - Email (required)
     - First Name
     - Last Name
     - Phone, Address, etc. (optional)

  The API allows creating contacts with minimal information and adding data as needed.

  ### Example 2: Create a Reservation

  1. Add the "Starfish (CampingCare/HotelCare)" node
  2. Select **Resource**: Reservations API
  3. Select **Operation**: Create Reservation
  4. Choose creation method:
     - **Using Price Calculation**: First calculate price, then create reservation
     - **Force with Own Data**: Provide all required data directly

  For the price calculation method:

  1. First use Price Calculation API to get `calculation_id` and `hash`
  2. Then create the reservation using these values

  ### Example 3: Listen for Webhook Events

  1. Add the "Starfish (CampingCare/HotelCare) Trigger" node
  2. Select events to listen for (e.g., "reservation_create", "contact_update")
  3. Activate the workflow
  4. The webhook will be automatically registered with Starfish
  5. When events occur, the workflow will be triggered

  ### Important Notes

  - **Date Format**: Always use YYYY-MM-DD format for dates.
  - **Required Fields**: Some operations have required fields (marked with \*)
  - **Meta Fields**: Many resources support custom metadata via meta operations
  - **Pagination**: Use `count` and `limit` parameters for large datasets
  - **Boolean Parameters**: Use string values "0" or "1" for boolean query parameters (examples: `get_meta`, `get_media`, `count`)
  - **Field Mapping**: When updating resources, only provided parameters will be updated
  - **Cleaning Status**: Accommodation places cleaning uses the `/cleaning` path and statuses `unknown|clean|wait_for_review|dirty`

  ## Development

  - Install dependencies: `pnpm install`
  - Build: `pnpm run build` (cleans `dist`, runs TypeScript, then `gulp build:icons`)
  - Dev watch: `pnpm run dev`
  - Lint: `pnpm run lint` (use `pnpm run lintfix` to auto-fix)
  - Format: `pnpm run format`

  ### Deploy to local n8n container (Windows)

  - Run `win_docker_deploy.bat` from the repo root to build and copy the node into a Dockerized n8n instance. Ensure Docker Desktop is running and your container name matches what the script expects.

  ### Webhook trigger validation

  - The trigger node validates webhook signatures; configure events in the node, activate the workflow, and ensure the public URL is reachable by Starfish.

  ### Resource coverage quick view

  | Resource | Key operations |
  | --- | --- |
  | Accommodations | get, get by id, add/update/delete, meta, places, cleaning status |
  | Administrations | get, get by id, add/update/delete, meta, age tables, places |
  | Reservations | get, get by id, create, delete, meta |
  | Contacts | get, get by id, add/update/delete, meta |
  | Rates | get, get by id, add/update/delete, prices get/update, meta |
  | Invoices | get, get by id, add/update/delete, finalize/cancel, credit, rows, meta |
  | Products | get, get by id, add/update/delete, meta |
  | Others | Kiosks, Ledgers, License Plates, Exchange Rates, Logs, Categories, Tags, Users, Widgets, Timezones |

  ## Resources

  - [Starfish API Documentation](https://support.starfish.care/faq/n8n/)
  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [GitHub Repository](https://github.com/CampingCare/n8n-node)
  - [CampingCare Website](https://www.camping.care)
  - [HotelCare Website](https://www.hotel.care)

  ## Version History

  ### Version 2.0.2 (Current)

  - Added accommodations places coverage (get places, get place, update cleaning status via `/cleaning`)
  - Fixed cleaning status endpoint path for accommodation places
  - Existing coverage retained: Invoices, Rates (pricing and metadata), Kiosks, Ledgers, License Plates, Exchange Rates, Logs, Categories, Tags, Users, and meta operations across major resources
  - Enhanced webhook trigger with signature validation and improved error handling

  ### Version 1.0.6

  - Broader API coverage across accommodations, reservations, contacts, and meta operations
  - Enhanced README documentation

  ### Version 1.0.0

  - Initial release
  - Support for Contacts, Reservations, and Accommodations
  - Webhook trigger support
  - Price calculation features
  - Administrations and Timezones support

  ---

  ## Troubleshooting

  ### Common Issues

  **"Invalid API Key" error**

  - Verify your API key in the Starfish dashboard
  - Check that the key hasn't expired
  - Update the key in n8n credentials if necessary

  **Webhook not receiving events**

  - Ensure the workflow is activated
  - Verify the webhook exists in your Starfish dashboard (Settings > Webhooks)
  - Check that n8n is accessible from the internet (for webhooks to work)
  - Review your firewall and network settings

  **Date format errors**

  - Ensure all dates use YYYY-MM-DD format
  - Check your system timezone settings

  **Meta operations not working**

  - Verify the resource supports meta operations
  - Check that the meta key is valid for the resource type
  - Some meta operations may require specific permissions
  - Ensure your API key has the necessary scopes

  **Rate limiting issues**

  - Implement delays between API calls if needed
  - Check the API documentation for rate limits
  - Consider batching operations where possible

  **Connection timeouts**

  - Check your internet connection
  - Verify the Starfish API endpoint is accessible
  - Try again after a few moments

  ## Contributing

  Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch: `git checkout -b feature/my-feature`
  3. Commit your changes: `git commit -am 'Add new feature'`
  4. Push to the branch: `git push origin feature/my-feature`
  5. Submit a pull request

  ## License

  [MIT](LICENSE.md)

  ## Support

  For support:

  - Check the [API Documentation](https://support.starfish.care/faq/n8n/)
  - Open an issue on [GitHub](https://github.com/CampingCare/n8n-node/issues)
  - Contact Starfish support for API-related questions

  ## Credits

  Created by the CampingCare development team.

  Built with the [n8n nodes starter](https://github.com/n8n-io/n8n-nodes-starter).

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows to interact with the Starfish API, a platform for managing camping and hotel bookings, reservations, and related operational data.","capabilities":["CRUD operations for Accommodations (list, get, create, update, delete)","CRUD operations for Administrations (list, get, create, update, delete)","CRUD operations for Categories (list, get, create, update, delete)","CRUD operations for Contacts (list, get, create, update, delete)","CRUD operations for Invoices (list, get, create, update, delete, finalize, cancel, credit)","CRUD operations for Kiosks (list, get, create, update, delete, install)","CRUD operations for Ledgers (list, get, create, update, delete)","CRUD operations for License Plates (list, get, create, update, delete, validate)","CRUD operations for Products (list, get, create, update, delete)","CRUD operations for Rates (list, get, create, update, delete)"],"authentication":"API key required (implied by 'Credentials' section and standard API node behavior, though specific method not detailed in provided text)","commonUseCases":["Automating camping or hotel reservation creation and management","Syncing guest contact information between systems","Managing inventory and availability for accommodations","Processing invoices and generating credit notes","Calculating dynamic pricing based on age or discounts"],"limitations":["Limited to the Starfish API's supported endpoints","Requires a valid Starfish API integration and credentials","Some advanced features may depend on specific Starfish plan permissions (e.g., PMS vs lite version)"],"relatedNodes":["n8n-nodes-starfish.campingCare","n8n-nodes-starfish.hotelCare","n8n-nodes-starfish","n8n-nodes-starfish.campingCare","n8n-nodes-starfish.hotelCare"]}


node_type: n8n-nodes-scraping-dog.scrapingDog
package_name: n8n-nodes-scraping-dog
display_name: ScrapingDog
description: Get data from ScrapingDog API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: darshan_sd12
author_github_url: https://github.com/Darshan972/scrappingDog.git
npm_package_name: n8n-nodes-scraping-dog
npm_version: 0.4.2
community_fetched_at: 2026-03-25T21:19:40.608Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Scrape URL",
          "value": "scrapeUrl"
        },
        {
          "name": "Google Search",
          "value": "googleSearch"
        },
        {
          "name": "Google Images",
          "value": "googleImages"
        },
        {
          "name": "Google News",
          "value": "googleNews"
        },
        {
          "name": "Bing Search",
          "value": "bingSearch"
        },
        {
          "name": "Amazon Search",
          "value": "amazonSearch"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Scrape URL",
          "description": "Scrape a URL"
        }
      ],
      "routing": {
        "request": {
          "qs": {
            "url": "={{$parameter[\"url\"]}}",
            "wait": "={{$parameter[\"dynamic\"] === true && $parameter[\"wait\"] ? $parameter[\"wait\"] : undefined}}",
            "image": "={{$parameter[\"image\"] === true ? \"true\" : \"false\"}}",
            "api_key": "={{$credentials.apiKey}}",
            "country": "={{$parameter[\"premium\"] === true && $parameter[\"country\"] ? $parameter[\"country\"] : undefined}}",
            "dynamic": "={{$parameter[\"dynamic\"] === true ? \"true\" : \"false\"}}",
            "premium": "={{$parameter[\"premium\"] === true ? \"true\" : \"false\"}}",
            "ai_query": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"aiQuery\"] ? $parameter[\"additionalFields\"][\"aiQuery\"] : undefined}}",
            "markdown": "={{$parameter[\"markdown\"] === true ? \"true\" : \"false\"}}",
            "super_proxy": "={{$parameter[\"superProxy\"] === true ? \"true\" : \"false\"}}",
            "custom_headers": "={{$parameter[\"customHeaders\"] === true ? \"true\" : undefined}}",
            "session_number": "={{$parameter[\"sessionNumber\"] || undefined}}",
            "ai_extract_rules": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"aiExtractRules\"] ? $parameter[\"additionalFields\"][\"aiExtractRules\"] : undefined}}"
          },
          "url": "scrape",
          "method": "GET",
          "returnFullResponse": true
        },
        "returnFullResponse": true
      },
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "scrapeUrl"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Google search",
          "description": "Perform a Google Search"
        }
      ],
      "routing": {
        "request": {
          "qs": {
            "page": "={{$parameter[\"page\"]}}",
            "query": "={{$parameter[\"query\"]}}",
            "api_key": "={{$credentials.apiKey}}",
            "country": "={{$parameter[\"location\"]}}",
            "results": "={{$parameter[\"results\"]}}",
            "advance_search": "={{$parameter[\"advance\"]}}"
          },
          "url": "google",
          "method": "GET"
        }
      },
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "googleSearch"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search Google Images",
          "description": "Search Google Images"
        }
      ],
      "routing": {
        "request": {
          "qs": {
            "tbs": "={{$parameter[\"timePeriod\"] || undefined}}",
            "imgsz": "={{$parameter[\"imageSize\"] || undefined}}",
            "query": "={{$parameter[\"query\"]}}",
            "api_key": "={{$credentials.apiKey}}",
            "country": "={{$parameter[\"country\"] || undefined}}",
            "results": "={{$parameter[\"results\"]}}",
            "language": "={{$parameter[\"language\"] || undefined}}",
            "licenses": "={{$parameter[\"usageRights\"] || undefined}}",
            "image_type": "={{$parameter[\"imageType\"] || undefined}}",
            "image_color": "={{$parameter[\"imageColor\"] || undefined}}",
            "safe_search": "={{$parameter[\"safeSearch\"] || undefined}}"
          },
          "url": "google_images",
          "method": "GET"
        }
      },
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "googleImages"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search Google News",
          "description": "Search Google News"
        }
      ],
      "routing": {
        "request": {
          "qs": {
            "lr": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"lr\"] || undefined}}",
            "tbs": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"tbs\"] || undefined}}",
            "nfpr": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"nfpr\"] === true ? \"1\" : \"0\"}}",
            "page": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"page\"] || undefined}}",
            "safe": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"safe\"] || undefined}}",
            "uule": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"uule\"] || undefined}}",
            "query": "={{$parameter[\"query\"]}}",
            "domain": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"domain\"] || undefined}}",
            "api_key": "={{$credentials.apiKey}}",
            "country": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"country\"] === \"custom\" ? $parameter[\"additionalFields\"][\"customCountry\"] : $parameter[\"additionalFields\"][\"country\"] || undefined}}",
            "results": "={{$parameter[\"results\"]}}",
            "language": "={{$parameter[\"additionalFields\"] && $parameter[\"additionalFields\"][\"language\"] || undefined}}"
          },
          "url": "google_news",
          "method": "GET"
        }
      },
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "googleNews"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Bing search",
          "description": "Perform a Bing Search"
        }
      ],
      "routing": {
        "request": {
          "qs": {
            "page": "={{$parameter[\"page\"]}}",
            "query": "={{$parameter[\"query\"]}}",
            "api_key": "={{$credentials.apiKey}}",
            "country": "={{$parameter[\"country\"]}}",
            "filters": "={{$parameter[\"filters\"]}}",
            "results": "={{$parameter[\"results\"]}}"
          },
          "url": "bing/search",
          "method": "GET"
        }
      },
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "bingSearch"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Amazon search",
          "description": "Perform a Amazon Search"
        }
      ],
      "routing": {
        "request": {
          "qs": {
            "page": "={{$parameter[\"page\"]}}",
            "query": "={{$parameter[\"query\"]}}",
            "domain": "={{$parameter[\"domain\"]}}",
            "api_key": "={{$credentials.apiKey}}",
            "country": "={{$parameter[\"country\"]}}",
            "postal_code": "={{$parameter[\"postal_code\"]}}"
          },
          "url": "amazon/search",
          "method": "GET"
        }
      },
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "amazonSearch"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get",
      "value": "get",
      "action": "Scrape URL",
      "description": "Scrape a URL"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Google search",
      "description": "Perform a Google Search"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search Google Images",
      "description": "Search Google Images"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search Google News",
      "description": "Search Google News"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Bing search",
      "description": "Perform a Bing Search"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Amazon search",
      "description": "Perform a Amazon Search"
    }
  ]

npm_readme:
  # ScrapingDog Node for n8n

  This is a custom n8n node that integrates with the ScrapingDog API, providing web scraping and search capabilities. The node has been converted to use n8n's declarative style for better maintainability and reliability.

  ## Key Highlights

  - ✅ **6 Different APIs**: URL Scraping, Google Search, Google Images, Google News, Bing Search, and Amazon Search
  - ✅ **Declarative Style**: Modern n8n node implementation for better performance
  - ✅ **Comprehensive Filtering**: Advanced search options for all supported APIs
  - ✅ **Multi-language Support**: Support for multiple languages and regions
  - ✅ **Rate Limit Handling**: Built-in error handling for API limitations
  - ✅ **TypeScript**: Fully typed for better development experience

  ## Features

  - 🌐 **URL Scraping**: Extract content from any webpage
  - 🔍 **Google Search**: Perform Google searches with advanced options
  - 🖼️ **Google Images**: Search Google Images with advanced filtering options
  - 📰 **Google News**: Search Google News with time-based and geographic filtering
  - 🔎 **Bing Search**: Search Bing with customizable filters
  - 🛍️ **Amazon Search**: Search products on Amazon

  ## Directory Structure

  ```
  nodes/ScrapingDog/
  ├── ScrapingDog.node.ts      # Main node implementation (Declarative Style)
  ├── ScrapingDog.node.json    # Node metadata
  ├── scrappingDog.svg         # Node icon
  ├── types/
  │   └── index.ts             # TypeScript interfaces and types
  ├── resources/
  │   ├── index.ts             # Resource exports
  │   ├── scrapeUrl.ts         # Scrape URL resource
  │   ├── googleSearch.ts      # Google Search resource
  │   ├── googleImages.ts      # Google Images resource
  │   ├── googleNews.ts        # Google News resource
  │   ├── bingSearch.ts        # Bing Search resource
  │   ├── amazonSearch.ts      # Amazon Search resource
  │   └── staticResource.ts    # Static data (countries, etc.)
  ```

  ## Recent Updates

  ### Version 0.4.2 - LinkedIn API Removal & Documentation Updates
  - 🗑️ **REMOVED: LinkedIn Profile and Jobs APIs** - Removed LinkedIn Profile and LinkedIn Jobs functionality
  - **Simplified Interface**: Streamlined resource options for better focus on core web scraping features
  - **Reduced Dependencies**: Cleaner codebase with fewer external integrations
  - **Enhanced Documentation**: Added comprehensive parameter documentation for all remaining APIs
  - **Updated Examples**: Improved usage examples and API response documentation

  ### Version 0.4.1 - Google News API Integration
  - 📰 **NEW: Google News Search** - Added comprehensive Google News API support
  - **Time-Based Filtering**: Filter news by hour, day, week, month, or year
  - **Geographic Targeting**: Country-specific news results with custom domain support
  - **Language Support**: 18 different languages for news results
  - **Advanced Filtering**: Geographic location (UULE), language restrictions, safe search
  - **Auto-Correct Control**: Option to exclude auto-corrected query results

  ### Version 0.4.0 - Google Images API Integration
  - 🖼️ **NEW: Google Images Search** - Added comprehensive Google Images API support
  - **Advanced Image Filtering**: Size, type, color, usage rights, time period filters
  - **Multi-language Support**: 13 different languages for search results
  - **Safe Search Controls**: Strict, moderate, or off filtering options
  - **Geographic Targeting**: Country-specific image search results

  ### Previous Updates
  1. **Converted to Declarative Style**
     - Removed manual HTTP request handling
     - Added routing configuration for each resource
     - Improved error handling
     - Better parameter validation

  2. **Resource Improvements**
     - Added proper parameter descriptions
     - Fixed boolean parameter descriptions to start with "Whether"
     - Sorted option lists alphabetically
     - Improved type safety

  3. **API Integration**
     - Fixed API key handling in requests
     - Proper HTML content handling for scraping
     - Improved response processing

  ## Usage Examples

  ### 1. Scrape URL
  ```javascript
  {
      "resource": "scrapeUrl",
      "operation": "get",
      "parameters": {
          "url": "https://example.com",
          "dynamic": false,
          "markdown": false,
          "premium": false,
          "superProxy": false,
          "additionalFields": {
              "aiQuery": "Extract all product names",
              "aiExtractRules": "Find prices and descriptions"
          }
      }
  }
  ```

  ### 2. Google Search
  ```javascript
  {
      "resource": "googleSearch",
      "operation": "search",
      "parameters": {
          "query": "n8n automation",
          "advance": true,
          "page": "1",
          "location": "US",
          "results": "10"
      }
  }
  ```

  ### 3. Google Images
  ```javascript
  {
      "resource": "googleImages",
      "operation": "search",
      "parameters": {
          "query": "sunset landscape",
          "results": "20",
          "country": "US",
          "language": "en",
          "imgsz": "l",
          "imageType": "photo",
          "imageColor": "bw",
          "licenses": "f",
          "tbs": "qdr:d",
          "safe": "1"
      }
  }
  ```

  ### 4. Google News
  ```javascript
  {
      "resource": "googleNews",
      "operation": "search",
      "parameters": {
          "query": "artificial intelligence technology",
          "results": "50",
          "additionalFields": {
              "country": "us",
              "page": 0,
              "domain": "google.com",
              "language": "en",
              "tbs": "qdr:d",
              "safe": "active",
              "nfpr": false
          }
      }
  }
  ```

  ### 5. Bing Search
  ```javascript
  {
      "resource": "bingSearch",
      "operation": "search",
      "parameters": {
          "query": "web scraping tools",
          "page": 1,
          "country": "US",
          "results": 20,
          "filters": "ex1:'answerType:CalculatorPageType'"
      }
  }
  ```

  ### 6. Amazon Search
  ```javascript
  {
      "resource": "amazonSearch",
      "operation": "search",
      "parameters": {
          "query": "wireless headphones",
          "country": "US",
          "page": 1,
          "domain": "amazon.com",
          "postal_code": "10001"
      }
  }
  ```

  ## Resource Parameters

  ### Scrape URL
  - `url` (Required): Target webpage URL
  - `dynamic`: Whether to enable JavaScript rendering
  - `premium`: Whether to use premium proxy
  - `superProxy`: Whether to enable super proxy
  - `markdown`: Whether to get response in markdown format
  - `wait`: Wait time for dynamic rendering (ms)
  - `country`: Geolocation for the request
  - `aiQuery`: AI-powered data extraction query
  - `aiExtractRules`: Custom extraction rules

  ### Google Search
  - `query` (Required): Search keyword
  - `advance`: Whether to enable advanced features
  - `page`: Result page number (1-10)
  - `location`: Search location/country
  - `results`: Number of results (10-100)

  ### Google Images
  - `query` (Required): Search keyword for images
  - `results`: Number of results (10-100)
  - `country`: Country for geotargeting (US, UK, CA, etc.)
  - `language`: Search language (en, es, fr, de, etc.)
  - `imgsz`: Filter by size (any, large, medium, icon)
  - `imageType`: Filter by type (any, face, photo, clipart, lineart, animated)
  - `imageColor`: Filter by color (any, color, gray, trans, red, orange, yellow, green, teal, blue, purple, pink, white, black, brown)
  - `licenses`: Filter by usage rights (any, labeled-for-reuse, labeled-for-reuse-with-modification, etc.)
  - `tbs`: Filter by time (any, hour, day, week, month, year)
  - `safe`: Safe search level (strict, moderate, off)

  ### Google News
  - `query` (Required): Search keyword for news articles
  - `results`: Number of results (1-100)
  - `country`: Country for geotargeting (us, uk, in, ca, au, de, fr, jp, br, etc.)
  - `page`: Page number (0 for first page, 1 for second page, etc.)
  - `domain`: Google domain for local results (e.g., google.co.uk for UK)
  - `language`: Search language (en, es, fr, de, it, pt, ru, ja, zh-cn, ko, ar, hi, etc.)
  - `lr`: Language restriction in format lang_{language_code} (e.g., lang_en)
  - `uule`: Geographic location parameter for tailored results
  - `tbs`: Time-based search filter (qdr:h for past hour, qdr:d for past day, qdr:w for past week, qdr:m for past month, qdr:y for past year)
  - `safe`: Safe search filter (active/off)
  - `nfpr`: Exclude auto-corrected queries (true to exclude, false to include)

  ### Bing Search
  - `query` (Required): Search keyword
  - `page`: Page number for pagination
  - `country`: Country for geotargeting
  - `filters`: Custom search filters
  - `results`: Number of results to return

  ### Amazon Search
  - `query` (Required): Product search keyword
  - `country`: Country for Amazon marketplace (e.g., US, UK, CA, DE, FR, etc.)
  - `page`: Page number for pagination
  - `domain`: Amazon domain (e.g., amazon.com, amazon.co.uk)
  - `postal_code`: Postal code for location-based results

  ## API Response Examples

  ### Google Images Response
  ```json
  {
    "time_taken": 685.692823,
    "ads": [],
    "images_results": [
      {
        "title": "Beautiful Sunset Landscape",
        "image": "https://encrypted-tbn0.gstatic.com/images?q=tbn:...",
        "source": "example.com",
        "original": "https://example.com/images/sunset.jpg",
        "link": "https://example.com/sunset-photography",
        "original_height": 1080,
        "original_width": 1920,
        "original_size": "245KB",
        "know_more_link": "https://www.google.com/search/about-this-image?...",
        "is_product": false,
        "rank": 1
      }
    ]
  }
  ```

  ### Google News Response
  ```json
  {
    "time_taken": 542.123456,
    "ads": [],
    "news_results": [
      {
        "rank": 1,
        "title": "Breakthrough in Artificial Intelligence Technology",
        "link": "https://example-news.com/ai-breakthrough-2024",
        "source": "TechNews",
        "published_date": "3 hours ago",
        "snippet": "Researchers have developed a new AI system that can understand complex human emotions and respond appropriately, marking a significant milestone in artificial intelligence development.",
        "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:...",
        "rank_page": 1
      },
      {
        "rank": 2,
        "title": "AI Companies Announce Major Partnership",
        "link": "https://business-news.com/ai-partnership",
        "source": "Business Daily",
        "published_date": "5 hours ago",
        "snippet": "Leading technology companies have formed a strategic alliance to accelerate AI research and development, focusing on ethical AI implementation.",
        "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:...",
        "rank_page": 1
      }
    ]
  }
  ```

  ## Installation

  ### For n8n Users

  1. Install the package in your n8n instance:
  ```bash
  npm install n8n-nodes-scraping-dog
  ```

  2. Restart your n8n instance to load the new node.

  3. The ScrapingDog node will appear in the node palette under the "Transform" category.

  ### Credentials Setup

  1. Create a ScrapingDog API account at [ScrapingDog.com](https://scrapingdog.com)
  2. Get your API key from the dashboard
  3. In n8n, create new credentials of type "ScrapingDog API"
  4. Enter your API key in the credentials configuration

  ## Development

  1. Install dependencies:
  ```bash
  npm install
  ```

  2. Build the node:
  ```bash
  npm run build
  ```

  3. Run with Docker:
  ```bash
  make rebuild-and-logs
  ```

  ## Testing

  The node includes proper error handling for:
  - Invalid API key
  - Rate limiting
  - Invalid parameters
  - Network errors
  - Blocked requests

  ## License

  MIT License - see LICENSE file for details 

ai_documentation_summary:
  {"purpose":"A custom n8n node that integrates with the ScrapingDog API to perform web scraping and cross-platform search operations including Google, Bing, and Amazon.","capabilities":["URL scraping with dynamic content extraction","Google Search with advanced filtering","Google Images search with size/type/color filters","Google News search with time-based and geographic filtering","Bing Search with customizable filters","Amazon product search","Multi-language and multi-region support","Safe search controls","AI-powered content extraction via additional fields"],"authentication":"API key required (configured via node settings)","commonUseCases":["Extracting content from websites for data aggregation","Monitoring product availability on Amazon","Gathering news trends by region and language","Searching for images with specific usage rights","Competitor analysis via web scraping"],"limitations":["LinkedIn Profile and Jobs APIs have been removed","Rate limits apply based on ScrapingDog API tier","Requires valid ScrapingDog API key for all operations"],"relatedNodes":["HTTP Request","Webhook","Code","Function Item"]}


node_type: n8n-nodes-blue.blue
package_name: n8n-nodes-blue
display_name: Blue
description: Interact with Blue Project Management via GraphQL API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: bluetogether
author_github_url: https://github.com/datadoesntlie/
npm_package_name: n8n-nodes-blue
npm_version: 0.1.8
community_fetched_at: 2026-03-25T21:19:40.610Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "getCompanies",
      "options": [
        {
          "name": "Create Project",
          "value": "createProject",
          "action": "Create a new project from a template",
          "description": "Create a new project from a template"
        },
        {
          "name": "Create Record",
          "value": "createRecord",
          "action": "Create a new record todo task with custom fields",
          "description": "Create a new record (todo/task) with custom fields"
        },
        {
          "name": "Execute Custom GraphQL",
          "value": "customQuery",
          "action": "Execute a custom graph ql query",
          "description": "Execute a custom GraphQL query"
        },
        {
          "name": "Get Records",
          "value": "getRecords",
          "action": "Get records with advanced filtering",
          "description": "Retrieve records (todos/tasks) with advanced filtering"
        },
        {
          "name": "Invite User",
          "value": "inviteUser",
          "action": "Invite a user to a project",
          "description": "Invite User to a Project"
        },
        {
          "name": "List Companies",
          "value": "getCompanies",
          "action": "List all companies you have access to",
          "description": "List all companies you have access to"
        },
        {
          "name": "List Custom Fields",
          "value": "listCustomFields",
          "action": "List custom fields in a project with detailed information",
          "description": "List custom fields in a project with detailed information"
        },
        {
          "name": "List Projects",
          "value": "getProjects",
          "action": "List projects from a company",
          "description": "Retrieve projects from a company"
        },
        {
          "name": "Tag Record",
          "value": "tagRecord",
          "action": "Add tags to a record todo task",
          "description": "Add tags to a record (todo/task)"
        },
        {
          "name": "Update Record",
          "value": "updateRecord",
          "action": "Update a record todo task with custom fields",
          "description": "Update a record (todo/task) with custom fields"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Project",
      "value": "createProject",
      "action": "Create a new project from a template",
      "description": "Create a new project from a template"
    },
    {
      "name": "Create Record",
      "value": "createRecord",
      "action": "Create a new record todo task with custom fields",
      "description": "Create a new record (todo/task) with custom fields"
    },
    {
      "name": "Execute Custom GraphQL",
      "value": "customQuery",
      "action": "Execute a custom graph ql query",
      "description": "Execute a custom GraphQL query"
    },
    {
      "name": "Get Records",
      "value": "getRecords",
      "action": "Get records with advanced filtering",
      "description": "Retrieve records (todos/tasks) with advanced filtering"
    },
    {
      "name": "Invite User",
      "value": "inviteUser",
      "action": "Invite a user to a project",
      "description": "Invite User to a Project"
    },
    {
      "name": "List Companies",
      "value": "getCompanies",
      "action": "List all companies you have access to",
      "description": "List all companies you have access to"
    },
    {
      "name": "List Custom Fields",
      "value": "listCustomFields",
      "action": "List custom fields in a project with detailed information",
      "description": "List custom fields in a project with detailed information"
    },
    {
      "name": "List Projects",
      "value": "getProjects",
      "action": "List projects from a company",
      "description": "Retrieve projects from a company"
    },
    {
      "name": "Tag Record",
      "value": "tagRecord",
      "action": "Add tags to a record todo task",
      "description": "Add tags to a record (todo/task)"
    },
    {
      "name": "Update Record",
      "value": "updateRecord",
      "action": "Update a record todo task with custom fields",
      "description": "Update a record (todo/task) with custom fields"
    }
  ]

npm_readme:
  # n8n-nodes-blue

  This is an n8n community node. It lets you use Blue Project Management in your n8n workflows.

  Blue Project Management is a modern project management platform that provides powerful GraphQL APIs for managing projects, tasks, teams, and 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.

  ## Operations

  This node supports the following operations:

  ### Companies
  - **Get Companies** - List all companies you have access to

  ### Projects  
  - **Get Projects** - List all projects within a specific company

  ### Records (Tasks/Todos)
  - **Get Records** - Retrieve tasks/todos with advanced filtering (by project, search terms, completion status)
  - **Create Record** - Create new tasks/todos with support for assignees, tags, custom fields, and checklists
  - **Update Record** - Update existing records including core fields and custom field values

  ### Advanced
  - **Custom Query** - Execute custom GraphQL queries against the Blue API for advanced use cases

  ## Credentials

  ### Getting Blue API Credentials

  1. **Create Blue Account**
     - Sign up for a Blue Project Management account at [blue.cc](https://blue.cc)
     - Complete account verification and setup

  2. **Generate API Tokens**
     - Log into your Blue account
     - Navigate to Account Settings → API Settings
     - Generate a new API token pair:
       - **Token ID**: Your unique identifier (e.g., `abc123def456`)
       - **Token Secret**: Your authentication secret (keep this secure!)
     - Copy both values - you'll need them for n8n configuration

  3. **Note Your Company Access**
     - Ensure you have access to at least one company in Blue
     - API operations require company context
     - You can be a member of multiple companies

  ### Configuring in n8n

  1. **Add Blue API Credential**
     - In n8n, go to **Settings** → **Credentials**
     - Click **Add Credential** → Search for "Blue API"
     - Fill in the credential form:

  2. **Credential Configuration**
     ```
     Base URL: https://api.blue.cc/graphql (default - don't change)
     Token ID: [Your Blue API Token ID]
     Token Secret: [Your Blue API Token Secret]
     ```

  3. **Test Connection**
     - Click **Test** to verify your credentials
     - You should see a successful connection message
     - If test fails, double-check your Token ID and Secret

  4. **Save Credential**
     - Give your credential a descriptive name (e.g., "Blue Production API")
     - Click **Save**

  ### Authentication Flow

  The node automatically handles all authentication:
  - **Headers**: Adds `X-Bloo-Token-ID` and `X-Bloo-Token-Secret` to requests
  - **Company Context**: Passes `X-Bloo-Company-ID` based on your operation selections
  - **GraphQL Endpoint**: Routes all requests to Blue's GraphQL API at `https://api.blue.cc/graphql`

  ### Security Notes

  - **Keep Token Secret Secure**: Never share or commit your Token Secret
  - **Rotate Tokens**: Regularly regenerate tokens for security
  - **Company Access**: Tokens only work with companies you have access to
  - **Rate Limits**: Blue API has rate limiting - implement appropriate delays in high-volume workflows

  ## Compatibility

  - **Minimum n8n version**: 1.0.0
  - **Tested with**: n8n 1.x
  - **Node API version**: 1

  ## Usage

  ### Example Workflows

  #### Workflow 1: Task Management Dashboard
  Create a workflow that monitors and manages tasks across projects:

  1. **Trigger**: Schedule (runs every hour)
  2. **Blue - Get Companies**: Retrieve available companies
  3. **Loop**: For each company:
     - **Blue - Get Projects**: Get all projects for the company
     - **Blue - Get Records**: Fetch incomplete tasks with search filter
     - **Filter**: Identify overdue tasks
     - **Send Email**: Notify project managers of overdue items

  #### Workflow 2: Automated Task Creation
  Set up task creation from external sources:

  1. **Trigger**: Webhook (from form submission/external system)
  2. **Blue - Get Companies**: Select target company
  3. **Blue - Get Projects**: Find appropriate project by name
  4. **Blue - Create Record**: Create new task with:
     - Title and description from webhook data
     - Assignees based on project team
     - Custom fields populated from form data
     - Tags for categorization

  #### Workflow 3: Weekly Project Reports
  Generate automated project status reports:

  1. **Trigger**: Schedule (weekly)
  2. **Blue - Get Companies**: Get all companies
  3. **Loop**: For each company:
     - **Blue - Get Projects**: Retrieve active projects
     - **Blue - Get Records**: Get tasks with completion filter
     - **Calculate**: Progress metrics (completed vs total tasks)
     - **Format**: Create summary report
     - **Send to Slack/Email**: Distribute reports to stakeholders

  #### Workflow 4: Custom Data Integration
  Sync data between Blue and other systems:

  1. **External API**: Fetch data from CRM/ERP system
  2. **Transform**: Map external data to Blue format
  3. **Blue - Custom Query**: Execute complex GraphQL query to check for existing records
  4. **Conditional**: Create or update based on existence
  5. **Blue - Create/Update Record**: Sync the data with custom fields populated

  ### Quick Start Guide

  **Step 1: Set up Credentials**
  1. In n8n, go to Credentials → Add Credential → Blue API
  2. Enter your Blue API Token ID and Secret
  3. Test the connection

  **Step 2: Basic Flow**
  1. Add Blue node to your workflow
  2. Select "Get Companies" operation
  3. Execute to see available companies
  4. Copy a Company ID for next steps

  **Step 3: Explore Operations**
  - Use Company ID to get projects
  - Select a project to retrieve tasks
  - Create new tasks with the Create Record operation

  ### Advanced Features

  - **Custom Fields**: Both create and update operations support Blue's custom field system with dynamic field selection
  - **Multiselect Dropdowns**: Assignees and tags use dynamic dropdowns populated from your Blue data based on selected company/project
  - **GraphQL Power**: Use the Custom Query operation for complex data operations beyond standard CRUD
  - **Intelligent Filtering**: Records support rich filtering - combine project filtering with search terms for precise results
  - **Error Handling**: Comprehensive GraphQL error handling with detailed error messages and suggestions

  ### Operation Details

  #### Get Records Options
  - **Project Filter**: Limit results to specific project
  - **Search**: Find records containing specific text
  - **Show Completed**: Include/exclude completed tasks
  - **Pagination**: Control result size with limit/skip

  #### Create Record Features
  - **Rich Content**: Title, description, due dates
  - **Team Assignment**: Multi-select assignees from project team
  - **Categorization**: Apply multiple tags for organization
  - **Custom Fields**: Populate any custom fields defined in your Blue setup
  - **Checklists**: Add sub-tasks during creation

  #### Custom Query Power
  Execute any GraphQL query against Blue's API:
  ```graphql
  query GetProjectStats($projectId: ID!) {
    project(id: $projectId) {
      name
      todos {
        totalCount
      }
      todosCompleted: todos(completed: true) {
        totalCount
      }
    }
  }
  ```

  ### Tips & Best Practices

  - **Company Context**: Company ID is automatically passed as header for all operations after selection
  - **Performance**: Use pagination and filtering to limit large result sets
  - **Error Recovery**: Implement error handling for API rate limits and network issues
  - **Data Validation**: Validate required fields before creating/updating records
  - **Webhook Integration**: Use Blue's webhook system with n8n triggers for real-time automation

  ## Troubleshooting

  ### Common Issues

  #### Authentication Errors
  **Problem**: "Invalid credentials" or "Unauthorized" errors
  **Solutions**:
  - Verify Token ID and Secret are correct (copy-paste to avoid typos)
  - Check that tokens haven't expired or been revoked
  - Ensure you have access to at least one company in Blue
  - Test credentials using the credential test function

  #### Empty Company List
  **Problem**: "Get Companies" returns empty results
  **Solutions**:
  - Confirm your Blue account has company access
  - Check if you need to be invited to a company
  - Verify your account is active and verified

  #### Operation Failures
  **Problem**: Operations fail with GraphQL errors
  **Solutions**:
  - Check that Company ID is valid and you have access
  - Verify Project ID exists and is accessible
  - For custom queries, validate GraphQL syntax
  - Review Blue API documentation for field requirements

  #### Dropdown Loading Issues
  **Problem**: Assignees, Tags, or Custom Fields don't load
  **Solutions**:
  - Ensure Company and Project are selected first
  - Check that the project has users/tags/custom fields configured
  - Verify network connectivity to Blue API
  - Try refreshing the dropdown options

  #### Performance Issues
  **Problem**: Slow response times or timeouts
  **Solutions**:
  - Use pagination for large result sets (limit/skip parameters)
  - Add appropriate delays between API calls
  - Filter results to reduce data transfer
  - Check Blue API status for outages

  ### Getting Help

  - **Blue API Issues**: Refer to [Blue API Documentation](https://www.blue.cc/en/api/start-guide/introduction)
  - **n8n Node Issues**: Check [n8n Community](https://community.n8n.io/)
  - **Bug Reports**: Submit issues to the [GitHub repository](https://github.com/datadoesntlie/n8n-nodes-blue/issues)

  ### Debug Tips

  1. **Enable Detailed Logging**: Turn on n8n's detailed execution logging
  2. **Test Operations Individually**: Isolate failing operations
  3. **Verify Data**: Check that IDs and parameters are valid
  4. **GraphQL Debugging**: Use Blue's GraphQL playground for query testing
  5. **Network Issues**: Check firewall/proxy settings if requests fail

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Blue API Documentation](https://www.blue.cc/en/api/start-guide/introduction) - Official API guide and reference
  * [Blue GraphQL Schema](https://api.blue.cc/graphql) - Interactive GraphQL playground
  * [GitHub Repository](https://github.com/datadoesntlie/n8n-nodes-blue) - Source code and issue tracking

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with Blue Project Management via its GraphQL API to manage projects, tasks, teams, and workflows.","capabilities":["List all accessible companies","List projects within a specific company","Retrieve tasks/todos with advanced filtering","Create new tasks/todos with assignees, tags, custom fields, and checklists","Update existing tasks/todos including core fields and custom values","Execute custom GraphQL queries for advanced use cases"],"authentication":"API Token (Token ID and Token Secret)","commonUseCases":["Task management dashboards and monitoring","Automated task creation from external sources","Weekly project status reporting","Data synchronization between Blue and other systems (CRM/ERP)"],"limitations":["Requires valid Blue API credentials (Token ID and Secret)","API operations require company context and access","Subject to Blue API rate limits","Requires n8n version 1.0.0 or higher","Advanced features may be truncated in documentation"],"relatedNodes":["n8n-nodes-core.code","n8n-nodes-core.httpRequest","n8n-nodes-core.if"]}


node_type: @postpulse/n8n-nodes-postpulse.postPulse
package_name: @postpulse/n8n-nodes-postpulse
display_name: PostPulse
description: Interact with PostPulse API to manage social media posts
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: alex97po
author_github_url: https://github.com/PostPulse/n8n-postpulse-node.git
npm_package_name: @postpulse/n8n-nodes-postpulse
npm_version: 0.2.3
community_fetched_at: 2026-03-25T21:19:40.610Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "post",
      "options": [
        {
          "name": "Account",
          "value": "account"
        },
        {
          "name": "Media",
          "value": "media"
        },
        {
          "name": "Post",
          "value": "post"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get connected accounts",
          "description": "Get connected social media accounts"
        },
        {
          "name": "Get Connected Chats",
          "value": "getConnectedChats",
          "action": "Get connected chats",
          "description": "Get connected chats for an account by platform"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "account"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload media",
          "description": "Upload media file"
        },
        {
          "name": "Get Upload Status",
          "value": "getUploadStatus",
          "action": "Get upload status",
          "description": "Get the status of a media import job"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "media"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "schedule",
      "options": [
        {
          "name": "Schedule",
          "value": "schedule",
          "action": "Schedule a post",
          "description": "Schedule a post"
        },
        {
          "name": "Schedule (Light)",
          "value": "scheduleLight",
          "action": "Schedule a light post",
          "description": "Schedule a post with simplified interface"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "post"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get connected accounts",
      "description": "Get connected social media accounts"
    },
    {
      "name": "Get Connected Chats",
      "value": "getConnectedChats",
      "action": "Get connected chats",
      "description": "Get connected chats for an account by platform"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload media",
      "description": "Upload media file"
    },
    {
      "name": "Get Upload Status",
      "value": "getUploadStatus",
      "action": "Get upload status",
      "description": "Get the status of a media import job"
    },
    {
      "name": "Schedule",
      "value": "schedule",
      "action": "Schedule a post",
      "description": "Schedule a post"
    },
    {
      "name": "Schedule (Light)",
      "value": "scheduleLight",
      "action": "Schedule a light post",
      "description": "Schedule a post with simplified interface"
    }
  ]

npm_readme:
  # PostPulse n8n Node

  > **Official n8n integration for [PostPulse](https://post-pulse.com)** — schedule and publish content to multiple social networks from your n8n workflows.

  - **Auth:** OAuth2 (auto refresh) 
  - **Core actions:** Accounts → Media Upload → Schedule Post(s) (+ Telegram Channels / Facebook Pages lookup)  
  - **Targets today:** Facebook, Instagram, TikTok, YouTube, Threads, LinkedIn, Telegram, X, Bluesky  
  - **Use cases:** One-click multi-destination posting, media pipeline, automated campaigns

  ---

  ## Table of contents

  - [Prerequisites](#prerequisites)
  - [Install](#install)
  - [Authenticate](#authenticate)
  - [Quick start](#quick-start)
  - [Operations](#operations)
  - [Data model](#data-model)
  - [Platform settings](#platform-settings)
  - [Media & text validations](#media--text-validations)
  - [Rate limits & API keys](#rate-limits--api-keys)
  - [Webhooks](#webhooks)
  - [Examples](#examples)
  - [FAQ](#faq)
  - [Support](#support)
  - [Versioning & License](#versioning--license)

  ---

  ## Prerequisites

  1. **Sign up** at https://post-pulse.com/login  
  2. **Connect your social accounts** in the web app: https://post-pulse.com/app/accounts  
  3. **Create OAuth client**: Visit https://developers.post-pulse.com and sign in using the email associated with your PostPulse account. Create a new OAuth client to obtain `client_id` and `client_secret`.
  4. (Telegram only) Add the official **PostPulse bot** to your channels you plan to post to.

  > Use the same email in n8n OAuth as your PostPulse account email.

  ---

  ## Install

  - **From npm (recommended):**
    ```bash
    npm install @postpulse/n8n-nodes-postpulse
    ```

  ---

  ## Authenticate

  Create **Credentials → PostPulse OAuth2 API** in n8n:

  - **OAuth Redirect URL:** Use this URL when creating your OAuth client at https://developers.post-pulse.com
  - **Client ID / Secret:** Obtained from the developer portal at https://developers.post-pulse.com

  This node extends n8n’s `oAuth2Api` so **tokens are refreshed automatically**.  

  ---

  ## Quick start

  ### Using Schedule (Light) - Recommended for simple workflows

  1. **Media → Upload** *(if posting media)*
     - **From File**: Upload binary file data
       - Returns: `{ path }` — use this directly in attachment paths
     - **From Public URL**: Import media from a URL
       - Returns: `{ id, state }` 
       - Then use **Media → Get Upload Status** with the `id` to monitor progress
       - Wait until `state` is `READY`, then use the `s3Key` value in attachment paths
  2. **Posts → Schedule (Light)**
     - Select your connected account from the dropdown (accounts loaded automatically)
     - UI automatically shows platform-specific fields (e.g., Instagram: Publication Type)
     - Facebook and Telegram accounts: select Page/Channel from dropdowns (loaded automatically)
     - Enter content and comma-separated attachment paths
     - Set scheduled time and execute!

  ### Using Schedule - Advanced workflows

  For multi-account posting or complex scenarios:

  1. **Accounts → Get Many**  
     Retrieve your connected accounts. Save the `id` of targets you'll post to.
  2. **Accounts → Get Connected Chats** *(only if posting to Telegram/Facebook manually)*  
     Input: Account ID and platform. Output contains chat/page IDs.
  3. **Media → Upload** *(same as above)*
  4. **Posts → Schedule**  
     Build one `PostSchedule` with one or more `Publication`s.  
     - Set `scheduledTime` (past/now = queue immediately)
     - Manually construct `platformSettings` JSON
     - For now, prefer `isDraft: false` (update APIs will come later)

  ---

  ## Operations

  ### Accounts: **Get Many**
  - **Output:** Array of accounts: `{ id, platform, handle, ... }`
  - **Use:** Pick `id` for each destination.

  ### Telegram: **Get Connected Chats**
  - **Input:** `{ id }` (must be a Telegram account)
  - **Output:** Array: `{ id, title }` — pass `chatId` into Telegram posts.

  ### Media: **Upload**
  - **Input:** File or Public URL
  - **Output:** 
    - File upload: `{ path }` — use in `attachmentPaths` of posts
    - URL import: `{ id, state }` — use `id` with "Get Upload Status" to monitor progress
  - **Upload Sources:**
    - **From File:** Upload binary file data (existing functionality)
    - **From Public URL:** Import media from a public URL (new functionality)

  ### Media: **Get Upload Status**
  - **Input:** `{ importId }` (from URL import response)
  - **Output:** Complete import status including `id`, `state`, `sourceUrl`, `bytesDownloaded`, `totalBytes`, `detectedMime`, `s3Key`, `errorCode`, `errorMessage`
  - **Use:** Monitor the progress of URL-based media imports

  ### Posts: **Schedule**
  - **Input:** `PostSchedule` (see [Data model](#data-model))
  - **Behavior:** Schedules one or multiple publications for the same time.
  - **Recommended:** `isDraft: false` (until update endpoints are exposed in node).

  ### Posts: **Schedule (Light)**
  - **Purpose:** Simplified interface for scheduling a single post to one account
  - **Key Features:**
    - **Platform-specific dynamic fields** — The UI automatically shows relevant fields based on the selected account's platform
    - **Automatic platform settings** — No need to manually construct JSON; the node builds `platformSettings` automatically
    - **Smart chat selection** — Facebook Pages and Telegram Channels appear as dropdowns (loaded from API)
    - **Simple attachment paths** — Enter comma-separated media paths instead of managing collections
  - **Input Fields:**
    - `Scheduled Time` — When to schedule the post. The time will be interpreted using the workflow timezone (see Workflow Settings).
    - `Social Media Account` — Dropdown of your connected accounts
    - *Dynamic fields based on platform:*
      - **Instagram**: Publication Type (Feed/Reels/Story)
      - **Facebook**: Publication Type (Feed/Reels/Story) + Page dropdown
      - **YouTube**: Video Title
      - **TikTok**: Title
      - **Threads**: Topic Tag (optional)
      - **Telegram**: Channel dropdown
      - **X/Twitter, BlueSky, LinkedIn**: No additional fields
    - `Content` — Post text/caption (multi-line)
    - `Attachment Paths` — Comma-separated media paths from Media → Upload
  - **Output:** Same as Schedule operation
  - **Use Case:** Perfect for simple workflows and testing; for complex multi-account or multi-post scenarios, use Schedule operation

  ---

  ## Data model

  ### `PostSchedule`
  ```json
  {
    "scheduledTime": "2025-08-17T14:03:00",
    "isDraft": false,
    "publications": [ /* Publication[] */ ]
  }
  ```

  ### `Publication`
  Represents “one publication in user’s mind” that may map to *one or many* platform posts.

  ```json
  {
    "socialMediaAccountId": 442,
    "posts": [ /* Post[] */ ],
    "platformSettings": { /* see below */ }
  }
  ```

  - **One publication → multiple posts** is useful when:
    - Telegram account posts to several **channels** (one post per channel)
    - Telegram account posts with large text or more than 10 media (one post per message that will be published)
    - Instagram **storyline** (multiple stories in one conceptual set)

  ### `Post`
  ```json
  {
    "attachmentPaths": [
      "6354d8d2-e0f1-702b-af6c-62e28e377ec7/c6c2b826-8aca-4eae-8549-515325012ab4.jpeg"
    ],
    "content": "Your caption or description",
    "chatId": "1234567890"   // Telegram only
    /* "thumbnailPath": "..." — coming soon */
  }
  ```

  > **Note:** For YouTube/TikTok, `content` is used as **description** (titles are set in `platformSettings`).

  ---

  ## Platform settings

  Each **Publication** must include `platformSettings` with a required discriminator: `type`.

  ```json
  { "type": "INSTAGRAM", "publicationType": "REELS" }
  ```

  Supported shapes:

  ### Instagram
  ```json
  {
    "type": "INSTAGRAM",
    "publicationType": "FEED" | "REELS" | "STORY"
  }
  ```

  ### LinkedIn
  ```json
  {
    "type": "LINKEDIN",
    "visibility": "PUBLIC" | "CONNECTIONS" | "GROUP"
  }
  ```

  ### Threads
  ```json
  {
    "type": "THREADS",
    "topicTag": "your-topic-tag"
  }
  ```

  ### TikTok
  ```json
  {
    "type": "TIK_TOK",
    "title": "My video title",
    "privacyLevel": "PUBLIC_TO_EVERYONE" | "FOLLOWER_OF_CREATOR" | "MUTUAL_FOLLOW_FRIENDS" | "SELF_ONLY",
    "disableDuet": false,
    "disableComments": false,
    "disableStitch": false,
    "brandContent": false,
    "brandOrganic": true,
    "hasUsageConfirmation": true
  }
  ```

  ### YouTube
  ```json
  {
    "type": "YOUTUBE",
    "title": "My video title",
    "privacyStatus": "PUBLIC" | "UNLISTED" | "PRIVATE",
    "category": "FILM_ANIMATION" | "AUTOS_VEHICLES" | "MUSIC" | "PETS_ANIMALS" | "SPORTS" | "TRAVEL_EVENTS" | "GAMING" | "PEOPLE_BLOGS" | "COMEDY" | "ENTERTAINMENT" | "NEWS_POLITICS" | "HOWTO_STYLE" | "EDUCATION" | "SCIENCE_TECHNOLOGY"
  }
  ```

  ---

  ## Media & text validations

  PostPulse Web enforces rich, platform-specific validations.  
  **API clients must currently validate themselves.** (Server-side validations for API clients are planned.)

  | Validation area | PostPulse Web | PostPulse API (current) |
  |---|---|---|
  | X: Standard users can post up to 280 characters per tweet | UI warning | **You must validate** |
  | X: Supported image formats are JPG, PNG, and WEBP | Enforced | **You must validate** |
  | X: Image size should be less than or equal 5MB | Enforced | **You must validate** |
  | X: Video size should be less than or equal 512MB | Enforced | **You must validate** |
  | X: Maximum 4 media attachments | Enforced | **You must validate** |
  | X: Video duration must be between 0.5 sec and 140 sec | Enforced | **You must validate** |
  | X: Media aspect ratio between 1:3 and 3:1 | Enforced | **You must validate** |
  | Threads: Users can post up to 500 characters | Enforced | **You must validate** |
  | Threads: Topic tag should be less than 100 characters | Enforced | **You must validate** |
  | Threads: When no topic tag is specified in the platform settings and the content contains a word with # - the first word with # will be used as a topic tag (expept cases with numbers, like #1) | UI warning | **You must validate** |
  | Threads: Image size should be less than or equal 8MB | Enforced | **You must validate** |
  | Threads: Media aspect ratio between 0,01:1 and 10:1 | Enforced | **You must validate** |
  | Threads: Video duration must be less than 5 min | Enforced | **You must validate** |
  | Threads: Supported video format is MP4 | Enforced | **You must validate** |
  | YouTube: Title should be less than 100 characters | Enforced | **You must validate** |
  | YouTube: Description should be less than 5000 characters | Enforced | **You must validate** |
  | TikTok: Title should be less than 2200 characters for video post | Enforced | **You must validate** |
  | TikTok: Title should be less than 90 characters for image post | Enforced | **You must validate** |
  | TikTok: Description should be less than 4000 characters for image post | Enforced | **You must validate** |
  | TikTok: Image size should be less than or equal 20MB | Enforced | **You must validate** |
  | TikTok: Supported image formats are JPG, PNG, and WEBP | Enforced | **You must validate** |
  | TikTok: Supported video formats are MP4, MOV, and WebM | Enforced | **You must validate** |
  | TikTok: Video duration as per individual limits (typically 1 hour) | Enforced | **You must validate** |
  | TikTok: One post is either 1 video or up to 10 images | Enforced | **You must validate** |
  | TikTok: Video should have no more between 360 and 4096 pixels for both height and width | **To Do** | **You must validate** |
  | LinkedIn: User can post up to 3000 characters | Enforced | **You must validate** |
  | LinkedIn: One post can contain either 1 video or up to 9 images (or no media at all) | Enforced | **You must validate** |
  | LinkedIn: Supported video format is MP4 | Enforced | **You must validate** |
  | LinkedIn: Video size should be less than or equal 500MB | Enforced | **You must validate** |
  | LinkedIn: Video duration must be between 3 sec and 30 min | Enforced | **You must validate** |
  | Instagram: User can post up to 2200 characters | Enforced | **You must validate** |
  | Instagram: Supported image formats are JPG and PNG | Enforced | **You must validate** |
  | Instagram: Image size should be less than or equal 8MB | Enforced | **You must validate** |
  | Instagram: Feed post can contain up to 10 media (carousel) | Enforced | **You must validate** |
  | Instagram: Feed post media aspect ratio between 1.91:1 and 4:5 | Enforced | **You must validate** |
  | Instagram: Supported video formats are MP4 and MOV | Enforced | **You must validate** |
  | Instagram: Video size should be less than or equal 300MB | Enforced | **You must validate** |
  | Instagram: Feed and Story post video duration must be between 3 sec and 15 min | Enforced | **You must validate** |
  | Instagram: Reels video duration must be between 3 sec and 90 sec | Enforced | **You must validate** |
  | Instagram: Reels and Story post media aspect ratio between 0.01:1 and 10:1 | Enforced | **You must validate** |
  | Instagram: Reels and Story recommended aspect ratio is 9:16 | UI Warning | **You must validate** |
  | Instagram: Video should have no more than 1920 horizontal pixels | **To Do** | **You must validate** |
  | Bluesky: Users can post up to 300 characters | Enforced | **You must validate** |
  | Bluesky: Post may contain up to 4 images | Enforced | **You must validate** |
  | Telegram: Users can post up to 4096 characters | Enforced | **You must validate** |
  | Telegram: Standard user can post up to 1024 characters if post contains media as well | Enforced | **You must validate** |
  | Telegram: One post may contain up to 10 media | Enforced | **You must validate** |
  | Telegram: Supported image formats are JPG, PNG, and WEBP | Enforced | **You must validate** |
  | Telegram: Supported video formats is MP4 | Enforced | **You must validate** |

  > Follow updates at **https://post-pulse.com/releases** — we’ll announce when API-side validations roll out.

  ---

  ## Rate limits & API keys

  - Authentication uses **OAuth2**; tokens are auto-refreshed by n8n.
  - PostPulse runs on AWS API Gateway usage plans. Typical plans:
    - **Standard:** 20 RPS burst, 200 RPS steady, 50k req/month
    - **Agency:** higher limits on request

  ---

  ## Webhooks

  PostPulse supports webhooks for real-time notifications instead of polling for status updates. This is especially useful for tracking:

  - **Post publishing status** — Get notified when scheduled posts are published or fail
  - **Media import progress** — Receive updates on URL-based media imports without polling the "Get Upload Status" endpoint

  ### Setting up webhooks

  1. **Register webhook endpoints** at the [Developer Portal](https://developers.post-pulse.com)
  2. **Configure event types** you want to receive notifications for
  3. **Review webhook models** and event types in the developer documentation

  ### Benefits over polling

  - **Real-time updates** — Instant notifications when events occur
  - **Reduced API calls** — No need to repeatedly poll status endpoints
  - **Better reliability** — Guaranteed delivery with retry mechanisms
  - **Lower latency** — Immediate response to status changes

  > **Learn more:** Visit [https://developers.post-pulse.com](https://developers.post-pulse.com) for complete webhook documentation, supported event types, and payload schemas.

  ---

  ## Examples

  ### Minimal single-destination post (Reel)
  ```json
  {
    "scheduledTime": "2025-08-17T14:03:00",
    "isDraft": false,
    "publications": [
      {
        "socialMediaAccountId": 442,
        "platformSettings": {
          "type": "INSTAGRAM",
          "publicationType": "REELS"
        },
        "posts": [
          {
            "attachmentPaths": [
              "6354d8d2-e0f1-702b-af6c-62e28e377ec7/c6c2b826-8aca-4eae-8549-515325012ab4.jpeg"
            ],
            "content": "New drop is live! #fashion"
          }
        ]
      }
    ]
  }
  ```

  ### Telegram to multiple channels in one publication
  ```json
  {
    "scheduledTime": "2025-08-17T14:03:00",
    "isDraft": false,
    "publications": [
      {
        "socialMediaAccountId": 501,   // Telegram account id
        "platformSettings": { "type": "TELEGRAM" },
        "posts": [
          { "chatId": "-100123", "content": "Hello Channel A", "attachmentPaths": ["u1/p1.jpg"] },
          { "chatId": "-100456", "content": "Hello Channel B", "attachmentPaths": ["u1/p1.jpg"] }
        ]
      }
    ]
  }
  ```

  ### TikTok with title & privacy
  ```json
  {
    "scheduledTime": "2025-08-17T14:03:00",
    "isDraft": false,
    "publications": [
      {
        "socialMediaAccountId": 777,
        "platformSettings": {
          "type": "TIK_TOK",
          "title": "Top 5 tips",
          "privacyLevel": "PUBLIC_TO_EVERYONE",
          "hasUsageConfirmation": true
        },
        "posts": [
          { "attachmentPaths": ["u1/v1.mp4"], "content": "Full guide in bio" }
        ]
      }
    ]
  }
  ```

  ### Media import from URL
  ```json
  {
    "url": "https://example.com/my-video.mp4",
    "filenameHint": "promotional-video.mp4"
  }
  ```
  **Response:**
  ```json
  {
    "id": 12345,
    "state": "QUEUED"
  }
  ```

  ### Check media import status
  **Input:** `importId: 12345`

  **Response:**
  ```json
  {
    "id": 12345,
    "state": "READY",
    "sourceUrl": "https://example.com/my-video.mp4",
    "bytesDownloaded": 15728640,
    "totalBytes": 15728640,
    "detectedMime": "video/mp4",
    "s3Key": "6354d8d2-e0f1-702b-af6c-62e28e377ec7/promotional-video.mp4"
  }
  ```

  > **Note:** Use the `s3Key` value in `attachmentPaths` when the state is `READY`.

  ### Schedule (Light) - Instagram Reel
  Using the simplified interface with automatic platform settings:

  **Node configuration:**
  - Scheduled Time: `2025-08-17T14:03:00`
  - Social Media Account: `INSTAGRAM - @fashionbrand`
  - Publication Type: `Reels` (automatically appears for Instagram)
  - Content: `New drop is live! #fashion`
  - Attachment Paths: `6354d8d2-e0f1-702b-af6c-62e28e377ec7/video.mp4`

  The node automatically builds this API request:
  ```json
  {
    "scheduledTime": "2025-08-17T14:03:00",
    "isDraft": false,
    "publications": [{
      "socialMediaAccountId": 442,
      "platformSettings": {
        "type": "INSTAGRAM",
        "publicationType": "REELS"
      },
      "posts": [{
        "content": "New drop is live! #fashion",
        "attachmentPaths": ["6354d8d2-e0f1-702b-af6c-62e28e377ec7/video.mp4"]
      }]
    }]
  }
  ```

  ### Schedule (Light) - Telegram with Channel Selection
  **Node configuration:**
  - Scheduled Time: `2025-08-17T14:03:00`
  - Social Media Account: `TELEGRAM - @mybot`
  - Channel: `Tech Updates` (loaded from API, shows connected channels)
  - Content: `Check out our latest update!`
  - Attachment Paths: `user1/screenshot.png, user1/demo.mp4`

  The node automatically builds this API request:
  ```json
  {
    "scheduledTime": "2025-08-17T14:03:00",
    "isDraft": false,
    "publications": [{
      "socialMediaAccountId": 501,
      "platformSettings": {
        "type": "TELEGRAM"
      },
      "posts": [{
        "chatId": "-1001234567890",
        "content": "Check out our latest update!",
        "attachmentPaths": ["user1/screenshot.png", "user1/demo.mp4"]
      }]
    }]
  }
  ```

  ### Schedule (Light) - YouTube Video
  **Node configuration:**
  - Scheduled Time: `2025-08-17T14:03:00`
  - Social Media Account: `YOUTUBE - @MyChannel`
  - Video Title: `Top 5 JavaScript Tips` (automatically appears for YouTube)
  - Content: `Full tutorial with code examples. Links in description.`
  - Attachment Paths: `user1/tutorial-video.mp4`

  The node automatically builds this API request:
  ```json
  {
    "scheduledTime": "2025-08-17T14:03:00",
    "isDraft": false,
    "publications": [{
      "socialMediaAccountId": 777,
      "platformSettings": {
        "type": "YOUTUBE",
        "title": "Top 5 JavaScript Tips"
      },
      "posts": [{
        "content": "Full tutorial with code examples. Links in description.",
        "attachmentPaths": ["user1/tutorial-video.mp4"]
      }]
    }]
  }
  ```

  ---

  ## FAQ

  **Do I have to upload media to PostPulse even if I have a public URL?**  
  Not anymore! You can now use the "From Public URL" option in Media → Upload to import media directly from URLs. The system will download and host the media on `post-pulse.com` for platform compatibility.

  **How do I import media from a URL?**  
  Use Media → Upload with "From Public URL" option. Provide the URL and optionally a filename hint. The operation returns an import job ID and initial state. Use Media → Get Upload Status to monitor progress until the state becomes "READY".

  **What are the different import states?**  
  - `QUEUED`: Import job is waiting to start
  - `DOWNLOADING`: Media is being downloaded from the source URL
  - `VALIDATING`: Downloaded media is being validated
  - `UPLOADING`: Media is being uploaded to PostPulse storage
  - `READY`: Import complete, media ready to use (check `s3Key` field)
  - `FAILED_TEMPORARY`: Temporary failure, may retry automatically
  - `FAILED_PERMANENT`: Permanent failure, check `errorCode` and `errorMessage`

  **Can I draft then update later via the node?**  
  In v1 of the node, we recommend `isDraft: false`. Update endpoints will be exposed in a later version.

  **How do I post to multiple accounts at once?**  
  Create one `PostSchedule` with multiple `Publication` objects (one per account).

  **How do I set YouTube or TikTok titles?**  
  Titles live in **`platformSettings`** (see schemas above). `content` becomes description.

  **Should I use webhooks or polling for status updates?**  
  Webhooks are recommended for production workflows as they provide real-time notifications without the need to repeatedly call status endpoints. Set up webhooks at [https://developers.post-pulse.com](https://developers.post-pulse.com) to receive instant notifications for post publishing status and media import progress. Use polling (Get Upload Status) only for testing or when webhooks aren't feasible.

  ---

  ## Support

  - **Developer Portal:** https://developers.post-pulse.com (for OAuth client setup and documentation)
  - **Discord Community:** [PostPulse for Developers](https://discord.gg/yrMdD4R5) (feature requests, community support)
  - **Email Support:** support@post-pulse.com (technical issues and general inquiries)

  ---

  ## Versioning & License

  - Semantic Versioning: `MAJOR.MINOR.PATCH`
  - License: MIT

  ---

  ### Security notes
  - Store secrets in **n8n Credentials** only; don’t hardcode in workflows.

ai_documentation_summary:
  {"purpose":"This n8n node enables users to schedule and publish content to multiple social media platforms (including Facebook, Instagram, TikTok, LinkedIn, etc.) by interacting with the PostPulse API.","capabilities":["OAuth2 authentication with automatic token refresh","Media upload from local files","Media import from public URLs","Media upload status monitoring","Multi-destination post scheduling","Telegram channel lookup","Facebook page lookup","Platform-specific field auto-detection"],"authentication":"OAuth2 (auto refresh)","commonUseCases":["One-click multi-platform content distribution","Automated social media campaigns","Media pipeline for scheduled posts","Cross-platform content management"],"limitations":["Advanced scheduling requires manual construction of platformSettings JSON for complex scenarios","Draft posts (isDraft: true) are not currently supported","Update endpoints for draft posts are not yet exposed in the node","Telegram integration requires adding the official PostPulse bot to target channels beforehand"],"relatedNodes":["n8n HTTP Request","n8n Binary File","n8n Webhook","n8n Code Node"]}


node_type: n8n-nodes-craft.craft
package_name: n8n-nodes-craft
display_name: Craft
description: Interact with your Craft documents via the API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: acrichter
author_github_url: https://github.com/ac40/
npm_package_name: n8n-nodes-craft
npm_version: 0.1.8
community_fetched_at: 2026-03-25T21:19:40.611Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "block",
      "options": [
        {
          "name": "Block",
          "value": "block"
        },
        {
          "name": "Collection",
          "value": "collection"
        },
        {
          "name": "Daily Note",
          "value": "dailyNote"
        },
        {
          "name": "Document",
          "value": "document"
        },
        {
          "name": "Folder",
          "value": "folder"
        },
        {
          "name": "Task",
          "value": "task"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Fetch Block",
          "value": "fetch",
          "action": "Fetch a block",
          "description": "Retrieve blocks and attached information"
        },
        {
          "name": "Insert Blocks",
          "value": "insert",
          "action": "Insert blocks",
          "description": "Create new blocks in a document"
        },
        {
          "name": "Upload File",
          "value": "upload",
          "action": "Upload a file",
          "description": "Insert files (binary content) into a document"
        },
        {
          "name": "Delete Blocks",
          "value": "delete",
          "action": "Delete blocks",
          "description": "Remove blocks from a document"
        },
        {
          "name": "Update Blocks",
          "value": "update",
          "action": "Update blocks",
          "description": "Modify blocks"
        },
        {
          "name": "Move Blocks",
          "value": "move",
          "action": "Move blocks",
          "description": "Reorder blocks in a document"
        },
        {
          "name": "Search Blocks",
          "value": "search",
          "action": "Search blocks",
          "description": "Search content"
        },
        {
          "name": "Construct Blocks",
          "value": "construct",
          "action": "Construct blocks",
          "description": "Construct blocks with validation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "block"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "Create Items",
          "value": "create",
          "action": "Create collection items",
          "description": "Insert new items into a collection"
        },
        {
          "name": "Delete Items",
          "value": "delete",
          "action": "Delete collection items",
          "description": "Remove items from a collection"
        },
        {
          "name": "Get Collection Schema",
          "value": "getSchema",
          "action": "Get collection schema",
          "description": "Retrieve a collection schema in the desired format"
        },
        {
          "name": "List Collections",
          "value": "listCollections",
          "action": "List collections",
          "description": "Retrieve available collections and their metadata"
        },
        {
          "name": "List Items",
          "value": "list",
          "action": "List collection items",
          "description": "Retrieve collection items"
        },
        {
          "name": "Update Items",
          "value": "update",
          "action": "Update collection items",
          "description": "Modify existing items in a collection"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "collection"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List Tasks",
          "value": "list",
          "action": "List tasks",
          "description": "Retrieve tasks filtered by scope"
        },
        {
          "name": "Create Task",
          "value": "create",
          "action": "Create a task",
          "description": "Create a new task in inbox or daily notes"
        },
        {
          "name": "Update Task",
          "value": "update",
          "action": "Update a task",
          "description": "Modify an existing task"
        },
        {
          "name": "Delete Tasks",
          "value": "delete",
          "action": "Delete tasks",
          "description": "Delete tasks by their IDs"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetch",
      "options": [
        {
          "name": "List Documents",
          "value": "fetch",
          "action": "Fetch documents",
          "description": "Retrieve available Craft documents"
        },
        {
          "name": "Search Documents",
          "value": "search",
          "action": "Search documents",
          "description": "Search across documents with include terms and optional filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search Daily Notes",
          "value": "search",
          "action": "Search daily notes",
          "description": "Search across daily notes with optional date range filters"
        },
        {
          "name": "Search Within Daily Note",
          "value": "searchBlocks",
          "action": "Search blocks in a daily note",
          "description": "Search for blocks within a specific daily note date"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dailyNote"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List Folders",
          "value": "list",
          "action": "List folders",
          "description": "Retrieve all folders and locations in the space"
        },
        {
          "name": "Create Folder",
          "value": "create",
          "action": "Create a folder",
          "description": "Create a new folder or location"
        },
        {
          "name": "Delete Folder",
          "value": "delete",
          "action": "Delete a folder",
          "description": "Delete a folder by its ID"
        },
        {
          "name": "Move Folder",
          "value": "move",
          "action": "Move a folder",
          "description": "Move a folder to a different location"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "folder"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Fetch Block",
      "value": "fetch",
      "action": "Fetch a block",
      "description": "Retrieve blocks and attached information"
    },
    {
      "name": "Insert Blocks",
      "value": "insert",
      "action": "Insert blocks",
      "description": "Create new blocks in a document"
    },
    {
      "name": "Upload File",
      "value": "upload",
      "action": "Upload a file",
      "description": "Insert files (binary content) into a document"
    },
    {
      "name": "Delete Blocks",
      "value": "delete",
      "action": "Delete blocks",
      "description": "Remove blocks from a document"
    },
    {
      "name": "Update Blocks",
      "value": "update",
      "action": "Update blocks",
      "description": "Modify blocks"
    },
    {
      "name": "Move Blocks",
      "value": "move",
      "action": "Move blocks",
      "description": "Reorder blocks in a document"
    },
    {
      "name": "Search Blocks",
      "value": "search",
      "action": "Search blocks",
      "description": "Search content"
    },
    {
      "name": "Construct Blocks",
      "value": "construct",
      "action": "Construct blocks",
      "description": "Construct blocks with validation"
    },
    {
      "name": "Create Items",
      "value": "create",
      "action": "Create collection items",
      "description": "Insert new items into a collection"
    },
    {
      "name": "Delete Items",
      "value": "delete",
      "action": "Delete collection items",
      "description": "Remove items from a collection"
    },
    {
      "name": "Get Collection Schema",
      "value": "getSchema",
      "action": "Get collection schema",
      "description": "Retrieve a collection schema in the desired format"
    },
    {
      "name": "List Collections",
      "value": "listCollections",
      "action": "List collections",
      "description": "Retrieve available collections and their metadata"
    },
    {
      "name": "List Items",
      "value": "list",
      "action": "List collection items",
      "description": "Retrieve collection items"
    },
    {
      "name": "Update Items",
      "value": "update",
      "action": "Update collection items",
      "description": "Modify existing items in a collection"
    },
    {
      "name": "List Tasks",
      "value": "list",
      "action": "List tasks",
      "description": "Retrieve tasks filtered by scope"
    },
    {
      "name": "Create Task",
      "value": "create",
      "action": "Create a task",
      "description": "Create a new task in inbox or daily notes"
    },
    {
      "name": "Update Task",
      "value": "update",
      "action": "Update a task",
      "description": "Modify an existing task"
    },
    {
      "name": "Delete Tasks",
      "value": "delete",
      "action": "Delete tasks",
      "description": "Delete tasks by their IDs"
    },
    {
      "name": "List Documents",
      "value": "fetch",
      "action": "Fetch documents",
      "description": "Retrieve available Craft documents"
    },
    {
      "name": "Search Documents",
      "value": "search",
      "action": "Search documents",
      "description": "Search across documents with include terms and optional filters"
    },
    {
      "name": "Search Daily Notes",
      "value": "search",
      "action": "Search daily notes",
      "description": "Search across daily notes with optional date range filters"
    },
    {
      "name": "Search Within Daily Note",
      "value": "searchBlocks",
      "action": "Search blocks in a daily note",
      "description": "Search for blocks within a specific daily note date"
    },
    {
      "name": "List Folders",
      "value": "list",
      "action": "List folders",
      "description": "Retrieve all folders and locations in the space"
    },
    {
      "name": "Create Folder",
      "value": "create",
      "action": "Create a folder",
      "description": "Create a new folder or location"
    },
    {
      "name": "Delete Folder",
      "value": "delete",
      "action": "Delete a folder",
      "description": "Delete a folder by its ID"
    },
    {
      "name": "Move Folder",
      "value": "move",
      "action": "Move a folder",
      "description": "Move a folder to a different location"
    }
  ]

npm_readme:
  <!-- Improved compatibility of back to top link: See: https://github.com/othneildrew/Best-README-Template/pull/73 -->

  <a id="readme-top"></a>

  # n8n-nodes-craft

  <!-- PROJECT LOGO -->

  [![Project Banner][project-banner]](./images/banner.png)
  <br />

  <div align="center">
    <p align="center">
      The Bridge you where looking for between two awesome tools
      <br />
      <a href="./CONTRIBUTING.md"><strong>Want to contribute? »</strong></a>
      <br />
      <br />
      <a href="https://github.com/ac40/n8n-nodes-craft/issues/new?labels=bug&template=bug-report.md">Report Bug</a>
      &middot;
      <a href="https://github.com/ac40/n8n-nodes-craft/issues/new?labels=enhancement&template=feature-request.md">Request Feature</a>
    </p>
  </div>

  <!-- TABLE OF CONTENTS -->
  <details>
    <summary>Table of Contents</summary>
    <ol>
      <li><a href="#about-the-project">About The Project</a></li>
      <li><a href="#installation">Installation</a></li>
      <li>
        <a href="#operations">Operations</a>
        <ul>
          <li><a href="#blocks">Blocks</a></li>
          <li><a href="#collections">Collections</a></li>
          <li><a href="#tasks">Tasks</a></li>
          <li><a href="#documents">Documents</a></li>
          <li><a href="#daily-notes">Daily Notes</a></li>
        </ul>
      </li>
      <li><a href="#credentials">Credentials</a></li>
      <li><a href="#compatibility">Compatibility</a></li>
      <li><a href="#resources">Resources</a></li>
      <li><a href="#version-history">Version history</a></li>
    </ol>
  </details>

  <!-- ABOUT THE PROJECT -->

  ## About The Project

  This is an n8n community node. It lets you use [Craft](https://craft.do) Docs in your n8n workflows.

  [Craft](https://craft.do) is an app that helps you _craft_ the best Docs in the world (that's their claim, and it is absolutely true!).

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

  ## Installation

  ### Community Node (soon to be released)

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

  > This node is not published as a community node yet, currently only the self-installation is available

  ### Private Node

  To run this node as a private node, follow [this](https://docs.n8n.io/integrations/creating-nodes/deploy/install-private-nodes/) guide by n8n. I also have a [prepared Dockerfile](https://github.com/AC40/custom-n8n-image) with a blank n8n installation + this craft node.

  Either run my custom image or build your own if you want to install additional private node.

  ## Operations

  The node now supports multiple Craft resources and their specific operations.

  ### Blocks

  - Fetch blocks to retrieve content and attachments
  - Insert blocks to add new content to a document
  - Upload files as binary content inside a block
  - Delete blocks from a document
  - Update blocks to change existing content
  - Move blocks to reorder content
  - Search blocks in a document
  - Construct blocks with validation before sending them to Craft

  ### Collections

  - List items with optional depth and format controls
  - Create items (including introducing new select options)
  - Update items while reusing or adding select options
  - Delete items in bulk

  ### Tasks

  - List tasks across inbox, upcoming, active, or logbook views
  - Create tasks in the inbox or a chosen daily note
  - Update tasks, including markdown, state, schedule, and deadline
  - Delete tasks by providing one or more IDs

  ### Documents

  - List available documents
  - Search across documents

  ### Daily Notes

  - Search daily notes with keyword and date filters
  - Search a single daily note

  ## Credentials

  If you want to interact with protected Documents, you will need to create a BearerAuth Credential for your respective Document with API Keys and document ids.

  ## Compatibility

  1.0 (Node.js 18)

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Some more information about this project](https://ac-rich.craft.me/n8n-nodes-craft)

  ## Version history

  N/A

  <!-- Images -->

  [project-banner]: ./images/banner.png

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows to interact with Craft CMS documents, blocks, collections, tasks, and daily notes via its API.","capabilities":["Fetch, insert, update, delete, and move blocks","Upload files as binary content inside blocks","List, create, update, and delete collection items","Manage tasks across inbox, upcoming, active, and logbook views","Search and list documents","Search daily notes with keyword and date filters"],"authentication":"API Key (BearerAuth Credential required for protected documents)","commonUseCases":["Automating content creation and updates in Craft CMS","Syncing tasks between n8n and Craft daily notes","Managing document metadata and block content programmatically"],"limitations":["Currently available only as a private node; not yet published as a community node","Requires manual installation via n8n private nodes or custom Docker images"],"relatedNodes":["n8n-nodes-craft.craft","n8n-nodes-craft.tasks","n8n-nodes-craft.collections","n8n-nodes-craft.documents"]}


node_type: n8n-nodes-htmlcsstoimage.htmlCssToImage
package_name: n8n-nodes-htmlcsstoimage
display_name: HTML to Image
description: Convert HTML/CSS or a URL to an Image
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: htmlcsstoimage
author_github_url: https://github.com/HtmlCssToImg/
npm_package_name: n8n-nodes-htmlcsstoimage
npm_version: 0.3.1
community_fetched_at: 2026-03-25T21:19:40.612Z
ai_summary_generated_at: 2026-03-25 22:47:20
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "htmlToImage",
      "options": [
        {
          "name": "HTML to Image",
          "value": "htmlToImage",
          "action": "Convert html to an image",
          "description": "Convert HTML and CSS to an image"
        },
        {
          "name": "URL to Image",
          "value": "urlToImage",
          "action": "Capture screenshot of a website",
          "description": "Capture a screenshot of a website"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "HTML to Image",
      "value": "htmlToImage",
      "action": "Convert html to an image",
      "description": "Convert HTML and CSS to an image"
    },
    {
      "name": "URL to Image",
      "value": "urlToImage",
      "action": "Capture screenshot of a website",
      "description": "Capture a screenshot of a website"
    }
  ]

npm_readme:
  # n8n-nodes-htmlcsstoimage

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

  htmlcsstoimg.com is a service that allows you to convert HTML and CSS into images and screenshots of websites.

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

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

  ## Installation

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

  ## Operations

  *   **HTML to Image**: Convert HTML and CSS to an image.
  *   **Capture Website Screenshot**: Capture a screenshot of a website from a URL.

  ## Credentials

  You will need to sign up for an account at [htmlcsstoimg.com](https://htmlcsstoimg.com/) to get an API key.

  ## Compatibility

  This node is tested against n8n version 1.0.0 and above.

  ## Resources

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

ai_documentation_summary:
  {"purpose":"Converts HTML/CSS code or website URLs into image files using the htmlcsstoimg.com service.","capabilities":["Convert HTML and CSS to an image","Capture a screenshot of a website from a URL","Customize rendering via HTML/CSS input","Generate images from live web pages"],"authentication":"API key required (obtained from htmlcsstoimg.com account)","commonUseCases":["Generating product mockups from HTML designs","Creating website screenshots for documentation","Converting code snippets to visual previews","Automating social media image generation from web content"],"limitations":["Dependent on external service (htmlcsstoimg.com) availability and rate limits","Requires external account setup and API key management","May have rendering constraints based on the third-party service's capabilities"],"relatedNodes":["HTTP Request","Code","Image Output"]}


node_type: n8n-nodes-apex.apex
package_name: n8n-nodes-apex
display_name: Apex
description: Manage your social media via Apex.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: xonack
author_github_url: https://github.com/xonack/
npm_package_name: n8n-nodes-apex
npm_version: 0.1.6
community_fetched_at: 2026-03-25T21:19:40.612Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "getTweet",
      "options": [
        {
          "name": "Generate Reply",
          "value": "generateReply"
        },
        {
          "name": "Get Tweet",
          "value": "getTweet"
        },
        {
          "name": "Post Reply",
          "value": "postReply"
        },
        {
          "name": "Post Tweet",
          "value": "postTweet"
        },
        {
          "name": "Search Tweet",
          "value": "searchTweets"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTweetById",
      "options": [
        {
          "name": "Get Tweet by ID",
          "value": "getTweetById",
          "action": "Get tweet by id",
          "routing": {
            "request": {
              "url": "=/apex/tweet/{{$parameter[\"tweetId\"]}}/details",
              "method": "GET"
            }
          },
          "description": "Get tweet by ID (found in the URL)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "getTweet"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "postTweet",
      "options": [
        {
          "name": "Tweet",
          "value": "postTweet",
          "action": "Post tweet",
          "routing": {
            "request": {
              "url": "=/apex/tweet",
              "method": "POST"
            }
          },
          "description": "Post tweet to your profile"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "postTweet"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "postReply",
      "options": [
        {
          "name": "Post Reply",
          "value": "postReply",
          "action": "Post reply to tweet",
          "routing": {
            "request": {
              "url": "=/apex/tweet/{{$parameter[\"tweetId\"]}}/reply",
              "method": "POST"
            }
          },
          "description": "Post reply to tweet (by ID)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "postReply"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateReplyToTweetId",
      "options": [
        {
          "name": "Generate Reply to Tweet",
          "value": "generateReplyToTweetId",
          "action": "Generate reply to tweet id",
          "routing": {
            "request": {
              "url": "=/apex/tweet/{{$parameter[\"tweetId\"]}}/reply",
              "method": "GET"
            }
          },
          "description": "Generate reply to tweet ID"
        },
        {
          "name": "Generate Reply to Text",
          "value": "generateReplyToText",
          "action": "Generate reply to text string",
          "routing": {
            "request": {
              "url": "=/apex/reply",
              "method": "GET"
            }
          },
          "description": "Generate reply to text string"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "generateReply"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "searchTweets",
      "options": [
        {
          "name": "Search Tweets",
          "value": "searchTweets",
          "action": "Search tweets",
          "routing": {
            "request": {
              "url": "=/apex/tweet/search",
              "method": "GET"
            }
          },
          "description": "Search tweet based keywords (& filters)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "searchTweets"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Tweet by ID",
      "value": "getTweetById",
      "action": "Get tweet by id",
      "routing": {
        "request": {
          "url": "=/apex/tweet/{{$parameter[\"tweetId\"]}}/details",
          "method": "GET"
        }
      },
      "description": "Get tweet by ID (found in the URL)"
    },
    {
      "name": "Tweet",
      "value": "postTweet",
      "action": "Post tweet",
      "routing": {
        "request": {
          "url": "=/apex/tweet",
          "method": "POST"
        }
      },
      "description": "Post tweet to your profile"
    },
    {
      "name": "Post Reply",
      "value": "postReply",
      "action": "Post reply to tweet",
      "routing": {
        "request": {
          "url": "=/apex/tweet/{{$parameter[\"tweetId\"]}}/reply",
          "method": "POST"
        }
      },
      "description": "Post reply to tweet (by ID)"
    },
    {
      "name": "Generate Reply to Tweet",
      "value": "generateReplyToTweetId",
      "action": "Generate reply to tweet id",
      "routing": {
        "request": {
          "url": "=/apex/tweet/{{$parameter[\"tweetId\"]}}/reply",
          "method": "GET"
        }
      },
      "description": "Generate reply to tweet ID"
    },
    {
      "name": "Generate Reply to Text",
      "value": "generateReplyToText",
      "action": "Generate reply to text string",
      "routing": {
        "request": {
          "url": "=/apex/reply",
          "method": "GET"
        }
      },
      "description": "Generate reply to text string"
    },
    {
      "name": "Search Tweets",
      "value": "searchTweets",
      "action": "Search tweets",
      "routing": {
        "request": {
          "url": "=/apex/tweet/search",
          "method": "GET"
        }
      },
      "description": "Search tweet based keywords (& filters)"
    }
  ]

npm_readme:
  # n8n-nodes-apex

  Apex provides social media infrastructure that lets you manage your X (Twitter) account fully with a single API Key.

  * Get unlimited data
  * Generate quality content
  * Post bangers

  This is an n8n community node for Apex, allowing you to manage X (Twitter) in your n8n workflows.

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

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

  ## Installation

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

  ## Operations

  This node supports the following operations for X (Twitter):
  *   Get Tweet
  *   Search Tweets
  *   Generate Reply
  *   Post Tweet
  *   Post Reply

  ## Credentials

  To use this node, you need to authenticate with Apex.
  1.  Create an account at [Apex](https://apexagents.ai/).
  2.  Request an API Key from within your Apex account (support chat on bottom right).
  3.  Use this API Key in the Apex credentials configuration in n8n.

  ## Compatibility

  This node was built against n8n version `1.82.0` and should be compatible with n8n running Node.js version 20 or higher.

  ## Resources

  * [Apex API](https://apex-backend-435707161213.us-west1.run.app/)
  * [Apex Homepage](https://apexagents.ai/)
  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

  ## License

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

ai_documentation_summary:
  {"purpose":"This n8n community node enables full management of X (Twitter) accounts by integrating with the Apex API for content generation, posting, and data retrieval.","capabilities":["Get Tweet","Search Tweets","Generate Reply","Post Tweet","Post Reply"],"authentication":"API Key required","commonUseCases":["Automated social media posting","Generating Twitter replies","Monitoring and retrieving tweet data","Content generation for X (Twitter)"],"limitations":["Requires external API key from Apex service","Requires n8n version 1.82.0 or higher","Requires Node.js version 20 or higher"],"relatedNodes":["n8n-nodes-twitter","n8n-nodes-http-request"]}


node_type: @globalping/n8n-nodes-globalping.globalping
package_name: @globalping/n8n-nodes-globalping
display_name: Globalping
description: Consume the Globalping API
category: Development
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: jimaek
author_github_url: https://github.com/jsdelivr/n8n-nodes-globalping.git
npm_package_name: @globalping/n8n-nodes-globalping
npm_version: 1.0.5
community_fetched_at: 2026-03-25T21:19:40.613Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "measurements",
      "options": [
        {
          "name": "Measurement",
          "value": "measurements"
        },
        {
          "name": "Probe",
          "value": "probes"
        },
        {
          "name": "Limit",
          "value": "limits"
        },
        {
          "name": "Custom API Call",
          "value": "__CUSTOM_API_CALL__"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "Returns a list of all probes currently online and their metadata such as location and assigned tags for advanced use cases"
        },
        {
          "name": "Custom API Call",
          "value": "__CUSTOM_API_CALL__"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "probes"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "Returns rate limits for the current user if authenticated or IP address if not authenticated"
        },
        {
          "name": "Custom API Call",
          "value": "__CUSTOM_API_CALL__"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "limits"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "",
      "options": [
        {
          "name": "Ping",
          "value": "measurementPing",
          "action": "PING. Raw output, latency data, max 16 packets."
        },
        {
          "name": "Traceroute",
          "value": "measurementTraceroute",
          "action": "Traceroute. Raw output, latency data, all protocols and ports."
        },
        {
          "name": "DNS",
          "value": "measurementDns",
          "action": "DNS resolve. All types, latency data and optional tracing."
        },
        {
          "name": "MTR",
          "value": "measurementMtr",
          "action": "MTR trace. Raw output, latency data, all protocols."
        },
        {
          "name": "HTTP",
          "value": "measurementHttp",
          "action": "HTTP Request. GET or HEAD, raw output, latency and TLS data. Limited to 10kb."
        },
        {
          "name": "Custom API Call",
          "value": "__CUSTOM_API_CALL__"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "measurements"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "List",
      "value": "list",
      "action": "Returns a list of all probes currently online and their metadata such as location and assigned tags for advanced use cases"
    },
    {
      "name": "Custom API Call",
      "value": "__CUSTOM_API_CALL__"
    },
    {
      "name": "List",
      "value": "list",
      "action": "Returns rate limits for the current user if authenticated or IP address if not authenticated"
    },
    {
      "name": "Custom API Call",
      "value": "__CUSTOM_API_CALL__"
    },
    {
      "name": "Ping",
      "value": "measurementPing",
      "action": "PING. Raw output, latency data, max 16 packets."
    },
    {
      "name": "Traceroute",
      "value": "measurementTraceroute",
      "action": "Traceroute. Raw output, latency data, all protocols and ports."
    },
    {
      "name": "DNS",
      "value": "measurementDns",
      "action": "DNS resolve. All types, latency data and optional tracing."
    },
    {
      "name": "MTR",
      "value": "measurementMtr",
      "action": "MTR trace. Raw output, latency data, all protocols."
    },
    {
      "name": "HTTP",
      "value": "measurementHttp",
      "action": "HTTP Request. GET or HEAD, raw output, latency and TLS data. Limited to 10kb."
    },
    {
      "name": "Custom API Call",
      "value": "__CUSTOM_API_CALL__"
    }
  ]

npm_readme:
  # @globalping/n8n-nodes-globalping
  This is an n8n community node. It lets you use [Globalping](https://globalping.io/) in your n8n workflows.

  The Globalping node allows you to perform network measurements such as `ping`, `traceroute`, `mtr`, `http` and `DNS` lookups from a specified location. 
  You can use this node to test network connections, do latency checks or troubleshoot connectivity issues from various regions.

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

  ## Installation

  1. Go to n8n Settings in bottom left
  2. Select "Community nodes"
  3. Enter `@globalping/n8n-nodes-globalping` and install

  <img width="673" alt="n8n globalping" src="https://github.com/user-attachments/assets/1772ec9d-e5a5-47f8-983f-31e8f33a9c9a">


  ## Operations

  - All measurements support both IPv4 and IPv6 endpoints, as long as you manually enable it per measurement.
  - The location field is smart enough to accept many different types of inputs. [Learn more about the magic location field](https://github.com/jsdelivr/globalping?tab=readme-ov-file#test-with-magic-).
  - While the Globalping network is large and is constantly expanding we can't guarantee a probe in every single location. [Explore our online probes on our website](https://globalping.io/network)

   	### Measurements:
   	- `Ping` - Ping an endpoint using ICMP. Default 3 packets.
   	- `Traceroute` - Traceroute an endpoint using ICMP, TCP or UDP on any port. 
   	- `DNS` - Resolve a DNS record of any type. By default the local resolver is used but a different one can be provided. For troubleshooting purposes the `trace` function can be enabled.
   	- `MTR` - MTR an endpoint using ICMP, TCP or UDP on any port. 
   	- `HTTP` - Make an HTTP GET or HEAD request to any URL. Responses are limited to first 10kb. Note that the `Host` and `User-Agent` headers are reserved and internally overridden.

  	 ### Probes:
   	- `List` - returns a list of all probes currently online and their metadata such as location and assigned tags.

  	 ### Limits:
   	- `List` - returns rate limits for the current user if authenticated or IP address if not authenticated.

  ## Credentials

  Globalping is free to use, and doesn't require authentication. However, it implements rate limits to ensure fair usage and reliability. 
  Sign up on the [Globalping Dashboard](https://dash.globalping.io/) to enjoy higher limits. [Learn more about limits](https://globalping.io/credits).

  To take advantage of the higher limits you need to generate a token in the dashboard and store it in n8n by setting ```Access token``` in ```Credentials``` of your workflow.

  ## Usage

   Create a workflow and add Globalping node with operation you need. Make sure to enable "Authentication" in each step if you have provided your token and want to use it.

   <img width="1920" alt="globalping n8n usage" src="https://github.com/user-attachments/assets/09021705-4e78-4973-866d-92291b659fd4">

ai_documentation_summary:
  {"purpose":"A community n8n node that enables network measurements and connectivity testing from various global locations.","capabilities":["Ping endpoints using ICMP","Traceroute using ICMP, TCP, or UDP","DNS resolution for any record type","MTR (My Traceroute) analysis","HTTP GET and HEAD requests","List available probes and their metadata","Retrieve rate limit information","Support for both IPv4 and IPv6 endpoints"],"authentication":"Optional - Free tier available without authentication; Access token required for higher rate limits","commonUseCases":["Testing network connectivity from specific geographic regions","Measuring latency between locations","Troubleshooting DNS resolution issues","Verifying HTTP endpoint availability","Monitoring global network performance"],"limitations":["Probe availability not guaranteed in every location","HTTP responses limited to first 10kb","Host and User-Agent headers are reserved and overridden","Rate limits apply to free tier users"],"relatedNodes":["HTTP Request","DNS Lookup","Ping","Traceroute","MTR"]}


node_type: n8n-nodes-oneform.oneformTrigger
package_name: n8n-nodes-oneform
display_name: Oneform Trigger
description: Triggers the workflow when a oneform form is submitted
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: damaso.jm
author_github_url: https://github.com/oneformhq/
npm_package_name: n8n-nodes-oneform
npm_version: 1.0.2
community_fetched_at: 2026-03-25T21:19:40.614Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n trigger for oneform submissions

  This is an n8n community node that lets you trigger n8n workflows when your **oneform** form receives a new submission.

  ## Installation

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

  ## Usage

  1. Generate an API key at: [https://app.oneform.one/settings/api_keys](https://app.oneform.one/settings/api_keys)
  2. Add the **oneform Trigger** to your workflow.
  3. Create a credential for the **oneform Trigger** using your API key.
  4. Choose the form you want to use to trigger workflows when a submission is received.


  ## Developers

  For instructions on testing this node on a local n8n instance for development purposes, see https://docs.n8n.io/integrations/creating-nodes/test/run-node-locally/

ai_documentation_summary:
  {"purpose":"Triggers an n8n workflow automatically when a new submission is received from a Oneform form.","capabilities":["Monitors Oneform forms for new submissions","Activates workflows upon form submission events","Configurable form selection for triggering"],"authentication":"API key required","commonUseCases":["Automate responses to form submissions","Integrate form data into other workflows or services","Send notifications or emails based on form input"],"limitations":[],"relatedNodes":["n8n-nodes-oneform.oneformWebhook","n8n-nodes-oneform.oneformForm","n8n-nodes-oneform.oneformSubmit"]}


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

updated_at: 2026-03-25 21:19:40
author_name: gsharp-assemblyai
author_github_url: https://github.com/gsharp-aai/
npm_package_name: n8n-nodes-assemblyai
npm_version: 0.2.0
community_fetched_at: 2026-03-25T21:19:40.614Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Transcribe audio and video files using AssemblyAI's speech-to-text and speech understanding AI models.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "transcript",
      "options": [
        {
          "name": "File",
          "value": "file"
        },
        {
          "name": "LeMUR (Deprecated)",
          "value": "lemur",
          "description": "LeMUR is deprecated. Please use LLM Gateway instead."
        },
        {
          "name": "LLM Gateway",
          "value": "llm_gateway"
        },
        {
          "name": "Transcript",
          "value": "transcript"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload a file",
          "description": "Upload a media file to AssemblyAI"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a transcription",
          "description": "Create a new transcription"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a transcription",
          "description": "Delete a transcription"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a transcription",
          "description": "Get a transcription by ID"
        },
        {
          "name": "Get Paragraphs",
          "value": "getParagraphs",
          "action": "Get paragraphs",
          "description": "Get paragraphs from transcription"
        },
        {
          "name": "Get Redacted Audio",
          "value": "getRedactedAudio",
          "action": "Get redacted audio",
          "description": "Get redacted audio URL"
        },
        {
          "name": "Get Sentences",
          "value": "getSentences",
          "action": "Get sentences",
          "description": "Get sentences from transcription"
        },
        {
          "name": "Get Subtitles",
          "value": "getSubtitles",
          "action": "Get subtitles",
          "description": "Get subtitles for a transcription"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List transcriptions",
          "description": "List all transcriptions"
        },
        {
          "name": "Word Search",
          "value": "wordSearch",
          "action": "Search words",
          "description": "Search for words in transcript"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transcript"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "summary",
      "options": [
        {
          "name": "Custom Task",
          "value": "task",
          "action": "Run custom task",
          "description": "Run a custom LeMUR task"
        },
        {
          "name": "Get Response",
          "value": "getResponse",
          "action": "Get LeMUR response",
          "description": "Get a LeMUR response by ID"
        },
        {
          "name": "Purge Data",
          "value": "purgeData",
          "action": "Purge LeMUR data",
          "description": "Delete LeMUR request data"
        },
        {
          "name": "Question & Answer",
          "value": "questionAnswer",
          "action": "Question and answer",
          "description": "Ask questions about your transcript"
        },
        {
          "name": "Summary",
          "value": "summary",
          "action": "Generate summary",
          "description": "Generate a summary using LeMUR"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "lemur"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "chatCompletion",
      "options": [
        {
          "name": "Chat Completion",
          "value": "chatCompletion",
          "action": "Chat completion",
          "description": "Send chat completion request to LLM"
        },
        {
          "name": "Speech Understanding",
          "value": "speechUnderstanding",
          "action": "Speech understanding",
          "description": "Process speech understanding task on existing transcript"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "llm_gateway"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload a file",
      "description": "Upload a media file to AssemblyAI"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a transcription",
      "description": "Create a new transcription"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a transcription",
      "description": "Delete a transcription"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a transcription",
      "description": "Get a transcription by ID"
    },
    {
      "name": "Get Paragraphs",
      "value": "getParagraphs",
      "action": "Get paragraphs",
      "description": "Get paragraphs from transcription"
    },
    {
      "name": "Get Redacted Audio",
      "value": "getRedactedAudio",
      "action": "Get redacted audio",
      "description": "Get redacted audio URL"
    },
    {
      "name": "Get Sentences",
      "value": "getSentences",
      "action": "Get sentences",
      "description": "Get sentences from transcription"
    },
    {
      "name": "Get Subtitles",
      "value": "getSubtitles",
      "action": "Get subtitles",
      "description": "Get subtitles for a transcription"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List transcriptions",
      "description": "List all transcriptions"
    },
    {
      "name": "Word Search",
      "value": "wordSearch",
      "action": "Search words",
      "description": "Search for words in transcript"
    },
    {
      "name": "Custom Task",
      "value": "task",
      "action": "Run custom task",
      "description": "Run a custom LeMUR task"
    },
    {
      "name": "Get Response",
      "value": "getResponse",
      "action": "Get LeMUR response",
      "description": "Get a LeMUR response by ID"
    },
    {
      "name": "Purge Data",
      "value": "purgeData",
      "action": "Purge LeMUR data",
      "description": "Delete LeMUR request data"
    },
    {
      "name": "Question & Answer",
      "value": "questionAnswer",
      "action": "Question and answer",
      "description": "Ask questions about your transcript"
    },
    {
      "name": "Summary",
      "value": "summary",
      "action": "Generate summary",
      "description": "Generate a summary using LeMUR"
    },
    {
      "name": "Chat Completion",
      "value": "chatCompletion",
      "action": "Chat completion",
      "description": "Send chat completion request to LLM"
    },
    {
      "name": "Speech Understanding",
      "value": "speechUnderstanding",
      "action": "Speech understanding",
      "description": "Process speech understanding task on existing transcript"
    }
  ]

npm_readme:
  # n8n-nodes-assemblyai
  <p align="center">
    <picture>
      <source media="(prefers-color-scheme: dark)" srcset="./images/AAI_Dark_Mode.svg">
      <source media="(prefers-color-scheme: light)" srcset="./images/AAI_Light_Mode.svg">
      <img src="./images/AAI_Light_Mode.svg" alt="AssemblyAI Logo">
    </picture>
  </p>
  <div align="center">

  [![npm version](https://badge.fury.io/js/n8n-nodes-assemblyai.svg)](https://www.npmjs.com/package/n8n-nodes-assemblyai)
  [![npm downloads](https://img.shields.io/npm/dm/n8n-nodes-assemblyai.svg)](https://www.npmjs.com/package/n8n-nodes-assemblyai)

  </div>

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

  [AssemblyAI](https://www.assemblyai.com/) develops industry-leading Speech AI models for transcription and audio understanding, accessible through their API. It provides features like speaker diarization, sentiment analysis, entity detection, PII redaction, and LLM Gateway capabilities for processing transcripts with AI.

  ## Resources
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [AssemblyAI API reference](https://www.assemblyai.com/docs/api-reference)
  - [AssemblyAI API documentation](https://www.assemblyai.com/docs)
    - [AssemblyAI Speech-to-Text guide](https://www.assemblyai.com/docs/getting-started/transcribe-an-audio-file)
    - [AssemblyAI LLM Gateway guide](https://www.assemblyai.com/docs/llm-gateway/apply-llms-to-audio-files)
    - [AssemblyAI LeMUR guide](https://www.assemblyai.com/docs/lemur) - ⚠️ **Deprecated**: LeMUR is deprecated. Please use LLM Gateway instead.

  ## Quick links
  - [Installation](#installation)
  - [Credentials](#credentials)
  - [Operations](#operations)
  - [Development](#development)
  - [Support & Feedback](#support--feedback)

  ## Installation

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

  ## Credentials

  To use this node, you need an AssemblyAI API key.

  ### Prerequisites

  1. Sign up for a free account at [AssemblyAI](https://www.assemblyai.com/) and receive $50 in free credits.
  2. Navigate to your [API Keys page](https://www.assemblyai.com/dashboard/api-keys) in the dashboard.

  ### Setup in n8n

  1. In n8n, go to **Credentials** → **New**
  2. Search for **AssemblyAI API** and select it
  3. Enter your API key from the AssemblyAI dashboard
  4. Click **Save**

  Learn more about API keys in the [AssemblyAI documentation](https://www.assemblyai.com/docs/deployment/account-management#api-keys).

  ## Operations

  ### File ([API Reference](https://www.assemblyai.com/docs/api-reference/files/upload))

  - **Upload**: Upload a media file to AssemblyAI for transcription

  ### Transcript ([API Reference](https://www.assemblyai.com/docs/api-reference/transcripts/submit))

  - **Create**: Start a new transcription job with support for:
    - Language detection
    - Speaker diarization
    - PII redaction and profanity filtering
    - **Speech Understanding**:
      - Enable translation, speaker identification, and/or custom formatting during transcription
      - Keyterm prompting, punctuation, disfluencies, formatting, sentiment analysis, entity detection, chapterization, etc.
  - **Get**: Retrieve a transcription by ID
  - **Delete**: Delete a transcription
  - **List**: List all your transcriptions
  - **Get Sentences**: Get transcript broken into sentences
  - **Get Paragraphs**: Get transcript broken into paragraphs
  - **Get Subtitles**: Export subtitles in SRT or VTT format
  - **Get Redacted Audio**: Get redacted audio URL
  - **Word Search**: Search for specific words in the transcript

  ### LLM Gateway ([API Reference](https://www.assemblyai.com/docs/api-reference/llm-gateway/create-chat-completion))

  - **Chat Completion**: Send chat completion requests to LLMs (Claude, GPT, Gemini models). See [available models](https://www.assemblyai.com/docs/llm-gateway/overview#available-models).
  - **Speech Understanding**: Process speech understanding tasks on existing transcripts:
    - **Translation**: Translate transcripts into multiple languages
    - **Speaker Identification**: Identify speakers by name or role
    - **Custom Formatting**: Apply custom formatting to dates, phone numbers, and emails

  ### LeMUR

  ⚠️ **Deprecated**: LeMUR is deprecated. Please use LLM Gateway instead.

  - **Summary**: Generate AI summaries of transcripts
  - **Question & Answer**: Ask questions about your transcripts
  - **Custom Task**: Run custom AI tasks on transcripts
  - **Get Response**: Retrieve a LeMUR response by ID
  - **Purge Data**: Delete LeMUR request data

  ## Development

  To work on this node locally, clone the repository and install dependencies:

  ```bash
  git clone https://github.com/gsharp-aai/n8n-nodes-assemblyai.git
  cd n8n-nodes-assemblyai
  npm install
  ```

  Build and run with linting:

  ```bash
  npm run dev:fresh
  ```

  The node will be available in n8n at http://localhost:5678

  ## Support & Feedback

  Need help or have feedback? Reach out to [support@assemblyai.com](mailto:support@assemblyai.com).

  Stay up to date with the latest features and improvements:
  - [AssemblyAI Product Changelog](https://www.assemblyai.com/changelog)
  - [AssemblyAI Product Roadmap](https://assemblyai.com/roadmap)

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

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Transcribes audio and video files using AssemblyAI's speech-to-text models and provides AI-powered speech understanding features like translation, speaker identification, and entity detection.","capabilities":["Upload media files for transcription","Create transcription jobs with language detection","Enable speaker diarization","Perform PII redaction and profanity filtering","Translate transcripts to multiple languages","Identify speakers by name or role","Detect entities and sentiment analysis","Generate subtitles in SRT or VTT format","Search for specific words in transcripts","Apply custom formatting to dates, phone numbers, and emails"],"authentication":"API key required (AssemblyAI API key)","commonUseCases":["Automated meeting transcription","Video content analysis and summarization","Automated subtitle generation","Speaker identification in audio files","PII redaction for privacy compliance"],"limitations":["LeMUR feature is deprecated and should be replaced with LLM Gateway","Requires AssemblyAI account and API key setup"],"relatedNodes":["n8n-nodes-assemblyai.assemblyAi","n8n-nodes-assemblyai.transcript","n8n-nodes-assemblyai.llmGateway","n8n-nodes-assemblyai.lemur"]}


node_type: n8n-nodes-aiscraper.aiScraper
package_name: n8n-nodes-aiscraper
display_name: AI Scraper
description: Scrape any Website with just a URL and Data Description using Parsera API (10K+ downloads)
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: raznem
author_github_url: https://github.com/parsera-labs/n8n-parsera.git
npm_package_name: n8n-nodes-aiscraper
npm_version: 0.2.1
community_fetched_at: 2026-03-25T21:19:40.615Z
ai_summary_generated_at: 2026-03-25 22:47:20
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "new-scraper",
      "options": [
        {
          "name": "New Scraper",
          "value": "new-scraper"
        },
        {
          "name": "Existing Scraper",
          "value": "existing-scraper"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "scrapeUrl",
      "options": [
        {
          "name": "Scrape URL",
          "value": "scrapeUrl",
          "action": "Scrape URL",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/extract",
              "body": {
                "url": "={{$parameter[\"url\"]}}",
                "mode": "={{$parameter[\"mode\"]}}",
                "proxy_country": "={{$parameter[\"proxyCountry\"]}}"
              },
              "method": "POST"
            }
          },
          "description": "Provide URL and Data Description"
        },
        {
          "name": "Parse HTML",
          "value": "parseHtml",
          "action": "Parse HTML",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/parse",
              "body": {
                "mode": "={{$parameter[\"mode\"]}}",
                "content": "={{$parameter[\"content\"]}}"
              },
              "method": "POST"
            }
          },
          "description": "Provide HTML content and Data Description"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "new-scraper"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "runScraper",
      "options": [
        {
          "name": "Existing Scraper",
          "value": "runScraper",
          "action": "Scraper made in parsera org with advanced features",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/scrapers/run",
              "body": {
                "url": "={{$parameter[\"url\"] || undefined}}",
                "name": "={{$parameter[\"existingScraperName\"]}}",
                "proxy_country": "={{$parameter[\"proxyCountry\"]}}"
              },
              "method": "POST",
              "baseURL": "https://api.parsera.org/v1"
            }
          },
          "description": "Scraper made in parsera.org with advanced features, such as scraping code generation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "existing-scraper"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Scrape URL",
      "value": "scrapeUrl",
      "action": "Scrape URL",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/extract",
          "body": {
            "url": "={{$parameter[\"url\"]}}",
            "mode": "={{$parameter[\"mode\"]}}",
            "proxy_country": "={{$parameter[\"proxyCountry\"]}}"
          },
          "method": "POST"
        }
      },
      "description": "Provide URL and Data Description"
    },
    {
      "name": "Parse HTML",
      "value": "parseHtml",
      "action": "Parse HTML",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/parse",
          "body": {
            "mode": "={{$parameter[\"mode\"]}}",
            "content": "={{$parameter[\"content\"]}}"
          },
          "method": "POST"
        }
      },
      "description": "Provide HTML content and Data Description"
    },
    {
      "name": "Existing Scraper",
      "value": "runScraper",
      "action": "Scraper made in parsera org with advanced features",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/scrapers/run",
          "body": {
            "url": "={{$parameter[\"url\"] || undefined}}",
            "name": "={{$parameter[\"existingScraperName\"]}}",
            "proxy_country": "={{$parameter[\"proxyCountry\"]}}"
          },
          "method": "POST",
          "baseURL": "https://api.parsera.org/v1"
        }
      },
      "description": "Scraper made in parsera.org with advanced features, such as scraping code generation"
    }
  ]

npm_readme:
  # n8n-nodes-aiscraper

  This is an n8n community node. It lets you use the Parsera AI Scraper API in your n8n workflows.

  ## Quickstart
  [![Quickstart Video](https://img.youtube.com/vi/VUzKFRuqvGM/0.jpg)](https://www.youtube.com/watch?v=VUzKFRuqvGM)

  Parsera AI Scraper is a service that uses AI to extract structured data from web pages, either by providing a URL or raw HTML content. It simplifies web scraping by allowing users to define data fields through natural language descriptions or by using pre-configured scraping agents.

  [https://parsera.org](https://parsera.org)

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

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

  ## Installation

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

  ## Operations

  The Parsera AI Scraper node supports the following operations:

  *   **Extractor:**
      *   **Extract from URL:** Provide a URL, and Parsera will fetch the content and extract data based on your defined attributes. Supports proxy usage and sending cookies.
      *   **Parse HTML:** Provide raw HTML content, and Parsera will parse it to extract data based on your defined attributes.
  *   **Scraping Agent:**
      *   **Scraping Agent:** Utilize a pre-configured scraping agent on the Parsera platform to scrape a given URL. **Note:** The Parsera agent itself must be created separately via the [Parsera application](https://parsera.org) or Parsera API before it can be used by this n8n node operation. This operation uses a different base URL (`https://agents.parsera.org/v1`) and also supports proxy usage and sending cookies.

  ## Credentials

  To use this node, you need to create AI Scraper credentials within n8n. This requires an API Key from Parsera.

  1.  Sign up for an account at [https://parsera.org](https://parsera.org).
  2.  Once logged in, navigate to your API settings to find your API Key.
  3.  In n8n, create new credentials of type "AI Scraper API".
  4.  Enter the API Key obtained from Parsera into the API Key field in the n8n credential configuration.

  ## Compatibility

  *   **Minimum n8n Version:** While the node might work with earlier versions, it has been developed and tested primarily on **n8n version 1.19.3**.

  ## Usage

  This node allows you to extract structured data from websites.

  **Key Parameters:**

  *   **Resource:** Choose between "Extractor" (for direct URL/HTML extraction) and "Scraping Agent" (for using pre-configured Parsera agents).
  *   **Operation:** Select the specific action based on the chosen resource.
  *   **URL/Content:** Provide the target URL or raw HTML content, depending on the operation.
  *   **Prompt:** Provide context and general instructions to scraper.
  *   **Attributes Input Mode (for Extractor Resource):**
      *   **Fields:** Define attributes using a user-friendly interface with separate fields for Field Name, Type, and Field Description. This is the default and recommended for most UI-based configurations.
      *   **JSON:** Define attributes as a single JSON object. This mode is powerful for programmatic use, AI tool integration, or complex schemas. The expected format is `{"your_field_name": {"description": "What to extract", "type": "string"}}`.
  *   **Attributes (for Extractor Resource):** Depending on the selected input mode, you will either fill out individual fields or provide a JSON object. At least one attribute is required.
      *   **Field Name:** The key for the extracted data in the output (e.g., `productTitle`, `price`).
      *   **Type:** The expected data type (e.g., `string`, `integer`, `number`, `boolean`, `list`, `object`, `any`).
      *   **Field Description:** A natural language instruction telling the AI what data to look for (e.g., "The main title of the product page", "The discounted price of the item").
  *   **Mode (for Extractor Resource):**
      *   **Standard:** Balanced approach for speed and accuracy.
      *   **Precision:** Focuses on higher accuracy, potentially at the cost of speed or resources.
  *   **Proxy Country:** Optionally route your request through a proxy in a specific country to access geo-restricted content.
  *   **Cookies:** Optionally provide cookies as a JSON array to be sent with the request (e.g., for authenticated sessions). Format: `[{"name": "cookieName", "value": "cookieValue", "domain": ".example.com"}]`.
  *   **Agent Name (for Scraping Agent Resource):** The name of the pre-configured agent on the Parsera platform. This agent must have been created beforehand in your Parsera account.

  The output of the node will be a list of items containing the extracted data.

  For more detailed examples and advanced usage, refer to the [Parsera API documentation](https://docs.parsera.org/api/getting-started/).
  If you are new to n8n, you might find the [Try it out](https://docs.n8n.io/try-it-out/) documentation helpful to get started with the platform.

  ## Resources

  *   [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  *   [Parsera Website](https://parsera.org)
  *   [Parsera API Documentation](https://docs.parsera.org/api/getting-started/)

ai_documentation_summary:
  {"purpose":"This n8n community node enables automated web scraping by extracting structured data from websites using the Parsera AI Scraper API, supporting both direct URL/HTML parsing and pre-configured scraping agents.","capabilities":["Extract data from a URL using AI-based parsing","Parse raw HTML content to extract structured data","Utilize pre-configured scraping agents from the Parsera platform","Define extraction attributes via natural language descriptions or JSON schema","Support proxy usage for geo-restricted content access","Send custom cookies for authenticated sessions","Configure extraction mode (Standard or Precision) for speed vs. accuracy trade-offs"],"authentication":"API Key required (Parsera API Key)","commonUseCases":["Automated data collection from e-commerce product pages","Competitor price monitoring","Extracting structured data from dynamic web applications","Parsing HTML content from internal or external sources"],"limitations":["Requires separate creation of scraping agents via Parsera platform before use","Minimum tested n8n version is 1.19.3","Community node status may indicate less official support compared to official nodes"],"relatedNodes":["HTTP Request","Code","JSON"]}


node_type: n8n-nodes-zigpoll.zigpollTrigger
package_name: n8n-nodes-zigpoll
display_name: Zigpoll Trigger
description: Triggers when a specific Zigpoll survey is completed
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: zigpoll
author_github_url: https://github.com/JasonZigelbaum/
npm_package_name: n8n-nodes-zigpoll
npm_version: 0.1.9
community_fetched_at: 2026-03-25T21:19:40.615Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # n8n-nodes-zigpoll

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

  Zigpoll is a contextual survey platform that lets you understand what customers think & feel about your product by running highly targeted surveys inside and outside of your product at key moments.

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

  [Installation](#installation)  
  [Operations](#operations)  
  [Credentials](#credentials) <!-- delete if no auth needed -->  
  [Compatibility](#compatibility)  
  [Usage](#usage) <!-- delete if not using this section -->  
  [Resources](#resources)

  ## Installation

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

  ## Operations

  Run workflows on new responses you receive for your surveys.

  ## Credentials

  You only need a Zigpoll API Key for this. Please check out the [Zigpoll Docs](https://docs.zigpoll.com/integrations/n8n) for more information.

  ## Compatibility

  This package was developed & tested with n8n > 1.4.0.

  ## Usage

  Please check out the [Zigpoll Docs](https://docs.zigpoll.com/integrations/n8n) for more information on how to use the integration.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Zigpoll Docs](https://docs.zigpoll.com/integrations/n8n)

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows when a specific Zigpoll survey is completed, enabling automation based on customer survey responses.","capabilities":["Trigger workflow execution on new survey responses","Integrate with Zigpoll contextual survey platform","Enable targeted survey automation inside and outside of products"],"authentication":"API Key required","commonUseCases":["Automate responses to customer feedback surveys","Trigger follow-up actions based on survey results","Monitor product sentiment through contextual surveys"],"limitations":["Requires Zigpoll API Key configuration","Compatible only with n8n version 1.4.0 and above"],"relatedNodes":["Zigpoll Trigger","Zigpoll Webhook","Zigpoll HTTP Request"]}


node_type: n8n-nodes-exa-official.exa
package_name: n8n-nodes-exa-official
display_name: Exa
description: Semantic web search and research via Exa API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: exa-jakub
author_github_url: https://github.com/exa-labs/n8n-integration.git
npm_package_name: n8n-nodes-exa-official
npm_version: 0.3.1
community_fetched_at: 2026-03-25T21:19:40.616Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Answer",
          "value": "answer",
          "description": "Get an AI-generated answer to a query"
        },
        {
          "name": "Content",
          "value": "contents",
          "description": "Get contents from URLs"
        },
        {
          "name": "Find Similar",
          "value": "findSimilar",
          "description": "Find similar links to a given URL"
        },
        {
          "name": "Research",
          "value": "research",
          "description": "Create and manage asynchronous research tasks"
        },
        {
          "name": "Search",
          "value": "search",
          "description": "Search the web intelligently"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "search",
      "options": [
        {
          "name": "Search",
          "value": "search",
          "action": "Search the web",
          "routing": {
            "request": {
              "url": "/search",
              "method": "POST"
            }
          },
          "description": "Search the web and optionally extract contents"
        },
        {
          "name": "Deep Search",
          "value": "deepSearch",
          "action": "Deep search the web",
          "routing": {
            "request": {
              "url": "/search",
              "method": "POST"
            }
          },
          "description": "Run a deep or deep-reasoning search with synthesized output"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "search"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getContents",
      "options": [
        {
          "name": "Get Contents",
          "value": "getContents",
          "action": "Get contents from ur ls",
          "routing": {
            "request": {
              "url": "/contents",
              "method": "POST"
            }
          },
          "description": "Retrieve contents from a list of URLs"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contents"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "findSimilar",
      "options": [
        {
          "name": "Find Similar Links",
          "value": "findSimilar",
          "action": "Find similar links",
          "routing": {
            "request": {
              "url": "/findSimilar",
              "method": "POST"
            }
          },
          "description": "Find links similar to a given URL"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "findSimilar"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAnswer",
      "options": [
        {
          "name": "Get Answer",
          "value": "getAnswer",
          "action": "Get an AI answer",
          "routing": {
            "request": {
              "url": "/answer",
              "method": "POST"
            }
          },
          "description": "Get an AI-generated answer to a query"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "answer"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createTask",
      "options": [
        {
          "name": "Create Task",
          "value": "createTask",
          "action": "Create a research task",
          "routing": {
            "request": {
              "url": "/research/v1",
              "method": "POST"
            }
          },
          "description": "Create an asynchronous research task"
        },
        {
          "name": "Get Task",
          "value": "getTask",
          "action": "Get a research task",
          "routing": {
            "request": {
              "url": "=/research/v1/{{ $parameter.researchId }}",
              "method": "GET"
            }
          },
          "description": "Retrieve status and results of a research task"
        },
        {
          "name": "List Tasks",
          "value": "listTasks",
          "action": "List research tasks",
          "routing": {
            "request": {
              "url": "/research/v1",
              "method": "GET"
            }
          },
          "description": "Retrieve a paginated list of research tasks"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "research"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Search",
      "value": "search",
      "action": "Search the web",
      "routing": {
        "request": {
          "url": "/search",
          "method": "POST"
        }
      },
      "description": "Search the web and optionally extract contents"
    },
    {
      "name": "Deep Search",
      "value": "deepSearch",
      "action": "Deep search the web",
      "routing": {
        "request": {
          "url": "/search",
          "method": "POST"
        }
      },
      "description": "Run a deep or deep-reasoning search with synthesized output"
    },
    {
      "name": "Get Contents",
      "value": "getContents",
      "action": "Get contents from ur ls",
      "routing": {
        "request": {
          "url": "/contents",
          "method": "POST"
        }
      },
      "description": "Retrieve contents from a list of URLs"
    },
    {
      "name": "Find Similar Links",
      "value": "findSimilar",
      "action": "Find similar links",
      "routing": {
        "request": {
          "url": "/findSimilar",
          "method": "POST"
        }
      },
      "description": "Find links similar to a given URL"
    },
    {
      "name": "Get Answer",
      "value": "getAnswer",
      "action": "Get an AI answer",
      "routing": {
        "request": {
          "url": "/answer",
          "method": "POST"
        }
      },
      "description": "Get an AI-generated answer to a query"
    },
    {
      "name": "Create Task",
      "value": "createTask",
      "action": "Create a research task",
      "routing": {
        "request": {
          "url": "/research/v1",
          "method": "POST"
        }
      },
      "description": "Create an asynchronous research task"
    },
    {
      "name": "Get Task",
      "value": "getTask",
      "action": "Get a research task",
      "routing": {
        "request": {
          "url": "=/research/v1/{{ $parameter.researchId }}",
          "method": "GET"
        }
      },
      "description": "Retrieve status and results of a research task"
    },
    {
      "name": "List Tasks",
      "value": "listTasks",
      "action": "List research tasks",
      "routing": {
        "request": {
          "url": "/research/v1",
          "method": "GET"
        }
      },
      "description": "Retrieve a paginated list of research tasks"
    }
  ]

npm_readme:
  # n8n-nodes-exa-official

  This is an n8n community node that provides integration with the Exa API for intelligent web search, async research, and content extraction.

  [Exa](https://exa.ai) is an AI-powered search engine that provides embeddings-based semantic search, deep web research, and structured content extraction.

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

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

  ## Installation

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

  ## Operations

  This node supports the following Exa API operations:

  ### Search
  - **Search**: Intelligently search the web with neural or keyword-based search
    - Supports multiple search types: auto, neural, keyword, fast
    - Filter by domain, date, category, and text content
    - Extract page contents (text, highlights, summaries)
    - Configure livecrawl and subpage crawling

  ### Contents
  - **Get Contents**: Retrieve cleaned text, highlights, and summaries from a list of URLs

  ### Find Similar
  - **Find Similar Links**: Discover pages similar to a given URL

  ### Answer
  - **Get Answer**: Get an AI-generated answer to a query using Exa's research capabilities

  ### Research
  - **Create Research Task**: Launch a long-running research job powered by Exa Research or Research Pro
  - **Get Research Task**: Poll a specific research task for status, findings, and generated artifacts
  - **List Research Tasks**: Fetch paginated task history for monitoring and auditing

  ## Credentials

  To use this node, you need an Exa API key. You can obtain one by:

  1. Signing up at [dashboard.exa.ai](https://dashboard.exa.ai)
  2. Navigating to the API Keys section
  3. Creating a new API key

  Add the API key to your n8n credentials as "Exa API".

  ## Compatibility

  - Minimum n8n version: 1.0.0
  - Tested against n8n version: 1.60.0

  ## Usage

  ### Basic Search Example

  1. Add the Exa node to your workflow
  2. Select "Search" as the resource
  3. Enter your search query (e.g., "Latest AI research papers")
  4. Configure search type (auto, neural, keyword, or fast)
  5. Optionally add filters:
     - Category (research paper, news, company, etc.)
     - Date range (published date)
     - Domain filters (include/exclude specific domains)
     - Text filters (include/exclude specific text)

  ### Content Extraction

  Enable content extraction options:
  - **Text**: Get cleaned page text
  - **Highlights**: Get relevant excerpts
  - **Summary**: Get AI-generated summaries
  - **Livecrawl**: Crawl pages in real-time
  - **Subpages**: Crawl linked subpages

  ### Advanced Features

  **Date Filtering**: Filter results by publication date
  ```
  Start Published Date: 2024-01-01
  End Published Date: 2024-12-31
  ```

  **Domain Control**: Focus on or exclude specific domains
  ```
  Include Domains: arxiv.org, github.com
  Exclude Domains: reddit.com
  ```

  **Category Filtering**: Focus on specific content types
  - Company profiles
  - Research papers
  - News articles
  - PDFs
  - GitHub repositories
  - Twitter/LinkedIn profiles
  - Financial reports

  ### Research Workflow Example

  1. Add an Exa node and set **Resource** to `Research` with the **Create Research Task** operation.
  2. Provide a clear research instruction (for example, "Compare emerging open-source RAG frameworks and summarize trade-offs").
  3. Choose the Research product tier (`exa-research` or `exa-research-pro`) and optional guardrails like domain/category allowlists.
  4. Store the returned `id` or use paired nodes (Set/Code) to persist it inside the workflow.
  5. Add another Exa node in the same workflow set to **Get Research Task** and reference the saved `id` to poll results until the status becomes `completed`.
  6. Inspect the response for `insights`, `sources`, `outline`, or generated assets, then continue your workflow (e.g., send a Slack summary or populate a database).

  For bulk monitoring, use **List Research Tasks** and apply parameters for pagination, status filtering, or creation date ranges.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [Exa API documentation](https://docs.exa.ai)
  * [Exa API reference](https://docs.exa.ai/reference/search)

  ## Development

  To work on this node locally:

  ```bash
  # Install dependencies
  npm install

  # Build the node
  npm run build

  # Link for local testing
  npm link

  # In your n8n installation directory
  cd ~/.n8n/custom
  npm link n8n-nodes-exa-official

  # Start n8n
  n8n start
  ```

  ## License

  [MIT](https://github.com/exa-labs/n8n-integration/blob/main/LICENSE)

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with the Exa API to perform semantic web search, deep web research, and structured content extraction.","capabilities":["Semantic web search with neural, keyword, and fast search modes","Content extraction (text, highlights, summaries) from search results","Domain, date, category, and text content filtering","Retrieve cleaned text and summaries from specific URLs","Discover similar pages to a given URL","Generate AI-powered answers to research queries","Create and monitor long-running research tasks","List and paginate research task history"],"authentication":"API key required (Exa API key)","commonUseCases":["Conducting deep web research for business intelligence","Extracting and summarizing content from multiple sources","Finding similar web pages or content","Monitoring research tasks and generating reports","Filtering search results by domain, date, or category"],"limitations":["Requires a paid Exa API key (free tier may have limitations)","Research tasks are long-running and require polling for status","Some advanced features like Research Pro may require specific product tiers"],"relatedNodes":["n8n-nodes-webhook","n8n-nodes-code","n8n-nodes-set"]}


node_type: n8n-nodes-fullenrich.fullEnrich
package_name: n8n-nodes-fullenrich
display_name: FullEnrich
description: Start a FullEnrich bulk enrichment request
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: fullenrich
author_github_url: https://github.com/fullenrich/
npm_package_name: n8n-nodes-fullenrich
npm_version: 0.1.3
community_fetched_at: 2026-03-25T21:19:40.617Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "enrichment",
      "options": [
        {
          "name": "Enrichment",
          "value": "enrichment"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "startEnrichment",
      "options": [
        {
          "name": "Start Enrichment",
          "value": "startEnrichment",
          "action": "Start enrichment",
          "description": "Start an enrichment task"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "enrichment"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Start Enrichment",
      "value": "startEnrichment",
      "action": "Start enrichment",
      "description": "Start an enrichment task"
    }
  ]

npm_readme:
  # n8n-nodes-fullenrich

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

  **FullEnrich** is a contact enrichment service that takes minimal input (such as first name, last name, company domain, or LinkedIn URL) and returns enriched contact data like emails, phone numbers, and company information.  
  This node enables you to **start asynchronous enrichment requests** and **receive enriched results via webhook**, all within n8n.


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

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

  ---

  ## Installation

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

  Example:

  ```bash
  npm install n8n-nodes-fullenrich
  ```

  Then restart your n8n instance.

  ---

  ## Operations

  This package provides two nodes:

  ### FullEnrich Node: Start Enrichment
  - Accepts one or multiple contacts from previous nodes (e.g., Sheets, forms, or manual input).
  - Supports additional custom fields per contact (e.g. `row_id`, `user_id`).
  - Sends each contact to FullEnrich's API enrichment endpoint.

  ### FullEnrich Node: Get Enrichment Result (Webhook Trigger)
  - Acts as a webhook endpoint.
  - Listens for enrichment results returned via `webhook_url` from FullEnrich.
  - Outputs enriched contact data in a format usable by other nodes like Google Sheets, Airtable, or CRMs.

  ---

  ## Credentials

  The node requires API authentication:

  - Go to **n8n > Credentials**.
  - Create a new **HTTP Basic Auth** credential or custom one labeled `fullEnrichApi`.
  - Provide your API key as required by your FullEnrich backend.

  _You must assign this credential in the "Start Enrichment" node configuration._

  ---

  ## Compatibility

  - Minimum **n8n version**: `1.22.0`
  - Tested on: `1.22.0`, `1.25.1`, `1.28.0`
  - Node requires a FullEnrich-compatible API (self-hosted or cloud-based).

  ---

  ## Usage

  - The **Start Enrichment** node supports contacts from:
  - Previous nodes (e.g., Google Sheets, Airtable, Manual trigger).
  - Manual input from UI form (via structured fields).
  - You can also pass a **custom field name** (e.g. `user_id`) to track each contact in your workflow — this value will be passed under the `custom` object.
  - The **Get Result** node acts as a webhook and must be connected to the URL you provide to FullEnrich (auto-generated in most cases).

  **Example Use Case:**
  1. Load leads from a Google Sheet.
  2. Send to **Start Enrichment**.
  3. Receive enriched data via **FullEnrich Trigger**.
  4. Update the same Google Sheet.

  ---

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [FullEnrich API documentation](https://docs.fullenrich.com/introduction)

  ---

  ## Version history

  ### 0.1.0
  - Initial release.

ai_documentation_summary:
  {"purpose":"This n8n community node initiates asynchronous contact enrichment requests via FullEnrich and retrieves results through a webhook trigger, enabling workflow automation for lead data enhancement.","capabilities":["Start asynchronous enrichment requests for single or multiple contacts","Accept inputs from previous nodes (Sheets, forms, manual input)","Support custom fields per contact (e.g., row_id, user_id)","Provide webhook endpoint to receive enriched results","Output enriched data compatible with Google Sheets, Airtable, or CRMs"],"authentication":"HTTP Basic Auth (API key required)","commonUseCases":["Enriching lead data from Google Sheets or Airtable","Automating contact information updates in CRMs","Processing LinkedIn URLs or email domains for full contact details"],"limitations":["Enrichment is asynchronous; results are received via webhook, not immediately","Requires FullEnrich-compatible API (self-hosted or cloud-based)","Minimum n8n version 1.22.0 required"],"relatedNodes":["Webhook node","Google Sheets node","Airtable node","Manual trigger node"]}


node_type: n8n-nodes-parseur.parseurTrigger
package_name: n8n-nodes-parseur
display_name: Parseur Trigger
description: Trigger workflow on events sent from Parseur
category: Development
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: parseur
author_github_url: https://github.com/parseur/parseur-n8n-node.git
npm_package_name: n8n-nodes-parseur
npm_version: 0.0.4
community_fetched_at: 2026-03-25T21:19:40.618Z
ai_summary_generated_at: 2026-03-25 22:51:43
npm_readme:
  # Parseur n8n Node

  > 🧩 Official n8n Node to interact with [Parseur](https://parseur.com): receive events, upload text or upload files.

  [![npm version](https://badge.fury.io/js/n8n-nodes-parseur.svg)](https://badge.fury.io/js/n8n-nodes-parseur)
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

  [About](#about)  
  [Operations](#operations)  
  [Installation](#installation)  
  [Credentials](#credentials)  
  [Compatibility](#compatibility)  
  [Resources](#resources)  
  [Credit](#credit)  
  [License](#license)  


  ## About

  **Parseur** is a powerful no-code data extraction platform that helps you turn emails, PDFs, and other documents into structured data.

  This custom **n8n Node** allows you to:

  ✅ Trigger workflows when documents or tables are processed (via webhook)  
  ✅ Upload new documents as text (via API)  
  ✅ Upload files to a parser (via API)

  ## Operations

  - Upload File: send binary files (PDF, EML, etc.) to a Mailbox
  - Upload Text: send plain or HTML content as a document to a Mailbox
  - Supports webhook events from Parseur:

    | Event                          | Type        | Description                          |
    |--------------------------------|-------------|--------------------------------------|
    | `document.processed`           | document    | Document processed successfully      |
    | `document.processed.flattened` | document    | Document processed as flat data      |
    | `document.template_needed`     | document    | Processing failed (template needed)  |
    | `document.export_failed`       | document    | Export failed                        |
    | `table.processed`              | table       | A table field row was processed      |
    | `table.processed.flattened`    | table       | A table field row (flattened)        |


  ## Installation

  ### Install from npm

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

  ### Install from source

  1. Install dependencies

  ```bash
  brew install pnpm
  pnpm setup
  source ~/.zshrc
  ```

  2. Clone and build the node

  ```bash
  git clone https://github.com/parseur/parseur-n8n-node <parseur-n8n-node>
  cd <parseur-n8n-node>
  pnpm install
  pnpm build
  ```

  3. Set up a local n8n instance

  ```bash
  mkdir <n8n>
  cd <n8n>
  pnpm init
  pnpm add sqlite3
  pnpm approve-builds  # Needed for sqlite3 to complete install
  pnpm add n8n
  pnpm approve-builds  # Needed for n8n to complete install (select all packages, confirm and press Enter)
  pnpm exec n8n
  ```

  4. Link the Parseur node to n8n

  ```bash
  cd ~/.n8n
  mkdir -p custom
  cd custom
  pnpm init
  pnpm link <parseur-n8n-node>
  ```

  5. Restart n8n and you will see Parseur Trigger available.

  ```bash
  cd <n8n>
  pnpm exec n8n
  ```

  ## Credentials

  To connect n8n with your Parseur account, you’ll need two values: an **API Key** and a **Webhook Token**.

  ### API Key

  Get your API key in the [Parseur account settings](https://app.parseur.com/account).  
  This key is required to authenticate API requests to the Parseur platform.

  1. Log in to your [Parseur](https://app.parseur.com/login).
  2. Navigate to **Account**
  3. Copy your **API Key**.

  In n8n:

  - Click **“Add Credential”** and search for **"Parseur API"**.
  - Paste your API Key into the **API Key** field.

  ### Webhook Token

  The **Webhook Token** is used to verify that incoming webhook requests (e.g. from n8n to Parseur) are legitimate.

  You can generate a secure random token using a service like [uuidgenerator.net](https://www.uuidgenerator.net/), or generate one yourself using a tool or script of your choice.

  1. Go to [uuidgenerator.net](https://www.uuidgenerator.net/).
  2. Copy a generated UUID or token string.
  3. Paste it into the **Webhook Token** field in your Parseur credential in n8n.

  This token will be expected in the HTTP header `X-Parseur-Token` of all webhook requests.

  ## Compatibility

  Compatible with n8n v1.91.2.

  ## Resources

  - [Parseur](https://parseur.com) — Document processing & data extraction
  - [n8n](https://n8n.io) — Workflow automation

  ## Version history

  #### v0.0.1
  Initial release

  ## Contributing

  We welcome contributions and ideas!

  Please [open an issue](https://github.com/parseur/parseur-n8n-node/issues) or [submit a pull request](https://github.com/parseur/parseur-n8n-node/pulls) if you want to improve this node.

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Triggers n8n workflows when documents or tables are processed by Parseur and allows uploading text or files to Parseur.","capabilities":["Trigger workflow on document.processed events","Trigger workflow on document.processed.flattened events","Trigger workflow on document.template_needed events","Trigger workflow on document.export_failed events","Trigger workflow on table.processed events","Trigger workflow on table.processed.flattened events","Upload binary files (PDF, EML, etc.) to Parseur mailbox","Upload plain text or HTML content to Parseur mailbox"],"authentication":"API Key and Webhook Token","commonUseCases":["Automate data extraction when emails or PDFs are processed","Trigger downstream workflows upon successful document parsing","Handle failed parsing attempts via template_needed events","Export processed data to other systems"],"limitations":["Compatible only with n8n v1.91.2","Requires manual setup of credentials including a generated Webhook Token"],"relatedNodes":["Parseur API","Webhook Trigger","HTTP Request"]}


node_type: @calcslive/n8n-nodes-calcslive.calcsLive
package_name: @calcslive/n8n-nodes-calcslive
display_name: CalcsLive Calculator
description: Execute unit-aware calculations using CalcsLive articles
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: e3d
author_github_url: https://github.com/calcslive/n8n-nodes-calcslive.git
npm_package_name: @calcslive/n8n-nodes-calcslive
npm_version: 0.1.15
community_fetched_at: 2026-03-25T21:19:40.618Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "calculation",
      "options": [
        {
          "name": "Calculation",
          "value": "calculation"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "execute",
      "options": [
        {
          "name": "Execute",
          "value": "execute",
          "action": "Execute a calculation",
          "description": "Run a calculation using the specified inputs"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "calculation"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Execute",
      "value": "execute",
      "action": "Execute a calculation",
      "description": "Run a calculation using the specified inputs"
    }
  ]

npm_readme:
  # n8n-nodes-calcslive

  <img src="https://www.calcslive.com/favicon.ico" alt="CalcsLive Logo" width="90">  

   **Plug-and-Play Unit-Aware Multi-Step Calculations to your n8n**
   
  [CalcsLive](https://www.calcslive.com) calculations feature unit-awareness and pure symbolic equations to enable you to THINK in Physics without distraction in handling units. [`@calcslive/n8n-nodes-calcslive`](https://www.npmjs.com/package/@calcslive/n8n-nodes-calcslive) brings in the power and elegance to your n8n ecosystem.  

  Specifically for AI integration, it empowers AI agents with calculation accuracy and automatic handling of 540+ units across 64+ categories.

  > **🚧 MVP Release**: This is our early release focused on core unit-aware calculation functionality. We're actively improving the node and welcome your feedback to help shape future features! [Share your thoughts](https://github.com/calcslive/n8n-nodes-calcslive/issues) or reach out at don.wen@calcslive.com

  ## 🚀 Quick Start

  ### Installation
  1. Open your n8n instance
  2. Go to **Settings** → **Community Nodes** 
  3. Enter `@calcslive/n8n-nodes-calcslive` and click **Install**
  4. Create your **CalcsLive API** credentials with your API key for 'n8n Integration'

  ### First Calculation (5 minutes)
  1. **Create a simple calculation** at [CalcsLive](https://www.calcslive.com) and note the Article ID
  2. Add the **CalcsLive Calculator** node to your workflow
  3. Enter your Article ID and choose **Enhanced Mode** for guided setup
  4. Add input values and watch the unit-aware magic happen! 🎯

  **💡 Pro Tip**: Start with a simple unit conversion calc (see example below) to experience the power!

  ## 📸 Demo Workflow

  ![n8n CalcsLive Demo Workflow](assets/demo-workflow.png)

  *Example n8n workflow showing CalcsLive nodes performing unit-aware calculations: speed calculation, cylinder volume, and chained mass calculation using a Merge node to combine volume output with density input.*

  ### 🎥 Video Demonstration

  **[Watch the Complete Demo on YouTube →](https://www.youtube.com/watch?v=xC4iFwNkIQs)**
  *"n8n + CalcsLive → Plug-and-Play Unit-Aware Calculations"*

  This video walkthrough demonstrates:
  - 🚀 Installation and setup in n8n
  - 🎯 Creating CalcsLive calculations from scratch
  - 🔗 Building unit-aware workflow integrations
  - ⚡ Real-time calculation chaining between nodes
  - 📊 Handling complex multi-step engineering calculations

  ### Supporting Calculations

  The demo workflow uses these CalcsLive calculations:

  | Calculation | Article ID | Description |
  |-------------|---------|-------------|
  | **Speed Calculator** [(Link)](https://www.calcslive.com/editor/3M6P9TF5P-3XA) | `3M6P9TF5P-3XA` | Distance/time → speed with unit conversion |
  | **Cylinder Volume** [(Link)](https://www.calcslive.com/editor/3M6P9TF5P-3XA) | `3M6P9TF5P-3XA` | Diameter/height → volume calculation |
  | **Mass Calculator** [(Link)](https://www.calcslive.com/editor/3M6PBGU7S-3CA) | `3M6PBGU7S-3CA` | Volume + Density → Mass (chained calculation) |

  ### 🧩 Why Separate Calculations? The Composability Advantage

  **Question**: Why create a separate mass calculator when the first calculation already includes mass calculation?

  **Answer**: This demonstrates CalcsLive's **composable architecture** - a key design principle that unlocks powerful workflow patterns:

  🔗 **Calculation Chaining**: 
  - Calc1 outputs volume → Calc2 uses that volume as input
  - n8n expressions seamlessly bridge: `{{$json.volume_result}}`

  ♻️ **Reusability at Scale**:
  - One mass calc works with ANY volume calculation
  - Cylinder volume + Mass calc = Cylinder mass
  - Box volume + Mass calc = Box mass  
  - Sphere volume + Mass calc = Sphere mass

  🎯 **Result**: Instead of creating separate mass calculations for every shape, you build **modular, reusable calculation components** that combine in endless ways. This is the power of composable engineering in n8n workflows!

  ### 📥 Import Ready-to-Use Template

  Want to try this workflow instantly? Download and import our template:

  **[📥 Download Demo Workflow](assets/n8n-template-submission.json)** *(Right-click → Save As)*

  **Import Instructions:**
  1. In n8n: **Workflows** → **Import from File**
  2. Upload `n8n-template-submission.json`
  3. **Set up credentials** (you'll be prompted):
     - **CalcsLive API**: Add your API key from [CalcsLive Account](https://www.calcslive.com/account)
  4. **Execute** and watch the unit-aware magic! ✨

  The template includes a **Merge node** that combines Volume calculation output with Density input, demonstrating how to chain calculations that require data from multiple sources.

  ## ✨ Why CalcsLive? The Plug-and-Play Revolution!

  ### **🔌 Plug-and-Play Power**
  CalcsLive transforms n8n workflows with **zero-configuration unit awareness**. Simply plug the CalcsLive node between any two nodes and instantly bridge different unit systems, calculations, or data formats.

  ### **🚀 n8n Expressions + Unit Awareness = Game Changer**
  When you use n8n expressions (`{{$json.data}}`) with CalcsLive, your workflow data becomes **unit-aware**:
  - **Dynamic Values**: `{{$json.temperature}}` → Automatic °C to °F conversion
  - **Smart Bridging**: Any node → CalcsLive → Any node with proper units  
  - **Zero Code**: No manual conversion formulas or complex calculations needed

  ### **Before vs After Comparison**
  ```javascript
  // ❌ Before: Manual unit conversion nightmare
  const distanceKm = 150;
  const timeHours = 2;  
  const speedKmH = distanceKm / timeHours; // = 75 km/h
  // Need mph? Write more conversion code...
  const speedMph = speedKmH * 0.621371; // = 46.6 mph
  ```

  ```json
  // ✅ With CalcsLive: Plug-and-play unit-aware workflows
  {
    "inputs": {
      "D": { "value": "{{$json.distance}}", "unit": "km" },
      "t": { "value": "{{$json.time}}", "unit": "h" }
    },
    "outputs": {
      "s": { "unit": "mph" }
    }
  }
  // Result: Perfect unit conversion with n8n expression data! 🎯
  ```

  ## 🎯 Real-World Use Cases

  ### **🔌 Plug-and-Play Benefits for n8n Ecosystem**

  **🎯 Instant Unit Bridging**: Drop CalcsLive between any nodes to bridge unit mismatches
  - Google Sheets (metric) → CalcsLive → US Database (imperial) ✨
  - IoT Sensors (various units) → CalcsLive → Normalized Dashboard 📊
  - API Response (°C) → CalcsLive → Email Alert (°F) 📧

  **🚀 Zero Configuration**: No complex setup, just plug and play
  - Create calc once → Use everywhere in your workflows
  - n8n expressions work seamlessly with unit awareness
  - Dynamic data flows get automatic unit intelligence

  **⚡ Workflow Superpowers**: Transform ordinary workflows into unit-aware automation
  - **Before**: 5 nodes + custom code for unit conversion
  - **After**: 1 CalcsLive node with automatic unit handling
  - **Result**: Cleaner workflows, fewer errors, more reliability

  ## 🔧 Configuration Modes

  ### **Enhanced Mode** (Recommended) 🌟
  User-friendly interface with:
  - **Dropdown Selectors**: Choose input/output quantities from article
  - **Auto-Discovery**: Automatically loads available parameters
  - **Default Values**: Pre-populated with article defaults
  - **Unit Validation**: Visual feedback for valid units
  - **Smart Tooltips**: Contextual help for each parameter

  ### **Legacy Mode** (Advanced Users)
  Direct JSON input for:
  - **Power Users**: Full control over request structure  
  - **Custom Integrations**: Programmatic parameter generation
  - **Dynamic Workflows**: Expression-based parameter building

  ## 📋 Step-by-Step Guide

  ### **Step 1: Get Your API Key**
  1. Visit [CalcsLive](https://www.calcslive.com) and create an account
  2. Go to **Account** → **API Keys** 
  3. Generate a new API key for n8n integration
  4. Note your subscription tier limits (Free: 100 calls/month after trial)

  > **📦 npm Package**: [`@calcslive/n8n-nodes-calcslive`](https://www.npmjs.com/package/@calcslive/n8n-nodes-calcslive)

  ### **Step 2: Configure Credentials**
  1. In n8n: **Credentials** → **Create New** → **CalcsLive API**
  2. Enter your API key from Step 1
  3. Base URL: `https://www.calcslive.com` (default)

  ### **Step 3: Create Your Calculation Articles**
  **Security Note**: CalcsLive's n8n integration API is designed so users can only use their own public calculation articles in the CalcsLive node. You can create your own articles and use them in your node easily following the examples.

  1. Visit [CalcsLive](https://www.calcslive.com) and create your calculation
  2. Define your Physical Quantities (PQs) and mathematical relationships  
  3. Save your calculation and **find the Article ID in the URL**
     - Example URL: `https://www.calcslive.com/editor/3M5NVUCGW-3TA`
     - Article ID: `3M5NVUCGW-3TA` (the part after `/editor/`)

  **Demo Article IDs** (for reference only - create your own for actual use):
  - `3M6P9TF5P-3XA` - Speed & Cylinder Volume Calculator
  - `3M6PBGU7S-3CA` - Mass Calculator (Volume × Density)

  ### **Step 4: Configure Your Node**

  #### **Enhanced Mode Setup:**
  1. **Article ID**: Enter your chosen calculation ID
  2. **Input Physical Quantities**: Click "Add Input PQ"
     - Select parameter from dropdown
     - Enter value (or use expression)
     - Specify unit (optional - uses article default)
  3. **Output Physical Quantities**: Click "Add Output PQ" 
     - Select desired output parameter
     - Specify preferred unit for results

  #### **Legacy Mode Setup:**
  ```json
  {
    "articleId": "3M5NVUCGW-3TA",
    "inputs": {
      "D": { "value": 150, "unit": "km" },
      "t": { "value": 2, "unit": "h" }
    },
    "outputs": {
      "s": { "unit": "mph" }
    }
  }
  ```

  #### **Note**
  For input PQs and output PQs in your article, when they are not used in your node, input values and units in the article will be used to perform the calculations for your node.

  It is recommended to include all input and out PQs available from the article in your node, to allow flexibility in use for both upstream and downstream nodes.

  ## 💡 Workflow Examples

  ### **Example 1: Simple Unit Conversion (Perfect for Getting Started!)**
  **Step 1**: Create a calc in CalcsLive frontend with 2 PQs:
  - `PQ0 = 2 m` (input quantity) 
  - `PQ1 = PQ0 cm` (output - just unit conversion)

  **Step 2**: Use in n8n workflow as a plug-and-play unit converter:
  ```
  Data Source → CalcsLive Calculator → Next Node
  ```
  ```json
  {
    "articleId": "YOUR-ARTICLE-ID",
    "inputs": {
      "PQ0": { "value": "{{$json.length_meters}}", "unit": "m" }
    },
    "outputs": {
      "PQ1": { "unit": "cm" }
    }
  }
  ```
  **🎯 Result**: Automatic m → cm conversion! Refer to [Interactive Units Database](https://www.calcslive.com/help/units-reference#interactive-units-database) for all units and categories CalcsLive support. The CalcsLive node becomes a **unit-aware bridge** between any two nodes in your workflow.

  ### **Example 2: IoT Sensor Processing with n8n Expressions**
  ```
  IoT Sensor → CalcsLive Calculator → Database
  ```
  **🚀 Game-Changer**: When you use n8n expressions (like `{{$json.temperature}}`) with CalcsLive, your data gets **unit-awareness superpowers**!
  ```json
  {
    "inputs": {
      "temp_c": { "value": "{{$json.temperature}}", "unit": "°C" }
    },
    "outputs": {
      "temp_f": { "unit": "°F" }
    }
  }
  ```

  ### **Example 3: Batch Spreadsheet Processing**
  ```
  Google Sheets → CalcsLive Calculator → Email Report
  ```
  **Use Case**: Process engineering data with n8n expressions passing spreadsheet values directly to unit-aware calculations

  ### **Example 4: Real-time Monitoring Dashboard**
  ```
  Webhook → CalcsLive Calculator → InfluxDB → Grafana
  ```
  **Use Case**: Monitor manufacturing equipment with unit-normalized metrics using dynamic n8n expressions

  ### **Example 5: Compliance Reporting**
  ```
  Database Query → CalcsLive Calculator → PDF Generator → Email
  ```
  **Use Case**: Generate regulatory reports with region-appropriate units

  ## 📊 Understanding Node Output

  ### **Success Response Structure**
  ```json
  {
    "success": true,
    "articleId": "3M5NVUCGW-3TA",
    "inputs": {
      "D": {
        "symbol": "D",
        "value": 150,
        "unit": "km", 
        "baseValue": 150000,
        "baseUnit": "m",
        "description": "Distance"
      }
    },
    "outputs": {
      "s": {
        "symbol": "s",
        "value": 46.6,
        "unit": "mph",
        "baseValue": 20.83,
        "baseUnit": "m/s", 
        "expression": "D/t",
        "description": "Speed"
      }
    },
    "_metadata": {
      "executionTime": "2025-09-03T17:30:00.000Z",
      "processingTimeMs": 45
    }
  }
  ```

  ### **Key Output Fields**
  - **`value`** & **`unit`**: Your requested result with specified units
  - **`expression`**: Mathematical formula used for calculation
  - **`description`**: Human-readable parameter description

  ## 🚨 Error Handling & Troubleshooting

  ### **Common Error Messages**

  | Error Code | Message | Solution |
  |------------|---------|----------|
  | **401** | Invalid API Key | Check your CalcsLive API credentials |
  | **404** | Article Not Found | Verify article ID exists and is public |
  | **400** | Invalid Input Format | Check JSON structure and unit syntax |
  | **429** | Rate Limit Exceeded | Wait or upgrade subscription tier |
  | **500** | Server Error | Temporary CalcsLive service issue |

  ### **Best Practices**
  - **Cache Article Metadata**: Use Set nodes to avoid repeated validation calls  
  - **Error Boundaries**: Add error handling for calculation failures
  - **Unit Validation**: Test unit compatibility before production deployment
  - **Rate Limiting**: Monitor API usage in high-frequency workflows

  ### **Debugging Tips**
  1. **Enable Node Debugging**: Check console logs for detailed request/response info
  2. **Test Articles**: Use demo article IDs for initial testing
  3. **Unit Checking**: Verify unit spelling - case sensitive! (`km` not `KM`)
  4. **Expression Validation**: Check that symbols match article definitions

  ## 🔧 Advanced Configuration

  ### **Dynamic Parameters with Expressions**
  ```json
  {
    "inputs": {
      "pressure": { 
        "value": "{{$json.sensor_pressure}}", 
        "unit": "{{$json.sensor_unit || 'Pa'}}" 
      }
    }
  }
  ```

  ### **Conditional Output Units**
  ```json
  {
    "outputs": {
      "temperature": { 
        "unit": "{{$json.region === 'US' ? '°F' : '°C'}}" 
      }
    }
  }
  ```

  ### **Batch Processing Pattern**
  ```javascript
  // Split incoming array → CalcsLive Calculator → Merge results
  ```

  ## 🌍 Units & Categories

  CalcsLive supports **64+ unit categories** with **540+ units**! 

  📖 **Complete Reference**: Visit [CalcsLive Units Reference](https://www.calcslive.com/help/units-reference) for the interactive browser with search functionality and complete unit listings.

  ## 📚 API Reference

  ### **Node Parameters**

  | Parameter | Type | Required | Description |
  |-----------|------|----------|-------------|
  | `articleId` | string | ✅ | CalcsLive calculation article identifier |
  | `configMode` | enum | ✅ | "enhanced" or "legacy" configuration mode |
  | `inputPQs` | array | 📋 | Enhanced mode: Physical quantity inputs |
  | `outputPQs` | array | ⚪ | Enhanced mode: Desired outputs with units |
  | `inputs` | JSON | 📋 | Legacy mode: Direct JSON input structure |  
  | `outputs` | JSON | ⚪ | Legacy mode: Direct JSON output specification |

  **Legend**: ✅ Required, 📋 Required in respective mode, ⚪ Optional

  ### **Input PQ Structure (Enhanced Mode)**
  ```json
  {
    "symbol": "D",          // Parameter symbol from article
    "value": 150,           // Numeric value
    "unit": "km"            // Unit specification (optional)
  }
  ```

  ### **Output PQ Structure (Enhanced Mode)**
  ```json
  {
    "symbol": "s",          // Output parameter symbol  
    "unit": "mph"           // Desired output unit
  }
  ```

  ## 🔗 Integration Examples

  ### **Google Sheets Integration**
  ```
  Google Sheets Trigger → CalcsLive Calculator → Google Sheets Update
  ```
  Process engineering data with automatic unit normalization.

  ### **Discord/Slack Bot**
  ```
  Discord Trigger → CalcsLive Calculator → Discord Response
  ```
  Create calculation bots for engineering teams.

  ### **Database ETL Pipeline** 
  ```
  Database → CalcsLive Calculator → Transform → Data Warehouse
  ```
  Standardize units across diverse data sources.

  ### **Monitoring & Alerting**
  ```
  Sensor API → CalcsLive Calculator → Condition → Email Alert
  ```
  Calculate safety thresholds with proper unit handling.

  ## 🆘 Support & Community

  - **📖 Documentation**: [CalcsLive Docs](https://www.calcslive.com/docs)
  - **🔧 API Reference**: [CalcsLive API Docs](https://www.calcslive.com/docs/api) 
  - **🐛 Bug Reports**: [GitHub Issues](https://github.com/calcslive/n8n-nodes-calcslive/issues)
  - **💬 Community**: [n8n Community Forum](https://community.n8n.io)
  - **📧 Direct Support**: don.wen@calcslive.com

  ## 🤝 Contributing

  We welcome contributions! Here's how to get involved:

  1. **Fork** the repository
  2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)
  3. **Commit** your changes (`git commit -m 'Add amazing feature'`)
  4. **Push** to the branch (`git push origin feature/amazing-feature`)
  5. **Open** a Pull Request

  ### **Development Setup**
  ```bash
  git clone https://github.com/calcslive/n8n-nodes-calcslive.git
  cd n8n-nodes-calcslive
  npm install
  npm run build
  npm link

  # In your n8n directory
  npm link n8n-nodes-calcslive
  n8n start
  ```

  ## 📋 Version History

  ### **0.1.15** - n8n Community Compliance
  - ✅ Proper credential authentication with `authenticate` method
  - ✅ Uses `httpRequestWithAuthentication` for secure API calls
  - ✅ Added `pairedItem` for proper n8n item linking
  - ✅ Implemented `continueOnFail` support
  - ✅ Workflow template with Merge node for chained calculations
  - ✅ Removed all console.log statements
  - ✅ Passes n8n security scan

  ### **0.1.0** - MVP Release
  - ✅ Enhanced and Legacy configuration modes
  - ✅ Automatic unit conversion system
  - ✅ Comprehensive error handling
  - ✅ API key authentication
  - ✅ Input/output parameter discovery

  ### **Roadmap**
  - **0.2.0**: Batch processing optimizations
  - **0.3.0**: Cached metadata for improved performance  
  - **0.4.0**: Visual calculation builder interface
  - **1.0.0**: Production release with full test coverage

  ## 📜 License

  MIT License - see [LICENSE](LICENSE) file for details.

  ## 🌟 About CalcsLive

  CalcsLive transforms how engineers and technical professionals handle calculations by embedding unit-aware mathematics directly into documents and workflows. Founded on the principle that calculations should be as easy as writing text, CalcsLive bridges the gap between mathematical rigor and practical usability.

  **Visit [CalcsLive](https://www.calcslive.com) to explore the full platform!**

  ---

  *Made with ❤️ by the CalcsLive team. Empowering engineers through intelligent calculations.*

ai_documentation_summary:
  {"purpose":"Executes unit-aware, multi-step calculations using CalcsLive articles within n8n workflows, enabling automatic unit conversion and symbolic equation solving.","capabilities":["Unit-aware calculations across 540+ units and 64+ categories","Symbolic equation solving","Multi-step calculation chaining","Integration with n8n expressions ({{$json}})","Support for Enhanced Mode guided setup","Composable calculation architecture"],"authentication":"API key required","commonUseCases":["Physics calculations (speed, volume, mass)","Unit conversions between different systems","Engineering calculations requiring multiple inputs","AI agent workflows needing precise numerical outputs"],"limitations":["MVP release with core functionality only","Requires pre-created CalcsLive articles for calculations"],"relatedNodes":["n8n Merge Node","n8n Code Node","n8n HTTP Request Node"]}


node_type: @apify/n8n-nodes-apify.apify
package_name: @apify/n8n-nodes-apify
display_name: Apify
description: Access Apify tools for web scraping, data extraction, and automation.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-03-25 21:19:40
author_name: mtrunkat
author_github_url: https://github.com/apify/n8n-nodes-apify.git
npm_package_name: @apify/n8n-nodes-apify
npm_version: 0.6.5
community_fetched_at: 2026-03-25T21:19:40.619Z
ai_summary_generated_at: 2026-03-25 22:47:20
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "Actors",
      "options": [
        {
          "name": "Actor",
          "value": "Actors"
        },
        {
          "name": "Actor Task",
          "value": "Actor tasks"
        },
        {
          "name": "Actor Run",
          "value": "Actor runs"
        },
        {
          "name": "Dataset",
          "value": "Datasets"
        },
        {
          "name": "Key-Value Store",
          "value": "Key-Value Stores"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Run actor",
      "options": [
        {
          "name": "Run an Actor",
          "value": "Run actor",
          "action": "Run an Actor",
          "description": "Runs an Actor. You can override the Actor’s input configuration by providing a custom body, which will override the prefilled input values."
        },
        {
          "name": "Run an Actor and Get Dataset",
          "value": "Run actor and get dataset",
          "action": "Run an Actor and get dataset",
          "description": "Runs an Actor, waits for it to finish, and finally returns the dataset items"
        },
        {
          "name": "Scrape Single URL",
          "value": "Scrape single URL",
          "action": "Scrape single URL",
          "description": "Scrape a single URL using the Apify Website Content Crawler Actor and get its content as text, markdown, and HTML"
        },
        {
          "name": "Get Last Run",
          "value": "Get last run",
          "action": "Get last run",
          "description": "Retrieves the most recent run of an Actor. This endpoint is useful for quickly accessing the latest run details, including its status and storages, without needing to specify a run ID."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Actors"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Run task",
      "options": [
        {
          "name": "Run Task",
          "value": "Run task",
          "action": "Run task",
          "description": "Runs an Actor Task and return all associated details. You can optionally override the Actor’s input configuration by providing a custom body."
        },
        {
          "name": "Run Task and Get Dataset",
          "value": "Run task and get dataset",
          "action": "Run task and get dataset",
          "description": "Runs an Actor task, waits for it to finish, and finally returns the dataset items. You can optionally override the Actor’s input configuration by providing a custom body."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Actor tasks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get user runs list",
      "options": [
        {
          "name": "Get User Runs List",
          "value": "Get user runs list",
          "action": "Get user runs list",
          "description": "Gets a list of Actor runs for the user. This endpoint is useful for retrieving a history of runs, their statuses, and other data."
        },
        {
          "name": "Get run",
          "value": "Get run",
          "action": "Get run",
          "description": "Gets the details of a specific Actor run by its ID. This endpoint is useful for retrieving information about a run, such as its status, storages, and other metadata."
        },
        {
          "name": "Get runs",
          "value": "Get runs",
          "action": "Get runs",
          "description": "Gets a list of Actor runs. This endpoint is useful for retrieving a history of runs, their statuses, and other data."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Actor runs"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get items",
      "options": [
        {
          "name": "Get Items",
          "value": "Get items",
          "action": "Get dataset items",
          "description": "Retrieves items from a dataset"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Datasets"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Get Key-Value Store Record",
      "options": [
        {
          "name": "Get Key-Value Store Record",
          "value": "Get Key-Value Store Record",
          "action": "Get key-value store record",
          "description": "Gets a value stored in the key-value store under a specific key"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Key-Value Stores"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Run an Actor",
      "value": "Run actor",
      "action": "Run an Actor",
      "description": "Runs an Actor. You can override the Actor’s input configuration by providing a custom body, which will override the prefilled input values."
    },
    {
      "name": "Run an Actor and Get Dataset",
      "value": "Run actor and get dataset",
      "action": "Run an Actor and get dataset",
      "description": "Runs an Actor, waits for it to finish, and finally returns the dataset items"
    },
    {
      "name": "Scrape Single URL",
      "value": "Scrape single URL",
      "action": "Scrape single URL",
      "description": "Scrape a single URL using the Apify Website Content Crawler Actor and get its content as text, markdown, and HTML"
    },
    {
      "name": "Get Last Run",
      "value": "Get last run",
      "action": "Get last run",
      "description": "Retrieves the most recent run of an Actor. This endpoint is useful for quickly accessing the latest run details, including its status and storages, without needing to specify a run ID."
    },
    {
      "name": "Run Task",
      "value": "Run task",
      "action": "Run task",
      "description": "Runs an Actor Task and return all associated details. You can optionally override the Actor’s input configuration by providing a custom body."
    },
    {
      "name": "Run Task and Get Dataset",
      "value": "Run task and get dataset",
      "action": "Run task and get dataset",
      "description": "Runs an Actor task, waits for it to finish, and finally returns the dataset items. You can optionally override the Actor’s input configuration by providing a custom body."
    },
    {
      "name": "Get User Runs List",
      "value": "Get user runs list",
      "action": "Get user runs list",
      "description": "Gets a list of Actor runs for the user. This endpoint is useful for retrieving a history of runs, their statuses, and other data."
    },
    {
      "name": "Get run",
      "value": "Get run",
      "action": "Get run",
      "description": "Gets the details of a specific Actor run by its ID. This endpoint is useful for retrieving information about a run, such as its status, storages, and other metadata."
    },
    {
      "name": "Get runs",
      "value": "Get runs",
      "action": "Get runs",
      "description": "Gets a list of Actor runs. This endpoint is useful for retrieving a history of runs, their statuses, and other data."
    },
    {
      "name": "Get Items",
      "value": "Get items",
      "action": "Get dataset items",
      "description": "Retrieves items from a dataset"
    },
    {
      "name": "Get Key-Value Store Record",
      "value": "Get Key-Value Store Record",
      "action": "Get key-value store record",
      "description": "Gets a value stored in the key-value store under a specific key"
    }
  ]

npm_readme:
  # n8n Nodes - Apify integration

  This is an n8n community node that integrates [Apify](https://apify.com) with your n8n workflows, so you can run Apify Actors, extract structured data from websites, and automate complex web scraping tasks.

  [Apify](https://apify.com) is a platform for developers to build, deploy, and publish web automation tools, while [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) tool for AI workflow automation that allows you to connect various services.

  ## Table of contents

  - [Installation on self hosted instance](#installation-self-hosted)
  - [Installation on n8n cloud](#installation-n8n-cloud)
  - [Installation for development and contributing](#installation-development-and-contributing)
  - [Operations](#operations)
  - [Credentials](#credentials)
  - [Compatibility](#compatibility)
  - [Usage](#usage)
  - [Resources](#resources)
  - [Release](#releasing-a-new-version)
  - [Version History](#version-history)
  - [Troubleshooting](#troubleshooting)

  ## Installation (self-hosted)

  To install the Apify community node directly from the n8n Editor UI:

  1. Open your n8n instance.
  2. Go to **Settings > Community Nodes**
  3. Select **Install**.
  4. Enter the npm package name: `@apify/n8n-nodes-apify` to install the latest version. To install a specific version (e.g 0.6.4) enter `@apify/n8n-nodes-apify@0.6.4`. All versions are available [here](https://www.npmjs.com/package/@apify/n8n-nodes-apify?activeTab=versions)
  5. Agree to the [risks](https://docs.n8n.io/integrations/community-nodes/risks/) of using community nodes and select **Install**
  6. The node is now available to use in your workflows.

  ## Installation (n8n Cloud)

  If you're using n8n Cloud, installing community nodes is even simpler:

  1. Go to the **Canvas** and open the **nodes panel**.
  2. Search for **Apify** in the community node registry.
  3. Click **Install node** to add the Apify node to your instance.

  > On n8n cloud users can choose not to show verified community nodes. Instance owners can toggle this in the Cloud Admin Panel. To install the Apify node, make sure the installation of verified community nodes is enabled.

  ## Installation (development and contributing)

  ### ⚙️ Prerequisites

  - **Node.js**: 22.x or higher (required)
  - **npm**: 10.8.2 or higher (required)

  Verify your versions:

  ```bash
  node --version  # Should be v22.x.x or higher
  npm --version   # Should be 10.8.2 or higher
  ```

  If you use `nvm`, the project includes a `.nvmrc` file. Simply run:

  ```bash
  nvm use
  ```

  ### 1. Clone and Install Dependencies

  Clone the repository and install dependencies:

  ```bash
  git clone https://github.com/apify/n8n-nodes-apify.git
  cd n8n-nodes-apify
  npm install
  ```

  ### 2. Build the Node Package

  ```bash
  npm run build
  ```

  ### 3. Start Development Server

  Start the n8n development server with your node linked:

  ```bash
  npm run dev
  ```

  ---

  ### 🔁 Making changes

  If you make any changes to your custom node locally, remember to rebuild and restart:

  ```bash
  npm run build
  ```

  ---

  ## Self-hosted n8n: Public webhook URL for triggers

  This configuration is required for our service's trigger functionality to work correctly.

  By default, when running locally n8n generates webhook URLs using `localhost`, which external services cannot reach. To fix this:

  1. **Set your webhook URL**  
     In the same shell or Docker environment where n8n runs, export the `WEBHOOK_URL` to a publicly-accessible address. For example:

  ```bash
  export WEBHOOK_URL="https://your-tunnel.local"
  ```

  2. **Restart n8n**

  ```bash
  npm run dev
  ```

  ## Operations

  This node supports a wide range of Apify operations, organized by resource type:

  ### Actors

  - **Run Actor**: Execute an Actor with optional input parameters
    - Default behavior: Uses predefined input values
    - Custom input: Provide JSON object to override any or all default parameters
    - Configurable timeout and memory limits
    - Build version selection
  - **Run Actor and get dataset items**: Execute an Actor, wait for it to finish, and return the dataset items
  - **Scrape Single URL**: Quick scraping of a single URL
  - **Get Last Run**: Retrieve information about the most recent Actor run

  ### Actor tasks

  - **Run Task**: Execute a predefined Actor task
    - Supports custom input JSON
    - Configurable timeout
    - Task-specific settings
  - **Run task and get dataset items**: Execute a task, wait for it to finish, and return the dataset items

  ### Actor runs

  - **Get User Runs List**: List all runs for a user
    - Pagination support
    - Sorting options
    - Status filtering
  - **Get run**: Retrieve detailed information about a specific run

  ### Datasets

  - **Get Items**: Fetch items from a dataset

  ### Key-Value Stores

  - **Get Key-Value Store Record**: Retrieve a specific record by key

  ### Triggers

  Automatically start an n8n workflow whenever an Actor or task finishes execution

  - Can be configured to trigger on success, failure, abort, timeout or any combination of these states
  - Includes run metadata in the output
  - Available triggers:
    - **Actor Run Finished**: Start a workflow when an Actor run completes
    - **Task Run Finished**: Start a workflow when a task run completes

  ### AI Tools

  All Apify node operations can be combined with n8n's AI tools to create powerful workflows.
  For example, you can scrape data from a website using an Actor and then use an AI model to analyze or summarize the extracted information.

  ## Credentials

  The node supports two authentication methods:

  1. **API key authentication**
     - Configure your Apify API key in the n8n credentials section under `apifyApi`

  2. **OAuth2 authentication** (available only in n8n cloud)
     - Configure OAuth2 credentials in the n8n credentials section under `apifyOAuth2Api`

  ![auth](./docs/auth.png)

  ## Compatibility

  - **n8n**: Version 1.57.0 and higher
  - **Node.js**: 22.x or higher
  - **npm**: 10.8.2 or higher

  ## Usage

  1. **Create an Actor**: Set up a new Actor on [Apify](https://apify.com).
  2. **Set up a workflow**: Create a new workflow in n8n.
  3. **Add the Apify node**: Insert the Apify node into your workflow.
  4. **Configure credentials**: Enter your Apify API key and Actor ID.
  5. **Select an operation**: Choose the desired operation for the node.
  6. **Execute the workflow**: Run the workflow to execute the Apify operation.

  ![workflow](./docs/workflow.png)

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Apify API Documentation](https://docs.apify.com)

  # Releasing a New Version

  This project uses a GitHub Actions workflow to automate the release process, including publishing to npm. Here's how to trigger a new release.

  **Prerequisites (for all methods):**

  - Ensure your target branch on GitHub is up-to-date with all changes you want to include in the release.
  - Decide on the new version number, following semantic versioning (e.g., `vX.Y.Z`).
  - Prepare your release notes detailing the changes.
  - If you're using CLI to release, make sure you have the [GitHub CLI (`gh`)](https://cli.github.com/) installed and authenticated (`gh auth login`).

  ---

  ## Method 1: Using the GitHub Web UI (Recommended for ease of use)

  1.  **Navigate to GitHub Releases:**
      - Go to your repository's "Releases" tab

  2.  **Draft a New Release:**
      - Click the **"Draft a new release"** button.

  3.  **Create or Choose a Tag:**
      - In the "Choose a tag" dropdown:
        - **Type your new tag name** (e.g., `v1.2.3`).
        - If the tag doesn't exist, GitHub will prompt you with an option like **"Create new tag: v1.2.3 on publish."** Click this.
        - Ensure the **target branch** selected for creating the new tag is correct. This tag will point to the latest commit on this target branch.

  4.  **Set Release Title and Notes:**
      - Set the "Release title" (e.g., `vX.Y.Z` or a more descriptive title).
      - For the release notes in the description field, you have a few options:
        - **Write your prepared release notes.**
        - **Click the "Generate release notes" button:** GitHub will attempt to automatically create release notes based on merged pull requests since the last release. You can then review and edit these auto-generated notes.

  5.  **Publish the Release:**
      - Click the **"Publish release"** button.

        _Upon publishing, GitHub creates the tag from your specified branch and then creates the release. This "published" release event triggers the automated workflow._

  ---

  ## Method 2: Fully CLI-Driven Release

  This method uses the GitHub CLI (`gh`) for all steps, including tag creation.

  1.  **Ensure your local target branch is synced and changes are pushed:**
      `bash
  git checkout master
  git pull origin master
  `

  2.  **Create the Release (which also creates and pushes the tag):**
      Replace `vX.Y.Z` with your desired tag/version. The command will create this tag from the latest commit of your specified `--target` branch (defaults to repository's default branch, if `--target` is omitted and the branch is up to date).

      ```bash
      gh release create vX.Y.Z \
          --target master \
          --title "vX.Y.Z" \
          --notes "Your detailed release notes here.
          - Feature X
          - Bugfix Y"

      # Or, to use notes from a file:
      gh release create vX.Y.Z \
          --target master \
          --title "vX.Y.Z" \
          --notes-file ./RELEASE_NOTES.md

      # Or, to generate notes from pull requests (commits must follow conventional commit format for best results):
      gh release create vX.Y.Z \
          --target master \
          --title "vX.Y.Z"
          --generate-notes
      ```

      - `vX.Y.Z`: The tag and release name.
      - `--target <branch>`: Specifies which branch the tag should be created from (e.g., `master`). If the tag `vX.Y.Z` doesn't exist, `gh` will create it based on the HEAD of this target branch and push it.
      - `--title "<title>"`: The title for your release.
      - `--notes "<notes>"` or `--notes-file <filepath>` or `--generate-notes`: Your release notes.

        _This command will create the tag, push it to GitHub, and then publish the release. This "published" release event triggers the automated workflow._

  ---

  ## Post-Release: Automated Workflow & Verification (Common to all methods)

  Regardless of how you create and publish the GitHub Release:

  1.  **Automated Workflow Execution:**
      - The "Release & Publish" GitHub Actions workflow will automatically trigger.
      - It will perform:
        1.  Code checkout.
        2.  Version extraction (`X.Y.Z`) from the release tag.
        3.  Build and test processes.
        4.  Update `package.json` and `package-lock.json` to version `X.Y.Z`.
        5.  Commit these version changes back to the branch the release was targeted from with a message like `chore(release): set version to X.Y.Z [skip ci]`.
        6.  Publish the package `@apify/n8n-nodes-apify@X.Y.Z` to npm.

  2.  **Verify the Package on npm:**
      After the workflow successfully completes (check the "Actions" tab in your GitHub repository): - Verify the new version on npm:
      `bash
  npm view @apify/n8n-nodes-apify version
  `
      This should print `X.Y.Z`.

  ## Version history

  Track changes and updates to the node here.

  ## Troubleshooting

  ### Common issues

  1. **Authentication errors**
     - Verify your API key is correct

  2. **Resource Not Found**
     - Verify the resource ID format
     - Check if the resource exists in your Apify account
     - Ensure you have access to the resource

  3. **Operation failures**
     - Check the input parameters
     - Verify resource limits (memory, timeout)
     - Review Apify Console for detailed error messages

  ### Getting help

  If you encounter issues:

  1. Check the [Apify API documentation](https://docs.apify.com)
  2. Review the [n8n Community Nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  3. Open an issue in the [GitHub repository](https://github.com/apify/n8n-nodes-apify)

ai_documentation_summary:
  {"purpose":"This n8n community node integrates Apify for web scraping, data extraction, and automation by allowing users to run Apify Actors, manage datasets, and trigger workflows on completion.","capabilities":["Run Apify Actors with custom input parameters","Execute predefined Actor tasks","Scrape single URLs","Retrieve dataset items","Access Key-Value Store records","List and retrieve Actor run information","Trigger workflows on Actor or task completion (success, failure, abort, timeout)","Support pagination and sorting for run lists","Combine with n8n AI tools for data analysis"],"authentication":"API key required (apifyApi) or OAuth2 (apifyOAuth2Api, n8n Cloud only)","commonUseCases":["Automated web scraping and data extraction","Building data pipelines from external websites","Triggering n8n workflows based on external actor execution status","Integrating AI models with scraped data"],"limitations":["Requires Node.js 22.x or higher","Requires npm 10.8.2 or higher","n8n version 1.57.0 or higher required","OAuth2 authentication only available in n8n Cloud","Self-hosted instances require public WEBHOOK_URL configuration for triggers"],"relatedNodes":["n8n HTTP Request","n8n Code","n8n AI Model","n8n Webhook"]}


