---
title: "Update campaign configuration and settings"
method: PUT
path: "/api/v1/agentic/campaigns/:id"
tags: ["Agentic - Campaigns"]
---

# Update campaign configuration and settings

`PUT /api/v1/agentic/campaigns/:id`

## Request

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

Update an existing campaign's configuration. You can modify:

- **Campaign details**: Name, description, status
- **Scheduling**: Business hours, frequency, timezone
- **Call settings**: Retry attempts, concurrent call limits
- **Agent assignment**: Change the AI agent handling calls
- **SIP trunks**: Update `sipTrunkIds` used for outbound calls
- **Notifications**: Email notification settings

**Common Use Cases:**
- Pause a running campaign by setting `status: "paused"`
- Adjust concurrent call limits during peak hours
- Update schedule to match business hours
- Change AI agent to test different conversation flows

## Headers

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

## Request body

- object: Request schema for creating or updating a campaign
  - `name` string, required: Name of the campaign
  - `description` string: Description of the campaign purpose and goals
  - `type` 'email' | 'phone' | 'sms': Primary channel type for the campaign
  - `purpose` 'appointment' | 'lead_qualification' | 'event_invite' | 'payment_collection' | 'custom': What the campaign is trying to achieve. Non-custom purposes seed campaign-level analysis fields and call instructions; "custom" (default) leaves everything as-is
  - `analysisProperties` object[]: Campaign-level analysis fields, merged with the agent's own analysis properties for calls of this campaign (campaign wins on name collision)
    - `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[]
      - `id` string
      - `name` string, required
      - `description` string
      - `type` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum', required
      - `options` 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.
        - string
        - number
        - boolean
        - object: Any valid JSON value
    - `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.
      - string
      - number
      - boolean
      - object: Any valid JSON value
    - `isConstantForContactEntity` boolean
  - `stages` union[]: Stages the AI classifies the lead into after an attempt. Finished stages (success / failed / other) close the lead; retry queues another attempt on the campaign channel
    - union
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'success', required
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'failed', required
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'other', required
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'retry', required
        - `maxRetries` integer, required: Calls on this stage, counting the call that put the lead there (1–10): 5 = up to 4 call-backs, 1 = closes the lead with no call-back
        - `retryIntervalMinutes` integer, required: Minutes to wait before the next attempt (min 30)
  - `maxRetriesFollowUp` object, nullable: Email and/or SMS sent when the AI assigns this stage
    - `sms` object
      - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
      - `body` string, required: SMS text
    - `email` object
      - `to` string: Recipients, comma-separated. Default {{lead.email}}
      - `subject` string, required
      - `body` string, required
  - `promptSection` string: Campaign call instructions injected into the agent context at the start of every campaign call
  - `appointmentServiceKeys` string[]: Appointment campaigns only: the agent services (serviceKey, from appointmentSettings.services) this campaign books. Left empty, a lead counts as already booked when ANY upcoming calendar event carries their phone number or email. With services picked, the event must ALSO name one of them — an upcoming event with only the phone number means a different service, so the lead is still called. Ignored for other goals.
  - `dynamicWelcomeMessage` boolean: When true, campaign calls open with an AI-generated greeting built from the campaign goal and lead context instead of the agent's fixed welcome message. Explicit opt-in: each call is then billed with a minimum duration of 10 seconds, even if it ends unanswered
  - `welcomeMessage` string: Static opening spoken on every campaign call. Used only when dynamicWelcomeMessage is not true. Empty means the agent welcome
  - `acceptDynamicVariables` boolean: When true (default if omitted), extra columns on a lead list become dynamicVariables automatically. When false, only leadColumns (plus phone) are accepted as extra lead fields
  - `leadColumns` object[]: Static extra lead columns when acceptDynamicVariables is false. Echoed back when the toggle is on so a later switch-off keeps the schema
    - `name` string, required
    - `type` 'string' | 'number' | 'boolean' | 'date', required
  - `status` 'draft' | 'active' | 'paused' | 'completed': Current status of the campaign
  - `retries` integer: Number of retries for the campaign (0-10; defaults to 3)
  - `maximumConcurrentCalls` number: Maximum number of concurrent calls for the campaign (max 100)
  - `retryDelayMinutes` integer: Delay between retry attempts in minutes (60-40320; defaults to 240 = 4 hours)
  - `schedule` object: Campaign scheduling configuration
    - `days` object[]: Days of the week and hours of the day to run the campaign
      - `runFromTime` object, required
        - `hours` number, required
        - `minutes` number, required
      - `runToTime` object, required
        - `hours` number, required
        - `minutes` number, required
      - `day` 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday', required
    - `timeZone` string, required: IANA time zone, e.g. Europe/Athens
    - `runEverySeconds` union: How often the campaign checks for leads to call, in seconds: 60, 300, 900, 1800, 3600, 7200, 14400, 28800, 57600 or 86400. Use 60 unless asked otherwise.
      - 60
      - 300
      - 900
      - 1800
      - 3600
      - 7200
      - 14400
      - 28800
      - 57600
      - 86400
  - `agentId` string: ID of the agent responsible for the campaign
  - `sipTrunkIds` string[]: SIP trunks to dial out from. Get IDs from POST /phones/sip-trunks/query. Required to go live unless verifiedCallerId is set.
  - `verifiedCallerId` string: Verified phone number used as caller ID when dialing on the company trunk
  - `defaultCallerIds` string[]: Pool of numbers presented to the people being called, for every lead that does not carry its own callerId. Each entry must be a number the campaign SIP trunks own (the trunk default number or an inbound trunk number / DID). One entry = every lead sees that number; several = the pool is spread across leads, each lead keeping the same number across its retries. Empty = the trunk decides, as before
  - `notificationSettings` object: Notifications configuration
    - `enabled` boolean
    - `emails` string[]
    - `lastSentAt` string, date-time: ISO 8601 date string
  - `lastRunAt` string, date-time: ISO 8601 date string
  - `allowedPhoneNumbers` string[]: Array of phone numbers that are allowed to be called
  - `defaultCampaign` boolean: Whether this is the default campaign for the company
  - `processingNow` boolean: Whether the campaign is currently being processed by the job service
  - `processingNowSince` string, date-time: ISO 8601 date string
  - `userSettings` object: Human users who dial into the campaign, how leads are dispatched to them, and whether unanswered leads overflow to AI
    - `userIds` string[]: Company users who may dial into this campaign and take leads
    - `dispatchStrategy` 'random' | 'least_answered' | 'round_robin': How the next lead is given to a waiting user: random, fewest leads so far this session (least_answered), or longest wait (round_robin)
    - `overflowToAi` boolean: If a live lead cannot attach to an online assigned user, send it to the campaign AI instead of hold music. Default true. Campaigns with assigned users do not dial unless at least one of those users is online.
    - `wrapUpSeconds` integer: Seconds after a lead hangup before the user is eligible for the next lead
    - `restrictDialIn` boolean: When true, only listed userIds may dial the campaign extension

## Response `200`

Campaign updated successfully

- object
  - `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 campaign
  - `description` string: Description of the campaign purpose and goals
  - `type` 'email' | 'phone' | 'sms': Primary channel type for the campaign
  - `purpose` 'appointment' | 'lead_qualification' | 'event_invite' | 'payment_collection' | 'custom': What the campaign is trying to achieve. Non-custom purposes seed campaign-level analysis fields and call instructions; "custom" (default) leaves everything as-is
  - `analysisProperties` object[]: Campaign-level analysis fields, merged with the agent's own analysis properties for calls of this campaign (campaign wins on name collision)
    - `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[]
      - `id` string
      - `name` string, required
      - `description` string
      - `type` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum', required
      - `options` 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.
        - string
        - number
        - boolean
        - object: Any valid JSON value
    - `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.
      - string
      - number
      - boolean
      - object: Any valid JSON value
    - `isConstantForContactEntity` boolean
  - `stages` union[]: Stages the AI classifies the lead into after an attempt. Finished stages (success / failed / other) close the lead; retry queues another attempt on the campaign channel
    - union
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'success', required
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'failed', required
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'other', required
      - object
        - `name` string, required: Machine name the AI writes after the attempt
        - `displayName` string: Human label shown in the campaign editor
        - `description` string, required: Tells the AI when this stage applies — what happened on this attempt
        - `followUp` object: Email and/or SMS sent when the AI assigns this stage
          - `sms` object
            - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
            - `body` string, required: SMS text
          - `email` object
            - `to` string: Recipients, comma-separated. Default {{lead.email}}
            - `subject` string, required
            - `body` string, required
        - `nextAction` 'retry', required
        - `maxRetries` integer, required: Calls on this stage, counting the call that put the lead there (1–10): 5 = up to 4 call-backs, 1 = closes the lead with no call-back
        - `retryIntervalMinutes` integer, required: Minutes to wait before the next attempt (min 30)
  - `maxRetriesFollowUp` object, nullable: Email and/or SMS sent when the AI assigns this stage
    - `sms` object
      - `to` string: Recipients, comma-separated. Default {{lead.phone_number}}
      - `body` string, required: SMS text
    - `email` object
      - `to` string: Recipients, comma-separated. Default {{lead.email}}
      - `subject` string, required
      - `body` string, required
  - `promptSection` string: Campaign call instructions injected into the agent context at the start of every campaign call
  - `appointmentServiceKeys` string[]: Appointment campaigns only: the agent services (serviceKey, from appointmentSettings.services) this campaign books. Left empty, a lead counts as already booked when ANY upcoming calendar event carries their phone number or email. With services picked, the event must ALSO name one of them — an upcoming event with only the phone number means a different service, so the lead is still called. Ignored for other goals.
  - `dynamicWelcomeMessage` boolean: When true, campaign calls open with an AI-generated greeting built from the campaign goal and lead context instead of the agent's fixed welcome message. Explicit opt-in: each call is then billed with a minimum duration of 10 seconds, even if it ends unanswered
  - `welcomeMessage` string: Static opening spoken on every campaign call. Used only when dynamicWelcomeMessage is not true. Empty means the agent welcome
  - `acceptDynamicVariables` boolean: When true (default if omitted), extra columns on a lead list become dynamicVariables automatically. When false, only leadColumns (plus phone) are accepted as extra lead fields
  - `leadColumns` object[]: Static extra lead columns when acceptDynamicVariables is false. Echoed back when the toggle is on so a later switch-off keeps the schema
    - `name` string, required
    - `type` 'string' | 'number' | 'boolean' | 'date', required
  - `status` 'draft' | 'active' | 'paused' | 'completed': Current status of the campaign
  - `retries` integer: Number of retries for the campaign (0-10; defaults to 3)
  - `maximumConcurrentCalls` number: Maximum number of concurrent calls for the campaign (max 100)
  - `retryDelayMinutes` integer: Delay between retry attempts in minutes (60-40320; defaults to 240 = 4 hours)
  - `schedule` object: Campaign scheduling configuration
    - `days` object[]: Days of the week and hours of the day to run the campaign
      - `runFromTime` object, required
        - `hours` number, required
        - `minutes` number, required
      - `runToTime` object, required
        - `hours` number, required
        - `minutes` number, required
      - `day` 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday', required
    - `timeZone` string, required: IANA time zone, e.g. Europe/Athens
    - `runEverySeconds` union: How often the campaign checks for leads to call, in seconds: 60, 300, 900, 1800, 3600, 7200, 14400, 28800, 57600 or 86400. Use 60 unless asked otherwise.
      - 60
      - 300
      - 900
      - 1800
      - 3600
      - 7200
      - 14400
      - 28800
      - 57600
      - 86400
  - `agentId` string: ID of the agent responsible for the campaign
  - `voipPhoneIds` string[]: Legacy VoIP phone IDs. Prefer sipTrunkIds.
  - `sipTrunkIds` string[]: SIP trunks to dial out from. Get IDs from POST /phones/sip-trunks/query. Required to go live unless verifiedCallerId is set.
  - `verifiedCallerId` string: Verified phone number used as caller ID when dialing on the company trunk
  - `defaultCallerIds` string[]: Pool of numbers presented to the people being called, for leads without their own callerId
  - `notificationSettings` object: Notifications configuration
    - `enabled` boolean
    - `emails` string[]
    - `lastSentAt` string, date-time: ISO 8601 date string
  - `lastRunAt` string, date-time: ISO 8601 date string
  - `allowedPhoneNumbers` string[]: Array of phone numbers that are allowed to be called
  - `defaultCampaign` boolean: Whether this is the default campaign for the company
  - `processingNow` boolean: Whether the campaign is currently being processed by the job service
  - `processingNowSince` string, date-time: ISO 8601 date string
  - `userSettings` object: Assigned users, dispatch strategy, and AI overflow
    - `userIds` string[]: Company users who may dial into this campaign and take leads
    - `dispatchStrategy` 'random' | 'least_answered' | 'round_robin': How the next lead is given to a waiting user: random, fewest leads so far this session (least_answered), or longest wait (round_robin)
    - `overflowToAi` boolean: If a live lead cannot attach to an online assigned user, send it to the campaign AI instead of hold music. Default true. Campaigns with assigned users do not dial unless at least one of those users is online.
    - `wrapUpSeconds` integer: Seconds after a lead hangup before the user is eligible for the next lead
    - `restrictDialIn` boolean: When true, only listed userIds may dial the campaign extension
    - `users` object[]: Hydrated users for userIds
      - `id` string, required: User id
      - `name` string, required: Display name
      - `email` string: Email
      - `phoneNo` string: Phone number
  - `agent` object: Agent responsible for the campaign
    - `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
    - `agentType` 'prompt-based' | 'analysis-agent' | 'ai-assistant' | 'node-based': The type of agent architecture that determines its capabilities and behavior. `prompt-based`: Standard conversational agent that can answer calls, transfer calls, handle emails, book appointments, and execute workflows. Best for general-purpose use cases. `analysis-agent`: Specialized agent for call analysis only. Used to analyze calls after they have been transferred to humans. Monitors and extracts insights from ongoing calls. See: https://docs.voicelogica.ai/transfer-calls/introduction `ai-assistant`: Personal AI assistant/voicemail. Designed ONLY for individual use as your own AI voicemail or personal assistant. Handles calls when you are unavailable. `node-based`: Advanced agent with visual flow builder. Supports complex branching logic, conditional routing, and multi-step reasoning. Best for sophisticated conversational workflows.
    - `systemPrompt` string
    - `dynamicVariables` object[]
      - `name` string, required: The name of the dynamic variable
      - `value` string, required: The value of the dynamic variable
    - `language` 'ar-AE' | 'ar-BH' | 'ar-EG' | 'ar-KW' | 'ar-OM' | 'ar-QA' | 'ar-SA' | 'ar-LB' | 'ar-MA' | 'el-GR' | 'en-US' | 'es-ES' | 'fr-FR' | 'el-CY' | 'en-DK' | 'he-IL' | 'bg-BG' | 'ru-RU' | 'de-DE' | 'it-IT' | 'pt-PT' | 'ru-RU' | 'tr-TR' | 'zh-CN' | 'ja-JP' | 'ko-KR' | 'ja-JP' | 'ar-SA' | 'hi-IN' | 'bn-BD' | 'pa-IN' | 'ta-IN' | 'te-IN' | 'ur-IN' | 'vi-VN' | 'th-TH' | 'id-ID' | 'ms-MY' | 'fil-PH' | 'nl-NL' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'zh-MO' | 'zh-SG' | 'zh-CH' | 'zh-CHT' | 'zh-CHS' | 'zh-CHT' | 'ro-RO' | 'hu-HU' | 'pl-PL' | 'sr-RS' | 'mk-MK' | 'bg-BG' | 'uk-UA' | 'en-GB' | 'en-AU' | 'en-CA' | 'en-NZ' | 'en-ZA' | 'en-IN' | 'en-IE' | 'en-PH' | 'en-SG' | 'en-HK' | 'en-MO' | 'en-CN' | 'en-TW' | 'en-MY' | 'nl-BE' | 'de-AT' | 'de-CH' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'cs-CZ' | 'sk-SK' | 'sl-SI' | 'hr-HR' | 'lt-LT' | 'lv-LV' | 'et-EE' | 'mt-MT' | 'lb-LU' | 'sq-AL' | 'bs-BA' | 'ca-AD' | 'fr-MC' | 'it-SM' | 'it-VA' | 'ur-PK': Locale code
    - `secondaryLanguages` object[]
      - `language` 'ar-AE' | 'ar-BH' | 'ar-EG' | 'ar-KW' | 'ar-OM' | 'ar-QA' | 'ar-SA' | 'ar-LB' | 'ar-MA' | 'el-GR' | 'en-US' | 'es-ES' | 'fr-FR' | 'el-CY' | 'en-DK' | 'he-IL' | 'bg-BG' | 'ru-RU' | 'de-DE' | 'it-IT' | 'pt-PT' | 'ru-RU' | 'tr-TR' | 'zh-CN' | 'ja-JP' | 'ko-KR' | 'ja-JP' | 'ar-SA' | 'hi-IN' | 'bn-BD' | 'pa-IN' | 'ta-IN' | 'te-IN' | 'ur-IN' | 'vi-VN' | 'th-TH' | 'id-ID' | 'ms-MY' | 'fil-PH' | 'nl-NL' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'zh-MO' | 'zh-SG' | 'zh-CH' | 'zh-CHT' | 'zh-CHS' | 'zh-CHT' | 'ro-RO' | 'hu-HU' | 'pl-PL' | 'sr-RS' | 'mk-MK' | 'bg-BG' | 'uk-UA' | 'en-GB' | 'en-AU' | 'en-CA' | 'en-NZ' | 'en-ZA' | 'en-IN' | 'en-IE' | 'en-PH' | 'en-SG' | 'en-HK' | 'en-MO' | 'en-CN' | 'en-TW' | 'en-MY' | 'nl-BE' | 'de-AT' | 'de-CH' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'cs-CZ' | 'sk-SK' | 'sl-SI' | 'hr-HR' | 'lt-LT' | 'lv-LV' | 'et-EE' | 'mt-MT' | 'lb-LU' | 'sq-AL' | 'bs-BA' | 'ca-AD' | 'fr-MC' | 'it-SM' | 'it-VA' | 'ur-PK', required: The language of the secondary language
      - `type` 'other_agent' | 'other_voice', required: The type of the secondary language
      - `agentId` string: The ID of the agent that the secondary language is for
      - `voiceConfig` object: Configuration for voice synthesis settings
        - `voiceProvider` 'microsoft' | 'openai' | 'google' | 'elevenlabs' | 'deepgram' | 'minimax' | 'murf' | 'voicelogica' | 'soniox' | 'grok' | 'gemini', required: The voice provider service to use for text-to-speech
        - `voiceId` string, required: The specific voice ID to use for speech synthesis
        - `speed` number: Speech rate multiplier. Effective range depends on provider: ElevenLabs 0.7-1.2, Google 0.25-2.0, Microsoft 0.25-2.0, Minimax 0.5-2.0
        - `stability` number: Stability of the voice (0.0 = low, 1.0 = high)
        - `similarity_boost` number: Similarity of the voice (0.0 = low, 1.0 = high)
        - `style` number: ElevenLabs style exaggeration (0.0 = none, 1.0 = max). Anything above 0 adds a little latency
        - `use_speaker_boost` boolean: ElevenLabs speaker boost: closer to the original speaker at a small latency cost
        - `backgroundSound` 'none' | 'coffee_shop' | 'call_center' | 'office': The background sound to play during the call
        - `backgroundVolume` number: The volume of the background sound (0.0 = low, 1.0 = high)
        - `allowCallerToRequestSpeedChange` boolean: When enabled, the caller can ask the AI to speak faster or slower during the call
        - `adjustBasedOnHumanSpeed` boolean: When enabled, the AI automatically adjusts its speaking speed to match how fast or slow the human caller speaks
        - `modelId` 'eleven_flash_v2_5' | 'eleven_turbo_v2_5' | 'eleven_multilingual_v2' | 'eleven_v3' | 'eleven_v4' | 'eleven_v4_turbo', nullable: ElevenLabs TTS model for this agent (admin only). Omit or null to use the platform default
      - `enabled` boolean: Whether the secondary language is enabled
      - `defaultContries` string[]: The default countries for the secondary language
    - `knowledgeFileIds` string[]
    - `workflowsIds` string[]
    - `allowedToCopy` 'sameCompany' | 'public' | 'publicWithPassword' | 'private'
    - `navigateToNodeTool` boolean: Whether the agent can navigate to a specific node tool based on instructions
    - `syncWithContacts` boolean
    - `agentEmailSettings` object
      - `model` object
        - `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
          - `completionProvider` 'openai' | 'groq' | 'together' | 'mistral' | 'anthropic' | 'gemini' | 'grok' | 'minimax' | 'custom-llm', required
          - `model` string, required
      - `systemPrompt` string
      - `functionCallIds` string[]
      - `mailboxIds` string[]: Mailboxes exclusively assigned to this agent for inbound mail conversations
      - `ccOptions` string[]
      - `evaluationSettings` object
        - `model` object
          - `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
            - `completionProvider` 'openai' | 'groq' | 'together' | 'mistral' | 'anthropic' | 'gemini' | 'grok' | 'minimax' | 'custom-llm', required
            - `model` string, required
        - `methodsEnabled` object
          - `createDraft` boolean
          - `reply` boolean
          - `training` boolean
        - `processEmailPrompt` string
        - `trainingEvaluationPrompt` string
        - `completeWhenNoReplyNeeded` boolean: When true, newsletters/receipts/no-reply are marked closed (completed). Default true.
      - `displayBusinessDetails` object
        - `name` boolean
        - `address` boolean
        - `website` boolean
        - `email` boolean
        - `phone` boolean
        - `operatingHours` boolean
        - `isOpenNow` boolean
        - `utcOffset` boolean
        - `wheelchairAccessibleEntrance` boolean
      - `authorizationConfig` object
        - `smsEnabled` boolean
        - `smsConfig` object
          - `to` string[], required
          - `body` string, required
          - `from` string
        - `emailEnabled` boolean
        - `emailConfig` object
          - `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[]
      - `contactData` object
        - `enabled` boolean, required
        - `apiConfig` object
          - `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>}}
      - `functionCalls` object[]
        - `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
        - `description` string: Description of the function call
        - `conditionBlocks` object[]: Condition blocks for execution logic
          - `operator` 'and' | 'or', required
          - `type` 'condition' | 'block', required
          - `conditions` object[]
            - `operator` 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'isNull' | 'isNotNull' | 'isTrue' | 'isFalse' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'in' | 'notIn' | 'between', required
            - `field` string, required
            - `fieldValue` union
              - …
            - `fieldType` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'array' | 'object' | 'enum', required
          - `blocks` object[]
        - `executeAt` 'now' | 'after_session_end' | 'custom': When to execute the function call
        - `confirmationMethodConfig` object: Configuration for user confirmation
          - `confirmationRequired` boolean, required
          - `secondsToWait` number, required
          - `wordMatch` object
            - `required` boolean, required
            - `value` string[], required
          - `aiGuidance` object
            - `required` boolean, required
            - `value` string, required
          - `dtmf` object
            - `required` boolean, required
            - `value` string, required
        - `messageToUserBeforeAction` string: Message to show user before executing the action
        - `messageToUserAfterAction` string: Message to show user after executing the action
        - `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
        - `parameters` object[], required: 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[]
            - `id` string
            - `name` string, required
            - `description` string
            - `type` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum', required
            - `options` 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.
              - …
          - `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.
            - string
            - number
            - boolean
            - object: Any valid JSON value
          - `isConstantForContactEntity` boolean
        - `functions` object[], required: Internal actions to execute
          - `sequence` number, required
          - `executeAt` 'now' | 'after_session_end' | 'custom'
          - `conditionBlocks` object[]
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `action` 'emailConfig' | 'apiCall' | 'sendSms' | 'createEvent' | 'sendPhoneCall' | 'forwardCall' | 'googleSearch' | 'sendMessage' | 'endCallConfig' | 'googleSheetConfig' | 'googleDocConfig' | 'llmCompletion' | 'hubspotConfig' | 'aiResponse' | 'transferCall' | 'afmSearch' | 'codeExecution', required
          - `apiConfig` object
            - `url` string, required
            - `headers` object[], required
              - …
            - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required
            - `params` object[], required
              - …
            - `bodyType` 'raw' | 'form-data'
            - `rawType` 'json' | 'xml' | 'text' | 'html'
            - `body` object: Any valid JSON value
            - `formBody` object[]
              - …
            - `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.
              - …
          - `emailConfig` object
            - `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[]
          - `smsConfig` object
            - `to` string[], required
            - `body` string, required
            - `from` string
          - `viberConfig` object
            - `to` string[], required
            - `body` string, required
            - `from` string, required
            - `viberProviderId` string, required
            - `fallbackToSms` boolean
            - `smsConfig` object
              - …
            - `viberChannelId` string
          - `phoneCallConfig` object
            - `phoneNumber` string, required
            - `systemPrompt` string, required
            - `numberOfTries` number
            - `voipPhoneId` string
            - `sipTrunkId` string
            - `agentId` string, required
            - `fallbackToSms` boolean
            - `smsConfig` object
              - …
            - `keepOnlyPhoneCallConfigSystemPrompt` boolean
            - `callNow` boolean
            - `scheduleAt` string
          - `forwardCallConfig` object
            - `voipConnectionId` string, required
          - `googleSearchConfig` object
            - `sites` string[]
            - `excludedSites` string[]
            - `dateRestrict` 'd1' | 'd7' | 'w1' | 'm1' | 'm6' | 'y1' | 'y5'
            - `searchQuery` string, required
            - `scrapeWebsiteResults` boolean
            - `topNumberOfResults` number
            - `topNumberOfResultsToScrape` number
            - `scrapeWithSlowService` boolean
          - `sendMessageConfig` object
            - `messageToUser` string, required
          - `endCallConfig` object
            - `reason` string, required
          - `googleSheetConfig` object
            - `sheetId` string
            - `sheetName` string, required
            - `defaultParameters` object
              - …
            - `properties` string[]
          - `googleDocConfig` object
            - `docName` string, required
            - `body` string, required
            - `isPublic` boolean
          - `llmCompletionConfig` object
            - `prompt` string, required
            - `parameters` object[]: Parameters for the function call
              - …
            - `completionModel` object, required
              - …
          - `aiResponseConfig` object
            - `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
          - `transferCallConfig` object
            - `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
    - `agentPhoneSettings` object: Response schema for agent phone settings including related data
      - `interimGeneration` object: Configuration for interim generation
        - `enabled` boolean: Whether to generate interim generation while user is speaking
        - `keywords` string[]: Keywords to trigger interim generation
        - `prompt` string: The prompt to use when generating interim generation
        - `minimumWordsForFullResponse` number: The minimum number of words for a full response
      - `model` object: AI model configuration for the agent
        - `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
          - `completionProvider` 'openai' | 'groq' | 'together' | 'mistral' | 'anthropic' | 'gemini' | 'grok' | 'minimax' | 'custom-llm', required
          - `model` string, required
      - `sendSms` boolean: Whether to send SMS
      - `blockInterruptionWhileAiIsGenerating` boolean: Whether to block interruption while AI is generating
      - `senderId` string: The ID of the sender to use for SMS
      - `allowHumanToInterruptAiOnFirstMessage` boolean: Whether to allow human to interrupt AI on the first message
      - `ssml` boolean: Whether to use SSML (Speech Synthesis Markup Language) for voice synthesis
      - `skipTurnEnabled` boolean: Whether to skip turn during the call
      - `skipTurnPrompt` string: The prompt to use when skipping turn during the call
      - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
        - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
        - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
        - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
        - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
      - `timesToNudgeBeforeHungup` number: Number of times to nudge the user before hanging up the call (1-3)
      - `nudgeIntervalSeconds` number: Interval in seconds between nudges when user is silent (0-60 seconds)
      - `nudgePrompt` string: The prompt to use when nudging the user
      - `actionsAfterNudge` string[]: Actions after nudge when silence threshold is reached (hangup, forward, or both)
      - `systemPrompt` string: The system prompt that defines the agent's behavior and personality
      - `voiceConfig` object: Configuration for voice synthesis settings
        - `voiceProvider` 'microsoft' | 'openai' | 'google' | 'elevenlabs' | 'deepgram' | 'minimax' | 'murf' | 'voicelogica' | 'soniox' | 'grok' | 'gemini', required: The voice provider service to use for text-to-speech
        - `voiceId` string, required: The specific voice ID to use for speech synthesis
        - `speed` number: Speech rate multiplier. Effective range depends on provider: ElevenLabs 0.7-1.2, Google 0.25-2.0, Microsoft 0.25-2.0, Minimax 0.5-2.0
        - `stability` number: Stability of the voice (0.0 = low, 1.0 = high)
        - `similarity_boost` number: Similarity of the voice (0.0 = low, 1.0 = high)
        - `style` number: ElevenLabs style exaggeration (0.0 = none, 1.0 = max). Anything above 0 adds a little latency
        - `use_speaker_boost` boolean: ElevenLabs speaker boost: closer to the original speaker at a small latency cost
        - `backgroundSound` 'none' | 'coffee_shop' | 'call_center' | 'office': The background sound to play during the call
        - `backgroundVolume` number: The volume of the background sound (0.0 = low, 1.0 = high)
        - `allowCallerToRequestSpeedChange` boolean: When enabled, the caller can ask the AI to speak faster or slower during the call
        - `adjustBasedOnHumanSpeed` boolean: When enabled, the AI automatically adjusts its speaking speed to match how fast or slow the human caller speaks
        - `modelId` 'eleven_flash_v2_5' | 'eleven_turbo_v2_5' | 'eleven_multilingual_v2' | 'eleven_v3' | 'eleven_v4' | 'eleven_v4_turbo', nullable: ElevenLabs TTS model for this agent (admin only). Omit or null to use the platform default
      - `phoneFirstMessageAiGenerated` boolean: Whether the first message should be AI-generated or use a predefined message
      - `updateAdaptationPhrasesOnSystemPromptChange` boolean: Whether to update adaptation phrases when system prompt changes
      - `phoneFirstMessage` string: The first message to say when the call connects
      - `phoneFirstMessageOffHours` string: Welcome message when the business is closed; if empty, the normal first message is used
      - `endCallAfterOffHoursWelcomeMessage` boolean: When the business is closed and the off-hours welcome message plays, hang up as soon as it finishes instead of continuing the conversation
      - `transcriptionConfig` object: Configuration for speech-to-text transcription settings
        - `transcriptionProvider` 'microsoft' | 'google' | 'fireworks' | 'speechmatics' | 'openai' | 'assemblyai' | 'deepgram' | 'google_v1' | 'google_v2' | 'elevenlabs' | 'voicelogica' | 'soniox', required: The transcription service provider to use for speech-to-text
        - `silenceDurationMs` number: Duration of silence in milliseconds before considering the user finished speaking
        - `adaptationPhraseSetIds` string[]: IDs of adaptation phrase sets to improve transcription accuracy
        - `transcriptionVoiceMailPhrases` string[]: Phrases that indicate the call has reached a voicemail system
        - `waitForFullTranscription` boolean: Whether to wait for complete transcription before processing
        - `enhanced` boolean: Whether to use enhanced transcription models for better accuracy
        - `audioEnhancement` boolean: Whether to run ai-coustics speech enhancement (noise/background-speech suppression) on caller audio before transcription
        - `audioEnhancementLevel` number: How aggressively the ai-coustics model suppresses noise (0.0-1.0). Uses the model default when omitted
        - `endpointSensitivity` number, nullable: Soniox only: how aggressively endpoints are detected (-1.0 to 1.0). Higher = faster end-of-turn but more risk of cutting the caller off mid-sentence. Platform default 0.3
        - `maxEndpointDelayMs` number, nullable: Soniox only: hard cap on how long Soniox may wait for an endpoint after speech ends (500-3000ms). Platform default 1500
        - `endpointLatencyAdjustmentLevel` integer, nullable: Soniox only: endpoint latency reduction level 0-3 (3 = most aggressive). Platform default 3
        - `speculativeFinalize` boolean, nullable: Soniox only: at the speculative quiet moment, request finalize() to flush pending tokens into the candidate before the endpoint. Platform default from admin settings
        - `singleUtterance` boolean: Whether to process speech as single utterances
        - `openAiModel` 'whisper-1' | 'gpt-transcribe' | 'gpt-4o-transcribe' | 'gpt-4o-mini-transcribe' | 'gpt-4o-transcribe-diarize': OpenAI model to use for transcription
        - `prompt` string: Custom prompt used for transcription processing
        - `keywords` string[]: Keywords to focus on during transcription
        - `initializationMethod` 'on_call_start' | 'on_human_join': Method to initialize the transcription service
        - `adaptationPhraseSets` object[]: Adaptation phrase sets used for transcription
          - `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 adaptation phrase set
          - `description` string, nullable: The description of the phrase set
          - `phraseSetId` string, required: The phrase set id
          - `language` 'ar-AE' | 'ar-BH' | 'ar-EG' | 'ar-KW' | 'ar-OM' | 'ar-QA' | 'ar-SA' | 'ar-LB' | 'ar-MA' | 'el-GR' | 'en-US' | 'es-ES' | 'fr-FR' | 'el-CY' | 'en-DK' | 'he-IL' | 'bg-BG' | 'ru-RU' | 'de-DE' | 'it-IT' | 'pt-PT' | 'ru-RU' | 'tr-TR' | 'zh-CN' | 'ja-JP' | 'ko-KR' | 'ja-JP' | 'ar-SA' | 'hi-IN' | 'bn-BD' | 'pa-IN' | 'ta-IN' | 'te-IN' | 'ur-IN' | 'vi-VN' | 'th-TH' | 'id-ID' | 'ms-MY' | 'fil-PH' | 'nl-NL' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'zh-MO' | 'zh-SG' | 'zh-CH' | 'zh-CHT' | 'zh-CHS' | 'zh-CHT' | 'ro-RO' | 'hu-HU' | 'pl-PL' | 'sr-RS' | 'mk-MK' | 'bg-BG' | 'uk-UA' | 'en-GB' | 'en-AU' | 'en-CA' | 'en-NZ' | 'en-ZA' | 'en-IN' | 'en-IE' | 'en-PH' | 'en-SG' | 'en-HK' | 'en-MO' | 'en-CN' | 'en-TW' | 'en-MY' | 'nl-BE' | 'de-AT' | 'de-CH' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'cs-CZ' | 'sk-SK' | 'sl-SI' | 'hr-HR' | 'lt-LT' | 'lv-LV' | 'et-EE' | 'mt-MT' | 'lb-LU' | 'sq-AL' | 'bs-BA' | 'ca-AD' | 'fr-MC' | 'it-SM' | 'it-VA' | 'ur-PK', required: Locale code
          - `phrases` object[], nullable: The phrases of the set
            - `value` string, required: Phrase value
            - `boost` number, required: Boost value (1-20)
          - `boost` number, nullable: Boost value (1-20)
          - `apiEnabled` boolean, nullable: Whether API is enabled
          - `apiUrl` string, nullable: API URL
          - `apiKey` string, nullable: API key
          - `lastPulledAt` string, date-time, nullable: The last pulled at date of the phrase set
      - `standbyConfig` object: Standby (sleep/wake) configuration
        - `enabled` boolean, required: Enable standby (sleep/wake) for this agent
        - `wakePhrases` string[], required: Phrases that wake the agent. On human-to-human calls the agent stays asleep until one is heard; on normal AI calls a wake phrase brings it back after it was told to sleep. Both parties hear the response.
        - `sleepPhrases` string[]: Phrases that put the agent into standby — it stops responding entirely until woken (distinct from skip-turn). Mainly used on normal AI calls.
      - `voipConnectionIds` string[]: @deprecated Legacy VoIP connection IDs. Use transferSettings.availableTransferDestinations + SipTrunk / UserEndpoint / UserGroup. Kept for backward-compat reads until the migration script lands.
      - `connectDynamically` boolean: Whether to connect the user to the appropriate AI or Human Agent dynamically based on the system prompt
      - `firstMessageSenderOnOutgoingCall` 'agent' | 'user': Who should send the first message on outgoing calls
      - `endCallConfig` object: Configuration for automatic call ending behavior
        - `enabled` boolean: Enable or disable automatic call ending. When enabled, the agent can end calls based on configured reasons
        - `messageToClient` string: The message the agent will say to the client before ending the call. This is used when aiGenerated is false
        - `aiGenerated` boolean: When true, the agent will generate a contextual goodbye message. When false, it uses the fixed messageToClient
        - `maximumTimeEnabled` boolean: Enable automatic call termination after reaching the maximum time limit
        - `maximumTimeCallInSeconds` number: Maximum allowed call duration in seconds. Calls will automatically end when this limit is reached (e.g., 300 for 5 minutes)
        - `endCallReasons` object[]: Detailed end call configurations with specific reasons and custom prompts. Each reason defines when the agent should end the call and what to say
          - `reason` string, required: The specific condition or reason when the agent should end the call (e.g., "customer doesnt want anything else", "issue resolved", "transferred to human")
          - `aiGenerated` boolean, required: When true, the AI generates a contextual goodbye message. When false, uses a fixed message
          - `prompt` string: Template or instruction for the AI to generate the goodbye message. Used when aiGenerated is true to guide the tone and content
          - `maxInterruptions` integer: How many times the caller may interrupt the goodbye and keep the call alive before the hangup becomes final. 0 hangs up at once even if the caller speaks. Defaults to 1
      - `afterCallFunctionCallIds` string[]: IDs of function calls to execute after the call ends
      - `postCallAnalysisConfig` object: Configuration for post-call analysis and reporting
        - `model` object: AI model to use for post-call analysis
          - `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
            - `completionProvider` 'openai' | 'groq' | 'together' | 'mistral' | 'anthropic' | 'gemini' | 'grok' | 'minimax' | 'custom-llm', required
            - `model` string, required
        - `minimumDuration` number: Minimum duration in seconds to generate post-call analysis & summary
        - `summaryEnabled` boolean: Whether to generate summary
        - `summaryPrompt` string: Custom prompt for generating call summary
        - `analysisProperties` object[]: Properties to extract and analyze from the 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[]
            - `id` string
            - `name` string, required
            - `description` string
            - `type` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum', required
            - `options` 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.
              - …
          - `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.
            - string
            - number
            - boolean
            - object: Any valid JSON value
          - `isConstantForContactEntity` boolean
        - `allowedAutoTaskKinds` string[]: Task kinds the AI may auto-create at the end of the call. Human↔AI calls only allow "callback"; human↔human (transferred) calls allow the others. Empty = the AI creates no tasks post-call.
        - `analysisPrompt` string: Custom prompt for call analysis
        - `emails` string[]: Email addresses to send post-call analysis to
        - `phoneNumbers` string[]: Phone numbers to send post-call analysis to
        - `webhookHeaders` object[]: Webhook headers to send with the post-call analysis data
          - `key` string, required: The key of the webhook header
          - `value` string, required: The value of the webhook header
        - `webhookUrl` string, uri: Webhook URL to send post-call analysis data to
        - `webhookUseProtectedValues` boolean: When the agent protects sensitive data: send the REAL values (ΑΦΜ, ΑΜΚΑ, IBAN, …) to this webhook instead of the placeholders. Off by default; every send is audited. Only members who may reveal sensitive data can turn it on.
        - `analysisSmsConfig` object: Configuration for sms content
          - `sendSmsCondition` 'always' | 'evaluate_condition' | 'evaluate_condition_and_recipients' | 'never', required
          - `smsPromptEvaluation` string: Prompt to evaluate if sms should be sent
          - `smsMessage` string: Custom sms message to send
          - `minimumDuration` number: Minimum duration in minutes to send sms
          - `sendSmsFromCallerId` boolean: Whether to send the SMS using the caller ID (company phone number) that made the call as the sender
        - `telegramChats` string[]: Telegram chat ids that receive the post-call alert. Ids come from the reachable-chat registry (GET /telegram/chats) — a bot may only message a chat that contacted it first, so arbitrary ids cannot be typed in.
        - `analysisTelegramConfig` object: Configuration for the Telegram alert
          - `sendTelegramCondition` 'always' | 'evaluate_condition' | 'evaluate_condition_and_recipients' | 'never', required
          - `telegramPromptEvaluation` string: Prompt to evaluate if a Telegram message should be sent (and, with evaluate_condition_and_recipients, which chats)
          - `telegramMessage` string: Custom Telegram message to send
          - `minimumDuration` number: Minimum call duration in seconds before a Telegram alert is sent
        - `viberChannelIds` string[]: Connected Viber Channels (ids from the Viber Channels list) that receive the post-call alert
        - `analysisViberChannelConfig` object: Configuration for the Viber Channel alert
          - `sendViberChannelCondition` 'always' | 'evaluate_condition' | 'never', required
          - `viberChannelPromptEvaluation` string: Prompt to evaluate whether the Viber Channel alert should be posted
          - `viberChannelMessage` string: Custom Viber Channel message (defaults to the call summary). Takes {{placeholders}}: any analysis property ({{client_name}}), {{summary}}, {{analysis_fields}} (every analysis property as "Label: value"), {{phone_number}}
          - `minimumDuration` number: Minimum call duration in seconds before a Viber Channel alert is posted
        - `analysisEmailConfig` object: Configuration for email content
          - `dailyDigest` object: Daily summary email instead of one email per call
            - `enabled` boolean, required: Send one summary email a day instead of one per call. With a condition prompt, calls that pass it are still emailed at once (urgent); the rest go in the summary.
            - `alsoEachCall` boolean: Also send the normal email after each call, on top of the daily summary. Default false.
            - `sendTime` string: Local time (company timezone) to send the summary, HH:mm. Default 20:00. It covers the 24 hours before.
            - `lastSentAt` string, date-time: ISO 8601 date string
          - `includeInEmail` object: Configuration for email content
            - `callUrl` boolean: Whether to include call URL in email
            - `summary` boolean: Whether to include call summary in email
            - `analysisProperties` boolean: Whether to include analyzed properties in email
            - `dynamicVariables` boolean: Whether to include collected / dynamic variables (e.g. widget form fields) in email
            - `recording` boolean: Whether to include call recording in email
            - `transcription` boolean: Whether to include call transcription in email
          - `sendEmailCondition` 'always' | 'evaluate_condition' | 'evaluate_condition_and_recipients' | 'never', required
          - `emailPromptEvaluation` string: Prompt to evaluate if email should be sent
          - `emailSubject` string: Custom email subject to send
          - `minimumDuration` number: Minimum call duration in seconds to send email (voice / websocket calls)
          - `minimumVisitorMessages` integer: Minimum visitor (Contact/User) messages required to send email for chat / message sessions
        - `excludePhoneNumbers` string[]: Caller phone numbers excluded from post-call processing. This suppresses the whole post-call pipeline for that number, not just the notification: no summary is generated, and because caller memory is built from stored summaries, an excluded number also loses memory of its previous calls. Use it for internal test lines, never for a customer you still want remembered.
        - `evaluationConfig` object: Admin-only post-call evaluation configuration
          - `issuesEnabled` boolean: Run the QA/issue lens (defaults on)
          - `opportunitiesEnabled` boolean: Run the opportunity-mining lens (defaults off; sellable)
          - `audioAnalysisEnabled` boolean: Re-transcribe the recording for WER and flag awkward pauses (defaults on)
          - `errorAlertsEnabled` boolean: Email Voice Logica (alerts@) when a call has session errors — never the customer (defaults on)
          - `customFocus` string, nullable: Free-text "what matters most" steering for the judge
          - `customCriteria` object[]: Named checks the judge evaluates
            - `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
          - `judgeModel` object: Plan-gated client choice of evaluation model; falls back to the admin A/B pool
            - `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
              - …
          - `remediation` object: Post-call remediation policy — hybrid: safe auto-actions + human alerts for risky
            - `enabled` boolean: Allow the evaluator to act post-call (alert business + VL admin for risky/unfixable misses)
            - `autoSendToCustomer` boolean: Permit auto-sending the drafted follow-up to the caller for SAFE misses (hybrid auto-action)
            - `mode` 'alert' | 'managed_agent': "alert" = detect+notify (+ safe auto-message); "managed_agent" = a guard-railed agent re-runs the missed tools using the live toolset, then alerts for what it could not do
            - `model` object: Per-agent override for the remediation agent's primary model (plan-gated)
              - …
            - `escalationModel` object: Per-agent override for the smarter model the remediation agent escalates to (plan-gated)
              - …
      - `sendDmtf` boolean: Whether to send DTMF tones during the call (will be active for 40 seconds)
      - `dtmfTimeout` number: Timeout for DTMF input in seconds (1-60 seconds)
      - `dtmfKeyToTrigger` 'dtmf-timeout' | '#' | '*': Keys to trigger the workflow
      - `secondsRingingUntilAnswer` number: Number of seconds to ring before considering the call unanswered (1-60 seconds)
      - `volumeThreshold` number: Audio volume threshold for detecting speech (0.0 to 1.0)
      - `saveRecording` boolean: Whether to save call recordings
      - `saveRecordingGoogleDrive` boolean: Whether to save call recordings to Google Drive
      - `topNknowledgeQuestionsInPrompt` number: DEPRECATED — not read by the prompt path; use nKnowledgeFilesQuery
      - `nKnowledgeFilesQuery` number: Number of knowledge files to query for context (max 10)
      - `selectiveKnowledgeLookup` boolean: When enabled, the AI uses a tool to selectively query specific knowledge files instead of searching all files on every message
      - `generateKnowledgeFromTransferredCalls` boolean: When enabled, transferred calls are analysed post-transfer and any valuable Q&A insights are added to a private per-agent knowledge file, which is then loaded automatically on future calls.
      - `recordUnansweredQuestions` boolean: When enabled, every finished call is analysed for questions the agent could not answer. Each is stored on the agent’s private knowledge file with no answer and a count of how many calls have asked it, so the gaps can be answered in order of demand. These entries are never retrievable until someone writes the answer.
      - `unansweredQuestionTargets` string[]: Where captured unanswered questions are stored. 'agent' keeps them on this agent's own file; 'company' puts them on a shared file every agent in the company reads. Select both to have each question routed to one or the other. Defaults to ['agent'].
      - `unansweredRoutingPrompt` string: Only used when BOTH targets are selected: your own rule for which questions belong to the company file and which to this agent. Leave empty to use the default — business-wide facts go to the company, anything tied to what this agent handles stays with the agent.
      - `maxTimeMemory` number: Maximum time in seconds to keep conversation context in memory
      - `maxInteractionsMemory` number: Maximum number of interactions to keep in conversation memory (max 20)
      - `droppedCallResumeSeconds` number: How long a returning caller or chat visitor (same number / same email) gets the LAST session's messages and AI dialogue on the new call. Memory must be on. The previous session's summary is not injected — the full last conversation is already there. Defaults to 600 (10 minutes). Max 86400 (1 day). Set 0 to always start fresh.
      - `droppedCallResumeMaxTurns` number: Optional cap on how many trailing spoken turns of the dropped call to carry over. Leave unset — the default — to carry the ENTIRE conversation, which is what keeps resolved data such as product codes and the identified customer available so the caller is never asked for them twice. Only set this if chained resumes (a caller dropping repeatedly on a bad line) grow the context too far.
      - `transferType` 'warm' | 'cold': Type of call transfer: warm (with context) or cold (without context)
      - `transferHoldSoundFileId` string: The custom sound to play when the call is transferred
      - `transferHoldSound` 'none' | 'coffee_shop' | 'call_center' | 'office' | 'soft_piano' | 'lounge' | 'waiting_room' | 'custom': The sounds to play when the call is transferred
      - `transferSettings` object: Configuration for transfer settings
        - `enabled` boolean: Master switch for the agent's transfer capability. When false the AI is not given any transfer tool (forward_call / connect_dynamically) and the available-destinations prompt block is suppressed — but every other field on this object is preserved so the admin can re-enable it without losing config. Treated as true when undefined, for backward compatibility with agents created before this flag existed.
        - `transferMode` 'blind' | 'warm' | 'attended': Transfer mode: blind (immediate REFER), warm (consult + media merge), attended (SIP hold + consult + REFER/Replaces).
        - `blindTransfer` boolean: Deprecated — use transferMode. Kept for legacy read compat only.
        - `announceTransferReason` boolean: Whether to announce the transfer reason to the person we are transferring the call to.
        - `transferCallBasedOnPromptInstructions` boolean: Whether to dynamically generate the transfer based on the prompt instructions.
        - `promptForTransferReason` string: The prompt to use when dynamically generating the transfer reason.
        - `analyzeTransferredCall` boolean: Whether to analyze the transferred call.
        - `blockTransferWhenCompanyIsClosed` boolean: Whether to block the transfer when the company is closed.
        - `agentIdToAnalyzeTransferredCall` string: The agent ID to analyze the transferred call.
        - `showCallerId` boolean: Whether to show the original caller ID to the person we are transferring the call to Or the current phone number.
        - `secondsToWaitForCallerToAnswer` number: The number of seconds to wait for the caller to answer the call.
        - `availableTransferDestinations` object[]: Explicit whitelist of destinations this agent may transfer to. Ignored when allowAllAvailableDestinations is true.
          - `destinationType` 'UserEndpoint' | 'UserGroup' | 'External' | 'Agent', required: Kind of destination — UserEndpoint, UserGroup, External, or Agent.
          - `destinationId` string, required: Target id (UserEndpoint id, UserGroup id, Agent id) or for External the phone number to dial.
          - `mode` 'inherit' | 'refer' | 'attended': Per-destination dispatch override: `refer` (blind, send SIP REFER), `attended` (place outbound INVITE, bridge on pickup), or `inherit` (use the agent-level blindTransfer flag). Omitted is treated as `inherit`. Internal AGENT destinations ignore this field — they always go through the agent-handoff path once it ships.
          - `reasonToConnect` string: When to connect the caller to this destination (e.g. "when they ask for Dimitris"). Injected into the live-call transfer catalog.
        - `allowAllAvailableDestinations` boolean: When true the agent may transfer a phone call to any enabled UserEndpoint or UserGroup (ringing that user's devices when they have SIP / app / mobile). Chat handoff uses company users. When false, only entries in availableTransferDestinations are offered.
        - `transferToExternalNumbers` boolean: When true the agent may transfer to external phone numbers.
        - `transferTimeLimitEnabled` boolean: Enable automatic transfer after the call reaches the configured time limit.
        - `transferTimeLimitInSeconds` number: Call duration in seconds after which the agent automatically transfers the call (e.g. 120 for 2 minutes).
        - `transferTimeLimitPrompt` string: Routing instructions for the automatic time-limit transfer: the destination (phone number, extension or agent ID) and what to tell the caller. Used with connect_dynamically when the time limit is reached.
        - `maxTransferAttemptsPerCall` integer, nullable: Opt-in cap on transfer attempts in one call. Once reached, further transfers are refused and the agent takes a message. Unset = unlimited.
      - `enableCallBackAtRequestedTime` boolean: Whether to enable callback functionality when users request to be called back at a later date/time
      - `callBackIfCallDropsPrompt` string: Custom prompt to use when initiating a callback if the call drops
      - `skroutzSettings` object: Configuration for Skroutz settings
        - `enabled` boolean, required: Whether Skroutz is enabled
        - `topNSkroutzProductsInPrompt` number, required: Number of Skroutz products to include in the prompt
        - `nSkroutzProductsQuery` number, required: Number of Skroutz products to query
        - `minProductCodeLength` integer: Minimum normalized digit length for an utterance to be treated as a product code in the autonomous Skroutz lookup. Defaults to 4 when unset.
        - `webhookUrl` string, uri: Webhook URL to send Skroutz products to
        - `webhookHeaders` object[]: Webhook headers to send with the Skroutz products data
          - `key` string, required: The key of the webhook header
          - `value` string, required: The value of the webhook header
      - `voiceMailPhoneNumber` string: Phone numbers to attach voice mail to
      - `voipConnections` object[]: @deprecated Legacy populated VoIP connections. Use transferSettings.availableTransferDestinations + SipTrunk / UserEndpoint / UserGroup.
        - `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: Display name for the VoIP connection
        - `dial` number: Dial number or extension assigned to this connection
        - `reason` string: Internal notes or purpose description for this connection
        - `connectionType` 'User' | 'External' | 'Agent', required: Type of destination: 'Agent', 'User', or 'External'
        - `agentId` string: ID of the AI agent this connection routes to (only for Agent type connections)
        - `sipDomain` string: SIP domain for this connection.
        - `phone` string: External phone number this connection forwards to (only for External type connections)
        - `userId` string: ID of the user this connection routes to (only for User type connections)
        - `start` object: Daily start time when this connection becomes available
          - `hours` integer, required: Hours in 24-hour format (0-23, e.g., 9 for 9 AM, 17 for 5 PM)
          - `minutes` integer, required: Minutes (0-59, e.g., 0 for on the hour, 30 for half past)
        - `end` object: Daily end time when this connection becomes unavailable
          - `hours` integer, required: Hours in 24-hour format (0-23, e.g., 9 for 9 AM, 17 for 5 PM)
          - `minutes` integer, required: Minutes (0-59, e.g., 0 for on the hour, 30 for half past)
        - `canAgentTranscribe` boolean: Whether the agent can transcribe calls to this connection
        - `canAgentRecord` boolean: Whether the agent can record calls to this connection
        - `canAgentAnalyze` boolean: Whether the agent can analyze calls to this connection
        - `canAgentSpeakWhenAsked` boolean: Whether the agent can speak when asked during calls to this connection
        - `allDay` boolean: Whether this connection is available 24/7 (ignores start/end times when true)
        - `syncWithGoogle` boolean, required: Whether availability is synchronized with Google Calendar
        - `syncWithGoogleStatus` 'open' | 'closed', required: Google Calendar sync mode: 'open' for free time availability, 'closed' for busy time unavailability
        - `messageToUser` string: Custom message or announcement played before transferring calls to this connection
        - `aiGeneratedMessage` boolean: Whether transfer messages are dynamically generated by AI based on call context
        - `transcription_enabled` boolean: Whether real-time transcription is enabled for calls on this connection
        - `agent` object: Full agent details when connectionType is 'Agent' (populated from agents database)
          - `id` string: Agent's unique identifier
          - `name` string: Agent's display name
        - `user` object: Full user details when connectionType is 'User' (populated from users database)
          - `id` string: User's unique identifier
          - `name` string: User's full name
          - `email` string: User's email address
          - `defaultCompanyId` string: User's default company ID
          - `picture` string: User's profile picture URL
          - `emailVerified` boolean: Whether the user's email has been verified
          - `lastConnectedAt` string, date-time: ISO 8601 date string
          - `isConnected` boolean: Whether the user is currently online/connected
        - `username` string: SIP username for direct authentication (advanced configurations only)
        - `password` string: SIP password for direct authentication (advanced configurations only)
        - `ipAddress` string[]: Whitelist of allowed IP addresses for security restrictions
        - `extensionRegistrationIds` string[]: IDs of the extension registrations linked with this connection
        - `extensionRegistrations` object[]: Active SIP device registrations for this connection (virtual populate from ExtensionRegistration collection, filtered to show only non-expired registrations). Each entry represents a physical device (phone, softphone, etc.) currently registered with this extension.
          - `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
          - `voipConnectionId` string: ID of the VoIP Connection that owns this extension (legacy)
          - `phoneExtensionId` string: ID of the Phone Extension that owns this extension
          - `username` string, required: SIP username/extension that is registered
          - `contactUri` string, required: Full SIP Contact URI for routing calls to this extension
          - `remoteAddress` string, required: IP address of the registered SIP client
          - `clientIp` string: Public client IP when known
          - `remotePort` number, required: Port number of the registered SIP client
          - `transport` 'udp' | 'tcp' | 'tls' | 'websocket', required: Transport protocol: 'udp', 'tcp', 'tls' for SIP; 'websocket' for app clients
          - `registeredAt` string, date-time, required: Timestamp when this extension was registered (ISO 8601 format)
          - `expiresAt` string, date-time, required: Timestamp when this registration will expire (ISO 8601 format)
          - `expires` number, required: Number of seconds until expiration (decreases over time)
          - `userAgent` string: SIP User-Agent identifying the client software
          - `callId` string: SIP Call-ID from the REGISTER request
          - `bindingSource` 'register' | 'invite': 'register' = the phone sent a REGISTER and can be rung; 'invite' = stand-in written from an authenticated outbound INVITE, used only for that call's in-dialog requests and never for ringing the phone
          - `consecutiveInviteFailures` integer: Liveness skip-list counter. Bumped on 5xx/timeout from fork-INVITEs, reset on 200 OK. When ≥3 and `lastInviteFailureAt` is within the last 5 minutes, the registration is skipped by routing.
          - `lastInviteFailureAt` string, date-time: ISO 8601 date string
          - `voipConnection` object: Legacy VoIP Connection — only populated for pre-migration rows.
            - `id` string
            - `name` string
            - `agentId` string
            - `userId` string
            - `connectionType` string
          - `userEndpoint` object: Populated UserEndpoint this registration belongs to.
            - `id` string
            - `name` string
            - `number` string
            - `status` string
      - `adaptationPhraseSets` object[]: List of adaptation phrase sets for improving transcription accuracy
        - `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 adaptation phrase set
        - `description` string, nullable: The description of the phrase set
        - `phraseSetId` string, required: The phrase set id
        - `language` 'ar-AE' | 'ar-BH' | 'ar-EG' | 'ar-KW' | 'ar-OM' | 'ar-QA' | 'ar-SA' | 'ar-LB' | 'ar-MA' | 'el-GR' | 'en-US' | 'es-ES' | 'fr-FR' | 'el-CY' | 'en-DK' | 'he-IL' | 'bg-BG' | 'ru-RU' | 'de-DE' | 'it-IT' | 'pt-PT' | 'ru-RU' | 'tr-TR' | 'zh-CN' | 'ja-JP' | 'ko-KR' | 'ja-JP' | 'ar-SA' | 'hi-IN' | 'bn-BD' | 'pa-IN' | 'ta-IN' | 'te-IN' | 'ur-IN' | 'vi-VN' | 'th-TH' | 'id-ID' | 'ms-MY' | 'fil-PH' | 'nl-NL' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'zh-MO' | 'zh-SG' | 'zh-CH' | 'zh-CHT' | 'zh-CHS' | 'zh-CHT' | 'ro-RO' | 'hu-HU' | 'pl-PL' | 'sr-RS' | 'mk-MK' | 'bg-BG' | 'uk-UA' | 'en-GB' | 'en-AU' | 'en-CA' | 'en-NZ' | 'en-ZA' | 'en-IN' | 'en-IE' | 'en-PH' | 'en-SG' | 'en-HK' | 'en-MO' | 'en-CN' | 'en-TW' | 'en-MY' | 'nl-BE' | 'de-AT' | 'de-CH' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'cs-CZ' | 'sk-SK' | 'sl-SI' | 'hr-HR' | 'lt-LT' | 'lv-LV' | 'et-EE' | 'mt-MT' | 'lb-LU' | 'sq-AL' | 'bs-BA' | 'ca-AD' | 'fr-MC' | 'it-SM' | 'it-VA' | 'ur-PK', required: Locale code
        - `phrases` object[], nullable: The phrases of the set
          - `value` string, required: Phrase value
          - `boost` number, required: Boost value (1-20)
        - `boost` number, nullable: Boost value (1-20)
        - `apiEnabled` boolean, nullable: Whether API is enabled
        - `apiUrl` string, nullable: API URL
        - `apiKey` string, nullable: API key
        - `lastPulledAt` string, date-time, nullable: The last pulled at date of the phrase set
      - `afterCallFunctionCalls` object[]: List of function calls that are executed after the call ends
        - `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
        - `description` string: Description of the function call
        - `conditionBlocks` object[]: Condition blocks for execution logic
          - `operator` 'and' | 'or', required
          - `type` 'condition' | 'block', required
          - `conditions` object[]
            - `operator` 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'isNull' | 'isNotNull' | 'isTrue' | 'isFalse' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'in' | 'notIn' | 'between', required
            - `field` string, required
            - `fieldValue` union
              - …
            - `fieldType` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'array' | 'object' | 'enum', required
          - `blocks` object[]
        - `executeAt` 'now' | 'after_session_end' | 'custom': When to execute the function call
        - `confirmationMethodConfig` object: Configuration for user confirmation
          - `confirmationRequired` boolean, required
          - `secondsToWait` number, required
          - `wordMatch` object
            - `required` boolean, required
            - `value` string[], required
          - `aiGuidance` object
            - `required` boolean, required
            - `value` string, required
          - `dtmf` object
            - `required` boolean, required
            - `value` string, required
        - `messageToUserBeforeAction` string: Message to show user before executing the action
        - `messageToUserAfterAction` string: Message to show user after executing the action
        - `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
        - `parameters` object[], required: 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[]
            - `id` string
            - `name` string, required
            - `description` string
            - `type` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum', required
            - `options` 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.
              - …
          - `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.
            - string
            - number
            - boolean
            - object: Any valid JSON value
          - `isConstantForContactEntity` boolean
        - `functions` object[], required: Internal actions to execute
          - `sequence` number, required
          - `executeAt` 'now' | 'after_session_end' | 'custom'
          - `conditionBlocks` object[]
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `action` 'emailConfig' | 'apiCall' | 'sendSms' | 'createEvent' | 'sendPhoneCall' | 'forwardCall' | 'googleSearch' | 'sendMessage' | 'endCallConfig' | 'googleSheetConfig' | 'googleDocConfig' | 'llmCompletion' | 'hubspotConfig' | 'aiResponse' | 'transferCall' | 'afmSearch' | 'codeExecution', required
          - `apiConfig` object
            - `url` string, required
            - `headers` object[], required
              - …
            - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required
            - `params` object[], required
              - …
            - `bodyType` 'raw' | 'form-data'
            - `rawType` 'json' | 'xml' | 'text' | 'html'
            - `body` object: Any valid JSON value
            - `formBody` object[]
              - …
            - `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.
              - …
          - `emailConfig` object
            - `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[]
          - `smsConfig` object
            - `to` string[], required
            - `body` string, required
            - `from` string
          - `viberConfig` object
            - `to` string[], required
            - `body` string, required
            - `from` string, required
            - `viberProviderId` string, required
            - `fallbackToSms` boolean
            - `smsConfig` object
              - …
            - `viberChannelId` string
          - `phoneCallConfig` object
            - `phoneNumber` string, required
            - `systemPrompt` string, required
            - `numberOfTries` number
            - `voipPhoneId` string
            - `sipTrunkId` string
            - `agentId` string, required
            - `fallbackToSms` boolean
            - `smsConfig` object
              - …
            - `keepOnlyPhoneCallConfigSystemPrompt` boolean
            - `callNow` boolean
            - `scheduleAt` string
          - `forwardCallConfig` object
            - `voipConnectionId` string, required
          - `googleSearchConfig` object
            - `sites` string[]
            - `excludedSites` string[]
            - `dateRestrict` 'd1' | 'd7' | 'w1' | 'm1' | 'm6' | 'y1' | 'y5'
            - `searchQuery` string, required
            - `scrapeWebsiteResults` boolean
            - `topNumberOfResults` number
            - `topNumberOfResultsToScrape` number
            - `scrapeWithSlowService` boolean
          - `sendMessageConfig` object
            - `messageToUser` string, required
          - `endCallConfig` object
            - `reason` string, required
          - `googleSheetConfig` object
            - `sheetId` string
            - `sheetName` string, required
            - `defaultParameters` object
              - …
            - `properties` string[]
          - `googleDocConfig` object
            - `docName` string, required
            - `body` string, required
            - `isPublic` boolean
          - `llmCompletionConfig` object
            - `prompt` string, required
            - `parameters` object[]: Parameters for the function call
              - …
            - `completionModel` object, required
              - …
          - `aiResponseConfig` object
            - `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
          - `transferCallConfig` object
            - `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
      - `transferHoldSoundFile` object: Response schema for file including company metadata
        - `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
    - `appointmentSettings` object
      - `enabled` boolean, nullable: Whether the appointment settings are enabled
      - `isOnline` boolean, nullable: Whether the appointment settings are online
      - `services` object[]: The services of the appointment settings
        - `serviceKey` string: Stable internal identity for this service; calendars reference it so renames are safe
        - `name` string, required: The name of the service
        - `description` string, required: The description of the service
        - `duration` number, required: The duration of the service in minutes
        - `allowedMeetingTypes` string[], required: How this service can be delivered. `online`: video (e.g. Google Meet). `phone`: voice call only. `client-location`: at an address the caller provides (use location lookup tool). `office-location`: at the provider’s office; set `officeAddress` on the service (or on the matching working-hours row). Omit or `[]` when not set. Used when a working-hours row is `not-set` to decide Meet / location / office.
        - `officeAddress` string: Provider’s office address when `office-location` is in allowedMeetingTypes. Shown to the user for office bookings; working-hours rows may override with their own officeAddress.
        - `colorId` union, required: Google Calendar event color ID as a string, "1"–"11". Omit or "" for the default calendar color.
          - '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11'
          - ''
      - `concurrentBookings` number: The number of concurrent bookings
      - `useGlobalConcurrentBookings` 'not-set' | 'true': Use the global concurrentBookings for all calendars (true) or per-calendar concurrentBookings (not-set)
      - `allDayBookings` boolean: Whether the appointment settings are enabled for all day bookings
      - `parameters` object[]: The parameters of the appointment settings
        - `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[]
          - `id` string
          - `name` string, required
          - `description` string
          - `type` 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum', required
          - `options` 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.
            - string
            - number
            - boolean
            - object: Any valid JSON value
        - `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.
          - string
          - number
          - boolean
          - object: Any valid JSON value
        - `isConstantForContactEntity` boolean
      - `canSameClientBookMultipleAppointmentsInFuture` 'not-set' | 'true' | 'false': Whether the same client can book multiple appointments in the future
      - `canClientCancelAppointmentWithAi` 'not-set' | 'true' | 'false': Whether the client can cancel the appointment with AI
      - `futureDaysAllowToBook` 'not-set' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | '13' | '14' | '21' | '30' | '45' | '60' | '90' | '120' | '180' | '365': The number of days in advance that the appointment can be booked
      - `sendConfirmation` boolean, required: Whether the confirmation is sent
      - `confirmationPrompt` string: The confirmation prompt for the appointment
      - `confirmationSmsSenderId` string: Sender shown on the confirmation SMS (a verified Yuboto sender ID). Empty falls back to the send_sms tool sender, then to VoiceLogica.
      - `appointmentDescriptionContents` string[]: Blocks included in the calendar event description: questions, services, notes, location, call_url, summary, recording_url. Omit for the default set (questions, notes, location, summary)
      - `calendars` object[]: Array of calendar IDs that the appointment settings are enabled for
        - `name` string, required: The name of the calendar
        - `calendarKey` string: Stable internal identity for this calendar; allows several calendars to share one Google calendarId
        - `calendarId` string, required: The provider calendar ID this calendar reads/writes (Google or Azure/Outlook; may be shared across calendars)
        - `provider` 'google' | 'azure': Calendar backend for this calendar: 'google' or 'azure' (Microsoft 365). Omit to use the company default.
        - `description` string, required: The description of the calendar
        - `serviceKeys` string[]: The serviceKeys of the services of the calendar
        - `serviceNames` string[], required: Legacy name-based service reference; kept for calendars saved before serviceKeys existed
        - `futureDaysAllowToBook` number, required: The number of days in advance that the appointment can be booked
        - `concurrentBookings` number: Per-calendar concurrent bookings; omit or 0 to inherit the agent-level default
        - `countAllCalendarEventsForConcurrency` boolean: Advanced: count every Voice Logica booking on the same Google calendar toward concurrency, whichever logical calendar made it (ignore service names). Use it when several logical calendars share one Google calendar. Default is service-name concurrency.
        - `restrictions` object[]: Optional booking restrictions: max per hour/day/week, minimum gap between appointments, or minimum notice (hours or operating days) before the start
          - `type` 'max_per_hour' | 'max_per_day' | 'max_per_week' | 'min_gap_minutes' | 'min_notice_hours' | 'min_notice_business_days' | 'min_notice_calendar_days', required: max_per_hour | max_per_day | max_per_week | min_gap_minutes (minimum free gap between appointments) | min_notice_hours (earliest bookable slot is this many hours from now) | min_notice_business_days (this many full company operating days of notice after today; today never counts; every calendar uses that same date, falling back to the union of calendar working days when the company has no hours) | min_notice_calendar_days (same, counting every day including closed ones)
          - `limit` number, required: Cap for max_* types, gap in minutes for min_gap_minutes, lead-time hours for min_notice_hours, or number of days for the min_notice_*_days types (days of notice after today, so 2 on a Wednesday makes Friday the earliest bookable day)
          - `serviceNames` string[]: When set, restriction applies only to these service names; omit for all services on the calendar
          - `enabled` boolean: When false, restriction is ignored. Default true.
        - `appointmentTitle` string: The title of the appointment
        - `appointmentNotes` string: The notes of the appointment
        - `canClientCancelAppointmentWithAi` boolean: Whether the client can cancel the appointment with AI
        - `canSameClientBookMultipleAppointmentsInFuture` boolean: Whether the same client can book multiple appointments in the future
        - `workingHours` object[]: Per-calendar bookable windows. Same `day` may appear multiple times for split schedules (e.g. Fri morning office, Fri afternoon client site).
          - `day` 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday', required: Day of the week
          - `meetingType` 'online' | 'phone' | 'client-location' | 'office-location' | 'not-set': Modality for this time window: online (Meet), phone, client-location, or office-location. `not-set` = inherit Meet / location / office behaviour from each booked service’s allowedMeetingTypes.
          - `officeAddress` string: Physical office for this window when it includes office-location; overrides service.officeAddress if both are set.
          - `startTime` object, required: Start time for bookings in this window (local calendar day)
            - `hours` number, required: Hours (0-23)
            - `minutes` number, required: Minutes (0-59)
          - `endTime` object, required: End time for bookings in this window (local calendar day)
            - `hours` number, required: Hours (0-23)
            - `minutes` number, required: Minutes (0-59)
      - `useGlobalWorkingHours` 'not-set' | 'true': Use global working hours for all calendars (true) or per-calendar working hours (not-set)
      - `workingHours` object[]: Global bookable windows when useGlobalWorkingHours is true. Same weekday may repeat with different times and meetingType (e.g. Fri morning office, Fri afternoon client site).
        - `day` 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday', required: Day of the week
        - `meetingType` 'online' | 'phone' | 'client-location' | 'office-location' | 'not-set': Modality for this time window: online (Meet), phone, client-location, or office-location. `not-set` = inherit Meet / location / office behaviour from each booked service’s allowedMeetingTypes.
        - `officeAddress` string: Physical office for this window when it includes office-location; overrides service.officeAddress if both are set.
        - `startTime` object, required: Start time for bookings in this window (local calendar day)
          - `hours` number, required: Hours (0-23)
          - `minutes` number, required: Minutes (0-59)
        - `endTime` object, required: End time for bookings in this window (local calendar day)
          - `hours` number, required: Hours (0-23)
          - `minutes` number, required: Minutes (0-59)
      - `reminderSettings` object: The reminder settings for the appointment
        - `enabled` boolean, required: Whether the reminder is enabled
        - `daysBefore` number, required: The number of days before the appointment to send the reminder
        - `time` string, required: The time of the day to send the reminder
        - `type` 'email' | 'sms' | 'phone', required: The type of reminder
        - `numberOfRetries` number, required: The number of retries for the reminder
        - `sendFallbackSms` boolean, required: Whether the fallback SMS is sent
        - `fallbackSms` string, required: The fallback SMS message for the appointment
      - `waitingListEnabled` boolean: Whether the waiting list is enabled
      - `waitingListSettings` object: Bounds on who the waiting list calls, and when
        - `candidateDays` number: How far ahead to look for people to call about a freed slot. Defaults to 30 days; without it the search follows futureDaysAllowToBook, which can be a full year.
        - `callFromHour` string: Earliest local time to place a waiting-list call, HH:MM. Default 09:00.
        - `callToHour` string: Latest local time to place a waiting-list call, HH:MM. Default 20:00.
    - `widgetSettings` object
      - `enabled` boolean: Whether the embeddable widget is enabled for this agent
      - `allowedDomains` string[]: Hostnames allowed to embed this widget. Empty = allow all.
      - `allowWwwVariant` boolean: Also allow www. variant of each allowed domain
      - `actionsRequireVerification` boolean: Unverified visitors get a questions-only agent: tools that send messages or touch external systems load only after email/mobile/Google verification
      - `collectFields` object[]: Dynamic fields to ask visitors before starting (name, client_id, …). Email is widgetSettings.email.
        - `key` string, required: Dynamic variable key used in prompts as {{key}}
        - `label` string, required: Label shown to the visitor
        - `placeholder` string
        - `type` 'text' | 'email' | 'tel' | 'number' | 'location' | 'files': Input type
        - `required` boolean
      - `email` object: Require a visitor email; optional 6-digit email validation
        - `required` boolean
        - `validation` boolean
      - `phone` object: Require a visitor mobile; optional SMS code (Greece/Cyprus only)
        - `required` boolean
        - `validation` boolean
      - `feedback` object: Legacy, always 'none'. The end-of-chat rating (Good/Bad + optional comment) is set on the evaluate_conversation tool, not here: update_agent_settings with section 'tools' and changes { name: 'evaluate_conversation', enabled: true, channels: ['widget'], collectComment: true }.
        - `mode` 'none' | 'end'
        - `collectComment` boolean
      - `interface` object
        - `startsCollapsed` boolean
        - `languageDropdown` boolean
        - `enableMuting` boolean
        - `markdownAllowedDomains` string[]: Hostnames whose links in agent replies are clickable, e.g. ["example.com", "hihello.com"]. Exact host match (plus www. when allowWwwVariantForMarkdown). Empty = no link is clickable; other links show struck through.
        - `allowWwwVariantForMarkdown` boolean: Also accept the www. variant of each markdownAllowedDomains entry. Default true.
        - `allowHttpLinks` boolean: Also allow plain http:// (not https) links on markdownAllowedDomains. Does not make any link clickable by itself.
        - `acceptFiles` boolean
        - `acceptLocation` boolean
        - `pageContext` boolean: Tell the agent which page the visitor is on (address without query string, title, description, main heading), at start and whenever they move to another page. Default false.
        - `inactivityMinutes` number
      - `avatar` object
        - `type` 'orb' | 'link' | 'image'
        - `firstColor` string
        - `secondColor` string
        - `linkUrl` string
        - `imageUrl` string
        - `imageFileId` string
      - `terms` object
        - `required` boolean
        - `termsText` string
      - `styling` object
        - `variant` 'tiny' | 'compact' | 'full'
        - `placement` 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'
        - `base` string
        - `baseHover` string
        - `baseActive` string
        - `baseBorder` string
        - `baseSubtle` string
        - `basePrimary` string
        - `baseError` string
        - `accent` string
        - `accentHover` string
        - `accentActive` string
        - `accentBorder` string
        - `accentSubtle` string
        - `accentPrimary` string
        - `overlayPadding` number
        - `buttonRadius` number
        - `inputRadius` number
        - `bubbleRadius` number
        - `sheetRadius` number
        - `compactSheetRadius` number
        - `dropdownSheetRadius` number
        - `syntaxTheme` 'auto' | 'light' | 'dark'
        - `offsetX` number: Desktop gap from the left/right edge in px (default: overlayPadding)
        - `offsetY` number: Desktop gap from the top/bottom edge in px (default: overlayPadding)
        - `mobileOffsetX` number: Phones (≤767px): gap from the left/right edge in px (default: the desktop gap)
        - `mobileOffsetY` number: Phones (≤767px): gap from the top/bottom edge in px, e.g. 90 to clear a fixed "Book now" bar (default: the desktop gap)
        - `mobilePlacement` 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left': Phones (≤767px): another corner than placement (default: placement)
      - `text` object
        - `main_label` string
        - `start_call` string
        - `start_chat` string
        - `new_call` string
        - `end_call` string
        - `end_chat` string
        - `mute_microphone` string
        - `change_language` string
        - `collapse` string
        - `expand` string
        - `copied` string
        - `accept_terms` string
        - `dismiss_terms` string
        - `collect_title` string
        - `collect_continue` string
        - `listening_status` string
        - `speaking_status` string
        - `connecting_status` string
        - `chatting_status` string
        - `input_label` string
        - `input_placeholder` string
        - `input_placeholder_text_only` string
        - `input_placeholder_new_conversation` string
        - `user_ended_conversation` string
        - `agent_ended_conversation` string
        - `conversation_id` string
        - `error_occurred` string
        - `copy_id` string
        - `initiate_feedback` string
        - `request_follow_up_feedback` string
        - `thanks_for_feedback` string
        - `thanks_for_feedback_details` string
        - `follow_up_feedback_placeholder` string
        - `submit` string
        - `go_back` string
        - `send_message` string
        - `text_mode` string
        - `voice_mode` string
        - `switched_to_text_mode` string
        - `switched_to_voice_mode` string
        - `copy` string
        - `download` string
        - `wrap` string
        - `agent_working` string
        - `agent_done` string
        - `agent_error` string
        - `attach_file` string
        - `remove_file` string
        - `file_upload_error` string
        - `file_type_unsupported` string
        - `file_too_large` string
        - `file_limit_reached` string
        - `share_location` string
        - `locating` string
        - `location_ready` string
        - `location_denied` string
        - `files_hint` string
        - `uploading_files` string
        - `typing_indicator` string
        - `start_chat_hint` string
        - `start_chat_hint_files` string
        - `start_call_hint` string
        - `preview_agent` string
        - `preview_visitor` string
        - `collect_hint_chat` string
        - `collect_hint_call` string
        - `terms_title` string
        - `try_again` string
        - `show_transcript` string
        - `hide_transcript` string
        - `unmute_microphone` string
        - `microphone_muted` string
        - `conversation_ended` string
        - `call_ended` string
        - `teammate_joined` string
        - `teammate_joined_hint` string
        - `team_member` string
        - `duration` string
        - `messages` string
        - `feedback_good` string
        - `feedback_bad` string
      - `shareablePage` object
        - `description` string
        - `requireTerms` boolean
      - `pageNavigation` object: The AI opens pages of this website for the visitor (text chat only)
        - `enabled` boolean: The widget AI may open pages of this website for the visitor (text chat only). Only the page's own site and allowedDomains; the visitor sees "Taking you to …" and can cancel. Default false.
        - `listedPagesOnly` boolean: When pages are listed, the AI may open only those addresses (any query string). Default true. Ignored while the list is empty.
        - `instructions` string: Extra instructions for the AI about opening pages
        - `pages` object[]: Pages the AI can open, with a name and an optional description (import them from the sitemap in the app)
          - `url` string, required: The page: a path on the site ("/el/crete") or an absolute https address on it
          - `name` string, required: What the page is, e.g. "Hotels in Crete"
          - `description` string: Optional: when to open it, e.g. "all our Cretan hotels, filter by town"
    - `tools` object[]
      - `enabled` boolean, required
      - `name` 'skip_turn' | 'send_sms' | 'send_email' | 'eshop_integration' | 'hubspot' | 'zoho' | 'salesforce' | 'navigate_ivr' | 'schedule_callback' | 'detect_live_sentiment' | 'detect_live_frustration' | 'schedule_appointment' | 'handle_silence' | 'lock_on_speaker' | 'galaxy_drugstore' | 'galaxy_erp' | 'soft1_erp' | 'entersoft_one' | 'odoo_erp' | 'pylon_erp' | 'sap_erp' | 'splynx' | 'shopify' | 'woocommerce' | 'opencart' | 'magento' | 'megasoft' | 'gonnaorder' | 'prestashop' | 'airtable' | 'jira' | 'guesty' | 'clickup' | 'trello' | 'dropbox' | 'googleChat' | 'zoho_crm' | 'helpdesk' | 'courier' | 'outlook' | 'detect_voice_mail' | 'add_participant' | 'make_call_private' | 'pause_recording' | 'request_data_erasure' | 'send_info_page' | 'capture_data_via_sms' | 'compare_caller_to_branches' | 'find_location_info' | 'evaluate_conversation' | 'extract_document' | 'scrape_website' | 'fleet_management' | 'caller_verification' | 'custom_api' | 'webhotelier' | 'hosthub' | 'exelixis_smart', required
      - `prompt` string
      - `type` 'system' | 'user', required
      - `playWaitMusic` boolean: Play keyboard wait music while this tool runs mid-call
      - `senderId` string
      - `mailboxId` string
      - `propertyCode` string
      - `url` string, uri
      - `interval` number
      - `vectorField` string
      - `aiEnabled` boolean
      - `keyOfId` 'mpn' | 'ean' | 'sku' | 'skroutzId' | 'groupCode' | 'none'
      - `deltaCapable` boolean
      - `lastSyncAt` string, date-time: ISO 8601 date string
      - `lastFullSyncAt` string, date-time: ISO 8601 date string
      - `feedEtag` string
      - `feedLastModified` string
      - `timesFailed` number
      - `readContactProperties` string[]
      - `updateContactProperties` string[]
      - `createCallActivity` boolean
      - `nudgeIntervalSeconds` number
      - `timesToNudge` number
      - `actions` string[]
      - `allowMultipleSpeakers` boolean
      - `leaveMessage` boolean
      - `maxDurationSeconds` number
      - `words` string[]
      - `timeoutSeconds` number
      - `maxSkips` integer
      - `enabledOperations` union[]
        - union
          - 'lookup_customer_by_phone' | 'lookup_customer_by_tin' | 'lookup_customer_by_code' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'search_items' | 'check_item_availability' | 'get_item_price' | 'calculate_order' | 'place_order' | 'get_order_status' | 'get_customer_history' | 'get_customer_balance' | 'get_customer_aging' | 'get_customer_kartela_link' | 'find_items_by_active_ingredient' | 'get_invoice_pdf_links' | 'get_next_route' | 'get_customer_top_items' | 'get_top_selling_items' | 'get_customer_fin_info_per_drug_type'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_tin' | 'lookup_customer_by_code' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'search_items' | 'get_item_by_id' | 'create_sales_doc' | 'get_sales_doc_by_id'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_tin' | 'lookup_customer_by_code' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'search_items' | 'get_customer_balance' | 'get_customer_aging' | 'get_customer_history' | 'get_customer_orders' | 'get_customer_top_items' | 'get_top_selling_items' | 'create_order' | 'create_invoice' | 'create_delivery_note' | 'create_receipt' | 'update_order' | 'update_invoice' | 'update_delivery_note' | 'update_receipt' | 'add_order_line' | 'remove_order_line' | 'adjust_order_quantity' | 'set_order_transfer' | 'log_call' | 'create_meeting' | 'create_task' | 'search_activities' | 'list_projects' | 'create_project' | 'list_project_actions' | 'create_customer' | 'add_customer_phone' | 'remove_customer_phone' | 'get_order_by_key' | 'create_sales_doc' | 'update_sales_doc' | 'transmit_einvoice'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_tin' | 'lookup_customer_by_code' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'search_items' | 'get_customer_purchase_history' | 'get_customer_branches' | 'get_customer_balance' | 'add_order_line' | 'remove_order_line' | 'create_order'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_tin' | 'lookup_customer_by_code' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'search_products' | 'get_customer_orders' | 'get_order' | 'get_customer_balance' | 'create_order'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_login' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'get_customer_balance' | 'get_services' | 'get_invoices' | 'get_online_status' | 'create_ticket' | 'set_customer_status'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_tin' | 'lookup_customer_by_code' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'search_items' | 'get_customer_balance' | 'get_customer_aging' | 'run_public_query' | 'run_ebs_service' | 'create_sales_doc'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_email' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'get_customer_by_id' | 'get_orders_by_customer' | 'get_order_by_id' | 'search_products' | 'get_product_by_id' | 'list_shipping_options' | 'create_order' | 'create_draft_order' | 'sync_products_to_skroutz'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_email' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'get_customer_by_id' | 'get_orders_by_customer' | 'get_order_by_id' | 'search_products' | 'get_product_by_id' | 'list_shipping_options' | 'create_order'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_email' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'get_customer_by_id' | 'get_orders_by_customer' | 'get_order_by_id' | 'search_products' | 'get_product_by_id' | 'create_order'
          - 'lookup_customer' | 'check_availability' | 'create_order' | 'get_order' | 'list_customer_orders'
          - 'get_contact' | 'list_company_contacts' | 'list_support_members' | 'get_order' | 'list_customer_orders' | 'create_ticket' | 'search_items' | 'create_order' | 'send_statement' | 'get_balance'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_email' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'get_customer_by_id' | 'get_orders_by_customer' | 'get_order_by_id' | 'search_products' | 'get_product_by_id' | 'list_shipping_options' | 'create_order'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'lookup_customer_by_afm' | 'verify_customer' | 'get_customer_by_code' | 'get_customer_balance' | 'search_products' | 'get_product_by_code' | 'list_shipping_methods' | 'list_payment_methods' | 'get_customer_orders' | 'get_order_status' | 'get_customer_purchases' | 'list_offers' | 'get_item_price' | 'get_product_stock' | 'get_alt_items' | 'cancel_order' | 'create_order'
          - 'search_catalog' | 'get_offer' | 'check_delivery_address' | 'lookup_customer_by_phone' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'get_customer_orders' | 'list_time_slots' | 'create_order' | 'validate_location' | 'get_order_status' | 'create_payment_link' | 'check_payment_status' | 'create_reservation'
          - 'check_availability' | 'search_bookings' | 'get_reservation' | 'get_property_info' | 'create_booking' | 'cancel_booking' | 'get_rooms' | 'get_rates' | 'get_extras' | 'get_availability_calendar' | 'get_best_rate' | 'search_offers' | 'resend_confirmation' | 'check_multi_property_availability' | 'search_properties'
          - 'identify_caller' | 'search_reservations' | 'get_reservation' | 'list_rentals' | 'get_rental' | 'check_availability'
          - 'lookup_customer_by_phone' | 'lookup_customer_by_email' | 'lookup_customer_by_name' | 'link_caller_to_customer' | 'get_customer_by_id' | 'get_orders_by_customer' | 'get_order_by_id' | 'search_products' | 'get_product_by_id' | 'list_order_states' | 'create_order' | 'update_order_status'
          - 'lookup_contact_by_phone' | 'lookup_contact_by_email' | 'get_contact_by_id' | 'lookup_contact_by_name' | 'link_caller_to_contact'
          - 'lookup_contact_by_phone' | 'lookup_contact_by_name' | 'lookup_contact_by_email' | 'create_lead' | 'add_note'
          - 'lookup_contact_by_phone' | 'lookup_contact_by_name' | 'lookup_contact_by_email' | 'link_caller_to_contact' | 'get_contact_by_id' | 'create_lead' | 'log_call'
          - 'lookup_record_by_phone' | 'search_records' | 'get_record_by_id' | 'create_record' | 'update_record'
          - 'lookup_issue' | 'search_issues' | 'create_issue' | 'update_issue' | 'add_comment' | 'get_comments' | 'transition_issue' | 'assign_issue' | 'list_projects' | 'list_create_fields'
          - 'identify_caller' | 'get_reservations' | 'get_reservation' | 'get_listings' | 'get_listing_details' | 'get_house_rules' | 'get_conversations' | 'check_availability' | 'get_quote' | 'get_owner_revenue' | 'create_task' | 'list_tasks' | 'send_message'
          - 'create_task' | 'update_task' | 'update_task_status' | 'move_task' | 'assign_task' | 'list_members' | 'add_attachment' | 'add_comment' | 'search_tasks' | 'get_task' | 'find_list' | 'get_contact_by_number' | 'list_contacts'
          - 'list_boards' | 'list_lists' | 'list_cards' | 'get_card' | 'search_cards' | 'list_members' | 'create_card' | 'update_card' | 'move_card' | 'list_comments' | 'add_comment' | 'assign_member' | 'remove_member' | 'add_attachment'
          - 'get_account' | 'list_files' | 'get_metadata' | 'get_download_link' | 'search_files' | 'list_shared_links' | 'upload_file' | 'create_folder' | 'create_shared_link' | 'create_file_request' | 'move_file' | 'copy_file' | 'delete_file'
          - 'send_message' | 'send_to_default_space' | 'send_via_webhook'
          - 'lookup_contact_by_phone' | 'lookup_contact_by_name' | 'lookup_contact_by_email' | 'create_lead' | 'add_note'
          - 'lookup_contact_by_phone' | 'lookup_contact_by_name' | 'link_caller_to_contact' | 'get_recent_tickets' | 'create_ticket' | 'add_ticket_reply'
          - 'track_voucher' | 'reschedule_delivery'
          - 'check_availability' | 'list_events' | 'create_event' | 'update_event' | 'lookup_contact'
      - `defaultWrhsCode` string
      - `defaultProjectKey` string
      - `defaultIssueTypeName` string
      - `defaultCalendarId` string
      - `timeZone` string
      - `callerKeyType` 'phone' | 'vat' | 'email' | 'custom' | 'none'
      - `callerKeyLabel` string
      - `prefetchTicketsOnCallStart` boolean
      - `callerPhoneFields` string[]
      - `guestyPrefetch` object
        - `reservations` boolean: Prefetch the caller's reservations (guest: own bookings; owner: active+upcoming across their listings).
        - `listings` boolean: Prefetch the owner's listings (owners only).
        - `houseRules` boolean: Prefetch house rules of the guest's reserved listing (guests with a current/upcoming reservation).
        - `conversations` boolean: Prefetch the caller's recent Guesty conversations.
      - `guestyLimits` object
        - `maxReservationRangeDays` integer, nullable: Cap (days) on an owner-by-listing reservation date range — the strongest guard. Default and system maximum 7.
        - `maxReservations` integer, nullable: Cap on reservations returned by any single call. Default 10, system maximum 20.
        - `maxConversations` integer, nullable: Cap on conversations returned / prefetched. Default 5.
        - `maxListings` integer, nullable: Cap on listings returned. Default 20.
        - `prefetchReservationBackDays` integer, nullable: Prefetch window: days before today for a caller's reservations. Default 3.
        - `prefetchReservationForwardDays` integer, nullable: Prefetch window: days after today. Default 4.
      - `guestyQuoteSource` string
      - `autoIdentifyCaller` boolean
      - `prefetchOrdersOnCallStart` boolean
      - `prefetchOrdersDays` integer
      - `prefetchOrdersMaxOrders` integer
      - `prefetchShippingZonesOnCallStart` boolean
      - `maxOrderValue` number, nullable
      - `maxOrderLines` integer, nullable
      - `maxSalesDocValue` number, nullable
      - `maxSalesDocLines` integer, nullable
      - `salesDocShippingEnabled` boolean
      - `salesDocManageOlderThan24h` boolean
      - `allowExternalNumbers` boolean
      - `announceRecordingPause` 'off' | 'pause' | 'resume' | 'both'
      - `customAttributes` object[]
        - `key` string, required: The attribute key. Meaning varies per provider (see tool config description).
        - `description` string, required: What the AI should put in this field — shown to the LLM as the parameter description.
        - `required` boolean: When true, the AI must fill the field. The write op is rejected if missing.
      - `logCallNotesTemplate` string
      - `logCallOnlyWhenField` string
      - `logCallMergeDaily` boolean
      - `logCallActor` string
      - `logCallActorRules` object[]
        - `property` string, required: Post-call analysis property to test, e.g. "requested_person".
        - `values` string[], required: Values that select this rule — the canonical name plus spoken variants. Case/accent-insensitive; a value also matches when it appears as whole words inside the analysis text.
        - `actor` string, required: Soft1 ACTOR (user) the call is assigned to when this rule matches. Supports {{variables}}.
        - `label` string: Operator note, e.g. the person's name. Shown in logs only.
      - `logCallHeaderFields` object[]
        - `key` string, required: SOACTION column name, e.g. "UDSTRING01" or "CCCSOACTION.UDFTYPE".
        - `value` string, required: Template for the value, e.g. "{{request_type}}". Supports {{phone_number}}, {{caller_name}}, {{agent_name}}, {{call_date}} and any post-call analysis property.
        - `valueMap` object: Optional map from the rendered text to the stored value (case/accent-insensitive key match), e.g. {"Πωλήσεις":"1","Υποστήριξη":"2"}. Unmapped text is stored as is.
      - `allowedSpaces` object[]
        - `spaceName` string, required: Opaque space resource name (spaces/AAQA...)
        - `displayName` string, required: Friendly label shown to the LLM and rendered in the UI
      - `allowedBoards` object[]
        - `id` string, required: Trello board id
        - `name` string, required: Board display name shown in the UI and to the AI
      - `allowedWebhookLabels` string[]
      - `fields` object[]
        - `name` string, required: Field key, e.g. "full_name" or "accident_location"
        - `description` string, required: What to ask for — shown as the field label/help text on the web form
        - `type` 'text' | 'number' | 'location' | 'files', required: Input type; "location" asks for GPS + map pin; "files" lets the caller upload photos/PDFs (S3 + OCR/AI analysis)
        - `required` boolean
      - `ttlMinutes` integer
      - `notifyEmails` string[]
      - `smsMessage` string
      - `maxCallbacks` integer
      - `dynamicWelcomeMessage` boolean
      - `branches` object[]
        - `id` string: Optional stable id for this branch
        - `name` string, required: Spoken branch name, e.g. "Syntagma store"
        - `address` string: Full address text used for geocoding when lat/lng are missing
        - `latitude` number: Latitude in decimal degrees
        - `longitude` number: Longitude in decimal degrees
        - `googlePlaceId` string: Optional Google Place ID; used to resolve coordinates when lat/lng are missing
      - `includeCompanyLocation` boolean
      - `regionBias` string
      - `locationDetails` string[]
      - `maxResults` integer
      - `channels` string[]
      - `collectComment` boolean
      - `allowResubmit` boolean
      - `sendMode` 'always' | 'evaluate'
      - `evaluationPrompt` string
      - `channel` 'email' | 'sms' | 'both'
      - `maxAttempts` integer
      - `codeTtlSeconds` integer
      - `method` 'otp' | 'known_field'
      - `matchField` 'vatNumber'
      - `matchLastDigits` integer
      - `saveCallerNumber` boolean
      - `recentlyCalledDays` integer
      - `stopsAtStart` boolean
    - `mcpServers` object[]
      - `connectionId` string, required: Company MCP connection this agent uses
      - `name` string, required: Display name
      - `slug` string, required: Prefix for LLM tool names (mcp_{slug}__{tool})
      - `enabled` boolean
      - `enabledTools` string[]: Remote tool names the agent may call
      - `selectedToolDefs` object[]: Schemas for enabled tools so live calls stay sync
        - `remoteName` string, required: Tool name as published by the MCP server
        - `description` string
        - `inputSchema` object
    - `playWaitMusicOnDuringCallTools` boolean
    - `password` string
    - `passwordTries` number
    - `externalDial` number
    - `internalDial` string
    - `nodes` object[]
      - `id` number, required: Unique identifier for the node
      - `name` string, required: Display name of the node
      - `position` object, required: X,Y coordinates for node positioning
        - `x` number, required
        - `y` number, required
      - `inputs` object, required: Input connections to this node
      - `outputs` object, required: Output connections from this node
      - `className` string: CSS class for styling the node
      - `data` union: Node-specific data and configuration
        - object
          - `isGlobalNode` boolean, required
          - `startNode` boolean, required
          - `globalNodeCondition` object[], required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `conditionPrompt` string
          - `nodeType` 'conversation', required
          - `nodeTitle` string, required
          - `skipResponse` boolean, required
          - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
            - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
            - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
            - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
            - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
          - `transitions` object[], required
            - `type` 'prompt' | 'condition' | 'transcriptionMessage' | 'conditionBlock' | 'dynamic' | 'noCondition' | 'always' | 'success' | 'error', required
            - `prompt` string
            - `conditionLabel` string
            - `conditionBlock` object[]
              - …
            - `condition` object
              - …
            - `isEditing` boolean
            - `connectedTo` number
          - `nodePromptType` 'prompt' | 'static', required
          - `prompt` string, required
          - `systemPrompt` string
          - `enableModel` boolean
          - `model` object
            - `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
              - …
          - `enableTranscription` boolean
          - `transcriptionConfig` object: Configuration for speech-to-text transcription settings
            - `transcriptionProvider` 'microsoft' | 'google' | 'fireworks' | 'speechmatics' | 'openai' | 'assemblyai' | 'deepgram' | 'google_v1' | 'google_v2' | 'elevenlabs' | 'voicelogica' | 'soniox', required: The transcription service provider to use for speech-to-text
            - `silenceDurationMs` number: Duration of silence in milliseconds before considering the user finished speaking
            - `adaptationPhraseSetIds` string[]: IDs of adaptation phrase sets to improve transcription accuracy
            - `transcriptionVoiceMailPhrases` string[]: Phrases that indicate the call has reached a voicemail system
            - `waitForFullTranscription` boolean: Whether to wait for complete transcription before processing
            - `enhanced` boolean: Whether to use enhanced transcription models for better accuracy
            - `audioEnhancement` boolean: Whether to run ai-coustics speech enhancement (noise/background-speech suppression) on caller audio before transcription
            - `audioEnhancementLevel` number: How aggressively the ai-coustics model suppresses noise (0.0-1.0). Uses the model default when omitted
            - `endpointSensitivity` number, nullable: Soniox only: how aggressively endpoints are detected (-1.0 to 1.0). Higher = faster end-of-turn but more risk of cutting the caller off mid-sentence. Platform default 0.3
            - `maxEndpointDelayMs` number, nullable: Soniox only: hard cap on how long Soniox may wait for an endpoint after speech ends (500-3000ms). Platform default 1500
            - `endpointLatencyAdjustmentLevel` integer, nullable: Soniox only: endpoint latency reduction level 0-3 (3 = most aggressive). Platform default 3
            - `speculativeFinalize` boolean, nullable: Soniox only: at the speculative quiet moment, request finalize() to flush pending tokens into the candidate before the endpoint. Platform default from admin settings
            - `singleUtterance` boolean: Whether to process speech as single utterances
            - `openAiModel` 'whisper-1' | 'gpt-transcribe' | 'gpt-4o-transcribe' | 'gpt-4o-mini-transcribe' | 'gpt-4o-transcribe-diarize': OpenAI model to use for transcription
            - `prompt` string: Custom prompt used for transcription processing
            - `keywords` string[]: Keywords to focus on during transcription
            - `initializationMethod` 'on_call_start' | 'on_human_join': Method to initialize the transcription service
          - `analysisProperties` object[], required
            - `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
          - `skipTurnEnabled` boolean
          - `skipTurnPrompt` string
          - `workflowsIds` string[]
          - `knowledgeFileIds` string[]
          - `enableVoice` boolean
          - `voiceConfig` object: Configuration for voice synthesis settings
            - `voiceProvider` 'microsoft' | 'openai' | 'google' | 'elevenlabs' | 'deepgram' | 'minimax' | 'murf' | 'voicelogica' | 'soniox' | 'grok' | 'gemini', required: The voice provider service to use for text-to-speech
            - `voiceId` string, required: The specific voice ID to use for speech synthesis
            - `speed` number: Speech rate multiplier. Effective range depends on provider: ElevenLabs 0.7-1.2, Google 0.25-2.0, Microsoft 0.25-2.0, Minimax 0.5-2.0
            - `stability` number: Stability of the voice (0.0 = low, 1.0 = high)
            - `similarity_boost` number: Similarity of the voice (0.0 = low, 1.0 = high)
            - `style` number: ElevenLabs style exaggeration (0.0 = none, 1.0 = max). Anything above 0 adds a little latency
            - `use_speaker_boost` boolean: ElevenLabs speaker boost: closer to the original speaker at a small latency cost
            - `backgroundSound` 'none' | 'coffee_shop' | 'call_center' | 'office': The background sound to play during the call
            - `backgroundVolume` number: The volume of the background sound (0.0 = low, 1.0 = high)
            - `allowCallerToRequestSpeedChange` boolean: When enabled, the caller can ask the AI to speak faster or slower during the call
            - `adjustBasedOnHumanSpeed` boolean: When enabled, the AI automatically adjusts its speaking speed to match how fast or slow the human caller speaks
            - `modelId` 'eleven_flash_v2_5' | 'eleven_turbo_v2_5' | 'eleven_multilingual_v2' | 'eleven_v3' | 'eleven_v4' | 'eleven_v4_turbo', nullable: ElevenLabs TTS model for this agent (admin only). Omit or null to use the platform default
          - `canJumpToPreviousNode` boolean
          - `workflows` object[]
            - `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
              - …
            - `nodes` object[]: Action nodes in the flow
              - …
            - `fileIds` string[]: Array of file IDs linked with this function call
            - `files` object[]: Linked files
              - …
            - `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)
              - …
          - `knowledgeFiles` object[]
            - `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: The name of the knowledge file
            - `description` string: Optional description of the knowledge file
            - `language` 'ar-AE' | 'ar-BH' | 'ar-EG' | 'ar-KW' | 'ar-OM' | 'ar-QA' | 'ar-SA' | 'ar-LB' | 'ar-MA' | 'el-GR' | 'en-US' | 'es-ES' | 'fr-FR' | 'el-CY' | 'en-DK' | 'he-IL' | 'bg-BG' | 'ru-RU' | 'de-DE' | 'it-IT' | 'pt-PT' | 'ru-RU' | 'tr-TR' | 'zh-CN' | 'ja-JP' | 'ko-KR' | 'ja-JP' | 'ar-SA' | 'hi-IN' | 'bn-BD' | 'pa-IN' | 'ta-IN' | 'te-IN' | 'ur-IN' | 'vi-VN' | 'th-TH' | 'id-ID' | 'ms-MY' | 'fil-PH' | 'nl-NL' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'zh-MO' | 'zh-SG' | 'zh-CH' | 'zh-CHT' | 'zh-CHS' | 'zh-CHT' | 'ro-RO' | 'hu-HU' | 'pl-PL' | 'sr-RS' | 'mk-MK' | 'bg-BG' | 'uk-UA' | 'en-GB' | 'en-AU' | 'en-CA' | 'en-NZ' | 'en-ZA' | 'en-IN' | 'en-IE' | 'en-PH' | 'en-SG' | 'en-HK' | 'en-MO' | 'en-CN' | 'en-TW' | 'en-MY' | 'nl-BE' | 'de-AT' | 'de-CH' | 'sv-SE' | 'no-NO' | 'da-DK' | 'fi-FI' | 'is-IS' | 'gl-ES' | 'ca-ES' | 'eu-ES' | 'pt-BR' | 'zh-TW' | 'zh-HK' | 'cs-CZ' | 'sk-SK' | 'sl-SI' | 'hr-HR' | 'lt-LT' | 'lv-LV' | 'et-EE' | 'mt-MT' | 'lb-LU' | 'sq-AL' | 'bs-BA' | 'ca-AD' | 'fr-MC' | 'it-SM' | 'it-VA' | 'ur-PK', required: Language of the knowledge file
            - `texts` object[]: Array of text content linked with the knowledge
              - …
            - `links` object[]: Array of links linked with the knowledge
              - …
            - `files` object[]: Array of files linked with the knowledge with S3 information
              - …
            - `emails` object[]: Array of emails linked with the knowledge
              - …
            - `calls` object[]: Array of calls linked with the knowledge
              - …
            - `chats` object[]: Array of chats linked with the knowledge
              - …
            - `contactIds` string[]: Array of contact IDs who have access to this knowledge
            - `publicAccess` boolean: Whether this knowledge is publicly accessible
            - `summaryLevelOfDetail` 'small' | 'medium' | 'large': Level of detail for AI-generated summaries
            - `knowledgeDataIds` string[]: Array of knowledge data IDs linked with this knowledge file
            - `knowledgeData` object[]: Array of knowledge data entries linked with this knowledge file
              - …
            - `googleDriveFolderId` string: Google Drive folder ID
            - `googleDriveFolderUpdatedAt` string, date-time: ISO 8601 date string
            - `summary` string: AI-generated summary of the knowledge content
            - `keyPoints` string: AI-generated key points extracted from the knowledge content
            - `hidden` boolean: When true, this file is hidden from user-facing list endpoints.
            - `learningAutoAdd` boolean: false = Learning auto-add never approves into this base; absent = allowed.
            - `autoGenerated` boolean: When true, this knowledge file is populated automatically by the system (transferred-call post-analysis).
            - `sourceAgentId` string: Owning agent id when the file is auto-generated for a single agent.
            - `isMemoryStore` boolean: When true, marks the per-company knowledge file holding contact memories.
            - `isCompanyKnowledgeStore` boolean: When true, marks the per-company file collecting business-wide unanswered questions.
            - `isCallMemoryStore` boolean: When true, marks a hidden per-user call-memory knowledge file for voice-assist.
            - `sourceUserId` string: Owning user id when isCallMemoryStore is true.
            - `processingStatus` 'not_started' | 'processing' | 'ready' | 'failed': Background ingest status: not_started, processing, ready (completed), or failed
            - `unansweredCount` integer: How many unanswered caller questions are waiting on this file. Set on the agent own-file and company own-file endpoints.
        - object
          - `isGlobalNode` boolean, required
          - `startNode` boolean, required
          - `globalNodeCondition` object[], required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `conditionPrompt` string
          - `nodeType` 'transfer-call', required
          - `nodeTitle` string, required
          - `skipResponse` boolean, required
          - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
            - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
            - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
            - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
            - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
          - `transitions` object[], required
            - `type` 'prompt' | 'condition' | 'transcriptionMessage' | 'conditionBlock' | 'dynamic' | 'noCondition' | 'always' | 'success' | 'error', required
            - `prompt` string
            - `conditionLabel` string
            - `conditionBlock` object[]
              - …
            - `condition` object
              - …
            - `isEditing` boolean
            - `connectedTo` number
          - `transferType` 'warm' | 'cold', required
          - `voipConnectionIds` string[]
          - `connectDynamically` boolean
          - `showCallerId` boolean
          - `transferMode` 'blind' | 'warm' | 'attended'
          - `blindTransfer` boolean
          - `transferCallBasedOnPromptInstructions` boolean
          - `promptForTransferReason` string
          - `announceTransferReason` boolean
          - `analyzeTransferredCall` boolean
          - `agentIdToAnalyzeTransferredCall` string
          - `secondsToWaitForCallerToAnswer` number
          - `voipConnections` object[]
            - `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: Display name for the VoIP connection
            - `dial` number: Dial number or extension assigned to this connection
            - `reason` string: Internal notes or purpose description for this connection
            - `connectionType` 'User' | 'External' | 'Agent', required: Type of destination: 'Agent', 'User', or 'External'
            - `agentId` string: ID of the AI agent this connection routes to (only for Agent type connections)
            - `sipDomain` string: SIP domain for this connection.
            - `phone` string: External phone number this connection forwards to (only for External type connections)
            - `userId` string: ID of the user this connection routes to (only for User type connections)
            - `start` object: Daily start time when this connection becomes available
              - …
            - `end` object: Daily end time when this connection becomes unavailable
              - …
            - `canAgentTranscribe` boolean: Whether the agent can transcribe calls to this connection
            - `canAgentRecord` boolean: Whether the agent can record calls to this connection
            - `canAgentAnalyze` boolean: Whether the agent can analyze calls to this connection
            - `canAgentSpeakWhenAsked` boolean: Whether the agent can speak when asked during calls to this connection
            - `allDay` boolean: Whether this connection is available 24/7 (ignores start/end times when true)
            - `syncWithGoogle` boolean, required: Whether availability is synchronized with Google Calendar
            - `syncWithGoogleStatus` 'open' | 'closed', required: Google Calendar sync mode: 'open' for free time availability, 'closed' for busy time unavailability
            - `messageToUser` string: Custom message or announcement played before transferring calls to this connection
            - `aiGeneratedMessage` boolean: Whether transfer messages are dynamically generated by AI based on call context
            - `transcription_enabled` boolean: Whether real-time transcription is enabled for calls on this connection
            - `agent` object: Full agent details when connectionType is 'Agent' (populated from agents database)
              - …
            - `user` object: Full user details when connectionType is 'User' (populated from users database)
              - …
            - `username` string: SIP username for direct authentication (advanced configurations only)
            - `password` string: SIP password for direct authentication (advanced configurations only)
            - `ipAddress` string[]: Whitelist of allowed IP addresses for security restrictions
            - `extensionRegistrationIds` string[]: IDs of the extension registrations linked with this connection
            - `extensionRegistrations` object[]: Active SIP device registrations for this connection (virtual populate from ExtensionRegistration collection, filtered to show only non-expired registrations). Each entry represents a physical device (phone, softphone, etc.) currently registered with this extension.
              - …
        - object
          - `isGlobalNode` boolean, required
          - `startNode` boolean, required
          - `globalNodeCondition` object[], required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `conditionPrompt` string
          - `nodeType` 'end-call', required
          - `nodeTitle` string, required
          - `skipResponse` boolean, required
          - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
            - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
            - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
            - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
            - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
          - `transitions` object[], required
            - `type` 'prompt' | 'condition' | 'transcriptionMessage' | 'conditionBlock' | 'dynamic' | 'noCondition' | 'always' | 'success' | 'error', required
            - `prompt` string
            - `conditionLabel` string
            - `conditionBlock` object[]
              - …
            - `condition` object
              - …
            - `isEditing` boolean
            - `connectedTo` number
          - `nodePromptType` 'prompt' | 'static', required
          - `prompt` string, required
        - object
          - `isGlobalNode` boolean, required
          - `startNode` boolean, required
          - `globalNodeCondition` object[], required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `conditionPrompt` string
          - `nodeType` 'press-digit', required
          - `nodeTitle` string, required
          - `skipResponse` boolean, required
          - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
            - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
            - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
            - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
            - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
          - `transitions` object[], required
            - `type` 'prompt' | 'condition' | 'transcriptionMessage' | 'conditionBlock' | 'dynamic' | 'noCondition' | 'always' | 'success' | 'error', required
            - `prompt` string
            - `conditionLabel` string
            - `conditionBlock` object[]
              - …
            - `condition` object
              - …
            - `isEditing` boolean
            - `connectedTo` number
          - `nodePromptType` 'prompt' | 'static', required
          - `prompt` string, required
        - object
          - `isGlobalNode` boolean, required
          - `startNode` boolean, required
          - `globalNodeCondition` object[], required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `conditionPrompt` string
          - `nodeType` 'email', required
          - `nodeTitle` string, required
          - `skipResponse` boolean, required
          - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
            - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
            - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
            - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
            - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
          - `transitions` object[], required
            - `type` 'prompt' | 'condition' | 'transcriptionMessage' | 'conditionBlock' | 'dynamic' | 'noCondition' | 'always' | 'success' | 'error', required
            - `prompt` string
            - `conditionLabel` string
            - `conditionBlock` object[]
              - …
            - `condition` object
              - …
            - `isEditing` boolean
            - `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
          - `isGlobalNode` boolean, required
          - `startNode` boolean, required
          - `globalNodeCondition` object[], required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `conditionPrompt` string
          - `nodeType` 'sms', required
          - `nodeTitle` string, required
          - `skipResponse` boolean, required
          - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
            - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
            - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
            - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
            - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
          - `transitions` object[], required
            - `type` 'prompt' | 'condition' | 'transcriptionMessage' | 'conditionBlock' | 'dynamic' | 'noCondition' | 'always' | 'success' | 'error', required
            - `prompt` string
            - `conditionLabel` string
            - `conditionBlock` object[]
              - …
            - `condition` object
              - …
            - `isEditing` boolean
            - `connectedTo` number
          - `smsConfig` object, required
            - `to` string[], required
            - `body` string, required
            - `from` string
        - object
          - `isGlobalNode` boolean, required
          - `startNode` boolean, required
          - `globalNodeCondition` object[], required
            - `operator` 'and' | 'or', required
            - `type` 'condition' | 'block', required
            - `conditions` object[]
              - …
            - `blocks` object[]
              - …
          - `conditionPrompt` string
          - `nodeType` 'api', required
          - `nodeTitle` string, required
          - `skipResponse` boolean, required
          - `interruptionConfig` object: Configuration for handling user interruptions during agent speech
            - `type` 'as_soon_as_human_speaks' | 'when_human_completes_utterance' | 'never_interrupt' | 'evaluate_interruption', required: How the agent should handle user interruptions
            - `interruptionEvaluationPrompt` string: Custom prompt to evaluate whether interruption should be allowed
            - `messageOnSuccessfulInterruption` string: Message to play when interruption is successful
            - `messageOnFailedInterruption` string: Message to play when interruption is not allowed
          - `transitions` object[], required
            - `type` 'prompt' | 'condition' | 'transcriptionMessage' | 'conditionBlock' | 'dynamic' | 'noCondition' | 'always' | 'success' | 'error', required
            - `prompt` string
            - `conditionLabel` string
            - `conditionBlock` object[]
              - …
            - `condition` object
              - …
            - `isEditing` boolean
            - `connectedTo` number
          - `apiConfig` object, required
            - `url` string, required
            - `headers` object[], required
              - …
            - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required
            - `params` object[], required
              - …
            - `bodyType` 'raw' | 'form-data'
            - `rawType` 'json' | 'xml' | 'text' | 'html'
            - `body` object: Any valid JSON value
            - `formBody` object[]
              - …
            - `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.
              - …
        - object
- … truncated; see the full OpenAPI document linked below

## Other responses

- `400`: Bad request - Invalid campaign configuration
- `401`: Unauthorized
- `403`: Invalid CSRF
- `404`: Campaign not found
- `429`: Rate limit exceeded
- `500`: Internal Server Error

## Changes

- **2026-10-20** `30f76840084e`: 2 breaking, 2 warning
  - the `retries` request property type changed from `number` to `integer`
  - the `retryDelayMinutes` request property type changed from `number` to `integer`
  - the `retryDelayMinutes` request property's max was set to `40320.00`
  - the `retryDelayMinutes` request property's min was set to `60.00`

[Operation history](https://skmtc.dev/voicelogica/apis/voice-logica-api/changes/api/v1/agentic/campaigns/:id/put.md)

---

[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)
