Speko Telephony API

The Telephony API from Speko — 22 operation(s) for telephony.

OpenAPI Specification

speko-telephony-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Speko Agents Telephony API
  version: 1.0.0
  description: Public REST API for the Speko voice gateway. Routes, transcribes, synthesizes, and completes via the highest-scoring provider for your routing intent, with transparent server-side failover.
  contact:
    email: abat@speko.ai
servers:
- url: https://api.speko.dev
  description: Production
security:
- bearerAuth: []
tags:
- name: Telephony
paths:
  /v1/sessions/phone:
    post:
      summary: Place an outbound phone call
      description: Creates a voice session, dispatches the configured agent worker, and dials the destination over LiveKit SIP. Supply either `agentId` or `intent`.
      operationId: createPhoneSession
      tags:
      - Telephony
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoiceDialRequest'
      responses:
        '200':
          description: Call dialing
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoiceDialResponse'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/AgentNotFound'
  /v1/agents/{id}/calls:
    get:
      summary: List calls for an agent
      description: Returns recent calls whose session pipeline config references this agent. Results are newest first and support cursor pagination.
      operationId: listAgentCalls
      tags:
      - Telephony
      parameters:
      - in: path
        name: id
        required: true
        schema:
          type: string
        description: Agent id.
      - in: query
        name: limit
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
      - in: query
        name: cursor
        required: false
        schema:
          type: string
          format: date-time
        description: Use `next_cursor` from the previous page.
      - in: query
        name: since
        required: false
        schema:
          type: string
          format: date-time
        description: Only include calls created at or after this timestamp.
      responses:
        '200':
          description: Page of calls
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentCallListPage'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/AgentNotFound'
  /v1/phone-numbers:
    get:
      summary: List phone numbers
      description: Returns managed and customer SIP-trunk phone numbers registered to the authenticated organization.
      operationId: listPhoneNumbers
      tags:
      - Telephony
      responses:
        '200':
          description: Organization phone numbers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PhoneNumber'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      summary: Buy a managed phone number
      description: Orders a platform-managed phone number and registers it for inbound and/or outbound calling. Business verification and sufficient credits are required.
      operationId: createPhoneNumber
      tags:
      - Telephony
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhoneNumberCreateRequest'
      responses:
        '200':
          description: Phone number
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumber'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/phone-numbers/available:
    get:
      summary: Search available managed numbers
      description: Searches the platform-managed phone-number pool. Business verification and the buy-phone-numbers feature flag are required.
      operationId: searchAvailablePhoneNumbers
      tags:
      - Telephony
      parameters:
      - in: query
        name: areaCode
        required: false
        schema:
          type: string
          pattern: ^\d{3}$
      - in: query
        name: locality
        required: false
        schema:
          type: string
      - in: query
        name: limit
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 50
          default: 10
      responses:
        '200':
          description: Available numbers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AvailablePhoneNumber'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/phone-numbers/import:
    post:
      summary: Import a SIP trunk phone number
      description: Registers a customer-owned phone number from an installed SIP connection or a legacy outbound trunk id.
      operationId: importSipTrunkPhoneNumber
      tags:
      - Telephony
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhoneNumberImportRequest'
      responses:
        '200':
          description: Phone number
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumber'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/phone-numbers/kyb:
    get:
      summary: Get phone-number business verification
      description: Returns the latest business verification submission and optional 10DLC-derived prefill.
      operationId: getPhoneNumberKyb
      tags:
      - Telephony
      responses:
        '200':
          description: Business verification state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumberKybOverview'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/phone-numbers/kyb/draft:
    put:
      summary: Save phone-number business verification draft
      operationId: savePhoneNumberKybDraft
      tags:
      - Telephony
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhoneNumberKybDraftRequest'
      responses:
        '200':
          description: Saved draft
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumberKybSubmission'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/phone-numbers/kyb/submit:
    post:
      summary: Submit phone-number business verification
      operationId: submitPhoneNumberKyb
      tags:
      - Telephony
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhoneNumberKybSubmitRequest'
      responses:
        '200':
          description: Submitted verification
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumberKybSubmission'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/phone-numbers/{id}:
    get:
      summary: Get a phone number
      operationId: getPhoneNumber
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Phone number
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumber'
        '401':
          $ref: '#/components/responses/Unauthorized'
    patch:
      summary: Update a phone number
      operationId: updatePhoneNumber
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhoneNumberUpdateRequest'
      responses:
        '200':
          description: Phone number
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumber'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
    delete:
      summary: Release a phone number
      operationId: deletePhoneNumber
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Release result
          content:
            application/json:
              schema:
                type: object
                required:
                - released
                properties:
                  released:
                    type: boolean
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}:
    get:
      summary: Get call detail
      description: Returns the call session, transcript, report if available, transfer attempts, and recording metadata.
      operationId: getCall
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Call detail
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallDetail'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/events:
    get:
      summary: List call events
      operationId: listCallEvents
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Call events
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallEventsResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/report:
    get:
      summary: Get call report
      operationId: getCallReport
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Call report
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallReport'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/report/finalize:
    post:
      summary: Finalize call report
      description: Runs or re-runs analysis for a call and optionally retries post-call webhook delivery.
      operationId: finalizeCallReport
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FinalizeCallReportRequest'
      responses:
        '200':
          description: Finalization result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FinalizeCallReportResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/recording:
    get:
      summary: Get call recording URL
      operationId: getCallRecording
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Signed recording URL
          content:
            application/json:
              schema:
                type: object
                required:
                - url
                properties:
                  url:
                    type: string
                    format: uri
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/transfers/blind:
    post:
      summary: Start blind transfer
      operationId: blindTransferCall
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BlindTransferRequest'
      responses:
        '201':
          description: Transfer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallTransfer'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/transfers/warm:
    post:
      summary: Start warm transfer
      operationId: warmTransferCall
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WarmTransferRequest'
      responses:
        '201':
          description: Transfer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallTransferResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/transfers/{transferId}/complete:
    post:
      summary: Complete warm transfer
      operationId: completeWarmTransfer
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      - in: path
        name: transferId
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompleteWarmTransferRequest'
      responses:
        '200':
          description: Transfer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallTransfer'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/calls/{id}/transfers/{transferId}/cancel:
    post:
      summary: Cancel warm transfer
      operationId: cancelWarmTransfer
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      - in: path
        name: transferId
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelWarmTransferRequest'
      responses:
        '200':
          description: Transfer response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallTransferResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/callbacks:
    get:
      summary: List scheduled callbacks
      operationId: listScheduledCallbacks
      tags:
      - Telephony
      parameters:
      - in: query
        name: status
        required: false
        schema:
          $ref: '#/components/schemas/ScheduledCallbackStatus'
      - in: query
        name: source_session_id
        required: false
        schema:
          type: string
      - in: query
        name: limit
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 25
      responses:
        '200':
          description: Scheduled callbacks
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledCallbacksResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/callbacks/{id}:
    get:
      summary: Get scheduled callback
      operationId: getScheduledCallback
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Scheduled callback
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledCallback'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/callbacks/{id}/cancel:
    post:
      summary: Cancel scheduled callback
      operationId: cancelScheduledCallback
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string
                  maxLength: 500
      responses:
        '200':
          description: Scheduled callback
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledCallback'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/callbacks/{id}/dispatch:
    post:
      summary: Dispatch scheduled callback now
      operationId: dispatchScheduledCallback
      tags:
      - Telephony
      parameters:
      - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Scheduled callback
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledCallback'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    CallEvent:
      type: object
      required:
      - id
      - organization_id
      - provider
      - event_type
      - occurred_at
      - payload
      - created_at
      properties:
        id:
          type: string
        session_id:
          type: string
          nullable: true
        organization_id:
          type: string
        provider:
          type: string
        event_type:
          type: string
        status:
          type: string
          nullable: true
        failure_cause:
          type: string
          nullable: true
        sip_status_code:
          type: integer
          nullable: true
        sip_status:
          type: string
          nullable: true
        occurred_at:
          type: string
          format: date-time
        payload:
          $ref: '#/components/schemas/JsonObject'
        created_at:
          type: string
          format: date-time
    CallTransferResponse:
      allOf:
      - $ref: '#/components/schemas/CallTransfer'
      - type: object
        properties:
          routing_attempts:
            type: array
            items:
              $ref: '#/components/schemas/CallTransfer'
          next_transfer:
            $ref: '#/components/schemas/CallTransfer'
          fallback:
            $ref: '#/components/schemas/JsonObject'
    CallEventsResponse:
      type: object
      required:
      - events
      properties:
        events:
          type: array
          items:
            $ref: '#/components/schemas/CallEvent'
    PhoneNumberKybSubmission:
      type: object
      required:
      - id
      - organizationId
      - status
      - attestationAccepted
      - createdAt
      - updatedAt
      properties:
        id:
          type: string
        organizationId:
          type: string
        status:
          type: string
          enum:
          - draft
          - submitted
          - approved
          - rejected
          - revoked
        businessProfile:
          $ref: '#/components/schemas/PhoneNumberKybBusinessProfile'
        authorizedRepresentative:
          $ref: '#/components/schemas/PhoneNumberKybAuthorizedRepresentative'
        attestationAccepted:
          type: boolean
        attestedAt:
          type: string
          format: date-time
          nullable: true
        submittedAt:
          type: string
          format: date-time
          nullable: true
        rejectionReason:
          type: string
          nullable: true
        slackNotificationStatus:
          type: string
          enum:
          - not_queued
          - queued
          - enqueue_failed
        slackNotificationJobId:
          type: string
          nullable: true
        slackNotificationError:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Error:
      type: object
      required:
      - error
      - code
      properties:
        error:
          type: string
          description: Human-readable message.
        code:
          type: string
          description: Machine-readable code.
    CallReport:
      type: object
      required:
      - session_id
      - summary
      - outcome
      - transcript
      - cost_micro_usd
      properties:
        session_id:
          type: string
        organization_id:
          type: string
        summary:
          type: string
        outcome:
          type: string
        structured_data:
          $ref: '#/components/schemas/JsonObject'
        transcript:
          type: object
          properties:
            entries:
              type: array
              items:
                $ref: '#/components/schemas/CallTranscriptEntry'
        cost_micro_usd:
          type: string
        cost_breakdown:
          type: array
          items:
            $ref: '#/components/schemas/JsonObject'
        metadata:
          $ref: '#/components/schemas/JsonObject'
        scheduled_callback:
          $ref: '#/components/schemas/JsonObject'
        analysis_status:
          type: string
          enum:
          - heuristic
          - completed
          - failed
        post_call_webhook_status:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    RoutingIntent:
      type: object
      required:
      - language
      properties:
        language:
          type: string
          pattern: ^[a-z]{2}(-[A-Z]{2})?$
          description: BCP-47 language tag, e.g. `en`, `en-US`, `es-MX`.
          examples:
          - en-US
        region:
          type: string
          enum:
          - global
          - us-east4
          - europe-west3
          - asia-southeast1
          default: global
          description: Region whose streaming-latency measurements should be used. `global` falls through to batch-mode rows when no per-region data matches.
        optimizeFor:
          type: string
          enum:
          - balanced
          - accuracy
          - latency
          - cost
          default: balanced
    AgentCallListEntry:
      type: object
      required:
      - id
      - call_id
      - resource_uri
      - agent_id
      - status
      - kind
      - created_at
      properties:
        id:
          type: string
        call_id:
          type: string
        resource_uri:
          type: string
        agent_id:
          type: string
        status:
          type: string
        kind:
          type: string
        room_name:
          type: string
          nullable: true
        language:
          type: string
        created_at:
          type: string
          format: date-time
        ended_at:
          type: string
          format: date-time
          nullable: true
        duration_seconds:
          type: integer
          nullable: true
        recording_status:
          type: string
          nullable: true
    BlindTransferRequest:
      type: object
      required:
      - to
      properties:
        to:
          type: string
        participantIdentity:
          type: string
        playDialtone:
          type: boolean
        ringingTimeout:
          type: integer
          minimum: 1
          maximum: 120
        headers:
          type: object
          additionalProperties:
            type: string
    PhoneNumberKybSubmitRequest:
      allOf:
      - $ref: '#/components/schemas/PhoneNumberKybDraftRequest'
      - type: object
        required:
        - attestationAccepted
        properties:
          attestationAccepted:
            type: boolean
            enum:
            - true
    JsonObject:
      type: object
      additionalProperties: true
    PhoneNumberSetupStatus:
      type: object
      required:
      - status
      - inboundReady
      - outboundReady
      - agentReady
      - forwardingRequired
      - sipConnectionReady
      - issues
      properties:
        status:
          type: string
          enum:
          - ready
          - action_required
          - suspended
        inboundReady:
          type: boolean
        outboundReady:
          type: boolean
        agentReady:
          type: boolean
        forwardingRequired:
          type: boolean
        sipConnectionReady:
          type: boolean
        issues:
          type: array
          items:
            type: string
    PhoneNumberUpdateRequest:
      type: object
      properties:
        direction:
          $ref: '#/components/schemas/PhoneNumberDirection'
        dispatchMetadataTemplate:
          type: object
          additionalProperties: true
          nullable: true
        label:
          type: string
          nullable: true
          maxLength: 120
        agentId:
          type: string
          nullable: true
    CompleteWarmTransferRequest:
      type: object
      properties:
        recipientParticipantIdentity:
          type: string
        summary:
          type: string
    PhoneNumberDirection:
      type: string
      enum:
      - inbound
      - outbound
      - both
    PipelineConstraints:
      type: object
      properties:
        allowedProviders:
          type: object
          description: Restrict candidate pool per modality. Router still ranks by score. Each entry is either `"<vendor>"` (vendor wildcard — allow any model from that vendor) or `"<vendor>:<model>"` (allow only that specific model). Failover stays active across all entries in the layer.
          properties:
            stt:
              type: array
              items:
                type: string
                description: Allowed STT provider entry. Either a vendor id (e.g. `"deepgram"` — any Deepgram model) or `"<vendor>:<model>"` (e.g. `"deepgram:nova-3"` — only Nova-3, no fallback to other Deepgram models within the vendor). Both forms can be mixed in the same array.
                examples:
                - deepgram
                - deepgram:nova-3
                - assemblyai
            llm:
              type: array
              items:
                type: string
                description: Allowed LLM provider entry. Either a vendor id (e.g. `"openai"` — any OpenAI model) or `"<vendor>:<model>"` (e.g. `"openai:gpt-5"` — only that model). Both forms can be mixed in the same array.
                examples:
                - openai
                - openai:gpt-5
                - anthropic
            tts:
              type: array
              items:
                type: string
                description: Allowed TTS provider entry. Either a vendor id (e.g. `"elevenlabs"` — any ElevenLabs model) or `"<vendor>:<model>"` (e.g. `"elevenlabs:eleven_flash_v2_5"` — only that model). Both forms can be mixed in the same array.
                examples:
                - elevenlabs
                - elevenlabs:eleven_flash_v2_5
                - cartesia
            s2s:
              type: array
              items:
                type: string
                description: Allowed S2S provider entry. Either a vendor id (e.g. `"openai"` — any OpenAI realtime model) or `"<vendor>:<model>"` (e.g. `"openai:gpt-realtime"` — only that model). Both forms can be mixed in the same array.
                examples:
                - openai
                - openai:gpt-realtime
    VoiceDialResponse:
      type: object
      required:
      - sessionId
      - callControlId
      - roomName
      - status
      - to
      - from
      properties:
        sessionId:
          type: string
        callControlId:
          type: string
          description: LiveKit SIP participant identity for the outbound leg.
        roomName:
          type: string
        status:
          type: string
          enum:
          - dialing
          - dialing-stub
        to:
          $ref: '#/components/schemas/E164'
        from:
          $ref: '#/components/schemas/E164'
    PhoneNumber:
      type: object
      required:
      - id
      - organizationId
      - e164
      - source
      - direction
      - setupStatus
      - createdAt
      - updatedAt
      properties:
        id:
          type: string
        organizationId:
          type: string
        e164:
          $ref: '#/components/schemas/E164'
        source:
          type: string
          enum:
          - managed
          - sip_trunk
        providerResourceId:
          type: string
          nullable: true
        telnyxPhoneNumberId:
          type: string
          nullable: true
          deprecated: true
        sipTrunkId:
          type: string
          nullable: true
          deprecated: true
        sipConnectionInstallationId:
          type: string
          nullable: true
        sipProviderName:
          type: string
          nullable: true
        direction:
          $ref: '#/components/schemas/PhoneNumberDirection'
        dispatchMetadataTemplate:
          type: object
          additionalProperties: true
          nullable: true
        agentId:
          type: string
          nullable: true
        label:
          type: string
          nullable: true
        sms10dlcProfileId:
          type: string
          nullable: true
        smsCampaignId:
          type: string
          nullable: true
        smsAssignmentStatus:
          type: string
          nullable: true
        smsAssignmentUpdatedAt:
          type: string
          format: date-time
          nullable: true
        setupStatus:
          $ref: '#/components/schemas/PhoneNumberSetupStatus'
        nextChargeAt:
          type: string
          format: date-time
        lastChargedAt:
          type: string
          format: date-time
          nullable: true
        suspendedAt:
          type: string
          format: date-time
          nullable: true
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    PhoneNumberKybBusinessProfile:
      type: object
      required:
      - legalName
      - displayName
      - entityType
      - country
      - website
      - address
      - useCase
      - expectedUsage
      properties:
        legalName:
          type: string
        displayName:
          type: string
        entityType:
          type: string
        country:
          type: string
        registrationId:
          type: string
        website:
          type: string
          format: uri
        address:
          $ref: '#/components/schemas/JsonObject'
        useCase:
          type: string
        expectedUsage:
          type: string
    ScheduledCallbacksResponse:
      type: object
      required:
      - callbacks
      properties:
        callbacks:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledCallback'
    FinalizeCallReportResponse:
      type: object
      required:
      - session_id
      - summary
      - outcome
      - cost_micro_usd
      - webhook
      properties:
        session_id:
          type: string
        summary:
          type: string
        outcome:
          type: string
        cost_micro_usd:
          type: string
        webhook:
          $ref: '#/components/schemas/JsonObject'
    VoiceDialRequest:
      type: object
      required:
      - to
      properties:
        to:
          $ref: '#/components/schemas/E164'
        from:
          $ref: '#/components/schemas/E164'
        agentId:
          type: string
          description: Persisted agent to run. Required unless `intent` is supplied.
        intent:
          $ref: '#/components/schemas/RoutingIntent'
        constraints:
          $ref: '#/components/schemas/PipelineConstraints'
        voice:
          type: string
        systemPrompt:
   

# --- truncated at 32 KB (44 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/speko/refs/heads/main/openapi/speko-telephony-api-openapi.yml