> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cekura.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Agent

> Register an AI voice agent with Cekura. Provider credentials are nested under a provider block rather than flat fields.



## OpenAPI

````yaml post /test_framework/v2/aiagents/
openapi: 3.1.0
info:
  title: Cekura API
  version: v1
  description: >-
    Complete API documentation for the Cekura platform. This API provides
    endpoints for testing, observing, and evaluating AI voice agents — including
    managing agents, running evaluators, defining metrics, and analyzing call
    quality.
servers:
  - url: https://api.cekura.ai
security: []
paths:
  /test_framework/v2/aiagents/:
    post:
      tags:
        - test_framework
      summary: Create an AI voice agent
      description: >-
        Register a new AI voice agent. Required fields: name, description,
        project, inbound. Provider credentials are nested under provider.{type,
        agent_id, credentials} instead of flat fields. transcript_provider
        defaults to provider.type when omitted.


        **provider.credentials keys by type (voice providers only):**

        - vapi: api_key + config.{public_key, trigger_url}

        - retell: api_key + agent_id + optional
        chat_agent_details.config.agent_id

        - elevenlabs: api_key + config.{trigger_url}

        - bland: api_key + agent_id (pathway_id) + config.{encrypted_key} for
        Twilio

        - livekit: api_key + config.{api_secret (required), url (required)}

        - pipecat: api_key + config.{webhook_url}

        - cisco: no credentials needed

        - self_hosted: credentials.config.{url (wss://), headers}

        Note: agentforce goes in chat_agent_details; koreai/genesys/synthflow
        use the v1 API.


        **Auto-import from a cloud provider** — set
        `provider.configure_from_provider: true`
        (vapi/retell/elevenlabs/synthflow) with `provider.agent_id` +
        `provider.credentials.api_key`. Cekura fetches the prompt, name,
        language, who-speaks-first, phone number, tool calls, dynamic variables
        and knowledge base and configures the agent automatically — `name` and
        `description` become optional (auto-fetched). The response is **202**
        with the created agent plus a `progress_id`; poll `auto-fetch-progress/`
        to follow the staged import.


        See examples below for full per-provider payloads.
      operationId: aiagents-create
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SchemaPostAIAgentV2'
            examples:
              CloudAuto-import(configureFromProvider):
                value:
                  project: 42
                  provider:
                    type: retell
                    agent_id: agent_abc123
                    credentials:
                      api_key: key_xxx
                    configure_from_provider: true
                summary: Cloud auto-import (configure_from_provider)
                description: >-
                  Fetch & configure everything from the provider; returns 202 +
                  progress_id.
              Self-hosted(observation-only,MostCommon):
                value:
                  name: Support Bot
                  description: Handles inbound support calls
                  project: 42
                  inbound: true
                  phone_number: '+14155551234'
                  provider:
                    type: self_hosted
                summary: Self-hosted (observation-only, most common)
              Self-hostedViaWebSocket(text-modeTesting):
                value:
                  name: WS Agent
                  description: Agent with websocket endpoint for text-mode test runs
                  project: 42
                  inbound: false
                  provider:
                    type: self_hosted
                    chat_agent_details:
                      type: self_hosted
                      config:
                        url: wss://staging.example.com/agent
                        headers:
                          Authorization: Bearer token
                summary: Self-hosted via WebSocket (text-mode testing)
                description: >-
                  Websocket is a CHAT/TEXT connection — put url and headers in
                  chat_agent_details, not provider.credentials.
              VAPI:
                value:
                  name: VAPI Sales Agent
                  description: Outbound sales qualification
                  project: 42
                  inbound: false
                  phone_number: '+14155551234'
                  provider:
                    type: vapi
                    agent_id: asst_abc123xyz
                    credentials:
                      api_key: vapi_sk_xxx
                      config:
                        public_key: vapi_pk_xxx
                    auto_import_calls: true
                    auto_sync_prompt: true
              Retell:
                value:
                  name: Retell Booking Agent
                  description: Schedules appointments
                  project: 42
                  inbound: true
                  phone_number: '+14155551234'
                  provider:
                    type: retell
                    agent_id: retell_voice_agent_abc123
                    credentials:
                      api_key: key_xxx
                      config:
                        trigger_url: https://api.retellai.com/create-phone-call
                    chat_agent_details:
                      type: retell
                      config:
                        agent_id: retell_chat_agent_xyz456
                description: >-
                  agent_id = Retell agent for voice/inbound calls.
                  chat_agent_details = optional separate agent for text-mode
                  test runs.
              Bland:
                value:
                  name: Bland Support Agent
                  description: Handles billing questions
                  project: 42
                  inbound: true
                  phone_number: '+14155551234'
                  provider:
                    type: bland
                    agent_id: bland_pathway_xyz
                    credentials:
                      api_key: bland_xxx
                      config:
                        encrypted_key: twilio_encrypted_key_xxx
                description: >-
                  agent_id is the Bland pathway_id. bland_data.encrypted_key is
                  the Twilio credential bundle.
              LiveKit:
                value:
                  name: LiveKit Concierge
                  description: Multi-modal front-desk agent
                  project: 42
                  inbound: true
                  provider:
                    type: livekit
                    credentials:
                      api_key: APIxxx
                      config:
                        api_secret: secret_xxx
                        url: wss://acme.livekit.cloud
                description: api_secret and url are required inside credentials.config.
              ElevenLabs:
                value:
                  name: ElevenLabs Voice Agent
                  description: Voice agent on ElevenLabs
                  project: 42
                  inbound: true
                  provider:
                    type: elevenlabs
                    agent_id: elevenlabs_agent_abc123
                    credentials:
                      api_key: elevenlabs_key_xxx
              Self-hostedWithMockTools(direct+MCPRouting):
                value:
                  name: Support Bot
                  description: Handles inbound support calls
                  project: 42
                  inbound: true
                  provider:
                    type: self_hosted
                  mock_tools:
                    - name: get_order
                      description: Look up an order
                      mock_data:
                        - input:
                            order_id: A1
                          output:
                            status: shipped
                    - name: crm_lookup
                      description: CRM read
                      mock_data: []
                      served_via:
                        type: mcp
                        mock_index: 1
                    - name: crm_update
                      description: CRM write
                      mock_data: []
                      served_via:
                        type: mcp
                        mock_index: 1
                  dynamic_variables:
                    - name: customer_name
                      description: Caller name
                summary: Self-hosted with mock tools (direct + MCP routing)
                description: >-
                  served_via.type='mcp' groups tools under a shared MCP endpoint
                  (same mock_index = same endpoint); omit served_via (or use
                  'direct') for a per-tool URL. url is server-computed and never
                  sent on the request.
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/SchemaPostAIAgentV2'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/SchemaPostAIAgentV2'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AIAgentV2'
              examples:
                CreatedAgent:
                  value:
                    id: 303
                    name: Support Bot
                    description: Handles inbound support calls
                    project: 42
                    language: en
                    telephony:
                      inbound: true
                      phone_number: '+14155551234'
                      sip_uri: null
                    provider:
                      type: self_hosted
                    agent_speaks_first: null
                    knowledge_base_files: []
                    mock_tools:
                      - id: 1
                        name: get_order
                        description: Look up an order
                        mock_data:
                          - input:
                              order_id: A1
                            output:
                              status: shipped
                        served_via:
                          type: direct
                          url: >-
                            https://api.cekura.ai/test_framework/v1/aiagents/303/tool/get_order/
                      - id: 2
                        name: crm_lookup
                        description: CRM read
                        mock_data: []
                        served_via:
                          type: mcp
                          mock_index: 1
                          url: >-
                            https://api.cekura.ai/test_framework/v1/aiagents/303/mcp/1/
                    mock_tools_enabled: false
                    mock_tools_provider: null
                    dynamic_variables:
                      - id: 10
                        name: customer_name
                        description: Caller name
                    created_at: '2026-01-01T00:00:00Z'
                    updated_at: '2026-01-01T00:00:00Z'
                  summary: Created agent
                  description: >-
                    201 response. served_via.type is always present; url is
                    server-computed.
          description: ''
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AIAgentConfigureFromProviderResponse'
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                properties:
                  field_name:
                    type: array
                    items:
                      type: string
          description: ''
      security:
        - api_key: []
components:
  schemas:
    SchemaPostAIAgentV2:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
          description: |-
            Agent ID.
            Example: `2142`
        name:
          type: string
          description: >-
            Agent name. Optional when configure_from_provider is set — it's
            fetched from the provider.
          maxLength: 255
        description:
          type: string
          description: >

            A detailed description of what this agent does and how it should
            interact

            Example: 

            ```text

            AI agent for handling customer support inquiries and resolving
            technical issues

            ```
        project:
          type: integer
          description: The project this agent belongs to
        language:
          enum:
            - af
            - ar
            - bn
            - bg
            - zh
            - cs
            - da
            - nl
            - en
            - et
            - fi
            - fr
            - de
            - el
            - gu
            - hi
            - he
            - hu
            - id
            - it
            - ja
            - kn
            - ko
            - ms
            - ml
            - mr
            - multi
            - 'no'
            - pl
            - pa
            - pt
            - ro
            - ru
            - sk
            - es
            - sv
            - th
            - tr
            - tl
            - ta
            - te
            - uk
            - vi
          type: string
          x-spec-enum-id: b822ad429c7b7fec
          default: en
          description: >-

            The primary language this agent uses for communication (e.g. 'en'
            for English)



            * `af` - Afrikaans

            * `ar` - Arabic

            * `bn` - Bengali

            * `bg` - Bulgarian

            * `zh` - Chinese Simplified

            * `cs` - Czech

            * `da` - Danish

            * `nl` - Dutch

            * `en` - English

            * `et` - Estonian

            * `fi` - Finnish

            * `fr` - French

            * `de` - German

            * `el` - Greek

            * `gu` - Gujarati

            * `hi` - Hindi

            * `he` - Hebrew

            * `hu` - Hungarian

            * `id` - Indonesian

            * `it` - Italian

            * `ja` - Japanese

            * `kn` - Kannada

            * `ko` - Korean

            * `ms` - Malay

            * `ml` - Malayalam

            * `mr` - Marathi

            * `multi` - Multilingual

            * `no` - Norwegian

            * `pl` - Polish

            * `pa` - Punjabi

            * `pt` - Portuguese

            * `ro` - Romanian

            * `ru` - Russian

            * `sk` - Slovak

            * `es` - Spanish

            * `sv` - Swedish

            * `th` - Thai

            * `tr` - Turkish

            * `tl` - Tagalog

            * `ta` - Tamil

            * `te` - Telugu

            * `uk` - Ukrainian

            * `vi` - Vietnamese
        telephony:
          allOf:
            - $ref: '#/components/schemas/AgentTelephony'
          writeOnly: true
          description: Phone and SIP/websocket channel configuration.
        provider:
          allOf:
            - $ref: '#/components/schemas/SchemaAgentProviderCreate'
          writeOnly: true
          description: >-
            AI platform integration. Nested credentials replace the flat
            {provider}_api_key fields.
        agent_speaks_first:
          type:
            - boolean
            - 'null'
          description: >-
            True = agent speaks first; False = test user speaks first; null =
            auto-detect.
        predefined_metrics:
          writeOnly: true
          description: predefined metrics to use for the agent
        knowledge_base_files:
          type: array
          items:
            $ref: '#/components/schemas/AgentKnowledgeBaseFileWrite'
          writeOnly: true
          description: >-
            Full desired set of knowledge base files. Reference existing by
            `id`; add new ones with `file_name` + `content_base64`. Omitted
            existing files are deleted.
        enabled_personalities:
          type: array
          items:
            type: integer
          readOnly: true
          description: |

            Personality profiles enabled for this agent
            Example: `[1, 2, 3]`
        webhook_url:
          type: string
          format: uri
          description: >-
            Webhook URL for this agent. When set, overrides the project-level
            webhook URL for events from this agent.
        webhook_secret:
          type: string
          writeOnly: true
          description: >-
            Secret sent in X-CEKURA-SECRET header. Applies when agent
            webhook_url is set. Write-only — never returned in API responses.
            Use `webhook_secret_configured` to check whether one is set.
        webhook_secret_configured:
          type: string
          readOnly: true
        mock_tools:
          type: array
          items:
            $ref: '#/components/schemas/AgentMockToolWrite'
          writeOnly: true
          description: >-
            Full desired set of mock tools. Items with `id` (or a matching
            `name`) update existing tools; items without create new ones.
            Omitted existing tools are deleted.
        mock_tools_enabled:
          type: boolean
          readOnly: true
          description: >-
            Whether mock-tool mode is currently active on the provider. Default
            false.
        mock_tools_provider:
          type:
            - string
            - 'null'
          readOnly: true
          description: >-
            Provider the mock tools were fetched from (vapi, retell, elevenlabs,
            custom). Null until auto-fetch has been run.
        dynamic_variables:
          type: array
          items:
            $ref: '#/components/schemas/AgentDynamicVariableWrite'
          writeOnly: true
          description: >-
            Full desired set of dynamic variable definitions, matched by name.
            Omitted existing variables are deleted.
        created_at:
          type: string
          format: date-time
          readOnly: true
          description: |

            Timestamp when the agent was created
            Example: `"2021-01-01T00:00:00Z"`
        updated_at:
          type: string
          format: date-time
          readOnly: true
          description: |

            Timestamp when the agent was last updated
            Example: `"2021-01-01T00:00:00Z"`
      required:
        - description
    AIAgentV2:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
          description: |-
            Agent ID.
            Example: `2142`
        name:
          type: string
          description: >-
            Agent name. Optional when configure_from_provider is set — it's
            fetched from the provider.
          maxLength: 255
        description:
          type: string
          description: >

            A detailed description of what this agent does and how it should
            interact

            Example: 

            ```text

            AI agent for handling customer support inquiries and resolving
            technical issues

            ```
        project:
          type: integer
          description: The project this agent belongs to
        language:
          enum:
            - af
            - ar
            - bn
            - bg
            - zh
            - cs
            - da
            - nl
            - en
            - et
            - fi
            - fr
            - de
            - el
            - gu
            - hi
            - he
            - hu
            - id
            - it
            - ja
            - kn
            - ko
            - ms
            - ml
            - mr
            - multi
            - 'no'
            - pl
            - pa
            - pt
            - ro
            - ru
            - sk
            - es
            - sv
            - th
            - tr
            - tl
            - ta
            - te
            - uk
            - vi
          type: string
          x-spec-enum-id: b822ad429c7b7fec
          default: en
          description: >-

            The primary language this agent uses for communication (e.g. 'en'
            for English)



            * `af` - Afrikaans

            * `ar` - Arabic

            * `bn` - Bengali

            * `bg` - Bulgarian

            * `zh` - Chinese Simplified

            * `cs` - Czech

            * `da` - Danish

            * `nl` - Dutch

            * `en` - English

            * `et` - Estonian

            * `fi` - Finnish

            * `fr` - French

            * `de` - German

            * `el` - Greek

            * `gu` - Gujarati

            * `hi` - Hindi

            * `he` - Hebrew

            * `hu` - Hungarian

            * `id` - Indonesian

            * `it` - Italian

            * `ja` - Japanese

            * `kn` - Kannada

            * `ko` - Korean

            * `ms` - Malay

            * `ml` - Malayalam

            * `mr` - Marathi

            * `multi` - Multilingual

            * `no` - Norwegian

            * `pl` - Polish

            * `pa` - Punjabi

            * `pt` - Portuguese

            * `ro` - Romanian

            * `ru` - Russian

            * `sk` - Slovak

            * `es` - Spanish

            * `sv` - Swedish

            * `th` - Thai

            * `tr` - Turkish

            * `tl` - Tagalog

            * `ta` - Tamil

            * `te` - Telugu

            * `uk` - Ukrainian

            * `vi` - Vietnamese
        telephony:
          allOf:
            - $ref: '#/components/schemas/AgentTelephony'
          readOnly: true
          description: Phone and SIP/websocket channel configuration.
        provider:
          allOf:
            - $ref: '#/components/schemas/AgentProvider'
          readOnly: true
          description: >-
            AI platform integration (provider type, agent id, credential status,
            chat config).
        agent_speaks_first:
          type:
            - boolean
            - 'null'
          description: >-
            True = agent speaks first; False = test user speaks first; null =
            auto-detect.
        predefined_metrics:
          writeOnly: true
          description: predefined metrics to use for the agent
        knowledge_base_files:
          type: array
          items:
            $ref: '#/components/schemas/KnowledgeBaseFile'
          readOnly: true
          description: Knowledge base files attached to the agent.
        enabled_personalities:
          type: array
          items:
            type: integer
          readOnly: true
          description: |

            Personality profiles enabled for this agent
            Example: `[1, 2, 3]`
        webhook_url:
          type: string
          format: uri
          description: >-
            Webhook URL for this agent. When set, overrides the project-level
            webhook URL for events from this agent.
        webhook_secret:
          type: string
          writeOnly: true
          description: >-
            Secret sent in X-CEKURA-SECRET header. Applies when agent
            webhook_url is set. Write-only — never returned in API responses.
            Use `webhook_secret_configured` to check whether one is set.
        webhook_secret_configured:
          type: string
          readOnly: true
        mock_tools:
          type: array
          items:
            $ref: '#/components/schemas/AgentMockToolRead'
          readOnly: true
          description: >-
            Mock tools registered on the agent, each with its mock data and
            runtime access (served_via).
        mock_tools_enabled:
          type: boolean
          readOnly: true
          description: >-
            Whether mock-tool mode is currently active on the provider. Default
            false.
        mock_tools_provider:
          type:
            - string
            - 'null'
          readOnly: true
          description: >-
            Provider the mock tools were fetched from (vapi, retell, elevenlabs,
            custom). Null until auto-fetch has been run.
        dynamic_variables:
          type: array
          items:
            $ref: '#/components/schemas/AgentDynamicVariableRead'
          readOnly: true
          description: Dynamic variable definitions for the agent, ordered by name.
        created_at:
          type: string
          format: date-time
          readOnly: true
          description: |

            Timestamp when the agent was created
            Example: `"2021-01-01T00:00:00Z"`
        updated_at:
          type: string
          format: date-time
          readOnly: true
          description: |

            Timestamp when the agent was last updated
            Example: `"2021-01-01T00:00:00Z"`
      required:
        - description
    AIAgentConfigureFromProviderResponse:
      type: object
      properties:
        id:
          type: integer
        progress_id:
          type: string
          description: Poll auto-fetch-progress/ with this to follow the staged import.
      required:
        - id
        - progress_id
    AgentTelephony:
      type: object
      description: Phone / SIP / websocket voice channel configuration for the agent.
      properties:
        phone_number:
          type: string
          description: E.164 phone number for inbound calls, e.g. +14155551234.
        inbound:
          type: boolean
          default: false
          description: True = agent receives inbound calls; False = outbound only.
        sip_uri:
          type:
            - string
            - 'null'
          description: SIP URI, e.g. sip:user@domain.com.
        sip_auth:
          oneOf:
            - {}
            - type: 'null'
          description: 'SIP credentials: {username, password}.'
        websocket_url:
          type:
            - string
            - 'null'
          description: >-
            Raw-PCM (16kHz 16-bit mono) websocket endpoint Cekura dials to run
            the whole call over a websocket you host, e.g.
            wss://your-host/voice.
        websocket_auth:
          oneOf:
            - {}
            - type: 'null'
          description: >-
            HTTP Basic Auth credentials for the websocket upgrade: {username,
            password}.
        outbound_numbers:
          type: array
          items:
            type: string
          description: >-
            Phone numbers authorized for outbound calls (E.164 format). Example:
            `["+14155551234", "+14155550000"]`
    SchemaAgentProviderCreate:
      type: object
      properties:
        type:
          enum:
            - vapi
            - retell
            - elevenlabs
            - self_hosted
            - cisco
            - bland
            - livekit
            - pipecat
            - synthflow
            - agora
            - koreai
            - genesys
            - amazon_connect
            - telnyx
            - custom
            - ''
          type: string
          x-spec-enum-id: 4bbea9038bd498ab
          description: >-
            Voice/inbound platform provider type. Valid values: vapi, retell,
            elevenlabs, bland, livekit, cisco, synthflow, koreai, genesys,
            amazon_connect, self_hosted, pipecat, custom. Use 'custom' (or omit)
            for chat-only agents with no voice provider — the chat channel goes
            in chat_agent_details.type. For a raw-PCM websocket voice agent you
            host yourself, use type='custom' and put the endpoint in
            telephony.websocket_url. Text-only channels (sms, whatsapp,
            agentforce) belong in chat_agent_details.type, not here.


            * `vapi` - Vapi

            * `retell` - Retell

            * `elevenlabs` - Elevenlabs

            * `self_hosted` - Self Hosted

            * `cisco` - Cisco

            * `bland` - Bland

            * `livekit` - Livekit

            * `pipecat` - Pipecat

            * `synthflow` - Synthflow

            * `agora` - Agora

            * `koreai` - Koreai

            * `genesys` - Genesys

            * `amazon_connect` - Amazon Connect

            * `telnyx` - Telnyx

            * `custom` - Custom (chat-only, no voice provider)
        agent_id:
          type:
            - string
            - 'null'
          description: >-
            Agent ID for voice/inbound runs on the provider's platform. For
            vapi, elevenlabs, retell, self_hosted, synthflow, and bland this is
            the voice agent ID (for bland it's the persona_id). Bland's
            pathway_id and retell's chat agent ID go in
            chat_agent_details.config.agent_id.
        credentials:
          oneOf:
            - $ref: '#/components/schemas/AgentCredentials'
            - type: 'null'
        chat_agent_details:
          oneOf:
            - $ref: '#/components/schemas/ChatAgentDetails'
            - type: 'null'
          description: >-
            Optional chat/text-mode configuration. Defines which provider
            handles text-mode test runs. The allowed chat type depends on the
            voice provider.type.
        auto_dial_outbound:
          type:
            - boolean
            - 'null'
          description: >-
            Auto-dial the outbound number when running outbound scenarios.
            Supported for: vapi, retell, elevenlabs, bland, livekit.
        auto_import_calls:
          type:
            - boolean
            - 'null'
          description: >-
            Auto-import calls from the provider every 30s. Supported for: vapi,
            retell, elevenlabs.
        auto_sync_prompt:
          type:
            - boolean
            - 'null'
          description: >-
            Auto-sync the agent from the provider on a schedule. Supported for:
            vapi, retell, elevenlabs, synthflow.
        send_post_conversation_metadata:
          type:
            - boolean
            - 'null'
          description: >-
            Enable Cekura to accept call transcripts pushed by your agent via
            POST /custom-provider-webhook/. Only for self-hosted (custom)
            providers.
        configure_from_provider:
          type: boolean
          default: false
          description: >-
            When true on create for a cloud provider
            (vapi/retell/elevenlabs/synthflow), Cekura fetches the assistant's
            prompt, settings, phone, tools, dynamic variables and knowledge base
            and configures the agent automatically. Requires agent_id +
            credentials.api_key. The create response includes a progress_id to
            poll import-progress/.
    AgentKnowledgeBaseFileWrite:
      type: object
      description: >-
        One knowledge base file entry in the v2 agent write payload (request
        side of `knowledge_base_files`).
      properties:
        id:
          type: integer
          description: >-
            ID of an existing file to keep. Files omitted from the list are
            deleted.
        file_name:
          type: string
          description: >-
            Name for a new file, including extension (pdf, txt, json, csv, xml,
            md).
        name:
          type: string
          description: Alias for file_name.
        content_base64:
          type: string
          description: >-
            Base64-encoded content for a new file. A data-URI prefix is
            accepted.
    AgentMockToolWrite:
      type: object
      description: >-
        One mock tool entry in the v2 agent write payload (request side of
        `mock_tools`).
      properties:
        id:
          type: integer
          description: >-
            ID of an existing mock tool to update. Omit to create a new tool (or
            update by matching name).
        name:
          type: string
          description: >-
            Tool name. Required for new tools. Alphanumerics, underscores and
            hyphens only; under 64 characters.
          maxLength: 255
        description:
          type: string
          description: What the tool does.
        mock_data:
          description: >-
            List of {input, output} mappings returned when the tool is called in
            mock mode.
        freetext_params:
          type: array
          items:
            type: string
          description: >-
            Parameter names skipped during mock matching because they are
            free-text (e.g. ["notes", "reason"]).
        served_via:
          allOf:
            - $ref: '#/components/schemas/AgentMockToolServedViaWrite'
          description: >-
            How the agent reaches this tool at runtime. Omit for a direct
            per-tool URL; set type='mcp' with a mock_index to group tools under
            a shared MCP endpoint.
    AgentDynamicVariableWrite:
      type: object
      description: >-
        One dynamic variable entry in the v2 agent write payload (request side
        of `dynamic_variables`).
      properties:
        id:
          type: integer
          description: Ignored on write — variables are matched by name.
        name:
          type: string
          description: Variable name exactly as it appears in the agent context.
          maxLength: 255
        description:
          type: string
          description: What the variable represents and its expected format.
      required:
        - description
        - name
    AgentProvider:
      type: object
      properties:
        type:
          enum:
            - vapi
            - retell
            - elevenlabs
            - self_hosted
            - cisco
            - bland
            - livekit
            - pipecat
            - synthflow
            - agora
            - koreai
            - genesys
            - amazon_connect
            - telnyx
            - custom
            - ''
          type: string
          x-spec-enum-id: 4bbea9038bd498ab
          description: >-
            Voice/inbound platform provider type. Valid values: vapi, retell,
            elevenlabs, bland, livekit, cisco, synthflow, koreai, genesys,
            amazon_connect, self_hosted, pipecat, custom. Use 'custom' (or omit)
            for chat-only agents with no voice provider — the chat channel goes
            in chat_agent_details.type. For a raw-PCM websocket voice agent you
            host yourself, use type='custom' and put the endpoint in
            telephony.websocket_url. Text-only channels (sms, whatsapp,
            agentforce) belong in chat_agent_details.type, not here.


            * `vapi` - Vapi

            * `retell` - Retell

            * `elevenlabs` - Elevenlabs

            * `self_hosted` - Self Hosted

            * `cisco` - Cisco

            * `bland` - Bland

            * `livekit` - Livekit

            * `pipecat` - Pipecat

            * `synthflow` - Synthflow

            * `agora` - Agora

            * `koreai` - Koreai

            * `genesys` - Genesys

            * `amazon_connect` - Amazon Connect

            * `telnyx` - Telnyx

            * `custom` - Custom (chat-only, no voice provider)
        agent_id:
          type:
            - string
            - 'null'
          description: >-
            Agent ID for voice/inbound runs on the provider's platform. For
            vapi, elevenlabs, retell, self_hosted, synthflow, and bland this is
            the voice agent ID (for bland it's the persona_id). Bland's
            pathway_id and retell's chat agent ID go in
            chat_agent_details.config.agent_id.
        credentials:
          oneOf:
            - $ref: '#/components/schemas/AgentCredentials'
            - type: 'null'
        chat_agent_details:
          oneOf:
            - $ref: '#/components/schemas/ChatAgentDetails'
            - type: 'null'
          description: >-
            Optional chat/text-mode configuration. Defines which provider
            handles text-mode test runs. The allowed chat type depends on the
            voice provider.type.
        auto_dial_outbound:
          type:
            - boolean
            - 'null'
          description: >-
            Auto-dial the outbound number when running outbound scenarios.
            Supported for: vapi, retell, elevenlabs, bland, livekit.
        auto_import_calls:
          type:
            - boolean
            - 'null'
          description: >-
            Auto-import calls from the provider every 30s. Supported for: vapi,
            retell, elevenlabs.
        auto_sync_prompt:
          type:
            - boolean
            - 'null'
          description: >-
            Auto-sync the agent from the provider on a schedule. Supported for:
            vapi, retell, elevenlabs, synthflow.
        send_post_conversation_metadata:
          type:
            - boolean
            - 'null'
          description: >-
            Enable Cekura to accept call transcripts pushed by your agent via
            POST /custom-provider-webhook/. Only for self-hosted (custom)
            providers.
    KnowledgeBaseFile:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        agent:
          type: integer
        file:
          type: string
          format: uri
          writeOnly: true
          description: Knowledge base file
          pattern: (?:pdf|txt|json|csv|xml|md)$
        file_url:
          type: string
          readOnly: true
          description: URL of the Knowledge file
        file_name:
          type: string
          readOnly: true
          description: Name of the Knowledge file
        file_type:
          type: string
          readOnly: true
          description: MIME type of the Knowledge file
        file_size:
          type: integer
          readOnly: true
          description: |-
            Size in bytes.
            Example: `1048576`
        created_at:
          type: string
          format: date-time
          readOnly: true
          description: |-
            When this record was created.
            Example: `2024-03-15T10:30:45Z`
        updated_at:
          type: string
          format: date-time
          readOnly: true
          description: |-
            When this record was last updated.
            Example: `2024-03-15T10:35:11Z`
      required:
        - agent
        - file
    AgentMockToolRead:
      type: object
      description: One mock tool in the v2 agent response (`mock_tools[]`).
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        mock_data:
          description: >-
            List of {input, output} mappings returned when the tool is called in
            mock mode.
        served_via:
          $ref: '#/components/schemas/AgentMockToolServedVia'
      required:
        - description
        - id
        - mock_data
        - name
        - served_via
    AgentDynamicVariableRead:
      type: object
      description: One dynamic variable in the v2 agent response (`dynamic_variables[]`).
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
      required:
        - description
        - id
        - name
    AgentCredentials:
      type: object
      description: Nested credentials block inside the provider object.
      properties:
        api_key:
          type: string
          writeOnly: true
          description: >-
            API key or client secret for the provider (write-only — never
            returned). Required for: vapi, retell, elevenlabs, bland, livekit,
            pipecat, synthflow. koreai uses client_secret (passed as api_key).
            Not needed for: cisco, self_hosted.
        config:
          oneOf:
            - $ref: '#/components/schemas/ProviderCredentialsConfig'
            - type: 'null'
    ChatAgentDetails:
      type: object
      description: Chat-mode provider configuration nested inside the provider block.
      properties:
        type:
          enum:
            - retell
            - bland
            - vapi
            - elevenlabs
            - livekit
            - agora
            - sms
            - whatsapp
            - self_hosted
            - agentforce
            - amazon_connect
            - koreai
            - ''
          type: string
          x-spec-enum-id: 0a46c52849d3f58d
          description: >-
            Chat provider type. Must be compatible with the voice provider.type.
            Valid values: retell, bland, vapi, elevenlabs, livekit, agora, sms,
            whatsapp, self_hosted, agentforce, amazon_connect, koreai. Pass an
            empty string "" (or send chat_agent_details: null) to clear the chat
            overlay.


            * `retell` - retell

            * `bland` - bland

            * `vapi` - vapi

            * `elevenlabs` - elevenlabs

            * `livekit` - livekit

            * `agora` - agora

            * `sms` - sms

            * `whatsapp` - whatsapp

            * `self_hosted` - self_hosted

            * `agentforce` - agentforce

            * `amazon_connect` - amazon_connect

            * `koreai` - koreai
        config:
          oneOf:
            - $ref: '#/components/schemas/ChatAgentConfig'
            - type: 'null'
    AgentMockToolServedViaWrite:
      type: object
      description: >-
        Runtime routing for a mock tool on write (request side of
        `mock_tools[].served_via`).
      properties:
        type:
          enum:
            - direct
            - mcp
          type: string
          x-spec-enum-id: b34eaed2d733c895
          default: direct
          description: >-
            'direct' = per-tool webhook URL (default). 'mcp' = served through an
            MCP endpoint; requires mock_index.


            * `direct` - direct

            * `mcp` - mcp
        mock_index:
          type: integer
          minimum: 1
          description: >-
            MCP endpoint index (1-based). Tools sharing an index are served by
            the same MCP endpoint. Required when type='mcp'.
    AgentMockToolServedVia:
      type: object
      description: >-
        How a mock tool is reached at runtime (response side of
        `mock_tools[].served_via`).
      properties:
        type:
          enum:
            - direct
            - mcp
          type: string
          x-spec-enum-id: b34eaed2d733c895
          description: >-
            'direct' = per-tool webhook URL; 'mcp' = served through the agent's
            MCP endpoint.


            * `direct` - direct

            * `mcp` - mcp
        url:
          type: string
          description: Runtime URL the agent calls to reach this tool.
        mock_index:
          type: integer
          description: MCP endpoint index. Present only when type='mcp'.
      required:
        - type
        - url
    ProviderCredentialsConfig:
      oneOf:
        - $ref: '#/components/schemas/VapiConfig'
        - $ref: '#/components/schemas/RetellConfig'
        - $ref: '#/components/schemas/ElevenLabsConfig'
        - $ref: '#/components/schemas/BlandConfig'
        - $ref: '#/components/schemas/LiveKitConfig'
        - $ref: '#/components/schemas/SynthflowConfig'
        - $ref: '#/components/schemas/KoreAiConfig'
        - $ref: '#/components/schemas/GenesysConfig'
        - $ref: '#/components/schemas/PipecatConfig'
        - $ref: '#/components/schemas/SelfHostedConfig'
        - $ref: '#/components/schemas/AmazonConnectConfig'
    ChatAgentConfig:
      oneOf:
        - $ref: '#/components/schemas/RetellChatConfig'
        - $ref: '#/components/schemas/BlandChatConfig'
        - $ref: '#/components/schemas/AgentforceChatConfig'
        - $ref: '#/components/schemas/SelfHostedChatConfig'
        - $ref: '#/components/schemas/AmazonConnectChatConfig'
    VapiConfig:
      type: object
      description: VAPI provider configuration.
      properties:
        public_key:
          type: string
          description: >-
            VAPI Public Key for WebRTC sessions only. Not required for telephony
            or chat testing.
        trigger_url:
          type: string
          description: URL Cekura calls to create outbound VAPI phone calls.
      title: VAPI
    RetellConfig:
      type: object
      description: Retell provider configuration.
      properties:
        trigger_url:
          type: string
          description: URL Cekura calls to create outbound Retell phone calls.
        livekit_server_url:
          type: string
          description: >-
            Override the default Retell LiveKit server URL, e.g.
            wss://retell-ai-4ihahnq7.livekit.cloud. Only change if you need a
            specific Retell region.
      title: Retell
    ElevenLabsConfig:
      type: object
      description: ElevenLabs provider configuration.
      properties:
        trigger_url:
          type: string
          description: URL Cekura calls to create outbound ElevenLabs phone calls.
        elevenlabs_region:
          enum:
            - us
            - eu
          type: string
          x-spec-enum-id: 450cf1402ab1a3c6
          description: >-
            ElevenLabs API region. 'us' uses api.elevenlabs.io, 'eu' uses
            api.eu.residency.elevenlabs.io. Defaults to 'us'.


            * `us` - us

            * `eu` - eu
        elevenlabs_base_url_override:
          type: string
          description: >-
            Optional custom base URL for ElevenLabs API. Takes precedence over
            elevenlabs_region if set.
      title: ElevenLabs
    BlandConfig:
      type: object
      description: Bland AI provider configuration.
      properties:
        encrypted_key:
          type: string
          description: >-
            Twilio credential bundle for Bland outbound calls. Required when
            using Bland with Twilio telephony.
      title: Bland
    LiveKitConfig:
      type: object
      description: LiveKit provider configuration.
      properties:
        api_secret:
          type: string
          description: LiveKit API secret. Required alongside api_key.
        url:
          type: string
          description: LiveKit server WebSocket URL, e.g. wss://acme.livekit.cloud.
        agent_name:
          type: string
          description: LiveKit agent name to connect to.
        config:
          description: Additional LiveKit configuration as a JSON object.
        tracing_enabled:
          type: boolean
          description: >-
            Enable LiveKit tracing (requires Cekura SDK integrated in your
            LiveKit agent).
        trigger_url:
          type: string
          description: URL Cekura calls to create outbound phone calls.
      required:
        - api_secret
        - url
      title: LiveKit
    SynthflowConfig:
      type: object
      description: Synthflow provider configuration.
      properties:
        synthflow_base_url_override:
          type: string
          description: >-
            Optional custom base URL for Synthflow API, e.g. for EU residency.
            Leave empty to use the default endpoint.
      title: Synthflow
    KoreAiConfig:
      type: object
      description: Kore.ai provider configuration.
      properties:
        client_id:
          type: string
          description: KoreAI OAuth2 Client ID.
        bot_id:
          type: string
          description: KoreAI Bot ID to connect to.
        host:
          type: string
          description: KoreAI host URL. Defaults to https://bots.kore.ai.
      required:
        - bot_id
        - client_id
      title: Kore.ai
    GenesysConfig:
      type: object
      description: Genesys Cloud provider configuration.
      properties:
        client_id:
          type: string
          description: Genesys Cloud OAuth2 Client ID.
        region:
          type: string
          description: Genesys Cloud region, e.g. us-east-1.
      required:
        - client_id
        - region
      title: Genesys
    PipecatConfig:
      type: object
      description: Pipecat provider configuration.
      properties:
        pipecat_agent_name:
          type: string
          description: Name of the Pipecat agent. Required when tracing_enabled is false.
        config:
          description: Additional agent configuration as a JSON object.
        room_properties:
          description: Room properties configuration as a JSON object.
        webhook_url:
          type: string
          description: Webhook URL for Pipecat call events.
        tracing_enabled:
          type: boolean
          description: >-
            Enable Pipecat tracing (requires Cekura SDK integrated in your
            Pipecat agent). When true, pipecat_agent_name is not required.
      title: Pipecat
    SelfHostedConfig:
      type: object
      description: Self-hosted provider configuration.
      properties:
        send_post_conversation_metadata:
          type: boolean
          description: >-
            Enable Cekura to accept call transcripts pushed by your agent via
            POST /custom-provider-webhook/. Set to true when your agent sends
            its own transcripts to Cekura after each call.
      title: Self-hosted
    AmazonConnectConfig:
      type: object
      description: Amazon Connect provider configuration.
      properties:
        widget_id:
          type: string
          description: Chat widget UUID from the Amazon Connect console.
        snippet_id:
          type: string
          description: Base64-encoded KMS snippet from your Amazon Connect chat widget.
        connect_host:
          type: string
          description: Amazon Connect instance host, e.g. acme.my.connect.aws.
        region:
          type: string
          description: AWS region for the Connect instance. Defaults to us-east-1.
    RetellChatConfig:
      type: object
      description: Retell chat configuration.
      properties:
        agent_id:
          type: string
          description: The Retell agent ID to use for text-mode test runs.
      required:
        - agent_id
      title: Retell
    BlandChatConfig:
      type: object
      description: Bland chat configuration.
      properties:
        agent_id:
          type: string
          description: The Bland pathway_id to use for text-mode test runs.
      required:
        - agent_id
      title: Bland
    AgentforceChatConfig:
      type: object
      description: Agentforce (Salesforce) chat configuration.
      properties:
        client_secret:
          type: string
          description: OAuth2 client secret for Salesforce authentication.
        client_id:
          type: string
          description: OAuth2 client ID for Salesforce authentication.
        domain:
          type: string
          description: Salesforce domain, e.g. https://example.sandbox.my.salesforce.com.
        agent_id:
          type: string
          description: Agentforce agent ID (0Xx...).
      required:
        - agent_id
        - client_id
        - client_secret
        - domain
      title: Agentforce
    SelfHostedChatConfig:
      type: object
      description: Self-hosted websocket chat configuration.
      properties:
        url:
          type: string
          description: WebSocket endpoint URL (wss://) to connect for text-mode test runs.
        headers:
          type: object
          additionalProperties: {}
          description: >-
            Optional headers to send on the WebSocket upgrade request, e.g.
            {"Authorization": "Bearer token"}.
        websocket_secret:
          type: string
          writeOnly: true
          description: >-
            Secret sent as the X-VOCERA-SECRET header on the WebSocket upgrade
            (write-only — masked in responses).
      required:
        - url
      title: Self-hosted (WebSocket)
    AmazonConnectChatConfig:
      type: object
      description: Amazon Connect chat-widget configuration.
      properties:
        widget_id:
          type: string
          description: Chat-widget UUID from the Amazon Connect console.
        snippet_id:
          type: string
          description: Base64-encoded KMS snippet from your Amazon Connect chat widget.
        connect_host:
          type: string
          description: Amazon Connect instance host, e.g. acme.my.connect.aws.
        region:
          type: string
          description: AWS region for the Connect instance. Defaults to us-east-1.
      required:
        - connect_host
        - snippet_id
        - widget_id
  securitySchemes:
    api_key:
      type: apiKey
      name: X-CEKURA-API-KEY
      in: header
      description: >-
        API Key Authentication. It should be included in the header of each
        request.

````