# nodes

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

updated_at: 2026-07-14 14:40:33
author_name: devs_hostinger
author_github_url: https://github.com/hostinger/api-n8n-node.git
npm_package_name: n8n-nodes-hostinger-api
npm_version: 1.0.21
community_fetched_at: 2026-07-14T14:40:33.362Z
ai_summary_generated_at: 2026-03-25 22:47:20
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "vps",
      "options": [
        {
          "name": "Billing",
          "value": "billing"
        },
        {
          "name": "DNS",
          "value": "dns"
        },
        {
          "name": "Domain",
          "value": "domain"
        },
        {
          "name": "Domain Forwarding",
          "value": "domainForwarding"
        },
        {
          "name": "Domain WHOIS",
          "value": "whois"
        },
        {
          "name": "Reach",
          "value": "reach"
        },
        {
          "name": "VPS",
          "value": "vps"
        },
        {
          "name": "VPS Actions",
          "value": "vpsActions"
        },
        {
          "name": "VPS Backups",
          "value": "vpsBackups"
        },
        {
          "name": "VPS Data Centers",
          "value": "vpsDataCenters"
        },
        {
          "name": "VPS Docker Manager",
          "value": "vpsDocker"
        },
        {
          "name": "VPS Firewall",
          "value": "vpsFirewall"
        },
        {
          "name": "VPS Malware Scanner",
          "value": "vpsMonarx"
        },
        {
          "name": "VPS Post Install Scripts",
          "value": "vpsScripts"
        },
        {
          "name": "VPS PTR",
          "value": "vpsPTR"
        },
        {
          "name": "VPS Public Keys",
          "value": "vpsPublicKeys"
        },
        {
          "name": "VPS Snapshots",
          "value": "vpsSnapshots"
        },
        {
          "name": "VPS Templates",
          "value": "vpsTemplates"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAction",
      "options": [
        {
          "name": "Get Action",
          "value": "getAction",
          "action": "Get VPS action"
        },
        {
          "name": "List Actions",
          "value": "listActions",
          "action": "List VPS actions"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsActions"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listProjects",
      "options": [
        {
          "name": "Create Project",
          "value": "createProject",
          "action": "Create Docker project"
        },
        {
          "name": "Delete Project",
          "value": "deleteProject",
          "action": "Delete Docker project"
        },
        {
          "name": "Get Project Logs",
          "value": "getLogs",
          "action": "Get Docker project logs"
        },
        {
          "name": "List Containers",
          "value": "listContainers",
          "action": "List Docker containers"
        },
        {
          "name": "List Contents",
          "value": "listContents",
          "action": "List Docker containers content"
        },
        {
          "name": "List Projects",
          "value": "listProjects",
          "action": "List Docker projects"
        },
        {
          "name": "Restart Project",
          "value": "restartProject",
          "action": "Restart Docker project"
        },
        {
          "name": "Start Project",
          "value": "startProject",
          "action": "Start Docker project"
        },
        {
          "name": "Stop Project",
          "value": "stopProject",
          "action": "Stop Docker project"
        },
        {
          "name": "Update Project",
          "value": "updateProject",
          "action": "Update Docker project"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsDocker"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listBackups",
      "options": [
        {
          "name": "Delete Backup",
          "value": "deleteBackup",
          "action": "Delete VPS backup"
        },
        {
          "name": "List Backups",
          "value": "listBackups",
          "action": "List VPS backups"
        },
        {
          "name": "Restore Backup",
          "value": "restoreBackup",
          "action": "Restore VPS backup"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsBackups"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listDataCenters",
      "options": [
        {
          "name": "List Data Centers",
          "value": "listDataCenters",
          "action": "List VPS data centers"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsDataCenters"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createPTR",
      "options": [
        {
          "name": "Create PTR",
          "value": "createPTR",
          "action": "Create PTR record"
        },
        {
          "name": "Delete PTR",
          "value": "deletePTR",
          "action": "Delete PTR record"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsPTR"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "activateFirewall",
      "options": [
        {
          "name": "Firewall Activate",
          "value": "activateFirewall",
          "action": "Activate VPS firewall"
        },
        {
          "name": "Firewall Create",
          "value": "createFirewall",
          "action": "Create VPS firewall"
        },
        {
          "name": "Firewall Deactivate",
          "value": "deactivateFirewall",
          "action": "Deactivate VPS firewall"
        },
        {
          "name": "Firewall Delete",
          "value": "deleteFirewall",
          "action": "Delete VPS firewall"
        },
        {
          "name": "Firewall Get",
          "value": "getFirewall",
          "action": "Get VPS firewall"
        },
        {
          "name": "Firewall List",
          "value": "listFirewalls",
          "action": "List VPS firewalls"
        },
        {
          "name": "Firewall Rule Create",
          "value": "createFirewallRule",
          "action": "Create VPS firewall rule"
        },
        {
          "name": "Firewall Rule Delete",
          "value": "deleteFirewallRule",
          "action": "Delete VPS firewall rule"
        },
        {
          "name": "Firewall Rule Update",
          "value": "updateFirewallRule",
          "action": "Update VPS firewall rule"
        },
        {
          "name": "Firewall Sync",
          "value": "syncFirewall",
          "action": "Sync VPS firewall"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsFirewall"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getMonarx",
      "options": [
        {
          "name": "Get Monarx",
          "value": "getMonarx",
          "action": "Get VPS malware scanner status"
        },
        {
          "name": "Add Monarx",
          "value": "addMonarx",
          "action": "Add VPS malware scanner"
        },
        {
          "name": "Remove Monarx",
          "value": "removeMonarx",
          "action": "Remove VPS malware scanner"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsMonarx"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getTemplate",
      "options": [
        {
          "name": "Get Template",
          "value": "getTemplate",
          "action": "Get VPS template"
        },
        {
          "name": "List Templates",
          "value": "listTemplates",
          "action": "List VPS templates"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsTemplates"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getPostInstallScript",
      "options": [
        {
          "name": "Post Install Script Create",
          "value": "createPostInstallScript",
          "action": "Create VPS post install script"
        },
        {
          "name": "Post Install Script Delete",
          "value": "deletePostInstallScript",
          "action": "Delete VPS post install script"
        },
        {
          "name": "Post Install Script Get",
          "value": "getPostInstallScript",
          "action": "Get VPS post install script"
        },
        {
          "name": "Post Install Script List",
          "value": "listPostInstallScripts",
          "action": "List VPS post install scripts"
        },
        {
          "name": "Post Install Script Update",
          "value": "updatePostInstallScript",
          "action": "Update VPS post install script"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsScripts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "attachPublicKey",
      "options": [
        {
          "name": "Attach Public Key",
          "value": "attachPublicKey",
          "action": "Attach VPS public key"
        },
        {
          "name": "Delete Public Key",
          "value": "deletePublicKey",
          "action": "Delete VPS public key"
        },
        {
          "name": "List Public Keys",
          "value": "listPublicKeys",
          "action": "List VPS public keys"
        },
        {
          "name": "Create Public Key",
          "value": "createPublicKey",
          "action": "Create VPS public key"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsPublicKeys"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getSnapshot",
      "options": [
        {
          "name": "Get Snapshot",
          "value": "getSnapshot",
          "action": "Get VPS snapshot"
        },
        {
          "name": "Create Snapshot",
          "value": "createSnapshot",
          "action": "Create VPS snapshot"
        },
        {
          "name": "Delete Snapshot",
          "value": "deleteSnapshot",
          "action": "Delete VPS snapshot"
        },
        {
          "name": "Restore Snapshot",
          "value": "restoreSnapshot",
          "action": "Restore VPS snapshot"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vpsSnapshots"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getVm",
      "options": [
        {
          "name": "Get Metrics",
          "value": "getVmMetrics",
          "action": "Get VPS metrics"
        },
        {
          "name": "Get Public Keys",
          "value": "getVmPublicKeys",
          "action": "Get VPS public keys"
        },
        {
          "name": "Get VPS",
          "value": "getVm",
          "action": "Get VPS"
        },
        {
          "name": "Hostname Reset",
          "value": "resetHostname",
          "action": "Reset VPS hostname"
        },
        {
          "name": "Hostname Update",
          "value": "updateHostname",
          "action": "Update VPS hostname"
        },
        {
          "name": "List VPS",
          "value": "listVms",
          "action": "List VPS"
        },
        {
          "name": "Purchase New VPS",
          "value": "purchaseVm",
          "action": "Purchase new VPS"
        },
        {
          "name": "Recreate",
          "value": "recreateVm",
          "action": "Recreate VPS"
        },
        {
          "name": "Restart",
          "value": "restartVm",
          "action": "Restart VPS"
        },
        {
          "name": "Setup",
          "value": "setupVm",
          "action": "Setup VPS"
        },
        {
          "name": "Start",
          "value": "startVm",
          "action": "Start VPS"
        },
        {
          "name": "Start Recovery",
          "value": "createRecovery",
          "action": "Start VPS recovery mode"
        },
        {
          "name": "Stop",
          "value": "stopVm",
          "action": "Stop VPS"
        },
        {
          "name": "Stop Recovery",
          "value": "deleteRecovery",
          "action": "Stop VPS recovery mode"
        },
        {
          "name": "Update Nameservers",
          "value": "updateNameservers",
          "action": "Update VPS nameservers"
        },
        {
          "name": "Update Panel Password",
          "value": "updatePanelPassword",
          "action": "Update VPS control panel password"
        },
        {
          "name": "Update Root Password",
          "value": "updateRootPassword",
          "action": "Update VPS root password"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "vps"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listDnsSnapshots",
      "options": [
        {
          "name": "DNS Snapshot Get",
          "value": "getDnsSnapshot",
          "action": "Get DNS snapshot"
        },
        {
          "name": "DNS Snapshot List",
          "value": "listDnsSnapshots",
          "action": "List DNS snapshots"
        },
        {
          "name": "DNS Snapshot Restore",
          "value": "restoreDnsSnapshot",
          "action": "Restore DNS snapshot"
        },
        {
          "name": "DNS Zone Delete",
          "value": "deleteDnsZone",
          "action": "Delete DNS zone"
        },
        {
          "name": "DNS Zone Get",
          "value": "getDnsZone",
          "action": "Get DNS zone"
        },
        {
          "name": "DNS Zone Reset",
          "value": "resetDnsZone",
          "action": "Reset DNS zone"
        },
        {
          "name": "DNS Zone Update",
          "value": "updateDnsZone",
          "action": "Update DNS zone"
        },
        {
          "name": "DNS Zone Validate",
          "value": "validateDnsZone",
          "action": "Validate DNS zone"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dns"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listDomains",
      "options": [
        {
          "name": "Check Domain Availability",
          "value": "checkDomainAvailability",
          "action": "Check domain availability"
        },
        {
          "name": "Disable Domain Lock",
          "value": "disableDomainLock",
          "action": "Disable domain lock"
        },
        {
          "name": "Disable Privacy Protection",
          "value": "disablePrivacyProtection",
          "action": "Disable domain privacy protection"
        },
        {
          "name": "Enable Domain Lock",
          "value": "enableDomainLock",
          "action": "Enable domain lock"
        },
        {
          "name": "Enable Privacy Protection",
          "value": "enablePrivacyProtection",
          "action": "Enable domain privacy protection"
        },
        {
          "name": "Get Domain",
          "value": "getDomain",
          "action": "Get a domain"
        },
        {
          "name": "List Domains",
          "value": "listDomains",
          "action": "List domains"
        },
        {
          "name": "Purchase Domain",
          "value": "purchaseDomain",
          "action": "Purchase domain"
        },
        {
          "name": "Update Nameservers",
          "value": "updateDomainNameservers",
          "action": "Update domain nameservers"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "domain"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listWhoisProfiles",
      "options": [
        {
          "name": "Create WHOIS Profile",
          "value": "createWhoisProfile",
          "action": "Create WHOIS profile"
        },
        {
          "name": "Delete WHOIS Profile",
          "value": "deleteWhoisProfile",
          "action": "Delete WHOIS profile"
        },
        {
          "name": "Get WHOIS Profile",
          "value": "getWhoisProfile",
          "action": "Get WHOIS profile"
        },
        {
          "name": "Get WHOIS Profile Usage",
          "value": "getWhoisProfileUsage",
          "action": "Get WHOIS profile usage"
        },
        {
          "name": "List WHOIS Profiles",
          "value": "listWhoisProfiles",
          "action": "List WHOIS profiles"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "whois"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getForwardingData",
      "options": [
        {
          "name": "Get Forwarding Data",
          "value": "getForwardingData",
          "action": "Get domain forwarding"
        },
        {
          "name": "Delete Forwarding Data",
          "value": "deleteForwardingData",
          "action": "Delete domain forwarding"
        },
        {
          "name": "Create Forwarding Data",
          "value": "createForwardingData",
          "action": "Create domain forwarding"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "domainForwarding"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getCatalogList",
      "options": [
        {
          "name": "Cancel Subscription",
          "value": "deleteSubscription",
          "action": "Cancel subscription"
        },
        {
          "name": "Delete Payment Method",
          "value": "deletePaymentMethod",
          "action": "Delete payment method"
        },
        {
          "name": "Get Catalog Item List",
          "value": "getCatalogList",
          "action": "Get catalog item list"
        },
        {
          "name": "Get Payment Method List",
          "value": "getPaymentList",
          "action": "Get payment method list"
        },
        {
          "name": "Get Subscription List",
          "value": "getSubscriptionList",
          "action": "Get subscription list"
        },
        {
          "name": "Set Default Payment Method",
          "value": "setPaymentMethod",
          "action": "Set default payment method"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "billing"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listContacts",
      "options": [
        {
          "name": "Create Contact",
          "value": "createContact",
          "action": "Create Reach contact"
        },
        {
          "name": "Delete Contact",
          "value": "deleteContact",
          "action": "Delete Reach contact"
        },
        {
          "name": "Get Segment",
          "value": "getSegment",
          "action": "Get Reach segment"
        },
        {
          "name": "Get Segment Contacts",
          "value": "getSegmentContacts",
          "action": "Get Reach segment contacts"
        },
        {
          "name": "List Contacts",
          "value": "listContacts",
          "action": "List Reach contacts"
        },
        {
          "name": "List Segments",
          "value": "listSegments",
          "action": "List Reach segments"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reach"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Action",
      "value": "getAction",
      "action": "Get VPS action",
      "resource": "vpsActions"
    },
    {
      "name": "List Actions",
      "value": "listActions",
      "action": "List VPS actions",
      "resource": "vpsActions"
    },
    {
      "name": "Create Project",
      "value": "createProject",
      "action": "Create Docker project",
      "resource": "vpsDocker"
    },
    {
      "name": "Delete Project",
      "value": "deleteProject",
      "action": "Delete Docker project",
      "resource": "vpsDocker"
    },
    {
      "name": "Get Project Logs",
      "value": "getLogs",
      "action": "Get Docker project logs",
      "resource": "vpsDocker"
    },
    {
      "name": "List Containers",
      "value": "listContainers",
      "action": "List Docker containers",
      "resource": "vpsDocker"
    },
    {
      "name": "List Contents",
      "value": "listContents",
      "action": "List Docker containers content",
      "resource": "vpsDocker"
    },
    {
      "name": "List Projects",
      "value": "listProjects",
      "action": "List Docker projects",
      "resource": "vpsDocker"
    },
    {
      "name": "Restart Project",
      "value": "restartProject",
      "action": "Restart Docker project",
      "resource": "vpsDocker"
    },
    {
      "name": "Start Project",
      "value": "startProject",
      "action": "Start Docker project",
      "resource": "vpsDocker"
    },
    {
      "name": "Stop Project",
      "value": "stopProject",
      "action": "Stop Docker project",
      "resource": "vpsDocker"
    },
    {
      "name": "Update Project",
      "value": "updateProject",
      "action": "Update Docker project",
      "resource": "vpsDocker"
    },
    {
      "name": "Delete Backup",
      "value": "deleteBackup",
      "action": "Delete VPS backup",
      "resource": "vpsBackups"
    },
    {
      "name": "List Backups",
      "value": "listBackups",
      "action": "List VPS backups",
      "resource": "vpsBackups"
    },
    {
      "name": "Restore Backup",
      "value": "restoreBackup",
      "action": "Restore VPS backup",
      "resource": "vpsBackups"
    },
    {
      "name": "List Data Centers",
      "value": "listDataCenters",
      "action": "List VPS data centers",
      "resource": "vpsDataCenters"
    },
    {
      "name": "Create PTR",
      "value": "createPTR",
      "action": "Create PTR record",
      "resource": "vpsPTR"
    },
    {
      "name": "Delete PTR",
      "value": "deletePTR",
      "action": "Delete PTR record",
      "resource": "vpsPTR"
    },
    {
      "name": "Firewall Activate",
      "value": "activateFirewall",
      "action": "Activate VPS firewall",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Create",
      "value": "createFirewall",
      "action": "Create VPS firewall",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Deactivate",
      "value": "deactivateFirewall",
      "action": "Deactivate VPS firewall",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Delete",
      "value": "deleteFirewall",
      "action": "Delete VPS firewall",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Get",
      "value": "getFirewall",
      "action": "Get VPS firewall",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall List",
      "value": "listFirewalls",
      "action": "List VPS firewalls",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Rule Create",
      "value": "createFirewallRule",
      "action": "Create VPS firewall rule",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Rule Delete",
      "value": "deleteFirewallRule",
      "action": "Delete VPS firewall rule",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Rule Update",
      "value": "updateFirewallRule",
      "action": "Update VPS firewall rule",
      "resource": "vpsFirewall"
    },
    {
      "name": "Firewall Sync",
      "value": "syncFirewall",
      "action": "Sync VPS firewall",
      "resource": "vpsFirewall"
    },
    {
      "name": "Get Monarx",
      "value": "getMonarx",
      "action": "Get VPS malware scanner status",
      "resource": "vpsMonarx"
    },
    {
      "name": "Add Monarx",
      "value": "addMonarx",
      "action": "Add VPS malware scanner",
      "resource": "vpsMonarx"
    },
    {
      "name": "Remove Monarx",
      "value": "removeMonarx",
      "action": "Remove VPS malware scanner",
      "resource": "vpsMonarx"
    },
    {
      "name": "Get Template",
      "value": "getTemplate",
      "action": "Get VPS template",
      "resource": "vpsTemplates"
    },
    {
      "name": "List Templates",
      "value": "listTemplates",
      "action": "List VPS templates",
      "resource": "vpsTemplates"
    },
    {
      "name": "Post Install Script Create",
      "value": "createPostInstallScript",
      "action": "Create VPS post install script",
      "resource": "vpsScripts"
    },
    {
      "name": "Post Install Script Delete",
      "value": "deletePostInstallScript",
      "action": "Delete VPS post install script",
      "resource": "vpsScripts"
    },
    {
      "name": "Post Install Script Get",
      "value": "getPostInstallScript",
      "action": "Get VPS post install script",
      "resource": "vpsScripts"
    },
    {
      "name": "Post Install Script List",
      "value": "listPostInstallScripts",
      "action": "List VPS post install scripts",
      "resource": "vpsScripts"
    },
    {
      "name": "Post Install Script Update",
      "value": "updatePostInstallScript",
      "action": "Update VPS post install script",
      "resource": "vpsScripts"
    },
    {
      "name": "Attach Public Key",
      "value": "attachPublicKey",
      "action": "Attach VPS public key",
      "resource": "vpsPublicKeys"
    },
    {
      "name": "Delete Public Key",
      "value": "deletePublicKey",
      "action": "Delete VPS public key",
      "resource": "vpsPublicKeys"
    },
    {
      "name": "List Public Keys",
      "value": "listPublicKeys",
      "action": "List VPS public keys",
      "resource": "vpsPublicKeys"
    },
    {
      "name": "Create Public Key",
      "value": "createPublicKey",
      "action": "Create VPS public key",
      "resource": "vpsPublicKeys"
    },
    {
      "name": "Get Snapshot",
      "value": "getSnapshot",
      "action": "Get VPS snapshot",
      "resource": "vpsSnapshots"
    },
    {
      "name": "Create Snapshot",
      "value": "createSnapshot",
      "action": "Create VPS snapshot",
      "resource": "vpsSnapshots"
    },
    {
      "name": "Delete Snapshot",
      "value": "deleteSnapshot",
      "action": "Delete VPS snapshot",
      "resource": "vpsSnapshots"
    },
    {
      "name": "Restore Snapshot",
      "value": "restoreSnapshot",
      "action": "Restore VPS snapshot",
      "resource": "vpsSnapshots"
    },
    {
      "name": "Get Metrics",
      "value": "getVmMetrics",
      "action": "Get VPS metrics",
      "resource": "vps"
    },
    {
      "name": "Get Public Keys",
      "value": "getVmPublicKeys",
      "action": "Get VPS public keys",
      "resource": "vps"
    },
    {
      "name": "Get VPS",
      "value": "getVm",
      "action": "Get VPS",
      "resource": "vps"
    },
    {
      "name": "Hostname Reset",
      "value": "resetHostname",
      "action": "Reset VPS hostname",
      "resource": "vps"
    },
    {
      "name": "Hostname Update",
      "value": "updateHostname",
      "action": "Update VPS hostname",
      "resource": "vps"
    },
    {
      "name": "List VPS",
      "value": "listVms",
      "action": "List VPS",
      "resource": "vps"
    },
    {
      "name": "Purchase New VPS",
      "value": "purchaseVm",
      "action": "Purchase new VPS",
      "resource": "vps"
    },
    {
      "name": "Recreate",
      "value": "recreateVm",
      "action": "Recreate VPS",
      "resource": "vps"
    },
    {
      "name": "Restart",
      "value": "restartVm",
      "action": "Restart VPS",
      "resource": "vps"
    },
    {
      "name": "Setup",
      "value": "setupVm",
      "action": "Setup VPS",
      "resource": "vps"
    },
    {
      "name": "Start",
      "value": "startVm",
      "action": "Start VPS",
      "resource": "vps"
    },
    {
      "name": "Start Recovery",
      "value": "createRecovery",
      "action": "Start VPS recovery mode",
      "resource": "vps"
    },
    {
      "name": "Stop",
      "value": "stopVm",
      "action": "Stop VPS",
      "resource": "vps"
    },
    {
      "name": "Stop Recovery",
      "value": "deleteRecovery",
      "action": "Stop VPS recovery mode",
      "resource": "vps"
    },
    {
      "name": "Update Nameservers",
      "value": "updateNameservers",
      "action": "Update VPS nameservers",
      "resource": "vps"
    },
    {
      "name": "Update Panel Password",
      "value": "updatePanelPassword",
      "action": "Update VPS control panel password",
      "resource": "vps"
    },
    {
      "name": "Update Root Password",
      "value": "updateRootPassword",
      "action": "Update VPS root password",
      "resource": "vps"
    },
    {
      "name": "DNS Snapshot Get",
      "value": "getDnsSnapshot",
      "action": "Get DNS snapshot",
      "resource": "dns"
    },
    {
      "name": "DNS Snapshot List",
      "value": "listDnsSnapshots",
      "action": "List DNS snapshots",
      "resource": "dns"
    },
    {
      "name": "DNS Snapshot Restore",
      "value": "restoreDnsSnapshot",
      "action": "Restore DNS snapshot",
      "resource": "dns"
    },
    {
      "name": "DNS Zone Delete",
      "value": "deleteDnsZone",
      "action": "Delete DNS zone",
      "resource": "dns"
    },
    {
      "name": "DNS Zone Get",
      "value": "getDnsZone",
      "action": "Get DNS zone",
      "resource": "dns"
    },
    {
      "name": "DNS Zone Reset",
      "value": "resetDnsZone",
      "action": "Reset DNS zone",
      "resource": "dns"
    },
    {
      "name": "DNS Zone Update",
      "value": "updateDnsZone",
      "action": "Update DNS zone",
      "resource": "dns"
    },
    {
      "name": "DNS Zone Validate",
      "value": "validateDnsZone",
      "action": "Validate DNS zone",
      "resource": "dns"
    },
    {
      "name": "Check Domain Availability",
      "value": "checkDomainAvailability",
      "action": "Check domain availability",
      "resource": "domain"
    },
    {
      "name": "Disable Domain Lock",
      "value": "disableDomainLock",
      "action": "Disable domain lock",
      "resource": "domain"
    },
    {
      "name": "Disable Privacy Protection",
      "value": "disablePrivacyProtection",
      "action": "Disable domain privacy protection",
      "resource": "domain"
    },
    {
      "name": "Enable Domain Lock",
      "value": "enableDomainLock",
      "action": "Enable domain lock",
      "resource": "domain"
    },
    {
      "name": "Enable Privacy Protection",
      "value": "enablePrivacyProtection",
      "action": "Enable domain privacy protection",
      "resource": "domain"
    },
    {
      "name": "Get Domain",
      "value": "getDomain",
      "action": "Get a domain",
      "resource": "domain"
    },
    {
      "name": "List Domains",
      "value": "listDomains",
      "action": "List domains",
      "resource": "domain"
    },
    {
      "name": "Purchase Domain",
      "value": "purchaseDomain",
      "action": "Purchase domain",
      "resource": "domain"
    },
    {
      "name": "Update Nameservers",
      "value": "updateDomainNameservers",
      "action": "Update domain nameservers",
      "resource": "domain"
    },
    {
      "name": "Create WHOIS Profile",
      "value": "createWhoisProfile",
      "action": "Create WHOIS profile",
      "resource": "whois"
    },
    {
      "name": "Delete WHOIS Profile",
      "value": "deleteWhoisProfile",
      "action": "Delete WHOIS profile",
      "resource": "whois"
    },
    {
      "name": "Get WHOIS Profile",
      "value": "getWhoisProfile",
      "action": "Get WHOIS profile",
      "resource": "whois"
    },
    {
      "name": "Get WHOIS Profile Usage",
      "value": "getWhoisProfileUsage",
      "action": "Get WHOIS profile usage",
      "resource": "whois"
    },
    {
      "name": "List WHOIS Profiles",
      "value": "listWhoisProfiles",
      "action": "List WHOIS profiles",
      "resource": "whois"
    },
    {
      "name": "Get Forwarding Data",
      "value": "getForwardingData",
      "action": "Get domain forwarding",
      "resource": "domainForwarding"
    },
    {
      "name": "Delete Forwarding Data",
      "value": "deleteForwardingData",
      "action": "Delete domain forwarding",
      "resource": "domainForwarding"
    },
    {
      "name": "Create Forwarding Data",
      "value": "createForwardingData",
      "action": "Create domain forwarding",
      "resource": "domainForwarding"
    },
    {
      "name": "Cancel Subscription",
      "value": "deleteSubscription",
      "action": "Cancel subscription",
      "resource": "billing"
    },
    {
      "name": "Delete Payment Method",
      "value": "deletePaymentMethod",
      "action": "Delete payment method",
      "resource": "billing"
    },
    {
      "name": "Get Catalog Item List",
      "value": "getCatalogList",
      "action": "Get catalog item list",
      "resource": "billing"
    },
    {
      "name": "Get Payment Method List",
      "value": "getPaymentList",
      "action": "Get payment method list",
      "resource": "billing"
    },
    {
      "name": "Get Subscription List",
      "value": "getSubscriptionList",
      "action": "Get subscription list",
      "resource": "billing"
    },
    {
      "name": "Set Default Payment Method",
      "value": "setPaymentMethod",
      "action": "Set default payment method",
      "resource": "billing"
    },
    {
      "name": "Create Contact",
      "value": "createContact",
      "action": "Create Reach contact",
      "resource": "reach"
    },
    {
      "name": "Delete Contact",
      "value": "deleteContact",
      "action": "Delete Reach contact",
      "resource": "reach"
    },
    {
      "name": "Get Segment",
      "value": "getSegment",
      "action": "Get Reach segment",
      "resource": "reach"
    },
    {
      "name": "Get Segment Contacts",
      "value": "getSegmentContacts",
      "action": "Get Reach segment contacts",
      "resource": "reach"
    },
    {
      "name": "List Contacts",
      "value": "listContacts",
      "action": "List Reach contacts",
      "resource": "reach"
    },
    {
      "name": "List Segments",
      "value": "listSegments",
      "action": "List Reach segments",
      "resource": "reach"
    }
  ]

npm_readme:
  # n8n-nodes-hostinger-api

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

  Hostinger API allows you to manage your virtual private servers, domains, billing, email marketing, and more. Automate provisioning, monitor resources, and perform various administrative actions programmatically.

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

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

  ## Installation

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

  ## Operations

  The Hostinger API node supports the following operations:

  - **Server Management**
  	- List VPS instances
  	- Start/Stop/Restart/Purchase a VPS
  	- Reinstall operating system
  	- Reset root password
  	- Manage SSH keys and post-install scripts

  - **Domain Management**
  	- List domains and check availability
  	- Purchase and manage domains
  	- Configure privacy protection and domain lock
  	- Manage DNS zones and records
  	- Domain forwarding and WHOIS profiles

  - **Monitoring**
  	- Fetch VPS resource usage (CPU, RAM, Disk)
  	- Get server status and uptime
  	- View action history

  - **Networking**
  	- Manage IP addresses and PTR records
  	- Configure firewall rules
  	- Enable/disable backups and snapshots
  	- Malware scanner integration

  - **Provisioning**
  	- Create new VPS instance
  	- Delete VPS instance
  	- Manage data centers and templates

  - **Billing**
  	- View catalog and pricing
  	- Manage payment methods and subscriptions

  - **Email Marketing (Reach)**
  	- List and manage email contacts
  	- Create new contacts with custom fields
  	- Delete contacts by UUID
  	- Manage contact groups
  	- Filter contacts by subscription status

  ## Credentials

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

  1. **Sign up** for a Hostinger account and obtain a VPS.
  2. **Obtain API Access**:
  	- Hostinger provides API tokens via your account dashboard or API settings (refer to official API docs).
  3. **Set up credentials in n8n**:
  	- Go to **Settings > Credentials** in n8n.
  	- Add a new set of credentials for **Hostinger API** using:
  		- **API Key**

  ## Compatibility

  No known version incompatibilities at this time.

  ## Usage

  1. **Add the Hostinger API node** to your workflow.
  2. **Select the desired operation** (e.g., Start VPS, Create Contact, Check Domain).
  3. **Provide required parameters**, such as VPS ID, contact details, domain name, etc.
  4. **Execute the workflow** and automate your Hostinger management tasks.

  For more complex workflows, combine this node with standard n8n nodes such as HTTP Request, Function, and Set.

  Helpful link for beginners: [Try it out](https://docs.n8n.io/try-it-out/)

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [Hostinger API documentation](https://developers.hostinger.com/)
  * [Hostinger VPS Overview](https://www.hostinger.com/vps-hosting)

  ## Version history

  - **v1.0.18**:
    - Fixed release workflow (clean working directory check, full git history fetch)
    - Synced package.json version with npm registry

  - **v1.0.17**:
    - Fixed release workflow configuration
    - Added GITHUB_TOKEN for automated GitHub releases

  - **v1.0.15**:
    - Added segment actions for Email Marketing (Reach)
      - List Segments operation
      - Get Segment operation
      - Get Segment Contacts operation
    - Removed contact groups functionality (replaced with segments)

  - **v1.0.14**:
    - Added fields for Domain Purchase, Check Domain Availability and Update Domain Nameservers operations
    - Refactored scripts for building, linting, and releasing using n8n-node CLI
    - Added strict mode in n8n configuration
    - Updated devDependencies to use latest versions and added release-it for version management
    - Simplified tsconfig.json include paths

  - **v1.0.12**:
    - Refactored the node to use Resources and Operations

  - **v1.0.11**:
    - Updated dependencies

  - **v1.0.10**:
    - Updated dependencies

  - **v1.0.9**:
    - Updated dependencies

  - **v1.0.8**:
    - Added VPS Docker Manager endpoints

  - **v1.0.7**:
    - Added n8n credentials test

  - **v1.0.6**:
    - Updated dependencies

  - **v1.0.5**:
    - Added Email Marketing (Reach) endpoints

  - **v1.0.4**:
    - Added Purchase VM Method
    - Added Billing methods
    - Added Domain Portfolio methods
    - Added Domain WHOIS methods
    - Added Domain Forwarding methods

  - **v1.0.3**:
    - No significant changes

  - **v1.0.2**:
    - Fixed inputs on category selection

  - **v1.0.1**:
    - Added `User-Agent` header

  - **v1.0.0**:
    - Initial release
    - Supports full suite of VPS operations including server management, monitoring, and networking.

ai_documentation_summary:
  {"purpose":"A community n8n node that enables automation of Hostinger API operations including VPS management, domain handling, billing, and email marketing.","capabilities":["List, start, stop, restart, and purchase VPS instances","Manage SSH keys, post-install scripts, and reset root passwords","Reinstall operating systems and manage data centers/templates","List, purchase, configure, and manage domains and DNS records","Monitor VPS resource usage (CPU, RAM, Disk) and server status","Manage IP addresses, PTR records, and firewall rules","Enable/disable backups, snapshots, and use malware scanner","View billing catalog, pricing, and manage payment methods","List, create, delete, and filter email marketing contacts","Manage email contact groups and segments"],"authentication":"API Key","commonUseCases":["Automate VPS provisioning and lifecycle management","Monitor server health and resource usage","Automate domain registration and DNS configuration","Manage email marketing campaigns and contact lists"],"limitations":["Contact groups functionality has been replaced with segments","Requires a Hostinger account and API token access"],"relatedNodes":["HTTP Request","Function","Set"]}


node_type: n8n-nodes-veed.veed
package_name: n8n-nodes-veed
display_name: VEED AI Video API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: dmytrobaltak
author_github_url: https://github.com/veedstudio/
npm_package_name: n8n-nodes-veed
npm_version: 1.2.4
community_fetched_at: 2026-07-14T14:40:33.363Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Generate AI talking videos from an image and audio file using the Veed Fabric API. Automate creation of realistic talking videos, animation videos and ai avatars directly in your n8n workflows.

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "fabric",
      "options": [
        {
          "name": "Fabric",
          "value": "fabric",
          "description": "Generate talking head videos"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateVideo",
      "options": [
        {
          "name": "Generate Video",
          "value": "generateVideo",
          "action": "Generate a video using fabric model",
          "description": "Generate a talking head video from image and audio"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "fabric"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate Video",
      "value": "generateVideo",
      "action": "Generate a video using fabric model",
      "description": "Generate a talking head video from image and audio",
      "resource": "fabric"
    }
  ]

npm_readme:
  # n8n-nodes-veed

  Generate AI talking videos from images and audio using the Veed Fabric API. Automate creation of realistic talking videos, animation videos and AI avatars directly in your n8n workflows.

  ## Features

  - **Fabric Video Generation**: Create AI-powered talking head videos from images and audio
  - Powered by [fal.ai](https://fal.ai)
  - Support for multiple model versions (Standard & Fast)
  - Real-time progress tracking via streaming status updates
  - Configurable timeouts

  ## Installation

  ### Community Nodes (Recommended)

  1. Go to **Settings > Community Nodes** in n8n
  2. Search for `veed`
  3. Click **Install**

  ### Manual Installation

  ```bash
  npm install n8n-nodes-veed
  ```

  ## Prerequisites

  - A fal.ai account ([sign up](https://fal.ai))
  - A fal.ai personal API key ([get your key](https://fal.ai/dashboard/keys))
  - n8n version 0.200.0 or higher
  - Node.js 22 or higher

  ## Setup

  1. In n8n, create a new **Fal.ai API** credential
  2. Paste your personal API key
  3. Add the **VEED AI Video API** node to your workflow

  ## Usage

  ### Fabric Video Generation

  Generate realistic talking head videos from a still image and audio file.

  #### Parameters

  **Image URL** (required)

  - Portrait image URL for the talking head
  - Best results: Front-facing photos, clear facial features
  - Supported formats: JPG, PNG, WebP

  **Audio URL** (required)

  - Speech audio URL for lip sync
  - Supported formats: MP3, WAV, M4A, AAC

  **Model Version**

  - **Fabric 1.0**: Lower price
  - **Fabric 1.0 Fast**: Faster generation, higher price

  **Resolution**

  - `480p`: Faster generation
  - `720p`: Higher quality

  **Aspect Ratio**

  - `16:9`: Landscape (YouTube, presentations)
  - `9:16`: Portrait (TikTok, Instagram Stories, Reels)
  - `1:1`: Square (Instagram Feed, LinkedIn)

  #### Options (Advanced)

  **Timeout** (default: 10 minutes)

  - Maximum time to wait for generation
  - Recommended: 10+ minutes for longer videos, 15+ for 720p
  - Range: 1-60 minutes
  - Note: The node uses fal.ai's streaming API for real-time status updates

  ## 🎬 Showcase Workflows

  > **Note:** These workflow examples are available in the repository for local development/testing only. They are not included in the published npm package.

  Ready-to-use workflow templates demonstrating the Veed Fabric node in complete pipelines:

  ### 1. **Simple Text-to-Video** (Beginner-Friendly)

  A minimal workflow to test the Veed Fabric node with pre-made assets.

  **What it does:**

  - Uses demo image and audio URLs
  - Generates a talking head video using Fabric Fast model
  - Shows generation progress and results
  - Formats output with video URL and generation time

  **Import:** `dev-workflow-examples/simple-text-to-video.json`

  ---

  ### 2. **Complete Text-to-Video Ad Generator** (Advanced)

  Full automated pipeline from text prompt to social media post.

  **What it does:**

  ```
  Text Prompt ("animated bear advertising sunglasses")
      ↓
  🤖 OpenAI GPT-4o-mini → Generates ad script + character description
      ↓
  🎨 OpenAI DALL-E 3 → Creates character image
      ↓
  🎙️ StreamElements TTS → Converts script to voice (FREE)
      ↓
  🎬 Veed Fabric → Generates talking head video
      ↓
  🐦 Twitter/X → Posts video with caption
  ```

  **Import:** `dev-workflow-examples/text-to-video-showcase.json`

  **Services used:**

  - 💰 **OpenAI GPT-4o-mini** ($5 free trial, ~$0.01/video) - Script generation
  - 💰 **OpenAI DALL-E 3** ($5 free trial, ~$0.04/image) - Image generation
  - ✅ **StreamElements TTS** (FREE, no API key needed) - Text-to-speech
  - 💰 **fal.ai** (Pay-per-use, ~$0.08-0.20/second) - Video generation
  - ✅ **Twitter/X API** (FREE tier) - Social posting

  ---

  ### 💡 Quick Start with Showcase Workflows

  > **Prerequisites:** These workflows are only available when running the node in development mode. See [Development](#development) section below for setup instructions.

  1. **Import a workflow:**

     ```
     n8n (localhost:5678) → Workflows → Import from File → Select JSON from dev-workflow-examples/
     ```

  2. **Set up credentials:**
     - **Simple workflow:** Only fal.ai API key required
     - **Advanced workflow:** OpenAI API key, Twitter OAuth2 credentials, fal.ai API key

  3. **Customize:**
     - **Simple:** Replace imageUrl and audioUrl in "📝 Set Demo Image & Audio" node
     - **Advanced:** Change adPrompt in "📝 Set Ad Concept" node
     - Adjust video settings (resolution, aspect ratio)

  4. **Execute and wait:**
     - Click "Test Workflow" button
     - Watch progress in execution logs

  5. **Use your video:**
     - Get video URL from output
     - Download and use in your content
     - Automatically posted to Twitter (advanced workflow)

  ## Performance

  - **Generation time**: Depending on audio length and video resolution
  - **Progress updates**: Real-time progress shown in execution logs
  - **Timeout handling**: Configurable timeout with clear error messages

  ## Troubleshooting

  Having issues? See the [Troubleshooting Guide](docs/TROUBLESHOOTING.md) for detailed solutions to common problems:

  - Authentication errors
  - Generation timeouts
  - Invalid URL errors
  - Rate limits
  - Network issues
  - And more...

  ## Compatibility

  - **n8n**: 0.200.0+
  - **Node.js**: 22+
  - **Supported platforms**: Linux, macOS, Windows

  ## Resources

  - [Veed Fabric Model on fal.ai](https://fal.ai/models/veed/fabric-1.0)
  - [Fabric Playground](https://fal.ai/models/veed/fabric-1.0/playground)
  - [fal.ai Documentation](https://docs.fal.ai)
  - [Report Issues](https://github.com/veedstudio/n8n-nodes-veed/issues)
  - [n8n Community Forum](https://community.n8n.io)

  ## Development

  ### Build

  ```bash
  pnpm build
  ```

  ### Test

  ```bash
  pnpm test          # Run all tests
  pnpm test:watch    # Watch mode
  pnpm test:coverage # Coverage report
  ```

  ### Local Development

  ```bash
  pnpm dev  # Starts n8n with your node at localhost:5678
  ```

  For detailed testing instructions, see [docs/TESTING.md](docs/TESTING.md)

  ## Contributing

  Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests
  5. Run `pnpm lint:fix`
  6. Submit a pull request

  ### n8n Community Node Restrictions

  When contributing, be aware of n8n's community node restrictions:

  - **❌ No `setTimeout` or `setInterval`**: These global timers are not allowed.
  - **✅ Required properties**: All nodes must have `usableAsTool` property
  - **✅ Credentials**: Must have `icon` and `test` properties

  ## License

  MIT

  ## Support

  For issues and questions:

  - [GitHub Issues](https://github.com/veedstudio/n8n-nodes-veed/issues)
  - [n8n Community Forum](https://community.n8n.io)

  ---

ai_documentation_summary:
  {"purpose":"Generates AI-powered talking head videos from images and audio files using the Veed Fabric API, supporting multiple model versions and real-time progress tracking.","capabilities":["Create talking head videos from image and audio","Generate animation videos and AI avatars","Support for Fabric 1.0 and Fabric 1.0 Fast models","Configurable resolution (480p, 720p)","Configurable aspect ratios (16:9, 9:16, 1:1)","Real-time progress tracking via streaming status updates","Configurable timeouts (1-60 minutes)"],"authentication":"API key required (fal.ai personal API key)","commonUseCases":["Text-to-video content creation","Social media video generation (TikTok, Instagram, YouTube)","Automated ad generation pipelines","AI avatar creation for presentations"],"limitations":["Requires fal.ai account and API key","Requires n8n version 0.200.0 or higher","Requires Node.js 22 or higher","Showcase workflows only available in development mode","Generation time depends on audio length and video resolution"],"relatedNodes":["fal.ai API","OpenAI GPT-4o-mini","OpenAI DALL-E 3","StreamElements TTS","Twitter/X API"]}


node_type: n8n-nodes-postfast.postFast
package_name: n8n-nodes-postfast
display_name: PostFast - Social Media Management
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: peturgeorgievv
author_github_url: https://github.com/peturgeorgievv/
npm_package_name: n8n-nodes-postfast
npm_version: 0.1.20
community_fetched_at: 2026-07-14T14:40:33.365Z
ai_summary_generated_at: 2026-03-25 22:51:43
description:
  Schedule and manage social media posts across Facebook, Instagram, TikTok, Twitter/X, LinkedIn, YouTube, Threads, Pinterest, Bluesky, Telegram, and Google Business Profile

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "socialPost",
      "options": [
        {
          "name": "File",
          "value": "file",
          "description": "Manage file uploads"
        },
        {
          "name": "Social Account",
          "value": "socialAccount",
          "description": "Manage social media accounts"
        },
        {
          "name": "Social Post",
          "value": "socialPost",
          "description": "Create and manage social media posts"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getUploadUrl",
      "options": [
        {
          "name": "Get Upload URL",
          "value": "getUploadUrl",
          "action": "Get upload URL",
          "description": "Generate pre-signed URLs for uploading media files"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Get All",
          "value": "getAll",
          "action": "Get all social accounts",
          "description": "Get all connected social media accounts"
        },
        {
          "name": "Get Pinterest Boards",
          "value": "getPinterestBoards",
          "action": "Get Pinterest boards",
          "description": "Get Pinterest boards for a connected account"
        },
        {
          "name": "Get YouTube Playlists",
          "value": "getYoutubePlaylists",
          "action": "Get YouTube playlists",
          "description": "Get YouTube playlists for a connected account"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "socialAccount"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create social posts",
          "description": "Create and schedule one or more social media posts"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete social post",
          "description": "Delete a scheduled or failed post"
        },
        {
          "name": "Get Analytics",
          "value": "getAnalytics",
          "action": "Get analytics",
          "description": "Fetch published posts with their latest performance metrics"
        },
        {
          "name": "Get Many",
          "value": "getMany",
          "action": "Get many social posts",
          "description": "Query and paginate social posts"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "socialPost"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Upload URL",
      "value": "getUploadUrl",
      "action": "Get upload URL",
      "description": "Generate pre-signed URLs for uploading media files",
      "resource": "file"
    },
    {
      "name": "Get All",
      "value": "getAll",
      "action": "Get all social accounts",
      "description": "Get all connected social media accounts",
      "resource": "socialAccount"
    },
    {
      "name": "Get Pinterest Boards",
      "value": "getPinterestBoards",
      "action": "Get Pinterest boards",
      "description": "Get Pinterest boards for a connected account",
      "resource": "socialAccount"
    },
    {
      "name": "Get YouTube Playlists",
      "value": "getYoutubePlaylists",
      "action": "Get YouTube playlists",
      "description": "Get YouTube playlists for a connected account",
      "resource": "socialAccount"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create social posts",
      "description": "Create and schedule one or more social media posts",
      "resource": "socialPost"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete social post",
      "description": "Delete a scheduled or failed post",
      "resource": "socialPost"
    },
    {
      "name": "Get Analytics",
      "value": "getAnalytics",
      "action": "Get analytics",
      "description": "Fetch published posts with their latest performance metrics",
      "resource": "socialPost"
    },
    {
      "name": "Get Many",
      "value": "getMany",
      "action": "Get many social posts",
      "description": "Query and paginate social posts",
      "resource": "socialPost"
    }
  ]

npm_readme:
  # n8n-nodes-postfast

  This is an n8n community node for [PostFast](https://postfa.st) - a comprehensive social media management and scheduling platform. It allows you to create, manage, and schedule posts across multiple social media channels directly from your n8n workflows.

  **Node Name in n8n:** PostFast - Social Media Management

  ## Features

  - 🚀 **Multi-Platform Support**: 11 platforms — Facebook, Instagram, TikTok, Twitter/X, LinkedIn, YouTube, Threads, Pinterest, Bluesky, Telegram, Google Business Profile
  - 📸 **Media Management**: Upload images and videos with pre-signed S3 URLs
  - 📅 **Advanced Scheduling**: Schedule posts using UTC timestamps (ISO 8601 format)
  - 🎯 **Platform-Specific Controls**: Reels, Stories, Shorts, Carousels, Drafts
  - 🔍 **Smart Filtering**: Query posts by platform, status, and date ranges
  - 📊 **Pagination Support**: Handle large datasets efficiently
  - 🔐 **Secure Authentication**: API key-based authentication

  ## Installation

  ### In n8n (Recommended)

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

  ### Manual Installation

  ```bash
  npm install n8n-nodes-postfast
  ```

  ## Authentication

  To use this node, you'll need:

  1. **PostFast API Key**:
     - Log in to your PostFast account
     - Navigate to Settings → API Keys
     - Create a new API key
     - Copy the key (you won't be able to see it again)

  2. **Add Credentials in n8n**:
     - In n8n, go to Credentials
     - Create new "PostFast API" credentials
     - Enter your API key

  ## Resources & Operations

  ### 📁 File Resource

  #### Get Upload URL
  Generate pre-signed S3 URLs for uploading media files.

  **Parameters:**
  - **Content Type**: MIME type (image/jpeg, image/png, image/gif, image/webp, video/mp4, video/webm, video/mov, video/quicktime, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-powerpoint, application/vnd.openxmlformats-officedocument.presentationml.presentation)
  - **Count**: Number of URLs to generate (1-8; video and document types allow only 1 per request)

  **Limits:**
  - Max file size: 250 MB (video), 10 MB (image)
  - Rate limit: 150 requests per minute, 350 per day

  **Usage Example:**
  1. Use this operation to get S3 upload URLs
  2. Upload your files directly to S3 using the signed URLs
  3. Use the returned `key` in your social posts

  ---

  ### 👥 Social Account Resource

  #### Get All
  Retrieve all connected social media accounts for your workspace.

  **Returns:**
  - Account IDs (needed for posting)
  - Platform types
  - Account names and handles
  - Connection status

  **Rate limit:** 350 requests per hour

  #### Get Pinterest Boards
  Retrieve Pinterest boards for a connected Pinterest account. Use the returned `boardId` in the `Pinterest Board ID` control when creating Pinterest posts.

  **Parameters:**
  - **Social Media Account ID**: ID of the connected Pinterest account (from Get All)

  **Rate limit:** 90 requests per hour

  #### Get YouTube Playlists
  Retrieve YouTube playlists for a connected YouTube account. Use the returned `playlistId` in the `YouTube Playlist ID` control when creating YouTube posts.

  **Parameters:**
  - **Social Media Account ID**: ID of the connected YouTube account (from Get All)

  **Rate limit:** 90 requests per hour

  ---

  ### 📝 Social Post Resource

  #### Create Post
  Create and schedule posts with platform-specific features.

  **Core Parameters:**
  - **Platform**: Facebook, Instagram, TikTok, Twitter/X, LinkedIn, YouTube, Threads, Pinterest, Bluesky, Telegram, Google Business Profile
  - **Social Media Account ID**: From Social Account > Get All
  - **Content**: Post text with emoji support
  - **Scheduled At**: ISO 8601 datetime
  - **Media Items**: Images/videos with S3 keys
  - **First Comment**: Automatic first comment posted ~10 seconds after publish. Supported on Instagram, Facebook, YouTube, Threads, and X; TikTok only for accounts on the TikTok Business API; LinkedIn only for Community-Management-connected accounts.

  **Platform-Specific Controls:**

  **X (Twitter):**
  - Retweet URL for retweeting without changes

  **Facebook:**
  - Content Types: Post, Reel, Story
  - Reels collaborators
  - Multi-image support

  **Instagram:**
  - Publish Types: Timeline, Story, Reel
  - Grid posting option
  - Collaborators
  - Carousel support (up to 10 items)

  **TikTok:**
  - Privacy: Public, Mutual Friends, Follower of Creator, Only Me (deprecated — Business API accounts ignore it: videos use the account-default privacy, photos default to public)
  - Allow Comments/Duet/Stitch
  - Draft mode
  - Brand Organic / Brand Content flags
  - Auto-add music
  - Carousel posts (2-35 images)

  **YouTube:**
  - Title, Privacy (Public, Private, Unlisted)
  - Tags, Category ID
  - Shorts support
  - Made for Kids (COPPA) flag
  - Playlist ID (from Social Account > Get YouTube Playlists)

  **LinkedIn:**
  - Document attachments (PDF, DOC, DOCX, PPT, PPTX)
  - Attachment title

  **Pinterest:**
  - Board ID (required, from Social Account > Get Pinterest Boards)
  - Destination link URL
  - Content parsing: first line → title, remaining → description
  - Carousel pins (2-5 static images)

  #### Get Many Posts
  Query and filter your scheduled posts with advanced options.

  **Filter Options:**
  - **Platforms**: Filter by one or more platforms
  - **Statuses**: DRAFT, SCHEDULED, PUBLISHED, FAILED
  - **Date Range**: From/To dates (ISO 8601)
  - **Pagination**: Page-based navigation

  **Return Options:**
  - Return all results (auto-pagination)
  - Limit results (1-50 per page)

  **Response Includes:**
  - Post content and media
  - Scheduling information
  - Publishing status
  - Error messages (for failed posts)
  - Platform-specific metadata

  #### Get Analytics
  Fetch published posts with their latest performance metrics.

  **Parameters:**
  - **From Date / To Date**: Date range (ISO 8601) — both are required by the API
  - **Platforms**: Optional platform filter
  - **Social Media Account IDs**: Optional comma-separated account UUIDs

  **Rate limit:** 350 requests per hour

  #### Delete Post
  Remove scheduled or failed posts.

  **Parameters:**
  - **Post ID**: Unique identifier of the post

  **Rate limit:** 160 requests per hour

  ## Workflow Examples

  ### 1. Content Calendar Automation
  ```
  Notion Database → PostFast (Create) → Multiple Platforms
  ```
  Pull content from Notion and schedule across all platforms.

  ### 2. Media Processing Pipeline
  ```
  Dropbox → Image Processing → PostFast (Get Upload URL) → S3 Upload → PostFast (Create)
  ```
  Process images and videos before posting.

  ### 3. Failed Post Recovery
  ```
  Schedule Trigger → PostFast (Get Many: status=FAILED) → Error Handler → Retry/Notify
  ```
  Monitor and handle failed posts automatically.

  ### 4. Cross-Platform Campaign
  ```
  RSS Feed → AI Content Generator → PostFast (Create: Multiple Platforms)
  ```
  Generate and distribute content across all channels.

  ## Rate Limits

  **Global Limits (per API key, rolling windows):**
  - 60 requests per minute
  - 150 requests per 5 minutes
  - 300 requests per hour
  - 2000 requests per day

  **Endpoint-Specific (override the matching global window):**
  - Get Upload URL: 150/minute, 350/day
  - Post creation: 150/minute, 350/day
  - Post queries (Get Many): 200/hour
  - Post analytics: 350/hour
  - Post deletion: 160/hour
  - Social accounts (Get All): 350/hour
  - Pinterest boards / YouTube playlists: 90/hour

  ## Error Handling

  The node provides detailed error messages for common scenarios:

  - `401`: Invalid API key
  - `404`: Resource not found (check IDs)
  - `429`: Rate limit exceeded
  - `400`: Invalid parameters

  ## Platform Requirements

  - **Node.js**: v18.0.0 or higher
  - **n8n**: v1.0.0 or higher
  - **API Key**: PostFast workspace API key

  ## Advanced Features

  ### Batch Operations
  Process multiple items in a single workflow execution for efficiency.

  ### Error Recovery
  Built-in error handling with detailed messages for debugging.

  ### Pagination Handling
  Automatic pagination when fetching all results.

  ### Media Validation
  Automatic MIME type detection and size validation.

  ## Development

  ### Setup
  ```bash
  git clone https://github.com/peturgeorgievv/n8n-nodes-postfast.git
  cd n8n-nodes-postfast
  npm install
  ```

  ### Testing
  ```bash
  npm run dev     # Start development server
  npm run build   # Build for production
  npm run lint    # Check code quality
  ```

  ### Publishing
  Releases are published by GitHub Actions on tag push (`.github/workflows/publish.yml`, npm trusted publishing with provenance). Never `npm publish` locally.

  ```bash
  git tag 0.1.20
  git push origin 0.1.20
  ```

  ## Support

  - **Documentation**: [PostFast API Docs](https://api.postfa.st/docs)
  - **Issues**: [GitHub Issues](https://github.com/peturgeorgievv/n8n-nodes-postfast/issues)
  - **Community**: [n8n Community Forum](https://community.n8n.io)
  - **Developer Support**: [me@peturgeorgievv.com](mailto:me@peturgeorgievv.com)

  ## License

  [MIT](LICENSE)

  ## Contributing

  Contributions are welcome! Please feel free to submit a Pull Request.

  ## Changelog

  ### v0.1.0
  - Initial release with full PostFast API support
  - Multi-platform posting capabilities
  - Advanced filtering and pagination
  - Media upload management
  - Platform-specific controls for all major social networks

ai_documentation_summary:
  {"purpose":"This n8n community node enables scheduling and management of social media posts across multiple platforms including Facebook, Instagram, TikTok, Twitter/X, LinkedIn, YouTube, and Pinterest.","capabilities":["Create and schedule posts across 7+ social platforms","Upload and manage media with pre-signed S3 URLs","Support for platform-specific features (Reels, Stories, Shorts, Carousels, Drafts)","Advanced scheduling with UTC timestamps (ISO 8601 format)","Query and filter posts by platform, status, and date ranges","Pagination support for large datasets","Automatic first comment posting on supported platforms","Retrieve connected social media accounts","Retrieve Pinterest boards and YouTube playlists"],"authentication":"API key required (PostFast API key stored in n8n Credentials)","commonUseCases":["Automated content calendar management across multiple platforms","Media processing pipeline before posting","Failed post monitoring and recovery workflows","Cross-platform social media scheduling from a single workflow"],"limitations":["Rate limits apply (150 requests/day for uploads, 90/hour for account queries, 160/hour for post operations)","File size limits: 250 MB for videos, 10 MB for images","Requires external S3 upload step for media files","Some platform-specific features may not be available on all accounts or regions","First comment feature only supported on X, Instagram, Facebook, YouTube, and Threads"],"relatedNodes":["S3 Upload","Notion Database","Dropbox","Error Handler","Schedule Trigger"]}


node_type: n8n-nodes-botnoi-voice.botnoitts
package_name: n8n-nodes-botnoi-voice
display_name: Botnoi Voice
description: Generate speech using Botnoi Voice API
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: phoovadet.noobdev
author_github_url: https://github.com/HakusaiTH/n8n-BotnoiVoice.git
npm_package_name: n8n-nodes-botnoi-voice
npm_version: 2.0.7
community_fetched_at: 2026-07-14T14:40:33.366Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "voice",
      "options": [
        {
          "name": "Voice",
          "value": "voice"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generate",
      "options": [
        {
          "name": "Generate",
          "value": "generate",
          "action": "Generate voice",
          "description": "Generate voice from text"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "voice"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate",
      "value": "generate",
      "action": "Generate voice",
      "description": "Generate voice from text",
      "resource": "voice"
    }
  ]

npm_readme:
  # 🔊 n8n-BotnoiVoice

  Plug-in to connect [Botnoi Voice API](https://voice.botnoi.ai/api-login) to [n8n](https://n8n.io/) — allowing easy use of **Thai Text-to-Speech (TTS)** and **Subtitle Generation (Gensub)** directly inside your n8n workflows.

  ---

  ## 📌 Requirements before starting

  ### 1. Install basic tools

  - [Git](https://git-scm.com/downloads)
  - Node.js version **20+**
  - Recommended via [nvm](https://github.com/nvm-sh/nvm) (Linux, Mac, WSL)
  - For Windows, see [Microsoft Docs](https://learn.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows)
  - Install n8n globally:

  ```bash
  npm install -g n8n
  ````

  ---

  ## 🚀 How to use the plugin

  ### ✅ Install from npm (recommended)

  1. Create a custom n8n extensions folder:

  ```bash
  mkdir -p ~/.n8n/custom
  cd ~/.n8n/custom
  npm init -y
  ```

  2. Install the plugin:

  ```bash
  npm i n8n-nodes-botnoi-voice
  ```

  3. Start n8n:

  ```bash
  n8n start
  ```

  > 💡 Once installed, search in n8n for **Botnoi Voice** or **Botnoi Gensub** nodes.

  ---

  ### 🛠️ Install locally (if cloning repo)

  1. Clone and install dependencies:

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

  2. Build and link the plugin:

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

  3. Link to your n8n instance:

  ```bash
  mkdir -p ~/.n8n/custom
  cd ~/.n8n/custom
  npm init -y
  npm link n8n-nodes-botnoi-voice
  ```

  4. Start n8n:

  ```bash
  n8n start
  ```

  ---

  ## 🔐 Get API Key from Botnoi Voice

  1. Visit [https://voice.botnoi.ai/api-login](https://voice.botnoi.ai/api-login)
  2. Login or sign up for a free account
  3. Click **Generate API Key**
  4. Copy the key for use in n8n

  <p align="center">
    <img src="https://github.com/user-attachments/assets/53cae275-c947-49ac-aa5f-49c224914da9" width="640" alt="Generate API Key"/>
  </p>

  ---

  ## ⚙️ Add API Key in n8n

  1. Open **Credentials** tab in n8n
  2. Create a new credential → Select **Botnoi Voice**
  3. Paste your API key and test connection

  <p align="center">
    <img src="https://github.com/user-attachments/assets/7ddb26c4-2241-420f-8212-5096e1e052c5" width="640"/>
  </p>
  <p align="center">
    <img src="https://github.com/user-attachments/assets/2d5a905a-7f46-4447-a5fe-aa682a318621" width="640"/>
  </p>

  > ✅ If the key is correct, it will show “Connection tested successfully”.

  ---

  ## 🗣️ Botnoi Voice (TTS)

  Convert any text into natural-sounding speech in Thai, English, Japanese, Vietnamese, and more.

  ### 🧾 Usage Steps

  #### 1️⃣ Enter text to convert

  <p align="center">
    <img src="https://github.com/user-attachments/assets/a20ee802-7ecb-4005-bc18-7ffe18e2ac92" width="640"/>
  </p>

  * Add a `Botnoi Voice` node
  * Enter text manually or use expression (e.g. `{{ $json.output }}`)

  #### 2️⃣ Choose a speaker

  <p align="center">
    <img src="https://github.com/user-attachments/assets/1628e724-a7c6-4f76-a203-dad037eca3a4" width="640"/>
  </p>

  * Over 300 voices available (Eva, Bo, Max, Alisa, etc.)

  #### 3️⃣ Select language

  <p align="center">
    <img src="https://github.com/user-attachments/assets/8fb5380f-f4b2-48cf-89f6-03d77e8679d4" width="640"/>
  </p>

  * Supports multiple languages — choose `Thai`, `English`, `Japanese`, etc.

  #### 4️⃣ Generate audio

  <p align="center">
    <img src="https://github.com/user-attachments/assets/06ecb4b4-cd85-45a2-b99e-6db17f63f443" width="640"/>
  </p>

  * Click **Execute Step** → Output shows `audio_url` for playback or download.

  ---

  ## 🎧 Botnoi Gensub (Subtitle Generator)

  Generate subtitles (SRT / JSON) automatically from any **audio URL** via [Botnoi Voice API](https://voice.botnoi.ai/api-login).

  Ideal for creating Thai transcripts, podcast captions, or speech analytics.

  ### 🧩 Overview

  * Supports **URL input only**
  * Generates **SRT or JSON** subtitles
  * Adjustable silence and duration segmentation
  * Perfect with free hosting (e.g., [EdgeOne Pages](https://pages.edgeone.ai/drop))

  ---

  ### 🧱 Example: Generate Subtitles from an Audio URL

  #### ✅ Step 1 — Upload audio

  Use [EdgeOne Pages Drop](https://pages.edgeone.ai/drop) to host your file:

  1. Go to [https://pages.edgeone.ai/drop](https://pages.edgeone.ai/drop)
  2. Enter a temporary domain name
  3. Upload your `.mp3` or `.wav`
  4. Copy the URL (e.g.)

     ```
     https://forward-cyan-xo4dfpu9q6.edgeone.app/Recording.mp3
     ```

  <p align="center">
    <img alt="Image" src="https://github.com/user-attachments/assets/02666ee6-50c8-40fc-a1c8-f0d4908559f0" width="640"/>
  </p>

  ---

  #### ✅ Step 2 — Configure Botnoi Gensub Node

  | Field                          | Example                                                     | Description                              |
  | ------------------------------ | ----------------------------------------------------------- | ---------------------------------------- |
  | **Credential to connect with** | Botnoi account                                              | Use your `botnoiApi` credential          |
  | **Audio URL**                  | `https://forward-cyan-xo4dfpu9q6.edgeone.app/Recording.mp3` | Publicly accessible file URL             |
  | **Max Duration (Seconds)**     | `10`                                                        | Max duration per subtitle segment        |
  | **Max Silence (Seconds)**      | `0.3`                                                       | Silence threshold before splitting lines |
  | **Return SRT**                 | `Yes`                                                       | Choose “Yes” to get SRT subtitle text    |
  | **Timeout (Ms)**               | `60000`                                                     | Request timeout (default 60s)            |

  <p align="center">
   	<img alt="Image" src="https://github.com/user-attachments/assets/4c46f6c1-594d-48dc-83df-b23db3abb38c" width="640"/>
  </p>

  ---

  #### ✅ Step 3 — Execute and check result

  ```json
  {
    "message": "Transcribe successfully",
    "data": {
      "text": "1\n00:00:00,390 --> 00:00:02,220\nสวัสดีตอนเช้า\n",
      "current_point": 509,
      "current_monthly_point": 0,
      "used_points": 15
    }
  }
  ```

  **Result (SRT format):**

  ```
  1
  00:00:00,390 --> 00:00:02,220
  สวัสดีตอนเช้า
  ```

  <p align="center">
    <img alt="Image" src="https://github.com/user-attachments/assets/f992c796-8185-482d-80f5-188fd6599706" width="640"/>
  </p>

  ---

  ## ⚙️ Tips

  * Both nodes share the same credential `botnoiApi`
  * Ensure your audio URL is **publicly accessible** (no login needed)
  * Supported file formats: `.mp3`, `.wav`, `.m4a`
  * Recommended audio length ≤ 60 seconds for best transcription quality

  ---

  ## 📚 References

  * [Botnoi Voice API Docs](https://www.botnoigroup.com/botnoivoice/doc/api-user-guide)
  * [EdgeOne Pages Drop](https://pages.edgeone.ai/drop) — free quick hosting
  * [n8n Node Developer Docs](https://docs.n8n.io/integrations/creating-nodes/)

  ---

  ## 🧑‍💻 Maintainer

  Developed by **Phoovadet Noobdev**

  ---

  ## 📝 License

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

ai_documentation_summary:
  {"purpose":"A n8n node that connects to the Botnoi Voice API to generate Thai, English, Japanese, and Vietnamese speech from text (TTS) and create subtitles (SRT/JSON) from audio URLs (Gensub).","capabilities":["Text-to-Speech (TTS) generation in multiple languages","Selection from over 300 available voices","Subtitle generation from audio URLs (SRT format)","Subtitle generation from audio URLs (JSON format)","Configurable subtitle segmentation by max duration and silence threshold","Audio playback URL output"],"authentication":"API Key required (configured via n8n Credentials tab)","commonUseCases":["Automated voice announcements in Thai or other supported languages","Creating subtitles for podcasts or video content","Generating audio from text documents","Transcribing audio files into text or subtitle format"],"limitations":["Subtitle generation (Gensub) requires a publicly accessible audio URL only","Audio URLs must be hosted on free platforms like EdgeOne Pages for Gensub functionality","Gensub has a default request timeout of 60 seconds (configurable up to 60000ms)"],"relatedNodes":["n8n-nodes-core.webhook","n8n-nodes-core.httpRequest","n8n-nodes-core.code"]}


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

updated_at: 2026-07-14 14:40:33
author_name: deliverect-stefaang
author_github_url: https://github.com/Deliverect/
npm_package_name: n8n-nodes-deliverect
npm_version: 0.1.6
community_fetched_at: 2026-07-14T14:40:33.367Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "storeAPI",
      "options": [
        {
          "name": "Channel API",
          "value": "channelAPI"
        },
        {
          "name": "Commerce API",
          "value": "commerceAPI"
        },
        {
          "name": "KDS API",
          "value": "kdsAPI"
        },
        {
          "name": "POS API",
          "value": "posAPI"
        },
        {
          "name": "REST API",
          "value": "restAPI"
        },
        {
          "name": "Store API",
          "value": "storeAPI"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStores",
      "options": [
        {
          "name": "Get Out-Of-Stock Products",
          "value": "getOutOfStock",
          "action": "Get out of stock products",
          "routing": {
            "request": {
              "qs": {
                "where": "={{ JSON.stringify({ location: $parameter.location }) }}",
                "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"location\":1,\"channelLink\":1,\"plus\":1,\"channel\":1,\"disabledUntil\":1,\"createdAt\":1,\"updatedAt\":1}) }}"
              },
              "url": "=/channelDisabledProducts",
              "method": "GET"
            },
            "operations": {}
          },
          "description": "Get out-of-stock products for a location"
        },
        {
          "name": "Get Products for Account",
          "value": "getProductsForAccount",
          "action": "Get products for account",
          "routing": {
            "request": {
              "qs": {
                "where": "={{ JSON.stringify($parameter.locationId ? { account: $parameter.account, location: $parameter.locationId } : { account: $parameter.account }) }}",
                "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"account\":1,\"location\":1,\"name\":1,\"plu\":1,\"channelLinks\":1,\"tags\":1,\"updatedAt\":1}) }}"
              },
              "url": "=/products",
              "method": "GET"
            },
            "operations": {}
          },
          "description": "Retrieve products for an entire account or a single location"
        },
        {
          "name": "Get Store Holidays",
          "value": "getStoreHolidays",
          "action": "Get store holidays",
          "routing": {
            "request": {
              "url": "=/location/{{$parameter.location}}/holidays",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Store Opening Hours",
          "value": "getStoreOpeningHours",
          "action": "Get store opening hours",
          "routing": {
            "request": {
              "qs": {
                "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"account\":1,\"location\":1,\"timezone\":1,\"days\":1,\"openingHours\":1}) }}"
              },
              "url": "=/account/{{$parameter.account}}/openingHours",
              "method": "GET"
            },
            "operations": {}
          }
        },
        {
          "name": "Get Stores",
          "value": "getStores",
          "action": "Get stores",
          "routing": {
            "request": {
              "qs": {
                "where": "={{ JSON.stringify({ account: $parameter.account }) }}",
                "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"account\":1,\"name\":1,\"posLocationId\":1,\"channelLinks\":1,\"timezone\":1,\"isActive\":1,\"updatedAt\":1}) }}"
              },
              "url": "=/locations",
              "method": "GET"
            },
            "operations": {}
          },
          "description": "Get stores for an account"
        },
        {
          "name": "Set Out-Of-Stock Products",
          "value": "setOutOfStock",
          "action": "Set out of stock products",
          "routing": {
            "request": {
              "url": "/products/snoozeByPlus",
              "body": {
                "plus": "={{ (() => {\n\tconst payload = $parameter.products;\n\tif (payload === undefined || payload === null) {\n\t\treturn payload;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Product PLUs payload: ${message}`);\n\t\t}\n\t}\n\tif (!Array.isArray(result)) {\n\tthrow new Error('Product PLUs payload must be an array');\n}\nreturn result;\n})() }}",
                "account": "={{$parameter.account}}",
                "location": "={{$parameter.location}}",
                "snoozeEnd": "={{$parameter.snoozeEnd}}",
                "snoozeStart": "={{$parameter.snoozeStart}}"
              },
              "method": "POST"
            }
          },
          "description": "Set out-of-stock products for a location"
        },
        {
          "name": "Set Store Holidays",
          "value": "setStoreHolidays",
          "action": "Set store holidays",
          "routing": {
            "request": {
              "url": "=/locations/holidays",
              "body": "={{ (() => {\n\tconst payload = $parameter.holidays;\n\tif (payload === undefined || payload === null) {\n\t\treturn payload;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Holidays payload: ${message}`);\n\t\t}\n\t}\n\treturn result;\n})() }}",
              "method": "POST"
            }
          }
        },
        {
          "name": "Set Store Opening Hours",
          "value": "setStoreOpeningHours",
          "action": "Set store opening hours",
          "routing": {
            "request": {
              "url": "=/locations/openingHours",
              "body": "={{ (() => {\n\tconst payload = $parameter.openingHours;\n\tif (payload === undefined || payload === null) {\n\t\treturn payload;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Opening Hours payload: ${message}`);\n\t\t}\n\t}\n\treturn result;\n})() }}",
              "method": "POST"
            }
          }
        },
        {
          "name": "Set Store Status",
          "value": "setStoreStatus",
          "action": "Set store status",
          "routing": {
            "request": {
              "url": "=/updateStoreStatus/{{$parameter.location}}",
              "body": {
                "isActive": "={{$parameter.isActive}}",
                "prepTime": "={{$parameter.prepTime !== null && $parameter.prepTime !== undefined ? $parameter.prepTime : undefined}}",
                "disableAt": "={{$parameter.disableAt !== \"\" && $parameter.disableAt !== undefined ? $parameter.disableAt : undefined}}",
                "channelLinks": "={{ (() => {\n\tconst payload = $parameter.channelLinks;\n\tif (payload === undefined || payload === null || (typeof payload === 'string' && payload.trim() === '')) {\n\t\treturn undefined;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Channel Links payload: ${message}`);\n\t\t}\n\t}\n\tif (!Array.isArray(result)) {\n\treturn undefined;\n}\nreturn result.length ? result : undefined;\n})() }}"
              },
              "method": "POST"
            }
          },
          "description": "Set store status for a location"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "storeAPI"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createOrder",
      "options": [
        {
          "name": "Create Order",
          "value": "createOrder",
          "action": "Create order",
          "routing": {
            "request": {
              "url": "=/deliverect/order/{{$parameter.channelLink}}",
              "method": "POST"
            }
          },
          "description": "Create an order to a store"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "channelAPI"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "productSync",
      "options": [
        {
          "name": "Request Product Sync",
          "value": "productSync",
          "action": "Request product sync",
          "routing": {
            "request": {
              "url": "=/v2/locations/{{$parameter.location}}/syncProducts",
              "method": "POST"
            }
          },
          "description": "Trigger Deliverect to sync products for a POS on a specific location"
        },
        {
          "name": "Get All Allergens",
          "value": "getAllAllergens",
          "action": "Get all allergens",
          "routing": {
            "request": {
              "qs": {
                "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"name\":1,\"tags\":1,\"updatedAt\":1}) }}"
              },
              "url": "/allAllergens",
              "method": "GET"
            }
          },
          "description": "Retrieve all allergens from POSAPI"
        },
        {
          "name": "Get Product Categories",
          "value": "getProductCategories",
          "action": "Get product categories",
          "routing": {
            "request": {
              "qs": {
                "where": "={{ JSON.stringify({ account: $parameter.account }) }}",
                "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"name\":1,\"parent\":1,\"account\":1,\"products\":{\"_id\":1,\"name\":1}}) }}"
              },
              "url": "/productCategories",
              "method": "GET"
            }
          },
          "description": "Retrieve product categories for a specific account from POSAPI"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "posAPI"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Get Out-Of-Stock Products",
      "value": "getOutOfStock",
      "action": "Get out of stock products",
      "routing": {
        "request": {
          "qs": {
            "where": "={{ JSON.stringify({ location: $parameter.location }) }}",
            "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"location\":1,\"channelLink\":1,\"plus\":1,\"channel\":1,\"disabledUntil\":1,\"createdAt\":1,\"updatedAt\":1}) }}"
          },
          "url": "=/channelDisabledProducts",
          "method": "GET"
        },
        "operations": {}
      },
      "description": "Get out-of-stock products for a location",
      "resource": "storeAPI"
    },
    {
      "name": "Get Products for Account",
      "value": "getProductsForAccount",
      "action": "Get products for account",
      "routing": {
        "request": {
          "qs": {
            "where": "={{ JSON.stringify($parameter.locationId ? { account: $parameter.account, location: $parameter.locationId } : { account: $parameter.account }) }}",
            "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"account\":1,\"location\":1,\"name\":1,\"plu\":1,\"channelLinks\":1,\"tags\":1,\"updatedAt\":1}) }}"
          },
          "url": "=/products",
          "method": "GET"
        },
        "operations": {}
      },
      "description": "Retrieve products for an entire account or a single location",
      "resource": "storeAPI"
    },
    {
      "name": "Get Store Holidays",
      "value": "getStoreHolidays",
      "action": "Get store holidays",
      "routing": {
        "request": {
          "url": "=/location/{{$parameter.location}}/holidays",
          "method": "GET"
        }
      },
      "resource": "storeAPI"
    },
    {
      "name": "Get Store Opening Hours",
      "value": "getStoreOpeningHours",
      "action": "Get store opening hours",
      "routing": {
        "request": {
          "qs": {
            "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"account\":1,\"location\":1,\"timezone\":1,\"days\":1,\"openingHours\":1}) }}"
          },
          "url": "=/account/{{$parameter.account}}/openingHours",
          "method": "GET"
        },
        "operations": {}
      },
      "resource": "storeAPI"
    },
    {
      "name": "Get Stores",
      "value": "getStores",
      "action": "Get stores",
      "routing": {
        "request": {
          "qs": {
            "where": "={{ JSON.stringify({ account: $parameter.account }) }}",
            "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"account\":1,\"name\":1,\"posLocationId\":1,\"channelLinks\":1,\"timezone\":1,\"isActive\":1,\"updatedAt\":1}) }}"
          },
          "url": "=/locations",
          "method": "GET"
        },
        "operations": {}
      },
      "description": "Get stores for an account",
      "resource": "storeAPI"
    },
    {
      "name": "Set Out-Of-Stock Products",
      "value": "setOutOfStock",
      "action": "Set out of stock products",
      "routing": {
        "request": {
          "url": "/products/snoozeByPlus",
          "body": {
            "plus": "={{ (() => {\n\tconst payload = $parameter.products;\n\tif (payload === undefined || payload === null) {\n\t\treturn payload;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Product PLUs payload: ${message}`);\n\t\t}\n\t}\n\tif (!Array.isArray(result)) {\n\tthrow new Error('Product PLUs payload must be an array');\n}\nreturn result;\n})() }}",
            "account": "={{$parameter.account}}",
            "location": "={{$parameter.location}}",
            "snoozeEnd": "={{$parameter.snoozeEnd}}",
            "snoozeStart": "={{$parameter.snoozeStart}}"
          },
          "method": "POST"
        }
      },
      "description": "Set out-of-stock products for a location",
      "resource": "storeAPI"
    },
    {
      "name": "Set Store Holidays",
      "value": "setStoreHolidays",
      "action": "Set store holidays",
      "routing": {
        "request": {
          "url": "=/locations/holidays",
          "body": "={{ (() => {\n\tconst payload = $parameter.holidays;\n\tif (payload === undefined || payload === null) {\n\t\treturn payload;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Holidays payload: ${message}`);\n\t\t}\n\t}\n\treturn result;\n})() }}",
          "method": "POST"
        }
      },
      "resource": "storeAPI"
    },
    {
      "name": "Set Store Opening Hours",
      "value": "setStoreOpeningHours",
      "action": "Set store opening hours",
      "routing": {
        "request": {
          "url": "=/locations/openingHours",
          "body": "={{ (() => {\n\tconst payload = $parameter.openingHours;\n\tif (payload === undefined || payload === null) {\n\t\treturn payload;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Opening Hours payload: ${message}`);\n\t\t}\n\t}\n\treturn result;\n})() }}",
          "method": "POST"
        }
      },
      "resource": "storeAPI"
    },
    {
      "name": "Set Store Status",
      "value": "setStoreStatus",
      "action": "Set store status",
      "routing": {
        "request": {
          "url": "=/updateStoreStatus/{{$parameter.location}}",
          "body": {
            "isActive": "={{$parameter.isActive}}",
            "prepTime": "={{$parameter.prepTime !== null && $parameter.prepTime !== undefined ? $parameter.prepTime : undefined}}",
            "disableAt": "={{$parameter.disableAt !== \"\" && $parameter.disableAt !== undefined ? $parameter.disableAt : undefined}}",
            "channelLinks": "={{ (() => {\n\tconst payload = $parameter.channelLinks;\n\tif (payload === undefined || payload === null || (typeof payload === 'string' && payload.trim() === '')) {\n\t\treturn undefined;\n\t}\n\tlet result = payload;\n\tif (typeof result === 'string') {\n\t\ttry {\n\t\t\tresult = JSON.parse(result);\n\t\t} catch (error) {\n\t\t\tconst message = error && error.message ? error.message : error;\n\t\t\tthrow new Error(`Invalid JSON provided for Channel Links payload: ${message}`);\n\t\t}\n\t}\n\tif (!Array.isArray(result)) {\n\treturn undefined;\n}\nreturn result.length ? result : undefined;\n})() }}"
          },
          "method": "POST"
        }
      },
      "description": "Set store status for a location",
      "resource": "storeAPI"
    },
    {
      "name": "Create Order",
      "value": "createOrder",
      "action": "Create order",
      "routing": {
        "request": {
          "url": "=/deliverect/order/{{$parameter.channelLink}}",
          "method": "POST"
        }
      },
      "description": "Create an order to a store",
      "resource": "channelAPI"
    },
    {
      "name": "Request Product Sync",
      "value": "productSync",
      "action": "Request product sync",
      "routing": {
        "request": {
          "url": "=/v2/locations/{{$parameter.location}}/syncProducts",
          "method": "POST"
        }
      },
      "description": "Trigger Deliverect to sync products for a POS on a specific location",
      "resource": "posAPI"
    },
    {
      "name": "Get All Allergens",
      "value": "getAllAllergens",
      "action": "Get all allergens",
      "routing": {
        "request": {
          "qs": {
            "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"name\":1,\"tags\":1,\"updatedAt\":1}) }}"
          },
          "url": "/allAllergens",
          "method": "GET"
        }
      },
      "description": "Retrieve all allergens from POSAPI",
      "resource": "posAPI"
    },
    {
      "name": "Get Product Categories",
      "value": "getProductCategories",
      "action": "Get product categories",
      "routing": {
        "request": {
          "qs": {
            "where": "={{ JSON.stringify({ account: $parameter.account }) }}",
            "projection": "={{ $parameter.fetchFullPayload ? undefined : JSON.stringify({\"_id\":1,\"name\":1,\"parent\":1,\"account\":1,\"products\":{\"_id\":1,\"name\":1}}) }}"
          },
          "url": "/productCategories",
          "method": "GET"
        }
      },
      "description": "Retrieve product categories for a specific account from POSAPI",
      "resource": "posAPI"
    }
  ]

npm_readme:
  # n8n-nodes-deliverect

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


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

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

  ## Installation

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

  ## Operations

  Store API: 

  * get stores
  * get snoozed products
  * set snoozed products

  POSAPI

  * sync products

  Channel API

  * publish menu

  ## Credentials

  [Request](https://developers.deliverect.com/docs/getting-started) a client credentials keypair with Deliverect API support.

  Bearer token support is WIP.

  ## Compatibility

  Tested with N8N 1.97.1

  ## Usage

  If you're new with N8N, [try it out](https://docs.n8n.io/try-it-out/) first.

  ## Resources

  * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
  * [Deliverect API documentation](https://developers.deliverect.com)

  ## Version history

  v1.0: Initial version

ai_documentation_summary:
  {"purpose":"This n8n community node enables interaction with the Deliverect API to manage restaurant POS systems, menus, and product inventory within automated workflows.","capabilities":["Retrieve stored products","Retrieve snoozed products","Set/update snoozed products","Sync products to POS system","Publish menu items"],"authentication":"API key required (Client credentials keypair)","commonUseCases":["Automating restaurant menu updates","Synchronizing product inventory between systems","Managing product availability and snoozing"],"limitations":["Bearer token support is not yet implemented (WIP)","Limited to specific Deliverect API operations"],"relatedNodes":["HTTP Request","Deliverect API"]}


node_type: n8n-nodes-presenton.presenton
package_name: n8n-nodes-presenton
display_name: Presenton
description: Interact with presenton API (async generation + status checking)
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: badu5
author_github_url: https://github.com/shivarajbadu/
npm_package_name: n8n-nodes-presenton
npm_version: 1.2.7
community_fetched_at: 2026-07-14T14:40:33.368Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "generateAsync",
      "options": [
        {
          "name": "Generate Presentation (Async)",
          "value": "generateAsync",
          "action": "Initiate presentation generation",
          "description": "Initiate presentation generation asynchronously"
        },
        {
          "name": "Check Presentation Status",
          "value": "checkStatus",
          "action": "Poll or check until presentation is done",
          "description": "Poll or check until presentation is done"
        },
        {
          "name": "Upload File",
          "value": "uploadFile",
          "action": "Upload a file to presenton to reference later",
          "description": "Upload a file to Presenton to reference later"
        }
      ],
      "required": true,
      "description": "What you want to do with Presenton",
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Generate Presentation (Async)",
      "value": "generateAsync",
      "action": "Initiate presentation generation",
      "description": "Initiate presentation generation asynchronously"
    },
    {
      "name": "Check Presentation Status",
      "value": "checkStatus",
      "action": "Poll or check until presentation is done",
      "description": "Poll or check until presentation is done"
    },
    {
      "name": "Upload File",
      "value": "uploadFile",
      "action": "Upload a file to presenton to reference later",
      "description": "Upload a file to Presenton to reference later"
    }
  ]

npm_readme:
  ## Presenton for n8n

  Generate professional presentations with the Presenton API directly from your n8n workflows. This community node supports asynchronous presentation generation, file uploads, and task status checks.

  Homepage: [presenton.ai](https://presenton.ai) • API docs: [presenton.ai/docs/api-reference](https://presenton.ai/docs/api-reference)

  ### Features

  - **Generate Presentation (Async)**: Kick off a background job to create PPTX or PDF
  - **Check Presentation Status**: Poll a task by ID until it’s complete
  - **Upload File**: Upload binary files and reference them during generation

  ## Installation

  ### Install in n8n (Community nodes)

  1. In n8n, go to Settings → Community Nodes → Install.
  2. Search for or enter the package name: `n8n-nodes-Presenton`.
  3. Confirm installation and restart n8n if prompted.

  ### Self-hosted filesystem install

  If you mount community nodes from disk, add this package to your custom nodes directory and install:

  ```bash
  npm install n8n-nodes-Presenton
  ```

  Minimum Node.js version: 20

  ## Credentials

  Create credentials of type `Presenton API`:

  - **API Key**: Your Presenton API key
  - **Base API URL** (optional): Override the default `https://api.presenton.ai` for staging or self-hosted deployments

  The node adds the `Authorization: Bearer <apiKey>` header automatically.

  ## Node operations

  ### Generate Presentation (Async)

  Starts a background job: `POST /api/v1/ppt/presentation/generate/async`

  - **content**: Main content to generate from
  - **slides_markdown**: Optional list of slide markdown strings
  - **instructions**: Additional guidance for the generator
  - **tone**: `default | professional | educational | funny | sale_pitch | causal`
  - **verbosity**: `standard | concise | text-heavy`
  - **web_search**: Allow web search during generation (boolean)
  - **image_type**: `stock | ai-generated`
  - **theme**: Theme name (string)
  - **noOfSlides**: Number of slides (number)
  - **language**: e.g. `English`
  - **template**: e.g. `general`
  - **include_table_of_contents**: boolean
  - **include_title_slide**: boolean
  - **files**: A file ID returned by the Upload File operation (string[])
  - **export_as**: `pptx | pdf`

  The node cleans empty values before sending. Response typically includes a task identifier you can pass to Check Presentation Status.

  ### Check Presentation Status

  Checks a task: `GET /api/v1/ppt/presentation/status/{taskId}`

  - **taskId**: The ID returned by Generate Presentation (Async)

  Returns the current status. When complete, the API usually includes result metadata (such as download links) defined by Presenton.

  ### Upload File

  Uploads a binary file: `POST /api/v1/ppt/files/upload`

  - **binaryPropertyName**: Name of the binary property on the incoming item (default: `data`)

  Returns a file ID you can set in the `files` field of the Generate Presentation (Async) operation.

  ## Typical workflow examples

  ### Generate a presentation from text

  1. Set operation to “Generate Presentation (Async)”.
  2. Fill in `content`, choose `export_as` (e.g. `pptx`), adjust options (tone, verbosity, slides, etc.).
  3. Use “Check Presentation Status” with the returned `taskId` until status is complete.

  ### Upload then generate

  1. Add a node with operation “Upload File” and set `binaryPropertyName` to the property holding your file.
  2. From its response, read the returned `file id`.
  3. Pass that id into the `files` field of “Generate Presentation (Async)”, then check status as above.

  ## Error handling

  - The node validates required parameters and throws meaningful errors (e.g., invalid slide count, missing task ID, or missing binary data).
  - If you enable “Continue On Fail”, errors are returned in the item’s JSON so your workflow can handle them.

  ## Development

  Clone, install, and build:

  ```bash
  npm i
  npm run dev   # TypeScript watch
  # or
  npm run build # build to dist
  ```

  Linting and formatting:

  ```bash
  npm run lint
  npm run lintfix
  npm run format
  ```

  To test locally, follow n8n’s guide to running custom nodes and point n8n to your built `dist` directory.

  ## License

  MIT

ai_documentation_summary:
  {"purpose":"A community node that enables asynchronous generation of professional presentations (PPTX or PDF) using the Presenton API, supporting file uploads, status checking, and customizable generation parameters.","capabilities":["Asynchronous presentation generation from text content","Generation from markdown slide lists","Customizable tone, verbosity, and theme","Web search integration during generation","AI-generated or stock image support","Custom slide count and language selection","Template selection","Table of contents and title slide inclusion","Binary file upload for use in generation","Task status polling until completion"],"authentication":"API Key required (Bearer token)","commonUseCases":["Automated creation of pitch decks from text input","Generating educational or sales presentations from content","Converting uploaded documents or drafts into slide decks","Workflow automation for content-to-presentation conversion"],"limitations":["Generation is asynchronous, requiring a separate status check node","File uploads require a separate operation to obtain file IDs","Minimum Node.js version 20 required for self-hosted installation","Some result metadata (like download links) depends on Presenton API definitions"],"relatedNodes":["Wait Until Node","Code Node","Set Node","HTTP Request Node","Binary File Node"]}


node_type: n8n-nodes-groner.groner
package_name: n8n-nodes-groner
display_name: Groner
description: Integrate with Groner CRM to manage deals, contacts, tasks, and more
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: ronaldoasevedo
author_github_url: https://github.com/gronerbr/
npm_package_name: n8n-nodes-groner
npm_version: 0.1.35
community_fetched_at: 2026-07-14T14:40:33.371Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "contact",
      "options": [
        {
          "name": "Contact",
          "value": "contact"
        },
        {
          "name": "Deal",
          "value": "deal"
        },
        {
          "name": "Note",
          "value": "note"
        },
        {
          "name": "Tag",
          "value": "tag"
        },
        {
          "name": "Task",
          "value": "task"
        },
        {
          "name": "WhatsApp",
          "value": "whatsapp"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a new deal",
          "description": "Create a new deal in Groner"
        },
        {
          "name": "Edit by Property",
          "value": "editByProperty",
          "action": "Edit deal by property",
          "description": "Edit deal by specific property"
        },
        {
          "name": "Get Quote",
          "value": "getQuote",
          "action": "Get deal quote",
          "description": "Get quote information for a deal"
        },
        {
          "name": "Move",
          "value": "move",
          "action": "Move a deal",
          "description": "Move a deal to a different stage"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search for deals",
          "description": "Search deals with filters"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "deal"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "editByProperty",
      "options": [
        {
          "name": "Edit by Property",
          "value": "editByProperty",
          "action": "Edit contact by property",
          "description": "Edit contact by specific property"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "contact"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a task",
          "description": "Create a new task"
        },
        {
          "name": "Search",
          "value": "search",
          "action": "Search tasks",
          "description": "Search for tasks"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "task"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "action": "Add a note",
          "description": "Add a note to a deal"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "note"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "add",
      "options": [
        {
          "name": "Add",
          "value": "add",
          "action": "Add tags",
          "description": "Add tags to a deal"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tag"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "send",
      "options": [
        {
          "name": "Send",
          "value": "send",
          "action": "Send whats app message",
          "description": "Send a WhatsApp message"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "whatsapp"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a new deal",
      "description": "Create a new deal in Groner",
      "resource": "deal"
    },
    {
      "name": "Edit by Property",
      "value": "editByProperty",
      "action": "Edit deal by property",
      "description": "Edit deal by specific property",
      "resource": "deal"
    },
    {
      "name": "Get Quote",
      "value": "getQuote",
      "action": "Get deal quote",
      "description": "Get quote information for a deal",
      "resource": "deal"
    },
    {
      "name": "Move",
      "value": "move",
      "action": "Move a deal",
      "description": "Move a deal to a different stage",
      "resource": "deal"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search for deals",
      "description": "Search deals with filters",
      "resource": "deal"
    },
    {
      "name": "Edit by Property",
      "value": "editByProperty",
      "action": "Edit contact by property",
      "description": "Edit contact by specific property",
      "resource": "contact"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a task",
      "description": "Create a new task",
      "resource": "task"
    },
    {
      "name": "Search",
      "value": "search",
      "action": "Search tasks",
      "description": "Search for tasks",
      "resource": "task"
    },
    {
      "name": "Add",
      "value": "add",
      "action": "Add a note",
      "description": "Add a note to a deal",
      "resource": "note"
    },
    {
      "name": "Add",
      "value": "add",
      "action": "Add tags",
      "description": "Add tags to a deal",
      "resource": "tag"
    },
    {
      "name": "Send",
      "value": "send",
      "action": "Send whats app message",
      "description": "Send a WhatsApp message",
      "resource": "whatsapp"
    }
  ]

npm_readme:
  ![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)

  # n8n-nodes-groner

  This repository contains custom nodes for integrating n8n with the Groner API (Solar CRM). The Groner node provides comprehensive functionality to manage leads, projects, tasks, and communications within the Groner CRM system.

  ---

  ## 🚀 Main Node

  - **Groner**: Primary node for integration with the Groner API, covering all major CRM operations including lead management, project tracking, task creation, and WhatsApp messaging.

  ## 📋 Available Resources and Operations

  ### 🔗 Available Resources

  | Resource | Description |
  |----------|-------------|
  | **Contact** | Contact/lead management |
  | **Deal** | Deal/project management |
  | **Note** | Note/occurrence addition |
  | **Tag** | Tag management |
  | **Task** | Task creation and search |
  | **WhatsApp** | WhatsApp message sending |

  ### 📊 Operations by Resource

  #### **Deal (Deal/Project)**
  | Operation | Description | HTTP Method |
  |-----------|-------------|-------------|
  | **Create** | Creates a new deal (lead/project) in Groner | POST |
  | **Search** | Searches deals with advanced filters and pagination | GET |
  | **Edit by Property** | Edits specific properties of a deal | PUT |
  | **Get Quote** | Gets quotes for a specific deal | GET |
  | **Move** | Moves a deal to a different stage | POST |

  #### **Contact (Contact)**
  | Operation | Description | HTTP Method |
  |-----------|-------------|-------------|
  | **Edit** | Edits contact information | PUT |
  | **Edit by Property** | Edits specific properties of a contact | PUT |

  #### **Task (Task)**
  | Operation | Description | HTTP Method |
  |-----------|-------------|-------------|
  | **Create** | Creates a new task | POST |
  | **Search** | Searches tasks with filters | GET |

  #### **Note (Note)**
  | Operation | Description | HTTP Method |
  |-----------|-------------|-------------|
  | **Add** | Adds a note/occurrence to a deal | POST |

  #### **Tag (Tag)**
  | Operation | Description | HTTP Method |
  |-----------|-------------|-------------|
  | **Add** | Adds tags to a deal | POST |

  #### **WhatsApp**
  | Operation | Description | HTTP Method |
  |-----------|-------------|-------------|
  | **Send** | Sends WhatsApp message | POST |

  ---

  ## 🔧 Prerequisites

  Before installing and using this package, ensure you have the following installed on your development machine:

  ### Required Software
  - **[Git](https://git-scm.com/downloads)** - Version control system
  - **[Node.js](https://nodejs.org/)** - Version 18.10 or higher
  - **[pnpm](https://pnpm.io/)** - Package manager (Version 9.1 or higher)

  ### n8n Installation
  Install n8n globally using pnpm:
  ```bash
  pnpm install n8n -g
  ```

  ### System Requirements
  - **Node.js**: >=18.10
  - **pnpm**: >=9.1
  - **n8n-workflow**: Compatible version

  ---

  ## 📦 Installation

  ### 1. Clone the Repository
  ```bash
  git clone https://github.com/gronerbr/n8n-nodes-groner.git
  cd n8n-nodes-groner
  ```

  ### 2. Install Dependencies
  ```bash
  pnpm install
  ```

  ### 3. Build the Project
  ```bash
  pnpm build
  ```
  This command will:
  - Compile TypeScript files
  - Copy custom icons to the distribution folder
  - Prepare the package for use

  ### 4. Development Mode (Optional)
  For development with automatic recompilation:
  ```bash
  pnpm dev
  ```

  ---

  ## 🔐 Credentials Configuration

  ### Setting Up Groner API Credentials

  1. **Access n8n Credentials**: In your n8n instance, navigate to Settings → Credentials
  2. **Add New Credential**: Click "Add Credential" and select **Groner API**
  3. **Configure Credentials**:
     - **Tenant**: Your Groner subdomain (e.g., `mycompany`)
     - **API Key**: Your Groner API authentication key

  ### Credential Details

  | Field | Type | Required | Description | Example |
  |-------|------|----------|-------------|---------|
  | **Tenant** | String | Yes | Your Groner subdomain identifier | `mycompany` |
  | **API Key** | Password | Yes | Your Groner API authentication token | `groner_api_key_123...` |

  ### API Endpoint Structure
  The node automatically constructs API endpoints using your tenant:
  ```
  https://{tenant}.api.groner.app/api/{endpoint}
  ```

  ---

  ## 🎯 How to Use the Groner Node

  ### Basic Workflow Setup

  1. **Add the Node**: Drag and drop the **Groner** node into your n8n workflow
  2. **Select Resource**: Choose the desired resource (Deal, Contact, Task, etc.)
  3. **Select Operation**: Choose the desired operation from the "Operation" dropdown
  4. **Configure Parameters**: Fill in required and optional fields based on the selected operation
  5. **Execute**: Run the workflow to process the operation

  ### Output Format
  - **Success**: Returns API response data as JSON
  - **Search Operations**: Each returned item becomes an individual n8n item
  - **Error Handling**: Errors are displayed in the node execution panel

  ---

  ## 📖 Detailed Operation Guide

  ### 1. Create Deal

  Creates a new lead or project in Groner with comprehensive tracking capabilities.

  #### Required Fields
  - **Name** (`nome`): Full name of the contact
  - **Email** (`email`): Contact email address
  - **Phone** (`telefone`): Contact phone number
  - **Origin Name or ID** (`codOrigem`): Lead origin (loadOptions)

  #### Optional Fields
  - **Account Value** (`valorConta`): Estimated project value
  - **City** (`cidade`): Contact's city
  - **Document** (`documento`): CPF or CNPJ number
  - **Person Type** (`tipoPessoa`): PF (Individual) or PJ (Company)
  - **State** (`uf`): Brazilian state abbreviation
  - **Responsible Name or ID** (`responsavelId`): Responsible salesperson (loadOptions)
  - **Responsible Email** (`emailResponsavel`): Salesperson email
  - **Note** (`nota`): Initial notes about the lead
  - **Campaign** (`campanha`): Marketing campaign identifier
  - **Advertisement** (`anuncio`): Ad campaign reference
  - **Ad Set** (`conjuntoAnuncios`): Ad group identifier
  - **Lead Tracking Code** (`codigoLeadTracking`): Tracking code for analytics
  - **Trade Name** (`nomeFantasia`): Company trade name (for PJ)
  - **Segment** (`segmento`): Business segment classification
  - **Deal Type Name or ID** (`tipoProjetoId`): Type of solar project (loadOptions)
  - **URL** (`url`): Custom endpoint URL (optional)

  #### Example Usage
  ```json
  {
    "nome": "John Doe",
    "email": "john.doe@example.com",
    "telefone": "+5511999999999",
    "codOrigem": "1",
    "cidade": "São Paulo",
    "documento": "123.456.789-00",
    "tipoPessoa": "F",
    "valorConta": 25000,
    "nota": "Interested in residential solar installation"
  }
  ```

  ### 2. Search Deals

  Searches for existing deals with advanced filtering and pagination.

  #### Filter Parameters
  - **Page Size** (`pageSize`): Items per page (default: 20)
  - **Search** (`query`): Text search across deal data
  - **Criterio** (`criterio`): Search criteria
  - **Filters**:
    - **Deal Type ID** (`dealTypeId`): Filter by project type (loadOptions)
    - **Stage ID** (`stageId`): Filter by sales pipeline stage (loadOptions)
    - **Status ID** (`statusId`): Filter by status (loadOptions)
    - **Responsible Seller ID** (`responsibleSellerId`): Filter by responsible seller (loadOptions)
    - **Responsible Technician ID** (`responsibleTechnicianId`): Filter by responsible technician (loadOptions)
    - **Pre Seller ID** (`preSellerId`): Filter by pre-seller (loadOptions)
  - **Additional Fields**:
    - **Lead ID** (`leadId`): Filter by specific lead
    - **Stores IDs** (`storesIds`): Filter by store locations (multiOptions)
    - **Tags IDs** (`tagsIds`): Filter by specific tags (multiOptions)
    - **Origins IDs** (`originsIds`): Filter by origins (multiOptions)
    - **Status History IDs** (`statusHistoryIds`, `nStatusHistoryIds`): Filter by status history (multiOptions)
    - **Order By** (`orderBy`): Sort criteria
    - **Initial Qualification** (`initialQualification`): Initial qualification (0-10)
    - **Final Qualification** (`finalQualification`): Final qualification (0-10)
    - **Indicator** (`indicator`): Performance indicator
    - **Contact Owner ID** (`contactOwnerId`): Filter by contact owner
    - **Campaign** (`campaign`): Filter by campaign
    - **Advertisement** (`advertisement`): Filter by advertisement
    - **Ad Set** (`adSet`): Filter by ad set
  - **Location**:
    - **City** (`city`): Filter by city
    - **State** (`state`): Filter by state
  - **Financial**:
    - **Initial Power** (`initialPower`): Initial power in kW
    - **Final Power** (`finalPower`): Final power in kW
    - **Initial Value** (`initialValue`): Initial project value
    - **Final Value** (`finalValue`): Final project value
    - **Initial Consumption** (`initialConsumption`): Initial consumption in kWh
    - **Final Consumption** (`finalConsumption`): Final consumption in kWh
  - **Dates**:
    - **Start Date** (`startDate`): Start date
    - **End Date** (`endDate`): End date
    - **Initial Closing Forecast Date** (`initialClosingForecastDate`): Initial closing forecast date
    - **Final Closing Forecast Date** (`finalClosingForecastDate`): Final closing forecast date
    - **Initial Proposal Date** (`initialProposalDate`): Initial proposal date
    - **Final Proposal Date** (`finalProposalDate`): Final proposal date
    - **Initial Sale Date** (`initialSaleDate`): Initial sale date
    - **Final Sale Date** (`finalSaleDate`): Final sale date
    - **Initial Loss Date** (`initialLossDate`): Initial loss date
    - **Final Loss Date** (`finalLossDate`): Final loss date

  #### Example Usage
  ```json
  {
    "pageSize": 50,
    "query": "solar installation",
    "filters": {
      "stageId": "1",
      "statusId": "2"
    },
    "financial": {
      "initialValue": 10000,
      "finalValue": 50000
    }
  }
  ```

  ### 3. Add Tags

  Adds organizational labels to existing deals.

  #### Required Fields
  - **Deal ID** (`dealId`): Deal ID
  - **Tag IDs** (`tagIds`): Array of tag IDs

  #### Example Usage
  ```json
  {
    "dealId": "12345",
    "tagIds": ["1", "2", "3"]
  }
  ```

  ### 4. Add Note

  Adds notes or occurrences to track deal interactions.

  #### Required Fields
  - **Deal ID** (`dealId`): Deal ID
  - **Occurrence** (`ocorrencia`): Note content

  #### Optional Fields
  - **Mentions** (`marcacoes`): Optional user mentions

  #### Example Usage
  ```json
  {
    "dealId": "12345",
    "ocorrencia": "Customer requested quote for 10kW system",
    "marcacoes": "@sales_team"
  }
  ```

  ### 5. Create Task

  Creates tasks linked to deals with assignment capabilities.

  #### Required Fields
  - **Title** (`titulo`): Task title
  - **Type ID** (`tipoId`): Task type identifier (loadOptions)
  - **Status ID** (`statusId`): Task status (loadOptions)
  - **Project ID** (`projetoId`): Associated deal ID
  - **Users IDs** (`usuariosIds`): Assigned user IDs (multiOptions)

  #### Optional Fields
  - **Description** (`descricao`): Task description
  - **Start Date** (`dataInicial`): Task start date (YYYY-MM-DD)
  - **Delivery Date** (`dataEntrega`): Task delivery date (YYYY-MM-DD)

  #### Example Usage
  ```json
  {
    "titulo": "Follow up call",
    "descricao": "Call customer to discuss proposal",
    "tipoId": "1",
    "statusId": "1",
    "projetoId": 12345,
    "usuariosIds": ["user1", "user2"],
    "dataInicial": "2024-01-15",
    "dataEntrega": "2024-01-20"
  }
  ```

  ### 6. Search Tasks

  Searches for tasks with comprehensive filtering options.

  #### Filter Parameters
  - **Page Size** (`pageSize`): Items per page (default: 20)
  - **Search** (`query`): Text search
  - **Additional Fields**:
    - **Lead ID** (`leadId`): Filter by associated lead
    - **Project ID** (`projetoId`): Filter by associated project
    - **Type ID** (`tipoId`): Filter by task type (loadOptions)
    - **Status ID** (`statusId`): Filter by task status (loadOptions)
    - **User ID** (`usuarioId`): Filter by assigned user (loadOptions)
    - **Stores IDs** (`lojasIds`): Filter by store locations (multiOptions)
    - **Order By** (`ordenarPor`): Sort criteria
    - **Start Date** (`dataInicial`): Filter by start date (YYYY-MM-DD)
    - **End Date** (`dataFinal`): Filter by end date (YYYY-MM-DD)
    - **Page Number** (`pageNumber`): Page number

  #### Example Usage
  ```json
  {
    "projetoId": 12345,
    "statusId": "1",
    "pageSize": 20,
    "ordenarPor": "dataCriacao"
  }
  ```

  ### 7. Edit Contact by Property

  Updates specific properties of existing contacts.

  #### Required Fields
  - **Contact ID** (`contactId`): Contact/Lead ID (number)
  - **Property** (`propriedade`): Property name to update (loadOptions)
  - **Value** (`valor`): New property value

  #### Example Usage
  ```json
  {
    "contactId": 12345,
    "propriedade": "email",
    "valor": "new.email@example.com"
  }
  ```

  ### 8. Edit Deal by Property

  Updates specific properties of existing deals.

  #### Required Fields
  - **Deal ID** (`dealId`): Deal ID (number)
  - **Property** (`propriedade`): Property name to update (loadOptions)
  - **Value** (`valor`): New property value

  #### Example Usage
  ```json
  {
    "dealId": 12345,
    "propriedade": "valorConta",
    "valor": "30000"
  }
  ```

  ### 9. Send WhatsApp Message

  Sends WhatsApp messages through Groner's integrated messaging system.

  #### Required Fields
  - **Message** (`mensagem`): Message content

  #### Optional Fields
  - **Lead ID** (`leadId`): Target lead ID (number)
  - **Phone** (`celular`): Direct phone number
  - **Image URL** (`urlImagem`): Image attachment URL
  - **Audio URL** (`urlAudio`): Audio attachment URL
  - **Video URL** (`urlVideo`): Video attachment URL
  - **Document URL** (`urlDocumento`): Document attachment URL
  - **Send to Pre-Seller** (`preVendedor`): Whether to send to Pre-Seller (boolean)
  - **Send to Seller** (`vendedor`): Whether to send to Seller (boolean)
  - **Send to Technician** (`tecnico`): Whether to send to Technician (boolean)
  - **Send to Lead** (`lead`): Whether to send to Lead (boolean)

  #### Example Usage
  ```json
  {
    "leadId": 12345,
    "mensagem": "Hello! Here's your solar installation quote.",
    "urlImagem": "https://example.com/quote.pdf",
    "vendedor": true
  }
  ```

  ### 10. Move Deal

  Changes the status/stage of a deal in the sales pipeline.

  #### Required Fields
  - **Deal ID** (`dealId`): Deal ID
  - **Status ID** (`statusId`): New status identifier (loadOptions)

  #### Optional Fields
  - **Validate Status Available** (`validaStatusDisponivel`): Whether to validate if the status is available (boolean)

  #### Example Usage
  ```json
  {
    "dealId": "12345",
    "statusId": "2",
    "validaStatusDisponivel": true
  }
  ```

  ### 11. Get Deal Quote

  Retrieves quotes associated with a specific deal.

  #### Required Fields
  - **Project ID** (`projetoId`): Deal/Project ID

  #### Example Usage
  ```json
  {
    "projetoId": "12345"
  }
  ```

  ---

  ## 🔄 Workflow Examples

  ### Example 1: Process Deals with Content.List

  This example shows how to use Content.List to process multiple deals:

  ```
  [Groner: Search Deals] → [Content.List] → [Groner: Edit Deal] → [Result]
  ```

  **Content.List Configuration:**
  ```
  Input Data: {{ $json.data }}
  Output Field Name: deal
  ```

  **Edit Deal Configuration:**
  ```
  Resource: Deal
  Operation: Edit by Property
  Deal ID: {{ $json.deal.id }}
  Property: valorConta
  Value: {{ $json.deal.valorConta * 1.1 }}
  ```

  ### Example 2: Complete Follow-up Workflow

  ```
  [Groner: Search Deals] → [IF] → [Groner: Add Note] → [Groner: Send WhatsApp]
  ```

  **IF Condition:**
  ```
  {{ $json.status === "Em Negociação" }}
  ```

  ---

  ## 🔧 Development Scripts

  | Script | Description |
  |--------|-------------|
  | `pnpm build` | Compiles TypeScript and copies icons |
  | `pnpm dev` | Runs TypeScript compiler in watch mode |
  | `pnpm lint` | Checks for linting issues |
  | `pnpm lintfix` | Automatically fixes linting issues |
  | `pnpm format` | Formats code using Prettier |
  | `pnpm prepublishOnly` | Builds and lints before publishing |

  ---

  ## 📁 Project Structure

  ```
  n8n-nodes-groner/
  ├── credentials/
  │   └── GronerApi.credentials.ts    # API authentication
  ├── nodes/
  │   └── Groner/
  │       ├── loadOptions/            # Dynamic options
  │       │   ├── getStatuses.ts      # Status options
  │       │   ├── getOrigins.ts       # Origin options
  │       │   ├── getResponsibles.ts  # Responsible user options
  │       │   ├── getDealTypes.ts     # Deal type options
  │       │   ├── getTags.ts          # Tag options
  │       │   ├── getStores.ts        # Store options
  │       │   ├── getEtapas.ts        # Stage options
  │       │   ├── getTaskTypes.ts     # Task type options
  │       │   ├── getTaskStatuses.ts  # Task status options
  │       │   ├── getContactProperties.ts # Contact property options
  │       │   └── getDealProperties.ts    # Deal property options
  │       ├── Groner.node.ts          # Main node file
  │       └── logogroner.svg          # Custom icon
  ├── package.json                    # Project configuration
  ├── tsconfig.json                   # TypeScript configuration
  └── gulpfile.js                     # Build configuration
  ```

  ---

  ## ⚠️ Important Notes

  ### API Response Handling
  - **Search Operations**: Each item returned by the API becomes an individual n8n item for easy processing
  - **Error Handling**: API errors are displayed in the node execution panel with detailed error messages
  - **Authentication**: Uses Bearer token authentication with your API key

  ### Load Options
  The node provides dynamic loading of options for various fields:
  - **Statuses**: Available deal statuses
  - **Origins**: Lead origin sources
  - **Responsibles**: Available users/responsible persons
  - **Deal Types**: Types of projects/deals
  - **Tags**: Available tags/labels
  - **Stores**: Store locations
  - **Etapas**: Sales pipeline stages
  - **Task Types**: Types of tasks
  - **Task Statuses**: Task status options
  - **Contact Properties**: Available contact properties
  - **Deal Properties**: Available deal properties

  ### Custom Icon
  - The node displays the Groner logo if the `logogroner.svg` file is present in the node directory
  - The icon is automatically copied during the build process

  ### Data Validation
  - Empty fields are automatically removed from API requests
  - Required fields are validated before sending requests
  - Date formats should follow YYYY-MM-DD standard
  - Arrays are automatically converted to comma-separated strings for API compatibility

  ### Rate Limiting
  - Be aware of Groner API rate limits
  - Implement appropriate delays between requests in high-volume workflows

  ---

  ## 🤝 Contributing

  We welcome contributions! Here's how you can help:

  ### Reporting Issues
  - Use the GitHub issue tracker
  - Provide detailed error messages and steps to reproduce
  - Include your n8n version and node configuration

  ### Submitting Pull Requests
  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Run `pnpm lint` and `pnpm build`
  5. Submit a pull request with detailed description

  ### Development Guidelines
  - Follow TypeScript best practices
  - Maintain consistent code formatting
  - Add appropriate error handling
  - Include field validation where necessary

  ---

  ## 📄 License

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

  ---

  ## 📞 Support

  For support and questions:
  - **Email**: contato@gronercrm.com.br
  - **GitHub Issues**: [Create an issue](https://github.com/gronerbr/n8n-nodes-groner/issues)
  - **Documentation**: This README and inline code comments

  ---

  ## 🌐 Language Versions

  - **[English Version](README.md)** (Current)
  - **[Portuguese Version](README_PT.md)**

  ---

  ## 🔄 Version History

  - **v0.1.18**: Current version with comprehensive CRM operations and updated field structure
  - **v0.1.17**: Added WhatsApp messaging capabilities
  - **v0.1.16**: Enhanced search and filtering options
  - **v0.1.15**: Improved error handling and validation
  - **v0.1.14**: Initial release with basic operations

  For detailed changelog, see the [GitHub releases](https://github.com/gronerbr/n8n-nodes-groner/releases).

ai_documentation_summary:
  {"purpose":"Integrates n8n with the Groner CRM API to manage leads, deals, contacts, tasks, notes, tags, and send WhatsApp messages.","capabilities":["Create deals/leads","Search deals with advanced filters and pagination","Edit deal properties","Get quotes for deals","Move deals to different stages","Manage contacts (edit contact info)","Create and search tasks","Add notes/occurrences to deals","Manage tags on deals","Send WhatsApp messages"],"authentication":"API Key required (Tenant subdomain and API Key)","commonUseCases":["Automating lead capture and deal creation from web forms","Syncing contact information between external systems and Groner CRM","Automating task assignment and follow-ups","Sending automated WhatsApp notifications to clients","Tracking and managing sales pipelines"],"limitations":["Requires manual installation of custom n8n package (git clone, pnpm build)","Requires specific Node.js version (>=18.10) and pnpm version (>=9.1)","README truncated, so some optional fields and detailed operation parameters may be incomplete in documentation"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.whatsapp","n8n-nodes-base.credential"]}


node_type: n8n-nodes-docsautomator.docsAutomator
package_name: n8n-nodes-docsautomator
display_name: DocsAutomator
description: Create and manage documents with DocsAutomator
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: rupertxyz
author_github_url: https://github.com/DocsAutomator/
npm_package_name: n8n-nodes-docsautomator
npm_version: 1.4.0
community_fetched_at: 2026-07-14T14:40:33.373Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "document",
      "options": [
        {
          "name": "Automation",
          "value": "automation"
        },
        {
          "name": "Document",
          "value": "document"
        },
        {
          "name": "Placeholder",
          "value": "placeholder"
        },
        {
          "name": "Template",
          "value": "template"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getAll",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create an automation",
          "description": "Create a new automation"
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete an automation",
          "description": "Delete an automation"
        },
        {
          "name": "Duplicate",
          "value": "duplicate",
          "action": "Duplicate an automation",
          "description": "Duplicate an existing automation"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get an automation",
          "description": "Get a single automation by ID"
        },
        {
          "name": "Get Many",
          "value": "getAll",
          "action": "Get many automations",
          "description": "Get many automations"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update an automation",
          "description": "Update an existing automation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "automation"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a document",
          "description": "Create a new document from an automation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "document"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List placeholders",
          "description": "List placeholders for an automation"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "placeholder"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "duplicateGoogleDoc",
      "options": [
        {
          "name": "Duplicate Google Doc",
          "value": "duplicateGoogleDoc",
          "action": "Duplicate a google doc template",
          "description": "Duplicate a Google Doc template"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "template"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create an automation",
      "description": "Create a new automation",
      "resource": "automation"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete an automation",
      "description": "Delete an automation",
      "resource": "automation"
    },
    {
      "name": "Duplicate",
      "value": "duplicate",
      "action": "Duplicate an automation",
      "description": "Duplicate an existing automation",
      "resource": "automation"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get an automation",
      "description": "Get a single automation by ID",
      "resource": "automation"
    },
    {
      "name": "Get Many",
      "value": "getAll",
      "action": "Get many automations",
      "description": "Get many automations",
      "resource": "automation"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update an automation",
      "description": "Update an existing automation",
      "resource": "automation"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a document",
      "description": "Create a new document from an automation",
      "resource": "document"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List placeholders",
      "description": "List placeholders for an automation",
      "resource": "placeholder"
    },
    {
      "name": "Duplicate Google Doc",
      "value": "duplicateGoogleDoc",
      "action": "Duplicate a google doc template",
      "description": "Duplicate a Google Doc template",
      "resource": "template"
    }
  ]

npm_readme:
  # n8n-nodes-docsautomator

  This is an n8n community node for DocsAutomator, a powerful document automation tool. It allows you to create documents, manage automations, and access various DocsAutomator features directly from your n8n workflows.

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

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

  ## Installation

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

  ## Operations

  The DocsAutomator node supports the following resources and operations:

  ### Automation

  Manage your DocsAutomator automations:

  | Operation | Description |
  |-----------|-------------|
  | **Get Many** | List all automations in your workspace |
  | **Get** | Get a single automation by ID |
  | **Create** | Create a new automation |
  | **Update** | Update an existing automation |
  | **Delete** | Delete an automation |
  | **Duplicate** | Create a copy of an automation |

  ### Document

  Create documents using your automations:

  | Operation | Description |
  |-----------|-------------|
  | **Create** | Generate a document from an automation with placeholder data |

  ### Placeholder

  Discover placeholders in your templates:

  | Operation | Description |
  |-----------|-------------|
  | **List** | List placeholders for an automation (structured format with line item grouping) |

  ### Template

  Manage Google Doc templates:

  | Operation | Description |
  |-----------|-------------|
  | **Duplicate Google Doc** | Create a copy of a Google Doc template |

  ## Credentials

  This node requires DocsAutomator API credentials:

  1. Log in to your DocsAutomator account.
  2. Navigate to your workspace settings > API Key.
  3. Copy the API key.
  4. In n8n, create new "DocsAutomator API" credentials and paste your API key into the provided field.

  ## Usage

  ### Creating Documents

  1. **Add the DocsAutomator node** to your n8n workflow.
  2. **Set up Credentials**: Select your configured DocsAutomator API credentials.
  3. **Select Resource**: Choose "Document" and operation "Create".
  4. **Select an Automation**: Choose from the dropdown (only API/n8n automations are shown).
  5. **Map Placeholder Values**: Fill in values for each placeholder in your template.
  6. **Configure Line Items (Optional)**: Add line item data as JSON arrays.
  7. **Set Processing Options**:
     - **Preview Mode**: Generate a preview instead of the final document.
     - **Async Processing**: Return immediately with a jobId for tracking.

  ### Managing Automations

  Use the Automation resource to programmatically manage your automations:

  ```
  Automation > Get Many    → List all automations
  Automation > Create      → Create new automation with title and data source
  Automation > Update      → Modify settings like locale, PDF expiration, template link, etc.
  Automation > Duplicate   → Clone an existing automation
  Automation > Delete      → Remove an automation
  ```

  ### Discovering Placeholders

  Before creating documents, you can discover what placeholders are available:

  ```
  Placeholder > List → Returns structured placeholder data:
  {
    "placeholders": {
      "main": ["customer_name", "invoice_number"],
      "line_items_1": ["item_name", "quantity", "price"]
    }
  }
  ```

  ### Example: Invoice Generation with Line Items

  1. **Select**: Document > Create
  2. **Automation**: Choose "Invoice Generation"
  3. **Placeholder Values**:
     - `customer_name`: `{{ $json.customer.fullName }}`
     - `invoice_number`: `{{ $json.invoiceDetails.id }}`
     - `invoice_date`: `{{ $now.toFormat('yyyy-MM-dd') }}`
  4. **Line Items**:
     - Type: "Line Items 1"
     - JSON:
       ```json
       [
         {
           "item_description": "Widget A",
           "item_quantity": 2,
           "item_unit_price": 10.00
         },
         {
           "item_description": "Widget B",
           "item_quantity": 1,
           "item_unit_price": 25.50
         }
       ]
       ```

  ### Tips for Success

  - **JSON Structure for Line Items**: Ensure valid JSON array of objects matching your template placeholders.
  - **Use n8n Expressions**: Dynamically map data from previous nodes.
  - **Error Handling**: Use "Continue On Fail" or error workflows.

  ## Resources

  - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [DocsAutomator API documentation](https://docs.docsautomator.co/)
  - [DocsAutomator website](https://docsautomator.co/)

ai_documentation_summary:
  {"purpose":"The DocsAutomator node enables users to create, manage, and automate document generation within n8n workflows by integrating with the DocsAutomator API.","capabilities":["List all automations in the workspace","Retrieve a single automation by ID","Create new automations","Update existing automation settings","Delete automations","Duplicate automations","Generate documents from automations with placeholder data","List available placeholders for templates","Duplicate Google Doc templates","Process documents in preview mode"],"authentication":"API key required","commonUseCases":["Automated invoice generation with dynamic line items","Bulk document creation from templates","Workflow integration with external data sources for document personalization","Template management and duplication"],"limitations":["Only API/n8n automations are shown in the dropdown selection","Line items must be provided as valid JSON arrays","Some operations may require specific DocsAutomator workspace settings"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.code"]}


node_type: n8n-nodes-get-transcribe.getTranscribe
package_name: n8n-nodes-get-transcribe
display_name: GetTranscribe
description: Interact with GetTranscribe API to transcribe videos from social media platforms
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: danielevz
author_github_url: https://github.com/get-transcribe/
npm_package_name: n8n-nodes-get-transcribe
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:33.374Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "transcription",
      "options": [
        {
          "name": "Transcription",
          "value": "transcription"
        },
        {
          "name": "Folder",
          "value": "folder"
        },
        {
          "name": "User",
          "value": "user"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a transcription",
          "description": "Create a new transcription from a video URL"
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get a transcription",
          "description": "Get a transcription by ID"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List transcriptions",
          "description": "List all transcriptions"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transcription"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create",
          "value": "create",
          "action": "Create a folder",
          "description": "Create a new folder"
        },
        {
          "name": "List",
          "value": "list",
          "action": "List folders",
          "description": "List all folders"
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update a folder",
          "description": "Update a folder"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "folder"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get",
          "value": "get",
          "action": "Get user info",
          "description": "Get user information"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "user"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create",
      "value": "create",
      "action": "Create a transcription",
      "description": "Create a new transcription from a video URL",
      "resource": "transcription"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get a transcription",
      "description": "Get a transcription by ID",
      "resource": "transcription"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List transcriptions",
      "description": "List all transcriptions",
      "resource": "transcription"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create a folder",
      "description": "Create a new folder",
      "resource": "folder"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List folders",
      "description": "List all folders",
      "resource": "folder"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update a folder",
      "description": "Update a folder",
      "resource": "folder"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get user info",
      "description": "Get user information",
      "resource": "user"
    }
  ]

npm_readme:
  # n8n-nodes-get-transcribe

  This is an n8n node for integrating with the GetTranscribe API, which allows you to transcribe videos from social media platforms like Instagram, TikTok, YouTube, and more.

  ## Features

  ### Transcriptions
  - **Create**: Create a new transcription from a video URL
  - **Get**: Get a specific transcription by ID
  - **List**: List all transcriptions with optional filters

  ### Folders
  - **Create**: Create new folders to organize transcriptions
  - **List**: List all folders
  - **Update**: Update properties of existing folders

  ### User
  - **Get**: Get user information and account statistics

  ## Installation

  ### Installation on n8n Cloud

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

  ### Installation on self-hosted n8n

  1. Go to your n8n installation root directory
  2. Run: `npm install n8n-nodes-get-transcribe`
  3. Restart n8n

  ## Configuration

  ### Credentials

  To use this node, you need to configure your GetTranscribe credentials:

  1. In n8n, go to **Credentials** and create new credentials of type **GetTranscribe API**
  2. Enter your **API Key** from GetTranscribe
     - You can find your API Key in your GetTranscribe account settings
     - The API Key should have the format: `gt_...`

  ### Credential test URL

  The node will automatically verify your credentials by making a request to `/users/me` on the GetTranscribe API.

  ## Usage

  ### Create a Transcription

  1. Add the **GetTranscribe** node to your workflow
  2. Select **Transcription** as resource
  3. Select **Create** as operation
  4. Enter the URL of the video you want to transcribe
  5. Optionally, select a folder ID to organize the transcription

  Supported URL examples:
  - Instagram: `https://www.instagram.com/p/ABC123/`
  - TikTok: `https://www.tiktok.com/@user/video/123456789`
  - YouTube: `https://www.youtube.com/watch?v=ABC123`

  ### List Transcriptions

  1. Select **Transcription** as resource
  2. Select **List** as operation
  3. Configure optional filters:
     - **Limit**: Maximum number of results
     - **Skip**: Number of results to skip (for pagination)
     - **Folder ID**: Filter by specific folder
     - **Platform**: Filter by platform (Instagram, TikTok, YouTube)

  ### Folder Management

  #### Create Folder
  1. Select **Folder** as resource
  2. Select **Create** as operation
  3. Enter the folder name
  4. Optionally, specify a parent folder ID to create subfolders

  #### List Folders
  1. Select **Folder** as resource
  2. Select **List** as operation
  3. Configure the result limit

  ### User Information

  1. Select **User** as resource
  2. Select **Get** as operation
  3. Enter your user ID (you can use your own ID)

  ## API Response

  ### Transcription

  ```json
  {
    "id": 4032,
    "user_id": 2,
    "transcription": "Transcribed text from the video...",
    "platform": "instagram",
    "url": "https://www.instagram.com/p/DM1P8q1MzaG/",
    "thumbnail_url": "https://...",
    "download_video_url": "https://...",
    "download_audio_url": "https://...",
    "duration": "0:30",
    "duration_seconds": 30.159864,
    "word_count": 91,
    "char_count": 515,
    "folder_id": null,
    "transcription_analysis": null,
    "original_transcription": "Original text...",
    "transcription_segments": [...],
    "transcription_words": [...],
    "created_at": "2025-08-07T17:43:15.822Z",
    "updated_at": "2025-08-07T17:43:15.822Z"
  }
  ```

  ## Workflow Examples

  ### Automatic Transcription from Webhook

  1. **Webhook Trigger** - Receives video URLs
  2. **GetTranscribe Node** - Transcribes the video
  3. **Set Node** - Processes the transcribed text
  4. **HTTP Request** - Sends the transcription to another service

  ### Batch Processing

  1. **Schedule Trigger** - Runs periodically
  2. **GetTranscribe Node** - Lists pending transcriptions
  3. **If Node** - Checks if there are new transcriptions
  4. **Loop** - Processes each transcription

  ## Support

  - **Documentation**: [https://www.gettranscribe.ai/n8n-transcription-instagram-tiktok-automation](https://www.gettranscribe.ai/n8n-transcription-instagram-tiktok-automation)
  - **Support**: [support@gettranscribe.ai](mailto:daniel@gettranscribe.ai)
  - **GitHub**: [https://github.com/get-transcribe/n8n-nodes-get-transcribe](https://github.com/get-transcribe/n8n-nodes-get-transcribe)

  ## Contributing

  Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Commit your changes
  4. Push to the branch
  5. Open a Pull Request

  ## Contributors

  Thanks to all the people who have contributed to this project:

  - [danielevz](https://github.com/emeagenciadigital) - Contributor

  ## License

  MIT

  ## Changelog

  ### v0.1.1
  - Updated GitHub repository URLs in package.json

  ### v0.1.0
  - Initial release
  - Support for transcriptions (create, get, list)
  - Support for folders (create, list, update)
  - Support for user information
  - API Key authentication

ai_documentation_summary:
  {"purpose":"This n8n node enables integration with the GetTranscribe API to transcribe videos from social media platforms including Instagram, TikTok, and YouTube.","capabilities":["Create transcriptions from video URLs","Retrieve specific transcriptions by ID","List transcriptions with filtering options","Create and manage folders for organizing transcriptions","Retrieve user information and account statistics"],"authentication":"API Key required (format: gt_...)","commonUseCases":["Automated video transcription for social media content","Batch processing of video transcriptions","Organizing transcriptions into folder structures","Integrating transcribed text into other services via webhooks"],"limitations":["Requires valid GetTranscribe API key with proper permissions","Credential verification requires successful request to /users/me endpoint"],"relatedNodes":["Webhook","Schedule Trigger","If","Loop","Set"]}


node_type: @meistrari/n8n-nodes-tela.tela
package_name: @meistrari/n8n-nodes-tela
display_name: Tela
description: Integrates with Tela to run AI-driven workflows and automation tasks
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: 0xthierry
author_github_url: https://github.com/meistrari/n8n-nodes-tela.git
npm_package_name: @meistrari/n8n-nodes-tela
npm_version: 1.5.0
community_fetched_at: 2026-07-14T14:40:33.375Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "canvas",
      "options": [
        {
          "name": "Canvas",
          "value": "canvas"
        }
      ],
      "description": "The resource to operate on",
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "execute",
      "options": [
        {
          "name": "Execute",
          "value": "execute",
          "action": "Execute a canvas",
          "description": "Execute a canvas with variables"
        },
        {
          "name": "Execute Workstation",
          "value": "executeWorkstation",
          "action": "Execute workstation task",
          "description": "Create a task in the workstation dashboard"
        },
        {
          "name": "Get Completion",
          "value": "getCompletion",
          "action": "Get completion status",
          "description": "Get the result of an async completion"
        }
      ],
      "description": "The operation to perform",
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "canvas"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Execute",
      "value": "execute",
      "action": "Execute a canvas",
      "description": "Execute a canvas with variables",
      "resource": "canvas"
    },
    {
      "name": "Execute Workstation",
      "value": "executeWorkstation",
      "action": "Execute workstation task",
      "description": "Create a task in the workstation dashboard",
      "resource": "canvas"
    },
    {
      "name": "Get Completion",
      "value": "getCompletion",
      "action": "Get completion status",
      "description": "Get the result of an async completion",
      "resource": "canvas"
    }
  ]

npm_readme:
  # n8n-nodes-tela

  This is an n8n community node that provides seamless integration with the Tela API. It allows you to interact with Tela projects and canvases in your n8n workflows, enabling dynamic content generation and workflow automation.

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

  ## TL;DR

  Don't want to read? Import the sample workflow **"Tela Canvas Execution with Dynamic Variables"** to test this node with real Tela API integration.

  ## What This Node Does

  The Tela node enables you to:

  - **Execute Tela Canvases**: Run AI-powered canvases with dynamic variables and get results
  - **Dynamic Variable Handling**: Automatically detect and configure canvas variables
  - **File Upload Support**: Handle file uploads for canvas processing
  - **Project Management**: List and manage Tela projects and their canvases
  - **Workflow Integration**: Seamlessly integrate Tela AI workflows into your n8n automation

  ## Installation

  ### Community Nodes (Recommended)

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

  ### Manual Installation

  For self-hosted n8n instances:

  ```bash
  npm install @meistrari/n8n-nodes-tela
  ```

  For Docker installations, follow the [custom nodes guide](https://docs.n8n.io/integrations/creating-nodes/deploy/install-private-nodes/).

  ## Configuration

  ### 1. Create Tela API Credentials

  1. Create a new credential of type **"Tela API"**
  2. Enter your Tela API key (find this in your [Tela dashboard](https://app.tela.com))
  3. Test the connection to verify it works

  ### 2. Configure the Node

  1. **Project**: Select the project containing your canvas
  2. **Canvas**: Choose the specific canvas to execute
  3. **Variables**: Configure dynamic fields based on your canvas configuration

  ## Operations

  ### Execute Canvas

  The main operation that runs your Tela canvas with the specified variables and returns the AI-generated results.

  **Parameters:**

  | Field              | Type    | Required | Description                                                                 |
  | ------------------ | ------- | -------- | --------------------------------------------------------------------------- |
  | **Project**        | Options | Yes      | Select the project containing your canvas                                   |
  | **Canvas**         | Options | Yes      | Select the canvas to execute                                                |
  | **Variables**      | Collection | No    | Dynamic fields based on your canvas configuration                           |
  | **Async Execution** | Boolean | No      | When enabled, returns immediately with completion ID instead of waiting     |

  **Use Cases:**

  - Generate dynamic content for emails
  - Create personalized marketing materials
  - Process documents with AI assistance
  - Generate reports based on input data

  ### Execute Workstation

  Create a task in the Tela Workstation dashboard. Tasks are visible in the Tela web interface and can be reviewed, approved, or processed manually.

  **Parameters:**

  | Field         | Type       | Required | Description                                       |
  | ------------- | ---------- | -------- | ------------------------------------------------- |
  | **Project**   | Options    | Yes      | Select the project containing your canvas         |
  | **Canvas**    | Options    | Yes      | Select the canvas to execute                      |
  | **Label**     | String     | No       | Optional label for the workstation task           |
  | **Variables** | Collection | No       | Dynamic fields based on your canvas configuration |

  **Response:**

  - Returns the full API response object

  **Use Cases:**

  - Create tasks for human review in Tela dashboard
  - Queue AI-generated content for approval workflows
  - Build hybrid human-AI pipelines with manual checkpoints

  ### Get Completion

  Retrieve the result of an async canvas execution. Use this operation to poll for completion status when using async execution.

  **Parameters:**

  | Field            | Type   | Required | Description                              |
  | ---------------- | ------ | -------- | ---------------------------------------- |
  | **Completion ID** | String | Yes      | The ID returned from async execution     |

  **Response:**

  - Returns the full API response object with `id`, `status`, and `outputContent`

  **Use Cases:**

  - Poll for long-running canvas executions
  - Build async workflows with wait loops
  - Handle high-latency AI processing without timeouts

  ## Node Reference

  ### Credentials

  | Field       | Description                           |
  | ----------- | ------------------------------------- |
  | **API Key** | Your Tela API key from your dashboard |

  ### Parameters

  | Field         | Type       | Required | Description                                       |
  | ------------- | ---------- | -------- | ------------------------------------------------- |
  | **Project**   | Options    | Yes      | Select the project containing your canvas         |
  | **Canvas**    | Options    | Yes      | Select the canvas to execute                      |
  | **Variables** | Collection | No       | Dynamic fields based on your canvas configuration |

  ## Usage Examples

  ### Example 1: Basic Canvas Execution

  **Input Data:**

  ```json
  {
    "customerName": "John Doe",
    "productType": "Premium Subscription",
    "monthlyAmount": 99.99
  }
  ```

  **Canvas Variables:**

  - `customer_name`: John Doe
  - `product_type`: Premium Subscription
  - `monthly_amount`: 99.99

  **Result:** AI-generated personalized content based on your canvas configuration.

  ### Example 2: File Processing

  **Input Data:**

  ```json
  {
    "document": "binary_file_data",
    "processingType": "summarize"
  }
  ```

  **Canvas Variables:**

  - `document`: [File upload]
  - `processing_type`: summarize

  **Result:** AI-processed document with summary or analysis.

  ### Example 3: Dynamic Content Generation

  **Input Data:**

  ```json
  {
    "industry": "Technology",
    "companySize": "100-500 employees",
    "challenge": "Digital transformation"
  }
  ```

  **Canvas Variables:**

  - `industry`: Technology
  - `company_size`: 100-500 employees
  - `challenge`: Digital transformation

  **Result:** Tailored content addressing specific business challenges.

  ## Sample Workflows

  ### Workflow 1: Automated Customer Onboarding

  1. **Webhook** receives new customer signup
  2. **Tela** generates personalized welcome email
  3. **Send Email** delivers the generated content

  ### Workflow 2: Document Processing Pipeline

  1. **File Upload** receives document
  2. **Tela** processes and analyzes document
  3. **Database** stores processed results
  4. **Notification** sends completion alert

  ### Workflow 3: Marketing Campaign Generator

  1. **CRM** provides customer segments
  2. **Tela** generates personalized campaigns
  3. **Marketing Platform** deploys campaigns
  4. **Analytics** tracks performance

  ## Advanced Features

  ### Dynamic Variable Detection

  The node automatically detects canvas variables and their types:

  - **Text variables**: Standard string inputs
  - **File variables**: Automatic file upload handling
  - **Required fields**: Clearly marked in the interface

  ### Smart File Handling

  - Supports multiple file formats
  - Automatic MIME type detection
  - Secure file upload to Tela servers
  - Binary data processing from n8n workflows

  ### Load Options

  - **Projects**: Dynamically loads available projects
  - **Canvases**: Loads canvases based on selected project
  - **Variables**: Auto-populates variable fields based on canvas

  ## Compatibility

  - **n8n Version**: 0.174.0 or later
  - **Node.js**: 18.0.0 or later
  - **npm**: 8.0.0 or later
  - **Platforms**: n8n Cloud, Self-hosted instances

  ## Troubleshooting

  ### Common Issues

  1. **API Key Invalid**

     - Verify your Tela API key is correct
     - Check if the key has expired
     - Ensure proper permissions

  2. **Project Not Loading**

     - Verify API key has access to projects
     - Check Tela API status
     - Refresh credentials

  3. **Canvas Execution Fails**
     - Verify all required variables are set
     - Check canvas configuration in Tela
     - Review API response for error details

  ### Error Messages

  - `Failed to load projects`: Check API key and permissions
  - `Failed to load canvases`: Verify project ID and access
  - `Failed to execute canvas`: Review variable configuration

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Tela API Documentation](https://docs.tela.com)
  - [n8n Workflow Automation](https://n8n.io)
  - [Community Support](https://community.n8n.io)

  ## Support

  ### Getting Help

  - **GitHub Issues**: [Report bugs and request features](https://github.com/meistrari/n8n-nodes-tela/issues)
  - **n8n Community**: [Ask questions in the community](https://community.n8n.io)
  - **Documentation**: [Check the comprehensive docs](https://docs.n8n.io)

  ## Development

  ### Local Development

  ```bash
  # Clone the repository
  git clone https://github.com/meistrari/n8n-nodes-tela.git
  cd n8n-nodes-tela

  # Install dependencies
  npm install

  # Build the project
  npm run build

  # Link locally for testing
  npm link
  ```

  ### Testing

  ```bash
  # Run tests
  npm test

  # Build and test
  npm run build && npm test
  ```

  ## Changelog

  ### Version 1.5.0

  **Improved Binary File Handling**

  #### Improvements

  - **Uses n8n's official helper**: Now uses `helpers.getBinaryDataBuffer()` instead of directly accessing binary data, which works correctly in all n8n storage modes (memory, filesystem, S3)
  - **Any variable can receive files**: Removed type validation - binary files can now be sent to any canvas variable, not just `file` type variables. Tela will automatically parse text content from files when needed
  - **Simplified binary detection**: Cleaner logic with 3 clear cases:
    1. String with binary field name (e.g., `"data"`)
    2. Binary object passed directly (e.g., `{{ $binary.data }}`)
    3. Fallback to first available binary when value is empty
  - **Removed unnecessary API call**: No longer fetches canvas variable definitions just to check types

  #### Migration Guide

  No breaking changes - all existing workflows continue to work. The only difference is:
  - Variables with `type: text` can now receive binary files (previously only `type: file` variables could)

  ### Version 1.4.0

  **BREAKING CHANGE: Simplified API Response Handling**

  All operations now return the raw API response directly instead of formatted/transformed data.

  #### Breaking Changes

  - **Execute Canvas**: Now returns the full `CompletionResponse` object from the API
    - Before: `data.choices[0].message?.content` (sync) or `{ id, status }` (async)
    - After: Full API response object

  - **Execute Workstation**: Now returns the full API response
    - Before: `{ status: "created" }`
    - After: Full `CompletionResponse` object from the API

  - **Get Completion**: Now returns the full API response
    - Before: `{ status, ...outputContent }` (succeeded) or `{ status }` (pending)
    - After: Full `GetCompletionResponse` object with `id`, `status`, and `outputContent`

  #### Migration Guide

  If your workflows depend on the previous response format, you'll need to update your expressions:

  ```
  # Execute Canvas (sync) - accessing content
  Before: {{ $json.fieldName }}
  After:  {{ $json.choices[0].message.content.fieldName }}

  # Execute Canvas (async) - accessing id/status
  Before: {{ $json.id }}
  After:  {{ $json.id }}  (no change needed)

  # Get Completion - accessing output content
  Before: {{ $json.fieldName }}
  After:  {{ $json.outputContent.content.fieldName }}
  ```

  #### Why This Change?

  - Provides full API response data for advanced use cases
  - Eliminates data loss from response transformation
  - Gives users complete control over how to process the response
  - Simplifies codebase maintenance

  ### Version 1.2.0

  **New Features: Async Execution, Completion Polling & Workstation Integration**

  #### New Operations
  - **Execute Workstation**: Create tasks in the Tela Workstation dashboard
    - Tasks are visible in the Tela web interface for review and approval
    - Supports optional `label` field for task identification
    - Automatically fetches `application_id` from the canvas
    - Returns `{ status: "created" }` on success

  - **Get Completion**: Retrieve the result of an async canvas execution
    - Accepts a `completionId` parameter
    - Returns `{ status, ...content }` when succeeded
    - Returns `{ status }` when still processing (for polling workflows)

  #### Execute Canvas Enhancements
  - **Async Execution**: New toggle to execute canvases asynchronously
    - When enabled, returns immediately with `{ id, status }` instead of waiting for completion
    - Ideal for long-running AI tasks that may exceed timeout limits
    - Enables building polling workflows with Wait + If nodes

  #### Use Case: Async Workflow Pattern
  ```
  1. [Tela: Execute Canvas] (Async: ON) → { id: "abc-123", status: "pending" }
  2. [Wait] → 5 seconds
  3. [Tela: Get Completion] (ID: {{ $json.id }}) → { status: "pending" } or { status: "succeeded", ...content }
  4. [If] status !== "succeeded" → Loop back to step 2
  5. [Continue] → Process the completed result
  ```

  #### Use Case: Workstation Task Creation
  ```
  1. [Webhook] → Receive data from external system
  2. [Tela: Execute Workstation] → Create task with label "{{ $json.customer }} - {{ $json.orderId }}"
  3. [Task appears in Tela dashboard for human review]
  ```

  #### Technical Details
  - Added `async` parameter to completion request body
  - Added `status` field to completion response types
  - New `GetCompletionResponse` type for get completion endpoint
  - New `PromptApplication` and `WorkstationRequest` types
  - New `/prompt-application` endpoint integration
  - Graceful error handling for polling requests

  ### Version 1.1.2

  **UX Pattern compliance for n8n verification:**

  #### n8n Verification Requirements
  - **Implemented Resources and Operations pattern**: Added standard n8n UX pattern with Resource and Operation dropdowns
    - Resource: Canvas (single option, extensible for future resources)
    - Operation: Execute (executes a canvas with variables)
    - All existing functionality preserved and unchanged
    - No breaking changes - workflows continue to work seamlessly

  #### User Experience Improvements
  - **Better discoverability**: Users can now see available resources and operations in dropdown menus
  - **Consistent with n8n ecosystem**: Follows the same UX pattern as official n8n nodes
  - **Future-proof architecture**: Easy to extend with additional operations (Get Details, List, etc.)

  #### Technical Details
  - Added `resource` property with 'canvas' option
  - Added `operation` property with 'execute' action
  - Updated all existing properties with `displayOptions` to show conditionally
  - Maintains backwards compatibility with existing workflows

  #### Breaking Changes
  - None - all changes are backwards compatible

  ### Version 1.1.0

  **Major improvements for n8n Cloud verification compliance:**

  #### Critical Fixes
  - **Removed dependency overrides**: Eliminated `overrides` section from package.json to prevent masking security vulnerabilities
  - **Replaced native fetch() with n8n HTTP helpers**: All API requests now use n8n's `httpRequest` helper for proper proxy support, retry logic, and request logging
  - **Added pairedItem linking**: Implemented proper data flow tracking with `pairedItem` metadata on all outputs

  #### High Priority Improvements
  - **Enhanced error logging**: Replaced `console.error` with n8n's logger service for better debugging in production
  - **Added continueOnFail support**: Workflows can now handle errors gracefully and continue processing remaining items
  - **Multi-item processing**: Refactored execute() method to properly process multiple input items in batch

  #### Quality Improvements
  - **Converted icon to SVG format**: Replaced PNG icon with SVG for better scalability and 70% smaller file size
    - Updated both node and credential files to use `tela.svg`
    - Removed legacy PNG icon from build output
    - Consistent icon format across entire package
  - **Improved error handling**: Added `NodeOperationError` with detailed metadata including itemIndex
  - **Better type safety**: Enhanced TypeScript types for HTTP request methods

  #### Breaking Changes
  - None - all changes are backwards compatible

  #### Developer Experience
  - Enhanced logging visibility in n8n execution logs
  - Better error messages with actionable descriptions
  - Improved workflow debugging with proper data flow tracking

  ### Version 1.0.16

  - Replace get prompts call (includeLastVersion=true) for /promoted-version endpoint (the old one was deprecated internally)

  ### Version 1.0.15

  - Fixed critical security vulnerabilities in transitive dependencies
  - Updated axios from vulnerable version to 1.12.2 (fixes CVE-2025-58754)
  - Updated form-data from vulnerable version to 4.0.4 (fixes CVE-2025-7783)
  - Added npm overrides to ensure secure dependency versions across all packages
  - Zero vulnerabilities reported by npm audit

  ### Version 1.0.14

  - Added credential test method to fix n8n verification pre-checks
  - Fixed n8n verification pre-checks by restructuring project to match n8n-nodes-starter template
  - Moved credentials and nodes to proper directories as required by n8n
  - Enhanced README documentation for n8n verification compliance
  - Added comprehensive usage examples and sample workflows
  - Improved installation and configuration instructions
  - Added troubleshooting guide and development documentation

  ### Version 1.0.1

  - Enhanced error handling
  - Improved file upload support
  - Better variable validation

  ### Version 1.0.0

  - Initial release
  - Basic Tela API integration
  - Dynamic variable support

  ## License

  [MIT](LICENSE.md)

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with the Tela API to execute AI-driven canvases, manage projects, and handle file uploads for automation workflows.","capabilities":["Execute Tela canvases with dynamic variables","Handle file uploads for canvas processing","List and manage Tela projects and canvases","Create tasks in Tela Workstation dashboard","Poll for async canvas execution completion status","Generate dynamic content for emails and marketing materials","Process documents with AI assistance"],"authentication":"API key required (Tela API key from dashboard)","commonUseCases":["Generate personalized marketing materials","Process documents with AI assistance","Create tasks for human review in Tela dashboard","Build hybrid human-AI pipelines with manual checkpoints","Poll for long-running AI processing without timeouts"],"limitations":["Community node (requires accepting n8n community node risks)","Manual installation required for self-hosted instances","Requires Tela API credentials setup"],"relatedNodes":["n8n HTTP Request","n8n Wait","n8n File"]}


node_type: n8n-nodes-contextualai.contextualAi
package_name: n8n-nodes-contextualai
display_name: Contextual AI
description: Access Contextual AI tools for agents, parsing, querying, and reranking.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: jinash_rouniyar1
author_github_url: https://github.com/ContextualAI/
npm_package_name: n8n-nodes-contextualai
npm_version: 0.1.11
community_fetched_at: 2026-07-14T14:40:33.376Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "Agent",
      "options": [
        {
          "name": "Agent",
          "value": "Agent"
        },
        {
          "name": "Datastore",
          "value": "Datastore"
        },
        {
          "name": "Query",
          "value": "Query"
        },
        {
          "name": "Reranker",
          "value": "Reranker"
        },
        {
          "name": "LMUnit",
          "value": "LMUnit"
        },
        {
          "name": "Parser",
          "value": "Parser"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Create Agent",
      "options": [
        {
          "name": "Create Agent",
          "value": "Create Agent",
          "action": "Create Agent",
          "description": "Create agent, datastore, and upload documents"
        },
        {
          "name": "List Agents",
          "value": "List Agents",
          "action": "List Agents",
          "description": "Retrieve a list of all agents"
        },
        {
          "name": "Delete Agent",
          "value": "Delete Agent",
          "action": "Delete Agent",
          "description": "Delete a given agent (irreversible operation)"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Agent"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Parse Document",
      "options": [
        {
          "name": "Parse Document",
          "value": "Parse Document",
          "action": "Parse Document",
          "description": "Parse a document using Contextual AI parser"
        },
        {
          "name": "Parse Status",
          "value": "Parse Status",
          "action": "Parse Status",
          "description": "Get the status of a parse job"
        },
        {
          "name": "Parse Result",
          "value": "Parse Result",
          "action": "Parse Result",
          "description": "Get the results of a parse job"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Parser"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Query agent",
      "options": [
        {
          "name": "Query agent",
          "value": "Query agent",
          "action": "Query agent",
          "description": "Query a Contextual AI agent"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Query"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Rerank documents",
      "options": [
        {
          "name": "Rerank documents",
          "value": "Rerank documents",
          "action": "Rerank documents",
          "description": "Rerank documents against a query"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Reranker"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Run LMUnit",
      "options": [
        {
          "name": "Run LMUnit",
          "value": "Run LMUnit",
          "action": "Run LMUnit",
          "description": "Evaluate a response with LMUnit"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "LMUnit"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "Create Datastore",
      "options": [
        {
          "name": "Create Datastore",
          "value": "Create Datastore",
          "action": "Create Datastore",
          "description": "Create a new datastore"
        },
        {
          "name": "Ingest Document",
          "value": "Ingest Document",
          "action": "Ingest Document",
          "description": "Ingest a document into a datastore"
        },
        {
          "name": "Get Document Metadata",
          "value": "Get Document Metadata",
          "action": "Get Document Metadata",
          "description": "Get metadata and processing status for a document"
        },
        {
          "name": "List Datastores",
          "value": "List Datastores",
          "action": "List Datastores",
          "description": "Retrieve a list of all datastores"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "Datastore"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Create Agent",
      "value": "Create Agent",
      "action": "Create Agent",
      "description": "Create agent, datastore, and upload documents",
      "resource": "Agent"
    },
    {
      "name": "List Agents",
      "value": "List Agents",
      "action": "List Agents",
      "description": "Retrieve a list of all agents",
      "resource": "Agent"
    },
    {
      "name": "Delete Agent",
      "value": "Delete Agent",
      "action": "Delete Agent",
      "description": "Delete a given agent (irreversible operation)",
      "resource": "Agent"
    },
    {
      "name": "Parse Document",
      "value": "Parse Document",
      "action": "Parse Document",
      "description": "Parse a document using Contextual AI parser",
      "resource": "Parser"
    },
    {
      "name": "Parse Status",
      "value": "Parse Status",
      "action": "Parse Status",
      "description": "Get the status of a parse job",
      "resource": "Parser"
    },
    {
      "name": "Parse Result",
      "value": "Parse Result",
      "action": "Parse Result",
      "description": "Get the results of a parse job",
      "resource": "Parser"
    },
    {
      "name": "Query agent",
      "value": "Query agent",
      "action": "Query agent",
      "description": "Query a Contextual AI agent",
      "resource": "Query"
    },
    {
      "name": "Rerank documents",
      "value": "Rerank documents",
      "action": "Rerank documents",
      "description": "Rerank documents against a query",
      "resource": "Reranker"
    },
    {
      "name": "Run LMUnit",
      "value": "Run LMUnit",
      "action": "Run LMUnit",
      "description": "Evaluate a response with LMUnit",
      "resource": "LMUnit"
    },
    {
      "name": "Create Datastore",
      "value": "Create Datastore",
      "action": "Create Datastore",
      "description": "Create a new datastore",
      "resource": "Datastore"
    },
    {
      "name": "Ingest Document",
      "value": "Ingest Document",
      "action": "Ingest Document",
      "description": "Ingest a document into a datastore",
      "resource": "Datastore"
    },
    {
      "name": "Get Document Metadata",
      "value": "Get Document Metadata",
      "action": "Get Document Metadata",
      "description": "Get metadata and processing status for a document",
      "resource": "Datastore"
    },
    {
      "name": "List Datastores",
      "value": "List Datastores",
      "action": "List Datastores",
      "description": "Retrieve a list of all datastores",
      "resource": "Datastore"
    }
  ]

npm_readme:
  # n8n-nodes-contextualai

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

  Contextual AI provides enterprise-grade RAG (Retrieval-Augmented Generation) agents, advanced document parsing, intelligent querying, and document reranking capabilities for building sophisticated AI-powered applications.

  [Contextual AI](https://contextual.ai) is a platform for building enterprise-grade AI applications with advanced RAG capabilities, while [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.

  ## Table of contents

  - [Installation on self hosted instance](#installation-self-hosted)
  - [Installation on n8n cloud](#installation-n8n-cloud)
  - [Operations](#operations)
  - [Credentials](#credentials)
  - [Compatibility](#compatibility)
  - [Usage](#usage)
  - [Resources](#resources)
  - [Troubleshooting](#troubleshooting)  

  ## Installation (self-hosted)

  To install the Contextual AI community node directly from the n8n Editor UI:

  1. Open your n8n instance.
  2. Go to **Settings > Community Nodes**
  3. Select **Install**.
  4. Enter the npm package name: `n8n-nodes-contextualai` to install the latest version.
  5. Agree to the [risks](https://docs.n8n.io/integrations/community-nodes/risks/) of using community nodes and select **Install**
  6. The node is now available to use in your workflows.

  ## Installation (n8n Cloud)

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

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

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


  ## Operations

  This node supports a comprehensive range of Contextual AI operations, organized by resource type:

  ### Agent
  - **Create agent**: Create a new Contextual AI RAG agent with datastore and upload documents
    - Configure agent name, description, and datastore settings
    - Upload multiple documents via binary data
    - Support for various document formats (PDF, DOC/DOCX, PPT/PPTX)
    - Automatic document processing and indexing
  - **List agents**: Retrieve a list of all agents in your Contextual AI account
    - View agent details and metadata
    - Check agent status and configuration
  - **Delete agent**: Remove an agent from your Contextual AI account
    - Permanent deletion of agent and associated data
    - Requires agent ID for confirmation

  ### Datastore
  - **Create datastore**: Create a new datastore for document storage
    - Configure datastore name and settings
    - Set up document storage and indexing
  - **Ingest document**: Upload and process documents into a datastore
    - Support for multiple document formats (PDF, DOC/DOCX, PPT/PPTX, HTML)
    - Optional metadata attachment
    - Batch processing capabilities
  - **Get document metadata**: Retrieve metadata for a specific document
    - Document information and processing status
    - Metadata and indexing details
  - **List datastores**: Retrieve a list of all datastores in your account
    - View datastore details and configuration
    - Check datastore status and document counts

  ### Query
  - **Query agent**: Query existing Contextual AI agents with intelligent retrieval
    - Natural language querying capabilities
    - Optional retrieval-only mode
    - Document readiness checking
    - Contextual response generation
    - Retrieval content inclusion

  ### Parser  
  - **Parse document**: Parse documents using Contextual AI's advanced document parser
    - Support for PDF, DOC/DOCX, PPT/PPTX files
    - Configurable parsing modes (standard)
    - Figure caption extraction (concise/detailed)
    - Document hierarchy preservation
    - Page range selection
    - Returns job ID for status monitoring
  - **Parse status**: Check the status of a document parsing job
    - Monitor parsing progress
    - Retrieve parsed results when completed
    - Track job status and file information
  - **Parse result**: Get the results of a completed parse job
    - Retrieve parsed content in multiple formats (markdown-document, markdown-per-page, blocks-per-page)
    - Access document metadata and hierarchy information
    - Get structured content blocks with confidence levels and bounding boxes

  ### Reranker
  - **Rerank documents**: Rank documents according to their relevance to a query
    - Instruction-following reranker technology
    - Custom instruction support
    - Metadata integration
    - Relevance scoring and ranking

  ### LMUnit
  - **Run LMUnit**: Evaluate model responses using Contextual AI's scoring system
    - Automated response evaluation
    - Custom unit test criteria
    - Scoring from 1-5 scale
    - Quality assessment and validation

  ### AI Tools Integration

  All Contextual AI node operations can be combined with n8n's AI tools to create powerful workflows.
  For example, you can ingest documents into a datastore, create an agent from that information, and then query over the documents for grounded responses and citations.

  ## Credentials

  This node requires a Contextual AI API key for authentication.

  ### Prerequisites
  - Sign up for a free trial of Contextual AI account at [app.contextual.ai](https://app.contextual.ai)
  - Obtain your API key from the Contextual AI dashboard

  ### Setup
  1. In n8n, go to **Credentials**
  2. Add a new **"Contextual AI API"** credential
  3. Enter your API key in the **API Key** field
  4. Optionally add a **Name** for easy identification
  5. Click **Save** to store the credential

  ### Authentication Methods

  The node supports API key authentication:
  - **API Key**: Configure your Contextual AI API key in the n8n credentials section under `ContextualAiApi`
  - **Security**: API keys are securely stored and encrypted in n8n's credential system

  ## Compatibility

  This node has been tested with n8n version 1.57.0 and is compatible with:

  - **n8n version**: 1.0.0 or later
  - **Node.js version**: 20.15 or later
  - **Contextual AI API**: Latest version

  ## Usage

  ### Getting Started

  1. **Set up credentials**: Configure your Contextual AI API key in n8n credentials
  2. **Create a workflow**: Start a new workflow in n8n
  3. **Add the Contextual AI node**: Insert the Contextual AI node into your workflow
  4. **Select an operation**: Choose the desired operation for your use case
  5. **Execute the workflow**: Run the workflow to perform the Contextual AI operation

  ### Creating an Agent with Documents

  1. Add the Contextual AI node to your workflow
  2. Select **"Agent"** as the resource and **"Create agent"** as the operation
  3. Configure your agent settings:
     - **Agent Name**: Give your agent a descriptive name
     - **Description**: Provide a brief description of the agent's purpose
     - **Datastore Name**: Specify the datastore name for document storage
  4. Provide documents via binary data (supports multiple files)
  5. Configure document processing options if needed
  6. Execute to create the agent and upload documents

  ### Datastore Management

  1. **Create a datastore**:
     - Select **"Datastore"** as the resource and **"Create datastore"** as the operation
     - Enter a datastore name
     - Execute to create the datastore and receive the datastore ID

  2. **Upload documents**:
     - Select **"Ingest document"** as the operation
     - Provide the datastore ID and document files via binary data
     - Optionally add metadata as JSON
     - Execute to upload and process documents

  3. **Using data connectors (Optional)**:
     > **Note**: To use source connectors for your datastore, you need to configure them in the [Contextual AI platform](https://app.contextual.ai) first, then use that datastore in your n8n workflow.
     
     - **Step 1**: Configure connectors in the [Contextual AI platform](https://app.contextual.ai)
       - Go to Datastores → Create → Select "Third-Party Connection"
       - Choose your data source (Google Drive, SharePoint)
       - Authorize and select specific folders to sync
       - Wait for initial sync to complete (status shows "Synced" with green checkmark)
     - **Step 2**: Use the connector datastore in your n8n workflow
       - Copy the datastore ID from the platform
       - Use this ID when creating agents or querying in n8n
       - The datastore will automatically stay in sync with your source data
     - **Benefits**: No manual document uploads, automatic permissions enforcement, real-time data updates

  4. **Manage documents**:
     - Use **"List datastores"** to view all datastores
     - Use **"Get document metadata"** to retrieve specific document information

  ### Querying an Agent

  1. Select **"Query"** as the resource and **"Query agent"** as the operation
  2. Enter the **Agent ID** and your **Query**
  3. Configure query options:
     - Enable **retrieval-only mode** for document search without generation
     - Include **retrieval content text** for context
     - Set **document readiness** checking
  4. Execute to get the agent's response

  ### Document Reranking

  1. Select **"Reranker"** as the resource and **"Rerank documents"** as the operation
  2. Provide a **Query** and **comma-separated list of documents**
  3. Configure reranking options:
     - Add **custom instructions** for ranking criteria
     - Include **metadata** for enhanced ranking
  4. Execute to get ranked results with relevance scores

  ### Response Evaluation

  1. Select **"LMUnit"** as the resource and **"Run LMUnit"** as the operation
  2. Provide the required inputs:
     - **Original Query**: The question that was asked
     - **Model Response**: The response to evaluate
     - **Unit Test Criteria**: The criteria for evaluation
  3. Execute to get a score from 1-5 on the unit test

  ### Document Parsing

  1. Select **"Parser"** as the resource and **"Parse document"** as the operation
  2. Provide a document file via binary data
  3. Configure parsing options:
     - **Parse Mode**: Choose parsing mode (standard)
     - **Figure Caption Mode**: Choose caption extraction (concise/detailed)
     - **Enable Document Hierarchy**: Preserve document structure
     - **Page Range**: Specify pages to parse (e.g., "0-5")
  4. Execute to submit the parse job and receive a job ID
  5. Use **"Parse status"** operation with the job ID to monitor progress and retrieve results


  ### Advanced Workflow Examples

  - **Document Processing Pipeline**: Parse documents → Create datastore → Ingest documents → Create agent → Query agent
  - **Quality Assurance**: Query agent → Evaluate response with LMUnit
  - **Content Optimization**: Rerank documents → Parse top results → Create refined agent
  - **Batch Document Processing**: List datastores → Ingest multiple documents → Monitor processing status
  - **Agent Management**: List agents → Delete unused agents → Create new agents with updated documents

  ## Resources

  * [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  * [Contextual AI Documentation](https://docs.contextual.ai)
  * [Contextual AI API Reference](https://docs.contextual.ai/api-reference)

  ## Troubleshooting

  ### Common issues

  1. **Authentication errors**
     - Verify your API key is correct and active
     - Check if your Contextual AI account has sufficient permissions
     - Ensure the API key hasn't expired

  2. **Agent Not Found**
     - Verify the agent ID format is correct
     - Check if the agent exists in your Contextual AI account
     - Ensure you have access to the agent

  3. **Document parsing failures**
     - Verify the document format is supported (PDF, DOC/DOCX, PPT/PPTX)
     - Check file size limits
     - Ensure the document isn't corrupted or password-protected

  4. **Query operation failures**
     - Verify the agent ID is correct
     - Check if the agent is ready (documents processed)
     - Review query format and parameters

  5. **Reranking errors**
     - Ensure documents are provided in the correct format
     - Check query and document content validity
     - Verify custom instructions are properly formatted

  6. **Parse job failures**
     - Verify the job ID format is correct (should be a UUID)
     - Check if the parse job exists and hasn't expired
     - Ensure the original document was valid and supported

  7. **Datastore operation failures**
     - Verify datastore ID format is correct (should be a UUID)
     - Check if the datastore exists in your account
     - Ensure you have proper permissions for the datastore

  ### Getting help

  If you encounter issues:
  1. Check the [Contextual AI API documentation](https://docs.contextual.ai/api-reference)
  2. Review the [n8n Community Nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  3. Open an issue in the [GitHub repository](https://github.com/contextual-ai/n8n-nodes-contextualai)

ai_documentation_summary:
  {"purpose":"This n8n community node enables enterprise-grade RAG (Retrieval-Augmented Generation) workflows by providing tools for agent management, document parsing, intelligent querying, document reranking, and model evaluation.","capabilities":["Create, list, and delete RAG agents","Create and manage datastores for document storage","Ingest and process multiple document formats (PDF, DOCX, PPTX, HTML)","Parse documents with configurable modes and hierarchy preservation","Query agents with natural language retrieval and contextual responses","Rerank documents based on relevance to queries","Evaluate model responses using automated scoring","Support for binary data uploads and batch processing"],"authentication":"API Key required (Contextual AI API key stored in n8n credentials)","commonUseCases":["Building enterprise RAG applications with document grounding","Automated document ingestion and indexing workflows","Intelligent document querying with citation support","Model evaluation and quality assessment pipelines"],"limitations":["Community node (self-hosted only, not included in n8n Cloud base plan)","Requires separate Contextual AI account and API key","Some advanced features may require paid Contextual AI tier"],"relatedNodes":["n8n-nodes-core.code","n8n-nodes-core.httpRequest","n8n-nodes-core.binary","n8n-nodes-core.waitUntil","n8n-nodes-core.splitInBatches"]}


node_type: n8n-nodes-greip.greip
package_name: n8n-nodes-greip
display_name: Greip
description: Get fraud prevention, threat intelligence, and risk scoring data from Greip.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: greip
author_github_url: https://github.com/Greipio/
npm_package_name: n8n-nodes-greip
npm_version: 1.0.7
community_fetched_at: 2026-07-14T14:40:33.377Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "dataLookup",
      "options": [
        {
          "name": "Data Lookup",
          "value": "dataLookup"
        },
        {
          "name": "Risk Scoring",
          "value": "riskScoring"
        }
      ],
      "displayName": "Resources",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "ipLookup",
      "options": [
        {
          "name": "ASN Lookup",
          "value": "asnLookup",
          "action": "ASN Lookup",
          "description": "Lookup Autonomous System Number (ASN) data"
        },
        {
          "name": "BIN Lookup",
          "value": "binLookup",
          "action": "BIN Lookup",
          "description": "Retrieve comprehensive information associated with a debit or credit card"
        },
        {
          "name": "Country Lookup",
          "value": "countryLookup",
          "action": "Country lookup",
          "description": "Retrieve detailed information about a given country"
        },
        {
          "name": "Domain Lookup",
          "value": "domainLookup",
          "action": "Domain lookup",
          "description": "Lookup any domain name and retrieve associated data and risk evaluation metrics"
        },
        {
          "name": "IBAN Lookup",
          "value": "ibanLookup",
          "action": "IBAN Lookup",
          "description": "Validate a given IBAN and obtain essential information about the issuing country"
        },
        {
          "name": "IP Lookup",
          "value": "ipLookup",
          "action": "IP Lookup",
          "description": "Retrieve comprehensive information about a given IP address"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "dataLookup"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "ipThreats",
      "options": [
        {
          "name": "Email Scoring",
          "value": "emailScoring",
          "action": "Email scoring",
          "description": "Score any email address and retrieve its risk evaluation metrics"
        },
        {
          "name": "IP Scoring",
          "value": "ipThreats",
          "action": "IP Scoring",
          "description": "Get threat intelligence and risk scoring for an IP address"
        },
        {
          "name": "Payment Fraud Detection",
          "value": "paymentFraudDetection",
          "action": "Payment fraud detection",
          "description": "Detect and score payment fraud risk for a transaction",
          "displayOptions": {
            "show": {
              "resource": [
                "riskScoring"
              ]
            }
          }
        },
        {
          "name": "Phone Scoring",
          "value": "phoneScoring",
          "action": "Phone number scoring",
          "description": "Score any phone number and retrieve its risk evaluation metrics"
        },
        {
          "name": "Profanity Detection",
          "value": "profanityDetection",
          "action": "Profanity detection",
          "description": "Detect offensive or inappropriate language in a given text"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "riskScoring"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "ASN Lookup",
      "value": "asnLookup",
      "action": "ASN Lookup",
      "description": "Lookup Autonomous System Number (ASN) data",
      "resource": "dataLookup"
    },
    {
      "name": "BIN Lookup",
      "value": "binLookup",
      "action": "BIN Lookup",
      "description": "Retrieve comprehensive information associated with a debit or credit card",
      "resource": "dataLookup"
    },
    {
      "name": "Country Lookup",
      "value": "countryLookup",
      "action": "Country lookup",
      "description": "Retrieve detailed information about a given country",
      "resource": "dataLookup"
    },
    {
      "name": "Domain Lookup",
      "value": "domainLookup",
      "action": "Domain lookup",
      "description": "Lookup any domain name and retrieve associated data and risk evaluation metrics",
      "resource": "dataLookup"
    },
    {
      "name": "IBAN Lookup",
      "value": "ibanLookup",
      "action": "IBAN Lookup",
      "description": "Validate a given IBAN and obtain essential information about the issuing country",
      "resource": "dataLookup"
    },
    {
      "name": "IP Lookup",
      "value": "ipLookup",
      "action": "IP Lookup",
      "description": "Retrieve comprehensive information about a given IP address",
      "resource": "dataLookup"
    },
    {
      "name": "Email Scoring",
      "value": "emailScoring",
      "action": "Email scoring",
      "description": "Score any email address and retrieve its risk evaluation metrics",
      "resource": "riskScoring"
    },
    {
      "name": "IP Scoring",
      "value": "ipThreats",
      "action": "IP Scoring",
      "description": "Get threat intelligence and risk scoring for an IP address",
      "resource": "riskScoring"
    },
    {
      "name": "Payment Fraud Detection",
      "value": "paymentFraudDetection",
      "action": "Payment fraud detection",
      "description": "Detect and score payment fraud risk for a transaction",
      "displayOptions": {
        "show": {
          "resource": [
            "riskScoring"
          ]
        }
      },
      "resource": "riskScoring"
    },
    {
      "name": "Phone Scoring",
      "value": "phoneScoring",
      "action": "Phone number scoring",
      "description": "Score any phone number and retrieve its risk evaluation metrics",
      "resource": "riskScoring"
    },
    {
      "name": "Profanity Detection",
      "value": "profanityDetection",
      "action": "Profanity detection",
      "description": "Detect offensive or inappropriate language in a given text",
      "resource": "riskScoring"
    }
  ]

npm_readme:
  # n8n Nodes - Greip Integration

  This is an n8n community node that integrates with the Greip API, allowing users to interact with Greip's services directly from n8n workflows.

  [Greip](https://greip.io) is a platform that provides various services for fraud detection, proxy detection, content moderation, and more.

  ## Table of contents

  ## Installation (self-hosted)

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

  1. Open your n8n instance.
  2. Go to Settings > Community Nodes
  3. Select Install.
  4. Enter the npm package name: n8n-nodes-greip to install the latest version.
  5. Agree to the risks of using community nodes and select Install.
  6. The node is now available to use in your workflows.

  ## Installation (n8n Cloud)

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

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

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

  ## Operations

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

  ### Data Lookup

  - ASN Lookup: Retrieve Autonomous System Number information and prefixes by AS number.
  - BIN Lookup: Get Bank Identification Number details.
  - IP Lookup: Retrieve information about an IP address, including location, ASN, security threats, and more.
  - Country Lookup: Get details about a country using its ISO code.
  - Domain Lookup: Fetch information about a domain, including its registration details and associated threats.
  - IBAN Lookup: Retrieve International Bank Account Number information.

  ### Risk Scoring

  - Email Scoring: Assess the risk associated with an email address.
  - IP Scoring: Evaluate the risk level of an IP address.
  - Phone Scoring: Determine the risk score of a phone number.
  - Payment Fraud Detection: Analyze payment details for potential fraud.
  - Profanity Detection: Check text for offensive language and profanity.

  ## AI Tools

  All Greip node operations can be combined with n8n's AI tools to create powerful workflows. For example, you can use AI to generate personalized marketing messages and then use the Greip Email Scoring operation to ensure the email addresses are valid and low-risk.

  ## Credentials

  To use the Greip node, you need to set up your Greip API credentials in n8n:

  1. Go to Settings > Credentials in n8n.
  2. Click on New Credential and select Greip API from the list.
  3. Enter your Greip API Key, which you can obtain from your Greip account dashboard.
  4. Save the credentials.

  ## Compatibility

  This node has been tested with n8n version `1.112.3`.

  ## Resources

  - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
  - [Greip API Documentation](https://docs.greip.io/knowledge-base/integrations/n8n)

  ## Troubleshooting

  ### Common issues

  1. Authentication errors
     - Ensure that your Greip API Key is correct and has the necessary permissions.
     - Check for any typos or formatting issues in the API Key.
  2. Resource Not Found
     - Verify that the resource you are trying to access exists and that you have the correct identifiers.
     - Ensure you have access to the resource based on your Greip account plan.
  3. Operation failures
     - Double-check the parameters you are passing to the operation.
     - Verify resource limits (memory, timeout)

  ### Getting help

  If you encounter any issues or need assistance with the Greip node, consider the following options:

  1. Check our [N8N integration guide](https://docs.greip.io/knowledge-base/integrations/n8n)
  2. Review the [n8n Community Nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
  3. Open an issue in the [GitHub repository](https://github.com/Greipio/n8n-nodes-greip)

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with the Greip API to perform fraud detection, threat intelligence checks, and risk scoring on various data types.","capabilities":["ASN Lookup","BIN Lookup","IP Lookup","Country Lookup","Domain Lookup","IBAN Lookup","Email Scoring","IP Scoring","Phone Scoring","Payment Fraud Detection"],"authentication":"API Key required","commonUseCases":["Fraud prevention workflows","Threat intelligence gathering","Risk scoring for emails, IPs, and phone numbers","Content moderation using profanity detection"],"limitations":["Community node (requires installation in n8n Editor UI or n8n Cloud)","Requires active Greip API account and subscription","Resource access depends on Greip account plan permissions"],"relatedNodes":["n8n-nodes-core.httpRequest","n8n-nodes-core.code"]}


node_type: n8n-nodes-linked-api.linkedApi
package_name: n8n-nodes-linked-api
display_name: Linked API
description: Control your LinkedIn accounts and retrieve real-time data.
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: linked-api
author_github_url: https://github.com/Linked-API/
npm_package_name: n8n-nodes-linked-api
npm_version: 1.0.7
community_fetched_at: 2026-07-14T14:40:33.378Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "standard",
      "options": [
        {
          "name": "Standard Interface",
          "value": "standard"
        },
        {
          "name": "Sales Navigator",
          "value": "salesNavigator"
        },
        {
          "name": "Other",
          "value": "other"
        },
        {
          "name": "Administration",
          "value": "admin"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "searchCompanies",
      "options": [
        {
          "name": "Check Connection Status",
          "value": "checkConnectionStatus",
          "action": "Check connection status",
          "description": "Check the connection status between your account and another person"
        },
        {
          "name": "Comment on Post",
          "value": "commentOnPost",
          "action": "Comment on post",
          "description": "Leave a comment on a LinkedIn post"
        },
        {
          "name": "Create Post",
          "value": "createPost",
          "action": "Create post",
          "description": "Create a new LinkedIn post"
        },
        {
          "name": "Fetch Company",
          "value": "fetchCompany",
          "action": "Fetch company",
          "description": "Fetch detailed information about a LinkedIn company"
        },
        {
          "name": "Fetch Person",
          "value": "fetchPerson",
          "action": "Fetch person",
          "description": "Fetch detailed information about a LinkedIn person"
        },
        {
          "name": "Fetch Post",
          "value": "fetchPost",
          "action": "Fetch post",
          "description": "Retrieve detailed information about a LinkedIn post"
        },
        {
          "name": "Fetch Job",
          "value": "fetchJob",
          "action": "Fetch job",
          "description": "Fetch detailed information about a LinkedIn job"
        },
        {
          "name": "React to Post",
          "value": "reactToPost",
          "action": "React to post",
          "description": "React to a LinkedIn post with like, celebrate, support, love, insightful, or funny"
        },
        {
          "name": "Remove Connection",
          "value": "removeConnection",
          "action": "Remove connection",
          "description": "Remove a person from your connections"
        },
        {
          "name": "Retrieve Connections",
          "value": "retrieveConnections",
          "action": "Retrieve connections",
          "description": "Retrieve your connections with optional filtering"
        },
        {
          "name": "Retrieve Pending Requests",
          "value": "retrievePendingRequests",
          "action": "Retrieve pending requests",
          "description": "Retrieve pending connection requests sent from your account"
        },
        {
          "name": "Retrieve Performance",
          "value": "retrievePerformance",
          "action": "Retrieve performance",
          "description": "Retrieve performance analytics from your LinkedIn dashboard"
        },
        {
          "name": "Retrieve SSI",
          "value": "retrieveSSI",
          "action": "Retrieve SSI",
          "description": "Retrieve your current Social Selling Index (SSI) score"
        },
        {
          "name": "Search Companies",
          "value": "searchCompanies",
          "action": "Search companies",
          "description": "Search for companies on LinkedIn"
        },
        {
          "name": "Search People",
          "value": "searchPeople",
          "action": "Search people",
          "description": "Search for people on LinkedIn"
        },
        {
          "name": "Search Jobs",
          "value": "searchJobs",
          "action": "Search jobs",
          "description": "Search for jobs on LinkedIn"
        },
        {
          "name": "Send Connection Request",
          "value": "sendConnectionRequest",
          "action": "Send connection request",
          "description": "Send a connection request to a person"
        },
        {
          "name": "Send Message",
          "value": "sendMessage",
          "action": "Send message",
          "description": "Send a message to a LinkedIn person"
        },
        {
          "name": "Sync Conversation",
          "value": "syncConversation",
          "action": "Sync conversation",
          "description": "Sync a conversation so you can start polling it for new messages"
        },
        {
          "name": "Withdraw Connection Request",
          "value": "withdrawConnectionRequest",
          "action": "Withdraw connection request",
          "description": "Withdraw a connection request sent to a person"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "standard"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "nvSearchCompanies",
      "options": [
        {
          "name": "Fetch Company in Sales Navigator",
          "value": "nvFetchCompany",
          "action": "Fetch company in Sales Navigator",
          "description": "Fetch detailed information about a company in Sales Navigator"
        },
        {
          "name": "Fetch Person in Sales Navigator",
          "value": "nvFetchPerson",
          "action": "Fetch person in Sales Navigator",
          "description": "Fetch detailed information about a person in Sales Navigator"
        },
        {
          "name": "Search Companies in Sales Navigator",
          "value": "nvSearchCompanies",
          "action": "Search companies in Sales Navigator",
          "description": "Search for companies in Sales Navigator"
        },
        {
          "name": "Search People in Sales Navigator",
          "value": "nvSearchPeople",
          "action": "Search people in Sales Navigator",
          "description": "Search for people in Sales Navigator"
        },
        {
          "name": "Send Message in Sales Navigator",
          "value": "nvSendMessage",
          "action": "Send message in Sales Navigator",
          "description": "Send a message to a person in Sales Navigator"
        },
        {
          "name": "Sync Conversation in Sales Navigator",
          "value": "nvSyncConversation",
          "action": "Sync conversation in Sales Navigator",
          "description": "Sync a conversation in Sales Navigator so you can start polling it"
        }
      ],
      "displayName": "Operations",
      "displayOptions": {
        "show": {
          "resource": [
            "salesNavigator"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "customWorkflow",
      "options": [
        {
          "name": "Custom Workflow",
          "value": "customWorkflow",
          "action": "Execute custom workflow",
          "description": "Execute a custom multi-step workflow using raw workflow definition"
        },
        {
          "name": "Get Workflow Result",
          "value": "getWorkflowResult",
          "action": "Get workflow result",
          "description": "Get the result of workflow execution"
        },
        {
          "name": "Cancel Workflow",
          "value": "cancelWorkflow",
          "action": "Cancel workflow",
          "description": "Cancel a running workflow execution"
        },
        {
          "name": "Poll Conversations",
          "value": "pollConversations",
          "action": "Poll conversations",
          "description": "Poll multiple conversations for new messages"
        },
        {
          "name": "Actions Usage Statistics",
          "value": "actionsUsageStatistics",
          "action": "Get actions statistics",
          "description": "Get actions usage statistics for a date range"
        }
      ],
      "displayName": "Operations",
      "displayOptions": {
        "show": {
          "resource": [
            "other"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "adminGetAccounts",
      "options": [
        {
          "name": "Get Subscription Status",
          "value": "adminGetSubscriptionStatus",
          "action": "Get subscription status",
          "description": "Get current subscription status and trial eligibility"
        },
        {
          "name": "Get Seats",
          "value": "adminGetSeats",
          "action": "Get seats",
          "description": "Get active subscription seats"
        },
        {
          "name": "Set Seats",
          "value": "adminSetSeats",
          "action": "Set seats",
          "description": "Set number of subscription seats"
        },
        {
          "name": "Get Accounts",
          "value": "adminGetAccounts",
          "action": "Get accounts",
          "description": "Get all connected LinkedIn accounts, pending sessions, and reconnection links"
        },
        {
          "name": "Reparse Account Info",
          "value": "adminReparseAccountInfo",
          "action": "Reparse account info",
          "description": "Refresh stored profile URL, avatar, headline, and name for a connected account"
        },
        {
          "name": "Reconnect Account",
          "value": "adminCreateReconnectionSession",
          "action": "Reconnect account",
          "description": "Create reconnection session for an account that requires reconnection"
        },
        {
          "name": "Connect Account",
          "value": "adminConnectAccount",
          "action": "Connect account",
          "description": "Create connection session for a new LinkedIn account"
        },
        {
          "name": "Get Connection Session",
          "value": "adminGetConnectionSession",
          "action": "Get connection session",
          "description": "Get connection or reconnection session status"
        },
        {
          "name": "Cancel Connection Session",
          "value": "adminCancelConnectionSession",
          "action": "Cancel connection session",
          "description": "Cancel a pending connection or reconnection session"
        },
        {
          "name": "Disconnect Account",
          "value": "adminDisconnectAccount",
          "action": "Disconnect account",
          "description": "Disconnect a LinkedIn account (irreversible)"
        },
        {
          "name": "Regenerate Token",
          "value": "adminRegenerateToken",
          "action": "Regenerate token",
          "description": "Regenerate identification token for an account"
        },
        {
          "name": "Get Limits Defaults",
          "value": "adminGetLimitsDefaults",
          "action": "Get limits defaults",
          "description": "Get system default rate limits"
        },
        {
          "name": "Get Limits",
          "value": "adminGetLimits",
          "action": "Get limits",
          "description": "Get configured rate limits for an account"
        },
        {
          "name": "Get Limits Usage",
          "value": "adminGetLimitsUsage",
          "action": "Get limits usage",
          "description": "Get current usage against configured limits"
        },
        {
          "name": "Set Limits",
          "value": "adminSetLimits",
          "action": "Set limits",
          "description": "Set rate limits for an account"
        },
        {
          "name": "Delete Limits",
          "value": "adminDeleteLimits",
          "action": "Delete limits",
          "description": "Delete specific account rate limits"
        },
        {
          "name": "Reset Limits",
          "value": "adminResetLimits",
          "action": "Reset limits",
          "description": "Reset all limits to system defaults"
        }
      ],
      "displayName": "Operations",
      "displayOptions": {
        "show": {
          "resource": [
            "admin"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Check Connection Status",
      "value": "checkConnectionStatus",
      "action": "Check connection status",
      "description": "Check the connection status between your account and another person",
      "resource": "standard"
    },
    {
      "name": "Comment on Post",
      "value": "commentOnPost",
      "action": "Comment on post",
      "description": "Leave a comment on a LinkedIn post",
      "resource": "standard"
    },
    {
      "name": "Create Post",
      "value": "createPost",
      "action": "Create post",
      "description": "Create a new LinkedIn post",
      "resource": "standard"
    },
    {
      "name": "Fetch Company",
      "value": "fetchCompany",
      "action": "Fetch company",
      "description": "Fetch detailed information about a LinkedIn company",
      "resource": "standard"
    },
    {
      "name": "Fetch Person",
      "value": "fetchPerson",
      "action": "Fetch person",
      "description": "Fetch detailed information about a LinkedIn person",
      "resource": "standard"
    },
    {
      "name": "Fetch Post",
      "value": "fetchPost",
      "action": "Fetch post",
      "description": "Retrieve detailed information about a LinkedIn post",
      "resource": "standard"
    },
    {
      "name": "Fetch Job",
      "value": "fetchJob",
      "action": "Fetch job",
      "description": "Fetch detailed information about a LinkedIn job",
      "resource": "standard"
    },
    {
      "name": "React to Post",
      "value": "reactToPost",
      "action": "React to post",
      "description": "React to a LinkedIn post with like, celebrate, support, love, insightful, or funny",
      "resource": "standard"
    },
    {
      "name": "Remove Connection",
      "value": "removeConnection",
      "action": "Remove connection",
      "description": "Remove a person from your connections",
      "resource": "standard"
    },
    {
      "name": "Retrieve Connections",
      "value": "retrieveConnections",
      "action": "Retrieve connections",
      "description": "Retrieve your connections with optional filtering",
      "resource": "standard"
    },
    {
      "name": "Retrieve Pending Requests",
      "value": "retrievePendingRequests",
      "action": "Retrieve pending requests",
      "description": "Retrieve pending connection requests sent from your account",
      "resource": "standard"
    },
    {
      "name": "Retrieve Performance",
      "value": "retrievePerformance",
      "action": "Retrieve performance",
      "description": "Retrieve performance analytics from your LinkedIn dashboard",
      "resource": "standard"
    },
    {
      "name": "Retrieve SSI",
      "value": "retrieveSSI",
      "action": "Retrieve SSI",
      "description": "Retrieve your current Social Selling Index (SSI) score",
      "resource": "standard"
    },
    {
      "name": "Search Companies",
      "value": "searchCompanies",
      "action": "Search companies",
      "description": "Search for companies on LinkedIn",
      "resource": "standard"
    },
    {
      "name": "Search People",
      "value": "searchPeople",
      "action": "Search people",
      "description": "Search for people on LinkedIn",
      "resource": "standard"
    },
    {
      "name": "Search Jobs",
      "value": "searchJobs",
      "action": "Search jobs",
      "description": "Search for jobs on LinkedIn",
      "resource": "standard"
    },
    {
      "name": "Send Connection Request",
      "value": "sendConnectionRequest",
      "action": "Send connection request",
      "description": "Send a connection request to a person",
      "resource": "standard"
    },
    {
      "name": "Send Message",
      "value": "sendMessage",
      "action": "Send message",
      "description": "Send a message to a LinkedIn person",
      "resource": "standard"
    },
    {
      "name": "Sync Conversation",
      "value": "syncConversation",
      "action": "Sync conversation",
      "description": "Sync a conversation so you can start polling it for new messages",
      "resource": "standard"
    },
    {
      "name": "Withdraw Connection Request",
      "value": "withdrawConnectionRequest",
      "action": "Withdraw connection request",
      "description": "Withdraw a connection request sent to a person",
      "resource": "standard"
    },
    {
      "name": "Fetch Company in Sales Navigator",
      "value": "nvFetchCompany",
      "action": "Fetch company in Sales Navigator",
      "description": "Fetch detailed information about a company in Sales Navigator",
      "resource": "salesNavigator"
    },
    {
      "name": "Fetch Person in Sales Navigator",
      "value": "nvFetchPerson",
      "action": "Fetch person in Sales Navigator",
      "description": "Fetch detailed information about a person in Sales Navigator",
      "resource": "salesNavigator"
    },
    {
      "name": "Search Companies in Sales Navigator",
      "value": "nvSearchCompanies",
      "action": "Search companies in Sales Navigator",
      "description": "Search for companies in Sales Navigator",
      "resource": "salesNavigator"
    },
    {
      "name": "Search People in Sales Navigator",
      "value": "nvSearchPeople",
      "action": "Search people in Sales Navigator",
      "description": "Search for people in Sales Navigator",
      "resource": "salesNavigator"
    },
    {
      "name": "Send Message in Sales Navigator",
      "value": "nvSendMessage",
      "action": "Send message in Sales Navigator",
      "description": "Send a message to a person in Sales Navigator",
      "resource": "salesNavigator"
    },
    {
      "name": "Sync Conversation in Sales Navigator",
      "value": "nvSyncConversation",
      "action": "Sync conversation in Sales Navigator",
      "description": "Sync a conversation in Sales Navigator so you can start polling it",
      "resource": "salesNavigator"
    },
    {
      "name": "Custom Workflow",
      "value": "customWorkflow",
      "action": "Execute custom workflow",
      "description": "Execute a custom multi-step workflow using raw workflow definition",
      "resource": "other"
    },
    {
      "name": "Get Workflow Result",
      "value": "getWorkflowResult",
      "action": "Get workflow result",
      "description": "Get the result of workflow execution",
      "resource": "other"
    },
    {
      "name": "Cancel Workflow",
      "value": "cancelWorkflow",
      "action": "Cancel workflow",
      "description": "Cancel a running workflow execution",
      "resource": "other"
    },
    {
      "name": "Poll Conversations",
      "value": "pollConversations",
      "action": "Poll conversations",
      "description": "Poll multiple conversations for new messages",
      "resource": "other"
    },
    {
      "name": "Actions Usage Statistics",
      "value": "actionsUsageStatistics",
      "action": "Get actions statistics",
      "description": "Get actions usage statistics for a date range",
      "resource": "other"
    },
    {
      "name": "Get Subscription Status",
      "value": "adminGetSubscriptionStatus",
      "action": "Get subscription status",
      "description": "Get current subscription status and trial eligibility",
      "resource": "admin"
    },
    {
      "name": "Get Seats",
      "value": "adminGetSeats",
      "action": "Get seats",
      "description": "Get active subscription seats",
      "resource": "admin"
    },
    {
      "name": "Set Seats",
      "value": "adminSetSeats",
      "action": "Set seats",
      "description": "Set number of subscription seats",
      "resource": "admin"
    },
    {
      "name": "Get Accounts",
      "value": "adminGetAccounts",
      "action": "Get accounts",
      "description": "Get all connected LinkedIn accounts, pending sessions, and reconnection links",
      "resource": "admin"
    },
    {
      "name": "Reparse Account Info",
      "value": "adminReparseAccountInfo",
      "action": "Reparse account info",
      "description": "Refresh stored profile URL, avatar, headline, and name for a connected account",
      "resource": "admin"
    },
    {
      "name": "Reconnect Account",
      "value": "adminCreateReconnectionSession",
      "action": "Reconnect account",
      "description": "Create reconnection session for an account that requires reconnection",
      "resource": "admin"
    },
    {
      "name": "Connect Account",
      "value": "adminConnectAccount",
      "action": "Connect account",
      "description": "Create connection session for a new LinkedIn account",
      "resource": "admin"
    },
    {
      "name": "Get Connection Session",
      "value": "adminGetConnectionSession",
      "action": "Get connection session",
      "description": "Get connection or reconnection session status",
      "resource": "admin"
    },
    {
      "name": "Cancel Connection Session",
      "value": "adminCancelConnectionSession",
      "action": "Cancel connection session",
      "description": "Cancel a pending connection or reconnection session",
      "resource": "admin"
    },
    {
      "name": "Disconnect Account",
      "value": "adminDisconnectAccount",
      "action": "Disconnect account",
      "description": "Disconnect a LinkedIn account (irreversible)",
      "resource": "admin"
    },
    {
      "name": "Regenerate Token",
      "value": "adminRegenerateToken",
      "action": "Regenerate token",
      "description": "Regenerate identification token for an account",
      "resource": "admin"
    },
    {
      "name": "Get Limits Defaults",
      "value": "adminGetLimitsDefaults",
      "action": "Get limits defaults",
      "description": "Get system default rate limits",
      "resource": "admin"
    },
    {
      "name": "Get Limits",
      "value": "adminGetLimits",
      "action": "Get limits",
      "description": "Get configured rate limits for an account",
      "resource": "admin"
    },
    {
      "name": "Get Limits Usage",
      "value": "adminGetLimitsUsage",
      "action": "Get limits usage",
      "description": "Get current usage against configured limits",
      "resource": "admin"
    },
    {
      "name": "Set Limits",
      "value": "adminSetLimits",
      "action": "Set limits",
      "description": "Set rate limits for an account",
      "resource": "admin"
    },
    {
      "name": "Delete Limits",
      "value": "adminDeleteLimits",
      "action": "Delete limits",
      "description": "Delete specific account rate limits",
      "resource": "admin"
    },
    {
      "name": "Reset Limits",
      "value": "adminResetLimits",
      "action": "Reset limits",
      "description": "Reset all limits to system defaults",
      "resource": "admin"
    }
  ]

npm_readme:
  Linked API for n8n connects your LinkedIn account to n8n's automation platform, so you can build visual workflows that search for prospects, send messages, manage connections, extract data, and more – all with [industry-leading safety](https://linkedapi.io/safety/).

  > [!IMPORTANT]
  > Our n8n node is a verified community node – just open the nodes panel, search for "Linked API", and install it with a click.
  > 
  > Alternatively, install it manually: go to Settings → Community Nodes, enter n8n-nodes-linked-api, and click Install.

  ## Use cases
  - **Lead generation pipeline**. Search for prospects matching your criteria, automatically send connection requests, wait for acceptance, then send personalized follow-up messages. Connect the results to your CRM to track everything in one place.
  - **CRM synchronization**. When a new lead enters your CRM, automatically find their LinkedIn profile, send a connection request, and update the CRM with their LinkedIn data. Keep your sales pipeline enriched with real-time LinkedIn information.
  - **Content engagement**. Monitor when your target accounts post on LinkedIn, automatically react or comment on their posts, then log the engagement in your tracking spreadsheet. Build relationships at scale without losing the personal touch.
  - **Recruitment workflows**. Search for candidates with specific skills, send personalized InMails through Sales Navigator, track responses in your ATS, and automatically follow up with interested candidates. Streamline your entire recruitment funnel.
  - **Multi-channel outreach**. Combine LinkedIn with email, Slack, and other channels. When someone accepts your connection request, trigger an email sequence, notify your team in Slack, and create a task in your project management tool.


  ## Get started
  To build LinkedIn automations with n8n, read these essential guides:

  1. [Creating credential](https://linkedapi.io/integrations/n8n/creating-credential/) – get your API tokens and connect to n8n.
  2. [Building workflows](https://linkedapi.io/integrations/n8n/building-workflows-0/) – learn how to use Linked API actions in your workflows.
  3. [Available actions](https://linkedapi.io/integrations/n8n/available-actions/) – explore all LinkedIn actions you can automate.

  ## License
  This project is licensed under the MIT – see the [LICENSE](https://github.com/Linked-API/n8n-nodes-linked-api/blob/main/LICENSE.md) file for details.

ai_documentation_summary:
  {"purpose":"This n8n community node connects to LinkedIn accounts to automate prospecting, messaging, connection management, and data extraction within visual workflows.","capabilities":["Search for prospects by criteria","Send connection requests","Send personalized messages (InMails)","Manage connections","Extract profile data","Monitor account posts","React to or comment on posts","Track responses and engagement","Sync data to CRM or spreadsheets"],"authentication":"API tokens (OAuth2-based credential setup required via Linked API integration)","commonUseCases":["Lead generation pipelines","CRM synchronization with LinkedIn data","Content engagement automation","Recruitment and candidate outreach","Multi-channel outreach workflows"],"limitations":["Community node (not official n8n node)","Requires manual installation from community panel","Dependent on Linked API's safety and rate limits"],"relatedNodes":["n8n-nodes-base.httpRequest","n8n-nodes-base.webhook","n8n-nodes-base.credentialManager"]}


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

updated_at: 2026-07-14 14:40:33
author_name: bookoly
author_github_url: https://github.com/bookoly/n8n-node.git
npm_package_name: n8n-nodes-bookoly
npm_version: 1.0.19
community_fetched_at: 2026-07-14T14:40:33.379Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "sound",
      "options": [
        {
          "name": "Sound",
          "value": "sound"
        },
        {
          "name": "Speech",
          "value": "speech"
        },
        {
          "name": "Speech Dialogue",
          "value": "speech_dialogue"
        },
        {
          "name": "File",
          "value": "file"
        },
        {
          "name": "Transcription",
          "value": "transcript"
        },
        {
          "name": "Video",
          "value": "video"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "combineSounds",
      "options": [
        {
          "name": "Combine Sounds",
          "value": "combineSounds",
          "action": "Combine sounds",
          "description": "Merge multiple sound files into a single seamless audio track"
        },
        {
          "name": "Get a Specific Sound",
          "value": "getSound",
          "action": "Get a sound",
          "description": "Fetches sound data from the API using the sound ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "sound"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createSpeech",
      "options": [
        {
          "name": "Create a Speech Synthesis",
          "value": "createSpeech",
          "action": "Create a speech synthesis",
          "description": "Synthesizes a text into speech"
        },
        {
          "name": "Get a Specific Speech",
          "value": "getSpeech",
          "action": "Get a speech",
          "description": "Fetches speech data from the API using the speech ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "speech"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createSpeechDialogue",
      "options": [
        {
          "name": "Create a Speech Dialogue",
          "value": "createSpeechDialogue",
          "action": "Create a speech dialogue",
          "description": "Generate a conversation between multiple AI voices from text"
        },
        {
          "name": "Get a Specific Speech Dialogue",
          "value": "getSpeechDialogue",
          "action": "Get a speech dialogue",
          "description": "Fetches speech dialogue data from the API using the speech dialogue ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "speech_dialogue"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateSubtitleFile",
      "options": [
        {
          "name": "Generate a Subtitle File",
          "value": "generateSubtitleFile",
          "action": "Generate a subtitle file",
          "description": "Generate subtitle files in multiple formats from a video or audio URL"
        },
        {
          "name": "Get a Specific Subtitle File",
          "value": "getSubtitleFile",
          "action": "Get a subtitle file",
          "description": "Fetches subtitle file data from the API using the subtitle file ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "file"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "createTranscript",
      "options": [
        {
          "name": "Transcribe Audio or Video",
          "value": "createTranscript",
          "action": "Transcribe audio or video",
          "description": "Transcribe your audio or video files into clear, accurate text with timestamps"
        },
        {
          "name": "Get a Specific Transcription",
          "value": "getTranscript",
          "action": "Get a transcription",
          "description": "Fetches transcript data from the API using the transcript ID"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "transcript"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "generateVideo",
      "options": [
        {
          "name": "Add Audio to a Video",
          "value": "addAudioToVideo",
          "action": "Add audio to a video",
          "description": "Seamlessly add audio tracks to your video"
        },
        {
          "name": "Add Audio with Subtitles to a Video",
          "value": "addAudioWithSubtitlesToVideo",
          "action": "Add audio with subtitles to a video",
          "description": "Adds audio to your video and automatically generates and adds subtitles from the audio"
        },
        {
          "name": "Add Subtitles to a Video",
          "value": "addSubtitlesToVideo",
          "action": "Add subtitles to a video",
          "description": "Automatically generates and adds subtitles to your video"
        },
        {
          "name": "Add Subtitles to a Video From a File",
          "value": "addSubtitlesToVideoFromFile",
          "action": "Add subtitles to a video from a file",
          "description": "Automatically generates and adds subtitles to your video"
        },
        {
          "name": "Add Watermark to a Video",
          "value": "addWatermarkToVideo",
          "action": "Add a watermark to a video",
          "description": "Places an image as a watermark on the video at specified coordinates"
        },
        {
          "name": "Blur a Video",
          "value": "blurVideo",
          "action": "Blur a video",
          "description": "Apply a blur effect to a specific area of a video"
        },
        {
          "name": "Clip a Video",
          "value": "clipVideo",
          "action": "Clip a video",
          "description": "Extract a clip from a video using a start time and duration"
        },
        {
          "name": "Create a Slideshow",
          "value": "createSlideshow",
          "action": "Create a slideshow",
          "description": "Creates a video slideshow from images, videos, or a combination of both"
        },
        {
          "name": "Crop a Video",
          "value": "cropVideo",
          "action": "Crop a video",
          "description": "Crops the video to a specific area using custom coordinates and dimensions"
        },
        {
          "name": "Extract Audio From a Video",
          "value": "extractAudioFromVideo",
          "action": "Extract audio from a video",
          "description": "Separates and saves the audio track from a video file"
        },
        {
          "name": "Frame a Video",
          "value": "frameVideo",
          "action": "Frame a video",
          "description": "Extract a single frame from a video at a specified timestamp and save it as an image"
        },
        {
          "name": "Generate a Video",
          "value": "generateVideo",
          "action": "Generate a video",
          "description": "Create a video from images and video clips, generate and add a voice-over with automated subtitles, and integrate background music"
        },
        {
          "name": "Get a Specific Video",
          "value": "getVideo",
          "action": "Get a video",
          "description": "Fetches video data from the API using the video ID"
        },
        {
          "name": "Mute a Video",
          "value": "muteVideo",
          "action": "Mute a video",
          "description": "Mute the video's audio by reducing the volume to zero"
        },
        {
          "name": "Overlay Videos",
          "value": "overlayVideos",
          "action": "Overlay videos",
          "description": "Overlay one video on top of another at a specified position"
        },
        {
          "name": "Rotate a Video",
          "value": "rotateVideo",
          "action": "Rotate a video",
          "description": "Rotate a video by 90, 180, or 270 degrees clockwise"
        },
        {
          "name": "Scale a Video",
          "value": "scaleVideo",
          "action": "Scale a video",
          "description": "Scale a video to different dimensions with various scaling modes"
        },
        {
          "name": "Split a Video Into Scenes",
          "value": "splitVideoIntoScenes",
          "action": "Split a video into scenes",
          "description": "Automatically divide a video into multiple segments based on scene detection or fixed intervals"
        },
        {
          "name": "Stack Videos",
          "value": "stackVideos",
          "action": "Stack videos",
          "description": "Stack two videos together horizontally or vertically"
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "video"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Combine Sounds",
      "value": "combineSounds",
      "action": "Combine sounds",
      "description": "Merge multiple sound files into a single seamless audio track",
      "resource": "sound"
    },
    {
      "name": "Get a Specific Sound",
      "value": "getSound",
      "action": "Get a sound",
      "description": "Fetches sound data from the API using the sound ID",
      "resource": "sound"
    },
    {
      "name": "Create a Speech Synthesis",
      "value": "createSpeech",
      "action": "Create a speech synthesis",
      "description": "Synthesizes a text into speech",
      "resource": "speech"
    },
    {
      "name": "Get a Specific Speech",
      "value": "getSpeech",
      "action": "Get a speech",
      "description": "Fetches speech data from the API using the speech ID",
      "resource": "speech"
    },
    {
      "name": "Create a Speech Dialogue",
      "value": "createSpeechDialogue",
      "action": "Create a speech dialogue",
      "description": "Generate a conversation between multiple AI voices from text",
      "resource": "speech_dialogue"
    },
    {
      "name": "Get a Specific Speech Dialogue",
      "value": "getSpeechDialogue",
      "action": "Get a speech dialogue",
      "description": "Fetches speech dialogue data from the API using the speech dialogue ID",
      "resource": "speech_dialogue"
    },
    {
      "name": "Generate a Subtitle File",
      "value": "generateSubtitleFile",
      "action": "Generate a subtitle file",
      "description": "Generate subtitle files in multiple formats from a video or audio URL",
      "resource": "file"
    },
    {
      "name": "Get a Specific Subtitle File",
      "value": "getSubtitleFile",
      "action": "Get a subtitle file",
      "description": "Fetches subtitle file data from the API using the subtitle file ID",
      "resource": "file"
    },
    {
      "name": "Transcribe Audio or Video",
      "value": "createTranscript",
      "action": "Transcribe audio or video",
      "description": "Transcribe your audio or video files into clear, accurate text with timestamps",
      "resource": "transcript"
    },
    {
      "name": "Get a Specific Transcription",
      "value": "getTranscript",
      "action": "Get a transcription",
      "description": "Fetches transcript data from the API using the transcript ID",
      "resource": "transcript"
    },
    {
      "name": "Add Audio to a Video",
      "value": "addAudioToVideo",
      "action": "Add audio to a video",
      "description": "Seamlessly add audio tracks to your video",
      "resource": "video"
    },
    {
      "name": "Add Audio with Subtitles to a Video",
      "value": "addAudioWithSubtitlesToVideo",
      "action": "Add audio with subtitles to a video",
      "description": "Adds audio to your video and automatically generates and adds subtitles from the audio",
      "resource": "video"
    },
    {
      "name": "Add Subtitles to a Video",
      "value": "addSubtitlesToVideo",
      "action": "Add subtitles to a video",
      "description": "Automatically generates and adds subtitles to your video",
      "resource": "video"
    },
    {
      "name": "Add Subtitles to a Video From a File",
      "value": "addSubtitlesToVideoFromFile",
      "action": "Add subtitles to a video from a file",
      "description": "Automatically generates and adds subtitles to your video",
      "resource": "video"
    },
    {
      "name": "Add Watermark to a Video",
      "value": "addWatermarkToVideo",
      "action": "Add a watermark to a video",
      "description": "Places an image as a watermark on the video at specified coordinates",
      "resource": "video"
    },
    {
      "name": "Blur a Video",
      "value": "blurVideo",
      "action": "Blur a video",
      "description": "Apply a blur effect to a specific area of a video",
      "resource": "video"
    },
    {
      "name": "Clip a Video",
      "value": "clipVideo",
      "action": "Clip a video",
      "description": "Extract a clip from a video using a start time and duration",
      "resource": "video"
    },
    {
      "name": "Create a Slideshow",
      "value": "createSlideshow",
      "action": "Create a slideshow",
      "description": "Creates a video slideshow from images, videos, or a combination of both",
      "resource": "video"
    },
    {
      "name": "Crop a Video",
      "value": "cropVideo",
      "action": "Crop a video",
      "description": "Crops the video to a specific area using custom coordinates and dimensions",
      "resource": "video"
    },
    {
      "name": "Extract Audio From a Video",
      "value": "extractAudioFromVideo",
      "action": "Extract audio from a video",
      "description": "Separates and saves the audio track from a video file",
      "resource": "video"
    },
    {
      "name": "Frame a Video",
      "value": "frameVideo",
      "action": "Frame a video",
      "description": "Extract a single frame from a video at a specified timestamp and save it as an image",
      "resource": "video"
    },
    {
      "name": "Generate a Video",
      "value": "generateVideo",
      "action": "Generate a video",
      "description": "Create a video from images and video clips, generate and add a voice-over with automated subtitles, and integrate background music",
      "resource": "video"
    },
    {
      "name": "Get a Specific Video",
      "value": "getVideo",
      "action": "Get a video",
      "description": "Fetches video data from the API using the video ID",
      "resource": "video"
    },
    {
      "name": "Mute a Video",
      "value": "muteVideo",
      "action": "Mute a video",
      "description": "Mute the video's audio by reducing the volume to zero",
      "resource": "video"
    },
    {
      "name": "Overlay Videos",
      "value": "overlayVideos",
      "action": "Overlay videos",
      "description": "Overlay one video on top of another at a specified position",
      "resource": "video"
    },
    {
      "name": "Rotate a Video",
      "value": "rotateVideo",
      "action": "Rotate a video",
      "description": "Rotate a video by 90, 180, or 270 degrees clockwise",
      "resource": "video"
    },
    {
      "name": "Scale a Video",
      "value": "scaleVideo",
      "action": "Scale a video",
      "description": "Scale a video to different dimensions with various scaling modes",
      "resource": "video"
    },
    {
      "name": "Split a Video Into Scenes",
      "value": "splitVideoIntoScenes",
      "action": "Split a video into scenes",
      "description": "Automatically divide a video into multiple segments based on scene detection or fixed intervals",
      "resource": "video"
    },
    {
      "name": "Stack Videos",
      "value": "stackVideos",
      "action": "Stack videos",
      "description": "Stack two videos together horizontally or vertically",
      "resource": "video"
    }
  ]

npm_readme:
  # n8n-nodes-bookoly

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

  bookoly is a service that makes it easy to create, edit, and process your content automatically.
  With bookoly, you can generate slideshows, add subtitles, create voice-overs, split videos into multiple scenes, and 
  a lot more — all through a simple API.

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

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

  ## Installation

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

  ## Operations

  ### 🎞️ Video

  * **Add Audio to a Video** – Add background music or a voice-over to a video.
  * **Add Audio with Subtitles to a Video** – Add a voice-over and automatically generate and add subtitles from the audio.
  * **Add Subtitles to a Video** – Automatically generate subtitles from the video’s audio and insert them into the file.
  * **Add Subtitles to a Video from a File** – Import and embed an external subtitle file (e.g. `.srt`, `.ass`) into a video.
  * **Add Watermark to a Video** – Overlay an image or text watermark onto a video.
  * **Blur a Video** – Apply a blur effect to the entire video or selected regions.
  * **Clip a Video** – Extract a specific section of a video by start time and duration.
  * **Create a Slideshow** – Generate a slideshow video from multiple images and video clips.
  * **Crop a Video** – Trim away unwanted edges of a video by defining crop dimensions.
  * **Extract Audio from a Video** – Save the audio track of a video as a separate sound file.
  * **Frame a Video** – Capture a single image from a video at the desired timestamp.
  * **Generate a Video** – Create a video from images and video clips with a voice-over and subtitles.
  * **Mute a Video** – Set the volume of a video to 0%.
  * **Overlay Videos** – Overlay one video on top of another at a specified position with customizable scale and offset.
  * **Rotate a Video** – Rotate a video by 90, 180, or 270 degrees.
  * **Scale a Video** – Scale videos to different dimensions using various scaling modes (fit, fill, exact, etc.).
  * **Split a Video into Scenes** – Split a video by automatic scene detection, fixed time intervals, or equal segments.
  * **Stack Videos** – Stack two videos together horizontally or vertically.

  ### 🎙️️ Speech

  * **Create a Speech Synthesis** – Convert text into a natural-sounding speech with AI.

  ### 🗣️ Speech Dialogue

  * **Create a Speech Dialogue** – Generate a conversation between multiple AI voices.

  ### 📜 Transcript

  * **Transcribe Media** – Automatically transcribe the audio from a video or audio file.

  ### 🎼 Sound

  * **Combine Sounds** – Merge two or more audio files into a single track.

  ### 📂 File

  * **Generate a Subtitle File** – Create a subtitle file (e.g. `.srt`, `.vtt`) from a video or audio file.

  ## Credentials

  To use the bookoly node, you need an API token:

  1. Sign up for an account at [bookoly](https://bookoly.com).
  2. Open your profile from the left menu and scroll down to the API Tokens section.
  3. Create a new API token. 
     * Enable all permissions.
     * (Optional) Set an expiration date.
  4. Copy the token and store it in a safe place.
  5. In n8n, create new credentials for bookoly and paste your token.

  ## Compatibility

  * Minimum n8n version: 1.106.3
  * Tested with: n8n 1.106.3+
  * Known issues: None at this time.

  ## Usage

  Once installed, you can add the bookoly node to your workflow to automate content generation and processing.

  📺 To see all examples in action check out the full bookoly YouTube tutorial [playlist](https://www.youtube.com/playlist?list=PLaZXufV_18nEQ_P79pD3ccuR8xQwjcJqu)

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

  ## Resources

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

  ## Version history

  1.0.19
  * Added 'Stack Videos' operation to stack two videos horizontally or vertically.
  * Added 'Overlay Videos' operation to overlay one video on top of another with position, scale, and offset options.
  * Added 'Scale a Video' operation with multiple scaling modes (scale to width/height, fit, fill, exact, keep aspect ratio).
  * Removed 'Create a Sound Effect' operation.

  1.0.18
  * Add the voice option 'None' for speech synthesis

  1.0.17
  * Enhanced speech synthesis with 38 premium AI voices for more natural and diverse text-to-speech output.

  1.0.16
  * Fix type for subtitle text case

  1.0.15
  * Performance improvements and bug fixes

  1.0.14
  * Replace hardcoded default values with enums

  1.0.13
  * Minor performance improvements

  1.0.12
  * Minor performance improvements and bug fixes 

  1.0.11
  * Improved the 'Generate a Video' node for more flexibility.
  * Added punctuation and text case options for subtitles.
  * Added mute option for scenes.
  * Added transitions that can be used between scenes.

  1.0.10
  * Handle errors with continueOnFail

  1.0.9
  * Added 'Create a speech dialogue' action.
  * Updated 'Combine sounds' action, to expect JSON input for Audio.

  1.0.8
  * Update youtube playlist url in readme.

  1.0.7
  * Refine video clip parameters for clarity.

  1.0.6
  * Change scenes type from fixedCollection to json.

  1.0.5
  * Make the bookoly node usable as a tool.

  1.0.4
  * Initial release with support for all bookoly operations.

ai_documentation_summary:
  {"purpose":"This n8n community node enables automation of video, audio, and speech processing tasks by interfacing with the Bookoly API.","capabilities":["Add audio or voice-over to videos","Generate and add subtitles to videos","Create slideshows from images and video clips","Extract audio from videos","Perform speech synthesis (text-to-speech)","Generate speech dialogues with multiple AI voices","Transcribe audio from media files","Combine and edit audio files","Apply video effects (blur, watermark, rotate, scale)","Split videos into scenes"],"authentication":"API token required","commonUseCases":["Automated video editing for social media content","Creating voice-over videos from text","Generating subtitles for video content","Producing slideshow presentations","Audio file merging and processing"],"limitations":["Requires a paid account with API token from Bookoly","Some features may require premium voices or permissions"],"relatedNodes":["n8n-nodes-core.code","n8n-nodes-core.httpRequest","n8n-nodes-core.waitUntil"]}


node_type: @wizaco/n8n-nodes-wiza.wiza
package_name: @wizaco/n8n-nodes-wiza
display_name: Wiza
description: Interact with Wiza API for contact enrichment
category: Community
development_style: declarative
version: 1
credentials_required: []
outputs:
  [
  "main"
  ]

updated_at: 2026-07-14 14:40:33
author_name: kal9000
author_github_url: https://github.com/WizaCo/n8n-nodes-wiza.git
npm_package_name: @wizaco/n8n-nodes-wiza
npm_version: 0.1.4
community_fetched_at: 2026-07-14T14:40:33.380Z
ai_summary_generated_at: 2026-03-25 22:51:43
properties_schema:
  [
    {
      "name": "operation",
      "type": "options",
      "default": "emailFinder",
      "options": [
        {
          "name": "Email Finder",
          "value": "emailFinder",
          "action": "Find verified work and personal email addresses for a contact using their name company information or linked in url",
          "description": "Find verified work and personal email addresses for a contact using their name, company information, or LinkedIn URL"
        },
        {
          "name": "Phone Finder",
          "value": "phoneFinder",
          "action": "Find mobile and direct dial phone numbers for a contact using their name company information or linkedin url",
          "description": "Find mobile and direct dial phone numbers for a contact using their name, company information, or LinkedIn URL"
        },
        {
          "name": "LinkedIn Profile Finder",
          "value": "linkedinFinder",
          "action": "Find contact linkedin profile url and key details such as job title company and location using their name company or email address",
          "description": "Find a contact's LinkedIn profile URL and key details—such as job title, company, and location—using their name, company, or email address"
        }
      ],
      "displayName": "Operation",
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "Email Finder",
      "value": "emailFinder",
      "action": "Find verified work and personal email addresses for a contact using their name company information or linked in url",
      "description": "Find verified work and personal email addresses for a contact using their name, company information, or LinkedIn URL"
    },
    {
      "name": "Phone Finder",
      "value": "phoneFinder",
      "action": "Find mobile and direct dial phone numbers for a contact using their name company information or linkedin url",
      "description": "Find mobile and direct dial phone numbers for a contact using their name, company information, or LinkedIn URL"
    },
    {
      "name": "LinkedIn Profile Finder",
      "value": "linkedinFinder",
      "action": "Find contact linkedin profile url and key details such as job title company and location using their name company or email address",
      "description": "Find a contact's LinkedIn profile URL and key details—such as job title, company, and location—using their name, company, or email address"
    }
  ]

npm_readme:
  # n8n-nodes-wiza

  An n8n community node for integrating with the [Wiza](https://wiza.co) contact enrichment API. Find email addresses, phone numbers, and LinkedIn profiles for your prospects using multiple data sources.

  ![Wiza Logo](https://wiza.co/favicon.png)

  ## Features

  ### 🔍 **Email Finder**
  Find verified work and personal email addresses using:
  - LinkedIn profile URLs
  - Contact details (name + company/domain)
  - Multiple data points for best results

  ### 📞 **Phone Finder**
  Find mobile and direct dial phone numbers using:
  - Email addresses
  - LinkedIn profile URLs  
  - Contact details (name + company/domain)
  - Multiple data points for best results

  ### 💼 **LinkedIn Profile Finder**
  Find LinkedIn profiles and extract key details using:
  - Email addresses
  - LinkedIn URLs (for enhanced profile data)
  - Contact details (name + company/domain)
  - Multiple data points for best results

  ## Installation

  ### Community Nodes (Recommended)

  1. Go to **Settings > Community Nodes** in your n8n instance
  2. Select **Install a community node**
  3. Enter `@wizaco/n8n-nodes-wiza`
  4. Click **Install**

  ### Manual Installation

  ```bash
  # In your n8n root directory
  npm install @wizaco/n8n-nodes-wiza
  ```

  ### Docker

  ```bash
  # Using environment variable
  N8N_NODES_INCLUDE=@wizaco/n8n-nodes-wiza

  # Or in docker-compose.yml
  environment:
    N8N_NODES_INCLUDE: "@wizaco/n8n-nodes-wiza"
  ```

  ## Setup

  ### 1. Get Your API Key

  1. Sign up at [wiza.co](https://wiza.co)
  2. Navigate to **Settings > API** 
  3. Generate your API key

  ### 2. Configure Credentials

  1. In n8n, go to **Credentials**
  2. Click **Create New** 
  3. Search for **Wiza API**
  4. Enter your API key
  5. Click **Save**

  ## Usage

  ### Basic Email Finding

  ```json
  {
    "operation": "Email Finder",
    "inputType": "Contact Details", 
    "fullName": "John Doe",
    "company": "Acme Corp"
  }
  ```

  ### Phone Number Lookup

  ```json
  {
    "operation": "Phone Finder",
    "inputType": "Email",
    "email": "john@acme.com"
  }
  ```

  ### LinkedIn Profile Enhancement

  ```json
  {
    "operation": "LinkedIn Profile Finder", 
    "inputType": "All Fields",
    "email": "john@acme.com",
    "fullName": "John Doe",
    "company": "acme.com"
  }
  ```

  ## Input Types

  ### 📧 **Email**
  Provide an email address to find phone numbers or LinkedIn profiles.

  ### 🔗 **LinkedIn URL** 
  Provide a LinkedIn profile URL to find emails, phone numbers, or enhanced profile data.

  ### 👤 **Contact Details**
  Provide name and company/domain to find emails, phone numbers, or LinkedIn profiles.

  ### 🎯 **All Fields** *(Recommended)*
  Provide any combination of email, LinkedIn URL, name, and company for best results. All fields are optional - the more data you provide, the better the results.

  ## Response Data

  ### Email Finder Response
  ```json
  {
    "email": "john@acme.com",
    "email_type": "work", 
    "email_status": "valid",
    "name": "John Doe",
    "company": "Acme Corp",
    "title": "CEO",
    "linkedin_profile_url": "https://linkedin.com/in/johndoe"
  }
  ```

  ### Phone Finder Response  
  ```json
  {
    "phone_number": "+1234567890",
    "phone_status": "found",
    "mobile_phone": "+1234567890", 
    "name": "John Doe",
    "company": "Acme Corp",
    "email": "john@acme.com"
  }
  ```

  ### LinkedIn Profile Finder Response
  ```json
  {
    "linkedin_profile_url": "https://linkedin.com/in/johndoe",
    "name": "John Doe", 
    "title": "CEO",
    "company": "Acme Corp",
    "location": "New York, NY",
    "company_domain": "acme.com"
  }
  ```

  ## Configuration Options

  ### **Timeout**
  - **Default**: 300 seconds (5 minutes)
  - **Description**: Maximum time to wait for enrichment completion
  - **Range**: 30-600 seconds

  ### **Email Type** *(Email Finder only)*
  - **Work**: Professional emails (john@company.com)
  - **Personal**: Personal emails (john.doe@gmail.com) 
  - **Any**: Both work and personal emails

  ## Error Handling

  The node handles various error scenarios:

  - **Invalid API Key**: Check your credentials
  - **Rate Limiting**: Automatic retry with backoff
  - **Timeout**: Enrichment took too long to complete
  - **No Results**: No data found for the provided input
  - **Invalid Input**: Missing required fields or invalid format

  ## Workflow Examples

  ### Lead Enrichment Pipeline
  ```
  Webhook → Wiza Email Finder → Wiza Phone Finder → CRM Update
  ```

  ### LinkedIn Outreach Prep
  ```
  CSV Import → Wiza LinkedIn Finder → Message Personalization → LinkedIn Automation
  ```

  ### Data Validation Flow
  ```
  Database Query → Wiza Email Finder → Email Validation → Clean Database Update
  ```

  ## Support

  - **Documentation**: [wiza.co/api-docs](https://wiza.co/api-docs)
  - **Issues**: [GitHub Issues](https://github.com/WizaCo/n8n-nodes-wiza/issues)
  - **Wiza Support**: hello@wiza.com

  ## License

  [MIT](LICENSE.md)

  ## Contributing

  Contributions are welcome! Please read our [contributing guidelines](CODE_OF_CONDUCT.md) and submit pull requests to the main repository.

  ---

  Made with ❤️ by the Wiza team

ai_documentation_summary:
  {"purpose":"This n8n community node integrates with the Wiza API to enrich contact data by finding verified email addresses, phone numbers, and LinkedIn profiles for prospects.","capabilities":["Find verified work and personal email addresses from LinkedIn URLs, contact details, or other emails","Discover mobile and direct dial phone numbers using email addresses, LinkedIn URLs, or contact details","Locate and extract LinkedIn profile details including name, title, location, and company domain","Support multiple input types: Email, LinkedIn URL, Contact Details (Name + Company), or All Fields","Configure timeout settings (30-600 seconds) for enrichment operations","Filter email types: Work, Personal, or Any"],"authentication":"API key required via n8n Credentials","commonUseCases":["Lead enrichment pipelines for sales teams","Personalizing LinkedIn outreach messages","Validating and cleaning contact databases","Finding missing contact information for cold outreach"],"limitations":["Results depend on the quality and availability of provided input data","May encounter rate limiting which triggers automatic retries","Enrichment can take up to 5 minutes (timeout setting) to complete","No results may occur if input data is insufficient or unavailable in Wiza's database"],"relatedNodes":["Webhook","CRM Update","CSV Import","Email Validation","LinkedIn Automation"]}


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

updated_at: 2026-07-14 14:40:33
author_name: paugc
author_github_url: https://github.com/getlatedev/
npm_package_name: n8n-nodes-late
npm_version: 0.7.1
community_fetched_at: 2026-07-14T14:40:33.381Z
ai_summary_generated_at: 2026-03-25 22:47:20
description:
  Schedule and manage social media posts across multiple platforms with Zernio - supporting Twitter/X, Instagram, Facebook, LinkedIn, TikTok, YouTube, Threads, Bluesky, Pinterest, Reddit, Telegram, Google Business, and Snapchat

properties_schema:
  [
    {
      "name": "resource",
      "type": "options",
      "default": "profiles",
      "options": [
        {
          "name": "Profiles",
          "value": "profiles",
          "description": "Organize your social media accounts into profiles for managing multiple brands, clients, or personal accounts separately"
        },
        {
          "name": "Posts",
          "value": "posts",
          "description": "Create, schedule, and manage social media posts across multiple platforms with advanced features like threads, stories, and platform-specific settings"
        },
        {
          "name": "Media",
          "value": "media",
          "description": "Upload images and videos up to 5GB for use in your social media posts with automatic optimization"
        },
        {
          "name": "Social Accounts",
          "value": "accounts",
          "description": "Manage connected social media accounts, view their status, and disconnect accounts when needed"
        },
        {
          "name": "Connect Platform",
          "value": "connect",
          "description": "Initiate OAuth flows to connect new social media platforms (Twitter/X, Instagram, Facebook, LinkedIn, TikTok, YouTube, Threads)"
        },
        {
          "name": "Usage Statistics",
          "value": "usage",
          "description": "Monitor your current usage against plan limits including uploads, profiles, and billing information"
        },
        {
          "name": "Facebook Management",
          "value": "facebook",
          "description": "Manage Facebook pages, select which page to post to, and handle Facebook-specific settings"
        },
        {
          "name": "LinkedIn Management",
          "value": "linkedin",
          "description": "Switch between personal and company posting, manage LinkedIn organization settings"
        },
        {
          "name": "Clone Connection",
          "value": "clone",
          "description": "Reuse OAuth connections across multiple profiles while targeting different pages or organizations"
        },
        {
          "name": "Webhooks",
          "value": "webhooks",
          "description": "Configure webhook notifications for post events, account changes, and messages"
        },
        {
          "name": "Queue",
          "value": "queue",
          "description": "Manage queue slots for automated posting schedules across your accounts"
        },
        {
          "name": "Account Groups",
          "value": "accountGroups",
          "description": "Create and manage groups of accounts for bulk operations and organized posting"
        },
        {
          "name": "Analytics",
          "value": "analytics",
          "description": "View post performance analytics and engagement metrics across platforms"
        },
        {
          "name": "Bluesky Management",
          "value": "bluesky",
          "description": "Connect and manage Bluesky accounts using app passwords"
        },
        {
          "name": "Pinterest Management",
          "value": "pinterest",
          "description": "Manage Pinterest boards and select which board to post to"
        },
        {
          "name": "Reddit Management",
          "value": "reddit",
          "description": "Manage saved subreddits and search for Reddit communities"
        },
        {
          "name": "Telegram Management",
          "value": "telegram",
          "description": "Connect and manage Telegram channels for posting"
        },
        {
          "name": "Google Business Management",
          "value": "googlebusiness",
          "description": "Manage Google Business locations and respond to reviews"
        },
        {
          "name": "Snapchat Management",
          "value": "snapchat",
          "description": "Connect and manage Snapchat profiles for posting"
        },
        {
          "name": "Invites",
          "value": "invites",
          "description": "Create invite tokens to grant team members access to profiles"
        },
        {
          "name": "Logs",
          "value": "logs",
          "description": "View publishing logs with detailed information about each publishing attempt"
        },
        {
          "name": "API Keys",
          "value": "apiKeys",
          "description": "Manage API keys for programmatic access to the Late API"
        },
        {
          "name": "Users",
          "value": "users",
          "description": "View users and team members with access to your account"
        },
        {
          "name": "Tools",
          "value": "tools",
          "description": "Manage tools"
        }
      ],
      "displayName": "Resource",
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List profiles",
          "routing": {
            "request": {
              "qs": {
                "includeOverLimit": "={{ $parameter.includeOverLimit || false }}"
              },
              "url": "/profiles",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create profile",
          "routing": {
            "request": {
              "url": "/profiles",
              "body": {
                "name": "={{ $parameter.name }}",
                "color": "={{ $parameter.color || '' }}",
                "description": "={{ $parameter.description || '' }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}",
              "body": {
                "name": "={{ $parameter.name || undefined }}",
                "color": "={{ $parameter.color || undefined }}",
                "isDefault": "={{ $parameter.isDefault ?? undefined }}",
                "description": "={{ $parameter.description || undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "profiles"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List posts",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page || 1 }}",
                "limit": "={{ $parameter.limit || 10 }}",
                "dateTo": "={{ $parameter.dateTo || undefined }}",
                "search": "={{ $parameter.search || undefined }}",
                "sortBy": "={{ $parameter.sortBy || undefined }}",
                "status": "={{ $parameter.status || undefined }}",
                "dateFrom": "={{ $parameter.dateFrom || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "createdBy": "={{ $parameter.createdBy || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}",
                "includeHidden": "={{ $parameter.includeHidden ?? undefined }}"
              },
              "url": "/posts",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get post",
          "routing": {
            "request": {
              "url": "=/posts/{{ $parameter.postId }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create post",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/posts",
              "method": "POST",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update post",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}",
              "method": "PUT",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete post",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}",
              "method": "DELETE",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Retry",
          "value": "retry",
          "action": "Retry failed post",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}/retry",
              "method": "POST",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Unpublish",
          "value": "unpublish",
          "action": "Unpublish post",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "=/posts/{{ $parameter.postId }}/unpublish",
              "body": {
                "platform": "={{ $parameter.unpublishPlatform }}"
              },
              "method": "POST",
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Bulk Upload",
          "value": "bulkUpload",
          "action": "Bulk upload posts from CSV",
          "routing": {
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "qs": {
                "dryRun": "={{ $parameter.dryRun || false }}"
              },
              "url": "/posts/bulk-upload",
              "body": {
                "file": "={{ { value: $parameter.csvFile, options: { filename: 'bulk-upload.csv', contentType: 'text/csv' } } }}"
              },
              "method": "POST",
              "headers": {
                "Content-Type": "multipart/form-data"
              },
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Get Logs",
          "value": "logs",
          "action": "Get post publishing logs",
          "routing": {
            "request": {
              "url": "=/posts/{{ $parameter.postId }}/logs",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "posts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "upload",
      "options": [
        {
          "name": "Upload",
          "value": "upload",
          "action": "Upload media",
          "routing": {
            "send": {
              "preSend": [
                null
              ]
            },
            "output": {
              "postReceive": [
                null
              ]
            },
            "request": {
              "url": "/media",
              "method": "POST",
              "headers": {
                "Content-Type": "multipart/form-data"
              },
              "returnFullResponse": true,
              "ignoreHttpStatusErrors": true
            }
          }
        },
        {
          "name": "Get Presigned URL",
          "value": "presign",
          "action": "Get presigned URL for direct upload",
          "routing": {
            "request": {
              "url": "/media/presign",
              "body": {
                "size": "={{ $parameter.size }}",
                "filename": "={{ $parameter.filename }}",
                "contentType": "={{ $parameter.contentType }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "media"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List social accounts",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/accounts",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get account details",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "body": {
                "isActive": "={{ $parameter.isActive }}",
                "displayName": "={{ $parameter.displayName || undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Disconnect account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Get Health",
          "value": "health",
          "action": "Check account health",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/health",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get All Health",
          "value": "allHealth",
          "action": "Check all accounts health",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/accounts/health",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Follower Stats",
          "value": "followerStats",
          "action": "Get follower statistics",
          "routing": {
            "request": {
              "qs": {
                "accountId": "={{ $parameter.accountId || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/accounts/follower-stats",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "accounts"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getConnectUrl",
      "options": [
        {
          "name": "Get Connect URL",
          "value": "getConnectUrl",
          "action": "Get OAuth connect URL",
          "routing": {
            "request": {
              "qs": {
                "headless": "={{ $parameter.headless || undefined }}",
                "profileId": "={{ $parameter.profileId }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
              },
              "url": "=/connect/{{ $parameter.platform }}",
              "method": "GET"
            }
          }
        },
        {
          "name": "Complete OAuth Callback",
          "value": "handleOAuthCallback",
          "action": "Complete OAuth callback",
          "routing": {
            "request": {
              "url": "=/connect/{{ $parameter.platform }}",
              "body": {
                "code": "={{ $parameter.code }}",
                "state": "={{ $parameter.state }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Facebook Pages (Headless)",
          "value": "listFacebookPages",
          "action": "List Facebook pages",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/facebook/select-page",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Facebook Page (Headless)",
          "value": "selectFacebookPage",
          "action": "Select Facebook page",
          "routing": {
            "request": {
              "url": "/connect/facebook/select-page",
              "body": {
                "pageId": "={{ $parameter.pageId }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ $parameter.userProfile || undefined }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Google Business Locations (Headless)",
          "value": "listGoogleBusinessLocations",
          "action": "List GBP locations",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/googlebusiness/locations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Google Business Location (Headless)",
          "value": "selectGoogleBusinessLocation",
          "action": "Select GBP location",
          "routing": {
            "request": {
              "url": "/connect/googlebusiness/select-location",
              "body": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "locationId": "={{ $parameter.locationId }}",
                "userProfile": "={{ $parameter.userProfile }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Get Pending OAuth Data (Headless)",
          "value": "getPendingOAuthData",
          "action": "Get pending OAuth data",
          "routing": {
            "request": {
              "qs": {
                "token": "={{ $parameter.token }}"
              },
              "url": "/connect/pending-data",
              "method": "GET"
            }
          }
        },
        {
          "name": "List LinkedIn Organizations (Details)",
          "value": "listLinkedInOrganizations",
          "action": "List LinkedIn orgs",
          "routing": {
            "request": {
              "qs": {
                "orgIds": "={{ $parameter.orgIds }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/linkedin/organizations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select LinkedIn Organization",
          "value": "selectLinkedInOrganization",
          "action": "Select LinkedIn org",
          "routing": {
            "request": {
              "url": "/connect/linkedin/select-organization",
              "body": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "accountType": "={{ $parameter.accountType }}",
                "userProfile": "={{ $parameter.userProfile }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
                "selectedOrganization": "={{ $parameter.selectedOrganization || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Pinterest Boards (Headless)",
          "value": "listPinterestBoardsForSelection",
          "action": "List Pinterest boards",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/pinterest/select-board",
              "method": "GET",
              "headers": {
                "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
              }
            }
          }
        },
        {
          "name": "Select Pinterest Board (Headless)",
          "value": "selectPinterestBoard",
          "action": "Select Pinterest board",
          "routing": {
            "request": {
              "url": "/connect/pinterest/select-board",
              "body": {
                "boardId": "={{ $parameter.boardId }}",
                "boardName": "={{ $parameter.boardName || undefined }}",
                "expiresIn": "={{ $parameter.expiresIn || undefined }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ $parameter.userProfile || undefined }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
                "refreshToken": "={{ $parameter.refreshToken || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Snapchat Profiles (Headless)",
          "value": "listSnapchatProfiles",
          "action": "List Snapchat profiles",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/snapchat/select-profile",
              "method": "GET",
              "headers": {
                "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
              }
            }
          }
        },
        {
          "name": "Select Snapchat Profile (Headless)",
          "value": "selectSnapchatProfile",
          "action": "Select Snapchat profile",
          "routing": {
            "request": {
              "url": "/connect/snapchat/select-profile",
              "body": {
                "expiresIn": "={{ $parameter.expiresIn || undefined }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ $parameter.userProfile }}",
                "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
                "refreshToken": "={{ $parameter.refreshToken || undefined }}",
                "selectedPublicProfile": "={{ $parameter.selectedPublicProfile }}"
              },
              "method": "POST",
              "headers": {
                "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
              }
            }
          }
        },
        {
          "name": "Connect Bluesky via Credentials",
          "value": "connectBlueskyCredentials",
          "action": "Connect Bluesky account",
          "routing": {
            "request": {
              "url": "/connect/bluesky/credentials",
              "body": {
                "state": "={{ $parameter.state }}",
                "identifier": "={{ $parameter.identifier }}",
                "appPassword": "={{ $parameter.appPassword }}",
                "redirectUri": "={{ $parameter.redirectUri || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Connect WhatsApp via Credentials",
          "value": "connectWhatsAppCredentials",
          "action": "Connect WhatsApp via credentials",
          "routing": {
            "request": {
              "url": "/connect/whatsapp/credentials",
              "body": {
                "wabaId": "={{ $parameter.wabaId }}",
                "profileId": "={{ $parameter.profileId }}",
                "accessToken": "={{ $parameter.accessToken }}",
                "phoneNumberId": "={{ $parameter.phoneNumberId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Generate Telegram Code",
          "value": "getTelegramConnectStatus",
          "action": "Generate Telegram code",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/connect/telegram",
              "method": "GET"
            }
          }
        },
        {
          "name": "Connect Telegram Directly",
          "value": "initiateTelegramConnect",
          "action": "Connect Telegram directly",
          "routing": {
            "request": {
              "url": "/connect/telegram",
              "body": {
                "chatId": "={{ $parameter.chatId }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Check Telegram Status",
          "value": "completeTelegramConnect",
          "action": "Check Telegram status",
          "routing": {
            "request": {
              "qs": {
                "code": "={{ $parameter.code }}"
              },
              "url": "/connect/telegram",
              "method": "PATCH"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "connect"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStats",
      "options": [
        {
          "name": "Get Stats",
          "value": "getStats",
          "action": "Get usage statistics",
          "routing": {
            "request": {
              "url": "/usage-stats",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Usage Stats",
          "value": "getUsageStats",
          "action": "Get plan and usage stats",
          "routing": {
            "request": {
              "url": "/usage-stats",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "usage"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listPages",
      "options": [
        {
          "name": "List Pages",
          "value": "listPages",
          "action": "List Facebook pages",
          "routing": {
            "request": {
              "qs": {
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/facebook/select-page",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Page",
          "value": "selectPage",
          "action": "Select Facebook page",
          "routing": {
            "request": {
              "url": "/connect/facebook/select-page",
              "body": {
                "pageId": "={{ $parameter.pageId }}",
                "profileId": "={{ $parameter.profileId }}",
                "tempToken": "={{ $parameter.tempToken }}",
                "userProfile": "={{ { id: $parameter.userProfileId || '', name: $parameter.userProfileName || '', email: $parameter.userProfileEmail || '', picture: $parameter.userProfilePicture || '', accessToken: $parameter.userProfileAccessToken || '' } }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Account Pages",
          "value": "listAccountPages",
          "action": "List Facebook pages for account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update Page",
          "value": "updatePage",
          "action": "Update Facebook page",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
              "body": {
                "selectedPageId": "={{ $parameter.selectedPageId }}"
              },
              "method": "PUT"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "facebook"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "updateOrganization",
      "options": [
        {
          "name": "Update Organization",
          "value": "updateOrganization",
          "action": "Update LinkedIn organization",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/linkedin-organization",
              "body": {
                "accountType": "={{ $parameter.accountType }}",
                "selectedOrganization": "={{ { id: $parameter.organizationId || '', urn: $parameter.organizationUrn || '', name: $parameter.organizationName || '', logoUrl: $parameter.organizationLogoUrl || '', description: $parameter.organizationDescription || '' } }}"
              },
              "method": "PUT"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "linkedin"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "cloneConnection",
      "options": [
        {
          "name": "Clone Connection",
          "value": "cloneConnection",
          "action": "Clone connection to profile",
          "routing": {
            "request": {
              "url": "=/profiles/{{ $parameter.profileId }}/clone-connection",
              "body": {
                "targetPageId": "={{ $parameter.targetPageId || undefined }}",
                "targetPageName": "={{ $parameter.targetPageName || undefined }}",
                "sourceAccountId": "={{ $parameter.sourceAccountId }}",
                "targetAccountType": "={{ $parameter.targetAccountType || undefined }}",
                "targetOrganizationId": "={{ $parameter.targetOrganizationId || undefined }}",
                "targetOrganizationUrn": "={{ $parameter.targetOrganizationUrn || undefined }}",
                "targetPageAccessToken": "={{ $parameter.targetPageAccessToken || undefined }}",
                "targetOrganizationName": "={{ $parameter.targetOrganizationName || undefined }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "clone"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Settings",
          "value": "get",
          "action": "Get webhook settings",
          "routing": {
            "request": {
              "url": "/webhooks/settings",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create Settings",
          "value": "create",
          "action": "Create webhook settings",
          "routing": {
            "request": {
              "url": "/webhooks/settings",
              "body": {
                "url": "={{ $parameter.url }}",
                "name": "={{ $parameter.name || undefined }}",
                "events": "={{ $parameter.events || undefined }}",
                "secret": "={{ $parameter.secret || undefined }}",
                "isActive": "={{ $parameter.isActive }}",
                "customHeaders": "={{ $parameter.customHeaders || undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update Settings",
          "value": "update",
          "action": "Update webhook settings",
          "routing": {
            "request": {
              "url": "/webhooks/settings",
              "body": {
                "_id": "={{ $parameter.webhookId }}",
                "url": "={{ $parameter.url || undefined }}",
                "name": "={{ $parameter.name || undefined }}",
                "events": "={{ $parameter.events || undefined }}",
                "secret": "={{ $parameter.secret || undefined }}",
                "isActive": "={{ $parameter.isActive }}",
                "customHeaders": "={{ $parameter.customHeaders || undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete Settings",
          "value": "delete",
          "action": "Delete webhook settings",
          "routing": {
            "request": {
              "qs": {
                "id": "={{ $parameter.webhookId }}"
              },
              "url": "/webhooks/settings",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Test Webhook",
          "value": "test",
          "action": "Send test webhook",
          "routing": {
            "request": {
              "url": "/webhooks/test",
              "body": {
                "webhookId": "={{ $parameter.webhookId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Get Logs",
          "value": "logs",
          "action": "Get webhook delivery logs",
          "routing": {
            "request": {
              "qs": {
                "event": "={{ $parameter.event || undefined }}",
                "limit": "={{ $parameter.limit || 50 }}",
                "status": "={{ $parameter.status || undefined }}",
                "webhookId": "={{ $parameter.webhookId || undefined }}"
              },
              "url": "/webhooks/logs",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "webhooks"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List Slots",
          "value": "list",
          "action": "List queue slots",
          "routing": {
            "request": {
              "qs": {
                "all": "={{ $parameter.all ? 'true' : undefined }}",
                "queueId": "={{ $parameter.queueId || undefined }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/slots",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create Slot",
          "value": "create",
          "action": "Create queue slot",
          "routing": {
            "request": {
              "url": "/queue/slots",
              "body": {
                "name": "={{ $parameter.name }}",
                "slots": "={{ $parameter.slots }}",
                "active": "={{ $parameter.active }}",
                "timezone": "={{ $parameter.timezone }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update Slot",
          "value": "update",
          "action": "Update queue slot",
          "routing": {
            "request": {
              "url": "/queue/slots",
              "body": {
                "name": "={{ $parameter.name || undefined }}",
                "slots": "={{ $parameter.slots }}",
                "active": "={{ $parameter.active }}",
                "queueId": "={{ $parameter.queueId || undefined }}",
                "timezone": "={{ $parameter.timezone }}",
                "profileId": "={{ $parameter.profileId }}",
                "setAsDefault": "={{ $parameter.setAsDefault }}",
                "reshuffleExisting": "={{ $parameter.reshuffleExisting }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete Slot",
          "value": "delete",
          "action": "Delete queue slot",
          "routing": {
            "request": {
              "qs": {
                "queueId": "={{ $parameter.queueId }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/slots",
              "method": "DELETE"
            }
          }
        },
        {
          "name": "Preview Queue",
          "value": "preview",
          "action": "Preview upcoming queue posts",
          "routing": {
            "request": {
              "qs": {
                "count": "={{ $parameter.count || 20 }}",
                "queueId": "={{ $parameter.queueId || undefined }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/preview",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Next Slot",
          "value": "nextSlot",
          "action": "Get next available queue slot",
          "routing": {
            "request": {
              "qs": {
                "queueId": "={{ $parameter.queueId || undefined }}",
                "profileId": "={{ $parameter.profileId }}"
              },
              "url": "/queue/next-slot",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "queue"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List account groups",
          "routing": {
            "request": {
              "url": "/account-groups",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create account group",
          "routing": {
            "request": {
              "url": "/account-groups",
              "body": {
                "name": "={{ $parameter.name }}",
                "accountIds": "={{ $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Update",
          "value": "update",
          "action": "Update account group",
          "routing": {
            "request": {
              "url": "=/account-groups/{{ $parameter.groupId }}",
              "body": {
                "name": "={{ $parameter.name || undefined }}",
                "accountIds": "={{ $parameter.accountIds ? $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete account group",
          "routing": {
            "request": {
              "url": "=/account-groups/{{ $parameter.groupId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "accountGroups"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "get",
      "options": [
        {
          "name": "Get Analytics",
          "value": "get",
          "action": "Get post analytics",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page || undefined }}",
                "limit": "={{ $parameter.limit || undefined }}",
                "order": "={{ $parameter.order || undefined }}",
                "postId": "={{ $parameter.postId || undefined }}",
                "sortBy": "={{ $parameter.sortBy || undefined }}",
                "source": "={{ $parameter.source || undefined }}",
                "toDate": "={{ $parameter.toDate || undefined }}",
                "fromDate": "={{ $parameter.fromDate || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "accountId": "={{ $parameter.accountId || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics",
              "method": "GET"
            }
          }
        },
        {
          "name": "YouTube Daily Views",
          "value": "youtubeDailyViews",
          "action": "Get YouTube daily views",
          "routing": {
            "request": {
              "qs": {
                "endDate": "={{ $parameter.endDate || undefined }}",
                "videoId": "={{ $parameter.videoId }}",
                "accountId": "={{ $parameter.accountId }}",
                "startDate": "={{ $parameter.startDate || undefined }}"
              },
              "url": "/analytics/youtube/daily-views",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram Account Insights",
          "value": "instagramAccountInsights",
          "action": "Get Instagram account-level insights",
          "routing": {
            "request": {
              "qs": {
                "since": "={{ $parameter.since || undefined }}",
                "until": "={{ $parameter.until || undefined }}",
                "metrics": "={{ $parameter.metrics || undefined }}",
                "accountId": "={{ $parameter.accountId }}",
                "breakdown": "={{ $parameter.breakdown || undefined }}",
                "metricType": "={{ $parameter.metricType || undefined }}"
              },
              "url": "/analytics/instagram/account-insights",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram Demographics",
          "value": "instagramDemographics",
          "action": "Get Instagram audience demographics",
          "routing": {
            "request": {
              "qs": {
                "metric": "={{ $parameter.metric || undefined }}",
                "accountId": "={{ $parameter.accountId }}",
                "breakdown": "={{ $parameter.breakdown || undefined }}",
                "timeframe": "={{ $parameter.timeframe || undefined }}"
              },
              "url": "/analytics/instagram/demographics",
              "method": "GET"
            }
          }
        },
        {
          "name": "Daily Metrics",
          "value": "dailyMetrics",
          "action": "Get daily aggregated metrics",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "toDate": "={{ $parameter.toDateTime || undefined }}",
                "fromDate": "={{ $parameter.fromDateTime || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "accountId": "={{ $parameter.accountId || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/daily-metrics",
              "method": "GET"
            }
          }
        },
        {
          "name": "Best Time to Post",
          "value": "bestTime",
          "action": "Get best times to post",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/best-time",
              "method": "GET"
            }
          }
        },
        {
          "name": "Content Decay",
          "value": "contentDecay",
          "action": "Get content performance decay",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/content-decay",
              "method": "GET"
            }
          }
        },
        {
          "name": "Posting Frequency",
          "value": "postingFrequency",
          "action": "Get posting frequency vs engagement",
          "routing": {
            "request": {
              "qs": {
                "source": "={{ $parameter.source || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}"
              },
              "url": "/analytics/posting-frequency",
              "method": "GET"
            }
          }
        },
        {
          "name": "Post Timeline",
          "value": "postTimeline",
          "action": "Get post analytics timeline",
          "routing": {
            "request": {
              "qs": {
                "postId": "={{ $parameter.postId }}",
                "toDate": "={{ $parameter.toDateTime || undefined }}",
                "fromDate": "={{ $parameter.fromDateTime || undefined }}"
              },
              "url": "/analytics/post-timeline",
              "method": "GET"
            }
          }
        },
        {
          "name": "Follower Stats",
          "value": "followerStats",
          "action": "Get follower stats",
          "routing": {
            "request": {
              "qs": {
                "toDate": "={{ $parameter.toDate || undefined }}",
                "fromDate": "={{ $parameter.fromDate || undefined }}",
                "profileId": "={{ $parameter.profileId || undefined }}",
                "accountIds": "={{ $parameter.accountIds || undefined }}",
                "granularity": "={{ $parameter.granularity || undefined }}"
              },
              "url": "/accounts/follower-stats",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn Aggregate Analytics",
          "value": "linkedinAggregateAnalytics",
          "action": "Get LinkedIn aggregate stats",
          "routing": {
            "request": {
              "qs": {
                "endDate": "={{ $parameter.endDate || undefined }}",
                "metrics": "={{ $parameter.metrics || undefined }}",
                "startDate": "={{ $parameter.startDate || undefined }}",
                "aggregation": "={{ $parameter.aggregation || undefined }}"
              },
              "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-aggregate-analytics",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn Post Analytics",
          "value": "linkedinPostAnalytics",
          "action": "Get LinkedIn post stats",
          "routing": {
            "request": {
              "qs": {
                "urn": "={{ $parameter.urn }}"
              },
              "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-analytics",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn Post Reactions",
          "value": "linkedinPostReactions",
          "action": "Get LinkedIn post reactions",
          "routing": {
            "request": {
              "qs": {
                "urn": "={{ $parameter.urn }}",
                "limit": "={{ $parameter.limit || undefined }}",
                "cursor": "={{ $parameter.cursor || undefined }}"
              },
              "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-reactions",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "analytics"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "connect",
      "options": [
        {
          "name": "Connect with Credentials",
          "value": "connect",
          "action": "Connect Bluesky account with credentials",
          "routing": {
            "request": {
              "url": "/connect/bluesky/credentials",
              "body": {
                "handle": "={{ $parameter.handle }}",
                "profileId": "={{ $parameter.profileId }}",
                "appPassword": "={{ $parameter.appPassword }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Disconnect",
          "value": "disconnect",
          "action": "Disconnect Bluesky account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "bluesky"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listBoards",
      "options": [
        {
          "name": "List Boards",
          "value": "listBoards",
          "action": "List Pinterest boards",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Board",
          "value": "selectBoard",
          "action": "Select Pinterest board for posting",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
              "body": {
                "boardId": "={{ $parameter.boardId }}"
              },
              "method": "PUT"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "pinterest"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listSubreddits",
      "options": [
        {
          "name": "List Subreddits",
          "value": "listSubreddits",
          "action": "List saved subreddits",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
              "method": "GET"
            }
          }
        },
        {
          "name": "Update Subreddits",
          "value": "updateSubreddits",
          "action": "Update saved subreddits",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
              "body": {
                "subredditIds": "={{ $parameter.subredditIds.split(',').map(s => s.trim()).filter(s => s) }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "Search Posts",
          "value": "searchReddit",
          "action": "Search Reddit posts",
          "routing": {
            "request": {
              "qs": {
                "q": "={{ $parameter.q }}",
                "sort": "={{ $parameter.sort || 'new' }}",
                "after": "={{ $parameter.after || undefined }}",
                "limit": "={{ $parameter.limit || 25 }}",
                "accountId": "={{ $parameter.accountId }}",
                "subreddit": "={{ $parameter.subreddit || undefined }}",
                "restrict_sr": "={{ $parameter.restrict_sr || undefined }}"
              },
              "url": "/reddit/search",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Feed",
          "value": "feed",
          "action": "Get subreddit feed",
          "routing": {
            "request": {
              "qs": {
                "t": "={{ $parameter.t || undefined }}",
                "sort": "={{ $parameter.sort || 'hot' }}",
                "after": "={{ $parameter.after || undefined }}",
                "limit": "={{ $parameter.limit || 25 }}",
                "accountId": "={{ $parameter.accountId }}",
                "subreddit": "={{ $parameter.subreddit || undefined }}"
              },
              "url": "/reddit/feed",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "reddit"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "getStatus",
      "options": [
        {
          "name": "Get Status",
          "value": "getStatus",
          "action": "Get Telegram connection status",
          "routing": {
            "request": {
              "url": "/connect/telegram",
              "method": "GET"
            }
          }
        },
        {
          "name": "Initiate Connection",
          "value": "initiate",
          "action": "Start Telegram connection flow",
          "routing": {
            "request": {
              "url": "/connect/telegram",
              "body": {
                "profileId": "={{ $parameter.profileId }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "telegram"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listLocations",
      "options": [
        {
          "name": "List Locations",
          "value": "listLocations",
          "action": "List Google Business locations",
          "routing": {
            "request": {
              "qs": {
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/googlebusiness/locations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Location",
          "value": "selectLocation",
          "action": "Select Google Business location",
          "routing": {
            "request": {
              "url": "/connect/googlebusiness/select-location",
              "body": {
                "tempToken": "={{ $parameter.tempToken }}",
                "locationId": "={{ $parameter.locationId }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "List Account Locations",
          "value": "listAccountLocations",
          "action": "List GBP locations for account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
              "method": "GET"
            }
          }
        },
        {
          "name": "Switch Location",
          "value": "switchLocation",
          "action": "Switch GBP location for account",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
              "body": {
                "locationId": "={{ $parameter.newLocationId }}"
              },
              "method": "PUT"
            }
          }
        },
        {
          "name": "List Reviews",
          "value": "listReviews",
          "action": "List Google Business reviews",
          "routing": {
            "request": {
              "qs": {
                "page": "={{ $parameter.page || 1 }}",
                "limit": "={{ $parameter.limit || 20 }}"
              },
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews",
              "method": "GET"
            }
          }
        },
        {
          "name": "Reply to Review",
          "value": "replyReview",
          "action": "Reply to a Google Business review",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
              "body": {
                "comment": "={{ $parameter.comment }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete Review Reply",
          "value": "deleteReply",
          "action": "Delete a review reply",
          "routing": {
            "request": {
              "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "googlebusiness"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listProfiles",
      "options": [
        {
          "name": "List Profiles",
          "value": "listProfiles",
          "action": "List Snapchat profiles",
          "routing": {
            "request": {
              "qs": {
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "url": "/connect/snapchat/select-profile",
              "method": "GET"
            }
          }
        },
        {
          "name": "Select Profile",
          "value": "selectProfile",
          "action": "Select Snapchat profile",
          "routing": {
            "request": {
              "url": "/connect/snapchat/select-profile",
              "body": {
                "profileId": "={{ $parameter.snapchatProfileId }}",
                "tempToken": "={{ $parameter.tempToken }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "snapchat"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "create",
      "options": [
        {
          "name": "Create Token",
          "value": "create",
          "action": "Create invite token",
          "routing": {
            "request": {
              "url": "/invite/tokens",
              "body": {
                "scope": "={{ $parameter.scope }}",
                "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
              },
              "method": "POST"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "invites"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "listPostsLogs",
      "options": [
        {
          "name": "List Posts Logs",
          "value": "listPostsLogs",
          "action": "List publishing logs",
          "routing": {
            "request": {
              "qs": {
                "days": "={{ $parameter.days || 7 }}",
                "skip": "={{ $parameter.skip || 0 }}",
                "limit": "={{ $parameter.limit || 50 }}",
                "action": "={{ $parameter.action || undefined }}",
                "search": "={{ $parameter.search || undefined }}",
                "status": "={{ $parameter.status || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}"
              },
              "url": "/posts/logs",
              "method": "GET"
            }
          }
        },
        {
          "name": "List Connection Logs",
          "value": "listConnectionLogs",
          "action": "List connection logs",
          "routing": {
            "request": {
              "qs": {
                "days": "={{ $parameter.days || 7 }}",
                "skip": "={{ $parameter.skip || 0 }}",
                "limit": "={{ $parameter.limit || 50 }}",
                "status": "={{ $parameter.connectionStatus || undefined }}",
                "platform": "={{ $parameter.platform || undefined }}",
                "eventType": "={{ $parameter.eventType || undefined }}"
              },
              "url": "/connections/logs",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get Post Logs",
          "value": "getPostLogs",
          "action": "Get post logs",
          "routing": {
            "request": {
              "qs": {
                "limit": "={{ $parameter.limit || 50 }}"
              },
              "url": "=/posts/{{ $parameter.postId }}/logs",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "logs"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List API keys",
          "routing": {
            "request": {
              "url": "/api-keys",
              "method": "GET"
            }
          }
        },
        {
          "name": "Create",
          "value": "create",
          "action": "Create API key",
          "routing": {
            "request": {
              "url": "/api-keys",
              "body": {
                "name": "={{ $parameter.name }}",
                "scope": "={{ $parameter.scope }}",
                "expiresIn": "={{ $parameter.expiresIn || undefined }}",
                "permission": "={{ $parameter.permission }}",
                "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds : undefined }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "Delete",
          "value": "delete",
          "action": "Delete API key",
          "routing": {
            "request": {
              "url": "=/api-keys/{{ $parameter.keyId }}",
              "method": "DELETE"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "apiKeys"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "list",
      "options": [
        {
          "name": "List",
          "value": "list",
          "action": "List users",
          "routing": {
            "request": {
              "url": "/users",
              "method": "GET"
            }
          }
        },
        {
          "name": "Get",
          "value": "get",
          "action": "Get user",
          "routing": {
            "request": {
              "url": "=/users/{{ $parameter.userId }}",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "users"
          ]
        }
      },
      "noDataExpression": true
    },
    {
      "name": "operation",
      "type": "options",
      "default": "youtubeDownload",
      "options": [
        {
          "name": "YouTube: Download",
          "value": "youtubeDownload",
          "action": "Download YouTube video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "action": "={{ $parameter.action }}",
                "format": "={{ $parameter.format }}",
                "quality": "={{ $parameter.quality }}",
                "formatId": "={{ $parameter.formatId }}"
              },
              "url": "/tools/youtube/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "YouTube: Transcript",
          "value": "youtubeTranscript",
          "action": "Get YouTube transcript",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "lang": "={{ $parameter.lang }}"
              },
              "url": "/tools/youtube/transcript",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram: Download",
          "value": "instagramDownload",
          "action": "Download Instagram media",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/instagram/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Instagram: Hashtag Checker",
          "value": "instagramHashtagChecker",
          "action": "Check IG hashtag bans",
          "routing": {
            "request": {
              "url": "/tools/instagram/hashtag-checker",
              "body": {
                "hashtags": "={{ $parameter.hashtags }}"
              },
              "method": "POST"
            }
          }
        },
        {
          "name": "TikTok: Download",
          "value": "tiktokDownload",
          "action": "Download TikTok video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "action": "={{ $parameter.action }}",
                "formatId": "={{ $parameter.formatId }}"
              },
              "url": "/tools/tiktok/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Twitter/X: Download",
          "value": "twitterDownload",
          "action": "Download Twitter/X media",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}",
                "action": "={{ $parameter.action }}",
                "formatId": "={{ $parameter.formatId }}"
              },
              "url": "/tools/twitter/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Facebook: Download",
          "value": "facebookDownload",
          "action": "Download Facebook video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/facebook/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "LinkedIn: Download",
          "value": "linkedinDownload",
          "action": "Download LinkedIn video",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/linkedin/download",
              "method": "GET"
            }
          }
        },
        {
          "name": "Bluesky: Download",
          "value": "blueskyDownload",
          "action": "Download Bluesky media",
          "routing": {
            "request": {
              "qs": {
                "url": "={{ $parameter.url }}"
              },
              "url": "/tools/bluesky/download",
              "method": "GET"
            }
          }
        }
      ],
      "displayName": "Operation",
      "displayOptions": {
        "show": {
          "resource": [
            "tools"
          ]
        }
      },
      "noDataExpression": true
    }
  ]

operations:
  [
    {
      "name": "List",
      "value": "list",
      "action": "List profiles",
      "routing": {
        "request": {
          "qs": {
            "includeOverLimit": "={{ $parameter.includeOverLimit || false }}"
          },
          "url": "/profiles",
          "method": "GET"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}",
          "method": "GET"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create profile",
      "routing": {
        "request": {
          "url": "/profiles",
          "body": {
            "name": "={{ $parameter.name }}",
            "color": "={{ $parameter.color || '' }}",
            "description": "={{ $parameter.description || '' }}"
          },
          "method": "POST"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}",
          "body": {
            "name": "={{ $parameter.name || undefined }}",
            "color": "={{ $parameter.color || undefined }}",
            "isDefault": "={{ $parameter.isDefault ?? undefined }}",
            "description": "={{ $parameter.description || undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}",
          "method": "DELETE"
        }
      },
      "resource": "profiles"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List posts",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page || 1 }}",
            "limit": "={{ $parameter.limit || 10 }}",
            "dateTo": "={{ $parameter.dateTo || undefined }}",
            "search": "={{ $parameter.search || undefined }}",
            "sortBy": "={{ $parameter.sortBy || undefined }}",
            "status": "={{ $parameter.status || undefined }}",
            "dateFrom": "={{ $parameter.dateFrom || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "createdBy": "={{ $parameter.createdBy || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}",
            "includeHidden": "={{ $parameter.includeHidden ?? undefined }}"
          },
          "url": "/posts",
          "method": "GET"
        }
      },
      "resource": "posts"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get post",
      "routing": {
        "request": {
          "url": "=/posts/{{ $parameter.postId }}",
          "method": "GET"
        }
      },
      "resource": "posts"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create post",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/posts",
          "method": "POST",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update post",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}",
          "method": "PUT",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete post",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}",
          "method": "DELETE",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Retry",
      "value": "retry",
      "action": "Retry failed post",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}/retry",
          "method": "POST",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Unpublish",
      "value": "unpublish",
      "action": "Unpublish post",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "=/posts/{{ $parameter.postId }}/unpublish",
          "body": {
            "platform": "={{ $parameter.unpublishPlatform }}"
          },
          "method": "POST",
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Bulk Upload",
      "value": "bulkUpload",
      "action": "Bulk upload posts from CSV",
      "routing": {
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "qs": {
            "dryRun": "={{ $parameter.dryRun || false }}"
          },
          "url": "/posts/bulk-upload",
          "body": {
            "file": "={{ { value: $parameter.csvFile, options: { filename: 'bulk-upload.csv', contentType: 'text/csv' } } }}"
          },
          "method": "POST",
          "headers": {
            "Content-Type": "multipart/form-data"
          },
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "posts"
    },
    {
      "name": "Get Logs",
      "value": "logs",
      "action": "Get post publishing logs",
      "routing": {
        "request": {
          "url": "=/posts/{{ $parameter.postId }}/logs",
          "method": "GET"
        }
      },
      "resource": "posts"
    },
    {
      "name": "Upload",
      "value": "upload",
      "action": "Upload media",
      "routing": {
        "send": {
          "preSend": [
            null
          ]
        },
        "output": {
          "postReceive": [
            null
          ]
        },
        "request": {
          "url": "/media",
          "method": "POST",
          "headers": {
            "Content-Type": "multipart/form-data"
          },
          "returnFullResponse": true,
          "ignoreHttpStatusErrors": true
        }
      },
      "resource": "media"
    },
    {
      "name": "Get Presigned URL",
      "value": "presign",
      "action": "Get presigned URL for direct upload",
      "routing": {
        "request": {
          "url": "/media/presign",
          "body": {
            "size": "={{ $parameter.size }}",
            "filename": "={{ $parameter.filename }}",
            "contentType": "={{ $parameter.contentType }}"
          },
          "method": "POST"
        }
      },
      "resource": "media"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List social accounts",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/accounts",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get account details",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "body": {
            "isActive": "={{ $parameter.isActive }}",
            "displayName": "={{ $parameter.displayName || undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Disconnect account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "method": "DELETE"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get Health",
      "value": "health",
      "action": "Check account health",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/health",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get All Health",
      "value": "allHealth",
      "action": "Check all accounts health",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/accounts/health",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get Follower Stats",
      "value": "followerStats",
      "action": "Get follower statistics",
      "routing": {
        "request": {
          "qs": {
            "accountId": "={{ $parameter.accountId || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/accounts/follower-stats",
          "method": "GET"
        }
      },
      "resource": "accounts"
    },
    {
      "name": "Get Connect URL",
      "value": "getConnectUrl",
      "action": "Get OAuth connect URL",
      "routing": {
        "request": {
          "qs": {
            "headless": "={{ $parameter.headless || undefined }}",
            "profileId": "={{ $parameter.profileId }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
          },
          "url": "=/connect/{{ $parameter.platform }}",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Complete OAuth Callback",
      "value": "handleOAuthCallback",
      "action": "Complete OAuth callback",
      "routing": {
        "request": {
          "url": "=/connect/{{ $parameter.platform }}",
          "body": {
            "code": "={{ $parameter.code }}",
            "state": "={{ $parameter.state }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Facebook Pages (Headless)",
      "value": "listFacebookPages",
      "action": "List Facebook pages",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/facebook/select-page",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Facebook Page (Headless)",
      "value": "selectFacebookPage",
      "action": "Select Facebook page",
      "routing": {
        "request": {
          "url": "/connect/facebook/select-page",
          "body": {
            "pageId": "={{ $parameter.pageId }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ $parameter.userProfile || undefined }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Google Business Locations (Headless)",
      "value": "listGoogleBusinessLocations",
      "action": "List GBP locations",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/googlebusiness/locations",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Google Business Location (Headless)",
      "value": "selectGoogleBusinessLocation",
      "action": "Select GBP location",
      "routing": {
        "request": {
          "url": "/connect/googlebusiness/select-location",
          "body": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "locationId": "={{ $parameter.locationId }}",
            "userProfile": "={{ $parameter.userProfile }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Get Pending OAuth Data (Headless)",
      "value": "getPendingOAuthData",
      "action": "Get pending OAuth data",
      "routing": {
        "request": {
          "qs": {
            "token": "={{ $parameter.token }}"
          },
          "url": "/connect/pending-data",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List LinkedIn Organizations (Details)",
      "value": "listLinkedInOrganizations",
      "action": "List LinkedIn orgs",
      "routing": {
        "request": {
          "qs": {
            "orgIds": "={{ $parameter.orgIds }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/linkedin/organizations",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select LinkedIn Organization",
      "value": "selectLinkedInOrganization",
      "action": "Select LinkedIn org",
      "routing": {
        "request": {
          "url": "/connect/linkedin/select-organization",
          "body": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "accountType": "={{ $parameter.accountType }}",
            "userProfile": "={{ $parameter.userProfile }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
            "selectedOrganization": "={{ $parameter.selectedOrganization || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Pinterest Boards (Headless)",
      "value": "listPinterestBoardsForSelection",
      "action": "List Pinterest boards",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/pinterest/select-board",
          "method": "GET",
          "headers": {
            "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
          }
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Pinterest Board (Headless)",
      "value": "selectPinterestBoard",
      "action": "Select Pinterest board",
      "routing": {
        "request": {
          "url": "/connect/pinterest/select-board",
          "body": {
            "boardId": "={{ $parameter.boardId }}",
            "boardName": "={{ $parameter.boardName || undefined }}",
            "expiresIn": "={{ $parameter.expiresIn || undefined }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ $parameter.userProfile || undefined }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
            "refreshToken": "={{ $parameter.refreshToken || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "List Snapchat Profiles (Headless)",
      "value": "listSnapchatProfiles",
      "action": "List Snapchat profiles",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/snapchat/select-profile",
          "method": "GET",
          "headers": {
            "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
          }
        }
      },
      "resource": "connect"
    },
    {
      "name": "Select Snapchat Profile (Headless)",
      "value": "selectSnapchatProfile",
      "action": "Select Snapchat profile",
      "routing": {
        "request": {
          "url": "/connect/snapchat/select-profile",
          "body": {
            "expiresIn": "={{ $parameter.expiresIn || undefined }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ $parameter.userProfile }}",
            "redirect_url": "={{ $parameter.redirectUrl || undefined }}",
            "refreshToken": "={{ $parameter.refreshToken || undefined }}",
            "selectedPublicProfile": "={{ $parameter.selectedPublicProfile }}"
          },
          "method": "POST",
          "headers": {
            "X-Connect-Token": "={{ $parameter.xConnectToken || undefined }}"
          }
        }
      },
      "resource": "connect"
    },
    {
      "name": "Connect Bluesky via Credentials",
      "value": "connectBlueskyCredentials",
      "action": "Connect Bluesky account",
      "routing": {
        "request": {
          "url": "/connect/bluesky/credentials",
          "body": {
            "state": "={{ $parameter.state }}",
            "identifier": "={{ $parameter.identifier }}",
            "appPassword": "={{ $parameter.appPassword }}",
            "redirectUri": "={{ $parameter.redirectUri || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Connect WhatsApp via Credentials",
      "value": "connectWhatsAppCredentials",
      "action": "Connect WhatsApp via credentials",
      "routing": {
        "request": {
          "url": "/connect/whatsapp/credentials",
          "body": {
            "wabaId": "={{ $parameter.wabaId }}",
            "profileId": "={{ $parameter.profileId }}",
            "accessToken": "={{ $parameter.accessToken }}",
            "phoneNumberId": "={{ $parameter.phoneNumberId }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Generate Telegram Code",
      "value": "getTelegramConnectStatus",
      "action": "Generate Telegram code",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/connect/telegram",
          "method": "GET"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Connect Telegram Directly",
      "value": "initiateTelegramConnect",
      "action": "Connect Telegram directly",
      "routing": {
        "request": {
          "url": "/connect/telegram",
          "body": {
            "chatId": "={{ $parameter.chatId }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Check Telegram Status",
      "value": "completeTelegramConnect",
      "action": "Check Telegram status",
      "routing": {
        "request": {
          "qs": {
            "code": "={{ $parameter.code }}"
          },
          "url": "/connect/telegram",
          "method": "PATCH"
        }
      },
      "resource": "connect"
    },
    {
      "name": "Get Stats",
      "value": "getStats",
      "action": "Get usage statistics",
      "routing": {
        "request": {
          "url": "/usage-stats",
          "method": "GET"
        }
      },
      "resource": "usage"
    },
    {
      "name": "Get Usage Stats",
      "value": "getUsageStats",
      "action": "Get plan and usage stats",
      "routing": {
        "request": {
          "url": "/usage-stats",
          "method": "GET"
        }
      },
      "resource": "usage"
    },
    {
      "name": "List Pages",
      "value": "listPages",
      "action": "List Facebook pages",
      "routing": {
        "request": {
          "qs": {
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/facebook/select-page",
          "method": "GET"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "Select Page",
      "value": "selectPage",
      "action": "Select Facebook page",
      "routing": {
        "request": {
          "url": "/connect/facebook/select-page",
          "body": {
            "pageId": "={{ $parameter.pageId }}",
            "profileId": "={{ $parameter.profileId }}",
            "tempToken": "={{ $parameter.tempToken }}",
            "userProfile": "={{ { id: $parameter.userProfileId || '', name: $parameter.userProfileName || '', email: $parameter.userProfileEmail || '', picture: $parameter.userProfilePicture || '', accessToken: $parameter.userProfileAccessToken || '' } }}"
          },
          "method": "POST"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "List Account Pages",
      "value": "listAccountPages",
      "action": "List Facebook pages for account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
          "method": "GET"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "Update Page",
      "value": "updatePage",
      "action": "Update Facebook page",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/facebook-page",
          "body": {
            "selectedPageId": "={{ $parameter.selectedPageId }}"
          },
          "method": "PUT"
        }
      },
      "resource": "facebook"
    },
    {
      "name": "Update Organization",
      "value": "updateOrganization",
      "action": "Update LinkedIn organization",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/linkedin-organization",
          "body": {
            "accountType": "={{ $parameter.accountType }}",
            "selectedOrganization": "={{ { id: $parameter.organizationId || '', urn: $parameter.organizationUrn || '', name: $parameter.organizationName || '', logoUrl: $parameter.organizationLogoUrl || '', description: $parameter.organizationDescription || '' } }}"
          },
          "method": "PUT"
        }
      },
      "resource": "linkedin"
    },
    {
      "name": "Clone Connection",
      "value": "cloneConnection",
      "action": "Clone connection to profile",
      "routing": {
        "request": {
          "url": "=/profiles/{{ $parameter.profileId }}/clone-connection",
          "body": {
            "targetPageId": "={{ $parameter.targetPageId || undefined }}",
            "targetPageName": "={{ $parameter.targetPageName || undefined }}",
            "sourceAccountId": "={{ $parameter.sourceAccountId }}",
            "targetAccountType": "={{ $parameter.targetAccountType || undefined }}",
            "targetOrganizationId": "={{ $parameter.targetOrganizationId || undefined }}",
            "targetOrganizationUrn": "={{ $parameter.targetOrganizationUrn || undefined }}",
            "targetPageAccessToken": "={{ $parameter.targetPageAccessToken || undefined }}",
            "targetOrganizationName": "={{ $parameter.targetOrganizationName || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "clone"
    },
    {
      "name": "Get Settings",
      "value": "get",
      "action": "Get webhook settings",
      "routing": {
        "request": {
          "url": "/webhooks/settings",
          "method": "GET"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Create Settings",
      "value": "create",
      "action": "Create webhook settings",
      "routing": {
        "request": {
          "url": "/webhooks/settings",
          "body": {
            "url": "={{ $parameter.url }}",
            "name": "={{ $parameter.name || undefined }}",
            "events": "={{ $parameter.events || undefined }}",
            "secret": "={{ $parameter.secret || undefined }}",
            "isActive": "={{ $parameter.isActive }}",
            "customHeaders": "={{ $parameter.customHeaders || undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Update Settings",
      "value": "update",
      "action": "Update webhook settings",
      "routing": {
        "request": {
          "url": "/webhooks/settings",
          "body": {
            "_id": "={{ $parameter.webhookId }}",
            "url": "={{ $parameter.url || undefined }}",
            "name": "={{ $parameter.name || undefined }}",
            "events": "={{ $parameter.events || undefined }}",
            "secret": "={{ $parameter.secret || undefined }}",
            "isActive": "={{ $parameter.isActive }}",
            "customHeaders": "={{ $parameter.customHeaders || undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Delete Settings",
      "value": "delete",
      "action": "Delete webhook settings",
      "routing": {
        "request": {
          "qs": {
            "id": "={{ $parameter.webhookId }}"
          },
          "url": "/webhooks/settings",
          "method": "DELETE"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Test Webhook",
      "value": "test",
      "action": "Send test webhook",
      "routing": {
        "request": {
          "url": "/webhooks/test",
          "body": {
            "webhookId": "={{ $parameter.webhookId }}"
          },
          "method": "POST"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "Get Logs",
      "value": "logs",
      "action": "Get webhook delivery logs",
      "routing": {
        "request": {
          "qs": {
            "event": "={{ $parameter.event || undefined }}",
            "limit": "={{ $parameter.limit || 50 }}",
            "status": "={{ $parameter.status || undefined }}",
            "webhookId": "={{ $parameter.webhookId || undefined }}"
          },
          "url": "/webhooks/logs",
          "method": "GET"
        }
      },
      "resource": "webhooks"
    },
    {
      "name": "List Slots",
      "value": "list",
      "action": "List queue slots",
      "routing": {
        "request": {
          "qs": {
            "all": "={{ $parameter.all ? 'true' : undefined }}",
            "queueId": "={{ $parameter.queueId || undefined }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/slots",
          "method": "GET"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Create Slot",
      "value": "create",
      "action": "Create queue slot",
      "routing": {
        "request": {
          "url": "/queue/slots",
          "body": {
            "name": "={{ $parameter.name }}",
            "slots": "={{ $parameter.slots }}",
            "active": "={{ $parameter.active }}",
            "timezone": "={{ $parameter.timezone }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Update Slot",
      "value": "update",
      "action": "Update queue slot",
      "routing": {
        "request": {
          "url": "/queue/slots",
          "body": {
            "name": "={{ $parameter.name || undefined }}",
            "slots": "={{ $parameter.slots }}",
            "active": "={{ $parameter.active }}",
            "queueId": "={{ $parameter.queueId || undefined }}",
            "timezone": "={{ $parameter.timezone }}",
            "profileId": "={{ $parameter.profileId }}",
            "setAsDefault": "={{ $parameter.setAsDefault }}",
            "reshuffleExisting": "={{ $parameter.reshuffleExisting }}"
          },
          "method": "PUT"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Delete Slot",
      "value": "delete",
      "action": "Delete queue slot",
      "routing": {
        "request": {
          "qs": {
            "queueId": "={{ $parameter.queueId }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/slots",
          "method": "DELETE"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Preview Queue",
      "value": "preview",
      "action": "Preview upcoming queue posts",
      "routing": {
        "request": {
          "qs": {
            "count": "={{ $parameter.count || 20 }}",
            "queueId": "={{ $parameter.queueId || undefined }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/preview",
          "method": "GET"
        }
      },
      "resource": "queue"
    },
    {
      "name": "Get Next Slot",
      "value": "nextSlot",
      "action": "Get next available queue slot",
      "routing": {
        "request": {
          "qs": {
            "queueId": "={{ $parameter.queueId || undefined }}",
            "profileId": "={{ $parameter.profileId }}"
          },
          "url": "/queue/next-slot",
          "method": "GET"
        }
      },
      "resource": "queue"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List account groups",
      "routing": {
        "request": {
          "url": "/account-groups",
          "method": "GET"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create account group",
      "routing": {
        "request": {
          "url": "/account-groups",
          "body": {
            "name": "={{ $parameter.name }}",
            "accountIds": "={{ $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) }}"
          },
          "method": "POST"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Update",
      "value": "update",
      "action": "Update account group",
      "routing": {
        "request": {
          "url": "=/account-groups/{{ $parameter.groupId }}",
          "body": {
            "name": "={{ $parameter.name || undefined }}",
            "accountIds": "={{ $parameter.accountIds ? $parameter.accountIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
          },
          "method": "PUT"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete account group",
      "routing": {
        "request": {
          "url": "=/account-groups/{{ $parameter.groupId }}",
          "method": "DELETE"
        }
      },
      "resource": "accountGroups"
    },
    {
      "name": "Get Analytics",
      "value": "get",
      "action": "Get post analytics",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page || undefined }}",
            "limit": "={{ $parameter.limit || undefined }}",
            "order": "={{ $parameter.order || undefined }}",
            "postId": "={{ $parameter.postId || undefined }}",
            "sortBy": "={{ $parameter.sortBy || undefined }}",
            "source": "={{ $parameter.source || undefined }}",
            "toDate": "={{ $parameter.toDate || undefined }}",
            "fromDate": "={{ $parameter.fromDate || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "accountId": "={{ $parameter.accountId || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "YouTube Daily Views",
      "value": "youtubeDailyViews",
      "action": "Get YouTube daily views",
      "routing": {
        "request": {
          "qs": {
            "endDate": "={{ $parameter.endDate || undefined }}",
            "videoId": "={{ $parameter.videoId }}",
            "accountId": "={{ $parameter.accountId }}",
            "startDate": "={{ $parameter.startDate || undefined }}"
          },
          "url": "/analytics/youtube/daily-views",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Instagram Account Insights",
      "value": "instagramAccountInsights",
      "action": "Get Instagram account-level insights",
      "routing": {
        "request": {
          "qs": {
            "since": "={{ $parameter.since || undefined }}",
            "until": "={{ $parameter.until || undefined }}",
            "metrics": "={{ $parameter.metrics || undefined }}",
            "accountId": "={{ $parameter.accountId }}",
            "breakdown": "={{ $parameter.breakdown || undefined }}",
            "metricType": "={{ $parameter.metricType || undefined }}"
          },
          "url": "/analytics/instagram/account-insights",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Instagram Demographics",
      "value": "instagramDemographics",
      "action": "Get Instagram audience demographics",
      "routing": {
        "request": {
          "qs": {
            "metric": "={{ $parameter.metric || undefined }}",
            "accountId": "={{ $parameter.accountId }}",
            "breakdown": "={{ $parameter.breakdown || undefined }}",
            "timeframe": "={{ $parameter.timeframe || undefined }}"
          },
          "url": "/analytics/instagram/demographics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Daily Metrics",
      "value": "dailyMetrics",
      "action": "Get daily aggregated metrics",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "toDate": "={{ $parameter.toDateTime || undefined }}",
            "fromDate": "={{ $parameter.fromDateTime || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "accountId": "={{ $parameter.accountId || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/daily-metrics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Best Time to Post",
      "value": "bestTime",
      "action": "Get best times to post",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/best-time",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Content Decay",
      "value": "contentDecay",
      "action": "Get content performance decay",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/content-decay",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Posting Frequency",
      "value": "postingFrequency",
      "action": "Get posting frequency vs engagement",
      "routing": {
        "request": {
          "qs": {
            "source": "={{ $parameter.source || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}"
          },
          "url": "/analytics/posting-frequency",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Post Timeline",
      "value": "postTimeline",
      "action": "Get post analytics timeline",
      "routing": {
        "request": {
          "qs": {
            "postId": "={{ $parameter.postId }}",
            "toDate": "={{ $parameter.toDateTime || undefined }}",
            "fromDate": "={{ $parameter.fromDateTime || undefined }}"
          },
          "url": "/analytics/post-timeline",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Follower Stats",
      "value": "followerStats",
      "action": "Get follower stats",
      "routing": {
        "request": {
          "qs": {
            "toDate": "={{ $parameter.toDate || undefined }}",
            "fromDate": "={{ $parameter.fromDate || undefined }}",
            "profileId": "={{ $parameter.profileId || undefined }}",
            "accountIds": "={{ $parameter.accountIds || undefined }}",
            "granularity": "={{ $parameter.granularity || undefined }}"
          },
          "url": "/accounts/follower-stats",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "LinkedIn Aggregate Analytics",
      "value": "linkedinAggregateAnalytics",
      "action": "Get LinkedIn aggregate stats",
      "routing": {
        "request": {
          "qs": {
            "endDate": "={{ $parameter.endDate || undefined }}",
            "metrics": "={{ $parameter.metrics || undefined }}",
            "startDate": "={{ $parameter.startDate || undefined }}",
            "aggregation": "={{ $parameter.aggregation || undefined }}"
          },
          "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-aggregate-analytics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "LinkedIn Post Analytics",
      "value": "linkedinPostAnalytics",
      "action": "Get LinkedIn post stats",
      "routing": {
        "request": {
          "qs": {
            "urn": "={{ $parameter.urn }}"
          },
          "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-analytics",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "LinkedIn Post Reactions",
      "value": "linkedinPostReactions",
      "action": "Get LinkedIn post reactions",
      "routing": {
        "request": {
          "qs": {
            "urn": "={{ $parameter.urn }}",
            "limit": "={{ $parameter.limit || undefined }}",
            "cursor": "={{ $parameter.cursor || undefined }}"
          },
          "url": "=/accounts/{{ $parameter.accountIdPath }}/linkedin-post-reactions",
          "method": "GET"
        }
      },
      "resource": "analytics"
    },
    {
      "name": "Connect with Credentials",
      "value": "connect",
      "action": "Connect Bluesky account with credentials",
      "routing": {
        "request": {
          "url": "/connect/bluesky/credentials",
          "body": {
            "handle": "={{ $parameter.handle }}",
            "profileId": "={{ $parameter.profileId }}",
            "appPassword": "={{ $parameter.appPassword }}"
          },
          "method": "POST"
        }
      },
      "resource": "bluesky"
    },
    {
      "name": "Disconnect",
      "value": "disconnect",
      "action": "Disconnect Bluesky account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}",
          "method": "DELETE"
        }
      },
      "resource": "bluesky"
    },
    {
      "name": "List Boards",
      "value": "listBoards",
      "action": "List Pinterest boards",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
          "method": "GET"
        }
      },
      "resource": "pinterest"
    },
    {
      "name": "Select Board",
      "value": "selectBoard",
      "action": "Select Pinterest board for posting",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/pinterest-boards",
          "body": {
            "boardId": "={{ $parameter.boardId }}"
          },
          "method": "PUT"
        }
      },
      "resource": "pinterest"
    },
    {
      "name": "List Subreddits",
      "value": "listSubreddits",
      "action": "List saved subreddits",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
          "method": "GET"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Update Subreddits",
      "value": "updateSubreddits",
      "action": "Update saved subreddits",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/reddit-subreddits",
          "body": {
            "subredditIds": "={{ $parameter.subredditIds.split(',').map(s => s.trim()).filter(s => s) }}"
          },
          "method": "PUT"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Search Posts",
      "value": "searchReddit",
      "action": "Search Reddit posts",
      "routing": {
        "request": {
          "qs": {
            "q": "={{ $parameter.q }}",
            "sort": "={{ $parameter.sort || 'new' }}",
            "after": "={{ $parameter.after || undefined }}",
            "limit": "={{ $parameter.limit || 25 }}",
            "accountId": "={{ $parameter.accountId }}",
            "subreddit": "={{ $parameter.subreddit || undefined }}",
            "restrict_sr": "={{ $parameter.restrict_sr || undefined }}"
          },
          "url": "/reddit/search",
          "method": "GET"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Get Feed",
      "value": "feed",
      "action": "Get subreddit feed",
      "routing": {
        "request": {
          "qs": {
            "t": "={{ $parameter.t || undefined }}",
            "sort": "={{ $parameter.sort || 'hot' }}",
            "after": "={{ $parameter.after || undefined }}",
            "limit": "={{ $parameter.limit || 25 }}",
            "accountId": "={{ $parameter.accountId }}",
            "subreddit": "={{ $parameter.subreddit || undefined }}"
          },
          "url": "/reddit/feed",
          "method": "GET"
        }
      },
      "resource": "reddit"
    },
    {
      "name": "Get Status",
      "value": "getStatus",
      "action": "Get Telegram connection status",
      "routing": {
        "request": {
          "url": "/connect/telegram",
          "method": "GET"
        }
      },
      "resource": "telegram"
    },
    {
      "name": "Initiate Connection",
      "value": "initiate",
      "action": "Start Telegram connection flow",
      "routing": {
        "request": {
          "url": "/connect/telegram",
          "body": {
            "profileId": "={{ $parameter.profileId }}"
          },
          "method": "POST"
        }
      },
      "resource": "telegram"
    },
    {
      "name": "List Locations",
      "value": "listLocations",
      "action": "List Google Business locations",
      "routing": {
        "request": {
          "qs": {
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/googlebusiness/locations",
          "method": "GET"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Select Location",
      "value": "selectLocation",
      "action": "Select Google Business location",
      "routing": {
        "request": {
          "url": "/connect/googlebusiness/select-location",
          "body": {
            "tempToken": "={{ $parameter.tempToken }}",
            "locationId": "={{ $parameter.locationId }}"
          },
          "method": "POST"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "List Account Locations",
      "value": "listAccountLocations",
      "action": "List GBP locations for account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
          "method": "GET"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Switch Location",
      "value": "switchLocation",
      "action": "Switch GBP location for account",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-locations",
          "body": {
            "locationId": "={{ $parameter.newLocationId }}"
          },
          "method": "PUT"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "List Reviews",
      "value": "listReviews",
      "action": "List Google Business reviews",
      "routing": {
        "request": {
          "qs": {
            "page": "={{ $parameter.page || 1 }}",
            "limit": "={{ $parameter.limit || 20 }}"
          },
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews",
          "method": "GET"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Reply to Review",
      "value": "replyReview",
      "action": "Reply to a Google Business review",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
          "body": {
            "comment": "={{ $parameter.comment }}"
          },
          "method": "POST"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "Delete Review Reply",
      "value": "deleteReply",
      "action": "Delete a review reply",
      "routing": {
        "request": {
          "url": "=/accounts/{{ $parameter.accountId }}/gmb-reviews/{{ $parameter.reviewId }}/reply",
          "method": "DELETE"
        }
      },
      "resource": "googlebusiness"
    },
    {
      "name": "List Profiles",
      "value": "listProfiles",
      "action": "List Snapchat profiles",
      "routing": {
        "request": {
          "qs": {
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "url": "/connect/snapchat/select-profile",
          "method": "GET"
        }
      },
      "resource": "snapchat"
    },
    {
      "name": "Select Profile",
      "value": "selectProfile",
      "action": "Select Snapchat profile",
      "routing": {
        "request": {
          "url": "/connect/snapchat/select-profile",
          "body": {
            "profileId": "={{ $parameter.snapchatProfileId }}",
            "tempToken": "={{ $parameter.tempToken }}"
          },
          "method": "POST"
        }
      },
      "resource": "snapchat"
    },
    {
      "name": "Create Token",
      "value": "create",
      "action": "Create invite token",
      "routing": {
        "request": {
          "url": "/invite/tokens",
          "body": {
            "scope": "={{ $parameter.scope }}",
            "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds.split(',').map(s => s.trim()).filter(s => s) : undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "invites"
    },
    {
      "name": "List Posts Logs",
      "value": "listPostsLogs",
      "action": "List publishing logs",
      "routing": {
        "request": {
          "qs": {
            "days": "={{ $parameter.days || 7 }}",
            "skip": "={{ $parameter.skip || 0 }}",
            "limit": "={{ $parameter.limit || 50 }}",
            "action": "={{ $parameter.action || undefined }}",
            "search": "={{ $parameter.search || undefined }}",
            "status": "={{ $parameter.status || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}"
          },
          "url": "/posts/logs",
          "method": "GET"
        }
      },
      "resource": "logs"
    },
    {
      "name": "List Connection Logs",
      "value": "listConnectionLogs",
      "action": "List connection logs",
      "routing": {
        "request": {
          "qs": {
            "days": "={{ $parameter.days || 7 }}",
            "skip": "={{ $parameter.skip || 0 }}",
            "limit": "={{ $parameter.limit || 50 }}",
            "status": "={{ $parameter.connectionStatus || undefined }}",
            "platform": "={{ $parameter.platform || undefined }}",
            "eventType": "={{ $parameter.eventType || undefined }}"
          },
          "url": "/connections/logs",
          "method": "GET"
        }
      },
      "resource": "logs"
    },
    {
      "name": "Get Post Logs",
      "value": "getPostLogs",
      "action": "Get post logs",
      "routing": {
        "request": {
          "qs": {
            "limit": "={{ $parameter.limit || 50 }}"
          },
          "url": "=/posts/{{ $parameter.postId }}/logs",
          "method": "GET"
        }
      },
      "resource": "logs"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List API keys",
      "routing": {
        "request": {
          "url": "/api-keys",
          "method": "GET"
        }
      },
      "resource": "apiKeys"
    },
    {
      "name": "Create",
      "value": "create",
      "action": "Create API key",
      "routing": {
        "request": {
          "url": "/api-keys",
          "body": {
            "name": "={{ $parameter.name }}",
            "scope": "={{ $parameter.scope }}",
            "expiresIn": "={{ $parameter.expiresIn || undefined }}",
            "permission": "={{ $parameter.permission }}",
            "profileIds": "={{ $parameter.scope === 'profiles' ? $parameter.profileIds : undefined }}"
          },
          "method": "POST"
        }
      },
      "resource": "apiKeys"
    },
    {
      "name": "Delete",
      "value": "delete",
      "action": "Delete API key",
      "routing": {
        "request": {
          "url": "=/api-keys/{{ $parameter.keyId }}",
          "method": "DELETE"
        }
      },
      "resource": "apiKeys"
    },
    {
      "name": "List",
      "value": "list",
      "action": "List users",
      "routing": {
        "request": {
          "url": "/users",
          "method": "GET"
        }
      },
      "resource": "users"
    },
    {
      "name": "Get",
      "value": "get",
      "action": "Get user",
      "routing": {
        "request": {
          "url": "=/users/{{ $parameter.userId }}",
          "method": "GET"
        }
      },
      "resource": "users"
    },
    {
      "name": "YouTube: Download",
      "value": "youtubeDownload",
      "action": "Download YouTube video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "action": "={{ $parameter.action }}",
            "format": "={{ $parameter.format }}",
            "quality": "={{ $parameter.quality }}",
            "formatId": "={{ $parameter.formatId }}"
          },
          "url": "/tools/youtube/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "YouTube: Transcript",
      "value": "youtubeTranscript",
      "action": "Get YouTube transcript",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "lang": "={{ $parameter.lang }}"
          },
          "url": "/tools/youtube/transcript",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Instagram: Download",
      "value": "instagramDownload",
      "action": "Download Instagram media",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/instagram/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Instagram: Hashtag Checker",
      "value": "instagramHashtagChecker",
      "action": "Check IG hashtag bans",
      "routing": {
        "request": {
          "url": "/tools/instagram/hashtag-checker",
          "body": {
            "hashtags": "={{ $parameter.hashtags }}"
          },
          "method": "POST"
        }
      },
      "resource": "tools"
    },
    {
      "name": "TikTok: Download",
      "value": "tiktokDownload",
      "action": "Download TikTok video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "action": "={{ $parameter.action }}",
            "formatId": "={{ $parameter.formatId }}"
          },
          "url": "/tools/tiktok/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Twitter/X: Download",
      "value": "twitterDownload",
      "action": "Download Twitter/X media",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}",
            "action": "={{ $parameter.action }}",
            "formatId": "={{ $parameter.formatId }}"
          },
          "url": "/tools/twitter/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Facebook: Download",
      "value": "facebookDownload",
      "action": "Download Facebook video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/facebook/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "LinkedIn: Download",
      "value": "linkedinDownload",
      "action": "Download LinkedIn video",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/linkedin/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    },
    {
      "name": "Bluesky: Download",
      "value": "blueskyDownload",
      "action": "Download Bluesky media",
      "routing": {
        "request": {
          "qs": {
            "url": "={{ $parameter.url }}"
          },
          "url": "/tools/bluesky/download",
          "method": "GET"
        }
      },
      "resource": "tools"
    }
  ]

npm_readme:
  # n8n-nodes-zernio

  <img src="https://zernio.com/brand/logo-primary.png" alt="Zernio Logo" width="200"/>

  An n8n community node for the [Zernio API](https://zernio.com) - the professional social media management platform.

  **Schedule and manage social media posts across multiple platforms:**
  - 🐦 **Twitter/X** - Posts, threads, and automation
  - 📸 **Instagram** - Posts, Stories, Reels with Business account support
  - 👤 **Facebook** - Page management and posting
  - 💼 **LinkedIn** - Personal and company page posting
  - 🎵 **TikTok** - Direct video posting with privacy controls
  - 📹 **YouTube** - Videos and Shorts with custom thumbnails
  - 🧵 **Threads** - Meta's social platform
  - 🦋 **Bluesky** - Decentralized social network
  - 📌 **Pinterest** - Pin to boards
  - 🤖 **Reddit** - Post to subreddits
  - ✈️ **Telegram** - Channel posting
  - 📍 **Google Business** - Business profile posts and reviews
  - 👻 **Snapchat** - Public profile posting

  ## Version History

  - **1.0.0** - Initial release with comprehensive Zernio API integration

  ## Installation

  ### From n8n Community Nodes Panel (Recommended)

  1. Go to **Settings** → **Community Nodes** in your n8n instance
  2. Select **Install** and enter `n8n-nodes-zernio`
  3. Click **Install** and restart n8n
  4. The Zernio node will appear in your node palette

  > **Note:** Also available as `n8n-nodes-late` for backwards compatibility.

  ### From npm

  ```bash
  npm install n8n-nodes-zernio
  ```

  ### From Source

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

  ## Prerequisites

  1. **Zernio Account**: Sign up at [zernio.com](https://zernio.com)
  2. **API Key**: Generate an API key from your Zernio dashboard
  3. **Social Accounts**: Connect your social media accounts to Zernio profiles

  ## Credentials Setup

  1. Add a new credential in n8n
  2. Search for "Zernio API"
  3. Enter your API key from the Zernio dashboard

  ## Quick Start

  ### 1. Create a Profile

  Profiles organize your social media accounts by brand, client, or purpose.

  ```json
  {
    "resource": "profiles",
    "operation": "create",
    "name": "Personal Brand",
    "description": "My personal social media accounts",
    "color": "#4ade80"
  }
  ```

  ### 2. Connect Social Accounts

  Connect your social media platforms to the profile:

  ```json
  {
    "resource": "connect",
    "operation": "connect",
    "platform": "twitter",
    "profileId": "profile_123_abc"
  }
  ```

  ### 3. Schedule a Post

  Create posts across multiple platforms:

  ```json
  {
    "resource": "posts",
    "operation": "create",
    "content": "Hello, world! #automation",
    "platforms": [
      {"platform": "twitter", "accountId": "twitter_account_123"},
      {"platform": "linkedin", "accountId": "linkedin_account_456"}
    ],
    "scheduledFor": "2024-01-15T16:00:00",
    "timezone": "America/New_York"
  }
  ```

  ## Supported Operations

  ### Profiles
  - **List** - Get all profiles
  - **Create** - Create new profile (subject to plan limits)
  - **Update** - Update profile details
  - **Delete** - Delete profile (must be empty)

  ### Posts
  - **List** - Get posts with pagination and filters
  - **Get** - Get specific post details
  - **Create** - Schedule or publish posts
  - **Update** - Edit draft/scheduled posts
  - **Delete** - Delete posts (published posts cannot be deleted)
  - **Retry** - Retry failed posts
  - **Logs** - Get publishing logs for a post
  - **Bulk Upload** - Upload multiple posts at once

  ### Media
  - **Upload** - Upload images/videos up to 5GB
  - **Presign** - Get presigned URL for large file uploads

  ### Social Accounts
  - **List** - View connected accounts
  - **Get** - Get specific account details
  - **Update** - Update account settings (e.g., display name)
  - **Delete** - Disconnect accounts
  - **Health** - Check account connection health
  - **All Health** - Check health of all accounts
  - **Follower Stats** - Get follower statistics

  ### Account Groups
  - **List** - Get all account groups
  - **Get** - Get specific group details
  - **Create** - Create new account group
  - **Update** - Update group settings
  - **Delete** - Delete account group

  ### Connect Platform
  - **Connect** - Initiate OAuth for new platforms

  ### Usage Statistics
  - **Get Stats** - Monitor usage against plan limits

  ### Analytics
  - **Get** - Get post analytics across platforms
  - **YouTube Daily Views** - Get daily view statistics for YouTube

  ### Queue (Scheduling Slots)
  - **List** - Get queue slots for a profile
  - **Create** - Create new queue slot
  - **Update** - Update slot time
  - **Delete** - Remove queue slot
  - **Preview** - Preview upcoming scheduled posts
  - **Next Slot** - Get next available slot time

  ### Webhooks
  - **Get** - Get webhook configuration
  - **Create** - Create new webhook endpoint
  - **Update** - Update webhook settings
  - **Delete** - Remove webhook
  - **Test** - Send test webhook event
  - **Logs** - View webhook delivery history

  ### Facebook Management
  - **List Pages** - Get available Facebook pages
  - **Select Page** - Connect specific page
  - **List Account Pages** - Get pages for a specific account
  - **Update Page** - Change active page

  ### LinkedIn Management
  - **Update Organization** - Switch between personal/company posting

  ### Google Business Management
  - **List Locations** - Get available business locations
  - **Select Location** - Connect specific location
  - **List Account Locations** - Get locations for an account
  - **Switch Location** - Change active location
  - **List Reviews** - Get business reviews
  - **Reply Review** - Respond to a review
  - **Delete Reply** - Remove review response

  ### Pinterest Management
  - **List Boards** - Get available Pinterest boards
  - **Select Board** - Connect specific board

  ### Bluesky Management
  - **Connect** - Connect Bluesky account with credentials
  - **Disconnect** - Disconnect Bluesky account

  ### Reddit Management
  - **List Subreddits** - Get saved subreddits for posting
  - **Update Subreddits** - Update subreddit list
  - **Search** - Search for subreddits
  - **Feed** - Get subreddit feed (hot, new, top, rising)

  ### Snapchat Management
  - **List Profiles** - Get available public profiles
  - **Select Profile** - Connect specific profile

  ### Telegram Management
  - **Get Status** - Check Telegram connection status
  - **Initiate** - Start Telegram connection flow

  ### Clone Connection
  - **Clone Connection** - Reuse OAuth across profiles

  ### Team Management
  - **Invites: Create** - Invite team members with profile access

  ### API Keys
  - **List** - Get all API keys
  - **Create** - Generate new API key
  - **Delete** - Revoke API key

  ### Users
  - **List** - Get team members
  - **Get** - Get user details

  ### Logs
  - **List** - Get publishing logs with filters
  - **Get** - Get specific log entry

  ## Advanced Features

  ### Platform-Specific Settings

  #### Twitter/X Threads
  Create multi-tweet threads:

  ```json
  {
    "platforms": [
      {
        "platform": "twitter",
        "accountId": "twitter_account_123",
        "platformSpecificData": {
          "threadItems": [
            {"content": "Tweet 1 - Introduction"},
            {"content": "Tweet 2 - Details"},
            {"content": "Tweet 3 - Conclusion"}
          ]
        }
      }
    ]
  }
  ```

  #### Instagram Stories
  Post to Instagram Stories:

  ```json
  {
    "platforms": [
      {
        "platform": "instagram",
        "accountId": "instagram_account_123",
        "platformSpecificData": {
          "contentType": "story"
        }
      }
    ],
    "mediaItems": [
      {"type": "image", "url": "https://your-story-image.jpg"}
    ]
  }
  ```

  #### TikTok Privacy, Photo Carousel and Disclosure Settings

  Control TikTok privacy plus optional PHOTO carousel media type (with background
  music), commercial content disclosure, and AIGC labeling:

  ```json
  {
    "platforms": [
      {
        "platform": "tiktok",
        "accountId": "tiktok_account_123",
        "platformSpecificData": {
          "tiktokSettings": {
            "privacy_level": "PUBLIC_TO_EVERYONE",
            "allow_comment": true,
            "allow_duet": true,
            "allow_stitch": true,
            "media_type": "PHOTO",
            "auto_add_music": true,
            "commercial_content_type": "brand_organic",
            "is_brand_organic_post": true,
            "video_made_with_ai": false
          }
        }
      }
    ]
  }
  ```

  PHOTO carousel posts require `media_type: "PHOTO"` and support `auto_add_music`
  to attach TikTok-recommended background music. Brand and AIGC disclosures are
  optional but required by TikTok policy when applicable.

  #### YouTube Settings
  Add custom thumbnails and first comments:

  ```json
  {
    "platforms": [
      {
        "platform": "youtube",
        "accountId": "youtube_account_123",
        "platformSpecificData": {
          "firstComment": "Thanks for watching! Don't forget to like and subscribe!"
        }
      }
    ],
    "mediaItems": [
      {
        "type": "video",
        "url": "https://your-video.mp4",
        "thumbnail": "https://your-custom-thumbnail.jpg"
      }
    ],
    "tags": ["tutorial", "automation", "n8n"]
  }
  ```

  #### Bluesky Threads
  Create multi-post threads on Bluesky:

  ```json
  {
    "platforms": [
      {
        "platform": "bluesky",
        "accountId": "bluesky_account_123",
        "platformSpecificData": {
          "threadItems": [
            {"content": "Post 1 - Introduction"},
            {"content": "Post 2 - Details"},
            {"content": "Post 3 - Conclusion"}
          ]
        }
      }
    ]
  }
  ```

  ### Media Upload

  Upload files before using in posts:

  ```json
  {
    "resource": "media",
    "operation": "upload",
    "files": [
      {
        "filename": "image.jpg",
        "data": "base64_encoded_data"
      }
    ]
  }
  ```

  For large files (>4MB), use the presign operation:

  ```json
  {
    "resource": "media",
    "operation": "presign",
    "filename": "video.mp4",
    "contentType": "video/mp4"
  }
  ```

  ### Webhooks

  Set up webhooks to receive real-time notifications:

  ```json
  {
    "resource": "webhooks",
    "operation": "create",
    "url": "https://your-server.com/webhook",
    "events": ["post.published", "post.failed"]
  }
  ```

  Available webhook events:
  - `post.scheduled` - Post scheduled
  - `post.published` - Post published successfully
  - `post.failed` - Post failed to publish
  - `post.partial` - Post partially published (some platforms failed)

  ## Platform Requirements

  - **Instagram**: Business account required (Personal/Creator accounts not supported)
  - **Facebook**: Must be admin of Facebook pages
  - **LinkedIn**: Company pages require admin access
  - **TikTok**: Creator account recommended
  - **YouTube**: Channel access required
  - **Twitter/X**: Standard account
  - **Threads**: Standard account
  - **Bluesky**: Standard account (uses app password)
  - **Pinterest**: Business account recommended
  - **Reddit**: Account with posting privileges
  - **Telegram**: Bot token required
  - **Google Business**: Business profile owner/manager access
  - **Snapchat**: Public profile required

  ## Plan Limits

  Zernio enforces usage limits based on your plan:

  - **Free**: 10 posts/month, 2 Social Sets - $0/mo
  - **Build**: 120 posts/month, 10 Social Sets - $13/mo (billed yearly)
  - **Accelerate**: Unlimited posts, 50 Social Sets - $33/mo (billed yearly)
  - **Unlimited**: Unlimited posts, Unlimited Social Sets - $667/mo (billed yearly)

  Optional add-ons available: Analytics, Comments + DMs

  Monitor usage with the Usage Statistics operation.

  ## Error Handling

  The node handles various error scenarios:

  - **403**: Plan limits exceeded
  - **401**: Invalid API key
  - **400**: Invalid request data
  - **404**: Resource not found
  - **429**: Rate limit exceeded

  Check the node output for detailed error messages and upgrade suggestions.

  ## Development

  ### Prerequisites
  - Node.js 18+
  - TypeScript
  - n8n development environment

  ### Setup
  ```bash
  git clone https://github.com/zernio-dev/n8n-nodes-zernio.git
  cd n8n-nodes-zernio
  npm install
  npm run build
  ```

  ### Linting
  ```bash
  npm run lint        # Check for issues
  npm run lintfix     # Fix automatically
  ```

  ## Support

  - **Documentation**: [Zernio API Docs](https://docs.zernio.com)
  - **Dashboard**: [zernio.com/dashboard](https://zernio.com/dashboard)
  - **Email**: [miki@zernio.com](mailto:miki@zernio.com)
  - **Issues**: [GitHub Issues](https://github.com/zernio-dev/n8n-nodes-zernio/issues)

  ## License

  MIT

  ## Contributing

  Contributions are welcome! Please read our contributing guidelines and submit pull requests.

  ---

  **Made with love by the Zernio team**

  [Website](https://zernio.com) | [Documentation](https://docs.zernio.com) | [Dashboard](https://zernio.com/dashboard)

ai_documentation_summary:
  {"purpose":"A community n8n node that schedules and manages social media posts across multiple platforms including Twitter/X, Instagram, LinkedIn, TikTok, YouTube, and others using the Zernio API.","capabilities":["Schedule and publish posts to multiple social media platforms simultaneously","Create, update, delete, and retry social media posts","Manage social media profiles and connect accounts","Upload and manage media files (images/videos up to 5GB)","Schedule posts with specific dates, times, and timezones","Bulk upload multiple posts at once","Monitor usage statistics and plan limits","Get post analytics and follower statistics","Manage queue slots for scheduling","Handle platform-specific features (e.g., Instagram Stories, YouTube Shorts, Google Business Reviews)"],"authentication":"API key required (entered via n8n credentials as 'Zernio API')","commonUseCases":["Automated social media content scheduling","Cross-platform brand management","Client social media outsourcing","Content publishing workflows with time-based triggers","Social media analytics and performance tracking"],"limitations":["Published posts cannot be deleted","Profile creation is subject to plan limits","Bluesky account connection requires manual credential entry","Some features may depend on Zernio's plan tiers"],"relatedNodes":["n8n-nodes-base.code","n8n-nodes-base.httpRequest","n8n-nodes-base.waitUntil","n8n-nodes-base.if"]}


