---
title: "Get work flow by ID"
method: GET
path: "/api/v1/agentic/work-flows/{id}"
tags: ["Agentic - Work Flows"]
---

# Get work flow by ID

`GET /api/v1/agentic/work-flows/{id}`

## Request

- Base URL: `https://api.voicelogica.ai`
- URL: `https://api.voicelogica.ai/api/v1/agentic/work-flows/{id}`
- Auth: API key in header `x-api-key`

## Path parameters

- `id` string, required

## Headers

- `x-api-key` string, required
- `x-company-id` string

## Response `200`

Work Flow retrieved successfully

- object: Response schema for function call including all details and relationships
  - `id` string, required: Unique identifier
  - `createdAt` string, date-time, required: Creation timestamp
  - `active` boolean, required: Whether the entity is active
  - `createdBy` string, required: Name of the user who created the entity
  - `createdById` string, required: ID of the user who created the entity
  - `modifiedAt` string, date-time: ISO 8601 date string
  - `modifiedBy` string: Name of the user who last modified the entity
  - `modifiedById` string: ID of the user who last modified the entity
  - `companyId` string, required: Company identifier
  - `company` object: Any valid JSON value
  - `groupIds` string[]: Linked group IDs
  - `name` string, required: Name of the function call
  - `triggers` object[]: Trigger node that starts the flow
    - `id` number, required
    - `name` string, required
    - `position` object, required
      - `x` number, required
      - `y` number, required
    - `outputs` object, required
    - `className` string
    - `data` union
      - object
        - `triggerType` 'onCallStart' | 'onCallConnect' | 'onCallEnd' | 'onCallTransfer' | 'onMissedCall' | 'onDTMFInput' | 'onKeywordDetected' | 'duringCall', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `functionName` string
          - `keywords` string[]
          - `condition` string
          - `parameters` object[]: Parameters for the function call
            - `id` string
            - `name` string, required
            - `displayName` string
            - `index` integer
            - `description` string
            - `aiGenerated` boolean
            - `type` 'string' | 'number' | 'boolean' | 'array' | 'date' | 'time' | 'enum' | 'object', required
            - `arrayType` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum' | 'object'
            - `objectProperties` object[]
              - …
            - `enumOptions` string[]
            - `required` boolean
            - `value` union: Tool parameters: the fixed value used when aiGenerated is false. Post-call analysis properties: a fallback saved only when the analysis cannot produce a value (call shorter than minimumDuration, not answered, no caller speech, or the AI left the field empty). It never replaces a value the AI extracted. Supports {{variables}}. Ignored on top-level object/array properties. Pass it as a plain string, number or boolean (e.g. "{{customer_name}}"), never wrapped in an object.
              - …
            - `isConstantForContactEntity` boolean
          - `generateMessageBeforeRunningWorkflow` boolean
          - `messageAiGenerated` boolean
          - `messagePrompt` string
          - `playWaitMusic` boolean: When true (default), play keyboard wait music while this duringCall workflow tool runs
          - `useProtectedValues` boolean: onCallEnd only. When true, the non-AI steps of this workflow (API call, integrations, booking, email, SMS, sheets, conditions) get the REAL values the caller said ({{protected.afm}}, {{afm_1}}, …) when the agent protects sensitive data; AI steps (llmCompletion, aiResponse, managedAgent, googleSearch) always get placeholders. Every use is audited. Only members who may reveal sensitive data can turn it on.
      - object
        - `triggerType` 'onEmailReceived', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `emailFilters` object
            - `from` string[]
            - `subject` string[]
            - `labels` string[]
      - object
        - `triggerType` 'onAPICall', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `payloadSchema` object: Expected payload structure
            - `type` 'object', required
            - `properties` object, required
            - `required` string[]
      - object
        - `triggerType` 'onContactCreated' | 'onCompanyCreated' | 'onDealCreated' | 'onTicketCreated' | 'onPropertyChange', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `resource` 'contact' | 'company' | 'deal' | 'ticket' | 'property'
          - `property` 'hs_lead_status' | 'lifecyclestage' | 'hubspot_owner_id' | 'companyname' | 'domain' | 'dealstage' | 'amount' | 'closedate' | 'closed_won_reason' | 'closed_lost_reason' | 'pipeline' | 'hs_pipeline_stage' | 'hs_due_date'
      - object
        - `triggerType` 'onWooCommerce', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `getCustomerOrders` boolean
          - `getProductByName` boolean
          - `getProductByCode` boolean
          - `productCodeType` 'id' | 'sku' | 'global_unique_id'
          - `createOrder` boolean
          - `getOrderById` boolean
          - `notifyEmailsOnOrderCreation` string[]
      - object
        - `triggerType` 'onYubotoPbxChannelHangup' | 'onYubotoPbxChannelAnswer' | 'onYubotoPbxChannelCreate', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `username` string
          - `password` string
          - `agentId` string
          - `allowedExtensions` string[]
      - object
        - `triggerType` 'onCampaignLeadStatusChanged', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `campaignId` string: Campaign to watch. Omit to fire for every campaign of the company.
          - `statuses` string[]: Lead statuses that fire the workflow. Omit or empty = every outcome status.
          - `stages` string[]: Only fire when the lead is in one of these campaign stage names. Omit or empty = any stage.
      - object
        - `triggerType` 'onShopifyEvent', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `topics` string[], required: Shopify events that start the workflow.
          - `financialStatuses` string[]: Only when the order payment status is one of these. Empty = any.
          - `fulfillmentStatuses` string[]: Only when the order fulfillment status is one of these. Empty = any.
          - `shipmentStatuses` string[]: Shipment topics only: only when the carrier status is one of these. Empty = any.
          - `paymentGateways` string[]: Only when a payment gateway name contains one of these (case-insensitive), e.g. "Cash on Delivery". Empty = any.
          - `tags` string[]: Only when the order has at least one of these tags (case-insensitive). Empty = any.
          - `minTotal` number: Only when the order total is at least this amount.
          - `maxTotal` number: Only when the order total is at most this amount.
      - object
        - `triggerType` 'onLeadReceived', required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `triggerConfig` object
          - `sources` string[]: Only leads from these sources start the workflow. Empty = any source, including ones added later.
          - `formIds` string[]: Only these forms: our lead form ids (from lead_forms_list_forms). A platform form id or a form name also matches, for older triggers. Empty = any.
          - `requirePhone` boolean: Skip a lead with no phone number.
          - `includeTestSubmissions` boolean: Also fire for test submissions. Off by default.
  - `nodes` object[]: Action nodes in the flow
    - `id` number, required
    - `name` string, required
    - `position` object, required
      - `x` number, required
      - `y` number, required
    - `inputs` object, required
    - `outputs` object, required
    - `className` string
    - `data` union
      - object
        - `nodeType` 'emailConfig', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `emailConfig` object, required
          - `type` 'send_email' | 'create_draft_email', required
          - `to` string[], required
          - `bcc` string[], required
          - `cc` string[], required
          - `subject` string
          - `body` string, required
          - `mailboxId` string
          - `sendAs` string
          - `fromSystem` boolean
          - `attachments` string[]
      - object
        - `nodeType` 'sendSms', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `smsConfig` object, required
          - `to` string[], required
          - `body` string, required
          - `from` string
      - object
        - `nodeType` 'apiCall', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `apiConfig` object, required
          - `url` string, required
          - `headers` object[], required
            - `key` string, required
            - `value` string, required
          - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required
          - `params` object[], required
            - `key` string, required
            - `value` string, required
          - `bodyType` 'raw' | 'form-data'
          - `rawType` 'json' | 'xml' | 'text' | 'html'
          - `body` object: Any valid JSON value
          - `formBody` object[]
            - `type` 'file' | 'text', required
            - `key` string, required
            - `value` union, required
              - …
          - `apiResponse` string, required
          - `sendNotificationOnFailure` boolean
          - `cacheEnabled` boolean
          - `cacheTtl` '1m' | '15m' | '30m' | '45m' | '1h' | '2h' | '4h' | '1d' | '3d' | '7d' | '2w' | '1M' | 'always'
          - `timeoutSeconds` number
          - `responseHeaderVariables` object[], required: Save response headers into variables: {key: header name, value: variable name}. The next node reads {{node_<id>.<variable>}}. For APIs that renew a token in a response header; chain the calls inside one workflow run.
            - `key` string, required: Response header name, matched case-insensitively
            - `value` string, required: Variable name: read it as {{node_<id>.<name>}}
      - object
        - `nodeType` 'codeExecution', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `codeConfig` object, required
          - `code` string, required
          - `language` 'javascript' | 'python' | 'java' | 'cpp' | 'php' | 'ruby', required
          - `properties` object[]: Properties for the code
            - `name` string, required
            - `displayName` string
            - `index` integer
            - `description` string
            - `aiGenerated` boolean
            - `type` 'string' | 'number' | 'boolean' | 'array' | 'date' | 'time' | 'enum' | 'object', required
            - `arrayType` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum' | 'object'
            - `objectProperties` object[]
              - …
            - `enumOptions` string[]
            - `required` boolean
            - `value` union: Tool parameters: the fixed value used when aiGenerated is false. Post-call analysis properties: a fallback saved only when the analysis cannot produce a value (call shorter than minimumDuration, not answered, no caller speech, or the AI left the field empty). It never replaces a value the AI extracted. Supports {{variables}}. Ignored on top-level object/array properties. Pass it as a plain string, number or boolean (e.g. "{{customer_name}}"), never wrapped in an object.
              - …
            - `isConstantForContactEntity` boolean
      - object
        - `nodeType` 'googleDocConfig', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `googleDocConfig` object, required
          - `docName` string, required
          - `body` string, required
          - `isPublic` boolean
      - object
        - `nodeType` 'createEvent', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `eventConfig` object
          - `calendarId` string: Google calendar id. Empty = the company's primary calendar.
          - `summary` string: Event title.
          - `startDateTime` string: Start, ISO 8601 ("2026-08-12T15:00:00") or "YYYY-MM-DD HH:mm".
          - `endDateTime` string: End. Empty = start + durationMinutes.
          - `durationMinutes` number, required: Used only when endDateTime is empty. Defaults to 30.
          - `description` string
          - `location` string
          - `attendees` string: Comma-separated emails.
          - `timeZone` string: IANA zone. Empty = the company timezone.
          - `isOnline` boolean: When true, Google adds a Meet link to the event.
      - object
        - `nodeType` 'sendPhoneCall', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `phoneCallConfig` object, required
          - `phoneNumber` string, required
          - `systemPrompt` string, required
          - `numberOfTries` number
          - `voipPhoneId` string
          - `sipTrunkId` string
          - `agentId` string, required
          - `fallbackToSms` boolean
          - `smsConfig` object
            - `to` string[], required
            - `body` string, required
            - `from` string
          - `keepOnlyPhoneCallConfigSystemPrompt` boolean
          - `callNow` boolean
          - `scheduleAt` string
      - object
        - `nodeType` 'llmCompletion', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `llmCompletionConfig` object, required
          - `prompt` string, required
          - `parameters` object[]: Parameters for the function call
            - `name` string, required
            - `displayName` string
            - `index` integer
            - `description` string
            - `aiGenerated` boolean
            - `type` 'string' | 'number' | 'boolean' | 'array' | 'date' | 'time' | 'enum' | 'object', required
            - `arrayType` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum' | 'object'
            - `objectProperties` object[]
              - …
            - `enumOptions` string[]
            - `required` boolean
            - `value` union: Tool parameters: the fixed value used when aiGenerated is false. Post-call analysis properties: a fallback saved only when the analysis cannot produce a value (call shorter than minimumDuration, not answered, no caller speech, or the AI left the field empty). It never replaces a value the AI extracted. Supports {{variables}}. Ignored on top-level object/array properties. Pass it as a plain string, number or boolean (e.g. "{{customer_name}}"), never wrapped in an object.
              - …
            - `isConstantForContactEntity` boolean
          - `completionModel` object, required
            - `completionProvider` 'openai' | 'groq' | 'together' | 'mistral' | 'anthropic' | 'gemini' | 'grok' | 'minimax' | 'custom-llm', required
            - `priority` boolean
            - `model` string, required
            - `temperature` number
            - `maxCompletionTokens` number
            - `reasoningEffort` 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max'
            - `openAiTranscriptionModel` 'whisper-1' | 'gpt-live-transcribe' | 'gpt-realtime-whisper' | 'gpt-4o-transcribe' | 'gpt-4o-mini-transcribe' | 'fromTranscriptionProvider'
            - `transcriptionPrompt` string
            - `fallbackModel` object
              - …
      - object
        - `nodeType` 'googleSheet', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `googleSheetConfig` object, required
          - `sheetId` string
          - `sheetName` string, required
          - `defaultParameters` object
            - `date` boolean, required
            - `id` boolean, required
            - `status` boolean, required
            - `endCallReason` boolean, required
            - `caller` boolean, required
            - `receiver` boolean, required
            - `sender` boolean, required
            - `recording` boolean, required
            - `transcript` boolean, required
            - `duration` boolean, required
            - `entityType` boolean, required
          - `properties` string[]
      - object
        - `nodeType` 'googleSearch', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `googleSearchConfig` object, required
          - `sites` string[]
          - `excludedSites` string[]
          - `dateRestrict` 'd1' | 'd7' | 'w1' | 'm1' | 'm6' | 'y1' | 'y5'
          - `searchQuery` string, required
          - `scrapeWebsiteResults` boolean
          - `topNumberOfResults` number
          - `topNumberOfResultsToScrape` number
          - `scrapeWithSlowService` boolean
      - object
        - `nodeType` 'sendViber', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `viberConfig` object, required
          - `to` string[], required
          - `body` string, required
          - `from` string, required
          - `viberProviderId` string, required
          - `fallbackToSms` boolean
          - `smsConfig` object
            - `to` string[], required
            - `body` string, required
            - `from` string
          - `viberChannelId` string
      - object
        - `nodeType` 'switch', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `switchConfig` object, required
          - `cases` object[], required
            - `block` object, required
              - …
            - `transition` string
            - `transitionIndex` number
      - object
        - `nodeType` 'if', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `ifConfig` object, required
          - `conditionBlock` object, required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
      - object
        - `nodeType` 'filter', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `filterConfig` object, required
          - `conditionBlock` object, required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
      - object
        - `nodeType` 'loop', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `loopConfig` object, required
          - `array` string, required
      - object
        - `nodeType` 'tableNode', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `tableConfig` object
          - `columns` object[], required
            - `key` string, required
            - `label` string, required
            - `type` 'string' | 'number' | 'boolean'
          - `rows` object[], required
          - `filters` object[]
            - `column` string, required
            - `op` 'equals' | 'notEquals' | 'contains' | 'gt' | 'lt' | 'gte' | 'lte', required
            - `value` string, required
          - `mode` 'producer' | 'lookup'
          - `keyColumn` string
          - `keyValue` string
      - object
        - `nodeType` 'hubspotContact' | 'hubspotCompany' | 'hubspotDeal' | 'hubspotTicket' | 'hubspotTask' | 'hubspotNote' | 'hubspotMeeting' | 'hubspotEmail' | 'hubspotCall', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `hubspotConfig` object, required
          - `resource` 'contact' | 'company' | 'deal' | 'ticket' | 'call' | 'email' | 'task' | 'note' | 'meeting', required
          - `operation` 'get' | 'create' | 'createOrUpdate' | 'getOrCreate' | 'delete' | 'update' | 'search' | 'list' | 'exists', required
          - `value` object
            - `valueType` 'id' | 'email' | 'phone' | 'name' | 'domain' | 'company' | 'contact' | 'HubspotFilterByType', required
            - `value` string, required
          - `associations` object[]
            - `associationType` 'contact' | 'company' | 'deal' | 'ticket' | 'call' | 'email' | 'task' | 'note' | 'meeting', required
            - `valueType` 'id' | 'email' | 'phone' | 'name' | 'domain' | 'company' | 'contact' | 'HubspotFilterByType', required
            - `value` string, required
          - `owner` object
            - `valueType` 'id' | 'email' | 'phone' | 'name' | 'domain' | 'company' | 'contact' | 'HubspotFilterByType', required
            - `value` string, required
          - `contactData` object
            - `properties` object
              - …
          - `companyData` object
            - `properties` object
              - …
          - `dealData` object
            - `properties` object
              - …
          - `ticketData` object
            - `properties` object
              - …
          - `taskData` object
            - `properties` object
              - …
          - `noteData` object
            - `properties` object
              - …
          - `meetingData` object
            - `properties` object, required
              - …
          - `emailData` object
            - `properties` object
              - …
          - `callData` object
            - `properties` object
              - …
      - object
        - `nodeType` 'googleSheetSettings', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `googleSheetSettingsConfig` object
          - `googleSheetId` string, required: The unique identifier of the Google Sheet
          - `sheetName` string, required: The name of the specific sheet within the Google Sheet
          - `operation` 'getRow' | 'getRows' | 'updateRow' | 'appendRow' | 'deleteRow' | 'getData', required: The operation to perform on the Google Sheet (getRow, getRows, updateRow, appendRow, deleteRow)
          - `filter` object: Filter to apply for selecting rows, such as by index or column name
            - `filterType` 'index' | 'columnName', required
            - `column` string, required
            - `operator` 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'isNull' | 'isNotNull' | 'isTrue' | 'isFalse' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'in' | 'notIn' | 'between', required
            - `fieldType` 'string' | 'phone' | 'email' | 'number' | 'boolean' | 'date' | 'time' | 'enum', required
            - `fieldValue` union
              - …
          - `values` object[]: Key-value pairs for the row data
            - `key` string, required
            - `value` object, required: Any valid JSON value
      - object
        - `nodeType` 'aiResponse', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `aiResponseConfig` object, required
          - `contextForAi` string: Context for the AI response
          - `generateMessage` boolean: Whether to generate a message
          - `aiGeneratedMessage` boolean: Whether the message is AI-generated
          - `message` string: Message for the AI response
          - `properties` object: Properties for the AI response
          - `doNotRespondToCall` boolean: Whether to not respond to the call
          - `forwardCallTo` string: Forward to the call. User can either input a phone number or an agent id
          - `addDelayBeforePickingUp` string: Add a delay before picking up the call in seconds
      - object
        - `nodeType` 'transferCall', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `transferCallConfig` object, required
          - `typeOfTransfer` 'User' | 'External' | 'Agent', required: Type of transfer
          - `transferCallReason` string
          - `agentId` string
          - `externalNumber` string
          - `generateMessage` boolean
          - `aiGeneratedMessage` boolean
          - `message` string
          - `transferMode` 'blind' | 'warm' | 'attended'
          - `blindTransfer` boolean
          - `showCallerId` boolean
          - `announceTransferReason` boolean
      - object
        - `nodeType` 'afmSearch', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `afmSearchConfig` object, required
          - `afm` string, required: AFM of company
      - object
        - `nodeType` 'galaxyGetCustomer' | 'galaxySearchItems' | 'galaxyCheckStock' | 'galaxyGetPrice' | 'galaxyCalculateOrder' | 'galaxyPlaceOrder' | 'galaxyUpdateOrder' | 'galaxyGetOrderStatus' | 'galaxyGetTransactionHistory' | 'galaxyGetCustomerBalance' | 'galaxyGetCustomerAging' | 'galaxyGetFinInfoPerDrugType' | 'galaxyGetItemPurchases' | 'galaxyGetCustomerKartelaLink' | 'galaxyFindItemsByActiveIngredient' | 'galaxyGetInvoicePdfLinks' | 'galaxyGetNextRoute' | 'galaxyCustomRequest', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `galaxyConfig` object
          - `operation` 'getCustomer' | 'searchItems' | 'checkStock' | 'getPrice' | 'calcLines' | 'calculateOrder' | 'placeOrder' | 'updateOrder' | 'getOrderStatus' | 'getTransactionHistory' | 'getCustomerBalance' | 'getCustomerAging' | 'getFinInfoPerDrugType' | 'getItemPurchases' | 'getCustomerKartelaLink' | 'findItemsByActiveIngredient' | 'getInvoicePdfLinks' | 'getNextRoute' | 'customRequest', required
          - `getCustomer` object
            - `by` 'phone' | 'tin' | 'custCode', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `searchItems` object
            - `query` string, required: Free-text search query (supports {{variables.x}})
            - `limit` integer
          - `checkStock` object
            - `itemCode` string, required
            - `wrhsCode` string: Overrides the company default warehouse
          - `getPrice` object
            - `ItemCode` string
            - `ItcpID` string
            - `CustCode` string
            - `CustID` string
            - `EntryType` string, required
            - `Date` string, required
            - `Quantity` number, required
          - `calcLines` object
            - `ItemCode` string
            - `ItcpID` string
            - `CustCode` string
            - `CustID` string
            - `EntryType` string, required
            - `Date` string, required
            - `Quantity` number, required
            - `WrhsCode` string, required
            - `AlterCode` string
            - `Barcode` string
          - `placeOrder` object
            - `entry` object, required
              - …
            - `previewFirst` boolean
          - `updateOrder` object
            - `ID` string, required
            - `EntryStatus` integer
            - `Comments` string
            - `LockTransaction` integer
          - `getOrderStatus` object
            - `id` string: Optional specific transaction ID — omit to list all
            - `revNum` integer
            - `custCode` string: List the orders of this customer instead (GetTransactions by CustCode, per branch). Template strings supported.
            - `dateFrom` string: With custCode: ISO date YYYY-MM-DD. Defaults to today.
            - `dateTo` string: With custCode: ISO date YYYY-MM-DD. Defaults to today.
          - `getTransactionHistory` object
            - `CustCode` string, required
            - `DateFrom` string, required
            - `DateTo` string, required
          - `getCustomerBalance` object
            - `custCode` string, required: Galaxy customer code. Template strings supported.
          - `getCustomerAging` object
            - `custCode` string, required
            - `dateTo` string: ISO date YYYY-MM-DD. Defaults to today.
          - `getFinInfoPerDrugType` object
            - `custCode` string, required: Galaxy customer code. Template strings supported.
            - `fromDate` string: ISO date YYYY-MM-DD. Defaults to start of current year.
          - `getItemPurchases` object
            - `custCode` string, required: Galaxy customer code. Template strings supported.
            - `itemCode` string, required: Galaxy item code (from item search). Template strings supported.
            - `dateFrom` string: ISO date YYYY-MM-DD. Defaults to today.
            - `dateTo` string: ISO date YYYY-MM-DD. Defaults to today.
            - `compCode` string: Branch/company code. Defaults to the customer's branch.
          - `getCustomerKartelaLink` object
            - `custCode` string, required
            - `dateFrom` string: ISO date YYYY-MM-DD. Defaults to start of current year.
            - `dateTo` string: ISO date YYYY-MM-DD. Defaults to today.
          - `findItemsByActiveIngredient` object
            - `query` string, required: Active ingredient name or AtloID. Supports templates.
            - `limit` integer
          - `getInvoicePdfLinks` object
            - `custCode` string
            - `custTin` string
            - `cussCode` string
            - `id` string
            - `dateFrom` string
            - `dateTo` string
          - `getNextRoute` object
            - `custCode` string, required
          - `customRequest` object
            - `method` 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
            - `path` string, required: Path added after the Galaxy ERP base URL, e.g. /api/crossdomain/advancedcustomviews/<guid>. Supports {{variables}}.
            - `params` object[]: Key/value properties sent as the query string. Values support {{variables}}.
              - …
            - `body` string: Optional raw JSON request body (supports {{variables}}). Example for an advanced custom view: {"filters":[{"CompCode":"01","CustCode":"{{node_1.custCode}}"}],"MasterDetailTree":false}
            - `apiResponse` string: Editor-only: JSON schema of the expected response (same as the apiCall node's "API Response"). Powers the variable picker so downstream nodes can reference individual response fields; at runtime the real response is flattened into node_N.* regardless.
      - object
        - `nodeType` 'salesforceGetContact' | 'salesforceCreateLead' | 'salesforceLogCall', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `salesforceConfig` object
          - `operation` 'getContact' | 'createLead' | 'logCall', required
          - `getContact` object
            - `by` 'phone' | 'email' | 'id', required: Which field to look up by
            - `value` string, required: Template string — supports {{variables.x}} / {{call.phoneNumber}}
            - `objectType` 'Contact' | 'Lead': For by=id: which SObject the Id belongs to (default Contact).
          - `createLead` object
            - `lastName` string, required: Lead last name — required by Salesforce. Supports templates.
            - `company` string, required: Lead company — required by Salesforce. Supports templates.
            - `firstName` string
            - `phone` string
            - `email` string
            - `description` string: Short summary of the request / call reason.
          - `logCall` object
            - `whoId` string, required: Contact or Lead Id the call is logged against. Supports templates.
            - `subject` string, required: Task subject, e.g. "Inbound call — order status".
            - `description` string: Call notes.
      - object
        - `nodeType` 'guestyFindOwner' | 'guestyFindGuest' | 'guestyIdentifyCaller' | 'guestyGetListings' | 'guestyGetListing' | 'guestyGetReservations' | 'guestyGetReservation' | 'guestyGetHouseRules' | 'guestyCustomRequest', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `guestyConfig` object
          - `operation` 'findOwner' | 'findGuest' | 'identifyCaller' | 'getListings' | 'getListing' | 'getReservations' | 'getReservation' | 'getHouseRules' | 'customRequest', required
          - `findOwner` object
            - `by` 'phone' | 'email': Which field to search the owner by
            - `value` string, required: Search term (template, e.g. {{call.phone_number}})
          - `findGuest` object
            - `value` string, required: Guest phone to look up via their reservations (template)
          - `identifyCaller` object
            - `value` string, required: Caller phone (template) — matched against owners AND guests
          - `getListings` object
            - `ids` string: Comma-separated listing ids (template) — e.g. {{node_X.owner.listings}}
            - `ownerId` string: Resolve the owner's listing ids first, then fetch them (template)
            - `q` string: Free-text search across title/nickname/address (template)
          - `getListing` object
            - `id` string: Listing _id (template) — returns the full property
            - `nickname` string: Listing nickname (template) — used when no id is known
            - `fields` string: Space-separated field selection; omit for the full listing
          - `getReservations` object
            - `listingIds` string: Comma-separated listing ids to scope to (template)
            - `listingNickname` string: Scope to a single listing by its nickname (template)
            - `ownerId` string: Scope to all of an owner's listings (resolved to ids) (template)
            - `guestPhone` string: Scope to a guest's reservations by their phone (template)
            - `dateFrom` string: Window start: ISO date, `today`, or relative like `-7d` (template)
            - `dateTo` string: Window end: ISO date, `today`, or relative like `+7d` (template)
            - `windowDays` integer: When dateFrom/dateTo are omitted, use today∓windowDays as the overlap window
            - `status` string: Filter by reservation status (template)
            - `limit` integer
          - `getReservation` object
            - `id` string, required: Reservation _id / confirmation id (template)
          - `getHouseRules` object
            - `listingIds` string, required: Comma-separated listing ids (template) — house rules are keyed by listing/unit-type
          - `customRequest` object
            - `method` 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
            - `path` string, required: Path after the base URL, e.g. /v1/reservations (template)
            - `params` object[]: Query params (templates)
              - …
            - `body` string: Raw JSON body (template) — ignored for GET
      - object
        - `nodeType` 'helpdeskCreateTicket', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `helpdeskConfig` object
          - `operation` 'createTicket', required
          - `createTicket` object
            - `subject` string: Ticket subject (template, e.g. "Call from {{call.phone_number}}")
            - `description` string: Ticket body (template, e.g. {{call.summary}})
            - `requesterPhone` string: Requester phone (template, defaults to {{call.phone_number}})
            - `requesterEmail` string: Requester email (template)
            - `requesterName` string: Requester display name (template)
            - `priority` 'low' | 'medium' | 'high' | 'urgent': Ticket priority
      - object
        - `nodeType` 'courierTrackVoucher', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `courierConfig` object
          - `operation` 'trackVoucher', required
          - `trackVoucher` object
            - `courier` string: Courier to query (acs_courier, speedex, geniki_taxydromiki, elta_courier, boxnow, skroutz_lastmile, taxydema). Omit to try every connected courier.
            - `voucher` string: Voucher/tracking number (template, e.g. {{node_5.order.meta.voucher}})
      - object
        - `nodeType` 'vivaCreatePaymentLink', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `vivaConfig` object
          - `operation` 'createPaymentLink', required
          - `createPaymentLink` object
            - `amount` string: Amount in EUR as a decimal (template, e.g. "25.50" or {{node_3.order.total}})
            - `description` string: Shown to the customer on the checkout page (template)
            - `customerName` string: Customer full name (template)
            - `customerPhone` string: Customer phone (template, e.g. {{call.phone_number}})
            - `language` 'el' | 'en': Checkout page language
      - object
        - `nodeType` 'createTrackedPage', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `trackedPageConfig` object
          - `html` string, required: Page HTML (template, e.g. {{node_2.html}} from an llmCompletion node). Scripts and forms are stripped; styles are kept.
          - `title` string: Browser tab title (template)
          - `expiresInDays` integer: How long the link stays open (default 30 days)
      - object
        - `nodeType` 'shopifyGetCustomer' | 'shopifyGetOrdersByCustomer' | 'shopifyGetOrderById' | 'shopifySearchProducts' | 'shopifyGetProductById' | 'shopifySyncProductsToSkroutz', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `shopifyConfig` object
          - `operation` 'getCustomer' | 'getOrdersByCustomer' | 'getOrderById' | 'searchProducts' | 'getProductById' | 'syncProductsToSkroutz', required
          - `getCustomer` object
            - `by` 'phone' | 'email' | 'id', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `getOrdersByCustomer` object
            - `customerId` union, required: Numeric Shopify customer id. Template strings supported.
              - …
            - `limit` integer
          - `getOrderById` object
            - `orderId` union, required: Numeric Shopify order id.
              - …
          - `searchProducts` object
            - `query` string: Free-text search — mapped to vendor / product_type / handle.
            - `vendor` string
            - `productType` string
            - `limit` integer
          - `getProductById` object
            - `productId` union, required: Numeric Shopify product id.
              - …
          - `syncProductsToSkroutz` object
            - `maxRecords` integer
      - object
        - `nodeType` 'soft1GetCustomer' | 'soft1SearchItems' | 'soft1GetCustomerBalance' | 'soft1GetCustomerAging' | 'soft1GetCustomerHistory' | 'soft1CreateSalesDoc' | 'soft1TransmitEInvoice', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `soft1Config` object
          - `operation` 'getCustomer' | 'searchItems' | 'getCustomerBalance' | 'getCustomerAging' | 'getCustomerHistory' | 'createSalesDoc' | 'transmitEInvoice', required
          - `getCustomer` object
            - `by` 'phone' | 'tin' | 'code', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `searchItems` object
            - `query` string, required: Free-text search query
            - `limit` integer
          - `getCustomerBalance` object
            - `tin` string
            - `code` string
          - `getCustomerAging` object
            - `tin` string
            - `code` string
          - `getCustomerHistory` object
            - `trdr` string
            - `tin` string
            - `code` string
            - `from` string: ISO date YYYY-MM-DD
            - `to` string: ISO date YYYY-MM-DD
            - `limit` integer
          - `createSalesDoc` object
            - `trdr` union
              - …
            - `custCode` string
            - `series` union
              - …
            - `comments` string
            - `lines` object[], required
              - …
            - `transmit` boolean
          - `transmitEInvoice` object
            - `key` string, required
            - `template` string
      - object
        - `nodeType` 'exelixisSmartGetContact' | 'exelixisSmartListCompanyContacts' | 'exelixisSmartListSupportMembers' | 'exelixisSmartCreateTicket', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `exelixisSmartConfig` object
          - `operation` 'getContact' | 'listCompanyContacts' | 'listSupportMembers' | 'createTicket', required
          - `getContact` object
            - `phone` string: Template — e.g. {{call.phone_number}}
            - `afm` string: Template — e.g. {{dynamicVariables.afm}}
          - `listCompanyContacts` object
            - `companyId` string, required: Smart company_id (template) to list contacts for
          - `listSupportMembers` object
          - `createTicket` object
            - `companyId` string, required: Smart company_id (template) — required by the ERP
            - `contactId` string
            - `supportMemberId` string
            - `title` string, required
            - `summary` string, required
            - `callUrl` string: Template — defaults to {{call.call_url}}
      - object
        - `nodeType` 'pylonGetCustomer' | 'pylonSearchItems' | 'pylonGetCustomerBalance' | 'pylonCreateSalesOrder' | 'pylonGetData' | 'pylonPostData', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `pylonConfig` object
          - `operation` 'getCustomer' | 'searchItems' | 'getCustomerBalance' | 'createSalesOrder' | 'getData' | 'postData', required
          - `getCustomer` object
            - `by` 'phone' | 'tin' | 'code', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `searchItems` object
            - `query` string, required: Free-text search query
            - `limit` integer
          - `getCustomerBalance` object
            - `tin` string
            - `code` string
          - `createSalesOrder` object
            - `customerTin` string: Customer TIN — supports {{dynamicVariables.x}}. Optional when rawData supplies the customer.
            - `seriesCode` string
            - `customerBranch` string
            - `paymentMethod` string
            - `lines` object[]
              - …
            - `rawData` object: Advanced: a JSON object merged verbatim into the Pylon order payload, overriding the structured fields above. Use native Pylon column names, e.g. {"Lines":[{"CenlItemCode":"GG11","CenlAMeasurementQty":2}],"CsdcRemarks":"…"}. String values support {{dynamicVariables.x}} templates. Bypasses the structured-field validation, so it must match the target Script exactly.
          - `getData` object
            - `entitycode` string, required: Operator-defined getjsondata Script code, e.g. itemsVoiceAgent or custInfoVoice
            - `extras` object[]: Script parameters; omit or [] for none
              - …
            - `packageSize` integer: Page size (default 200)
            - `allPages` boolean: Walk every page until exhausted; otherwise just page 1
          - `postData` object
            - `entitycode` string, required: Operator-defined postdata Script code, e.g. orderVoice or SalesOrders
            - `data` object, required: JSON object serialized into the postdata `data` field. Use the shape the target Script expects. String values support {{dynamicVariables.x}} templates.
      - object
        - `nodeType` 'entersoftGetCustomer' | 'entersoftSearchItems' | 'entersoftGetCustomerBalance' | 'entersoftGetCustomerAging' | 'entersoftRunPublicQuery' | 'entersoftRunEbsService' | 'entersoftCreateSalesDoc', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `entersoftOneConfig` object
          - `operation` 'getCustomer' | 'searchItems' | 'getCustomerBalance' | 'getCustomerAging' | 'runPublicQuery' | 'runEbsService' | 'createSalesDoc', required
          - `getCustomer` object
            - `by` 'phone' | 'tin' | 'code', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `searchItems` object
            - `query` string, required: Free-text query — supports templates
            - `limit` integer
          - `getCustomerBalance` object
            - `code` string, required: Customer code — supports templates
          - `getCustomerAging` object
            - `code` string, required
          - `runPublicQuery` object
            - `publicQueryGid` string
            - `groupId` string
            - `filterId` string
            - `params` object: Param object — values may be templates
          - `runEbsService` object
            - `serviceName` string, required
            - `parameters` object
          - `createSalesDoc` object
            - `customerGid` string
            - `customerCode` string
            - `series` string
            - `comments` string
            - `lines` object[], required
              - …
            - `ebsServiceName` string
      - object
        - `nodeType` 'wooGetCustomer' | 'wooGetOrdersByCustomer' | 'wooGetOrderById' | 'wooSearchProducts' | 'wooGetProductById' | 'wooCreateOrder', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `wooCommerceConfig` object
          - `operation` 'getCustomer' | 'getOrdersByCustomer' | 'getOrderById' | 'searchProducts' | 'getProductById' | 'createOrder', required
          - `getCustomer` object
            - `by` 'phone' | 'email' | 'id', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `getOrdersByCustomer` object
            - `customerId` union, required: Numeric WooCommerce customer id
              - …
            - `limit` integer
          - `getOrderById` object
            - `orderId` union, required
              - …
          - `searchProducts` object
            - `query` string
            - `sku` string
            - `limit` integer
          - `getProductById` object
            - `productId` union, required
              - …
          - `createOrder` object
            - `customerId` union, required: Numeric customer id (0 for guest)
              - …
            - `lineItems` object[], required
              - …
      - object
        - `nodeType` 'opencartGetCustomer' | 'opencartGetOrdersByCustomer' | 'opencartGetOrderById' | 'opencartSearchProducts' | 'opencartGetProductById' | 'opencartCreateOrder', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `opencartConfig` object
          - `operation` 'getCustomer' | 'getOrdersByCustomer' | 'getOrderById' | 'searchProducts' | 'getProductById' | 'createOrder', required
          - `getCustomer` object
            - `by` 'phone' | 'email' | 'id', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `getOrdersByCustomer` object
            - `customerId` union, required: OpenCart customer id. Template strings supported.
              - …
            - `limit` integer
          - `getOrderById` object
            - `orderId` union, required: OpenCart order id.
              - …
          - `searchProducts` object
            - `query` string: Free-text search. Supports templates.
            - `manufacturer` string: Exact manufacturer filter. Optional.
            - `limit` integer
          - `getProductById` object
            - `productId` union, required: OpenCart product id.
              - …
          - `createOrder` object
            - `customerId` union: Existing OpenCart customer id (for logged-in orders).
              - …
            - `firstname` string
            - `lastname` string
            - `email` string
            - `telephone` string
            - `products` object[], required
              - …
            - `comment` string
      - object
        - `nodeType` 'magentoGetCustomer' | 'magentoGetOrdersByCustomer' | 'magentoGetOrderById' | 'magentoSearchProducts' | 'magentoGetProductById' | 'magentoListShippingOptions', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `magentoConfig` object
          - `operation` 'getCustomer' | 'getOrdersByCustomer' | 'getOrderById' | 'searchProducts' | 'getProductById' | 'listShippingOptions', required
          - `getCustomer` object
            - `by` 'phone' | 'email' | 'id', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `getOrdersByCustomer` object
            - `customerId` union, required: Magento customer id. Template strings supported.
              - …
            - `limit` integer
          - `getOrderById` object
            - `orderId` union, required: Magento order increment id (receipt number) or numeric entity id.
              - …
          - `searchProducts` object
            - `query` string: Free-text search. Supports templates.
            - `limit` integer
          - `getProductById` object
            - `productId` union, required: Magento product id.
              - …
          - `listShippingOptions` object
            - `countryId` string: Destination country as ISO-2 code, e.g. "GR". Defaults to "GR".
            - `postcode` string: Destination postcode. Supports templates.
            - `region` string: Optional region/state name.
            - `sku` string: Optional product SKU to price against.
      - object
        - `nodeType` 'megasoftGetCustomer' | 'megasoftSearchProducts' | 'megasoftGetProductByCode' | 'megasoftListShippingMethods' | 'megasoftListPaymentMethods' | 'megasoftGetCustomerBalance' | 'megasoftGetCustomerOrders' | 'megasoftGetOrderStatus' | 'megasoftGetCustomerPurchases' | 'megasoftListOffers' | 'megasoftGetItemPrice' | 'megasoftGetProductStock' | 'megasoftCreateOrder' | 'megasoftCancelOrder', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `megasoftConfig` object
          - `operation` 'getCustomer' | 'searchProducts' | 'getProductByCode' | 'listShippingMethods' | 'listPaymentMethods' | 'getCustomerBalance' | 'getCustomerOrders' | 'getOrderStatus' | 'getCustomerPurchases' | 'listOffers' | 'getItemPrice' | 'getProductStock' | 'createOrder' | 'cancelOrder', required
          - `getCustomer` object
            - `by` 'phone' | 'code', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `searchProducts` object
            - `query` string, required: Free-text search. Supports templates.
            - `limit` integer
          - `getProductByCode` object
            - `itemCode` string, required: Megasoft item code. Supports templates.
          - `getCustomerBalance` object
            - `customerCode` string, required: Megasoft customer code. Supports templates.
          - `getCustomerOrders` object
            - `customerCode` string, required: Megasoft customer code. Supports templates.
            - `orderNo` string: Optional order number filter. Supports templates.
          - `getOrderStatus` object
            - `orderNo` string: Optional order number. Supports templates.
            - `date` string: Optional modified-since date (yyyy-MM-dd).
          - `getCustomerPurchases` object
            - `customerCode` string, required: Megasoft customer code. Supports templates.
            - `dateFrom` string
            - `dateTo` string
            - `itemCode` string
          - `listOffers` object
            - `offerId` string
            - `activeOnly` boolean
            - `dateFrom` string
          - `getItemPrice` object
            - `customerCode` string, required: Megasoft customer code. Supports templates.
            - `itemCode` string, required: Megasoft item code. Supports templates.
          - `getProductStock` object
            - `itemCode` string, required: Megasoft item code. Supports templates.
          - `createOrder` object
            - `customerCode` string, required: Megasoft customer code. Supports templates.
            - `itemCode` string, required: Megasoft item code. Supports templates.
            - `qty` union, required: Quantity. Number or template string.
              - …
            - `comments` string
          - `cancelOrder` object
            - `orderNo` string, required: Megasoft order number. Supports templates.
            - `seiraPar` string, required: Order series / parastatiko code. Supports templates.
      - object
        - `nodeType` 'gonnaOrderSearchCatalog' | 'gonnaOrderCheckDeliveryAddress' | 'gonnaOrderGetCustomer' | 'gonnaOrderGetCustomerOrders' | 'gonnaOrderGetOrderStatus' | 'gonnaOrderCreatePaymentLink', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `gonnaOrderConfig` object
          - `operation` 'searchCatalog' | 'checkDeliveryAddress' | 'getCustomer' | 'getCustomerOrders' | 'getOrderStatus' | 'createPaymentLink', required
          - `searchCatalog` object
            - `query` string, required: Free-text menu search. Supports {{dynamicVariables.x}}.
            - `limit` integer
          - `checkDeliveryAddress` object
            - `address` string, required: Delivery address. Supports templates.
          - `getCustomer` object
            - `by` 'phone' | 'name', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `getCustomerOrders` object
            - `customerId` string, required: Customer id. Supports templates.
            - `limit` integer
          - `getOrderStatus` object
            - `orderUuid` string, required: Order uuid. Supports templates.
          - `createPaymentLink` object
            - `orderUuid` string, required: Order uuid to charge for. Supports templates.
            - `amount` string: Amount override. Leave blank to use the order total.
      - object
        - `nodeType` 'webhotelierCheckAvailability' | 'webhotelierSearchBookings' | 'webhotelierGetReservation' | 'webhotelierGetAvailabilityCalendar' | 'webhotelierGetRooms' | 'webhotelierGetRates', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `webhotelierConfig` object
          - `operation` 'checkAvailability' | 'searchBookings' | 'getReservation' | 'getAvailabilityCalendar' | 'getRooms' | 'getRates', required
          - `checkAvailability` object
            - `checkin` string, required: Check-in date YYYY-MM-DD. Supports templates.
            - `checkout` string, required: Check-out date YYYY-MM-DD. Supports templates.
            - `adults` string, required: Number of adults. Supports templates.
            - `children` string: Number of children. Supports templates.
            - `rooms` string: Number of rooms. Supports templates.
            - `propertyCode` string: Property code override. Empty = default property.
          - `searchBookings` object
            - `lastName` string: Guest last name. Supports templates. Provide this or email.
            - `email` string: Guest email. Supports templates. Provide this or lastName.
            - `checkinFrom` string: Earliest check-in YYYY-MM-DD. Supports templates.
            - `checkinTo` string: Latest check-in YYYY-MM-DD. Supports templates.
            - `propertyCode` string: Property code override. Empty = default property.
          - `getReservation` object
            - `resId` string, required: Reservation id. Supports templates.
          - `getAvailabilityCalendar` object
            - `fromd` string, required: Calendar start / check-in date YYYY-MM-DD. Supports templates.
            - `tod` string: Calendar end / check-out date YYYY-MM-DD (max 3 months from fromd). Supports templates.
            - `adults` string: Number of adults. Supports templates.
            - `children` string: Number of children. Supports templates.
            - `room` string: Room-type code filter. Supports templates.
            - `rate` string: Rate id filter. Supports templates.
            - `propertyCode` string: Property code override. Empty = default property.
          - `getRooms` object
            - `roomCode` string: Room-type code for a single room. Empty = list all rooms. Supports templates.
            - `propertyCode` string: Property code override. Empty = default property.
          - `getRates` object
            - `roomCode` string: Room-type code to scope rates. Supports templates.
            - `rateId` string: Rate id for a single rate (requires roomCode). Supports templates.
            - `propertyCode` string: Property code override. Empty = default property.
      - object
        - `nodeType` 'hosthubIdentifyCaller' | 'hosthubSearchReservations' | 'hosthubGetReservation' | 'hosthubListRentals' | 'hosthubCheckAvailability', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `hosthubConfig` object
          - `operation` 'identifyCaller' | 'searchReservations' | 'getReservation' | 'listRentals' | 'checkAvailability', required
          - `identifyCaller` object
            - `phone` string, required: Caller phone number. Supports templates (e.g. {{call.phone_number}}).
          - `searchReservations` object
            - `name` string: Guest name. Supports templates. Provide one of name / phone / confirmationCode.
            - `phone` string: Guest phone. Supports templates.
            - `confirmationCode` string: Channel confirmation code. Supports templates.
          - `getReservation` object
            - `id` string, required: Hosthub reservation (calendar-event) id. Supports templates.
          - `getRental` object
            - `rentalId` string: Rental id for a single rental. Empty = list all rentals. Supports templates.
          - `checkAvailability` object
            - `rentalId` string, required: Rental id to check. Supports templates.
            - `from` string, required: Start date YYYY-MM-DD. Supports templates.
            - `to` string, required: End date YYYY-MM-DD. Supports templates.
      - object
        - `nodeType` 'prestashopGetCustomer' | 'prestashopGetOrdersByCustomer' | 'prestashopGetOrderById' | 'prestashopSearchProducts' | 'prestashopGetProductById' | 'prestashopCreateOrder' | 'prestashopUpdateOrderStatus', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `prestashopConfig` object
          - `operation` 'getCustomer' | 'getOrdersByCustomer' | 'getOrderById' | 'searchProducts' | 'getProductById' | 'createOrder' | 'updateOrderStatus', required
          - `getCustomer` object
            - `by` 'phone' | 'email' | 'id', required: Which field to look up by
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `getOrdersByCustomer` object
            - `customerId` union, required: PrestaShop customer id. Template strings supported.
              - …
            - `limit` integer
          - `getOrderById` object
            - `orderId` union, required: PrestaShop order id.
              - …
          - `searchProducts` object
            - `query` string: Free-text search. Supports templates.
            - `reference` string: Exact reference (SKU) filter.
            - `ean13` string: Exact EAN-13 barcode filter.
            - `mpn` string: Exact MPN filter.
            - `limit` integer
          - `getProductById` object
            - `productId` union, required: PrestaShop product id.
              - …
          - `createOrder` object
            - `customerId` union, required: PrestaShop customer id.
              - …
            - `addressDeliveryId` union, required
              - …
            - `addressInvoiceId` union, required
              - …
            - `cartId` union, required: Pre-existing cart id (PrestaShop requires it).
              - …
            - `currencyId` union
              - …
            - `langId` union
              - …
            - `carrierId` union, required
              - …
            - `payment` string, required: Human-readable payment label.
            - `module` string: Payment module code, e.g. "ps_checkpayment".
            - `totalPaid` union, required
              - …
            - `totalProducts` union, required
              - …
            - `totalProductsWithTax` union, required
              - …
            - `totalShipping` union
              - …
            - `products` object[], required
              - …
          - `updateOrderStatus` object
            - `orderId` union, required: PrestaShop order id to update.
              - …
            - `orderStateId` union, required: Target order_state id (numeric, store-specific).
              - …
      - object
        - `nodeType` 'airtableGetRecord' | 'airtableSearchRecords' | 'airtableCreateRecord' | 'airtableUpdateRecord', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `airtableConfig` object
          - `operation` 'getRecord' | 'searchRecords' | 'createRecord' | 'updateRecord', required
          - `getRecord` object
            - `by` 'phone' | 'id', required: Look up by mapped phone field, or by Airtable record id
            - `value` string, required: Template string — supports {{dynamicVariables.x}}
          - `searchRecords` object
            - `query` string, required: Free-text query — supports templates
            - `limit` integer
          - `createRecord` object
            - `fields` object, required: Field name → value map. String values support templates.
          - `updateRecord` object
            - `recordId` string, required: Airtable record id (rec...) — supports templates
            - `fields` object, required: Field name → value map. String values support templates.
      - object
        - `nodeType` 'jiraGetIssue' | 'jiraSearchIssues' | 'jiraCreateIssue' | 'jiraUpdateIssue' | 'jiraAddComment' | 'jiraTransitionIssue', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `jiraConfig` object
          - `operation` 'getIssue' | 'searchIssues' | 'createIssue' | 'updateIssue' | 'addComment' | 'transitionIssue', required
          - `getIssue` object
            - `issueKey` string, required: Issue key, e.g. SUP-1234 — supports {{dynamicVariables.x}}
          - `searchIssues` object
            - `text` string: Free-text query — supports templates
            - `jql` string: Raw JQL — overrides text when present
            - `projectKey` string: Scope the search to a project key
            - `limit` integer
          - `createIssue` object
            - `summary` string, required: Issue summary — supports templates
            - `description` string: Issue description — supports templates
            - `projectKey` string: Project key — falls back to the connection default
            - `issueType` string: Issue type name — falls back to the connection default
            - `priority` string: Priority name (e.g. High)
            - `assignee` string: Assign to a person by email or name — supports templates
          - `updateIssue` object
            - `issueKey` string, required: Issue key to update — supports templates
            - `summary` string: New summary — supports templates
            - `description` string: New description — supports templates
            - `priority` string: New priority name
          - `addComment` object
            - `issueKey` string, required: Issue key — supports templates
            - `body` string, required: Comment body — supports templates
          - `transitionIssue` object
            - `issueKey` string, required: Issue key — supports templates
            - `status` string, required: Target status name, e.g. "In Progress" — supports templates
      - object
        - `nodeType` 'googleChatSendMessage' | 'googleChatSendToDefaultSpace' | 'googleChatSendViaWebhook', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `googleChatConfig` object
          - `operation` 'sendMessage' | 'sendToDefaultSpace' | 'sendViaWebhook', required
          - `sendMessage` object
            - `spaceName` string, required: Opaque Google Chat space resource (spaces/AAQA...) — set via UI picker
            - `spaceDisplayName` string: Cached display name for the node summary
            - `body` string, required: Message text — supports {{dynamicVariables.x}}
            - `threadKey` string: Optional thread key for in-thread replies
          - `sendToDefaultSpace` object
            - `body` string, required: Message text — supports {{dynamicVariables.x}}
            - `threadKey` string
          - `sendViaWebhook` object
            - `webhookId` string, required: GoogleChatWebhook document id — set via UI picker
            - `webhookLabel` string: Cached webhook label for the node summary
            - `body` string, required
            - `threadKey` string
      - object
        - `nodeType` 'searchContact', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `searchContactConfig` object
          - `phoneNumber` string: Phone number to look up (template). Most reliable identifier: matched on the stored phone index, so +30/30/national forms all hit the same contact.
          - `email` string: Email address to look up (template). Matched case-insensitively on the main email and every listed email.
          - `name` string: Name to look up (template). Fuzzy: case- and accent-insensitive, Greek/Latin spellings and common inflections. May match several contacts.
      - object
        - `nodeType` 'managedAgent', required
        - `nodeTitle` string, required
        - `transitions` object[], required
          - `type` 'success' | 'failure' | 'no_wait' | 'orderCreated' | 'loop', required
          - `label` string
          - `index` number
          - `connectedTo` number[]
        - `managedAgentConfig` object
          - `prompt` string: System prompt rendered with {{transcript}}, {{call_summary}}, {{contact}}, {{extracted_entities}}
          - `builtInTools` object[]: Full AgentTool configurations the LLM may call.
          - `apiTools` object[]: Inline API tools with name + description + HTTP config
            - `name` string, required: Tool name shown to the LLM; must be unique within the node
            - `description` string, required: How the LLM decides when to call this tool
            - `parameters` object[]: Input schema for the LLM
              - …
            - `apiConfig` object, required: HTTP request configuration (URL, headers, method, body) — reused from function-call api runner
              - …
          - `mcpServers` object[]: MCP servers whose tools the LLM may call
            - `name` string, required: Display name for the MCP server
            - `description` string: Optional description
            - `serverUrl` string, uri, required: MCP server endpoint
            - `transport` 'http' | 'sse', required: Transport: http or sse
            - `authType` 'none' | 'bearer' | 'oauth', required: Authentication mode
            - `authValue` string: Token / credential value — encrypted at rest
            - `enabledTools` string[]: Whitelist of tools exposed to the LLM. Omit to expose every tool the server publishes.
          - `models` object
            - `primary` object, required: Model used by the loop by default
              - …
            - `escalation` object: Optional fallback model rerun on the whole session if primary failed/stuck. Must use the same provider as primary.
              - …
          - `limits` object
            - `maxIterations` integer: Hard cap on LLM turns per run. Set to 0 for no limit (cost cap still enforced).
            - `maxCostUsd` number: Hard cap on total cost (USD) per run. Range: 0 to 0.5.
            - `stuckDetection` boolean: Bail if the model calls the same tool with the same args twice in a row
          - `routing` object
            - `onSuccess` string: Next workflow node ID when the run completes successfully
            - `onPartial` string: Next workflow node ID when the run completed but with partial results
            - `onFailure` string: Next workflow node ID when the run failed
          - `dryRun` boolean
          - `enableSubagents` boolean
          - `maxConcurrentSubagents` integer
          - `maxSubagentIterations` integer
          - `knowledgeFileIds` string[]: Knowledge files the agent can search via search_knowledge. Empty list = no knowledge tool offered.
          - `knowledgeRerank` object
            - `enabled` boolean: Run the rerank pass. When off, top-K is taken directly from the raw retrieval score (faster but noisier context for the main agent).
            - `model` string: Model used for the rerank pass. Should be small/cheap — its job is ranking, not reasoning. Same provider as the node's primary model.
            - `candidatesK` integer: How many candidates to retrieve from Pinecone before reranking. Higher = better recall, more rerank tokens. 50 is the sweet spot.
            - `returnK` integer: How many chunks to return after reranking. The main agent sees only these.
          - `enableScraping` boolean: When true, agent gets scrape_website(url) tool that fetches+summarises a page via ScraperService.
          - `workflowToolIds` string[]: IDs of during-call workflows the agent may call as tools. Only their duringCall triggers run; onCallEnd-triggered or managed-agent-containing workflows are rejected to prevent recursion.
    - `html` string
    - `typenode` union
      - boolean
      - string
  - `fileIds` string[]: Array of file IDs linked with this function call
  - `files` object[]: Linked files
    - `id` string, required: Unique identifier
    - `createdAt` string, date-time, required: Creation timestamp
    - `active` boolean, required: Whether the entity is active
    - `createdBy` string, required: Name of the user who created the entity
    - `createdById` string, required: ID of the user who created the entity
    - `modifiedAt` string, date-time: ISO 8601 date string
    - `modifiedBy` string: Name of the user who last modified the entity
    - `modifiedById` string: ID of the user who last modified the entity
    - `companyId` string, required: Company identifier
    - `company` object: Any valid JSON value
    - `groupIds` string[]: Linked group IDs
    - `filename` string, required: Name of the file
    - `contentType` string, required: MIME type of the file
    - `size` number, required: File size in bytes
    - `content` object: Any valid JSON value
    - `path` string: File path on storage
    - `url` string, uri: Public URL of the file
    - `text` string: Text content extracted from file
    - `source` 'EMAIL' | 'FUNCTION_CALL' | 'APPOINTMENT' | 'DOCUMENT' | 'RECORDING' | 'TRANSCRIPTION' | 'ATTACHMENT' | 'OTHER' | 'VOIP_CALL' | 'TRANSFER_HOLD_SOUND' | 'FEATURE_ANNOUNCEMENT' | 'TICKET_ATTACHMENT' | 'CALL_EXPORT' | 'DATA_SUBJECT_EXPORT' | 'WIDGET_AVATAR' | 'CHAT_ATTACHMENT' | 'AFFILIATE_AGREEMENT': Source of the file
    - `s3Id` string: S3 object ID
    - `pcmS3Id` string: S3 key for PCM16 8kHz mono derivative (transfer hold / mid-call music)
    - `public` boolean: Whether the file is publicly accessible
    - `temporary` boolean: Whether the file should be cleaned up after expiration
    - `expiresAt` string, date-time: ISO 8601 date string
    - `coldExpiresAt` string, date-time: ISO 8601 date string
    - `storageMode` 'active' | 'cold' | 'deleted', required: Storage mode of the file
    - `googleDriveId` string: Google Drive file ID
    - `googleDriveUrl` string, uri: Google Drive file URL
    - `downloadToken` string: Unguessable token for the public tracked-download link
    - `storageId` string: The company's own recording storage holding this file; absent = platform storage
    - `pendingMove` boolean: Encrypted temporary copy still waiting to move to the company's own storage
    - `downloadCount` number: Number of times the file has been downloaded via a tracked link
    - `downloads` object[]: Individual tracked download events
      - `at` string, date-time, required: When the file was downloaded through a tracked link
      - `ip` string: IP address of the downloader
      - `userAgent` string: User agent of the downloader
  - `visibility` 'private' | 'resellerRead' | 'resellerWrite' | 'globalRead', required: Workflow visibility and access control
  - `production` object: Published-to-prod version pointer; absent for workflows that have never published (live doc is prod)
    - `versionId` string, required: WorkFlowVersion document id currently published to prod
    - `versionNumber` integer, required: Version number of the published snapshot
    - `publishedAt` union, required: When this version was (re)published
      - string, date-time: ISO 8601 date string
      - string
    - `publishedBy` string: Display name of the user who published
    - `publishedById` string: User id of the publisher

## Other responses

- `401`: Unauthorized
- `403`: Invalid CSRF
- `404`: Work Flow not found
- `429`: Rate limit exceeded
- `500`: Internal Server Error

---

[API](https://skmtc.dev/voicelogica/apis/voice-logica-api.md) · [All operations](https://skmtc.dev/voicelogica/apis/voice-logica-api/llms.txt) · [OpenAPI document](https://skmtc.dev/voicelogica/apis/voice-logica-api/revisions/30f76840084e?raw)
