# nodes

node_type: n8n-nodes-katiespeaker.katieSpeaker
package_name: n8n-nodes-katiespeaker
display_name: Katie Speaker
description: Publish spoken notifications to Katie Speaker devices
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: katiespeaker
author_github_url: https://github.com/hobbyquant/KatieSpeakerN8N.git
npm_package_name: n8n-nodes-katiespeaker
npm_version: 0.4.2
community_fetched_at: 2026-07-14T14:40:34.207Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "publish",
      "options": [
        {
          "name": "Broadcast Message",
          "value": "broadcast",
          "action": "Broadcast a message",
          "description": "Broadcast a message to all subscribers, bypassing their filters"
        },
        {
          "name": "Get Subscriber Filters",
          "value": "getFilters",
          "action": "Get subscriber filters",
          "description": "Get aggregated subscription filter rules for your channel"
        },
        {
          "name": "Publish Message",
          "value": "publish",
          "action": "Publish a message",
          "description": "Publish a message to your Katie Speaker channel"
        },
        {
          "name": "Should Publish",
          "value": "shouldPublish",
          "action": "Check if should publish",
          "description": "Check if any subscriber would receive a message with the given metadata"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Broadcast Message",
      "value": "broadcast",
      "action": "Broadcast a message",
      "description": "Broadcast a message to all subscribers, bypassing their filters"
    },
    {
      "name": "Get Subscriber Filters",
      "value": "getFilters",
      "action": "Get subscriber filters",
      "description": "Get aggregated subscription filter rules for your channel"
    },
    {
      "name": "Publish Message",
      "value": "publish",
      "action": "Publish a message",
      "description": "Publish a message to your Katie Speaker channel"
    },
    {
      "name": "Should Publish",
      "value": "shouldPublish",
      "action": "Check if should publish",
      "description": "Check if any subscriber would receive a message with the given metadata"
    }
  ]

npm_readme:
  # n8n-nodes-katiespeaker

  This is an [n8n](https://n8n.io/) community node that integrates with [Katie Speaker](https://katiespeaker.com) — a smart speaker platform for delivering spoken notifications hands-free.

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

  ## Installation

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

  ## Operations

  - **Publish Message** — Send a text message to your Katie Speaker channel. The device converts it to natural speech and plays it aloud.
  - **Broadcast Message** — Send a message to all subscribers, bypassing their individual filters.
  - **Get Subscriber Filters** — Retrieve the aggregated filter rules set by your channel's subscribers.
  - **Should Publish** — Check whether any subscriber would receive a message with given metadata before sending it (saves API costs).

  ## Credentials

  To use this node, you need a Katie Speaker account and a channel API key:

  1. Create an account at [app.katiespeaker.com](https://app.katiespeaker.com/register)
  2. Create a channel in your dashboard
  3. Copy the API key from your channel settings
  4. In n8n, add new **Katie Speaker API** credentials and paste your key

  ## Resources

  - [Katie Speaker Developer Portal](https://katiespeaker.com/developers)
  - [API Reference](https://katiespeaker.com/developers/api)
  - [Quick Start Guide](https://katiespeaker.com/developers/quickstart)
  - [Python SDK](https://github.com/hobbyquant/KatiePublisherSDK_Py)
  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Publishes spoken notifications to Katie Speaker smart speaker devices, enabling hands-free delivery of messages to subscribers.","capabilities":["Publish Message","Broadcast Message","Get Subscriber Filters","Should Publish"],"authentication":"API key required","commonUseCases":["Automated spoken alerts for IoT devices","Hands-free notifications for smart home systems","Real-time status updates to multiple subscribers"],"limitations":["Requires a separate Katie Speaker account and channel setup","API costs can be avoided by using 'Should Publish' check before sending"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: n8n-nodes-acrelens.acreLensTrigger
package_name: n8n-nodes-acrelens
display_name: AcreLens Trigger
description: Starts a workflow when AcreLens delivers a completed report via webhook.
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: acrelens
author_github_url: https://github.com/Hakeemwarner95/
npm_package_name: n8n-nodes-acrelens
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.208Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-acrelens

  Community node for [AcreLens](https://www.acrelens.com) — the B2B land-intelligence API. Run land analyses (off-grid / rural-residential / recreational / investment) on US property and receive completed reports via webhook, all from inside an n8n workflow.

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

  ## What ships

  | Node | Resource | Operation | Wraps |
  |---|---|---|---|
  | **AcreLens** | Land Analysis | Run Analysis | `POST /v1/analyze` |
  | **AcreLens** | Report | Get | `GET /v1/reports/{id}` |
  | **AcreLens Trigger** | — | Webhook receiver | Verifies AcreLens HMAC signatures and emits completed reports |

  Authentication uses an API key in the `X-API-Key` header. The credential's optional **Webhook Signing Secret** field is what the trigger uses to verify HMAC-SHA256 signatures on incoming webhooks.

  ## Installation

  ### n8n Cloud

  The node will be available in the **Community Nodes** browser once the verified-listing review lands. Until then, n8n Cloud users have to wait — the cloud platform doesn't support arbitrary npm installs.

  ### Self-hosted n8n

  ```bash
  # in your n8n install directory (or globally on the machine running n8n)
  npm install n8n-nodes-acrelens
  ```

  Restart n8n. The **AcreLens** and **AcreLens Trigger** nodes will appear in the node panel.

  ### Docker

  Add to your `docker-compose.yml` or Dockerfile:

  ```dockerfile
  RUN cd /usr/local/lib/node_modules/n8n && npm install n8n-nodes-acrelens
  ```

  Or set the env var `N8N_COMMUNITY_PACKAGES=n8n-nodes-acrelens` (n8n auto-installs on startup).

  ## Quickstart

  1. Create an AcreLens account at [acrelens.com/signup](https://www.acrelens.com/signup) — first 5 reports are free.
  2. Generate an API key at [/dashboard/api-keys](https://www.acrelens.com/dashboard/api-keys). Use a `al_test_*` key for staging, `al_live_*` for production.
  3. (Optional, only for the Trigger node) Set up a webhook signing secret at [/dashboard/webhooks](https://www.acrelens.com/dashboard/webhooks).
  4. In n8n, add an **AcreLens API** credential. Paste the API key (and webhook secret if using the Trigger).
  5. Drop an **AcreLens** node into your workflow.

  ### Pattern A — push (preferred)

  Zero polling, ~0 latency.

  ```
  [Anything] → AcreLens (Run Analysis, with webhook_url = AcreLens Trigger's URL)
                                    ⤵ ~90s later, async
                            AcreLens Trigger → [downstream nodes]
  ```

  1. Drop an **AcreLens Trigger** node first, copy its production webhook URL.
  2. In the **AcreLens** action node (Run Analysis), set the **Webhook URL** field to that URL.
  3. The trigger will fire when the report completes, with the full report body.

  ### Pattern B — poll

  Simpler, but burns workflow runs while waiting.

  ```
  [Anything] → AcreLens (Run Analysis) → Wait (90s) → AcreLens (Get Report by ID)
  ```

  ## Local development

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

  # Link into a local n8n install
  npm link
  cd ~/.n8n/custom    # create if missing: mkdir -p ~/.n8n/custom && cd ~/.n8n/custom && npm init -y
  npm link n8n-nodes-acrelens

  # Start n8n — your local node will load
  n8n start
  ```

  ## Troubleshooting

  | Symptom | Fix |
  |---|---|
  | Credential test returns 401 | Key is wrong, revoked, or your account is past-due. Check at [/dashboard/api-keys](https://www.acrelens.com/dashboard/api-keys). |
  | Trigger fires but body is empty | Disable **Verify Signature** temporarily — if it works without verification, the issue is the secret. Copy from [/dashboard/webhooks](https://www.acrelens.com/dashboard/webhooks). |
  | Trigger throws "timestamp too old" | AcreLens retries failed deliveries with exponential backoff. Increase **Tolerance (Seconds)** to 86400 (24h) if you intentionally process backlogged deliveries. |
  | Run Analysis returns `report_id` but Get Report returns 404 immediately | Reports take ~90s. Wait, or use Pattern A. |

  ## Compatibility

  - n8n version: `>=1.0`
  - Node.js: `>=20.15`

  ## License

  [MIT](./LICENSE)

  ## Links

  - [AcreLens API docs](https://docs.acrelens.com)
  - [AcreLens dashboard](https://www.acrelens.com/dashboard)
  - [Source code](https://github.com/Hakeemwarner95/n8n-nodes-acrelens)
  - [Report a bug](https://github.com/Hakeemwarner95/n8n-nodes-acrelens/issues)

ai_documentation_summary:
  {"purpose":"The AcreLens Trigger node starts an n8n workflow when AcreLens delivers a completed land analysis report via webhook, enabling real-time processing of B2B land intelligence data.","capabilities":["Receives completed land analysis reports via webhook","Verifies HMAC-SHA256 signatures on incoming webhooks","Emits report data to downstream workflow nodes","Supports configurable signature verification tolerance (timestamp drift)"],"authentication":"API key required (X-API-Key header) and optional Webhook Signing Secret for HMAC verification","commonUseCases":["Automated processing of land analysis reports upon completion","Real-time alerts for rural/residential/recreational/investment land data","Triggering downstream actions (e.g., email notifications, database updates) when reports are ready"],"limitations":["Not available in n8n Cloud (requires self-hosted installation)","Webhook signing secret is optional but recommended for security","Reports may take ~90 seconds to complete after analysis initiation"],"relatedNodes":["AcreLens API","Webhook","Wait"]}


node_type: n8n-nodes-acrelens.acreLens
package_name: n8n-nodes-acrelens
display_name: AcreLens
description: Run land-intelligence analyses on US property and fetch completed reports.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: acrelens
author_github_url: https://github.com/Hakeemwarner95/
npm_package_name: n8n-nodes-acrelens
npm_version: 0.1.2
community_fetched_at: 2026-07-14T14:40:34.209Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "analysis",
      "options": [
        {
          "name": "Land Analysis",
          "value": "analysis"
        },
        {
          "name": "Report",
          "value": "report"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Run Analysis",
          "value": "create",
          "action": "Run a land analysis",
          "routing": {
            "request": {
              "url": "/analyze",
              "method": "POST"
            }
          },
          "description": "Kicks off a new analysis. Returns immediately with a report ID; the full report (~90s later) is fetched via \"Get Report\" or delivered to your webhook URL."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "analysis"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get a land analysis report",
          "routing": {
            "request": {
              "url": "=/reports/{{$parameter[\"reportId\"]}}",
              "method": "GET"
            }
          },
          "description": "Looks up a report by ID. Returns partial data while the analysis is still processing and the full structured report once complete."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "report"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Run Analysis",
      "value": "create",
      "action": "Run a land analysis",
      "routing": {
        "request": {
          "url": "/analyze",
          "method": "POST"
        }
      },
      "description": "Kicks off a new analysis. Returns immediately with a report ID; the full report (~90s later) is fetched via \"Get Report\" or delivered to your webhook URL.",
      "resource": "analysis"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a land analysis report",
      "routing": {
        "request": {
          "url": "=/reports/{{$parameter[\"reportId\"]}}",
          "method": "GET"
        }
      },
      "description": "Looks up a report by ID. Returns partial data while the analysis is still processing and the full structured report once complete.",
      "resource": "report"
    }
  ]

npm_readme:
  # n8n-nodes-acrelens

  Community node for [AcreLens](https://www.acrelens.com) — the B2B land-intelligence API. Run land analyses (off-grid / rural-residential / recreational / investment) on US property and receive completed reports via webhook, all from inside an n8n workflow.

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

  ## What ships

  | Node | Resource | Operation | Wraps |
  |---|---|---|---|
  | **AcreLens** | Land Analysis | Run Analysis | `POST /v1/analyze` |
  | **AcreLens** | Report | Get | `GET /v1/reports/{id}` |
  | **AcreLens Trigger** | — | Webhook receiver | Verifies AcreLens HMAC signatures and emits completed reports |

  Authentication uses an API key in the `X-API-Key` header. The credential's optional **Webhook Signing Secret** field is what the trigger uses to verify HMAC-SHA256 signatures on incoming webhooks.

  ## Installation

  ### n8n Cloud

  The node will be available in the **Community Nodes** browser once the verified-listing review lands. Until then, n8n Cloud users have to wait — the cloud platform doesn't support arbitrary npm installs.

  ### Self-hosted n8n

  ```bash
  # in your n8n install directory (or globally on the machine running n8n)
  npm install n8n-nodes-acrelens
  ```

  Restart n8n. The **AcreLens** and **AcreLens Trigger** nodes will appear in the node panel.

  ### Docker

  Add to your `docker-compose.yml` or Dockerfile:

  ```dockerfile
  RUN cd /usr/local/lib/node_modules/n8n && npm install n8n-nodes-acrelens
  ```

  Or set the env var `N8N_COMMUNITY_PACKAGES=n8n-nodes-acrelens` (n8n auto-installs on startup).

  ## Quickstart

  1. Create an AcreLens account at [acrelens.com/signup](https://www.acrelens.com/signup) — first 5 reports are free.
  2. Generate an API key at [/dashboard/api-keys](https://www.acrelens.com/dashboard/api-keys). Use a `al_test_*` key for staging, `al_live_*` for production.
  3. (Optional, only for the Trigger node) Set up a webhook signing secret at [/dashboard/webhooks](https://www.acrelens.com/dashboard/webhooks).
  4. In n8n, add an **AcreLens API** credential. Paste the API key (and webhook secret if using the Trigger).
  5. Drop an **AcreLens** node into your workflow.

  ### Pattern A — push (preferred)

  Zero polling, ~0 latency.

  ```
  [Anything] → AcreLens (Run Analysis, with webhook_url = AcreLens Trigger's URL)
                                    ⤵ ~90s later, async
                            AcreLens Trigger → [downstream nodes]
  ```

  1. Drop an **AcreLens Trigger** node first, copy its production webhook URL.
  2. In the **AcreLens** action node (Run Analysis), set the **Webhook URL** field to that URL.
  3. The trigger will fire when the report completes, with the full report body.

  ### Pattern B — poll

  Simpler, but burns workflow runs while waiting.

  ```
  [Anything] → AcreLens (Run Analysis) → Wait (90s) → AcreLens (Get Report by ID)
  ```

  ## Local development

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

  # Link into a local n8n install
  npm link
  cd ~/.n8n/custom    # create if missing: mkdir -p ~/.n8n/custom && cd ~/.n8n/custom && npm init -y
  npm link n8n-nodes-acrelens

  # Start n8n — your local node will load
  n8n start
  ```

  ## Troubleshooting

  | Symptom | Fix |
  |---|---|
  | Credential test returns 401 | Key is wrong, revoked, or your account is past-due. Check at [/dashboard/api-keys](https://www.acrelens.com/dashboard/api-keys). |
  | Trigger fires but body is empty | Disable **Verify Signature** temporarily — if it works without verification, the issue is the secret. Copy from [/dashboard/webhooks](https://www.acrelens.com/dashboard/webhooks). |
  | Trigger throws "timestamp too old" | AcreLens retries failed deliveries with exponential backoff. Increase **Tolerance (Seconds)** to 86400 (24h) if you intentionally process backlogged deliveries. |
  | Run Analysis returns `report_id` but Get Report returns 404 immediately | Reports take ~90s. Wait, or use Pattern A. |

  ## Compatibility

  - n8n version: `>=1.0`
  - Node.js: `>=20.15`

  ## License

  [MIT](./LICENSE)

  ## Links

  - [AcreLens API docs](https://docs.acrelens.com)
  - [AcreLens dashboard](https://www.acrelens.com/dashboard)
  - [Source code](https://github.com/Hakeemwarner95/n8n-nodes-acrelens)
  - [Report a bug](https://github.com/Hakeemwarner95/n8n-nodes-acrelens/issues)

ai_documentation_summary:
  {"purpose":"A community n8n node that executes land-intelligence analyses on US properties via the AcreLens API and retrieves completed reports.","capabilities":["Run land analyses (off-grid, rural-residential, recreational, investment)","Fetch completed analysis reports by ID","Receive reports via webhook with HMAC signature verification","Support both push (webhook) and pull (polling) workflow patterns"],"authentication":"API key required (X-API-Key header); optional Webhook Signing Secret for HMAC-SHA256 verification","commonUseCases":["Automated land market research for real estate investment","Property analysis for off-grid or rural residential projects","Real-time report retrieval using webhook triggers"],"limitations":["Reports take approximately 90 seconds to complete before triggering webhook","n8n Cloud does not support arbitrary npm installs; requires self-hosted or Docker setup","Webhook trigger requires HMAC-SHA256 signature verification setup","First 5 reports are free; subsequent usage may incur costs"],"relatedNodes":["AcreLens API","AcreLens Trigger","Wait node","Webhook node"]}


node_type: n8n-nodes-qyvo.qyvoTrigger
package_name: n8n-nodes-qyvo
display_name: Qyvo Trigger
description: Starts a workflow when something happens on Qyvo
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: qyvo
author_github_url: https://github.com/poms32/
npm_package_name: n8n-nodes-qyvo
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.209Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-qyvo

  Community n8n nodes for [Qyvo](https://www.qyvo.io) — the WhatsApp marketing platform for e-commerce.

  Send WhatsApp templates, sync contacts, trigger sequences and flows, and react to incoming messages directly from your n8n workflows.

  ## Install

  In n8n (cloud or self-hosted), open **Settings → Community Nodes → Install** and enter:

  ```
  n8n-nodes-qyvo
  ```

  Or from the command line on a self-hosted instance:

  ```bash
  npm install n8n-nodes-qyvo
  ```

  Then restart n8n.

  ## Authenticate

  1. In Qyvo, go to **Settings → API Tokens** and click **Create token**. Copy the value once — it's only shown to you that one time.
  2. In n8n, add a new **Qyvo API** credential and paste the token.
  3. Leave **Base URL** as `https://www.qyvo.io` unless you self-host Qyvo.

  n8n will hit `GET /api/v1/me` with the token to verify it.

  ## Nodes

  ### Qyvo

  Action node grouped by resource:

  | Resource   | Operations                                                       |
  | ---------- | ---------------------------------------------------------------- |
  | Contact    | Create · Update · Get · Search · Add Tag · Remove Tag            |
  | Message    | Send Text · Send Template                                         |
  | Template   | List · Get                                                        |
  | Tag        | List                                                              |
  | Sequence   | Trigger                                                           |
  | Flow       | Trigger                                                           |

  Templates, sequences and flows are exposed as searchable dropdowns powered by your live Qyvo data.

  ### Qyvo Trigger

  Polling trigger. Fires on:

  - **New Message Received** — inbound WhatsApp message from a contact (with optional message-type filter)
  - **New Campaign Sent** — broadcast campaign finished sending
  - **New Flow Triggered** — flow session started for a contact
  - **New Sequence Triggered** — sequence session started for a contact

  n8n controls the poll interval; the node deduplicates by ID so you never see the same item twice.

  ## Notes on WhatsApp limits

  - **Templates** are the only way to send a message *outside* the 24 h conversation window. They must be approved by Meta in Qyvo before you can use them.
  - **Send Text** only works inside the 24 h window after the contact's last inbound message. Outside of it the API returns an error — fall back to a template.
  - Phone numbers are normalized server-side, but pass them in **E.164** format (`+14155550123`) for predictable behaviour.

  ## Develop

  ```bash
  npm install
  npm run build       # compile TS + copy SVGs to dist/
  npm run dev         # tsc --watch
  npm run lint        # eslint with n8n community ruleset
  ```

  To test a local build inside n8n:

  ```bash
  npm run build
  npm pack            # produces n8n-nodes-qyvo-x.y.z.tgz
  # in your n8n install:
  npm install /absolute/path/to/n8n-nodes-qyvo-x.y.z.tgz
  ```

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"The Qyvo Trigger node monitors a Qyvo WhatsApp marketing account for specific events like new messages, completed campaigns, or triggered flows/sequences, allowing n8n workflows to react automatically.","capabilities":["Poll for new inbound WhatsApp messages","Detect when broadcast campaigns finish sending","Detect when flow sessions start","Detect when sequence sessions start","Filter incoming messages by type","Deduplicate events by ID to prevent duplicate processing"],"authentication":"API Token (Manual entry in n8n credential)","commonUseCases":["Automatically reply to customer WhatsApp messages","Trigger marketing flows when a campaign completes","Start automated sequences when a user engages","Log incoming messages to a database or spreadsheet"],"limitations":["Requires manual polling; does not support real-time webhooks","Message sending via 'Send Text' only works within 24 hours of last inbound message","Templates must be approved by Meta in Qyvo before use","Phone numbers must be provided in E.164 format"],"relatedNodes":["Qyvo (Action node)","Qyvo API (Credential node)"]}


node_type: n8n-nodes-qyvo.qyvo
package_name: n8n-nodes-qyvo
display_name: Qyvo
description: Send WhatsApp templates, manage contacts, trigger sequences and flows on Qyvo
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: qyvo
author_github_url: https://github.com/poms32/
npm_package_name: n8n-nodes-qyvo
npm_version: 0.2.0
community_fetched_at: 2026-07-14T14:40:34.210Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "message",
      "options": [
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Flow",
          "value": "flow"
        },
        {
          "name": "Message",
          "value": "message"
        },
        {
          "name": "Sequence",
          "value": "sequence"
        },
        {
          "name": "Tag",
          "value": "tag"
        },
        {
          "name": "Template",
          "value": "template"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Add Tag",
          "value": "addTag",
          "action": "Add a tag to a contact",
          "routing": {
            "request": {
              "url": "/api/v1/actions/add-tag",
              "method": "POST"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a contact",
          "routing": {
            "request": {
              "url": "/api/v1/actions/create-contact",
              "method": "POST"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a contact",
          "routing": {
            "request": {
              "url": "/api/v1/actions/get-contact",
              "method": "POST"
            }
          }
        },
        {
          "name": "Remove Tag",
          "value": "removeTag",
          "action": "Remove a tag from a contact",
          "routing": {
            "request": {
              "url": "/api/v1/actions/remove-tag",
              "method": "POST"
            }
          }
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search contacts",
          "routing": {
            "request": {
              "url": "/api/v1/actions/search-contacts",
              "method": "POST"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a contact",
          "routing": {
            "request": {
              "url": "/api/v1/actions/update-contact",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendTemplate",
      "options": [
        {
          "name": "Send Text",
          "value": "sendText",
          "action": "Send a free-form text message",
          "routing": {
            "request": {
              "url": "/api/v1/actions/send-text-message",
              "method": "POST"
            }
          },
          "description": "Only works inside the 24-hour conversation window. Outside it, send a template instead."
        },
        {
          "name": "Send Template",
          "value": "sendTemplate",
          "action": "Send an approved WhatsApp template",
          "routing": {
            "request": {
              "url": "/api/v1/actions/send-template-message",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "message"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List templates",
          "routing": {
            "request": {
              "url": "/api/v1/actions/list-templates",
              "method": "POST"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a template",
          "routing": {
            "request": {
              "url": "/api/v1/actions/get-template",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List tags",
          "routing": {
            "request": {
              "url": "/api/v1/actions/list-tags",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "trigger",
      "options": [
        {
          "name": "Trigger",
          "value": "trigger",
          "action": "Trigger a sequence for a contact",
          "routing": {
            "request": {
              "url": "/api/v1/actions/trigger-sequence",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sequence"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "trigger",
      "options": [
        {
          "name": "Trigger",
          "value": "trigger",
          "action": "Trigger a flow for a contact",
          "routing": {
            "request": {
              "url": "/api/v1/actions/trigger-flow",
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "flow"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Add Tag",
      "value": "addTag",
      "action": "Add a tag to a contact",
      "routing": {
        "request": {
          "url": "/api/v1/actions/add-tag",
          "method": "POST"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a contact",
      "routing": {
        "request": {
          "url": "/api/v1/actions/create-contact",
          "method": "POST"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a contact",
      "routing": {
        "request": {
          "url": "/api/v1/actions/get-contact",
          "method": "POST"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Remove Tag",
      "value": "removeTag",
      "action": "Remove a tag from a contact",
      "routing": {
        "request": {
          "url": "/api/v1/actions/remove-tag",
          "method": "POST"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search contacts",
      "routing": {
        "request": {
          "url": "/api/v1/actions/search-contacts",
          "method": "POST"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a contact",
      "routing": {
        "request": {
          "url": "/api/v1/actions/update-contact",
          "method": "POST"
        }
      },
      "resource": "contact"
    },
    {
      "name": "Send Text",
      "value": "sendText",
      "action": "Send a free-form text message",
      "routing": {
        "request": {
          "url": "/api/v1/actions/send-text-message",
          "method": "POST"
        }
      },
      "description": "Only works inside the 24-hour conversation window. Outside it, send a template instead.",
      "resource": "message"
    },
    {
      "name": "Send Template",
      "value": "sendTemplate",
      "action": "Send an approved WhatsApp template",
      "routing": {
        "request": {
          "url": "/api/v1/actions/send-template-message",
          "method": "POST"
        }
      },
      "resource": "message"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List templates",
      "routing": {
        "request": {
          "url": "/api/v1/actions/list-templates",
          "method": "POST"
        }
      },
      "resource": "template"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a template",
      "routing": {
        "request": {
          "url": "/api/v1/actions/get-template",
          "method": "POST"
        }
      },
      "resource": "template"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List tags",
      "routing": {
        "request": {
          "url": "/api/v1/actions/list-tags",
          "method": "POST"
        }
      },
      "resource": "tag"
    },
    {
      "name": "Trigger",
      "value": "trigger",
      "action": "Trigger a sequence for a contact",
      "routing": {
        "request": {
          "url": "/api/v1/actions/trigger-sequence",
          "method": "POST"
        }
      },
      "resource": "sequence"
    },
    {
      "name": "Trigger",
      "value": "trigger",
      "action": "Trigger a flow for a contact",
      "routing": {
        "request": {
          "url": "/api/v1/actions/trigger-flow",
          "method": "POST"
        }
      },
      "resource": "flow"
    }
  ]

npm_readme:
  # n8n-nodes-qyvo

  Community n8n nodes for [Qyvo](https://www.qyvo.io) — the WhatsApp marketing platform for e-commerce.

  Send WhatsApp templates, sync contacts, trigger sequences and flows, and react to incoming messages directly from your n8n workflows.

  ## Install

  In n8n (cloud or self-hosted), open **Settings → Community Nodes → Install** and enter:

  ```
  n8n-nodes-qyvo
  ```

  Or from the command line on a self-hosted instance:

  ```bash
  npm install n8n-nodes-qyvo
  ```

  Then restart n8n.

  ## Authenticate

  1. In Qyvo, go to **Settings → API Tokens** and click **Create token**. Copy the value once — it's only shown to you that one time.
  2. In n8n, add a new **Qyvo API** credential and paste the token.
  3. Leave **Base URL** as `https://www.qyvo.io` unless you self-host Qyvo.

  n8n will hit `GET /api/v1/me` with the token to verify it.

  ## Nodes

  ### Qyvo

  Action node grouped by resource:

  | Resource   | Operations                                                       |
  | ---------- | ---------------------------------------------------------------- |
  | Contact    | Create · Update · Get · Search · Add Tag · Remove Tag            |
  | Message    | Send Text · Send Template                                         |
  | Template   | List · Get                                                        |
  | Tag        | List                                                              |
  | Sequence   | Trigger                                                           |
  | Flow       | Trigger                                                           |

  Templates, sequences and flows are exposed as searchable dropdowns powered by your live Qyvo data.

  ### Qyvo Trigger

  Polling trigger. Fires on:

  - **New Message Received** — inbound WhatsApp message from a contact (with optional message-type filter)
  - **New Campaign Sent** — broadcast campaign finished sending
  - **New Flow Triggered** — flow session started for a contact
  - **New Sequence Triggered** — sequence session started for a contact

  n8n controls the poll interval; the node deduplicates by ID so you never see the same item twice.

  ## Notes on WhatsApp limits

  - **Templates** are the only way to send a message *outside* the 24 h conversation window. They must be approved by Meta in Qyvo before you can use them.
  - **Send Text** only works inside the 24 h window after the contact's last inbound message. Outside of it the API returns an error — fall back to a template.
  - Phone numbers are normalized server-side, but pass them in **E.164** format (`+14155550123`) for predictable behaviour.

  ## Develop

  ```bash
  npm install
  npm run build       # compile TS + copy SVGs to dist/
  npm run dev         # tsc --watch
  npm run lint        # eslint with n8n community ruleset
  ```

  To test a local build inside n8n:

  ```bash
  npm run build
  npm pack            # produces n8n-nodes-qyvo-x.y.z.tgz
  # in your n8n install:
  npm install /absolute/path/to/n8n-nodes-qyvo-x.y.z.tgz
  ```

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables sending WhatsApp templates, managing contacts, triggering sequences and flows, and reacting to incoming messages via the Qyvo WhatsApp marketing platform.","capabilities":["Send WhatsApp text messages (within 24h window)","Send WhatsApp templates (outside 24h window)","Create, update, retrieve, and search contacts","Add and remove tags from contacts","List and retrieve WhatsApp templates","Trigger sequences","Trigger flows","React to incoming messages","Poll for new messages, campaigns, and flow/sequence triggers"],"authentication":"API Token","commonUseCases":["Automated WhatsApp marketing campaigns via templates","Customer engagement workflows using sequences and flows","Contact management and tagging for e-commerce","Real-time reaction to incoming WhatsApp messages","Broadcast campaign management"],"limitations":["Text messages only work within 24 hours of the last inbound message","Templates must be approved by Meta in Qyvo before use","Templates are required for messages sent outside the 24h conversation window","Phone numbers must be passed in E.164 format"],"relatedNodes":["n8n-nodes-whatsapp","n8n-nodes-gmail","n8n-nodes-http-request"]}


node_type: n8n-nodes-filepost.filePost
package_name: n8n-nodes-filepost
display_name: FilePost
description: Uploads files and returns public URLs
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: momo_dev
author_github_url: https://github.com/mussemou/
npm_package_name: n8n-nodes-filepost
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.211Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload File",
          "value": "upload",
          "action": "Upload file",
          "description": "Uploads a file and returns a public URL"
        },
        {
          "name": "List Files",
          "value": "list",
          "action": "List files",
          "description": "Lists uploaded files"
        },
        {
          "name": "Get File",
          "value": "get",
          "action": "Get file details",
          "description": "Gets details for a specific file"
        },
        {
          "name": "Delete File",
          "value": "delete",
          "action": "Delete file",
          "description": "Deletes a file"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Upload File",
      "value": "upload",
      "action": "Upload file",
      "description": "Uploads a file and returns a public URL"
    },
    {
      "name": "List Files",
      "value": "list",
      "action": "List files",
      "description": "Lists uploaded files"
    },
    {
      "name": "Get File",
      "value": "get",
      "action": "Get file details",
      "description": "Gets details for a specific file"
    },
    {
      "name": "Delete File",
      "value": "delete",
      "action": "Delete file",
      "description": "Deletes a file"
    }
  ]

npm_readme:
  # n8n-nodes-filepost

  This is an [n8n](https://n8n.io/) community node for [FilePost](https://filepost.dev) — a file upload API that gives you instant public CDN URLs.

  Upload any file from your n8n workflow and get back a permanent public URL. No S3 buckets, no storage config.

  ## Operations

  | Operation | Description |
  |-----------|-------------|
  | **Upload File** | Upload a binary file and get a public CDN URL |
  | **List Files** | List your uploaded files with pagination |
  | **Get File** | Get details of a specific file by ID |
  | **Delete File** | Delete a file by ID |

  ## Credentials

  You need a FilePost API key. Get one free at [filepost.dev](https://filepost.dev).

  1. Go to [filepost.dev](https://filepost.dev)
  2. Enter your email to get a free API key
  3. In n8n, go to **Credentials** > **New** > **FilePost API**
  4. Paste your API key

  ## Installation

  ### In n8n (recommended)

  1. Go to **Settings** > **Community Nodes**
  2. Search for `n8n-nodes-filepost`
  3. Click **Install**

  ### Manual

  ```bash
  npm install n8n-nodes-filepost
  ```

  ## Usage Example

  ### Upload a file and get a URL

  1. Add an **HTTP Request** or **Read Binary File** node to get a file
  2. Connect it to the **FilePost** node
  3. Set operation to **Upload File**
  4. Set the binary property name (default: `data`)
  5. Run — you get back a JSON response with `url`, `file_id`, `size`, and `content_type`

  ### Response example

  ```json
  {
    "file_id": "abc123",
    "url": "https://cdn.filepost.dev/abc123/photo.jpg",
    "size": 248192,
    "content_type": "image/jpeg"
  }
  ```

  ## Plans

  | Plan | Price | Uploads/mo | Max File Size |
  |------|-------|-----------|---------------|
  | Free | $0 | 300 | 50MB |
  | Starter | $9/mo | 5,000 | 200MB |
  | Pro | $29/mo | 25,000 | 500MB |

  ## Links

  - [FilePost Homepage](https://filepost.dev)
  - [API Documentation](https://filepost.dev/docs)
  - [Blog](https://filepost.dev/blog)

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"Uploads files to FilePost API and returns permanent public CDN URLs without requiring S3 or storage configuration.","capabilities":["Upload binary files and receive public CDN URLs","List uploaded files with pagination support","Retrieve file details by ID","Delete files by ID"],"authentication":"API key required (free API key available at filepost.dev)","commonUseCases":["Storing user-uploaded images or documents in n8n workflows","Generating shareable public links for media assets","Temporary file storage with automatic CDN delivery"],"limitations":["Free plan limits to 300 uploads per month and 50MB max file size","Paid plans required for higher upload volumes or larger file sizes","Community node (not official n8n node)"],"relatedNodes":["Read Binary File","HTTP Request","Set Binary Data"]}


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

updated_at: 2026-07-14 14:40:34
author_name: marekpijak
author_github_url: https://github.com/TOPefekt/n8n.git
npm_package_name: n8n-nodes-bulkgate
npm_version: 0.1.18
community_fetched_at: 2026-07-14T14:40:34.212Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "addressBook",
      "options": [
        {
          "name": "Address Book",
          "value": "addressBook"
        },
        {
          "name": "Advanced",
          "value": "advanced"
        },
        {
          "name": "BlackList",
          "value": "blackList"
        },
        {
          "name": "One Time Password",
          "value": "oneTimePassword"
        },
        {
          "name": "Other",
          "value": "other"
        },
        {
          "name": "Shortener",
          "value": "shortener"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "addContact",
      "options": [
        {
          "name": "Add Contact",
          "value": "addContact",
          "action": "Address book add contact",
          "description": "Adds contact to BulkGate address book"
        },
        {
          "name": "Edit Contact",
          "value": "editContact",
          "action": "Address book edit contact",
          "description": "Edits contact to BulkGate address book"
        },
        {
          "name": "Get Contact",
          "value": "getContact",
          "action": "Address book get contact",
          "description": "Removes contact to BulkGate address book"
        },
        {
          "name": "Import Contact",
          "value": "importContact",
          "action": "Address book import contact",
          "description": "Import contacts to BulkGate address book"
        },
        {
          "name": "Remove Contact",
          "value": "removeContact",
          "action": "Address book remove contact",
          "description": "Removes contact to BulkGate address book"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "addressBook"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "transactionalSMS",
      "options": [
        {
          "name": "Promotional SMS",
          "value": "promotionalSMS",
          "action": "Send single promotional message via SMS",
          "description": "Send promotional message via SMS"
        },
        {
          "name": "Promotional SMS Different Text",
          "value": "promotionalSMSDifferentText",
          "action": "Send multiple promotional messages via SMS",
          "description": "Send promotional message via SMS"
        },
        {
          "name": "Promotional Viber",
          "value": "promotionalViber",
          "action": "Send single promotional message via viber",
          "description": "Send promotional message via Viber"
        },
        {
          "name": "Promotional Viber Different Text",
          "value": "promotionalViberDifferentText",
          "action": "Send multiple promotional messages via viber ",
          "description": "Send promotional message via Viber"
        },
        {
          "name": "Transactional SMS",
          "value": "transactionalSMS",
          "action": "Send transactional message via SMS",
          "description": "Send transactional message via SMS"
        },
        {
          "name": "Transactional Viber",
          "value": "transactionalViber",
          "action": "Send transactional message via viber",
          "description": "Send transactional message via Viber"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "advanced"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Black List Numbers",
          "value": "add",
          "action": "Black list number"
        },
        {
          "name": "Is Number Blacklisted",
          "value": "check",
          "action": "Check if number is blacklisted",
          "description": "Check numbers inclusion in blacklist"
        },
        {
          "name": "Remove Number From Blacklist",
          "value": "remove",
          "action": "Remove number",
          "description": "Removes number from blacklist"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "blackList"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendSms",
      "options": [
        {
          "name": "Send OTP via SMS",
          "value": "sendSms",
          "action": "Send OTP via SMS",
          "description": "Sends one time password via SMS message"
        },
        {
          "name": "Send OTP via Viber",
          "value": "sendViber",
          "action": "Send OTP via viber",
          "description": "Sends one time password via Viber message"
        },
        {
          "name": "Verify",
          "value": "verify",
          "action": "Verify OTP",
          "description": "Verifies the code send by BulkGate"
        },
        {
          "name": "Resend",
          "value": "resend",
          "action": "Resend OTP",
          "description": "Resends one time password"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "oneTimePassword"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "shorten",
      "options": [
        {
          "name": "Shorten",
          "value": "shorten",
          "action": "Shortener shorten",
          "description": "This action is used to shorten URL, for later use in BulkGate Portal"
        },
        {
          "name": "Edit",
          "value": "change",
          "action": "Shortener change",
          "description": "This action is used to modify shortened URL, for future use in BulkGate Portal"
        },
        {
          "name": "Remove",
          "value": "remove",
          "action": "Shortener remove",
          "description": "This action is used for removal of shortened URL from BulkGate Portal"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "shortener"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "checkCreditBalance",
      "options": [
        {
          "name": "Check Credit Balance",
          "value": "checkCreditBalance",
          "action": "Check credit balance",
          "description": "Checks state of your account balance"
        },
        {
          "name": "Check Delivery Report",
          "value": "checkDeliveryReport",
          "action": "Check delivery report",
          "description": "Checks delivery report of given message ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "other"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Add Contact",
      "value": "addContact",
      "action": "Address book add contact",
      "description": "Adds contact to BulkGate address book",
      "resource": "addressBook"
    },
    {
      "name": "Edit Contact",
      "value": "editContact",
      "action": "Address book edit contact",
      "description": "Edits contact to BulkGate address book",
      "resource": "addressBook"
    },
    {
      "name": "Get Contact",
      "value": "getContact",
      "action": "Address book get contact",
      "description": "Removes contact to BulkGate address book",
      "resource": "addressBook"
    },
    {
      "name": "Import Contact",
      "value": "importContact",
      "action": "Address book import contact",
      "description": "Import contacts to BulkGate address book",
      "resource": "addressBook"
    },
    {
      "name": "Remove Contact",
      "value": "removeContact",
      "action": "Address book remove contact",
      "description": "Removes contact to BulkGate address book",
      "resource": "addressBook"
    },
    {
      "name": "Promotional SMS",
      "value": "promotionalSMS",
      "action": "Send single promotional message via SMS",
      "description": "Send promotional message via SMS",
      "resource": "advanced"
    },
    {
      "name": "Promotional SMS Different Text",
      "value": "promotionalSMSDifferentText",
      "action": "Send multiple promotional messages via SMS",
      "description": "Send promotional message via SMS",
      "resource": "advanced"
    },
    {
      "name": "Promotional Viber",
      "value": "promotionalViber",
      "action": "Send single promotional message via viber",
      "description": "Send promotional message via Viber",
      "resource": "advanced"
    },
    {
      "name": "Promotional Viber Different Text",
      "value": "promotionalViberDifferentText",
      "action": "Send multiple promotional messages via viber ",
      "description": "Send promotional message via Viber",
      "resource": "advanced"
    },
    {
      "name": "Transactional SMS",
      "value": "transactionalSMS",
      "action": "Send transactional message via SMS",
      "description": "Send transactional message via SMS",
      "resource": "advanced"
    },
    {
      "name": "Transactional Viber",
      "value": "transactionalViber",
      "action": "Send transactional message via viber",
      "description": "Send transactional message via Viber",
      "resource": "advanced"
    },
    {
      "name": "Black List Numbers",
      "value": "add",
      "action": "Black list number",
      "resource": "blackList"
    },
    {
      "name": "Is Number Blacklisted",
      "value": "check",
      "action": "Check if number is blacklisted",
      "description": "Check numbers inclusion in blacklist",
      "resource": "blackList"
    },
    {
      "name": "Remove Number From Blacklist",
      "value": "remove",
      "action": "Remove number",
      "description": "Removes number from blacklist",
      "resource": "blackList"
    },
    {
      "name": "Send OTP via SMS",
      "value": "sendSms",
      "action": "Send OTP via SMS",
      "description": "Sends one time password via SMS message",
      "resource": "oneTimePassword"
    },
    {
      "name": "Send OTP via Viber",
      "value": "sendViber",
      "action": "Send OTP via viber",
      "description": "Sends one time password via Viber message",
      "resource": "oneTimePassword"
    },
    {
      "name": "Verify",
      "value": "verify",
      "action": "Verify OTP",
      "description": "Verifies the code send by BulkGate",
      "resource": "oneTimePassword"
    },
    {
      "name": "Resend",
      "value": "resend",
      "action": "Resend OTP",
      "description": "Resends one time password",
      "resource": "oneTimePassword"
    },
    {
      "name": "Shorten",
      "value": "shorten",
      "action": "Shortener shorten",
      "description": "This action is used to shorten URL, for later use in BulkGate Portal",
      "resource": "shortener"
    },
    {
      "name": "Edit",
      "value": "change",
      "action": "Shortener change",
      "description": "This action is used to modify shortened URL, for future use in BulkGate Portal",
      "resource": "shortener"
    },
    {
      "name": "Remove",
      "value": "remove",
      "action": "Shortener remove",
      "description": "This action is used for removal of shortened URL from BulkGate Portal",
      "resource": "shortener"
    },
    {
      "name": "Check Credit Balance",
      "value": "checkCreditBalance",
      "action": "Check credit balance",
      "description": "Checks state of your account balance",
      "resource": "other"
    },
    {
      "name": "Check Delivery Report",
      "value": "checkDeliveryReport",
      "action": "Check delivery report",
      "description": "Checks delivery report of given message ID",
      "resource": "other"
    }
  ]

npm_readme:
  # n8n-nodes-bulkgate

  This is a n8n community node. It lets you use BulkGate in your n8n workflows.

  BulkGate is the multichannel messaging platform for successful business communication
  Connect with your customers anywhere in the world with BulkGate. Engage and interact with them via SMS gateway, Viber, and other solutions.

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

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

  ## Installation

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

  ## Operations


  - [AddressBook](https://help.bulkgate.com/docs/en/http-address-book-get.html)
      - Add contact
      - Edit contact
      - Get contact
      - Import contacts
      - Remove contact
  - [BlackList](https://help.bulkgate.com/docs/en/http-black-list-is-black-listed.html)
    - Add contact to blacklist
    - Check whether contact is in blacklist
    - Remove contact from blacklist
  - [Advanced Messaging](https://help.bulkgate.com/docs/en/http-advanced-transactional-v2.html)
    - Send Transactional SMS
    - Send Transactional Viber
    - Send Promotional SMS
    - Send Promotional SMS (Different text for each phone number)
    - Send Promotional Viber
    - Send Promotional Viber (Different text for each phone number)
  - [One Time Password](https://help.bulkgate.com/docs/en/http-one-time-password-send.html)
    - Send OTP via SMS
    - Send OTP via Viber
    - Resend OTP
    - Verify OTP
  - [URL Shortener](https://help.bulkgate.com/docs/en/http-shortener-shorten.html)
    - Shorten URL
    - Change shortened URL
    - Remove shortened URL
  - Other
    - [Check credit balance on your account](https://help.bulkgate.com/docs/en/http-advanced-check-credit-balance.html)
    - Check delivery report by given message_ID


  ## Credentials

  User needs to create an account on [BulkGate portal](https://portal.bulkgate.com/) and navigate to [Modules & APIs](https://portal.bulkgate.com/application/) section. There find n8n module, click it and then click "Create API".
  There you will find your "application_id" and your "application_token".
  For more information go [here](https://help.bulkgate.com/docs/en/api-administration.html)

  ## Compatibility

  This module has been developed on node version 22

  ## Usage

  - Webhook setup
    - When setting up webhook to receive delivery reports you have to navigate to [BulkGate portal](https://portal.bulkgate.com/) and to the [Modules & APIs](https://portal.bulkgate.com/application/) section. Click on your created n8n api and scroll down to Webhook section.
    - Once you are there click "Configure" button and paste your webhook into the field.
    - If you are using "Send Delivery Report" trigger click save.
    - If you are using "Send Bulk Delivery Report" trigger check option "Bulk DLRs - bulk request" then save.
    - DO NOT CHECK "Report only when error occurs".

  - Delivery Reports
    - If you wish to filter delivery reports by contents or type visit our [Delivery report documentation](https://help.bulkgate.com/docs/en/http-low-level-api-delivery-confirmations-and-incoming-sms.html) describing specifics.
    - Bulk Reports are explained here [Bulk Delivery Reports](https://help.bulkgate.com/docs/en/http-api-bulk-delivery-confirmations-and-incoming-sms.html)    

  - API limits
    - Your setup API can also be limited by number of messages, or by country. For more information go to [API Limits](https://help.bulkgate.com/docs/en/api-limits.html)

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [BulkGate documentation](https://help.bulkgate.com/en/)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables interaction with the BulkGate API for multichannel messaging, contact management, and URL shortening.","capabilities":["Add, edit, get, import, and remove contacts","Manage contact blacklists","Send transactional and promotional SMS/Viber messages","Send and verify One-Time Passwords (OTP)","Shorten and manage shortened URLs","Check account credit balance","Retrieve delivery reports for messages","Configure webhooks for delivery report triggers"],"authentication":"API Key (application_id and application_token obtained from BulkGate portal)","commonUseCases":["Automated customer notifications via SMS or Viber","Two-factor authentication (OTP) workflows","Marketing campaign management with promotional messaging","URL tracking and shortening for campaigns","Contact list management and blacklist handling"],"limitations":["API usage may be limited by message volume or country restrictions","Requires manual webhook configuration in the BulkGate portal for delivery reports","Node is built for Node.js version 22"],"relatedNodes":["HTTP Request","Webhook","Split In Batches"]}


node_type: n8n-nodes-bulkgate.bulkGateBulkDeliveryReport
package_name: n8n-nodes-bulkgate
display_name: BulkGate Bulk Delivery Report
description: Starts the workflow when BulkGate sends an event
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: marekpijak
author_github_url: https://github.com/TOPefekt/n8n.git
npm_package_name: n8n-nodes-bulkgate
npm_version: 0.1.18
community_fetched_at: 2026-07-14T14:40:34.213Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-bulkgate

  This is a n8n community node. It lets you use BulkGate in your n8n workflows.

  BulkGate is the multichannel messaging platform for successful business communication
  Connect with your customers anywhere in the world with BulkGate. Engage and interact with them via SMS gateway, Viber, and other solutions.

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

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

  ## Installation

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

  ## Operations


  - [AddressBook](https://help.bulkgate.com/docs/en/http-address-book-get.html)
      - Add contact
      - Edit contact
      - Get contact
      - Import contacts
      - Remove contact
  - [BlackList](https://help.bulkgate.com/docs/en/http-black-list-is-black-listed.html)
    - Add contact to blacklist
    - Check whether contact is in blacklist
    - Remove contact from blacklist
  - [Advanced Messaging](https://help.bulkgate.com/docs/en/http-advanced-transactional-v2.html)
    - Send Transactional SMS
    - Send Transactional Viber
    - Send Promotional SMS
    - Send Promotional SMS (Different text for each phone number)
    - Send Promotional Viber
    - Send Promotional Viber (Different text for each phone number)
  - [One Time Password](https://help.bulkgate.com/docs/en/http-one-time-password-send.html)
    - Send OTP via SMS
    - Send OTP via Viber
    - Resend OTP
    - Verify OTP
  - [URL Shortener](https://help.bulkgate.com/docs/en/http-shortener-shorten.html)
    - Shorten URL
    - Change shortened URL
    - Remove shortened URL
  - Other
    - [Check credit balance on your account](https://help.bulkgate.com/docs/en/http-advanced-check-credit-balance.html)
    - Check delivery report by given message_ID


  ## Credentials

  User needs to create an account on [BulkGate portal](https://portal.bulkgate.com/) and navigate to [Modules & APIs](https://portal.bulkgate.com/application/) section. There find n8n module, click it and then click "Create API".
  There you will find your "application_id" and your "application_token".
  For more information go [here](https://help.bulkgate.com/docs/en/api-administration.html)

  ## Compatibility

  This module has been developed on node version 22

  ## Usage

  - Webhook setup
    - When setting up webhook to receive delivery reports you have to navigate to [BulkGate portal](https://portal.bulkgate.com/) and to the [Modules & APIs](https://portal.bulkgate.com/application/) section. Click on your created n8n api and scroll down to Webhook section.
    - Once you are there click "Configure" button and paste your webhook into the field.
    - If you are using "Send Delivery Report" trigger click save.
    - If you are using "Send Bulk Delivery Report" trigger check option "Bulk DLRs - bulk request" then save.
    - DO NOT CHECK "Report only when error occurs".

  - Delivery Reports
    - If you wish to filter delivery reports by contents or type visit our [Delivery report documentation](https://help.bulkgate.com/docs/en/http-low-level-api-delivery-confirmations-and-incoming-sms.html) describing specifics.
    - Bulk Reports are explained here [Bulk Delivery Reports](https://help.bulkgate.com/docs/en/http-api-bulk-delivery-confirmations-and-incoming-sms.html)    

  - API limits
    - Your setup API can also be limited by number of messages, or by country. For more information go to [API Limits](https://help.bulkgate.com/docs/en/api-limits.html)

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [BulkGate documentation](https://help.bulkgate.com/en/)

ai_documentation_summary:
  {"purpose":"This n8n community node listens for and processes BulkGate delivery report events, allowing users to automate responses or actions based on SMS/Viber delivery status.","capabilities":["Receive bulk delivery reports","Receive individual delivery reports","Filter reports by content or type","Trigger workflows based on delivery status"],"authentication":"API Key required (application_id and application_token obtained from BulkGate portal)","commonUseCases":["Automate follow-up messages based on delivery status","Trigger alerts for failed or pending SMS/Viber deliveries","Log delivery statistics into a database"],"limitations":["Requires manual webhook configuration in BulkGate portal","Must check 'Bulk DLRs - bulk request' option for bulk reports","Should not check 'Report only when error occurs' for bulk reports"],"relatedNodes":["n8n-nodes-bulkgate.bulkGateBulkDeliveryReport","n8n-nodes-bulkgate.bulkGateSendSMS","n8n-nodes-bulkgate.bulkGateSendViber"]}


node_type: n8n-nodes-bulkgate.bulkGateDeliveryReport
package_name: n8n-nodes-bulkgate
display_name: BulkGate Delivery Report
description: Starts the workflow when BulkGate sends an event
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: marekpijak
author_github_url: https://github.com/TOPefekt/n8n.git
npm_package_name: n8n-nodes-bulkgate
npm_version: 0.1.18
community_fetched_at: 2026-07-14T14:40:34.214Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-bulkgate

  This is a n8n community node. It lets you use BulkGate in your n8n workflows.

  BulkGate is the multichannel messaging platform for successful business communication
  Connect with your customers anywhere in the world with BulkGate. Engage and interact with them via SMS gateway, Viber, and other solutions.

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

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

  ## Installation

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

  ## Operations


  - [AddressBook](https://help.bulkgate.com/docs/en/http-address-book-get.html)
      - Add contact
      - Edit contact
      - Get contact
      - Import contacts
      - Remove contact
  - [BlackList](https://help.bulkgate.com/docs/en/http-black-list-is-black-listed.html)
    - Add contact to blacklist
    - Check whether contact is in blacklist
    - Remove contact from blacklist
  - [Advanced Messaging](https://help.bulkgate.com/docs/en/http-advanced-transactional-v2.html)
    - Send Transactional SMS
    - Send Transactional Viber
    - Send Promotional SMS
    - Send Promotional SMS (Different text for each phone number)
    - Send Promotional Viber
    - Send Promotional Viber (Different text for each phone number)
  - [One Time Password](https://help.bulkgate.com/docs/en/http-one-time-password-send.html)
    - Send OTP via SMS
    - Send OTP via Viber
    - Resend OTP
    - Verify OTP
  - [URL Shortener](https://help.bulkgate.com/docs/en/http-shortener-shorten.html)
    - Shorten URL
    - Change shortened URL
    - Remove shortened URL
  - Other
    - [Check credit balance on your account](https://help.bulkgate.com/docs/en/http-advanced-check-credit-balance.html)
    - Check delivery report by given message_ID


  ## Credentials

  User needs to create an account on [BulkGate portal](https://portal.bulkgate.com/) and navigate to [Modules & APIs](https://portal.bulkgate.com/application/) section. There find n8n module, click it and then click "Create API".
  There you will find your "application_id" and your "application_token".
  For more information go [here](https://help.bulkgate.com/docs/en/api-administration.html)

  ## Compatibility

  This module has been developed on node version 22

  ## Usage

  - Webhook setup
    - When setting up webhook to receive delivery reports you have to navigate to [BulkGate portal](https://portal.bulkgate.com/) and to the [Modules & APIs](https://portal.bulkgate.com/application/) section. Click on your created n8n api and scroll down to Webhook section.
    - Once you are there click "Configure" button and paste your webhook into the field.
    - If you are using "Send Delivery Report" trigger click save.
    - If you are using "Send Bulk Delivery Report" trigger check option "Bulk DLRs - bulk request" then save.
    - DO NOT CHECK "Report only when error occurs".

  - Delivery Reports
    - If you wish to filter delivery reports by contents or type visit our [Delivery report documentation](https://help.bulkgate.com/docs/en/http-low-level-api-delivery-confirmations-and-incoming-sms.html) describing specifics.
    - Bulk Reports are explained here [Bulk Delivery Reports](https://help.bulkgate.com/docs/en/http-api-bulk-delivery-confirmations-and-incoming-sms.html)    

  - API limits
    - Your setup API can also be limited by number of messages, or by country. For more information go to [API Limits](https://help.bulkgate.com/docs/en/api-limits.html)

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [BulkGate documentation](https://help.bulkgate.com/en/)

ai_documentation_summary:
  {"purpose":"A community node that triggers n8n workflows when BulkGate sends delivery report events, enabling automated processing of SMS/Viber delivery confirmations.","capabilities":["Receive delivery reports via webhook","Filter delivery reports by content or type","Process bulk delivery reports","Trigger workflows on incoming SMS delivery status"],"authentication":"API key required (application_id and application_token obtained from BulkGate portal)","commonUseCases":["Automated SMS/Viber delivery confirmation processing","Customer engagement tracking via delivery status","Bulk message campaign monitoring","Error handling for failed message deliveries"],"limitations":["Community node (not official n8n package)","Requires manual webhook configuration in BulkGate portal","API limits apply based on country and message volume","Must configure webhook URL in BulkGate application settings"],"relatedNodes":["n8n-nodes-bulkgate.bulkGateSendSMS","n8n-nodes-bulkgate.bulkGateSendViber","n8n-nodes-bulkgate.bulkGateSendOTP","n8n-nodes-bulkgate.bulkGateSendPromotionalMessage","n8n-nodes-bulkgate.bulkGateCheckCreditBalance"]}


node_type: @contactout/n8n-nodes-contactout.contactOut
package_name: @contactout/n8n-nodes-contactout
display_name: ContactOut
description: Find emails and phone numbers using the ContactOut API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: greghermo
author_github_url: https://github.com/contactout/n8n-nodes-contactout.git
npm_package_name: @contactout/n8n-nodes-contactout
npm_version: 0.1.5
community_fetched_at: 2026-07-14T14:40:34.215Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "profile",
      "options": [
        {
          "name": "Profile",
          "value": "profile"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "contactInfoSingle",
      "options": [
        {
          "name": "Batch Lookup",
          "value": "contactInfoBulkV2",
          "action": "Enrich multiple profiles",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v2/people/linkedin/batch",
              "method": "POST"
            }
          },
          "description": "Enrich multiple profiles with contact details (email/phone) asynchronously with an optional webhook callback URL. Consumes email/phone credits."
        },
        {
          "name": "Enrich Profile",
          "value": "peopleEnrich",
          "action": "Enrich a single profile",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/people/enrich",
              "method": "POST"
            }
          },
          "description": "Enrich a profile via LinkedIn URL, email, phone, company data, and other data points. Returns structured profile details and optionally emails or phone numbers. Consumes email/phone credits when requested."
        },
        {
          "name": "Find Decision Makers",
          "value": "decisionMakers",
          "action": "Find company decision makers",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/people/decision-makers",
              "method": "GET"
            }
          },
          "description": "Find key people at a company by domain, name, or LinkedIn URL. Consumes search credits, may consume email/phone credits."
        },
        {
          "name": "Get Contact Info",
          "value": "contactInfoSingle",
          "action": "Get contact details from a LinkedIn URL",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "request": {
              "url": "/v1/people/linkedin",
              "method": "GET"
            }
          },
          "description": "Get contact details (email/phone) from a LinkedIn profile URL. Consumes email/phone credits."
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "profile"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Batch Lookup",
      "value": "contactInfoBulkV2",
      "action": "Enrich multiple profiles",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v2/people/linkedin/batch",
          "method": "POST"
        }
      },
      "description": "Enrich multiple profiles with contact details (email/phone) asynchronously with an optional webhook callback URL. Consumes email/phone credits.",
      "resource": "profile"
    },
    {
      "name": "Enrich Profile",
      "value": "peopleEnrich",
      "action": "Enrich a single profile",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/people/enrich",
          "method": "POST"
        }
      },
      "description": "Enrich a profile via LinkedIn URL, email, phone, company data, and other data points. Returns structured profile details and optionally emails or phone numbers. Consumes email/phone credits when requested.",
      "resource": "profile"
    },
    {
      "name": "Find Decision Makers",
      "value": "decisionMakers",
      "action": "Find company decision makers",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/people/decision-makers",
          "method": "GET"
        }
      },
      "description": "Find key people at a company by domain, name, or LinkedIn URL. Consumes search credits, may consume email/phone credits.",
      "resource": "profile"
    },
    {
      "name": "Get Contact Info",
      "value": "contactInfoSingle",
      "action": "Get contact details from a LinkedIn URL",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "request": {
          "url": "/v1/people/linkedin",
          "method": "GET"
        }
      },
      "description": "Get contact details (email/phone) from a LinkedIn profile URL. Consumes email/phone credits.",
      "resource": "profile"
    }
  ]

npm_readme:
  # n8n-nodes-contactout

  An n8n community node for [ContactOut](https://contactout.com). Find emails, phone numbers, and profile data for people and companies directly in your n8n workflows.

  ## Installation

  **Via n8n UI (recommended):**
  1. Go to **Settings > Community Nodes**
  2. Search for `@contactout/n8n-nodes-contactout`
  3. Click **Install**

  **Via CLI:**
  ```bash
  npm install @contactout/n8n-nodes-contactout
  ```

  ## Credentials

  This node requires a ContactOut API key.

  1. Get an API key from the [ContactOut dashboard](https://contactout.com/api-dashboard) or contact [sales@contactout.com](mailto:sales@contactout.com)
  2. In n8n, go to **Credentials > New > ContactOut API**
  3. Paste your API key and save

  ## Features

  - **Get Contact Info** — Look up a single person's email and/or phone number by LinkedIn profile URL.
  - **Enrich Profile** — Enrich a person's profile via LinkedIn URL, email, phone, or name + secondary identifiers. Returns structured profile details and optionally contact info.
  - **Batch Lookup** — Enrich up to 1,000 LinkedIn profiles asynchronously. Optionally posts results to a webhook callback URL when processing is complete.
  - **Find Decision Makers** — Find key people at a company by domain, LinkedIn URL, or company name. Optionally reveal contact info.

  ## Example Usage

  Here are some examples of how you can use the ContactOut nodes in your n8n workflows:

  **Enrich a lead from a CRM:**
  Use a CRM trigger node to pull new contacts, pass their LinkedIn URLs into the **Enrich Profile** operation to retrieve structured profile data, then update the CRM record with the enriched information.

  **Build a prospect list:**
  Use the **Find Decision Makers** operation with a company domain to find key people at target companies, then feed the results into a spreadsheet node to build a curated prospect list.

  **Bulk enrich a LinkedIn export:**
  Load a CSV of LinkedIn profile URLs into n8n, pass them to the **Batch Lookup** operation, and receive the enriched results via webhook when processing is complete.

  **Qualify inbound leads:**
  When a new lead fills out a form, use the **Get Contact Info** operation with their LinkedIn URL to instantly retrieve verified contact details and route high-value leads to your sales team.

  ## Resources

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

  ## License

  [MIT](LICENSE)

ai_documentation_summary:
  {"purpose":"A n8n community node that uses the ContactOut API to retrieve emails, phone numbers, and profile data for individuals and companies.","capabilities":["Get contact info by LinkedIn profile URL","Enrich profiles via LinkedIn URL, email, phone, or name + secondary identifiers","Batch lookup up to 1,000 LinkedIn profiles asynchronously","Find decision makers by domain, LinkedIn URL, or company name","Return structured profile details and optionally contact info"],"authentication":"API key required","commonUseCases":["Enriching leads from a CRM","Building prospect lists by company domain","Bulk enriching LinkedIn exports","Qualifying inbound leads"],"limitations":["Batch lookups are asynchronous and require a webhook callback URL for results","Requires a valid ContactOut API key and dashboard access"],"relatedNodes":["Webhook","Spreadsheet","CRM Trigger","HTTP Request"]}


node_type: n8n-nodes-freelo.freelo
package_name: n8n-nodes-freelo
display_name: Freelo
description: Interact with the Freelo project management API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: freeloapp
author_github_url: https://github.com/freeloapp/n8n.git
npm_package_name: n8n-nodes-freelo
npm_version: 1.0.7
community_fetched_at: 2026-07-14T14:40:34.216Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "Task",
      "options": [
        {
          "name": "Comment",
          "value": "Comment",
          "description": "Create, Get, Edit comments"
        },
        {
          "name": "Custom Field",
          "value": "CustomField",
          "description": "Create, Get, Edit, Remove, Restore Custom Fields"
        },
        {
          "name": "Event",
          "value": "Event",
          "description": "Get Event"
        },
        {
          "name": "File",
          "value": "File",
          "description": "Get Files"
        },
        {
          "name": "Invoice",
          "value": "Invoice",
          "description": "Get, Invoice Invoices"
        },
        {
          "name": "Note",
          "value": "Note",
          "description": "Create, Get, Edit, Delete Notes"
        },
        {
          "name": "Notification",
          "value": "Notification",
          "description": "Get, Read, Unread Notifications"
        },
        {
          "name": "Pinned Item",
          "value": "PinnedItem",
          "description": "Get, Delete, Pin Item"
        },
        {
          "name": "Project",
          "value": "Project",
          "description": "Get, Create, Delete, Archive, Active, Invite Projects and Template Projects"
        },
        {
          "name": "Project Label",
          "value": "ProjectLabel",
          "description": "Add, Get, Edit, Remove, Restore Project Labels"
        },
        {
          "name": "State",
          "value": "State",
          "description": "Get States"
        },
        {
          "name": "Sub Task",
          "value": "SubTask",
          "description": "Get, Create Sub Tasks"
        },
        {
          "name": "Task",
          "value": "Task",
          "description": "Get, Create, Delete, Archive, Active, Move Tasks"
        },
        {
          "name": "Task Label",
          "value": "TaskLabel",
          "description": "Create, Add, Remove Task Labels"
        },
        {
          "name": "Task List",
          "value": "TaskList",
          "description": "Get, Create Task Lists"
        },
        {
          "name": "Time Tracking",
          "value": "TimeTracking",
          "description": "Start, Stop, Edit Time Tracking"
        },
        {
          "name": "User",
          "value": "User",
          "description": "Get, Out of the Office, Invite Users"
        },
        {
          "name": "Work Report",
          "value": "WorkReport",
          "description": "Get, Create, Edit, Delete Work Report"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Activate",
          "value": "activateProject",
          "action": "Activate project",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/activate",
              "method": "POST"
            }
          },
          "description": "Activate project"
        },
        {
          "name": "Archive",
          "value": "archiveProject",
          "action": "Archive project",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/archive",
              "method": "POST"
            }
          },
          "description": "Archive project"
        },
        {
          "name": "Create",
          "value": "createProject",
          "action": "Create project",
          "routing": {
            "request": {
              "url": "=/projects",
              "method": "POST"
            }
          },
          "description": "Create project"
        },
        {
          "name": "Create From Template",
          "value": "createTemplateProject",
          "action": "Create project from template",
          "routing": {
            "request": {
              "url": "=/project/create-from-template/{{$parameter[\"projectId\"]}}",
              "method": "POST"
            }
          },
          "description": "Create project from template"
        },
        {
          "name": "Delete",
          "value": "deleteProject",
          "action": "Delete project",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete project"
        },
        {
          "name": "Get Details",
          "value": "getProject",
          "action": "Get project details",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many projects owned and invited",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.projects"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/all-projects",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many projects (owned and invited)"
        },
        {
          "name": "Get Many Archived",
          "value": "getAllArchived",
          "action": "Get many archived projects",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.archived_projects"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/archived-projects",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many archived projects"
        },
        {
          "name": "Get Many Invited",
          "value": "getAllInvited",
          "action": "Get many invited projects",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.invited_projects"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/invited-projects",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many invited projects"
        },
        {
          "name": "Get Many Owned",
          "value": "getAllOwned",
          "action": "Get many owned projects",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.projects"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/projects",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many owned projects"
        },
        {
          "name": "Get Many Projects Workers",
          "value": "getAllProjectWorkers",
          "action": "Get many project workers",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.workers"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/workers",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          }
        },
        {
          "name": "Get Many Template",
          "value": "getAllTemplate",
          "action": "Get many template projects",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.template_projects"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/template-projects",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many template projects"
        },
        {
          "name": "Get Users Projects",
          "value": "getUsersProjects",
          "action": "Get all users projects",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.projects"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/user/{{$parameter[\"userId\"]}}/all-projects",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get all users projects"
        },
        {
          "name": "Remove Workers",
          "value": "removeWorkers",
          "action": "Remove workers from project",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/remove-workers/by-ids",
              "method": "POST"
            }
          },
          "description": "Remove workers from project"
        },
        {
          "name": "Remove Workers By Email",
          "value": "removeWorkersByEmail",
          "action": "Remove workers from project by email",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/remove-workers/by-emails",
              "method": "POST"
            }
          },
          "description": "Remove workers from project by email"
        }
      ],
      "displayName": "Project",
      "displayOptions": {
        "show": {
          "resource": [
            "Project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Activate",
          "value": "activateTask",
          "action": "Activate task",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/activate",
              "method": "POST"
            }
          },
          "description": "Activate task"
        },
        {
          "name": "Create",
          "value": "createTask",
          "action": "Create task",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/tasklist/{{$parameter[\"TaskListId\"]}}/tasks",
              "method": "POST"
            }
          },
          "description": "Create Task"
        },
        {
          "name": "Create Public Link",
          "value": "createPublicLink",
          "action": "Create public link",
          "routing": {
            "request": {
              "url": "=/public-link/task/{{$parameter[\"TaskId\"]}}",
              "method": "GET"
            }
          },
          "description": "Create public link for task"
        },
        {
          "name": "Create Task Description",
          "value": "createTaskDescription",
          "action": "Create task description",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/description",
              "method": "POST"
            }
          }
        },
        {
          "name": "Create Task Reminder",
          "value": "createTaskReminder",
          "action": "Create task reminder",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/reminder",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "deleteTask",
          "action": "Delete task",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete task"
        },
        {
          "name": "Delete Public Link",
          "value": "deletePublicLink",
          "action": "Delete public link",
          "routing": {
            "request": {
              "url": "=/public-link/task/{{$parameter[\"TaskId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete public link for task"
        },
        {
          "name": "Delete Task Reminder",
          "value": "deleteTaskReminder",
          "action": "Delete task reminder",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/reminder",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Delete Total Time Estimate",
          "value": "deleteTotalTimeEstimate",
          "action": "Delete total time estimate",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/total-time-estimate",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Delete User Time Estimate",
          "value": "deleteUserTimeEstimate",
          "action": "Delete user time estimate",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/users-time-estimates/{{$parameter[\"userId\"]}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Edit",
          "value": "editTask",
          "action": "Edit task",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}",
              "method": "POST"
            }
          },
          "description": "Edit task"
        },
        {
          "name": "Finish",
          "value": "finishTask",
          "action": "Finish task",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/finish",
              "method": "POST"
            }
          },
          "description": "Finish task"
        },
        {
          "name": "Get Finished Tasks",
          "value": "finishedTasks",
          "action": "Finished tasks in task list",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.finished_tasks"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/tasklist/{{$parameter[\"TaskListId\"]}}/finished-tasks",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get freelo tasks",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.tasks"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/all-tasks",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get freelo tasks"
        },
        {
          "name": "Get Task",
          "value": "getTask",
          "action": "Get task detail info",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Task Description",
          "value": "getTaskDescription",
          "action": "Get task description",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/description",
              "method": "GET"
            }
          }
        },
        {
          "name": "Move Task",
          "value": "moveTask",
          "action": "Move task to task list",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/move/{{$parameter[\"TaskListId\"]}}",
              "method": "POST"
            }
          }
        },
        {
          "name": "Set Total Time Estimate",
          "value": "setTotalTimeEstimate",
          "action": "Set total time estimate",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/total-time-estimate",
              "method": "POST"
            }
          }
        },
        {
          "name": "Set User Time Estimate",
          "value": "setUserTimeEstimate",
          "action": "Set user time estimate",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/users-time-estimates/{{$parameter[\"userId\"]}}",
              "method": "POST"
            }
          }
        },
        {
          "name": "Tasks In Task List",
          "value": "tasksInTaskList",
          "action": "Tasks in task list",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/tasklist/{{$parameter[\"TaskListId\"]}}/tasks",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Task",
      "displayOptions": {
        "show": {
          "resource": [
            "Task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAvailableLabels",
      "options": [
        {
          "name": "Add Label",
          "value": "addLabelToProject",
          "action": "Add label to project",
          "routing": {
            "request": {
              "url": "=/project-labels/add-to-project/{{$parameter[\"projectId\"]}}",
              "method": "POST"
            }
          },
          "description": "Add label to project"
        },
        {
          "name": "Delete",
          "value": "deleteLabel",
          "action": "Delete label",
          "routing": {
            "request": {
              "url": "=/project-labels/{{$parameter[\"labelId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete label"
        },
        {
          "name": "Edit",
          "value": "editLabel",
          "action": "Edit label",
          "routing": {
            "request": {
              "url": "=/project-labels/{{$parameter[\"labelId\"]}}",
              "method": "POST"
            }
          },
          "description": "Edit label"
        },
        {
          "name": "Get Many",
          "value": "getAvailableLabels",
          "action": "Get all available labels",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "labels"
                  }
                }
              ]
            },
            "request": {
              "url": "=/project-labels/find-available",
              "method": "GET"
            }
          },
          "description": "Get all available labels"
        },
        {
          "name": "Remove",
          "value": "removeLabel",
          "action": "Remove label from project",
          "routing": {
            "send": {
              "type": "body",
              "value": "={{$parameter[\"labelId\"]}}",
              "property": "id"
            },
            "request": {
              "url": "=/project-labels/remove-from-project/{{$parameter[\"projectId\"]}}",
              "method": "POST"
            }
          },
          "description": "Remove Label From Projects"
        }
      ],
      "displayName": "Project Label",
      "displayOptions": {
        "show": {
          "resource": [
            "ProjectLabel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Delete",
          "value": "deletePin",
          "action": "Delete pin from project",
          "routing": {
            "request": {
              "url": "=/pinned-item/{{$parameter[\"pinItemId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete pin from project"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many pinned items",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/pinned-items",
              "method": "GET"
            }
          },
          "description": "Get many pinned items"
        },
        {
          "name": "Pin",
          "value": "pinItem",
          "action": "Pin item into project",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/pinned-items",
              "method": "POST"
            }
          },
          "description": "Pin item into project"
        }
      ],
      "displayName": "Pinned Item",
      "displayOptions": {
        "show": {
          "resource": [
            "PinnedItem"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "createTaskList",
          "action": "Create task list",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/tasklists",
              "method": "POST"
            }
          },
          "description": "Create task list"
        },
        {
          "name": "Create From Template",
          "value": "createTaskListFromTemplate",
          "action": "Create task list from template",
          "routing": {
            "request": {
              "url": "=/tasklist/create-from-template/{{$parameter[\"TemplateId\"]}}",
              "method": "POST"
            }
          },
          "description": "Create task list from template"
        },
        {
          "name": "Get All TaskLists Workers",
          "value": "getTaskListWorkers",
          "action": "Get all task list workers",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/tasklist/{{$parameter[\"TaskListId\"]}}/assignable-workers",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many task lists",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.tasklists"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/all-tasklists",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many task lists"
        },
        {
          "name": "Get TaskLists Details",
          "value": "getTaskListDetails",
          "action": "Get details for task list",
          "routing": {
            "request": {
              "url": "=/tasklist/{{$parameter[\"TaskListId\"]}}",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Task List",
      "displayOptions": {
        "show": {
          "resource": [
            "TaskList"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "createSubTask",
          "action": "Create sub task",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/subtasks",
              "method": "POST"
            }
          },
          "description": "Create SubTask"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many sub tasks",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.subtasks"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/subtasks",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many sub tasks"
        }
      ],
      "displayName": "Sub Task",
      "displayOptions": {
        "show": {
          "resource": [
            "SubTask"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createTaskLabel",
      "options": [
        {
          "name": "Add",
          "value": "addLabelToTask",
          "action": "Add label to task",
          "routing": {
            "request": {
              "url": "=/task-labels/add-to-task/{{$parameter[\"TaskId\"]}}",
              "method": "POST"
            }
          },
          "description": "Add label to task"
        },
        {
          "name": "Create",
          "value": "createTaskLabel",
          "action": "Create task label",
          "routing": {
            "request": {
              "url": "=/task-labels",
              "method": "POST"
            }
          },
          "description": "Create label"
        },
        {
          "name": "Remove",
          "value": "removeLabelFromTask",
          "action": "Remove label from task",
          "routing": {
            "request": {
              "url": "=/task-labels/remove-from-task/{{$parameter[\"TaskId\"]}}",
              "method": "POST"
            }
          },
          "description": "Remove label from task"
        }
      ],
      "displayName": "Task Label",
      "displayOptions": {
        "show": {
          "resource": [
            "TaskLabel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "start",
      "options": [
        {
          "name": "Edit",
          "value": "edit",
          "action": "Edit time tracking",
          "routing": {
            "request": {
              "url": "=/timetracking/edit",
              "method": "POST"
            }
          },
          "description": "Edit time tracking"
        },
        {
          "name": "Start",
          "value": "start",
          "action": "Start time tracking",
          "routing": {
            "request": {
              "url": "=/timetracking/start",
              "method": "POST"
            }
          },
          "description": "Start time tracking"
        },
        {
          "name": "Stop",
          "value": "stop",
          "action": "Stop time tracking",
          "routing": {
            "request": {
              "url": "=/timetracking/stop",
              "method": "POST"
            }
          },
          "description": "Stop time tracking"
        }
      ],
      "displayName": "Time Tracking",
      "displayOptions": {
        "show": {
          "resource": [
            "TimeTracking"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Disable Out Of Office",
          "value": "disableOutOfOffice",
          "action": "Disable out of office",
          "routing": {
            "request": {
              "url": "=/user/{{$parameter[\"userId\"]}}/out-of-office",
              "method": "DELETE"
            }
          },
          "description": "Disable when user is out of office"
        },
        {
          "name": "Enable Out Of Office",
          "value": "enableOutOfOffice",
          "action": "Enable out of office",
          "routing": {
            "request": {
              "url": "=/user/{{$parameter[\"userId\"]}}/out-of-office",
              "method": "POST"
            }
          },
          "description": "Set when user is out of office"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many users",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.users"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/users",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get users (Coworkers)"
        },
        {
          "name": "Get Many Who Promoted Me",
          "value": "getAllWhoPromotedMe",
          "action": "Get users who promoted me as project manager",
          "routing": {
            "request": {
              "url": "=/users/project-manager-of",
              "method": "GET"
            }
          },
          "description": "Get users who promoted me as project manager"
        },
        {
          "name": "Get Out Of Office",
          "value": "getOutOfOffice",
          "action": "Get out of office",
          "routing": {
            "request": {
              "url": "=/user/{{$parameter[\"userId\"]}}/out-of-office",
              "method": "GET"
            }
          },
          "description": "Get when user is out of office"
        },
        {
          "name": "Invite Users By Emails or IDs",
          "value": "inviteByEmailsIds",
          "action": "Invite users by emails or ids",
          "routing": {
            "request": {
              "url": "=/users/manage-workers",
              "method": "POST"
            }
          },
          "description": "Invite users to the project by emails or IDs"
        }
      ],
      "displayName": "User",
      "displayOptions": {
        "show": {
          "resource": [
            "User"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "createWorkReport",
          "action": "Create work report",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/work-reports",
              "method": "POST"
            }
          },
          "description": "Create work report"
        },
        {
          "name": "Delete",
          "value": "deleteWorkReport",
          "action": "Delete work report",
          "routing": {
            "request": {
              "url": "=/work-reports/{{$parameter[\"WorkReportId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete work report"
        },
        {
          "name": "Edit",
          "value": "editWorkReport",
          "action": "Edit work report",
          "routing": {
            "request": {
              "url": "=/work-reports/{{$parameter[\"WorkReportId\"]}}",
              "method": "POST"
            }
          },
          "description": "Edit work report"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a work report",
          "routing": {
            "request": {
              "url": "=/work-reports/{{$parameter[\"WorkReportId\"]}}",
              "method": "GET"
            }
          },
          "description": "Get a single work report by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many work reports",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.reports"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/work-reports",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many work reports"
        }
      ],
      "displayName": "Work Report",
      "displayOptions": {
        "show": {
          "resource": [
            "WorkReport"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many states",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "states"
                  }
                }
              ]
            },
            "request": {
              "url": "=/states",
              "method": "GET"
            }
          },
          "description": "Get many states"
        }
      ],
      "displayName": "States",
      "displayOptions": {
        "show": {
          "resource": [
            "State"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many notifications",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.notifications"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/all-notifications",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many notifications"
        },
        {
          "name": "Mark As Read",
          "value": "markAsRead",
          "action": "Mark as read",
          "routing": {
            "request": {
              "url": "=/notification/{{$parameter[\"notificationId\"]}}/mark-as-read",
              "method": "POST"
            }
          },
          "description": "Mark notification as read"
        },
        {
          "name": "Mark As Unread",
          "value": "markAsUnread",
          "action": "Mark as unread",
          "routing": {
            "request": {
              "url": "=/notification/{{$parameter[\"notificationId\"]}}/mark-as-unread",
              "method": "POST"
            }
          },
          "description": "Mark notification as unread"
        }
      ],
      "displayName": "Notification",
      "displayOptions": {
        "show": {
          "resource": [
            "Notification"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createNote",
      "options": [
        {
          "name": "Create",
          "value": "createNote",
          "action": "Create new note",
          "routing": {
            "request": {
              "url": "=/project/{{$parameter[\"projectId\"]}}/note",
              "method": "POST"
            }
          },
          "description": "Create new note"
        },
        {
          "name": "Delete",
          "value": "deleteNote",
          "action": "Delete note",
          "routing": {
            "request": {
              "url": "=/note/{{$parameter[\"noteID\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete note"
        },
        {
          "name": "Edit",
          "value": "editNote",
          "action": "Edit note",
          "routing": {
            "request": {
              "url": "=/note/{{$parameter[\"noteID\"]}}",
              "method": "POST"
            }
          },
          "description": "Edit note"
        },
        {
          "name": "Get",
          "value": "getNote",
          "action": "Get note",
          "routing": {
            "request": {
              "url": "=/note/{{$parameter[\"noteID\"]}}",
              "method": "GET"
            }
          },
          "description": "Get note"
        }
      ],
      "displayName": "Note",
      "displayOptions": {
        "show": {
          "resource": [
            "Note"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get",
          "value": "getDetail",
          "action": "Get issued invoice detail",
          "routing": {
            "request": {
              "url": "=/issued-invoice/{{$parameter[\"InvoiceId\"]}}",
              "method": "GET"
            }
          },
          "description": "Get issued invoice detail"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many issued invoices",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.issued_invoices"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/issued-invoices",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many issued invoices"
        },
        {
          "name": "Mark As Invoiced",
          "value": "markAsInvoiced",
          "action": "Mark issued invoice as invoiced",
          "routing": {
            "request": {
              "url": "=/issued-invoice/{{$parameter[\"InvoiceId\"]}}/mark-as-invoiced",
              "method": "POST"
            }
          },
          "description": "Mark issued invoice as invoiced"
        }
      ],
      "displayName": "Invoicing",
      "displayOptions": {
        "show": {
          "resource": [
            "Invoice"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.items"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/all-docs-and-files",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many directory, link, file, or document"
        }
      ],
      "displayName": "File",
      "displayOptions": {
        "show": {
          "resource": [
            "File"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many events",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.events"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/events",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          },
          "description": "Get many events"
        }
      ],
      "displayName": "Event",
      "displayOptions": {
        "show": {
          "resource": [
            "Event"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Add or Edit Value",
          "value": "addEditValue",
          "action": "Add or edit value",
          "routing": {
            "request": {
              "url": "=/custom-field/add-or-edit-value",
              "method": "POST"
            }
          }
        },
        {
          "name": "Create",
          "value": "createCustomField",
          "action": "Create custom field",
          "routing": {
            "request": {
              "url": "=/custom-field/create/{{$parameter[\"projectId\"]}}",
              "method": "POST"
            }
          },
          "description": "Create custom field"
        },
        {
          "name": "Create Enum Option",
          "value": "createEnumOption",
          "action": "Create enum option",
          "routing": {
            "request": {
              "url": "=/custom-field-enum/create/{{$parameter[\"CustomFieldId\"]}}",
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "deleteCustomField",
          "action": "Delete custom field",
          "routing": {
            "request": {
              "url": "=/custom-field/delete/{{$parameter[\"CustomFieldId\"]}}",
              "method": "DELETE"
            }
          },
          "description": "Delete custom field"
        },
        {
          "name": "Delete Enum Option",
          "value": "deleteEnumOption",
          "action": "Delete enum option",
          "routing": {
            "request": {
              "url": "=/custom-field-enum/delete/{{$parameter[\"CustomFieldEnumUUID\"]}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Delete Value",
          "value": "deleteValue",
          "action": "Delete value",
          "routing": {
            "request": {
              "url": "=/custom-field/delete-value/{{$parameter[\"CustomFieldValueId\"]}}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Edit Enum Option",
          "value": "editEnumOption",
          "action": "Edit enum option",
          "routing": {
            "request": {
              "url": "=/custom-field-enum/change/{{$parameter[\"CustomFieldEnumUUID\"]}}",
              "method": "POST"
            }
          }
        },
        {
          "name": "Get Enums Options",
          "value": "getEnumsOptions",
          "action": "Get enums options on custom field",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "custom_field_types"
                  }
                }
              ]
            },
            "request": {
              "url": "=/custom-field-enum/get-for-custom-field/{{$parameter[\"CustomFieldId\"]}}",
              "method": "GET"
            }
          },
          "description": "Get enums options on custom field"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many custom fields types",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "custom_field_types"
                  }
                }
              ]
            },
            "request": {
              "url": "=/custom-field/get-types",
              "method": "GET"
            }
          },
          "description": "Get many custom fields types"
        },
        {
          "name": "Get Many On Project",
          "value": "getAllOnProject",
          "action": "Get many custom fields of project",
          "routing": {
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "custom_fields"
                  }
                }
              ]
            },
            "request": {
              "url": "=/custom-field/find-by-project/{{$parameter[\"projectId\"]}}",
              "method": "GET"
            }
          },
          "description": "Get many custom fields of project"
        },
        {
          "name": "Rename",
          "value": "renameCustomField",
          "action": "Rename custom field",
          "routing": {
            "request": {
              "url": "=/custom-field/rename/{{$parameter[\"CustomFieldId\"]}}",
              "method": "POST"
            }
          },
          "description": "Rename custom field"
        },
        {
          "name": "Restore",
          "value": "restoreCustomField",
          "action": "Restore custom field",
          "routing": {
            "request": {
              "url": "=/custom-field/restore/{{$parameter[\"CustomFieldId\"]}}",
              "method": "POST"
            }
          },
          "description": "Restore custom field"
        }
      ],
      "displayName": "Custom Field",
      "displayOptions": {
        "show": {
          "resource": [
            "CustomField"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "createComment",
          "action": "Create comment",
          "routing": {
            "request": {
              "url": "=/task/{{$parameter[\"TaskId\"]}}/comments",
              "method": "POST"
            }
          },
          "description": "Create comment"
        },
        {
          "name": "Edit",
          "value": "editComment",
          "action": "Edit comment",
          "routing": {
            "request": {
              "url": "=/comment/{{$parameter[\"commentId\"]}}",
              "method": "POST"
            }
          },
          "description": "Edit comment"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many comments",
          "routing": {
            "send": {
              "preSend": [
                null
              ],
              "paginate": true
            },
            "output": {
              "postReceive": [
                {
                  "type": "rootProperty",
                  "properties": {
                    "property": "data.comments"
                  }
                },
                null
              ]
            },
            "request": {
              "url": "=/all-comments",
              "method": "GET"
            },
            "operations": {
              "pagination": {
                "type": "generic",
                "properties": {
                  "request": {
                    "qs": {
                      "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                    }
                  },
                  "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
                }
              }
            }
          }
        }
      ],
      "displayName": "Comment",
      "displayOptions": {
        "show": {
          "resource": [
            "Comment"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Activate",
      "value": "activateProject",
      "action": "Activate project",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/activate",
          "method": "POST"
        }
      },
      "description": "Activate project",
      "resource": "Project"
    },
    {
      "name": "Archive",
      "value": "archiveProject",
      "action": "Archive project",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/archive",
          "method": "POST"
        }
      },
      "description": "Archive project",
      "resource": "Project"
    },
    {
      "name": "Create",
      "value": "createProject",
      "action": "Create project",
      "routing": {
        "request": {
          "url": "=/projects",
          "method": "POST"
        }
      },
      "description": "Create project",
      "resource": "Project"
    },
    {
      "name": "Create From Template",
      "value": "createTemplateProject",
      "action": "Create project from template",
      "routing": {
        "request": {
          "url": "=/project/create-from-template/{{$parameter[\"projectId\"]}}",
          "method": "POST"
        }
      },
      "description": "Create project from template",
      "resource": "Project"
    },
    {
      "name": "Delete",
      "value": "deleteProject",
      "action": "Delete project",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete project",
      "resource": "Project"
    },
    {
      "name": "Get Details",
      "value": "getProject",
      "action": "Get project details",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}",
          "method": "GET"
        }
      },
      "resource": "Project"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many projects owned and invited",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.projects"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/all-projects",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many projects (owned and invited)",
      "resource": "Project"
    },
    {
      "name": "Get Many Archived",
      "value": "getAllArchived",
      "action": "Get many archived projects",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.archived_projects"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/archived-projects",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many archived projects",
      "resource": "Project"
    },
    {
      "name": "Get Many Invited",
      "value": "getAllInvited",
      "action": "Get many invited projects",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.invited_projects"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/invited-projects",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many invited projects",
      "resource": "Project"
    },
    {
      "name": "Get Many Owned",
      "value": "getAllOwned",
      "action": "Get many owned projects",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.projects"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/projects",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many owned projects",
      "resource": "Project"
    },
    {
      "name": "Get Many Projects Workers",
      "value": "getAllProjectWorkers",
      "action": "Get many project workers",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.workers"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/workers",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "resource": "Project"
    },
    {
      "name": "Get Many Template",
      "value": "getAllTemplate",
      "action": "Get many template projects",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.template_projects"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/template-projects",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many template projects",
      "resource": "Project"
    },
    {
      "name": "Get Users Projects",
      "value": "getUsersProjects",
      "action": "Get all users projects",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.projects"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/user/{{$parameter[\"userId\"]}}/all-projects",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get all users projects",
      "resource": "Project"
    },
    {
      "name": "Remove Workers",
      "value": "removeWorkers",
      "action": "Remove workers from project",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/remove-workers/by-ids",
          "method": "POST"
        }
      },
      "description": "Remove workers from project",
      "resource": "Project"
    },
    {
      "name": "Remove Workers By Email",
      "value": "removeWorkersByEmail",
      "action": "Remove workers from project by email",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/remove-workers/by-emails",
          "method": "POST"
        }
      },
      "description": "Remove workers from project by email",
      "resource": "Project"
    },
    {
      "name": "Activate",
      "value": "activateTask",
      "action": "Activate task",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/activate",
          "method": "POST"
        }
      },
      "description": "Activate task",
      "resource": "Task"
    },
    {
      "name": "Create",
      "value": "createTask",
      "action": "Create task",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/tasklist/{{$parameter[\"TaskListId\"]}}/tasks",
          "method": "POST"
        }
      },
      "description": "Create Task",
      "resource": "Task"
    },
    {
      "name": "Create Public Link",
      "value": "createPublicLink",
      "action": "Create public link",
      "routing": {
        "request": {
          "url": "=/public-link/task/{{$parameter[\"TaskId\"]}}",
          "method": "GET"
        }
      },
      "description": "Create public link for task",
      "resource": "Task"
    },
    {
      "name": "Create Task Description",
      "value": "createTaskDescription",
      "action": "Create task description",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/description",
          "method": "POST"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Create Task Reminder",
      "value": "createTaskReminder",
      "action": "Create task reminder",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/reminder",
          "method": "POST"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Delete",
      "value": "deleteTask",
      "action": "Delete task",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete task",
      "resource": "Task"
    },
    {
      "name": "Delete Public Link",
      "value": "deletePublicLink",
      "action": "Delete public link",
      "routing": {
        "request": {
          "url": "=/public-link/task/{{$parameter[\"TaskId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete public link for task",
      "resource": "Task"
    },
    {
      "name": "Delete Task Reminder",
      "value": "deleteTaskReminder",
      "action": "Delete task reminder",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/reminder",
          "method": "DELETE"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Delete Total Time Estimate",
      "value": "deleteTotalTimeEstimate",
      "action": "Delete total time estimate",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/total-time-estimate",
          "method": "DELETE"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Delete User Time Estimate",
      "value": "deleteUserTimeEstimate",
      "action": "Delete user time estimate",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/users-time-estimates/{{$parameter[\"userId\"]}}",
          "method": "DELETE"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Edit",
      "value": "editTask",
      "action": "Edit task",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}",
          "method": "POST"
        }
      },
      "description": "Edit task",
      "resource": "Task"
    },
    {
      "name": "Finish",
      "value": "finishTask",
      "action": "Finish task",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/finish",
          "method": "POST"
        }
      },
      "description": "Finish task",
      "resource": "Task"
    },
    {
      "name": "Get Finished Tasks",
      "value": "finishedTasks",
      "action": "Finished tasks in task list",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.finished_tasks"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/tasklist/{{$parameter[\"TaskListId\"]}}/finished-tasks",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "resource": "Task"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get freelo tasks",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.tasks"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/all-tasks",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get freelo tasks",
      "resource": "Task"
    },
    {
      "name": "Get Task",
      "value": "getTask",
      "action": "Get task detail info",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}",
          "method": "GET"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Get Task Description",
      "value": "getTaskDescription",
      "action": "Get task description",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/description",
          "method": "GET"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Move Task",
      "value": "moveTask",
      "action": "Move task to task list",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/move/{{$parameter[\"TaskListId\"]}}",
          "method": "POST"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Set Total Time Estimate",
      "value": "setTotalTimeEstimate",
      "action": "Set total time estimate",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/total-time-estimate",
          "method": "POST"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Set User Time Estimate",
      "value": "setUserTimeEstimate",
      "action": "Set user time estimate",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/users-time-estimates/{{$parameter[\"userId\"]}}",
          "method": "POST"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Tasks In Task List",
      "value": "tasksInTaskList",
      "action": "Tasks in task list",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/tasklist/{{$parameter[\"TaskListId\"]}}/tasks",
          "method": "GET"
        }
      },
      "resource": "Task"
    },
    {
      "name": "Add Label",
      "value": "addLabelToProject",
      "action": "Add label to project",
      "routing": {
        "request": {
          "url": "=/project-labels/add-to-project/{{$parameter[\"projectId\"]}}",
          "method": "POST"
        }
      },
      "description": "Add label to project",
      "resource": "ProjectLabel"
    },
    {
      "name": "Delete",
      "value": "deleteLabel",
      "action": "Delete label",
      "routing": {
        "request": {
          "url": "=/project-labels/{{$parameter[\"labelId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete label",
      "resource": "ProjectLabel"
    },
    {
      "name": "Edit",
      "value": "editLabel",
      "action": "Edit label",
      "routing": {
        "request": {
          "url": "=/project-labels/{{$parameter[\"labelId\"]}}",
          "method": "POST"
        }
      },
      "description": "Edit label",
      "resource": "ProjectLabel"
    },
    {
      "name": "Get Many",
      "value": "getAvailableLabels",
      "action": "Get all available labels",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "labels"
              }
            }
          ]
        },
        "request": {
          "url": "=/project-labels/find-available",
          "method": "GET"
        }
      },
      "description": "Get all available labels",
      "resource": "ProjectLabel"
    },
    {
      "name": "Remove",
      "value": "removeLabel",
      "action": "Remove label from project",
      "routing": {
        "send": {
          "type": "body",
          "value": "={{$parameter[\"labelId\"]}}",
          "property": "id"
        },
        "request": {
          "url": "=/project-labels/remove-from-project/{{$parameter[\"projectId\"]}}",
          "method": "POST"
        }
      },
      "description": "Remove Label From Projects",
      "resource": "ProjectLabel"
    },
    {
      "name": "Delete",
      "value": "deletePin",
      "action": "Delete pin from project",
      "routing": {
        "request": {
          "url": "=/pinned-item/{{$parameter[\"pinItemId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete pin from project",
      "resource": "PinnedItem"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many pinned items",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/pinned-items",
          "method": "GET"
        }
      },
      "description": "Get many pinned items",
      "resource": "PinnedItem"
    },
    {
      "name": "Pin",
      "value": "pinItem",
      "action": "Pin item into project",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/pinned-items",
          "method": "POST"
        }
      },
      "description": "Pin item into project",
      "resource": "PinnedItem"
    },
    {
      "name": "Create",
      "value": "createTaskList",
      "action": "Create task list",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/tasklists",
          "method": "POST"
        }
      },
      "description": "Create task list",
      "resource": "TaskList"
    },
    {
      "name": "Create From Template",
      "value": "createTaskListFromTemplate",
      "action": "Create task list from template",
      "routing": {
        "request": {
          "url": "=/tasklist/create-from-template/{{$parameter[\"TemplateId\"]}}",
          "method": "POST"
        }
      },
      "description": "Create task list from template",
      "resource": "TaskList"
    },
    {
      "name": "Get All TaskLists Workers",
      "value": "getTaskListWorkers",
      "action": "Get all task list workers",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/tasklist/{{$parameter[\"TaskListId\"]}}/assignable-workers",
          "method": "GET"
        }
      },
      "resource": "TaskList"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many task lists",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.tasklists"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/all-tasklists",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many task lists",
      "resource": "TaskList"
    },
    {
      "name": "Get TaskLists Details",
      "value": "getTaskListDetails",
      "action": "Get details for task list",
      "routing": {
        "request": {
          "url": "=/tasklist/{{$parameter[\"TaskListId\"]}}",
          "method": "GET"
        }
      },
      "resource": "TaskList"
    },
    {
      "name": "Create",
      "value": "createSubTask",
      "action": "Create sub task",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/subtasks",
          "method": "POST"
        }
      },
      "description": "Create SubTask",
      "resource": "SubTask"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many sub tasks",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.subtasks"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/subtasks",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many sub tasks",
      "resource": "SubTask"
    },
    {
      "name": "Add",
      "value": "addLabelToTask",
      "action": "Add label to task",
      "routing": {
        "request": {
          "url": "=/task-labels/add-to-task/{{$parameter[\"TaskId\"]}}",
          "method": "POST"
        }
      },
      "description": "Add label to task",
      "resource": "TaskLabel"
    },
    {
      "name": "Create",
      "value": "createTaskLabel",
      "action": "Create task label",
      "routing": {
        "request": {
          "url": "=/task-labels",
          "method": "POST"
        }
      },
      "description": "Create label",
      "resource": "TaskLabel"
    },
    {
      "name": "Remove",
      "value": "removeLabelFromTask",
      "action": "Remove label from task",
      "routing": {
        "request": {
          "url": "=/task-labels/remove-from-task/{{$parameter[\"TaskId\"]}}",
          "method": "POST"
        }
      },
      "description": "Remove label from task",
      "resource": "TaskLabel"
    },
    {
      "name": "Edit",
      "value": "edit",
      "action": "Edit time tracking",
      "routing": {
        "request": {
          "url": "=/timetracking/edit",
          "method": "POST"
        }
      },
      "description": "Edit time tracking",
      "resource": "TimeTracking"
    },
    {
      "name": "Start",
      "value": "start",
      "action": "Start time tracking",
      "routing": {
        "request": {
          "url": "=/timetracking/start",
          "method": "POST"
        }
      },
      "description": "Start time tracking",
      "resource": "TimeTracking"
    },
    {
      "name": "Stop",
      "value": "stop",
      "action": "Stop time tracking",
      "routing": {
        "request": {
          "url": "=/timetracking/stop",
          "method": "POST"
        }
      },
      "description": "Stop time tracking",
      "resource": "TimeTracking"
    },
    {
      "name": "Disable Out Of Office",
      "value": "disableOutOfOffice",
      "action": "Disable out of office",
      "routing": {
        "request": {
          "url": "=/user/{{$parameter[\"userId\"]}}/out-of-office",
          "method": "DELETE"
        }
      },
      "description": "Disable when user is out of office",
      "resource": "User"
    },
    {
      "name": "Enable Out Of Office",
      "value": "enableOutOfOffice",
      "action": "Enable out of office",
      "routing": {
        "request": {
          "url": "=/user/{{$parameter[\"userId\"]}}/out-of-office",
          "method": "POST"
        }
      },
      "description": "Set when user is out of office",
      "resource": "User"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many users",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.users"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/users",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get users (Coworkers)",
      "resource": "User"
    },
    {
      "name": "Get Many Who Promoted Me",
      "value": "getAllWhoPromotedMe",
      "action": "Get users who promoted me as project manager",
      "routing": {
        "request": {
          "url": "=/users/project-manager-of",
          "method": "GET"
        }
      },
      "description": "Get users who promoted me as project manager",
      "resource": "User"
    },
    {
      "name": "Get Out Of Office",
      "value": "getOutOfOffice",
      "action": "Get out of office",
      "routing": {
        "request": {
          "url": "=/user/{{$parameter[\"userId\"]}}/out-of-office",
          "method": "GET"
        }
      },
      "description": "Get when user is out of office",
      "resource": "User"
    },
    {
      "name": "Invite Users By Emails or IDs",
      "value": "inviteByEmailsIds",
      "action": "Invite users by emails or ids",
      "routing": {
        "request": {
          "url": "=/users/manage-workers",
          "method": "POST"
        }
      },
      "description": "Invite users to the project by emails or IDs",
      "resource": "User"
    },
    {
      "name": "Create",
      "value": "createWorkReport",
      "action": "Create work report",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/work-reports",
          "method": "POST"
        }
      },
      "description": "Create work report",
      "resource": "WorkReport"
    },
    {
      "name": "Delete",
      "value": "deleteWorkReport",
      "action": "Delete work report",
      "routing": {
        "request": {
          "url": "=/work-reports/{{$parameter[\"WorkReportId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete work report",
      "resource": "WorkReport"
    },
    {
      "name": "Edit",
      "value": "editWorkReport",
      "action": "Edit work report",
      "routing": {
        "request": {
          "url": "=/work-reports/{{$parameter[\"WorkReportId\"]}}",
          "method": "POST"
        }
      },
      "description": "Edit work report",
      "resource": "WorkReport"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a work report",
      "routing": {
        "request": {
          "url": "=/work-reports/{{$parameter[\"WorkReportId\"]}}",
          "method": "GET"
        }
      },
      "description": "Get a single work report by ID",
      "resource": "WorkReport"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many work reports",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.reports"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/work-reports",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many work reports",
      "resource": "WorkReport"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many states",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "states"
              }
            }
          ]
        },
        "request": {
          "url": "=/states",
          "method": "GET"
        }
      },
      "description": "Get many states",
      "resource": "State"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many notifications",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.notifications"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/all-notifications",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many notifications",
      "resource": "Notification"
    },
    {
      "name": "Mark As Read",
      "value": "markAsRead",
      "action": "Mark as read",
      "routing": {
        "request": {
          "url": "=/notification/{{$parameter[\"notificationId\"]}}/mark-as-read",
          "method": "POST"
        }
      },
      "description": "Mark notification as read",
      "resource": "Notification"
    },
    {
      "name": "Mark As Unread",
      "value": "markAsUnread",
      "action": "Mark as unread",
      "routing": {
        "request": {
          "url": "=/notification/{{$parameter[\"notificationId\"]}}/mark-as-unread",
          "method": "POST"
        }
      },
      "description": "Mark notification as unread",
      "resource": "Notification"
    },
    {
      "name": "Create",
      "value": "createNote",
      "action": "Create new note",
      "routing": {
        "request": {
          "url": "=/project/{{$parameter[\"projectId\"]}}/note",
          "method": "POST"
        }
      },
      "description": "Create new note",
      "resource": "Note"
    },
    {
      "name": "Delete",
      "value": "deleteNote",
      "action": "Delete note",
      "routing": {
        "request": {
          "url": "=/note/{{$parameter[\"noteID\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete note",
      "resource": "Note"
    },
    {
      "name": "Edit",
      "value": "editNote",
      "action": "Edit note",
      "routing": {
        "request": {
          "url": "=/note/{{$parameter[\"noteID\"]}}",
          "method": "POST"
        }
      },
      "description": "Edit note",
      "resource": "Note"
    },
    {
      "name": "Get",
      "value": "getNote",
      "action": "Get note",
      "routing": {
        "request": {
          "url": "=/note/{{$parameter[\"noteID\"]}}",
          "method": "GET"
        }
      },
      "description": "Get note",
      "resource": "Note"
    },
    {
      "name": "Get",
      "value": "getDetail",
      "action": "Get issued invoice detail",
      "routing": {
        "request": {
          "url": "=/issued-invoice/{{$parameter[\"InvoiceId\"]}}",
          "method": "GET"
        }
      },
      "description": "Get issued invoice detail",
      "resource": "Invoice"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many issued invoices",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.issued_invoices"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/issued-invoices",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many issued invoices",
      "resource": "Invoice"
    },
    {
      "name": "Mark As Invoiced",
      "value": "markAsInvoiced",
      "action": "Mark issued invoice as invoiced",
      "routing": {
        "request": {
          "url": "=/issued-invoice/{{$parameter[\"InvoiceId\"]}}/mark-as-invoiced",
          "method": "POST"
        }
      },
      "description": "Mark issued invoice as invoiced",
      "resource": "Invoice"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.items"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/all-docs-and-files",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many directory, link, file, or document",
      "resource": "File"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many events",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.events"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/events",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "description": "Get many events",
      "resource": "Event"
    },
    {
      "name": "Add or Edit Value",
      "value": "addEditValue",
      "action": "Add or edit value",
      "routing": {
        "request": {
          "url": "=/custom-field/add-or-edit-value",
          "method": "POST"
        }
      },
      "resource": "CustomField"
    },
    {
      "name": "Create",
      "value": "createCustomField",
      "action": "Create custom field",
      "routing": {
        "request": {
          "url": "=/custom-field/create/{{$parameter[\"projectId\"]}}",
          "method": "POST"
        }
      },
      "description": "Create custom field",
      "resource": "CustomField"
    },
    {
      "name": "Create Enum Option",
      "value": "createEnumOption",
      "action": "Create enum option",
      "routing": {
        "request": {
          "url": "=/custom-field-enum/create/{{$parameter[\"CustomFieldId\"]}}",
          "method": "POST"
        }
      },
      "resource": "CustomField"
    },
    {
      "name": "Delete",
      "value": "deleteCustomField",
      "action": "Delete custom field",
      "routing": {
        "request": {
          "url": "=/custom-field/delete/{{$parameter[\"CustomFieldId\"]}}",
          "method": "DELETE"
        }
      },
      "description": "Delete custom field",
      "resource": "CustomField"
    },
    {
      "name": "Delete Enum Option",
      "value": "deleteEnumOption",
      "action": "Delete enum option",
      "routing": {
        "request": {
          "url": "=/custom-field-enum/delete/{{$parameter[\"CustomFieldEnumUUID\"]}}",
          "method": "DELETE"
        }
      },
      "resource": "CustomField"
    },
    {
      "name": "Delete Value",
      "value": "deleteValue",
      "action": "Delete value",
      "routing": {
        "request": {
          "url": "=/custom-field/delete-value/{{$parameter[\"CustomFieldValueId\"]}}",
          "method": "DELETE"
        }
      },
      "resource": "CustomField"
    },
    {
      "name": "Edit Enum Option",
      "value": "editEnumOption",
      "action": "Edit enum option",
      "routing": {
        "request": {
          "url": "=/custom-field-enum/change/{{$parameter[\"CustomFieldEnumUUID\"]}}",
          "method": "POST"
        }
      },
      "resource": "CustomField"
    },
    {
      "name": "Get Enums Options",
      "value": "getEnumsOptions",
      "action": "Get enums options on custom field",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "custom_field_types"
              }
            }
          ]
        },
        "request": {
          "url": "=/custom-field-enum/get-for-custom-field/{{$parameter[\"CustomFieldId\"]}}",
          "method": "GET"
        }
      },
      "description": "Get enums options on custom field",
      "resource": "CustomField"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many custom fields types",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "custom_field_types"
              }
            }
          ]
        },
        "request": {
          "url": "=/custom-field/get-types",
          "method": "GET"
        }
      },
      "description": "Get many custom fields types",
      "resource": "CustomField"
    },
    {
      "name": "Get Many On Project",
      "value": "getAllOnProject",
      "action": "Get many custom fields of project",
      "routing": {
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "custom_fields"
              }
            }
          ]
        },
        "request": {
          "url": "=/custom-field/find-by-project/{{$parameter[\"projectId\"]}}",
          "method": "GET"
        }
      },
      "description": "Get many custom fields of project",
      "resource": "CustomField"
    },
    {
      "name": "Rename",
      "value": "renameCustomField",
      "action": "Rename custom field",
      "routing": {
        "request": {
          "url": "=/custom-field/rename/{{$parameter[\"CustomFieldId\"]}}",
          "method": "POST"
        }
      },
      "description": "Rename custom field",
      "resource": "CustomField"
    },
    {
      "name": "Restore",
      "value": "restoreCustomField",
      "action": "Restore custom field",
      "routing": {
        "request": {
          "url": "=/custom-field/restore/{{$parameter[\"CustomFieldId\"]}}",
          "method": "POST"
        }
      },
      "description": "Restore custom field",
      "resource": "CustomField"
    },
    {
      "name": "Create",
      "value": "createComment",
      "action": "Create comment",
      "routing": {
        "request": {
          "url": "=/task/{{$parameter[\"TaskId\"]}}/comments",
          "method": "POST"
        }
      },
      "description": "Create comment",
      "resource": "Comment"
    },
    {
      "name": "Edit",
      "value": "editComment",
      "action": "Edit comment",
      "routing": {
        "request": {
          "url": "=/comment/{{$parameter[\"commentId\"]}}",
          "method": "POST"
        }
      },
      "description": "Edit comment",
      "resource": "Comment"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many comments",
      "routing": {
        "send": {
          "preSend": [
            null
          ],
          "paginate": true
        },
        "output": {
          "postReceive": [
            {
              "type": "rootProperty",
              "properties": {
                "property": "data.comments"
              }
            },
            null
          ]
        },
        "request": {
          "url": "=/all-comments",
          "method": "GET"
        },
        "operations": {
          "pagination": {
            "type": "generic",
            "properties": {
              "request": {
                "qs": {
                  "p": "={{ $response?.body?.page != null ? $response.body.page + 1 : 0 }}"
                }
              },
              "continue": "={{ $response.body?.page != null && $response.body?.per_page != null && $response.body?.total != null &&\n                            ($response.body.page + 1) * $response.body.per_page < $response.body.total && ($parameter.returnAll ||\n                             ($response.body.page + 1) * $response.body.per_page < $parameter.limit) }}"
            }
          }
        }
      },
      "resource": "Comment"
    }
  ]

npm_readme:
  # n8n-nodes-freelo

  This is the official [Freelo](https://www.freelo.io) node for n8n. It lets you automate your project management workflows by connecting Freelo with hundreds of other apps and services.

  [Freelo](https://www.freelo.io) is a project management and team collaboration platform for managing projects, tasks, time tracking, and team communication.

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

  ## Table of Contents

  - [Installation](#installation)
  - [Credentials](#credentials)
  - [Operations](#operations)
  - [Example Workflows](#example-workflows)
  - [Resources](#resources)

  ## Installation

  ### n8n Marketplace (Recommended)

  If available, install directly from the n8n marketplace:

  1. Open your n8n instance
  2. Go to the **Nodes** panel and search for **Freelo**
  3. Click **Install**

  ### Community Nodes

  1. Go to **Settings > Community Nodes**
  2. Select **Install**
  3. Enter `n8n-nodes-freelo` in the **npm Package Name** field
  4. Agree to the risks and click **Install**

  ### Manual Installation

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

  Then restart n8n.

  ## Credentials

  You need a Freelo API key to authenticate:

  1. Log in to your [Freelo dashboard](https://app.freelo.io)
  2. Click on your avatar in the top-right corner → **Settings**
  3. Scroll to the bottom of the page to find the **API key** section
  4. Copy your unique API key

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

  > The Freelo API uses HTTP Basic Auth with your email as the username and your API key as the password.

  ## Operations

  This node features **90+ operations** covering the full Freelo API, including:

  ### Project
  - **Get All** – List all projects (own, invited, archived, templates)
  - **Get** – Get a single project by ID
  - **Create** – Create a new project
  - **Archive** – Archive a project

  ### To-Do List
  - **Get All** – List all to-do lists in a project
  - **Get** – Get a single to-do list
  - **Create** – Create a new to-do list in a project

  ### Task
  - **Get All** – List all tasks in a to-do list
  - **Get** – Get a single task by ID
  - **Create** – Create a new task or subtask
  - **Update** – Update task details (name, due date, assignee, priority)
  - **Delete** – Delete a task
  - **Move** – Move a task to another to-do list

  ### Comment
  - **Get All** – List all comments on a task
  - **Create** – Add a comment to a task

  ### Label
  - **Get All** – List all available labels
  - **Add** – Add a label to a task
  - **Remove** – Remove a label from a task

  ### User
  - **Get All** – List all project workers
  - **Invite** – Invite a user to a project
  - **Remove** – Remove a user from a project

  ### Work Report
  - **Get All** – List work reports for a task or project
  - **Create** – Log a time entry on a task

  …and many more. See the full list of operations directly in the n8n node editor.


  ## Example Workflows

  ### Sync new Freelo tasks to Google Sheets

  1. **Freelo: Get All Tasks** → fetch tasks from a project
  2. **Google Sheets: Append Row** → log task name, assignee, and due date

  ## Resources

  - [Freelo API Documentation](https://freelo.docs.apiary.io/)
  - [Freelo Help Center](https://help.freelo.io/en/)
  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)

ai_documentation_summary:
  {"purpose":"This n8n node enables automation of project management workflows by connecting with the Freelo platform for tasks, time tracking, and team collaboration.","capabilities":["List, retrieve, create, archive, and delete projects","Manage to-do lists (list, retrieve, create)","List, retrieve, create, update, delete, and move tasks","Create and retrieve comments on tasks","Manage labels (add/remove)","Invite and remove users from projects","List work reports and log time entries","Supports 90+ API operations"],"authentication":"API key required (HTTP Basic Auth with email as username and API key as password)","commonUseCases":["Sync Freelo tasks to Google Sheets","Automate project status updates","Track team workload and time entries","Automate task assignment and labeling"],"limitations":[],"relatedNodes":["Google Sheets: Append Row","Generic HTTP Request","Generic Webhook"]}


node_type: n8n-nodes-datagait.dataGait
package_name: n8n-nodes-datagait
display_name: DataGait
description: Scrape, crawl, and extract structured data from JavaScript-heavy websites using DataGait API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: datagait26
author_github_url: https://github.com/datagaitos/
npm_package_name: n8n-nodes-datagait
npm_version: 1.1.8
community_fetched_at: 2026-07-14T14:40:34.218Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "extract",
      "options": [
        {
          "name": "Crawl Site",
          "value": "crawl",
          "action": "Crawl multiple pages from a site",
          "description": "Crawl multiple pages from a site with intelligent extraction via SSE streaming"
        },
        {
          "name": "Extract Page",
          "value": "extract",
          "action": "Extract content from a webpage",
          "description": "Extract content from a webpage with full JavaScript rendering"
        },
        {
          "name": "Health Check",
          "value": "health",
          "action": "Check API health status",
          "description": "Check DataGait API availability and response time"
        },
        {
          "name": "Scrape Links",
          "value": "scrapeLinks",
          "action": "Scrape all links from a URL",
          "description": "Extract all links from a webpage with resolved absolute URLs"
        },
        {
          "name": "Scrape Metadata",
          "value": "scrapeMeta",
          "action": "Scrape metadata from a URL",
          "description": "Extract meta tags, Open Graph, Twitter Cards, and JSON-LD structured data"
        },
        {
          "name": "Scrape Text",
          "value": "scrapeText",
          "action": "Scrape text content from a URL",
          "description": "Extract clean text content from a URL, ideal for LLM and AI pipelines"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Crawl Site",
      "value": "crawl",
      "action": "Crawl multiple pages from a site",
      "description": "Crawl multiple pages from a site with intelligent extraction via SSE streaming"
    },
    {
      "name": "Extract Page",
      "value": "extract",
      "action": "Extract content from a webpage",
      "description": "Extract content from a webpage with full JavaScript rendering"
    },
    {
      "name": "Health Check",
      "value": "health",
      "action": "Check API health status",
      "description": "Check DataGait API availability and response time"
    },
    {
      "name": "Scrape Links",
      "value": "scrapeLinks",
      "action": "Scrape all links from a URL",
      "description": "Extract all links from a webpage with resolved absolute URLs"
    },
    {
      "name": "Scrape Metadata",
      "value": "scrapeMeta",
      "action": "Scrape metadata from a URL",
      "description": "Extract meta tags, Open Graph, Twitter Cards, and JSON-LD structured data"
    },
    {
      "name": "Scrape Text",
      "value": "scrapeText",
      "action": "Scrape text content from a URL",
      "description": "Extract clean text content from a URL, ideal for LLM and AI pipelines"
    }
  ]

npm_readme:
  # n8n-nodes-datagait

  n8n community node for **[DataGait](https://datagait.com)** — scrape, extract, and crawl data from JavaScript-heavy websites with the world's fastest headless DOM engine.

  [npm](https://www.npmjs.com/package/n8n-nodes-datagait) | [Documentation](https://datagait.com/help) | [Report Issue](https://github.com/datagaitos/n8n-nodes-datagait/issues)

  ## Features

  - **Full JavaScript Rendering** — Renders SPAs, React, Angular, Vue, and dynamic content before extraction
  - **Structured Data Extraction** — JSON-LD, Open Graph, Twitter Cards, microdata in a single call
  - **Multi-Page Crawling** — Crawl entire sites with intelligent link following and SSE streaming
  - **Proxy Support** — Smart proxy routing with `X-Proxy-Mode` (off / smart / always)
  - **Blazing Fast** — Powered by a Rust-based headless DOM engine, 10x faster than traditional headless browsers
  - **Clean Text Output** — CSS-aware text extraction ideal for LLM and AI data pipelines
  - **Real-Time Credit Tracking** — Per-page credit usage and remaining balance in crawl events

  ## Installation

  ### From n8n Community Nodes (recommended)

  1. Open your n8n instance
  2. Go to **Settings** → **Community Nodes**
  3. Click **Install a community node**
  4. Search for `n8n-nodes-datagait`
  5. Click **Install**

  ### Manual Installation

  ```bash
  cd ~/.n8n
  npm install n8n-nodes-datagait
  # Restart n8n
  ```

  ## Setup

  1. Sign up at [datagait.com](https://datagait.com)
  2. Go to **Dashboard** → **Settings** → **API Keys** → **Create API Key**
  3. In n8n, add **DataGait API** credentials with your `dg_live_xxx` token
  4. Click **Test** to verify the connection

  ## Actions (6)

  ### Scraping Actions (`GET /extract`)

  | Action | Description |
  |--------|-------------|
  | **Extract Page** | Extract content from a webpage with full JavaScript rendering. Choose which fields to return: HTML, text, links, media, meta tags, and structured data. |
  | **Scrape Text** | Extract clean, readable text content from a URL. Ideal for feeding into LLMs, AI agents, and NLP pipelines. |
  | **Scrape Links** | Extract all links from a webpage with resolved absolute URLs and link count. |
  | **Scrape Metadata** | Extract meta tags, Open Graph, Twitter Cards, and JSON-LD structured data from any page. |

  ### Crawling Actions (`POST /crawl` — SSE streaming)

  | Action | Description |
  |--------|-------------|
  | **Crawl Site** | Crawl multiple pages from a site with intelligent extraction. Configure output fields (text, html, links, media, meta, structured_data), max pages (up to 100), and parallel workers. Results streamed via Server-Sent Events with real-time credit tracking. |

  ### Account Actions

  | Action | Description |
  |--------|-------------|
  | **Health Check** | Check DataGait API availability and measure response latency. |

  ## Output Fields

  ### Extract Page

  | Field | Description |
  |-------|-------------|
  | `url` | The final URL after redirects |
  | `title` | Page title |
  | `html` | Full rendered HTML after JavaScript execution |
  | `text` | CSS-aware innerText — clean, readable content |
  | `links` | All `<a>` and `<link>` elements with resolved absolute URLs |
  | `media` | Images, videos, and audio elements with src and alt |
  | `meta` | All `<meta>` tags (name, property, content) |
  | `structured_data` | JSON-LD, microdata, Open Graph, Twitter Cards |
  | `timing_ms` | Extraction time in milliseconds |
  | `proxy_used` | Whether a proxy was used for the request |
  | `proxy_provider` | Proxy provider: `datagait`, `byop`, or `none` |

  ### Crawl Site

  | Field | Description |
  |-------|-------------|
  | `url` | Starting URL |
  | `pages` | Array of page events (each with `url`, `page_num`, `text`, `title`, `links`, `credits_used`, `credits_remaining`) |
  | `page_count` | Number of pages crawled |
  | `total_ms` | Total crawl time in milliseconds |
  | `total_credits_used` | Total credits consumed |
  | `credit_exhausted` | `true` if crawl stopped due to credit exhaustion |

  ### Crawl SSE Events

  | Event Type | Description |
  |------------|-------------|
  | `started` | First event — confirms crawl started with `max_pages` and `credits_available` |
  | `page` | One per page — includes `success`, content fields, `credits_used`, `credits_remaining` |
  | `done` | Final event — `total_pages`, `total_content`, `total_links`, `total_ms`, `total_credits_used` |
  | `credit_exhausted` | Only if credits run out mid-crawl — `pages_completed`, `credits_used` |

  ## API Details

  - **Extract**: `GET /extract?url=<url>&html=true&text=true&...`
  - **Crawl**: `POST /crawl` with JSON body `{ url, config: { max_pages, text, html, links, workers, ... } }`
  - **Auth**: `X-API-Key: dg_live_xxx` header
  - **Base URL**: `https://ingest.datagait.com` (configurable for self-hosted)
  - **Proxy**: Optional `X-Proxy-Mode` header (`off` / `smart` / `always`)
  - **Crawl Timeout**: Up to 300s — SSE stream stays open until `done` or `credit_exhausted`

  ## Why DataGait?

  | Feature | DataGait | Firecrawl | Apify |
  |---------|----------|-----------|-------|
  | JS Rendering | Rust-based headless DOM (fastest) | Chrome-based | Chrome-based |
  | Latency | Sub-second for most pages | 2-10s typical | 5-30s typical |
  | Structured Data | JSON-LD, OG, Twitter, microdata | Limited | Varies by actor |
  | Crawl Streaming | Real-time SSE with per-page credits | Webhook/polling | Polling |
  | Proxy Support | Built-in smart proxy routing | Separate config | Separate config |
  | Pricing | 1 credit/page (10 via proxy) | Pay per extraction | Pay per compute |

  ## Development

  ### Build

  ```bash
  cd integrations/n8n
  npm install
  npm run build
  ```

  ### Test Locally with n8n

  ```bash
  cd integrations/n8n
  npm link

  cd ~/.n8n/custom
  npm link n8n-nodes-datagait

  # Restart n8n — the DataGait node will appear in the editor
  ```

  ### Publish to npm

  ```bash
  # 1. Bump version in package.json
  # 2. Build and publish
  npm publish
  ```

  Once published to npm with the `n8n-community-node-package` keyword, it will automatically appear in the n8n Community Nodes marketplace.

  ## Example Workflows

  See the `examples/` directory for importable n8n workflow JSON files:

  - **price-monitoring.json** — Monitor product prices on a schedule, alert on drops
  - **job-board-scraper.json** — Scrape job listings and save to Airtable

  ## Resources

  - [DataGait Website](https://datagait.com)
  - [API Documentation](https://datagait.com/help)
  - [Report an Issue](https://github.com/datagaitos/n8n-nodes-datagait/issues)
  - [npm Package](https://www.npmjs.com/package/n8n-nodes-datagait)

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community n8n node that scrapes, crawls, and extracts structured data from JavaScript-heavy websites using the DataGait API's Rust-based headless DOM engine.","capabilities":["Full JavaScript rendering for SPAs, React, Angular, and Vue","Extract clean text content for LLM pipelines","Extract HTML, links, media, and meta tags","Extract structured data (JSON-LD, Open Graph, Twitter Cards, microdata)","Multi-page site crawling with intelligent link following","Server-Sent Events (SSE) streaming for real-time crawl results","Built-in proxy support with smart routing","Real-time credit tracking per page","Health check for API availability"],"authentication":"API Key required (X-API-Key header with 'dg_live_xxx' token)","commonUseCases":["Extracting content from modern single-page applications (SPAs)","Building data pipelines for LLMs and AI agents","Crawling entire websites with structured data extraction","Monitoring dynamic content updates in real-time","Scraping sites that block traditional headless browsers"],"limitations":["Requires paid API credits (1 credit per page extraction)","Crawl timeout limited to 300 seconds","Max 100 pages per crawl session","Credit exhaustion stops the crawl mid-stream"],"relatedNodes":["n8n-nodes-http.request","n8n-nodes-webhook","n8n-nodes-ai.chat","n8n-nodes-ai.text-to-sql"]}


node_type: @hellotracks/n8n-nodes-hellotracks.hellotracks
package_name: @hellotracks/n8n-nodes-hellotracks
display_name: Hellotracks
description: Create, update, find, archive, and delete Hellotracks jobs
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: hellotracks
author_github_url: https://github.com/Hellotracks/n8n-nodes-hellotracks.git
npm_package_name: @hellotracks/n8n-nodes-hellotracks
npm_version: 0.1.10
community_fetched_at: 2026-07-14T14:40:34.219Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "job",
      "options": [
        {
          "name": "Job",
          "value": "job"
        },
        {
          "name": "Member",
          "value": "member"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createJob",
      "options": [
        {
          "name": "Archive Job",
          "value": "archiveJob",
          "action": "Archive a job"
        },
        {
          "name": "Create Job",
          "value": "createJob",
          "action": "Create a job"
        },
        {
          "name": "Delete Job",
          "value": "deleteJob",
          "action": "Delete a job"
        },
        {
          "name": "Find Job",
          "value": "findJob",
          "action": "Find a job"
        },
        {
          "name": "Update Job",
          "value": "updateJob",
          "action": "Update a job"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "job"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "findMember",
      "options": [
        {
          "name": "Find Member",
          "value": "findMember",
          "action": "Find a member"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "member"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Archive Job",
      "value": "archiveJob",
      "action": "Archive a job",
      "resource": "job"
    },
    {
      "name": "Create Job",
      "value": "createJob",
      "action": "Create a job",
      "resource": "job"
    },
    {
      "name": "Delete Job",
      "value": "deleteJob",
      "action": "Delete a job",
      "resource": "job"
    },
    {
      "name": "Find Job",
      "value": "findJob",
      "action": "Find a job",
      "resource": "job"
    },
    {
      "name": "Update Job",
      "value": "updateJob",
      "action": "Update a job",
      "resource": "job"
    },
    {
      "name": "Find Member",
      "value": "findMember",
      "action": "Find a member",
      "resource": "member"
    }
  ]

npm_readme:
  # Hellotracks n8n Node

  Use Hellotracks jobs in n8n workflows.

  The node connects n8n to the Hellotracks public API at
  `https://api.hellotracks.com/v1`.

  ## Installation

  In a self-hosted n8n instance with community nodes enabled:

  1. Go to `Settings -> Community Nodes`.
  2. Click `Install`.
  3. Install:

  ```text
  @hellotracks/n8n-nodes-hellotracks
  ```

  Restart n8n if prompted. Then add the `Hellotracks` node to a workflow.

  ## Credentials

  Create a Hellotracks credential with:

  - API Key: a Hellotracks public API key

  n8n injects the API key into Hellotracks requests using the credential's
  authentication settings. No API base URL setting is required.

  ## Operations

  - Create Job: `POST /jobs`
  - Update Job: `PATCH /jobs`
  - Archive Job: `POST /jobs/{id}/archive`
  - Delete Job: `DELETE /jobs/{id}`
  - Find Job: `GET /jobs?externalId=...&includeArchived=true&limit=1`
  - Find Member: `GET /members?query=...&max=50`

  Create and update support `externalId`, `title`, `address`, `notes`, `date`, `assigneeUsername`, `priority`, contact fields, and time window fields.

  `assigneeUsername` is the intended assignment field. Do not use `assigneeId`
  with this connector.

  ## Field Notes

  - `External ID`: optional external dedupe key.
  - `Job Date`: `YYYY-MM-DD`, for example `2026-05-05`.
  - `Assignee Username`: Hellotracks username, often the member email or login name.
  - `Priority (0-10)`: optional integer from 0 to 10.
  - `Window Start` and `Window End`: `HH:mm`, for example `09:00`.

  Blank optional fields are omitted before the node calls the Hellotracks API.

  ## Example Workflows

  - Create a Hellotracks job from a Google Sheets row.
  - Find a Hellotracks member by email, then create a job assigned to that member.
  - Find a job by External ID and update its address, notes, date, or assignee.
  - Archive or delete disposable jobs during testing.

  ## Development

  ```bash
  cd n8n
  npm ci
  npm test
  npm run lint
  npm pack --dry-run
  ```

  ## Publishing

  Verification-candidate releases are published from GitHub Actions with npm
  provenance. See `PUBLISHING.md`.

  ## Support

  For product support, contact support@hellotracks.com.

  For package bugs, open an issue at:

  https://github.com/Hellotracks/n8n-nodes-hellotracks/issues

ai_documentation_summary:
  {"purpose":"This n8n node enables users to interact with the Hellotracks public API to manage support jobs, including creating, updating, archiving, deleting, and finding jobs or members.","capabilities":["Create new support jobs via POST /jobs","Update existing jobs via PATCH /jobs","Archive jobs via POST /jobs/{id}/archive","Delete jobs via DELETE /jobs/{id}","Find jobs by external ID with filtering options","Find members by query string","Set job fields including external ID, title, address, notes, date, assignee username, priority, and time windows"],"authentication":"API Key required (Hellotracks public API key)","commonUseCases":["Create support jobs from external data sources like Google Sheets","Assign jobs to specific Hellotracks members by email or username","Update job details such as address, notes, or assignment","Archive or delete temporary jobs during testing"],"limitations":["Does not support assigneeId field; only assigneeUsername is available","No API base URL configuration required, but this may limit flexibility for custom endpoints","Blank optional fields are omitted before API calls, which may affect data completeness if fields are intentionally empty"],"relatedNodes":["Google Sheets","Generic HTTP Request","Set"]}


node_type: @dotseco/n8n-nodes-dots-eco.dotsEco
package_name: @dotseco/n8n-nodes-dots-eco
display_name: dots.eco
description: Work with dots.eco API. Rewarding you for casually saving the planet.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: dots.eco
author_github_url: https://github.com/dots-eco/n8n-dots-eco.git
npm_package_name: @dotseco/n8n-nodes-dots-eco
npm_version: 0.5.3
community_fetched_at: 2026-07-14T14:40:34.220Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "allocations",
      "options": [
        {
          "name": "Allocation",
          "value": "allocations"
        },
        {
          "name": "Application",
          "value": "applications"
        },
        {
          "name": "Certificate",
          "value": "certificates"
        },
        {
          "name": "Eco Club",
          "value": "ecoClub"
        },
        {
          "name": "Flow Card",
          "value": "flowCards"
        },
        {
          "name": "Impact",
          "value": "impact"
        },
        {
          "name": "Notification",
          "value": "notifications"
        },
        {
          "name": "Utility",
          "value": "utility"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List allocations"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "allocations"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create application"
        },
        {
          "name": "Get Balance",
          "value": "getBalance",
          "action": "Get application balance"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "applications"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create certificate"
        },
        {
          "name": "Get By App and External ID",
          "value": "getByExternalId",
          "action": "Get certificate by app and external ID"
        },
        {
          "name": "Get By ID",
          "value": "getById",
          "action": "Get certificate by ID"
        },
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get certificate status"
        },
        {
          "name": "Get Theme",
          "value": "getTheme",
          "action": "Get certificate theme"
        },
        {
          "name": "List By App and User",
          "value": "listByAppAndUser",
          "action": "List certificates by app and user"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "certificates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createOffering",
      "options": [
        {
          "name": "Create Offering",
          "value": "createOffering",
          "action": "Create eco club offering"
        },
        {
          "name": "List Offerings",
          "value": "listOfferings",
          "action": "List eco club offerings"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "ecoClub"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create flow card"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List flow cards"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "flowCards"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getSummary",
      "options": [
        {
          "name": "Get Summary",
          "value": "getSummary",
          "action": "Get impact summary"
        },
        {
          "name": "Get Summary Totals",
          "value": "getSummaryTotals",
          "action": "Get impact summary totals"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "impact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createSingleSubscription",
      "options": [
        {
          "name": "Create Multiple Subscriptions",
          "value": "createMultipleSubscriptions",
          "action": "Create multiple notification subscriptions"
        },
        {
          "name": "Create Single Subscription",
          "value": "createSingleSubscription",
          "action": "Create single notification subscription"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "notifications"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getSupportedLanguages",
      "options": [
        {
          "name": "Get Supported Currencies",
          "value": "getSupportedCurrencies",
          "action": "Get supported currencies"
        },
        {
          "name": "Get Supported Languages",
          "value": "getSupportedLanguages",
          "action": "Get supported languages"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "utility"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "List",
      "value": "list",
      "action": "List allocations",
      "resource": "allocations"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create application",
      "resource": "applications"
    },
    {
      "name": "Get Balance",
      "value": "getBalance",
      "action": "Get application balance",
      "resource": "applications"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create certificate",
      "resource": "certificates"
    },
    {
      "name": "Get By App and External ID",
      "value": "getByExternalId",
      "action": "Get certificate by app and external ID",
      "resource": "certificates"
    },
    {
      "name": "Get By ID",
      "value": "getById",
      "action": "Get certificate by ID",
      "resource": "certificates"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get certificate status",
      "resource": "certificates"
    },
    {
      "name": "Get Theme",
      "value": "getTheme",
      "action": "Get certificate theme",
      "resource": "certificates"
    },
    {
      "name": "List By App and User",
      "value": "listByAppAndUser",
      "action": "List certificates by app and user",
      "resource": "certificates"
    },
    {
      "name": "Create Offering",
      "value": "createOffering",
      "action": "Create eco club offering",
      "resource": "ecoClub"
    },
    {
      "name": "List Offerings",
      "value": "listOfferings",
      "action": "List eco club offerings",
      "resource": "ecoClub"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create flow card",
      "resource": "flowCards"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List flow cards",
      "resource": "flowCards"
    },
    {
      "name": "Get Summary",
      "value": "getSummary",
      "action": "Get impact summary",
      "resource": "impact"
    },
    {
      "name": "Get Summary Totals",
      "value": "getSummaryTotals",
      "action": "Get impact summary totals",
      "resource": "impact"
    },
    {
      "name": "Create Multiple Subscriptions",
      "value": "createMultipleSubscriptions",
      "action": "Create multiple notification subscriptions",
      "resource": "notifications"
    },
    {
      "name": "Create Single Subscription",
      "value": "createSingleSubscription",
      "action": "Create single notification subscription",
      "resource": "notifications"
    },
    {
      "name": "Get Supported Currencies",
      "value": "getSupportedCurrencies",
      "action": "Get supported currencies",
      "resource": "utility"
    },
    {
      "name": "Get Supported Languages",
      "value": "getSupportedLanguages",
      "action": "Get supported languages",
      "resource": "utility"
    }
  ]

npm_readme:
  ![Dots.eco logo](https://raw.githubusercontent.com/dots-eco/n8n-dots-eco/main/nodes/DotsEco/Dots_eco_logo.svg)

  # Dots.eco n8n Nodes

  This package is the first-party n8n integration for the documented public Dots.eco API.

  ## Installation

  Use the package as an n8n community node:

  - In self-hosted n8n, open **Settings > Community Nodes** and install `@dotseco/n8n-nodes-dots-eco`
  - For local development, install dependencies with `pnpm install`

  ## Scope

  The node currently covers the documented public endpoints for:

  - Applications
  - Allocations
  - Certificates
  - Eco Club offerings
  - Flow cards
  - Impact summaries
  - Notification subscriptions
  - Supported languages and currencies

  ## Credentials

  The `Dots.eco API` credential includes:

  - `baseUrl`
  - `readAuthToken`
  - `writeAuthToken`

  The node routes tokens automatically by operation:

  - read token for read endpoints
  - write token for write endpoints

  The package does not expose a sandbox or production toggle. Environment stays implicit in the base URL, app token, and auth tokens you provide.
  The credential "test connection" check only verifies reachability of the base URL through a documented public endpoint. Read and write token validity is exercised by the first authenticated node operation you run.

  Authentication notes:

  - `Base URL`: production API base URL, usually `https://impact.dots.eco/api/v1`
  - `Read Auth Token`: used for read operations such as listing allocations or reading certificate data
  - `Write Auth Token`: used for create operations such as creating applications, certificates, flow cards, and notification subscriptions

  ## Editor Conveniences

  The node keeps the existing request shape while adding a few editor-side conveniences:

  - supported languages and currencies load directly from Dots.eco selectors
  - certificate allocation IDs can still be entered manually, or looked up by company
  - Eco Club allocation limits can still be entered as CSV, or selected from a lookup

  Manual entry remains available for compatibility, expressions, and existing workflows.

  ## Usage

  ### Example: list allocations for a company

  1. Create `Dots.eco API` credentials with your base URL and read token.
  2. Add the `Dots.eco` node.
  3. Select `Allocation` as the resource and `List` as the operation.
  4. Enter the numeric `Company ID`.
  5. Optionally set `Language` to localize allocation labels returned by Dots.eco.

  ### Example: create a certificate

  1. Create `Dots.eco API` credentials with your base URL and write token.
  2. Add the `Dots.eco` node.
  3. Select `Certificate` as the resource and `Create` as the operation.
  4. Fill in `App Token`, `External Unique ID`, `Impact Quantity`, `Allocation ID`, and `Remote User ID`.
  5. Optionally use allocation lookup mode to load allocations by company instead of entering the allocation ID manually.

  ### Example workflow

  This package is designed for normal n8n workflows. A minimal flow to create a certificate after receiving order data looks like this:

  `Manual Trigger` -> `Set` or `Webhook` -> `Dots.eco` (`Certificate` / `Create`) -> next business step

  ## Development

  Install dependencies and build the package:

  ```bash
  pnpm install
  pnpm build
  ```

  Run package checks:

  ```bash
  pnpm lint
  pnpm test
  ```

  ## Validation

  This package intentionally keeps only lightweight unit coverage in `tests/unit`.

  ## Release and Submission

  - The package has no runtime dependencies, which is required for n8n verification
  - The repository includes a GitHub Actions publish workflow that uses npm provenance, which n8n requires for Creator Portal submissions from May 1, 2026 onward
  - Before submitting a new version, publish that version to npm from GitHub Actions so the npm metadata, repository link, and provenance statement all match the repository state

  ## References

  - Dots.eco API docs: <https://docs.impact.dots.eco>

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A n8n community node for interacting with the Dots.eco API to manage applications, allocations, certificates, and eco club offerings.","capabilities":["List allocations for companies","Create certificates","Create applications","Create flow cards","Create notification subscriptions","Read certificate data","Manage Eco Club offerings","Handle language and currency localization","Lookup allocations by company ID"],"authentication":"API Key required (separate read and write auth tokens)","commonUseCases":["Automating certificate creation upon order receipt","Tracking company allocations and impact summaries","Managing eco club participation and limits"],"limitations":["No explicit sandbox or production environment toggle","Token validity is only checked on first authenticated operation","Test connection only verifies base URL reachability, not token validity"],"relatedNodes":["Manual Trigger","Set","Webhook"]}


node_type: @katara-ai/n8n-nodes-katara.katara
package_name: @katara-ai/n8n-nodes-katara
display_name: Katara
description: Upload documents to the Katara API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: vcastellm
author_github_url: https://github.com/katara-ai-inc/n8n-nodes-katara.git
npm_package_name: @katara-ai/n8n-nodes-katara
npm_version: 0.1.12
community_fetched_at: 2026-07-14T14:40:34.220Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Document",
          "value": "document"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload a document",
          "description": "Upload a document to Katara"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload a document",
      "description": "Upload a document to Katara",
      "resource": "document"
    }
  ]

npm_readme:
  # n8n-nodes-katara

  This is an n8n community node for Katara. It currently provides a single programmatic node that uploads documents to Katara's Buf Connect API with an API token.

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

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

  ## Installation

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

  ## Operations

  - Document
    - Upload

  ## Credentials

  Use the **Katara API** credential.

  The credential requires:

  1. **Base URL**: The public base URL of the Katara API.
  2. **API Token**: The Katara API token. The node sends it as a bearer token on API requests.

  ## Usage

  The Katara node uploads one document per input item.

  Required node fields:

  1. **Organization ID**
  2. **Agent ID**
  3. **Source ID**
  4. **Input Binary Field**

  The node reads the selected input binary property, base64-encodes the file contents using the protobuf JSON mapping expected by Connect, and sends a unary request to Katara's `UploadDocumentAsync` RPC.

  Optional fields let you override the uploaded filename and content type, and send `language`, `publishedAt`, and comma-separated `tagIds`.

  ## Compatibility

  Compatible with n8n versions that support community-node generic API credentials.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Katara API repository](https://github.com/katara-ai-inc/katara)

ai_documentation_summary:
  {"purpose":"Uploads documents to the Katara API by sending binary files as base64-encoded protobuf JSON via the Buf Connect API.","capabilities":["Upload documents to Katara's UploadDocument RPC endpoint","Base64-encode file contents using protobuf JSON mapping","Override uploaded filename and content type","Set language metadata for uploaded documents","Set publishedAt timestamp","Add comma-separated tagIds"],"authentication":"API Token (Bearer token sent on requests)","commonUseCases":["Integrating Katara AI with n8n workflows for document ingestion","Automating document upload processes with metadata tagging","Connecting n8n to Katara's Buf Connect API for programmatic document management"],"limitations":["Currently supports only document uploads (no other operations mentioned)","Requires manual configuration of Organization ID, Agent ID, and Source ID"],"relatedNodes":["n8n Binary File node","n8n HTTP Request node","n8n Community Node Credentials"]}


node_type: n8n-nodes-surveysparrow.surveySparrowTrigger
package_name: n8n-nodes-surveysparrow
display_name: SurveySparrow Trigger
description: Starts the workflow when a survey form receives a new response
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: saravanakumar.r
author_github_url: https://github.com/surveysparrow/n8n-connector.git
npm_package_name: n8n-nodes-surveysparrow
npm_version: 1.3.13
community_fetched_at: 2026-07-14T14:40:34.222Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-surveysparrow

  [n8n](https://n8n.io) community nodes for [SurveySparrow](https://surveysparrow.com): share surveys through Email, SMS, and WhatsApp channels, create contacts, and trigger workflows on new survey submissions.

  ## Install (community nodes)

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

  `n8n-nodes-surveysparrow`

  Or install manually in your n8n environment:

  ```bash
  npm install n8n-nodes-surveysparrow
  ```

  Restart n8n, then enable the package under Community nodes if your instance requires it.

  ## Credentials

  1. In SurveySparrow, create an **OAuth** application and note the **Client ID** and **Client Secret**.
  2. Set the OAuth **redirect / callback URL** to your n8n OAuth callback (shown when you create credentials in n8n).
  3. In n8n, create **SurveySparrow OAuth2 API** credentials and complete the sign-in flow.

  OAuth and scopes are described in the [SurveySparrow OAuth documentation](https://developers.surveysparrow.com/rest-apis/OAuth/).

  ## Nodes

  | Node | Purpose |
  |------|---------|
  | **SurveySparrow** | Share surveys via Email / SMS / WhatsApp; create contacts |
  | **SurveySparrow Trigger** | Start a workflow when a new survey submission is received |

  ## Example Workflows

  ### 1 — Trigger a workflow on every new survey response
  1. Add a **SurveySparrow Trigger** node and select your survey.
  2. Activate the workflow — n8n registers a webhook automatically.
  3. Every completed submission fires the trigger and passes the answers as JSON to the next node.

  ### 2 — Send a survey via Email when a HubSpot deal closes
  1. Use a **HubSpot Trigger** (deal stage changed) as the start node.
  2. Connect a **SurveySparrow** node, set **Action** to **Send Survey**, select **Channel Type → Email**, pick your survey and email channel, and map the contact's email address.
  3. The survey link is delivered automatically when a deal moves to "Closed Won".

  ### 3 — Create a SurveySparrow contact from a Typeform submission
  1. Use a **Typeform Trigger** as the start node.
  2. Connect a **SurveySparrow** node, set **Action** to **Create Contact**.
  3. Map the respondent's email and name from the Typeform fields to the SurveySparrow contact fields.
  4. Optionally use **Additional Fields** to map any extra properties.

  ## Development (this monorepo)

  ```bash
  cd n8n
  npm install
  npm run dev
  ```

  Build for production:

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

  ### Automated checks (Creator Portal / CI)

  Run the same checks n8n recommends before publishing or submitting for review ([Test a node](https://docs.n8n.io/integrations/creating-nodes/test/), [Node linter](https://docs.n8n.io/integrations/creating-nodes/test/node-linter/)):

  ```bash
  npm test
  ```

  This runs `build` then `lint` (eslint-plugin-n8n-nodes-base via `n8n-node lint`). To **disable a rule for one line** when you have a good reason, use an ESLint disable comment as described under [Exceptions](https://docs.n8n.io/integrations/creating-nodes/test/node-linter/#exceptions).

  Optional: after the package is on npm, run n8n’s security scanner (also referenced in [verification guidelines](https://docs.n8n.io/integrations/creating-nodes/build/reference/verification-guidelines/)):

  ```bash
  npm run test:security
  ```

  Or `npm run test:all` for both.

  ## Publish to npm

  1. Log in: `npm login` (use an account allowed to publish this package name).
  2. From `n8n/`: `npm run build && npm run lint`
  3. `npm publish --access public` (use `--access public` if the package name is new to your npm user/org)

  For automated releases and provenance, add a trusted publisher or `NPM_TOKEN` workflow as described in the [n8n deploy docs](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/).

  ## License

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

ai_documentation_summary:
  {"purpose":"The SurveySparrow Trigger node initiates an n8n workflow automatically when a new response is received for a specific survey.","capabilities":["Starts workflow on new survey submission","Passes survey answers as JSON to subsequent nodes","Automatically registers a webhook in n8n","Supports multiple survey channels (Email, SMS, WhatsApp)"],"authentication":"OAuth2","commonUseCases":["Triggering automated workflows based on survey responses","Sending follow-up surveys via email when a deal closes","Creating contacts in SurveySparrow from external form submissions"],"limitations":[],"relatedNodes":["SurveySparrow","HubSpot Trigger","Typeform Trigger"]}


node_type: n8n-nodes-surveysparrow.surveySparrow
package_name: n8n-nodes-surveysparrow
display_name: SurveySparrow
description: Create and share survey forms via Email, SMS, and WhatsApp; manage contacts
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: saravanakumar.r
author_github_url: https://github.com/surveysparrow/n8n-connector.git
npm_package_name: n8n-nodes-surveysparrow
npm_version: 1.3.13
community_fetched_at: 2026-07-14T14:40:34.223Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "channel",
      "options": [
        {
          "name": "Channel",
          "value": "channel"
        },
        {
          "name": "Contact",
          "value": "contact"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "sendSurvey",
      "options": [
        {
          "name": "Send Survey",
          "value": "sendSurvey",
          "action": "Send a survey",
          "description": "Send a survey to a contact via Email, SMS, or WhatsApp"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "channel"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a contact",
          "description": "Create a new contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send Survey",
      "value": "sendSurvey",
      "action": "Send a survey",
      "description": "Send a survey to a contact via Email, SMS, or WhatsApp",
      "resource": "channel"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a contact",
      "description": "Create a new contact",
      "resource": "contact"
    }
  ]

npm_readme:
  # n8n-nodes-surveysparrow

  [n8n](https://n8n.io) community nodes for [SurveySparrow](https://surveysparrow.com): share surveys through Email, SMS, and WhatsApp channels, create contacts, and trigger workflows on new survey submissions.

  ## Install (community nodes)

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

  `n8n-nodes-surveysparrow`

  Or install manually in your n8n environment:

  ```bash
  npm install n8n-nodes-surveysparrow
  ```

  Restart n8n, then enable the package under Community nodes if your instance requires it.

  ## Credentials

  1. In SurveySparrow, create an **OAuth** application and note the **Client ID** and **Client Secret**.
  2. Set the OAuth **redirect / callback URL** to your n8n OAuth callback (shown when you create credentials in n8n).
  3. In n8n, create **SurveySparrow OAuth2 API** credentials and complete the sign-in flow.

  OAuth and scopes are described in the [SurveySparrow OAuth documentation](https://developers.surveysparrow.com/rest-apis/OAuth/).

  ## Nodes

  | Node | Purpose |
  |------|---------|
  | **SurveySparrow** | Share surveys via Email / SMS / WhatsApp; create contacts |
  | **SurveySparrow Trigger** | Start a workflow when a new survey submission is received |

  ## Example Workflows

  ### 1 — Trigger a workflow on every new survey response
  1. Add a **SurveySparrow Trigger** node and select your survey.
  2. Activate the workflow — n8n registers a webhook automatically.
  3. Every completed submission fires the trigger and passes the answers as JSON to the next node.

  ### 2 — Send a survey via Email when a HubSpot deal closes
  1. Use a **HubSpot Trigger** (deal stage changed) as the start node.
  2. Connect a **SurveySparrow** node, set **Action** to **Send Survey**, select **Channel Type → Email**, pick your survey and email channel, and map the contact's email address.
  3. The survey link is delivered automatically when a deal moves to "Closed Won".

  ### 3 — Create a SurveySparrow contact from a Typeform submission
  1. Use a **Typeform Trigger** as the start node.
  2. Connect a **SurveySparrow** node, set **Action** to **Create Contact**.
  3. Map the respondent's email and name from the Typeform fields to the SurveySparrow contact fields.
  4. Optionally use **Additional Fields** to map any extra properties.

  ## Development (this monorepo)

  ```bash
  cd n8n
  npm install
  npm run dev
  ```

  Build for production:

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

  ### Automated checks (Creator Portal / CI)

  Run the same checks n8n recommends before publishing or submitting for review ([Test a node](https://docs.n8n.io/integrations/creating-nodes/test/), [Node linter](https://docs.n8n.io/integrations/creating-nodes/test/node-linter/)):

  ```bash
  npm test
  ```

  This runs `build` then `lint` (eslint-plugin-n8n-nodes-base via `n8n-node lint`). To **disable a rule for one line** when you have a good reason, use an ESLint disable comment as described under [Exceptions](https://docs.n8n.io/integrations/creating-nodes/test/node-linter/#exceptions).

  Optional: after the package is on npm, run n8n’s security scanner (also referenced in [verification guidelines](https://docs.n8n.io/integrations/creating-nodes/build/reference/verification-guidelines/)):

  ```bash
  npm run test:security
  ```

  Or `npm run test:all` for both.

  ## Publish to npm

  1. Log in: `npm login` (use an account allowed to publish this package name).
  2. From `n8n/`: `npm run build && npm run lint`
  3. `npm publish --access public` (use `--access public` if the package name is new to your npm user/org)

  For automated releases and provenance, add a trusted publisher or `NPM_TOKEN` workflow as described in the [n8n deploy docs](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/).

  ## License

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

ai_documentation_summary:
  {"purpose":"This n8n community node enables integration with SurveySparrow to distribute surveys via Email, SMS, and WhatsApp, manage contacts, and trigger workflows upon new survey submissions.","capabilities":["Share surveys via Email","Share surveys via SMS","Share surveys via WhatsApp","Create contacts in SurveySparrow","Trigger workflows on new survey submissions","Map contact data from external sources (e.g., Typeform, HubSpot)"],"authentication":"OAuth2","commonUseCases":["Automatically send surveys to leads when a CRM deal closes","Create SurveySparrow contacts from external form submissions","Start a workflow whenever a new survey response is received"],"limitations":["Community node (may require manual installation and enabling)","Requires OAuth application setup in SurveySparrow dashboard","OAuth callback URL must be configured in SurveySparrow"],"relatedNodes":["SurveySparrow Trigger","HubSpot Trigger","Typeform Trigger","Generic Email Node"]}


node_type: n8n-nodes-data-quality-toolkit.dataQualityToolkit
package_name: n8n-nodes-data-quality-toolkit
display_name: Data Quality Toolkit
description: Validate, clean, compare, and score workflow data without runtime dependencies
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: vvrr174
author_github_url: https://github.com/vr-aus12/
npm_package_name: n8n-nodes-data-quality-toolkit
npm_version: 0.1.9
community_fetched_at: 2026-07-14T14:40:34.224Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "validateFields",
      "options": [
        {
          "name": "Clean Object",
          "value": "cleanObject",
          "action": "Clean object",
          "description": "Trim strings, collapse whitespace, and remove empty fields"
        },
        {
          "name": "Compare Records",
          "value": "compareRecords",
          "action": "Compare records",
          "description": "Compare two objects and return changed fields"
        },
        {
          "name": "Find Missing Values",
          "value": "findMissingValues",
          "action": "Find missing values",
          "description": "Return required fields that are missing or empty"
        },
        {
          "name": "Generate Quality Report",
          "value": "qualityReport",
          "action": "Generate quality report",
          "description": "Validate fields and return a simple data quality score"
        },
        {
          "name": "Validate Fields",
          "value": "validateFields",
          "action": "Validate fields",
          "description": "Validate required fields and basic data types"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Clean Object",
      "value": "cleanObject",
      "action": "Clean object",
      "description": "Trim strings, collapse whitespace, and remove empty fields"
    },
    {
      "name": "Compare Records",
      "value": "compareRecords",
      "action": "Compare records",
      "description": "Compare two objects and return changed fields"
    },
    {
      "name": "Find Missing Values",
      "value": "findMissingValues",
      "action": "Find missing values",
      "description": "Return required fields that are missing or empty"
    },
    {
      "name": "Generate Quality Report",
      "value": "qualityReport",
      "action": "Generate quality report",
      "description": "Validate fields and return a simple data quality score"
    },
    {
      "name": "Validate Fields",
      "value": "validateFields",
      "action": "Validate fields",
      "description": "Validate required fields and basic data types"
    }
  ]

npm_readme:
  # n8n-nodes-data-quality-toolkit

  A lightweight n8n community node for validating, cleaning, comparing, and scoring workflow data before sending it to CRMs, APIs, databases, or AI systems.

  This node intentionally uses **no runtime external dependencies**. All validation and cleaning logic is implemented with native TypeScript/JavaScript to keep the package simple and suitable for community-node review.

  ## Operations

  ### Validate Fields
  Checks configured fields for:

  - Required value
  - Empty string handling
  - Basic type validation: string, number, boolean, email, URL, date, phone

  Output example:

  ```json
  {
    "customer": {
      "email": "test@example.com"
    },
    "dataQuality": {
      "valid": true,
      "errors": []
    }
  }
  ```

  ### Clean Object
  Cleans incoming item JSON by:

  - Trimming strings
  - Collapsing repeated whitespace
  - Optionally removing empty fields

  ### Find Missing Values
  Checks a comma-separated list of required dot-path fields and returns missing fields.

  Example field list:

  ```text
  customer.name, customer.email, order.id
  ```

  ### Compare Records
  Compares two objects, usually `before` and `after`, and returns changed fields.

  Expected input example:

  ```json
  {
    "before": { "name": "ABC", "revenue": 100 },
    "after": { "name": "ABC", "revenue": 150 }
  }
  ```

  ### Generate Quality Report
  Runs field validation and returns a simple score from 0 to 100.

  ## Why this node is useful

  Many workflows fail because bad or incomplete data reaches the next system. This node gives workflow builders a reusable place to validate and clean data before calling APIs such as CRMs, billing systems, spreadsheets, databases, or AI extraction steps.

  ## Installation for local testing

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

  Then link it inside your n8n custom folder:

  ```bash
  mkdir -p ~/.n8n/custom
  cd ~/.n8n/custom
  npm link n8n-nodes-data-quality-toolkit
  ```

  Restart n8n.

  ## Docker self-hosted example

  If you keep custom nodes in `C:/n8n-custom` on Windows:

  ```bash
  docker run -it --rm \
    -p 5678:5678 \
    -v n8n_data:/home/node/.n8n \
    -v C:/n8n-custom:/home/node/.n8n/custom \
    -e N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom \
    n8nio/n8n
  ```

  Build this package and copy/link it under the mounted custom folder.

  ## Publishing

  Before publishing:

  ```bash
  npm run lint
  npm run build
  npm publish --provenance --access public
  ```

  For n8n community-node verification, keep runtime dependencies empty, publish from GitHub Actions with provenance, and ensure the package name starts with `n8n-nodes-`.

  ## License

  MIT

  ## Tests

  This package uses Node.js built-in test runner, so there are no test-framework runtime dependencies.

  ```bash
  npm install
  npm test
  ```

  The tests cover the core no-dependency helper logic:

  - empty value detection
  - nested path reads/writes
  - email, URL, phone, date, number and boolean validation
  - string/object cleaning
  - changed-field comparison between records

  ## Release process

  For n8n community-node submission, prefer publishing from GitHub Actions so npm provenance is attached.

  Dry run:

  ```bash
  npm run release:dry-run
  ```

  Patch release:

  ```bash
  npm run release:patch
  ```

  Then push the version commit and tag:

  ```bash
  git push --follow-tags
  ```

  Create a GitHub Release for the new tag. The included `.github/workflows/publish.yml` workflow will run tests and publish to npm with provenance.

ai_documentation_summary:
  {"purpose":"Validates, cleans, compares, and scores workflow data before sending it to external systems like CRMs, APIs, databases, or AI systems.","capabilities":["Field validation (required values, empty strings, types: string, number, boolean, email, URL, date, phone)","Object cleaning (trimming strings, collapsing whitespace, removing empty fields)","Missing value detection via dot-path field lists","Record comparison to identify changed fields between before and after states","Quality score generation (0-100) based on field validation"],"authentication":"None","commonUseCases":["Data validation before CRM integration","Pre-flight data cleaning for API submissions","Data quality assessment before database insertion","Input sanitization for AI extraction steps","Change tracking in record updates"],"limitations":["No runtime external dependencies (limited to native TypeScript/JavaScript)","Custom node installation requires manual linking or Docker mounting","No built-in test framework dependencies (uses Node.js built-in runner only)"],"relatedNodes":["n8n-nodes-base.code","n8n-nodes-base.set","n8n-nodes-base.httpRequest"]}


node_type: n8n-nodes-humanhours.humanhours
package_name: n8n-nodes-humanhours
display_name: HumanHours
description: Track AI agent tasks and enrich company domains into a labour-cost business case
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: triadagency
author_github_url: https://github.com/triadgit/
npm_package_name: n8n-nodes-humanhours
npm_version: 0.3.1
community_fetched_at: 2026-07-14T14:40:34.224Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "event",
      "options": [
        {
          "name": "Company",
          "value": "company"
        },
        {
          "name": "Event",
          "value": "event"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "track",
      "options": [
        {
          "name": "Track Event",
          "value": "track",
          "action": "Track an agent task event",
          "description": "Send a single agent task event to humanhours"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "event"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "enrichCompany",
      "options": [
        {
          "name": "Enrich Company",
          "value": "enrichCompany",
          "action": "Enrich a company domain",
          "description": "Research a domain into an outside-in labour-cost business case"
        },
        {
          "name": "Get Company",
          "value": "getCompany",
          "action": "Get a company",
          "description": "Read one enriched company from your library"
        },
        {
          "name": "Get Job Status",
          "value": "getJob",
          "action": "Get a bulk job status",
          "description": "Check the progress of a bulk enrichment job"
        },
        {
          "name": "List Companies",
          "value": "listCompanies",
          "action": "List companies",
          "description": "List or export the companies in your library"
        },
        {
          "name": "Queue Bulk Enrichment",
          "value": "queueBulk",
          "action": "Queue a bulk enrichment job",
          "description": "Queue a background job to enrich many domains"
        },
        {
          "name": "Refresh Company",
          "value": "refreshCompany",
          "action": "Refresh a company",
          "description": "Re-enrich a company you already own"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "company"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Track Event",
      "value": "track",
      "action": "Track an agent task event",
      "description": "Send a single agent task event to humanhours",
      "resource": "event"
    },
    {
      "name": "Enrich Company",
      "value": "enrichCompany",
      "action": "Enrich a company domain",
      "description": "Research a domain into an outside-in labour-cost business case",
      "resource": "company"
    },
    {
      "name": "Get Company",
      "value": "getCompany",
      "action": "Get a company",
      "description": "Read one enriched company from your library",
      "resource": "company"
    },
    {
      "name": "Get Job Status",
      "value": "getJob",
      "action": "Get a bulk job status",
      "description": "Check the progress of a bulk enrichment job",
      "resource": "company"
    },
    {
      "name": "List Companies",
      "value": "listCompanies",
      "action": "List companies",
      "description": "List or export the companies in your library",
      "resource": "company"
    },
    {
      "name": "Queue Bulk Enrichment",
      "value": "queueBulk",
      "action": "Queue a bulk enrichment job",
      "description": "Queue a background job to enrich many domains",
      "resource": "company"
    },
    {
      "name": "Refresh Company",
      "value": "refreshCompany",
      "action": "Refresh a company",
      "description": "Re-enrich a company you already own",
      "resource": "company"
    }
  ]

npm_readme:
  # n8n-nodes-humanhours

  n8n community node for [humanhours](https://humanhours.dev). Track AI agent tasks straight from your n8n workflows; humanhours computes hours and money saved and exposes them through a dashboard and Reports API.

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

  - [Installation](#installation)
  - [Credential](#credential)
  - [Operations](#operations)
  - [Usage patterns](#usage-patterns)
  - [Compatibility](#compatibility)
  - [Resources](#resources)
  - [Version history](#version-history)

  ## Installation

  Once verified, install the node from your n8n instance under **Settings, Community Nodes** with the package name `n8n-nodes-humanhours`.

  For local development, follow the [installation guide for community nodes](https://docs.n8n.io/integrations/community-nodes/installation/).

  ## Credential

  Create a `Humanhours API` credential with:

  | Field | Required | Notes |
  |---|---|---|
  | API Key | yes | `hh_live_...`, generated at [/api-keys](https://humanhours.dev/api-keys) in your humanhours dashboard |
  | Base URL | no | Defaults to `https://humanhours.dev`. Override only when running humanhours self-hosted or against a local dev instance. |

  The credential's **Test connection** button calls `GET /api/v1/agents` to verify the key.

  ## Operations

  Pick a **Resource** first: **Event** to track agent runs, or **Company** to enrich domains for outreach.

  ### Track Event

  Send a single agent task event to humanhours.

  | Field | Required | Description |
  |---|---|---|
  | Agent ID | yes | Slug identifying the agent that performed the task, e.g. `support-classifier` |
  | Task Type | yes | One of the 50 humanhours built-in keys, or one of your custom keys |
  | Outcome | yes | `Success`, `Failure`, or `Needs Review` |
  | Agent Duration (seconds) | no | How long the agent took. Omit for zero. |
  | Human Baseline (minutes) | no | Override the baseline for this event. Leave empty to use the built-in or org-set baseline. |
  | Model | no | Model used, ideally the OpenRouter id (e.g. `anthropic/claude-opus-4.8`). With token counts, humanhours auto-prices the run into `net_saved`. |
  | Tokens In / Tokens Out | no | Prompt and completion token counts for the run. Used with Model to compute the real cost. |
  | Metadata | no | Free-form JSON object attached to the event. Useful for `client`, `ticket_id`, `model`, or token counts. |

  The node sends an `Idempotency-Key` header derived from the n8n execution id and item index, so re-runs of the same workflow item are safe.

  ### Company enrichment

  Under the **Company** resource, turn a domain into an outside-in labour-cost and automation business case, then pull the library for outreach.

  | Operation | Calls | Notes |
  |---|---|---|
  | Enrich Company | `POST /api/v1/companies` | Synchronous (15 to 30 seconds). Fields: Domain, plus Refresh, External ID, Tags. Charges one lookup when the domain is new or Refresh is on. |
  | Get Company | `GET /api/v1/companies/{domain}` | Reads one record from your library. Free. |
  | Refresh Company | `POST /api/v1/companies/{domain}/refresh` | Re-enriches an owned company. Charges one lookup. |
  | List Companies | `GET /api/v1/companies` | Return Format JSON emits one item per company; CSV emits a single `csv` field. Filter by Tag, cap with Limit. Free. |
  | Queue Bulk Enrichment | `POST /api/v1/companies/bulk` | Async. Domains (one per line, max 1000) plus Tags. Returns a `job_id`; lookups are charged per domain as the worker processes them. |
  | Get Job Status | `GET /api/v1/jobs/{id}` | Poll a bulk job until `status` is `done`. |

  Lookups are a hard cap with no overages (Pro 100 per month, Agency 500 pooled). Hitting the limit returns `lookup_quota_exceeded` until you upgrade.

  ## Usage patterns

  **Pattern 1, end of a single-node agent.** Drop the humanhours node at the end of an OpenAI / Claude / HTTP Request flow. Wire `Agent ID` to a workflow constant, `Task Type` to whatever the workflow does.

  **Pattern 2, branch on outcome.** Use an `If` node to determine `Outcome` based on the agent's structured output, then merge both branches into a single humanhours node.

  **Pattern 3, include token cost.** Wire `Metadata` to an expression like:

  ```
  ={{ {model: "claude-opus-4-7", tokens_in: $json.usage.prompt_tokens, tokens_out: $json.usage.completion_tokens} }}
  ```

  so the dashboard can break down by model later.

  ## Compatibility

  - Tested against n8n `1.69.0` and newer.
  - Requires `n8n-workflow` (provided by the n8n host).
  - No runtime dependencies.

  ## Resources

  - [humanhours documentation](https://humanhours.dev/docs)
  - [humanhours API reference](https://humanhours.dev/docs/api)
  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)

  ## Version history

  ### 0.3.0

  - Track Event gained `Model`, `Tokens In`, and `Tokens Out`. Pass these (without an explicit Agent Cost) and humanhours auto-prices the run cost into `net_saved` for real net ROI.

  ### 0.2.0

  - Added a `Company` resource with six enrichment operations: Enrich Company, Get Company, Refresh Company, List Companies, Queue Bulk Enrichment, and Get Job Status.
  - Grouped operations under a `Resource` selector. Existing `Track Event` workflows are unaffected.

  ### 0.1.0

  - Initial release.
  - `Track Event` operation against `POST /api/v1/track`.
  - `Humanhours API` credential with API Key + Base URL, plus a credential test that calls `GET /api/v1/agents`.

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"Tracks AI agent tasks from n8n workflows to compute hours and money saved, exposing metrics via a dashboard and Reports API.","capabilities":["Record agent task events with outcome status","Log agent duration in seconds","Override human baseline time per event","Attach custom metadata (e.g., model, tokens, ticket IDs)","Support built-in and custom task types","Ensure idempotency via execution ID headers"],"authentication":"API Key required","commonUseCases":["Track AI agent interactions at the end of a workflow","Monitor agent performance and cost efficiency","Break down metrics by model or task type in dashboard reports"],"limitations":["Requires n8n version 1.69.0 or newer","No built-in support for custom task types beyond those defined in the humanhours platform"],"relatedNodes":["HTTP Request","If","Set"]}


node_type: n8n-nodes-nextlead.nextLeadTrigger
package_name: n8n-nodes-nextlead
display_name: NextLead Trigger
description: Trigger workflows on NextLead events through polling
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: crcht
author_github_url: https://github.com/CREACH-Agency/nextlead-n8n.git
npm_package_name: n8n-nodes-nextlead
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.225Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-nextlead

  Community node for [n8n](https://n8n.io) that integrates [NextLead CRM](https://dashboard.nextlead.app).

  - **npm**: [n8n-nodes-nextlead](https://www.npmjs.com/package/n8n-nodes-nextlead)
  - **GitHub**: [CREACH-Agency/nextlead-n8n](https://github.com/CREACH-Agency/nextlead-n8n)

  ---

  ## Features

  | Resource | Operations |
  |---|---|
  | **Contact** | Create, Update, Delete, Find, Add Note |
  | **Structure** | Create, Update, Delete, List |
  | **Sale** | Create, Update, Delete |
  | **Action** | Create, Update, Delete |
  | **Group** | Create, Update, Delete, List |
  | **List** | Create, Update, Delete |
  | **Identify** | Identify visitor |
  | **Trigger** | Poll for new/updated contacts and events |

  ---

  ## Architecture

  ```
  nodes/NextLead/
  ├── NextLead.node.ts          # Main node — resource router
  ├── NextLeadTrigger.node.ts   # Polling trigger node
  ├── core/
  │   ├── BaseNextLeadNode.ts   # Abstract base class shared by both nodes
  │   ├── NextLeadApiService.ts # HTTP client wrapping the NextLead REST API
  │   ├── NextLeadErrorHandler.ts
  │   ├── ResourceManager.ts    # Dispatches operations to the right resource
  │   ├── interfaces/
  │   │   └── IResourceStrategy.ts  # Strategy interface for each resource
  │   └── types/
  │       ├── NextLeadTypes.ts       # ResourceType / OperationType enums
  │       ├── shared/ApiTypes.ts
  │       └── api/                   # Typed API response shapes
  ├── resources/
  │   ├── ContactResource.ts    # Implements IResourceStrategy for contacts
  │   ├── StructureResource.ts
  │   ├── SaleResource.ts
  │   ├── ActionResource.ts
  │   ├── GroupResource.ts
  │   ├── ListResource.ts
  │   ├── IdentifyResource.ts
  │   └── <resource>/
  │       └── <Resource>Fields.ts   # n8n field definitions per resource
  └── utils/
      ├── NodeExecuteUtils.ts
      ├── OperationHandlerUtils.ts
      ├── ResponseUtils.ts
      └── FieldDefinitionUtils.ts

  credentials/
  └── NextLeadApi.credentials.ts    # API key + domain credential

  dist/   # Compiled output (git-ignored, generated by build)
  ```

  ### Key design decisions

  - **Strategy pattern**: each resource (`ContactResource`, `SaleResource`, …) implements `IResourceStrategy`. `ResourceManager` picks the right one at runtime based on the `resource` parameter.
  - **BaseNextLeadNode**: shared abstract class that wires credentials, error handling, and execution lifecycle for both the regular node and the trigger node.
  - **NextLeadApiService**: thin wrapper around n8n's `helpers.requestWithAuthentication`, so auth headers are injected automatically from the stored credential.

  ---

  ## Local development

  ### Prerequisites

  - Node.js ≥ 20.15
  - pnpm (`npm install -g pnpm`)
  - A running n8n instance (local or Docker)

  ### Install dependencies

  ```bash
  pnpm install
  ```

  ### Build

  ```bash
  pnpm run build
  ```

  Compiled files are output to `dist/`. The build runs `tsc` then copies SVG icons via Gulp.

  ### Watch mode (rebuild on save)

  ```bash
  pnpm run dev
  ```

  ### Lint

  ```bash
  pnpm run lint        # check
  pnpm run lintfix     # auto-fix
  ```

  ### Format

  ```bash
  pnpm run format
  ```

  ### Test locally in n8n

  Link the package into a local n8n install so changes are reflected immediately:

  ```bash
  # In this repo
  npm link

  # In your n8n directory
  npm link n8n-nodes-nextlead
  ```

  Then restart n8n. The NextLead nodes will appear in the node picker.

  ---

  ## Publishing to npm

  > See [PUBLICATION_GUIDE.md](PUBLICATION_GUIDE.md) for the full step-by-step.

  ```bash
  # 1. Bump version
  npm version patch   # 0.1.0 → 0.1.1  (bug fix)
  npm version minor   # 0.1.0 → 0.2.0  (new feature)
  npm version major   # 0.1.0 → 1.0.0  (breaking change)

  # 2. Build and lint
  pnpm run build
  pnpm run lint

  # 3. Preview what will be published
  npm pack --dry-run

  # 4. Publish
  npm publish --access public
  ```

  The `prepublishOnly` script runs build + lint automatically before each publish.

  Only the `dist/` folder is shipped (configured via `"files"` in package.json).

  ### n8n community node requirements

  - Package name must start with `n8n-nodes-`
  - `keywords` must include `"n8n-community-node-package"`
  - License must be MIT
  - No heavy external dependencies

  After publishing, submit the node to the n8n community by opening an issue on [github.com/n8n-io/n8n](https://github.com/n8n-io/n8n) or posting on [community.n8n.io](https://community.n8n.io/).

  ---

  ## Setup for end users

  1. In n8n, go to **Settings > Community Nodes** and install `n8n-nodes-nextlead`.
  2. Create a **NextLead API** credential:
     - **API Key**: found in NextLead under *Settings > Automation > API Key*
     - **Domain**: your NextLead instance URL
  3. Add a **NextLead** node to your workflow and select a resource + operation.

  ---

  ## Resources

  - [NextLead API documentation](https://dashboard.nextlead.app/en/api-documentation)
  - [n8n community nodes docs](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n community forum](https://community.n8n.io/)

  ---

  ## License

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

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with NextLead CRM to manage contacts, sales, and other CRM entities, including a polling trigger for real-time event detection.","capabilities":["Create, Update, Delete, Find, Add Note for Contacts","Create, Update, Delete, List for Structures","Create, Update, Delete for Sales","Create, Update, Delete for Actions","Create, Update, Delete, List for Groups","Create, Update, Delete for Lists","Identify visitor","Poll for new/updated contacts and events","HTTP client wrapping NextLead REST API"],"authentication":"API Key required (stored in NextLeadApi credential with API Key and Domain)","commonUseCases":["Automate CRM data synchronization between NextLead and n8n","Trigger workflows when new contacts or sales events occur in NextLead","Update customer records based on external data sources","Identify and track website visitors"],"limitations":["Requires manual installation via n8n Community Nodes settings","Uses polling mechanism for triggers rather than webhooks (based on 'Trigger' feature description)","Requires NextLead API access and valid credentials"],"relatedNodes":["n8n-nodes-nextlead.nextLead","n8n-nodes-nextlead.nextLeadTrigger"]}


node_type: n8n-nodes-nextlead.nextLead
package_name: n8n-nodes-nextlead
display_name: NextLead
description: Interact with NextLead CRM API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: crcht
author_github_url: https://github.com/CREACH-Agency/nextlead-n8n.git
npm_package_name: n8n-nodes-nextlead
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:34.226Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "contact",
      "options": [
        {
          "name": "Action",
          "value": "action"
        },
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Group",
          "value": "group"
        },
        {
          "name": "Identify",
          "value": "identify"
        },
        {
          "name": "List",
          "value": "list"
        },
        {
          "name": "Sale",
          "value": "sale"
        },
        {
          "name": "Structure",
          "value": "structure"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a contact",
          "description": "Create a new contact"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a contact",
          "description": "Delete a contact"
        },
        {
          "name": "Find",
          "value": "find",
          "action": "Find a contact",
          "description": "Find a contact by email or LinkedIn"
        },
        {
          "name": "Get Conversion",
          "value": "getConversion",
          "action": "Get conversion statuses",
          "description": "Get conversion statuses"
        },
        {
          "name": "Get Custom Fields",
          "value": "getCustomFields",
          "action": "Get custom fields"
        },
        {
          "name": "Get Limit Status",
          "value": "getLimitStatus",
          "action": "Get contact limit status",
          "description": "Check contact limit and usage"
        },
        {
          "name": "Get Team",
          "value": "getTeam",
          "action": "Get team members",
          "description": "Get team members"
        },
        {
          "name": "Link to Structure",
          "value": "linkToStructure",
          "action": "Link a contact to a structure",
          "description": "Link a contact to a structure"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a contact",
          "description": "Update a contact"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a structure",
          "description": "Create a new structure"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a structure",
          "description": "Delete a structure"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many structures",
          "description": "Get many structures"
        },
        {
          "name": "Link to Contact",
          "value": "linkToContact",
          "action": "Link a structure to a contact",
          "description": "Link a structure to a contact"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a structure",
          "description": "Update a structure"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "structure"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a sale",
          "description": "Create a new sale"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete a sale",
          "description": "Delete a sale"
        },
        {
          "name": "Get Columns",
          "value": "getColumns",
          "action": "Get sales columns",
          "description": "Get sales stages/columns"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a sale",
          "description": "Update a sale"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sale"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an action",
          "description": "Create a new action"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an action",
          "description": "Delete an action"
        },
        {
          "name": "Get Columns",
          "value": "getColumns",
          "action": "Get action columns",
          "description": "Get action columns"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an action",
          "description": "Update an action"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "action"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a list",
          "description": "Create a new list"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many lists",
          "description": "Get many lists"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "list"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a group",
          "description": "Create a new group"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "group"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "user",
      "options": [
        {
          "name": "User",
          "value": "user",
          "action": "Identify user",
          "description": "Verify API key and identify organization"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "identify"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a contact",
      "description": "Create a new contact",
      "resource": "contact"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a contact",
      "description": "Delete a contact",
      "resource": "contact"
    },
    {
      "name": "Find",
      "value": "find",
      "action": "Find a contact",
      "description": "Find a contact by email or LinkedIn",
      "resource": "contact"
    },
    {
      "name": "Get Conversion",
      "value": "getConversion",
      "action": "Get conversion statuses",
      "description": "Get conversion statuses",
      "resource": "contact"
    },
    {
      "name": "Get Custom Fields",
      "value": "getCustomFields",
      "action": "Get custom fields",
      "resource": "contact"
    },
    {
      "name": "Get Limit Status",
      "value": "getLimitStatus",
      "action": "Get contact limit status",
      "description": "Check contact limit and usage",
      "resource": "contact"
    },
    {
      "name": "Get Team",
      "value": "getTeam",
      "action": "Get team members",
      "description": "Get team members",
      "resource": "contact"
    },
    {
      "name": "Link to Structure",
      "value": "linkToStructure",
      "action": "Link a contact to a structure",
      "description": "Link a contact to a structure",
      "resource": "contact"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a contact",
      "description": "Update a contact",
      "resource": "contact"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a structure",
      "description": "Create a new structure",
      "resource": "structure"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a structure",
      "description": "Delete a structure",
      "resource": "structure"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many structures",
      "description": "Get many structures",
      "resource": "structure"
    },
    {
      "name": "Link to Contact",
      "value": "linkToContact",
      "action": "Link a structure to a contact",
      "description": "Link a structure to a contact",
      "resource": "structure"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a structure",
      "description": "Update a structure",
      "resource": "structure"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a sale",
      "description": "Create a new sale",
      "resource": "sale"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete a sale",
      "description": "Delete a sale",
      "resource": "sale"
    },
    {
      "name": "Get Columns",
      "value": "getColumns",
      "action": "Get sales columns",
      "description": "Get sales stages/columns",
      "resource": "sale"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a sale",
      "description": "Update a sale",
      "resource": "sale"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create an action",
      "description": "Create a new action",
      "resource": "action"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an action",
      "description": "Delete an action",
      "resource": "action"
    },
    {
      "name": "Get Columns",
      "value": "getColumns",
      "action": "Get action columns",
      "description": "Get action columns",
      "resource": "action"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an action",
      "description": "Update an action",
      "resource": "action"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a list",
      "description": "Create a new list",
      "resource": "list"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many lists",
      "description": "Get many lists",
      "resource": "list"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a group",
      "description": "Create a new group",
      "resource": "group"
    },
    {
      "name": "User",
      "value": "user",
      "action": "Identify user",
      "description": "Verify API key and identify organization",
      "resource": "identify"
    }
  ]

npm_readme:
  # n8n-nodes-nextlead

  Community node for [n8n](https://n8n.io) that integrates [NextLead CRM](https://dashboard.nextlead.app).

  - **npm**: [n8n-nodes-nextlead](https://www.npmjs.com/package/n8n-nodes-nextlead)
  - **GitHub**: [CREACH-Agency/nextlead-n8n](https://github.com/CREACH-Agency/nextlead-n8n)

  ---

  ## Features

  | Resource | Operations |
  |---|---|
  | **Contact** | Create, Update, Delete, Find, Add Note |
  | **Structure** | Create, Update, Delete, List |
  | **Sale** | Create, Update, Delete |
  | **Action** | Create, Update, Delete |
  | **Group** | Create, Update, Delete, List |
  | **List** | Create, Update, Delete |
  | **Identify** | Identify visitor |
  | **Trigger** | Poll for new/updated contacts and events |

  ---

  ## Architecture

  ```
  nodes/NextLead/
  ├── NextLead.node.ts          # Main node — resource router
  ├── NextLeadTrigger.node.ts   # Polling trigger node
  ├── core/
  │   ├── BaseNextLeadNode.ts   # Abstract base class shared by both nodes
  │   ├── NextLeadApiService.ts # HTTP client wrapping the NextLead REST API
  │   ├── NextLeadErrorHandler.ts
  │   ├── ResourceManager.ts    # Dispatches operations to the right resource
  │   ├── interfaces/
  │   │   └── IResourceStrategy.ts  # Strategy interface for each resource
  │   └── types/
  │       ├── NextLeadTypes.ts       # ResourceType / OperationType enums
  │       ├── shared/ApiTypes.ts
  │       └── api/                   # Typed API response shapes
  ├── resources/
  │   ├── ContactResource.ts    # Implements IResourceStrategy for contacts
  │   ├── StructureResource.ts
  │   ├── SaleResource.ts
  │   ├── ActionResource.ts
  │   ├── GroupResource.ts
  │   ├── ListResource.ts
  │   ├── IdentifyResource.ts
  │   └── <resource>/
  │       └── <Resource>Fields.ts   # n8n field definitions per resource
  └── utils/
      ├── NodeExecuteUtils.ts
      ├── OperationHandlerUtils.ts
      ├── ResponseUtils.ts
      └── FieldDefinitionUtils.ts

  credentials/
  └── NextLeadApi.credentials.ts    # API key + domain credential

  dist/   # Compiled output (git-ignored, generated by build)
  ```

  ### Key design decisions

  - **Strategy pattern**: each resource (`ContactResource`, `SaleResource`, …) implements `IResourceStrategy`. `ResourceManager` picks the right one at runtime based on the `resource` parameter.
  - **BaseNextLeadNode**: shared abstract class that wires credentials, error handling, and execution lifecycle for both the regular node and the trigger node.
  - **NextLeadApiService**: thin wrapper around n8n's `helpers.requestWithAuthentication`, so auth headers are injected automatically from the stored credential.

  ---

  ## Local development

  ### Prerequisites

  - Node.js ≥ 20.15
  - pnpm (`npm install -g pnpm`)
  - A running n8n instance (local or Docker)

  ### Install dependencies

  ```bash
  pnpm install
  ```

  ### Build

  ```bash
  pnpm run build
  ```

  Compiled files are output to `dist/`. The build runs `tsc` then copies SVG icons via Gulp.

  ### Watch mode (rebuild on save)

  ```bash
  pnpm run dev
  ```

  ### Lint

  ```bash
  pnpm run lint        # check
  pnpm run lintfix     # auto-fix
  ```

  ### Format

  ```bash
  pnpm run format
  ```

  ### Test locally in n8n

  Link the package into a local n8n install so changes are reflected immediately:

  ```bash
  # In this repo
  npm link

  # In your n8n directory
  npm link n8n-nodes-nextlead
  ```

  Then restart n8n. The NextLead nodes will appear in the node picker.

  ---

  ## Publishing to npm

  > See [PUBLICATION_GUIDE.md](PUBLICATION_GUIDE.md) for the full step-by-step.

  ```bash
  # 1. Bump version
  npm version patch   # 0.1.0 → 0.1.1  (bug fix)
  npm version minor   # 0.1.0 → 0.2.0  (new feature)
  npm version major   # 0.1.0 → 1.0.0  (breaking change)

  # 2. Build and lint
  pnpm run build
  pnpm run lint

  # 3. Preview what will be published
  npm pack --dry-run

  # 4. Publish
  npm publish --access public
  ```

  The `prepublishOnly` script runs build + lint automatically before each publish.

  Only the `dist/` folder is shipped (configured via `"files"` in package.json).

  ### n8n community node requirements

  - Package name must start with `n8n-nodes-`
  - `keywords` must include `"n8n-community-node-package"`
  - License must be MIT
  - No heavy external dependencies

  After publishing, submit the node to the n8n community by opening an issue on [github.com/n8n-io/n8n](https://github.com/n8n-io/n8n) or posting on [community.n8n.io](https://community.n8n.io/).

  ---

  ## Setup for end users

  1. In n8n, go to **Settings > Community Nodes** and install `n8n-nodes-nextlead`.
  2. Create a **NextLead API** credential:
     - **API Key**: found in NextLead under *Settings > Automation > API Key*
     - **Domain**: your NextLead instance URL
  3. Add a **NextLead** node to your workflow and select a resource + operation.

  ---

  ## Resources

  - [NextLead API documentation](https://dashboard.nextlead.app/en/api-documentation)
  - [n8n community nodes docs](https://docs.n8n.io/integrations/community-nodes/)
  - [n8n community forum](https://community.n8n.io/)

  ---

  ## License

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

ai_documentation_summary:
  {"purpose":"A community n8n node that enables integration with the NextLead CRM API to manage contacts, sales, groups, and visitor identification.","capabilities":["Create, Update, Delete, Find contacts","Add notes to contacts","Manage CRM structures (create, update, delete, list)","Manage sales records (create, update, delete)","Manage actions (create, update, delete)","Manage groups (create, update, delete, list)","Manage lists (create, update, delete)","Identify website visitors","Poll for new or updated contacts and events"],"authentication":"API Key required (stored in n8n credential with API Key and Domain fields)","commonUseCases":["Automating contact management workflows in NextLead CRM","Syncing sales data between external systems and NextLead","Triggering actions based on new or updated CRM records","Identifying anonymous visitors and converting them to contacts"],"limitations":["Requires manual setup of API credentials in n8n"],"relatedNodes":["n8n-nodes-nextlead.nextLead","n8n-nodes-nextlead.nextLeadTrigger"]}


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

updated_at: 2026-07-14 14:40:34
author_name: jill-clicksend
author_github_url: https://github.com/ClickSend/integration-n8n.git
npm_package_name: n8n-nodes-clicksendsms
npm_version: 1.2.8
community_fetched_at: 2026-07-14T14:40:34.227Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "sms",
      "options": [
        {
          "name": "Send MMS",
          "value": "mms",
          "action": "Send MMS action"
        },
        {
          "name": "Send SMS",
          "value": "sms",
          "action": "Send SMS action"
        },
        {
          "name": "Send SMS Campaign",
          "value": "list",
          "action": "Send SMS campaign"
        }
      ],
      "required": true,
      "displayName": "Actions",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send a message",
          "description": "Send a message"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Send",
      "value": "send",
      "action": "Send a message",
      "description": "Send a message"
    }
  ]

npm_readme:
  # n8n-nodes-clicksendsms

  An [n8n](https://n8n.io) community node that lets you use [ClickSend](https://www.clicksend.com) inside your n8n workflows to send SMS, MMS, Fax, Voice messages, Letters, and Postcards — and to trigger workflows when an inbound SMS is received.

  ---

  ## Table of Contents

  - [Features](#features)
  - [Requirements](#requirements)
  - [Installation](#installation)
  - [Getting ClickSend Credentials](#getting-clicksend-credentials)
  - [Configuration in n8n](#configuration-in-n8n)
  - [Node Parameters](#node-parameters)
  - [Trigger Node](#trigger-node)
  - [Usage Examples](#usage-examples)
  - [Error Handling](#error-handling)
  - [Support](#support)

  ---

  ## Features

  **Action node:**
  - Send SMS
  - Send SMS to a Contact List

  **Trigger node:**
  - Receive inbound SMS via webhook

  ---

  ## Requirements

  - An active [ClickSend account](https://www.clicksend.com)
  - Your ClickSend **username** (the email you signed up with) and **API key**
  - n8n v0.200.0 or later

  ---

  ## Installation

  ### In n8n (recommended)

  1. Open n8n and go to **Settings → Community Nodes**
  2. Click **Install**
  3. Enter `n8n-nodes-clicksendsms` and click **Install**
  4. Restart n8n

  ### Manual / self-hosted

  ```bash
  npm install n8n-nodes-clicksendsms
  ```

  Then restart n8n.

  ---

  ## Getting ClickSend Credentials

  You need two things from your ClickSend account: your **username** and your **API key**.

  ### Step 1 — Log in to ClickSend

  Go to [https://dashboard.clicksend.com](https://dashboard.clicksend.com) and log in.

  ### Step 2 — Find your API key

  1. Click your name or avatar in the top-right corner
  2. Select **Account → Subaccounts & API** from the menu  
     (Direct link: [https://dashboard.clicksend.com/account/subaccounts](https://dashboard.clicksend.com/account/subaccounts))
  3. You will see your **Username** (your login email) and **API Key** listed on this page
  4. Copy both values

  > **Tip:** If you want a dedicated key, create a new subaccount on the same page and use that subaccount's username + API key instead.

  ---

  ## Configuration in n8n

  1. In your n8n workflow, add a **ClickSend** node
  2. Click **Create new credential** (or select an existing one)
  3. In the credential form:
     - **ClickSend Username** — paste your ClickSend login email
     - **ClickSend API Key** — paste the API key from the dashboard
  4. Click **Save**
  5. n8n will test the credential automatically by calling `GET /v3/account`

  ---

  ## Node Parameters

  ### Send SMS

  | Field | Required | Description |
  |---|---|---|
  | Sender / From | No | Select from your purchased dedicated numbers, own numbers, or alpha tags. Leave blank to use ClickSend's free shared numbers. |
  | Recipient / To | Yes | Recipient phone number in international format, e.g. `+61411111111` |
  | Message Body | Yes | SMS text. Standard SMS is 160 characters. |
  | Schedule | No | Date/time to send the message. Leave blank to send immediately. |
  | Custom String | No | Your internal reference tag (max 50 chars), e.g. `order_123` |

  ### Send SMS to a Contact List

  | Field | Required | Description |
  |---|---|---|
  | Sender / From | No | Same as above |
  | Contact List | Yes | Select a contact list from your ClickSend account |
  | Message Body | Yes | SMS text |
  | Schedule | No | Optional scheduled send time |
  | Custom String | No | Internal reference tag |


  ## Usage Examples

  ### Send an SMS

  1. Add a **ClickSend** node to your workflow
  2. Set **Action** → `Send SMS`
  3. Fill in **To** (e.g. `+61411111111`) and **Message Body**
  4. Leave **From** blank to use a shared sender, or select your dedicated number
  5. Execute the workflow

  ### Trigger a workflow on inbound SMS

  1. Add a **ClickSend Trigger** node as the first node in your workflow
  2. Set a **Rule Name**
  3. Activate the workflow
  4. Send an SMS to your ClickSend inbound number — your workflow will fire with the message data

  ---

  ## Error Handling

  - **`INVALID_RECIPIENT`** — The recipient number is invalid. Check the format (must be international, e.g. `+61411111111`).
  - **`INSUFFICIENT_CREDIT`** — Your ClickSend account is out of credit. Top up at [https://dashboard.clicksend.com/topup](https://dashboard.clicksend.com/topup).
  - **401 Unauthorized** — Your credentials are wrong. Re-check your username and API key.
  - **Credential test fails** — Make sure you are using your login email as the username, not a display name.

  ---

  ## Support

  - ClickSend API docs: [https://developers.clicksend.com/docs/rest/v3/](https://developers.clicksend.com/docs/rest/v3/)
  - ClickSend Help Centre: [https://help.clicksend.com](https://help.clicksend.com)
  - Issues with this node: open a GitHub issue at [https://github.com/ClickSend/integration-n8n/issues](https://github.com/ClickSend/integration-n8n/issues)

ai_documentation_summary:
  {"purpose":"A community n8n node that enables sending SMS, MMS, Fax, Voice messages, Letters, and Postcards via ClickSend API, and triggers workflows upon receiving inbound SMS messages.","capabilities":["Send SMS to individual recipients","Send SMS to contact lists","Send MMS messages","Send Fax messages","Send Voice messages","Send Letters","Send Postcards","Schedule message sends","Receive inbound SMS via webhook trigger","Use dedicated numbers or alpha tags as sender"],"authentication":"API key required (ClickSend Username and API Key)","commonUseCases":["Automated customer notifications and alerts","Two-factor authentication (2FA) verification codes","Order confirmations and shipping updates","Inbound SMS-based customer support routing","Marketing campaigns and promotional messages"],"limitations":["Standard SMS is limited to 160 characters","Requires an active ClickSend account with sufficient credit","Inbound SMS trigger requires sending a test message to the configured inbound number first","Credential test fails if the wrong username (not login email) is provided"],"relatedNodes":["n8n-nodes-core.webhook","n8n-nodes-core.httpRequest","n8n-nodes-core.code"]}


node_type: n8n-nodes-vibetrack.vibetrack
package_name: n8n-nodes-vibetrack
display_name: VibeTrack
description: Interact with VibeTrack.com API (powered by joergsebening.de)
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: rjsebening
author_github_url: https://github.com/rjsebening/
npm_package_name: n8n-nodes-vibetrack
npm_version: 0.0.8
community_fetched_at: 2026-07-14T14:40:34.228Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "project",
      "options": [
        {
          "name": "API Call",
          "value": "apiCall",
          "description": "Make a custom API call to the VibeTrack API"
        },
        {
          "name": "Attribution",
          "value": "attribution"
        },
        {
          "name": "Conversion Triggers",
          "value": "conversionTriggers"
        },
        {
          "name": "Conversions",
          "value": "conversions"
        },
        {
          "name": "Project",
          "value": "project"
        },
        {
          "name": "Team Member",
          "value": "teamMember"
        },
        {
          "name": "Webhooks",
          "value": "webhooks"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "makeRequest",
      "options": [
        {
          "name": "Get Authentication Data",
          "value": "getAuthenticationData",
          "action": "Get authentication data",
          "description": "Retrieve authentication data for the current API key"
        },
        {
          "name": "Make Request",
          "value": "makeRequest",
          "action": "Custom API call",
          "description": "Make a custom API call"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "apiCall"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "aggregate",
      "options": [
        {
          "name": "Aggregate",
          "value": "aggregate",
          "action": "Aggregate attribution data",
          "description": "Aggregate attribution data for selected identifiers"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "attribution"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getManyOnline",
      "options": [
        {
          "name": "Get Many Offline",
          "value": "getManyOffline",
          "action": "Get many offline conversion triggers",
          "description": "Retrieve active offline conversion triggers for a project"
        },
        {
          "name": "Get Many Online",
          "value": "getManyOnline",
          "action": "Get many online conversion triggers",
          "description": "Retrieve active online conversion triggers for a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "conversionTriggers"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getManyOnline",
      "options": [
        {
          "name": "Create Offline",
          "value": "createOffline",
          "action": "Create an offline conversion",
          "description": "Create and process an offline conversion"
        },
        {
          "name": "Get Many Online",
          "value": "getManyOnline",
          "action": "Get many online conversions",
          "description": "Retrieve many online conversions for a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "conversions"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many projects",
          "description": "Retrieve many projects"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "project"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "addOrInvite",
      "options": [
        {
          "name": "Add or Invite",
          "value": "addOrInvite",
          "action": "Add or invite a team member",
          "description": "Add an existing user or send an invitation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "teamMember"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a webhook subscription",
          "description": "Create a webhook subscription"
        },
        {
          "name": "Delete",
          "value": "deactivate",
          "action": "Delete a webhook subscription",
          "description": "Delete a webhook subscription"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a webhook subscription",
          "description": "Retrieve a webhook subscription"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many webhook subscriptions",
          "description": "Retrieve many webhook subscriptions"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a webhook subscription",
          "description": "Update a webhook subscription"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhooks"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Authentication Data",
      "value": "getAuthenticationData",
      "action": "Get authentication data",
      "description": "Retrieve authentication data for the current API key",
      "resource": "apiCall"
    },
    {
      "name": "Make Request",
      "value": "makeRequest",
      "action": "Custom API call",
      "description": "Make a custom API call",
      "resource": "apiCall"
    },
    {
      "name": "Aggregate",
      "value": "aggregate",
      "action": "Aggregate attribution data",
      "description": "Aggregate attribution data for selected identifiers",
      "resource": "attribution"
    },
    {
      "name": "Get Many Offline",
      "value": "getManyOffline",
      "action": "Get many offline conversion triggers",
      "description": "Retrieve active offline conversion triggers for a project",
      "resource": "conversionTriggers"
    },
    {
      "name": "Get Many Online",
      "value": "getManyOnline",
      "action": "Get many online conversion triggers",
      "description": "Retrieve active online conversion triggers for a project",
      "resource": "conversionTriggers"
    },
    {
      "name": "Create Offline",
      "value": "createOffline",
      "action": "Create an offline conversion",
      "description": "Create and process an offline conversion",
      "resource": "conversions"
    },
    {
      "name": "Get Many Online",
      "value": "getManyOnline",
      "action": "Get many online conversions",
      "description": "Retrieve many online conversions for a project",
      "resource": "conversions"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many projects",
      "description": "Retrieve many projects",
      "resource": "project"
    },
    {
      "name": "Add or Invite",
      "value": "addOrInvite",
      "action": "Add or invite a team member",
      "description": "Add an existing user or send an invitation",
      "resource": "teamMember"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a webhook subscription",
      "description": "Create a webhook subscription",
      "resource": "webhooks"
    },
    {
      "name": "Delete",
      "value": "deactivate",
      "action": "Delete a webhook subscription",
      "description": "Delete a webhook subscription",
      "resource": "webhooks"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a webhook subscription",
      "description": "Retrieve a webhook subscription",
      "resource": "webhooks"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many webhook subscriptions",
      "description": "Retrieve many webhook subscriptions",
      "resource": "webhooks"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a webhook subscription",
      "description": "Update a webhook subscription",
      "resource": "webhooks"
    }
  ]

npm_readme:
  # n8n-nodes-vibetrack

  ![n8n Community Node](https://img.shields.io/badge/n8n-community--node-FF6D5A)
  ![Version](https://img.shields.io/badge/version-0.0.1-blue)
  ![License](https://img.shields.io/badge/license-MIT-green)

  An n8n community node for the [Vibetrack](https://vibetrack.com) public API — read projects, triggers, conversions, and attribution data directly from your workflows.

  ---

  ## What is n8n?

  [n8n](https://n8n.io) is a workflow automation tool that connects apps and APIs (Vibetrack, CRMs, Slack, databases, webhooks, …) so processes run automatically instead of by hand.

  ---

  ## Overview

  Vibetrack is a conversion and ad-tracking platform. This node wraps the official Vibetrack API v1 so you can:

  - **Retrieve authentication data** through the API Call resource
  - **List all projects** your API key has access to
  - **List online conversions** with date range, trigger, email, limit, and offset filters
  - **Create offline conversions** for active offline triggers
  - **List online and offline conversion triggers** for a project
  - **Aggregate attribution data** for campaign, ad set, or ad identifiers
  - **Manage outgoing webhooks** for conversion.created events
  - **Add or invite team members** for project or workspace access
  - **Start workflows from Vibetrack webhooks** with the Vibetrack Trigger node

  ---

  ## Operations

  ### Resource: Project
  | Operation  | Description                                        |
  | ---------- | -------------------------------------------------- |
  | Get Many   | Lists all projects accessible via the API key      |

  ### Resource: API Call
  | Operation               | Description                                      |
  | ----------------------- | ------------------------------------------------ |
  | Get Authentication Data | Returns user metadata for the current API key    |
  | Make Request            | Makes a custom authenticated VibeTrack API call  |

  ### Resource: Conversion Triggers
  | Operation        | Description                               |
  | ---------------- | ----------------------------------------- |
  | Get Many Online  | Lists active online conversion triggers   |
  | Get Many Offline | Lists active offline conversion triggers  |

  ### Resource: Conversions
  | Operation       | Description                                        |
  | --------------- | -------------------------------------------------- |
  | Get Many Online | Lists online conversions for a project and filters |
  | Create Offline  | Sends one offline conversion                       |

  ### Resource: Attribution
  | Operation | Description                                      |
  | --------- | ------------------------------------------------ |
  | Aggregate | Aggregates attribution data for selected IDs     |

  ### Resource: Team Member
  | Operation     | Description                                  |
  | ------------- | -------------------------------------------- |
  | Add or Invite | Adds an existing user or sends an invitation |

  ### Resource: Webhooks
  | Operation  | Description                           |
  | ---------- | ------------------------------------- |
  | Get Many   | Lists project webhook endpoints       |
  | Create     | Creates a project webhook endpoint    |
  | Deactivate | Deactivates a project webhook endpoint |

  ### Node: Vibetrack Trigger
  Starts a workflow when Vibetrack sends a `conversion.created` webhook for a selected project.

  Project and trigger dropdowns are populated automatically, so you can pick entries by name instead of pasting IDs. JSON fields such as metadata and attribution mappings accept JSON expressions or plain JSON objects.

  ---

  ## Installation

  ### Requirements
  - n8n **2.0.0** or higher
  - A Vibetrack account with an **API key** (create one in your Vibetrack workspace settings)

  ### Install via Community Nodes

  1. In n8n, open **Settings → Community Nodes**
  2. Click **Install**
  3. Enter one of the package names below
  4. Restart n8n — the **Vibetrack** node will appear in the node panel

  #### Option 1 – Scoped (recommended)

  ```
  @rjsebening/n8n-nodes-vibetrack
  ```

  #### Option 2 – Unscoped

  ```
  n8n-nodes-vibetrack
  ```

  ---

  ## Credentials

  Create a new credential of type **Vibetrack API**:

  | Field        | Value                                        |
  | ------------ | -------------------------------------------- |
  | API Base URL | `https://api.vibetrack.com` (default)        |
  | API Key      | Your personal Vibetrack API key              |

  n8n sends the API key as `X-API-Key`. API paths include `/api/v1` as defined by the official OpenAPI specification.

  ---

  ## Example: fetch online conversions of a project

  1. Add a **Vibetrack** node
  2. Select Resource **Project**, Operation **Get Many** → you get the list of projects
  3. Add another **Vibetrack** node, Resource **Conversions**, Operation **Get Many Online**
  4. Pick the project from the dropdown, choose a date range, and optionally filter by trigger or email
  5. Execute — you receive the matching conversion records

  ---

  ## About the author

  Built by [Rezk Jörg Sebening](https://github.com/rjsebening) — n8n, API and automation work for the DACH region. Follow on GitHub for more community nodes.

  ---

  ## Disclaimer

  This is an **unofficial** community node. It is **not affiliated with, endorsed, or sponsored by Vibetrack**. It only provides an interface to the publicly available Vibetrack API under Vibetrack's terms of use.

  - Maintained by the community
  - For issues with the Vibetrack API itself, please contact Vibetrack directly
  - All Vibetrack trademarks and logos belong to Vibetrack

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation workflows to interact with the Vibetrack.com public API, allowing users to retrieve project lists and conversion events.","capabilities":["List all projects accessible via API key","List conversion events for a specific project","Select projects by name via dropdown instead of ID","Automatic credential verification on save"],"authentication":"API Key required","commonUseCases":["Automated reporting of conversion events","Tracking project performance across multiple domains","Integrating ad-tracking data into CRM or database workflows"],"limitations":["Limited to public API endpoints only","Node version is 0.0.1 (pre-release)","Not affiliated with or endorsed by Vibetrack"],"relatedNodes":["Webhook","HTTP Request","Code"]}


node_type: @dms-one/n8n-nodes-flex.flex
package_name: @dms-one/n8n-nodes-flex
display_name: Flex
description: Integrate with Flex API for task management
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: yanoo
author_github_url: https://github.com/dmsreg/n8n-nodes-dmsone-flex.git
npm_package_name: @dms-one/n8n-nodes-flex
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:34.229Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "task",
      "options": [
        {
          "name": "Task",
          "value": "task"
        },
        {
          "name": "User",
          "value": "user"
        },
        {
          "name": "Workflow",
          "value": "workflow"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Accept",
          "value": "accept",
          "action": "Accept task",
          "description": "Accept a task"
        },
        {
          "name": "Comment",
          "value": "comment",
          "action": "Comment on a task",
          "description": "Add a comment to a task"
        },
        {
          "name": "Complete",
          "value": "complete",
          "action": "Complete task",
          "description": "Mark a task as complete"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a task",
          "description": "Create a new task"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List tasks",
          "description": "List tasks by status"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getByUsername",
      "options": [
        {
          "name": "Get by Username",
          "value": "getByUsername",
          "action": "Get user by username",
          "description": "Get user information by username"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get diagnostic",
          "description": "Get diagnostic"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "diagnostic"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTemplates",
      "options": [
        {
          "name": "Add Task Comment",
          "value": "addTaskComment",
          "action": "Add task comment",
          "description": "Add a comment to a workflow task"
        },
        {
          "name": "Complete Task",
          "value": "completeTask",
          "action": "Complete task",
          "description": "Complete a workflow task with result and optional comment"
        },
        {
          "name": "Download Attachment",
          "value": "downloadAttachment",
          "action": "Download attachment",
          "description": "Download a specific attachment by GUID"
        },
        {
          "name": "Get Available Templates",
          "value": "getTemplates",
          "action": "Get available templates",
          "description": "Get all available workflow templates"
        },
        {
          "name": "Get My Tasks",
          "value": "getMyTasks",
          "action": "Get my tasks",
          "description": "Get workflow tasks assigned to the current user"
        },
        {
          "name": "Get Task Attachments",
          "value": "getTaskAttachments",
          "action": "Get task attachments",
          "description": "Get attachments for a specific workflow task"
        },
        {
          "name": "Get Task Comments",
          "value": "getTaskComments",
          "action": "Get task comments",
          "description": "Get comments for a specific workflow task"
        },
        {
          "name": "Get Task Details",
          "value": "getTaskDetails",
          "action": "Get task details",
          "description": "Get details of a specific workflow task"
        },
        {
          "name": "Get Task Related Attachments",
          "value": "getTaskRelatedAttachments",
          "action": "Get task related attachments",
          "description": "Get attachments related to a specific workflow task"
        },
        {
          "name": "Get Template Details",
          "value": "getTemplateDetails",
          "action": "Get template details",
          "description": "Get required metadata fields for a specific template"
        },
        {
          "name": "Start Workflow",
          "value": "start",
          "action": "Start workflow",
          "description": "Start a new workflow process with metadata fields"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "workflow"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Accept",
      "value": "accept",
      "action": "Accept task",
      "description": "Accept a task",
      "resource": "task"
    },
    {
      "name": "Comment",
      "value": "comment",
      "action": "Comment on a task",
      "description": "Add a comment to a task",
      "resource": "task"
    },
    {
      "name": "Complete",
      "value": "complete",
      "action": "Complete task",
      "description": "Mark a task as complete",
      "resource": "task"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a task",
      "description": "Create a new task",
      "resource": "task"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List tasks",
      "description": "List tasks by status",
      "resource": "task"
    },
    {
      "name": "Get by Username",
      "value": "getByUsername",
      "action": "Get user by username",
      "description": "Get user information by username",
      "resource": "user"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get diagnostic",
      "description": "Get diagnostic",
      "resource": "diagnostic"
    },
    {
      "name": "Add Task Comment",
      "value": "addTaskComment",
      "action": "Add task comment",
      "description": "Add a comment to a workflow task",
      "resource": "workflow"
    },
    {
      "name": "Complete Task",
      "value": "completeTask",
      "action": "Complete task",
      "description": "Complete a workflow task with result and optional comment",
      "resource": "workflow"
    },
    {
      "name": "Download Attachment",
      "value": "downloadAttachment",
      "action": "Download attachment",
      "description": "Download a specific attachment by GUID",
      "resource": "workflow"
    },
    {
      "name": "Get Available Templates",
      "value": "getTemplates",
      "action": "Get available templates",
      "description": "Get all available workflow templates",
      "resource": "workflow"
    },
    {
      "name": "Get My Tasks",
      "value": "getMyTasks",
      "action": "Get my tasks",
      "description": "Get workflow tasks assigned to the current user",
      "resource": "workflow"
    },
    {
      "name": "Get Task Attachments",
      "value": "getTaskAttachments",
      "action": "Get task attachments",
      "description": "Get attachments for a specific workflow task",
      "resource": "workflow"
    },
    {
      "name": "Get Task Comments",
      "value": "getTaskComments",
      "action": "Get task comments",
      "description": "Get comments for a specific workflow task",
      "resource": "workflow"
    },
    {
      "name": "Get Task Details",
      "value": "getTaskDetails",
      "action": "Get task details",
      "description": "Get details of a specific workflow task",
      "resource": "workflow"
    },
    {
      "name": "Get Task Related Attachments",
      "value": "getTaskRelatedAttachments",
      "action": "Get task related attachments",
      "description": "Get attachments related to a specific workflow task",
      "resource": "workflow"
    },
    {
      "name": "Get Template Details",
      "value": "getTemplateDetails",
      "action": "Get template details",
      "description": "Get required metadata fields for a specific template",
      "resource": "workflow"
    },
    {
      "name": "Start Workflow",
      "value": "start",
      "action": "Start workflow",
      "description": "Start a new workflow process with metadata fields",
      "resource": "workflow"
    }
  ]

npm_readme:
  # @dms-one/n8n-nodes-flex

  [n8n](https://n8n.io/) community node package for **DMS One Flex** — document and workflow APIs you can call from workflows.

  Flex is the web-facing layer of the DMS One stack. This package exposes a single **Flex** node with multiple resources (tasks, users, workflow tasks).

  **Contents:** [Installation](#installation) · [Credentials and tokens](#credentials-and-tokens) · [Impersonation header](#impersonation-station-token-only) · [Resources and operations](#resources-and-operations) · [Example workflow](#example-workflow) · [Links](#links)

  ---

  ## Installation

  Install as a [community node](https://docs.n8n.io/integrations/community-nodes/installation/) (self-hosted n8n). The package name is:

  `@dms-one/n8n-nodes-flex`

  After installation, add **Flex API** credentials (see below) and use the **Flex** node in your workflows.

  For packaging standards and submitting to the community index, see [Submit community nodes](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/) and the [verification guidelines](https://docs.n8n.io/integrations/creating-nodes/build/reference/verification-guidelines/).

  ---

  ## Credentials and tokens

  Create **Flex API** credentials in n8n and set:

  | Field | Purpose |
  | --- | --- |
  | **Base URL** | Flex API root (default `https://flex.dmsone.hu/api`). Use your tenant URL if your organization hosts Flex elsewhere. |
  | **Authentication Method** | `Personal Access Token` or `Station Token`. |
  | **Token** | The secret string for the chosen method. |
  | **Impersonated User Email** | Shown only for **Station Token** — optional email of the user to act as (see [Impersonation](#impersonation-station-token-only)). |
  | **Ignore SSL Issues** | Only for dev/self-signed certs; not recommended in production. |

  ### Personal Access Token (PAT)

  1. Sign in to your organization’s **Flex** web application (e.g. [flex.dmsone.hu](https://flex.dmsone.hu) if that is your tenant).
  2. Open the **user / account menu** (typically from your name or avatar in the UI).
  3. Use the menu entry for **personal access tokens** (wording may match your Flex locale) and **create** a new token.
  4. Copy the token into n8n **Token** and set **Authentication Method** to **Personal Access Token**.

  PATs run API calls **as you**. They can **expire**; renew or replace the token in credentials when Flex reports it invalid.

  ### Station token

  A **station** (machine / integration) token is a **service** credential, usually **created or distributed by a Flex administrator** in your organization — not from the same personal menu as a PAT. Paste it into **Token** and set **Authentication Method** to **Station Token**.

  Use a station token when automation should run under a dedicated integration account and optionally **impersonate** different users via email (below).

  ---

  ## Impersonation (station token only)

  When **Authentication Method** is **Station Token**, you can set **Impersonated User Email** to a Flex user’s **email address**.

  For each HTTP request, the credential adds:

  `X-Impersonated-User-Email: <that email>`

  so the Flex API treats the call as that user (subject to server-side permissions). If the field is **empty**, that header is **not** sent and the call uses the station token’s own identity.

  **Personal Access Token** mode does **not** use this header; the PAT already identifies a single user.

  ---

  ## Resources and operations

  In the **Flex** node, pick a **Resource**, then an **Operation**.

  ### Task (`task`)

  | Operation | What it does |
  | --- | --- |
  | **Create** | Start a new DMS task (`POST /dms/task/start`). |
  | **Comment** | Add a comment on a task. |
  | **Accept** | Accept a task. |
  | **Complete** | Mark a task complete. |
  | **List** | List tasks by status (`in-progress`, `completed`, `pending`, `all`). |

  ### User (`user`)

  | Operation | What it does |
  | --- | --- |
  | **Get by Username** | Resolve a user by Flex username. |

  ### Workflow (`workflow`)

  Workflow operations target **workflow engine** tasks (templates, assignments, attachments), distinct from the simple **Task** resource above.

  | Operation | What it does |
  | --- | --- |
  | **Get Available Templates** | List workflow templates. |
  | **Get Template Details** | Metadata / required fields for a template. |
  | **Start Workflow** | Start a process from a template (including metadata and optional files). |
  | **Get My Tasks** | Tasks assigned to the current (or impersonated) user. |
  | **Get Task Details** | Full detail for one workflow task. |
  | **Complete Task** | Complete a workflow task with result and optional comment. |
  | **Get Task Comments** / **Add Task Comment** | Read or add comments on a workflow task. |
  | **Get Task Attachments** / **Get Task Related Attachments** | List attachments for a task. |
  | **Download Attachment** | Download a file by attachment GUID. |

  ---

  ## Example workflow

  **Goal:** Start a workflow from a template, using fields returned by Flex.

  1. **Credentials** — Create **Flex API** with a PAT or station token (+ impersonation email if needed). Test with **Credential → Test** (calls `GET …/diag`).
  2. **Trigger** — e.g. **Manual Trigger** or your real trigger (webhook, schedule).
  3. **Flex (1)** — Resource **Workflow**, operation **Get Available Templates**. Note a `id` (and name) of the template you need.
  4. **Flex (2)** — Resource **Workflow**, operation **Get Template Details**, **Template ID** from step 3. Inspect the output so you know required metadata keys and types.
  5. **Flex (3)** — Resource **Workflow**, operation **Start Workflow**. Choose the same template, fill **metadata** (and optional binary **files**) according to step 2’s structure. Execute the workflow.

  A smaller alternative: **Workflow → Get My Tasks** → **Get Task Details** on one task id → **Add Task Comment** to append a note from n8n.

  ---

  ## Links

  - [Flex](https://flex.dmsone.hu) (default product URL; yours may differ.)
  - [n8n community nodes](https://docs.n8n.io/integrations/community-nodes/)
  - [Submit community nodes](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/)
  - Source: [github.com/dmsreg/n8n-nodes-dmsone-flex](https://github.com/dmsreg/n8n-nodes-dmsone-flex)

  ## License

  MIT (see `license` in [package.json](package.json)).

ai_documentation_summary:
  {"purpose":"Integrates with the DMS One Flex API to manage tasks, users, and workflow templates within n8n workflows.","capabilities":["Create new DMS tasks","Comment on tasks","Accept and complete tasks","List tasks by status (in-progress, completed, pending, all)","Resolve users by username","List workflow templates","Get workflow template details and metadata","Start workflows from templates with metadata and files","Manage workflow task assignments and comments","Download task attachments"],"authentication":"API Key (Personal Access Token or Station Token)","commonUseCases":["Automating document management workflows","Triggering tasks based on external events","Managing task assignments and status updates","Processing workflow templates with dynamic metadata"],"limitations":["Impersonation feature is only available with Station Token authentication","Personal Access Tokens can expire and require renewal","SSL certificate issues must be handled manually (not recommended for production)"],"relatedNodes":["Manual Trigger","Webhook","Schedule Trigger","HTTP Request"]}


node_type: n8n-nodes-contentstudio.contentStudio
package_name: n8n-nodes-contentstudio
display_name: ContentStudio
description: Integrate with ContentStudio API
category: Community
development_style: declarative
version: 5
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: contentstudio
author_github_url: https://github.com/d4interactive/n8n-nodes.git
npm_package_name: n8n-nodes-contentstudio
npm_version: 2.0.10
community_fetched_at: 2026-07-14T14:40:34.230Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "auth",
      "options": [
        {
          "name": "Auth",
          "value": "auth"
        },
        {
          "name": "Campaign",
          "value": "campaign"
        },
        {
          "name": "Comment",
          "value": "comment"
        },
        {
          "name": "Content Category",
          "value": "contentCategory"
        },
        {
          "name": "Label",
          "value": "label"
        },
        {
          "name": "Media",
          "value": "media"
        },
        {
          "name": "Post",
          "value": "post"
        },
        {
          "name": "Social Account",
          "value": "socialAccount"
        },
        {
          "name": "Team Member",
          "value": "teamMember"
        },
        {
          "name": "Workspace",
          "value": "workspace"
        }
      ],
      "required": true,
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "validateKey",
      "options": [
        {
          "name": "Validate Key",
          "value": "validateKey",
          "action": "Validate API key"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "auth"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List workspaces"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "workspace"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Social Accounts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "socialAccount"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Content Categories"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contentCategory"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Labels"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "label"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Campaigns"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "campaign"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Media"
        },
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload Media"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "media"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Team Members"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "teamMember"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Comments"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Add Comment"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "comment"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List Posts"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create Social Post"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete Post"
        },
        {
          "name": "Approve/Reject",
          "value": "approve",
          "action": "Approve or Reject Post"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "post"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Validate Key",
      "value": "validateKey",
      "action": "Validate API key",
      "resource": "auth"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List workspaces",
      "resource": "workspace"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Social Accounts",
      "resource": "socialAccount"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Content Categories",
      "resource": "contentCategory"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Labels",
      "resource": "label"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Campaigns",
      "resource": "campaign"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Media",
      "resource": "media"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload Media",
      "resource": "media"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Team Members",
      "resource": "teamMember"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Comments",
      "resource": "comment"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Add Comment",
      "resource": "comment"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List Posts",
      "resource": "post"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create Social Post",
      "resource": "post"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete Post",
      "resource": "post"
    },
    {
      "name": "Approve/Reject",
      "value": "approve",
      "action": "Approve or Reject Post",
      "resource": "post"
    }
  ]

npm_readme:
  # n8n ContentStudio Nodes

  This package provides n8n community nodes for integrating with ContentStudio API, enabling workflow automation for social media management.

  ## Installation

  ### In n8n (Recommended)
  1. Go to **Settings** > **Community Nodes**
  2. Click **Install**
  3. Enter package name: `n8n-nodes-contentstudio`
  4. Click **Install**

  ### Via npm
  ```bash
  npm install n8n-nodes-contentstudio
  ```

  ## Prerequisites

  - n8n version 0.187.0 or later
  - ContentStudio account with API access
  - ContentStudio API key

  ## Credentials

  This node requires a ContentStudio API key:

  1. **API Key**: Your ContentStudio X-API-Key

  The API base URL is built into the node, so users only need to provide their API key.

  ## Operations

  ### Resources

  - **Auth**: Validate API key
  - **Workspace**: List, create, update, and delete workspaces
  - **Social Account**: List social accounts
  - **Post**: Create, list, and delete posts

  ### Post Operations

  #### Create Post
  - **Content Text**: Post content/caption
  - **Media Images**: Add multiple image URLs
  - **Media Video**: Add video URL
  - **Accounts**: Select social media accounts
  - **Publish Type**: Scheduled (with date/time)

  #### List Posts
  - **Workspace**: Select workspace
  - **Date filters**: Optional date range filtering

  #### Delete Post
  - **Workspace**: Select workspace
  - **Post ID**: Enter post ID to delete

  ## Features

  - **Dynamic Dropdowns**: Auto-populated workspace and account selections
  - **User-Friendly Media Input**: Easy image and video URL management
  - **Content Validation**: Ensures at least one content type is provided
  - **Date Validation**: Proper scheduling format enforcement
  - **Error Handling**: Comprehensive error messages and validation

  ## API Compatibility

  This node works with ContentStudio API v1 and supports:
  - Multiple API response formats
  - Various entity identifier fields (`id`, `_id`, `uuid`)
  - Robust error handling and fallbacks

  ## Example Workflow

  1. **List Workspaces** → Get available workspaces
  2. **List Social Accounts** → Get connected social media accounts
  3. **Create Post** → Schedule content across multiple platforms
  4. **List Posts** → Monitor created posts
  5. **Delete Post** → Remove posts when needed

  ## Support

  - **Issues**: [GitHub Issues](https://github.com/contentstudio/n8n-nodes-contentstudio/issues)
  - **Documentation**: [ContentStudio API Docs](https://docs.contentstudio.io/)
  - **n8n Community**: [n8n Community Forum](https://community.n8n.io/)

  ## Releasing

  Publishing to npm is automated via [.github/workflows/publish.yml](.github/workflows/publish.yml) using npm Trusted Publishing (OIDC) — no tokens required.

  **The workflow does NOT run on PR merges** (to `main` or any other branch). It runs only when:

  1. A tag matching `v*` is pushed — e.g. `v2.0.8`, `v2.1.0`. This is the normal release path.
  2. It is triggered manually from the **Actions** tab on GitHub (workflow_dispatch).

  ### Release steps

  1. Merge your changes into `main` as normal — nothing publishes yet.
  2. Bump `version` in `package.json` and merge that commit.
  3. Tag the commit and push the tag:

     ```bash
     git tag v2.0.8
     git push origin v2.0.8
     ```

  4. The tag push triggers the workflow → builds, publishes `n8n-nodes-contentstudio@<version>` to npm with provenance.
  5. Watch progress at: https://github.com/d4interactive/n8n-nodes/actions

  ## License

  MIT

  ## Keywords

  n8n, workflow, contentstudio, social media, automation, api, content management

ai_documentation_summary:
  {"purpose":"Integrates with the ContentStudio API to automate social media management workflows, including creating, listing, and deleting posts across multiple platforms.","capabilities":["Validate API key","List workspaces","List social media accounts","Create posts with text content","Add multiple image URLs to posts","Add video URLs to posts","Schedule posts with specific date/time","List posts with date range filtering","Delete posts by ID","Dynamic dropdown population for workspaces and accounts"],"authentication":"API key required (ContentStudio X-API-Key)","commonUseCases":["Automated social media content scheduling","Multi-platform post management","Social media analytics and post monitoring","Automated content removal or cleanup"],"limitations":["Requires n8n version 0.187.0 or later","Requires active ContentStudio account with API access","API base URL is hardcoded within the node"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.set","n8n-nodes-base.waitUntil"]}


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

updated_at: 2026-07-14 14:40:34
author_name: nielstroobantsda
author_github_url: https://github.com/Dots-And-Arrows/n8n-custom-runn-node.git
npm_package_name: n8n-nodes-runn-dotsandarrows
npm_version: 1.0.9
community_fetched_at: 2026-07-14T14:40:34.231Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-runn-dotsandarrows

  This is an n8n community node. It lets you use the **Runn** API in your n8n workflows.

  Runn is a resource planning and project forecasting platform. This node allows you to manage people, projects, and clients, and react to changes in real time using the trigger node.

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

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

  ## Installation

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

  ### Local Development

  ```bash
  # Install dependencies
  npm install

  # Build before you run
  npm run build

  # Start n8n with the custom node loaded (recommended)
  npm run dev

  # Alternative: use globally installed n8n
  npm run dev:local
  ```

  ## Operations

  ### Actuals

  | Operation          | Description                                                                                         |
  | ------------------ | --------------------------------------------------------------------------------------------------- |
  | **Create or Update** | Create or update an actual. Overwrites any existing actual for the same date, person, project, role, and workstream. |
  | **Delete**         | Delete an actual by ID                                                                              |
  | **Get All**        | Get all actuals, with an optional **Modified After** date filter                                    |

  ### Assignments

  | Operation   | Description                                                                                                     |
  | ----------- | --------------------------------------------------------------------------------------------------------------- |
  | **Create**  | Create a new assignment. Required: Person ID, Project ID, Role ID, Start Date, End Date, Minutes Per Day. Optional: Billable, Include Non-Working Days, Note, Phase ID, Workstream ID |
  | **Delete**  | Delete an assignment by ID                                                                          |
  | **Get All** | Get all assignments, with optional filters: Person ID, Project ID, Role ID, Start Date, End Date, Modified After, Only Active |

  ### People

  | Operation   | Description              |
  | ----------- | ------------------------ |
  | **Archive** | Archive a person         |
  | **Create**  | Create a new person      |
  | **Delete**  | Delete a person          |
  | **Get All** | Get all people           |
  | **Get One** | Get a single person      |
  | **Unarchive** | Unarchive a person     |
  | **Update**  | Update a person          |

  ### Projects

  | Operation    | Description                |
  | ------------ | -------------------------- |
  | **Add Note** | Add a note to a project    |
  | **Archive**  | Archive a project          |
  | **Create**   | Create a new project       |
  | **Delete**   | Delete a project           |
  | **Get All**  | Get all projects           |
  | **Get One**  | Get a single project       |
  | **Unarchive** | Unarchive a project       |
  | **Update**   | Update a project           |

  ### Clients

  | Operation     | Description           |
  | ------------- | --------------------- |
  | **Archive**   | Archive a client      |
  | **Create**    | Create a new client   |
  | **Get All**   | Get all clients       |
  | **Get One**   | Get a single client   |
  | **Unarchive** | Unarchive a client    |
  | **Update**    | Update a client       |

  ### Contracts

  | Operation   | Description                                                                                                    |
  | ----------- | -------------------------------------------------------------------------------------------------------------- |
  | **Get All** | Get all contracts, with optional filters: Modified After, Sort By (id / createdAt / updatedAt), Order (asc / desc) |

  ### Time Offs

  | Operation        | Description                                                                                                              |
  | ---------------- | ------------------------------------------------------------------------------------------------------------------------ |
  | **Create Leave** | Create a leave time off for a person. Automatically merges overlapping time offs. Required: Person ID, Start Date, End Date. Optional: Minutes Per Day, Note. |
  | **Get All Leave** | Get all leave time offs, with optional filters: Person ID, Start Date, End Date, Modified After, Sort By, Order.        |

  ### Runn Trigger

  The trigger node polls the Runn API and fires when records are created, updated, or deleted.

  **Resources:** People, Projects, Clients, Assignments, Actuals, Contracts, Users, Teams

  **Events:** Created, Updated, Deleted

  Each trigger output includes a `runnLink` field with a direct link to the changed record in the Runn app.

  ## Credentials

  To use this node you need a Runn API key:

  | Field       | Description                                                                               |
  | ----------- | ----------------------------------------------------------------------------------------- |
  | **API Key** | Your Runn API key. Generate one in Runn under **Settings → API**. |

  The node authenticates using a `Bearer` token in the `Authorization` header.

  ## Compatibility

  - Requires Node.js **v18** or higher
  - Uses the [`runn-api-client`](https://www.npmjs.com/package/runn-api-client) npm package

  ## Usage

  1. Add the **Runn** node (or **Runn Trigger**) to your workflow
  2. Configure your Runn API credentials
  3. Select a resource (**Actuals**, **Assignments**, **Clients**, **Contracts**, **People**, **Projects**, or **Time Offs**)
  4. Choose an operation
  5. Fill in the required parameters
  6. Execute the workflow

  **Tip:** Use the **Runn Trigger** node to automatically start workflows when records change in Runn — no webhooks required, it uses polling.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Runn API documentation](https://developer.runn.io/reference/)
  - [How to generate a Runn API token](https://help.runn.io/en/articles/7039247-how-to-generate-an-api-token-in-runn)
  - [GitHub repository](https://github.com/Dots-And-Arrows/n8n-custom-runn-node)

  ## Attribution

  This project is based on [n8n-nodes-runn](https://github.com/itspoma/n8n-nodes-runn) by Roman Rodomansky @ Ralabs, which is in turn based on the n8n community node starter template. Both are released under the MIT License. This package extends the original with additional resources, operations, and improvements.

  ## Version history

  ### 1.0.9

  - Wrapped raw HTTP errors in `NodeApiError` so status codes and response bodies surface correctly in the n8n UI
  - Renamed resource options to singular: Actual, Assignment, Client, Contract, Person, Project, Time Off

  ### 1.0.8

  - Replaced `runn-api-client` npm dependency with n8n's built-in `httpRequestWithAuthentication` helper — removes the external dependency that blocked n8n Cloud vetting
  - Converted trigger node from `setInterval`-based polling to n8n's native `polling: true` + `poll()` pattern
  - Added `authenticate` property to credentials so auth headers are injected automatically by n8n

  ### 1.0.7

  - Added **Time Offs resource** with Create Leave (POST `/time-offs/leave/`) and Get All Leave (GET `/time-offs/leave/`) operations

  ### 1.0.6

  - Added **Contracts resource** with Get All operation (GET `/contracts/`), supporting optional filters: Modified After, Sort By, and Order

  ### 1.0.5

  - Added **Delete** operation to Assignments resource
  - Fixed date timezone bug: dates no longer shift by one day for users in timezones ahead of UTC

  ### 1.0.4

  - Added **Create** operation to Assignments resource (POST `/assignments/`) with required fields (Person ID, Project ID, Role ID, Start Date, End Date, Minutes Per Day) and optional fields (Billable, Include Non-Working Days, Note, Phase ID, Workstream ID)

  ### 1.0.3

  - Added **Assignments resource** with Get All operation, supporting server-side filters (Person ID, Project ID, Role ID, Start Date, End Date, Modified After) and client-side Only Active filter

  ### 1.0.2

  - Added **Actuals resource** with Create or Update, Delete, and Get All operations

  ### 1.0.1

  - Added **Team ID or Name** field to the People > Create operation — accepts either a numeric ID or a team name (resolved automatically)
  - Fixed credential test: corrected API base URL and added required headers so the green "Connection tested" badge now appears
  - Fixed `updatePerson`: First Name, Last Name, and Email are no longer required fields (partial updates now work)
  - Fixed trigger node: removed duplicate fields in trigger output
  - Fixed error handling: all write operations now handle network errors safely
  - Removed debug-level logging from production API calls

  ### 1.0.0

  - Initial release
  - **People resource** with Archive, Create, Delete, Get All, Get One, Unarchive, and Update operations
  - **Projects resource** with Add Note, Archive, Create, Delete, Get All, Get One, Unarchive, and Update operations
  - **Clients resource** with Archive, Create, Get All, Get One, Unarchive, and Update operations
  - **Runn Trigger** node for polling-based event detection across all resources
  - Bearer token authentication with credential test

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with the Runn API to manage resource planning and project forecasting, allowing workflows to react to real-time changes in people, projects, clients, and assignments.","capabilities":["Trigger on Runn events (Created, Updated, Deleted)","Create or update actuals","Delete actuals","Get all actuals with date filtering","Create assignments with required fields (Person ID, Project ID, Role ID, Start Date, End Date, Minutes Per Day)","Delete assignments","Get all assignments with optional filters","Archive and unarchive people","Create, delete, get all, get one, and update people","Archive and unarchive projects"],"authentication":"API key required (Bearer token in Authorization header)","commonUseCases":["Automatically trigger n8n workflows when a new project is created in Runn","Monitor changes to team assignments and alert stakeholders","Automate resource allocation based on project updates","Track leave time off requests and notify managers","Sync Runn data changes to external CRM or project management tools"],"limitations":["Community node (not official n8n node)","Requires Node.js v18 or higher","Requires external Runn API key and account","Uses third-party npm package (runn-api-client)","Trigger node polls the API rather than pushing events"],"relatedNodes":["Runn (Mutations/Operations)","HTTP Request","Webhook","General Trigger nodes"]}


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

updated_at: 2026-07-14 14:40:34
author_name: nielstroobantsda
author_github_url: https://github.com/Dots-And-Arrows/n8n-custom-runn-node.git
npm_package_name: n8n-nodes-runn-dotsandarrows
npm_version: 1.0.9
community_fetched_at: 2026-07-14T14:40:34.232Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "people",
      "options": [
        {
          "name": "Actual",
          "value": "actuals"
        },
        {
          "name": "Assignment",
          "value": "assignments"
        },
        {
          "name": "Client",
          "value": "clients"
        },
        {
          "name": "Contract",
          "value": "contracts"
        },
        {
          "name": "Person",
          "value": "people"
        },
        {
          "name": "Project",
          "value": "projects"
        },
        {
          "name": "Time Off",
          "value": "timeOffs"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetchAllActuals",
      "options": [
        {
          "name": "Create or Update",
          "value": "createOrUpdateActual",
          "action": "Create or update an actual",
          "description": "Create or update an actual. Overwrites any existing actual for the same date, person, project, role, and workstream."
        },
        {
          "name": "Delete",
          "value": "deleteActual",
          "action": "Delete an actual",
          "description": "Delete an actual by ID"
        },
        {
          "name": "Get All",
          "value": "fetchAllActuals",
          "action": "Get all actuals",
          "description": "Get all actuals"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "actuals"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetchAllAssignments",
      "options": [
        {
          "name": "Create",
          "value": "createAssignment",
          "action": "Create an assignment",
          "description": "Create a new assignment"
        },
        {
          "name": "Delete",
          "value": "deleteAssignment",
          "action": "Delete an assignment",
          "description": "Delete an assignment by ID"
        },
        {
          "name": "Get All",
          "value": "fetchAllAssignments",
          "action": "Get all assignments",
          "description": "Get all assignments"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "assignments"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetchAllClients",
      "options": [
        {
          "name": "Archive",
          "value": "archiveClient",
          "action": "Archive a client",
          "description": "Archive a client"
        },
        {
          "name": "Create",
          "value": "createClient",
          "action": "Create a client",
          "description": "Create a new client"
        },
        {
          "name": "Get All",
          "value": "fetchAllClients",
          "action": "Get all clients",
          "description": "Get all clients"
        },
        {
          "name": "Get One",
          "value": "fetchClient",
          "action": "Get a client",
          "description": "Get a single client"
        },
        {
          "name": "Unarchive",
          "value": "unarchiveClient",
          "action": "Unarchive a client",
          "description": "Unarchive a client"
        },
        {
          "name": "Update",
          "value": "updateClient",
          "action": "Update a client",
          "description": "Update a client"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "clients"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetchAllContracts",
      "options": [
        {
          "name": "Get All",
          "value": "fetchAllContracts",
          "action": "Get all contracts",
          "description": "Get all contracts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contracts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetchAllProjects",
      "options": [
        {
          "name": "Add Note",
          "value": "addNote",
          "action": "Add a note to a project",
          "description": "Add a note to a project"
        },
        {
          "name": "Archive",
          "value": "archiveProject",
          "action": "Archive a project",
          "description": "Archive a project"
        },
        {
          "name": "Create",
          "value": "createProject",
          "action": "Create a project",
          "description": "Create a new project"
        },
        {
          "name": "Delete",
          "value": "deleteProject",
          "action": "Delete a project",
          "description": "Delete a project"
        },
        {
          "name": "Get All",
          "value": "fetchAllProjects",
          "action": "Get all projects",
          "description": "Get all projects"
        },
        {
          "name": "Get One",
          "value": "fetchProject",
          "action": "Get a project",
          "description": "Get a single project"
        },
        {
          "name": "Unarchive",
          "value": "unarchiveProject",
          "action": "Unarchive a project",
          "description": "Unarchive a project"
        },
        {
          "name": "Update",
          "value": "updateProject",
          "action": "Update a project",
          "description": "Update a project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "projects"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetchAllPeople",
      "options": [
        {
          "name": "Archive",
          "value": "archivePerson",
          "action": "Archive a person",
          "description": "Archive a person"
        },
        {
          "name": "Create",
          "value": "createPerson",
          "action": "Create a person",
          "description": "Create a new person"
        },
        {
          "name": "Delete",
          "value": "deletePerson",
          "action": "Delete a person",
          "description": "Delete a person"
        },
        {
          "name": "Get All",
          "value": "fetchAllPeople",
          "action": "Get all people",
          "description": "Get all people"
        },
        {
          "name": "Get One",
          "value": "fetchPerson",
          "action": "Get a person",
          "description": "Get a single person"
        },
        {
          "name": "Unarchive",
          "value": "unarchivePerson",
          "action": "Unarchive a person",
          "description": "Unarchive a person"
        },
        {
          "name": "Update",
          "value": "updatePerson",
          "action": "Update a person",
          "description": "Update a person"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "people"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "fetchAllLeave",
      "options": [
        {
          "name": "Create Leave",
          "value": "createLeave",
          "action": "Create a leave time off",
          "description": "Create a leave time off for a person. Automatically merges overlapping time offs."
        },
        {
          "name": "Get All Leave",
          "value": "fetchAllLeave",
          "action": "Get all leave time offs",
          "description": "Get all leave time offs"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "timeOffs"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create or Update",
      "value": "createOrUpdateActual",
      "action": "Create or update an actual",
      "description": "Create or update an actual. Overwrites any existing actual for the same date, person, project, role, and workstream.",
      "resource": "actuals"
    },
    {
      "name": "Delete",
      "value": "deleteActual",
      "action": "Delete an actual",
      "description": "Delete an actual by ID",
      "resource": "actuals"
    },
    {
      "name": "Get All",
      "value": "fetchAllActuals",
      "action": "Get all actuals",
      "description": "Get all actuals",
      "resource": "actuals"
    },
    {
      "name": "Create",
      "value": "createAssignment",
      "action": "Create an assignment",
      "description": "Create a new assignment",
      "resource": "assignments"
    },
    {
      "name": "Delete",
      "value": "deleteAssignment",
      "action": "Delete an assignment",
      "description": "Delete an assignment by ID",
      "resource": "assignments"
    },
    {
      "name": "Get All",
      "value": "fetchAllAssignments",
      "action": "Get all assignments",
      "description": "Get all assignments",
      "resource": "assignments"
    },
    {
      "name": "Archive",
      "value": "archiveClient",
      "action": "Archive a client",
      "description": "Archive a client",
      "resource": "clients"
    },
    {
      "name": "Create",
      "value": "createClient",
      "action": "Create a client",
      "description": "Create a new client",
      "resource": "clients"
    },
    {
      "name": "Get All",
      "value": "fetchAllClients",
      "action": "Get all clients",
      "description": "Get all clients",
      "resource": "clients"
    },
    {
      "name": "Get One",
      "value": "fetchClient",
      "action": "Get a client",
      "description": "Get a single client",
      "resource": "clients"
    },
    {
      "name": "Unarchive",
      "value": "unarchiveClient",
      "action": "Unarchive a client",
      "description": "Unarchive a client",
      "resource": "clients"
    },
    {
      "name": "Update",
      "value": "updateClient",
      "action": "Update a client",
      "description": "Update a client",
      "resource": "clients"
    },
    {
      "name": "Get All",
      "value": "fetchAllContracts",
      "action": "Get all contracts",
      "description": "Get all contracts",
      "resource": "contracts"
    },
    {
      "name": "Add Note",
      "value": "addNote",
      "action": "Add a note to a project",
      "description": "Add a note to a project",
      "resource": "projects"
    },
    {
      "name": "Archive",
      "value": "archiveProject",
      "action": "Archive a project",
      "description": "Archive a project",
      "resource": "projects"
    },
    {
      "name": "Create",
      "value": "createProject",
      "action": "Create a project",
      "description": "Create a new project",
      "resource": "projects"
    },
    {
      "name": "Delete",
      "value": "deleteProject",
      "action": "Delete a project",
      "description": "Delete a project",
      "resource": "projects"
    },
    {
      "name": "Get All",
      "value": "fetchAllProjects",
      "action": "Get all projects",
      "description": "Get all projects",
      "resource": "projects"
    },
    {
      "name": "Get One",
      "value": "fetchProject",
      "action": "Get a project",
      "description": "Get a single project",
      "resource": "projects"
    },
    {
      "name": "Unarchive",
      "value": "unarchiveProject",
      "action": "Unarchive a project",
      "description": "Unarchive a project",
      "resource": "projects"
    },
    {
      "name": "Update",
      "value": "updateProject",
      "action": "Update a project",
      "description": "Update a project",
      "resource": "projects"
    },
    {
      "name": "Archive",
      "value": "archivePerson",
      "action": "Archive a person",
      "description": "Archive a person",
      "resource": "people"
    },
    {
      "name": "Create",
      "value": "createPerson",
      "action": "Create a person",
      "description": "Create a new person",
      "resource": "people"
    },
    {
      "name": "Delete",
      "value": "deletePerson",
      "action": "Delete a person",
      "description": "Delete a person",
      "resource": "people"
    },
    {
      "name": "Get All",
      "value": "fetchAllPeople",
      "action": "Get all people",
      "description": "Get all people",
      "resource": "people"
    },
    {
      "name": "Get One",
      "value": "fetchPerson",
      "action": "Get a person",
      "description": "Get a single person",
      "resource": "people"
    },
    {
      "name": "Unarchive",
      "value": "unarchivePerson",
      "action": "Unarchive a person",
      "description": "Unarchive a person",
      "resource": "people"
    },
    {
      "name": "Update",
      "value": "updatePerson",
      "action": "Update a person",
      "description": "Update a person",
      "resource": "people"
    },
    {
      "name": "Create Leave",
      "value": "createLeave",
      "action": "Create a leave time off",
      "description": "Create a leave time off for a person. Automatically merges overlapping time offs.",
      "resource": "timeOffs"
    },
    {
      "name": "Get All Leave",
      "value": "fetchAllLeave",
      "action": "Get all leave time offs",
      "description": "Get all leave time offs",
      "resource": "timeOffs"
    }
  ]

npm_readme:
  # n8n-nodes-runn-dotsandarrows

  This is an n8n community node. It lets you use the **Runn** API in your n8n workflows.

  Runn is a resource planning and project forecasting platform. This node allows you to manage people, projects, and clients, and react to changes in real time using the trigger node.

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

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

  ## Installation

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

  ### Local Development

  ```bash
  # Install dependencies
  npm install

  # Build before you run
  npm run build

  # Start n8n with the custom node loaded (recommended)
  npm run dev

  # Alternative: use globally installed n8n
  npm run dev:local
  ```

  ## Operations

  ### Actuals

  | Operation          | Description                                                                                         |
  | ------------------ | --------------------------------------------------------------------------------------------------- |
  | **Create or Update** | Create or update an actual. Overwrites any existing actual for the same date, person, project, role, and workstream. |
  | **Delete**         | Delete an actual by ID                                                                              |
  | **Get All**        | Get all actuals, with an optional **Modified After** date filter                                    |

  ### Assignments

  | Operation   | Description                                                                                                     |
  | ----------- | --------------------------------------------------------------------------------------------------------------- |
  | **Create**  | Create a new assignment. Required: Person ID, Project ID, Role ID, Start Date, End Date, Minutes Per Day. Optional: Billable, Include Non-Working Days, Note, Phase ID, Workstream ID |
  | **Delete**  | Delete an assignment by ID                                                                          |
  | **Get All** | Get all assignments, with optional filters: Person ID, Project ID, Role ID, Start Date, End Date, Modified After, Only Active |

  ### People

  | Operation   | Description              |
  | ----------- | ------------------------ |
  | **Archive** | Archive a person         |
  | **Create**  | Create a new person      |
  | **Delete**  | Delete a person          |
  | **Get All** | Get all people           |
  | **Get One** | Get a single person      |
  | **Unarchive** | Unarchive a person     |
  | **Update**  | Update a person          |

  ### Projects

  | Operation    | Description                |
  | ------------ | -------------------------- |
  | **Add Note** | Add a note to a project    |
  | **Archive**  | Archive a project          |
  | **Create**   | Create a new project       |
  | **Delete**   | Delete a project           |
  | **Get All**  | Get all projects           |
  | **Get One**  | Get a single project       |
  | **Unarchive** | Unarchive a project       |
  | **Update**   | Update a project           |

  ### Clients

  | Operation     | Description           |
  | ------------- | --------------------- |
  | **Archive**   | Archive a client      |
  | **Create**    | Create a new client   |
  | **Get All**   | Get all clients       |
  | **Get One**   | Get a single client   |
  | **Unarchive** | Unarchive a client    |
  | **Update**    | Update a client       |

  ### Contracts

  | Operation   | Description                                                                                                    |
  | ----------- | -------------------------------------------------------------------------------------------------------------- |
  | **Get All** | Get all contracts, with optional filters: Modified After, Sort By (id / createdAt / updatedAt), Order (asc / desc) |

  ### Time Offs

  | Operation        | Description                                                                                                              |
  | ---------------- | ------------------------------------------------------------------------------------------------------------------------ |
  | **Create Leave** | Create a leave time off for a person. Automatically merges overlapping time offs. Required: Person ID, Start Date, End Date. Optional: Minutes Per Day, Note. |
  | **Get All Leave** | Get all leave time offs, with optional filters: Person ID, Start Date, End Date, Modified After, Sort By, Order.        |

  ### Runn Trigger

  The trigger node polls the Runn API and fires when records are created, updated, or deleted.

  **Resources:** People, Projects, Clients, Assignments, Actuals, Contracts, Users, Teams

  **Events:** Created, Updated, Deleted

  Each trigger output includes a `runnLink` field with a direct link to the changed record in the Runn app.

  ## Credentials

  To use this node you need a Runn API key:

  | Field       | Description                                                                               |
  | ----------- | ----------------------------------------------------------------------------------------- |
  | **API Key** | Your Runn API key. Generate one in Runn under **Settings → API**. |

  The node authenticates using a `Bearer` token in the `Authorization` header.

  ## Compatibility

  - Requires Node.js **v18** or higher
  - Uses the [`runn-api-client`](https://www.npmjs.com/package/runn-api-client) npm package

  ## Usage

  1. Add the **Runn** node (or **Runn Trigger**) to your workflow
  2. Configure your Runn API credentials
  3. Select a resource (**Actuals**, **Assignments**, **Clients**, **Contracts**, **People**, **Projects**, or **Time Offs**)
  4. Choose an operation
  5. Fill in the required parameters
  6. Execute the workflow

  **Tip:** Use the **Runn Trigger** node to automatically start workflows when records change in Runn — no webhooks required, it uses polling.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  - [Runn API documentation](https://developer.runn.io/reference/)
  - [How to generate a Runn API token](https://help.runn.io/en/articles/7039247-how-to-generate-an-api-token-in-runn)
  - [GitHub repository](https://github.com/Dots-And-Arrows/n8n-custom-runn-node)

  ## Attribution

  This project is based on [n8n-nodes-runn](https://github.com/itspoma/n8n-nodes-runn) by Roman Rodomansky @ Ralabs, which is in turn based on the n8n community node starter template. Both are released under the MIT License. This package extends the original with additional resources, operations, and improvements.

  ## Version history

  ### 1.0.9

  - Wrapped raw HTTP errors in `NodeApiError` so status codes and response bodies surface correctly in the n8n UI
  - Renamed resource options to singular: Actual, Assignment, Client, Contract, Person, Project, Time Off

  ### 1.0.8

  - Replaced `runn-api-client` npm dependency with n8n's built-in `httpRequestWithAuthentication` helper — removes the external dependency that blocked n8n Cloud vetting
  - Converted trigger node from `setInterval`-based polling to n8n's native `polling: true` + `poll()` pattern
  - Added `authenticate` property to credentials so auth headers are injected automatically by n8n

  ### 1.0.7

  - Added **Time Offs resource** with Create Leave (POST `/time-offs/leave/`) and Get All Leave (GET `/time-offs/leave/`) operations

  ### 1.0.6

  - Added **Contracts resource** with Get All operation (GET `/contracts/`), supporting optional filters: Modified After, Sort By, and Order

  ### 1.0.5

  - Added **Delete** operation to Assignments resource
  - Fixed date timezone bug: dates no longer shift by one day for users in timezones ahead of UTC

  ### 1.0.4

  - Added **Create** operation to Assignments resource (POST `/assignments/`) with required fields (Person ID, Project ID, Role ID, Start Date, End Date, Minutes Per Day) and optional fields (Billable, Include Non-Working Days, Note, Phase ID, Workstream ID)

  ### 1.0.3

  - Added **Assignments resource** with Get All operation, supporting server-side filters (Person ID, Project ID, Role ID, Start Date, End Date, Modified After) and client-side Only Active filter

  ### 1.0.2

  - Added **Actuals resource** with Create or Update, Delete, and Get All operations

  ### 1.0.1

  - Added **Team ID or Name** field to the People > Create operation — accepts either a numeric ID or a team name (resolved automatically)
  - Fixed credential test: corrected API base URL and added required headers so the green "Connection tested" badge now appears
  - Fixed `updatePerson`: First Name, Last Name, and Email are no longer required fields (partial updates now work)
  - Fixed trigger node: removed duplicate fields in trigger output
  - Fixed error handling: all write operations now handle network errors safely
  - Removed debug-level logging from production API calls

  ### 1.0.0

  - Initial release
  - **People resource** with Archive, Create, Delete, Get All, Get One, Unarchive, and Update operations
  - **Projects resource** with Add Note, Archive, Create, Delete, Get All, Get One, Unarchive, and Update operations
  - **Clients resource** with Archive, Create, Get All, Get One, Unarchive, and Update operations
  - **Runn Trigger** node for polling-based event detection across all resources
  - Bearer token authentication with credential test

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the Runn.io API to manage resource planning, project forecasting, people, projects, and clients within n8n workflows.","capabilities":["Create and update actuals, assignments, people, projects, clients, and contracts","Delete records by ID","Retrieve all records with optional filters (e.g., Modified After, date ranges)","Retrieve single records","Archive and unarchive resources","Create and manage time off (leave) records","Add notes to projects","Real-time trigger node for detecting created, updated, or deleted records"],"authentication":"API Key required (Bearer token in Authorization header)","commonUseCases":["Automating resource allocation and project tracking","Monitoring changes in team assignments or project status","Generating reports on actual vs. planned work","Managing leave requests and time off tracking"],"limitations":["Community node (not official n8n node)","Requires Node.js v18 or higher for local development","Uses external npm package (runn-api-client)"],"relatedNodes":["Runn Trigger","Generic HTTP Request","Generic Code"]}


node_type: @oncehub/n8n-nodes-oncehub.onceHubTrigger
package_name: @oncehub/n8n-nodes-oncehub
display_name: OnceHub Trigger
description: Start workflow on OnceHub webhook events
category: Community
development_style: declarative
version: 1
properties_schema: []
operations: []
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: oncehub.admin
author_github_url: https://github.com/scheduleonce/n8n-nodes-oncehub.git
npm_package_name: @oncehub/n8n-nodes-oncehub
npm_version: 1.0.5
community_fetched_at: 2026-07-14T14:40:34.233Z
ai_summary_generated_at: 2026-05-22 10:26:01
npm_readme:
  # n8n-nodes-oncehub

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

  OnceHub is a scheduling platform that enables businesses to automate meeting scheduling, manage bookings, and streamline customer interactions.

  [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

  The OnceHub Trigger node supports the following webhook events:

  | Event | Description |
  |-------|-------------|
  | **Booking Scheduled** | Triggers when a new booking is scheduled |
  | **Booking Canceled** | Triggers when an existing booking is cancelled |
  | **Booking Rescheduled** | Triggers when a booking is rescheduled |
  | **Booking Reassigned** | Triggers when a booking calendar booking is reassigned |
  | **Booking Completed** | Triggers when the date and time for a booking has passed |
  | **Booking No-Show** | Triggers when the status of a booking is set to "No-show" |
  | **Booking Reschedule Requested** | Triggers when a user requests a guest to reschedule |

  ## Credentials

  To use this node, you need to authenticate with OnceHub using an API key of the OnceHub account.

  ### Prerequisites

  1. Sign up for a [OnceHub](https://www.oncehub.com/) account
  2. Navigate to your OnceHub integrations settings

  ### Setting up API Key Authentication

  1. In OnceHub, go to **Integrations** > **API & Webhooks**
  2. Generate or copy your API key
  3. In n8n, create new OnceHub API credentials
  4. Paste your API key into the **API Key** field

  ## Compatibility

  This node was developed and tested with n8n version 2.13.3 and above.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [OnceHub API Documentation](https://developers.oncehub.com/)
  * [OnceHub Website](https://www.oncehub.com/)


  ## License

  This project is licensed under the terms of the MIT open source license. Please refer to [MIT](LICENSE) for the full terms.

  ## Support

  - **Documentation**: [OnceHub API Docs](https://developers.oncehub.com)
  - **Issues**: [GitHub Issues](https://github.com/scheduleonce/n8n-nodes-oncehub/issues)
  - **Community**: [n8n Community Forum](https://community.n8n.io)

  ## Acknowledgments

  - [n8n](https://n8n.io/) - For creating an amazing workflow automation platform
  - [OnceHub](https://www.oncehub.com/) - For providing comprehensive API documentation and developer resources
  - [n8n Community](https://community.n8n.io/) - For feedback, contributions, and support
  - All contributors who help improve this node

  ---

  **Made by the Oncehub team**

ai_documentation_summary:
  {"purpose":"Starts an n8n workflow when specific booking-related events occur in OnceHub, enabling automation for meeting scheduling and customer interaction management.","capabilities":["Trigger on Booking Scheduled","Trigger on Booking Canceled","Trigger on Booking Rescheduled","Trigger on Booking Reassigned","Trigger on Booking Completed","Trigger on Booking No-Show","Trigger on Booking Reschedule Requested"],"authentication":"API Key required","commonUseCases":["Automate notifications when a meeting is booked","Send reminders when a booking is rescheduled or canceled","Integrate booking status changes into CRM or email systems","Handle no-shows and reschedule requests automatically"],"limitations":["Requires a OnceHub account and API key","Compatible with n8n version 2.13.3 and above"],"relatedNodes":["OnceHub Webhook","OnceHub Read","OnceHub Update","OnceHub Delete"]}


node_type: n8n-nodes-leadtable.leadTable
package_name: n8n-nodes-leadtable
display_name: LeadTable
description: Integration with LeadTable API (powered by agentur-systeme.de)
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:34
author_name: rjsebening
author_github_url: https://github.com/rjsebening/
npm_package_name: n8n-nodes-leadtable
npm_version: 1.0.15
community_fetched_at: 2026-07-14T14:40:34.234Z
ai_summary_generated_at: 2026-05-22 10:26:01
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "lead",
      "options": [
        {
          "name": "Auth",
          "value": "auth"
        },
        {
          "name": "Campaign",
          "value": "campaign"
        },
        {
          "name": "Customer",
          "value": "customer"
        },
        {
          "name": "Lead",
          "value": "lead"
        },
        {
          "name": "Table",
          "value": "table"
        },
        {
          "name": "Webhook",
          "value": "webhook"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "check",
      "options": [
        {
          "name": "Check",
          "value": "check",
          "action": "Check authentication",
          "description": "Check authentication"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "auth"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Add Event",
          "value": "addEvent",
          "action": "Adds an event to a lead",
          "description": "Add an event to a lead (note and/or status change)"
        },
        {
          "name": "Add File",
          "value": "addFile",
          "action": "Add file to lead",
          "description": "Upload a file to a lead"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a lead",
          "description": "Create a new lead"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a lead",
          "description": "Get a lead by ID"
        },
        {
          "name": "Get by Campaign",
          "value": "getByCampaign",
          "action": "Get leads by campaign",
          "description": "Get all leads in a campaign"
        },
        {
          "name": "Search by Email",
          "value": "searchByEmail",
          "action": "Search leads by email",
          "description": "Search leads by email"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a lead",
          "description": "Update lead information"
        },
        {
          "name": "Update Description",
          "value": "updateDescription",
          "action": "Update lead description",
          "description": "Update lead description"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "lead"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many campaigns",
          "description": "Get many campaigns for a customer"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "campaign"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many customers",
          "description": "Get many customers"
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create a customer",
          "description": "Create a new customer"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "customer"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createTable",
      "options": [
        {
          "name": "Create Table",
          "value": "createTable",
          "action": "Create table",
          "description": "Create a new table (campaign) for a customer"
        },
        {
          "name": "Get Tables",
          "value": "getTables",
          "action": "Get tables",
          "description": "Retrieve all tables (campaigns) for a customer"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "table"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "attach",
      "options": [
        {
          "name": "Attach",
          "value": "attach",
          "action": "Attach webhook",
          "description": "Attach a webhook"
        },
        {
          "name": "Remove",
          "value": "remove",
          "action": "Remove webhook",
          "description": "Remove a webhook"
        },
        {
          "name": "Poll",
          "value": "poll",
          "action": "Poll webhook events",
          "description": "Poll for webhook events"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhook"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Check",
      "value": "check",
      "action": "Check authentication",
      "description": "Check authentication",
      "resource": "auth"
    },
    {
      "name": "Add Event",
      "value": "addEvent",
      "action": "Adds an event to a lead",
      "description": "Add an event to a lead (note and/or status change)",
      "resource": "lead"
    },
    {
      "name": "Add File",
      "value": "addFile",
      "action": "Add file to lead",
      "description": "Upload a file to a lead",
      "resource": "lead"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a lead",
      "description": "Create a new lead",
      "resource": "lead"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a lead",
      "description": "Get a lead by ID",
      "resource": "lead"
    },
    {
      "name": "Get by Campaign",
      "value": "getByCampaign",
      "action": "Get leads by campaign",
      "description": "Get all leads in a campaign",
      "resource": "lead"
    },
    {
      "name": "Search by Email",
      "value": "searchByEmail",
      "action": "Search leads by email",
      "description": "Search leads by email",
      "resource": "lead"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a lead",
      "description": "Update lead information",
      "resource": "lead"
    },
    {
      "name": "Update Description",
      "value": "updateDescription",
      "action": "Update lead description",
      "description": "Update lead description",
      "resource": "lead"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many campaigns",
      "description": "Get many campaigns for a customer",
      "resource": "campaign"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many customers",
      "description": "Get many customers",
      "resource": "customer"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a customer",
      "description": "Create a new customer",
      "resource": "customer"
    },
    {
      "name": "Create Table",
      "value": "createTable",
      "action": "Create table",
      "description": "Create a new table (campaign) for a customer",
      "resource": "table"
    },
    {
      "name": "Get Tables",
      "value": "getTables",
      "action": "Get tables",
      "description": "Retrieve all tables (campaigns) for a customer",
      "resource": "table"
    },
    {
      "name": "Attach",
      "value": "attach",
      "action": "Attach webhook",
      "description": "Attach a webhook",
      "resource": "webhook"
    },
    {
      "name": "Remove",
      "value": "remove",
      "action": "Remove webhook",
      "description": "Remove a webhook",
      "resource": "webhook"
    },
    {
      "name": "Poll",
      "value": "poll",
      "action": "Poll webhook events",
      "description": "Poll for webhook events",
      "resource": "webhook"
    }
  ]

npm_readme:
  # n8n-nodes-leadtable

  ![LeadTable Node](https://img.shields.io/badge/n8n-community--node-FF6D5A)  
  ![Version](https://img.shields.io/badge/version-1.0.0-blue)  
  ![License](https://img.shields.io/badge/license-MIT-green)

  A professional n8n custom node for seamless integration with the LeadTable API. Automate your lead-management workflows with full CRUD operations and real-time webhook support.

  ## What is n8n?

  n8n is an easy-to-use workflow automation tool that connects different apps and services, like LeadTable.  
  By creating "workflows" between apps, you can automate many manual tasks – saving you and your team valuable time.

  ## ⚖️ Legal Notice

  This Community Node uses the public LeadTable API and is **not affiliated with, endorsed, or sponsored by LeadTable**.  
  All trademarks are the property of their respective owners.

  **Note**: This is a community-developed Node for the LeadTable API. For official support, please contact LeadTable directly.

  ## 🚀 Overview

  This n8n custom node enables full integration with LeadTable — a leading lead-management platform. From automatic lead creation to real-time notifications on status changes, you can automate the entire lead lifecycle without writing a single line of code.

  ## ✨ Key Features

  ### 📊 **Full Lead Management**

  - **Create Lead**: Create new leads with custom data fields
  - **Get Lead**: Retrieve detailed lead information with flexible formatting options
  - **Update Lead**: Dynamic question–answer system for updating lead data
  - **Search Lead**: Powerful email-based search
  - **File Upload**: Attach documents and files directly to leads

  ### ⚡ **Real-Time Automation**

  - **Webhook Trigger**: Instantly react to lead events
  - **Multi-Level Webhooks**: Agency-, customer-, and campaign-specific triggers
  - **Event Types**: New leads, status changes, data updates
  - **Auto Lead Details**: Intelligent enrichment of webhook payloads

  ### 🏢 **Comprehensive Account Management**

  - **Customer Management**: List all customers with pagination
  - **Campaign Management**: Fetch campaigns per customer
  - **Hierarchical Structure**: Agency → Customer → Campaign → Leads

  ### 🔐 **Secure API Integration**

  - **Dual Authentication**: API key + email verification
  - **Connection Test**: Automatic authentication check
  - **Error Handling**: Robust handling with informative messages

  ## 📦 Installation

  ### Requirements

  - n8n version 1.0.0 or higher
  - Active LeadTable account with a valid API key

  ## 🔧 Configuration

  ### Installation in n8n

  This node can be installed using the **Community Nodes** feature in n8n.

  1. Open your n8n instance
  2. Go to **Settings → Community Nodes → Install**
  3. Enter one of the following package names:

  #### Variant 1 – Scoped (personal scope)

  ```

  @rjsebening/n8n-nodes-leadtable

  ```

  #### Variant 2 – Unscoped (default)

  ```

  n8n-nodes-leadtable

  ```

  Both packages contain the same code. The scoped version exists to avoid name conflicts with future official packages.

  4. Restart n8n → the node is available

  ### Set Up API Credentials

  1.  In n8n, go to **Credentials** → **Create New**
  2.  Search for **“LeadTable API”**
  3.  Enter your credentials:
      - **API Key**: Your LeadTable API key
      - **Email**: Your LeadTable account email
      - **Base URL**: `https://api.lead-table.com/api/v3/external`

  ### Obtain Your API Key

  1.  Log in to LeadTable
  2.  Navigate to **Settings** → **API**
  3.  Generate a new API key
  4.  Copy the key and your account email

  ### LeadTable Node (Manual Actions)

  #### **Lead Management**

  Action

  Description

  **Create Lead**

  Create a new lead in a campaign with custom data

  **Get Lead**

  Load lead details (optional: plain-text description)

  **Update Lead**

  Modify lead information via a Q&A flow

  **Update Description**

  Edit only the lead description

  **Search by Email**

  Find leads by email address (with pagination)

  **List by Campaign**

  Load all leads for a campaign (with pagination)

  **Attach File**

  Upload a file and link it to a lead

  #### **Account Management**

  Action

  Description

  **List All Customers**

  Full customer list (with pagination)

  **List All Campaigns**

  Load campaigns for a specific customer

  #### **Webhook Management**

  Action

  Description

  **Register Webhook**

  Register a webhook for events (multi-level)

  **Remove Webhook**

  Delete a registered webhook

  **Fetch Webhook Events**

  Retrieve pending events (polling)

  #### **Authentication**

  Action

  Description

  **Test Authentication**

  Verify API connection and credentials

  ### LeadTable Trigger (Automatic Events)

  #### **Event Types**

  - **New Lead Created**: Fired whenever a new lead is created
  - **Lead Status Changed**: Fired on status transitions
  - **Lead Updated**: Fired on any data change

  #### **Webhook Levels**

  - **Agency (Global)**: Events from all campaigns in the agency
  - **Customer**: Events from all campaigns of a specific customer
  - **Table (Campaign)**: Events only from a specific campaign

  #### **Advanced Features**

  - **Include Lead Details**: Automatically load full lead info
  - **Automatic Webhook Management**: Register on activation, remove on deactivation
  - **Real-Time Processing**: Immediate event handling without delay

  ## 📖 Examples

  -   Automatically create deals in your CRM when a new LeadTable lead comes in
      
  -   Notify your sales team on Slack or Teams instantly
      
  -   Enrich leads with external data before passing them on
      
  -   Build complete onboarding pipelines triggered by LeadTable 

  ## 🌍 Why this matters

  LeadTable helps agencies get the most from campaigns.  
  But **without proper automation, leads often get stuck in spreadsheets or inboxes**.

  This node changes that.  
  It connects LeadTable with your systems — making sure **every lead is processed, followed up, and monetized automatically**.

  ## 📬 About the Author

  I’m [Rezk Jörg Sebening](https://github.com/rjsebening) – Business Automation Expert (DACH).  
  I build automation systems & n8n nodes that free agencies, coaches, and consultants from manual work.

  👉 Follow me on GitHub to stay updated with new DACH-focused integrations.


  ## 📋 Disclaimer

  This unofficial community Node is **not affiliated with, supported, or sponsored by LeadTable**.  
  It only provides an interface to the publicly available LeadTable API under its terms of use.

  **Important Notes:**

  - This Node is developed and maintained by the community
  - For issues with the LeadTable API itself, please contact official LeadTable support
  - All LeadTable trademarks and logos belong to LeadTable
  - This Node only acts as a connector to the public API

ai_documentation_summary:
  {"purpose":"This n8n community node enables full integration with the LeadTable API to automate lead management workflows, including CRUD operations, file attachments, and real-time webhook triggers.","capabilities":["Create new leads with custom data fields","Retrieve and format lead details","Update lead data via dynamic question-answer system","Search leads by email address","Attach documents and files to leads","List all customers with pagination","Fetch campaigns per customer","Register, remove, and poll webhook events","Support for multi-level webhooks (Agency, Customer, Campaign)","Automatic enrichment of webhook payloads with lead details"],"authentication":"API key required (along with account email)","commonUseCases":["Automatically create CRM deals when new leads are generated","Instantly notify sales teams on Slack or Teams","Enrich leads with external data before passing to other systems","Build complete onboarding pipelines triggered by LeadTable events"],"limitations":["Community-developed node not officially affiliated with or endorsed by LeadTable","Requires active LeadTable account with a valid API key","No official support available for this node (must contact LeadTable directly)"],"relatedNodes":["n8n-nodes-base.webhook","n8n-nodes-base.httpRequest","n8n-nodes-base.slack","n8n-nodes-base.msTeams"]}


