Speko Telephony API

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

Operations 25

POST /v1/sessions/phone Place an outbound phone call #
GET /v1/agents/{id}/calls List calls for an agent #
GET /v1/phone-numbers List phone numbers #
POST /v1/phone-numbers Buy a managed phone number #
GET /v1/phone-numbers/available Search available managed numbers #
POST /v1/phone-numbers/import Import a SIP trunk phone number #
GET /v1/phone-numbers/kyb Get phone-number business verification #
PUT /v1/phone-numbers/kyb/draft Save phone-number business verification draft #
POST /v1/phone-numbers/kyb/submit Submit phone-number business verification #
GET /v1/phone-numbers/{id} Get a phone number #
PATCH /v1/phone-numbers/{id} Update a phone number #
DELETE /v1/phone-numbers/{id} Release a phone number #
GET /v1/calls/{id} Get call detail #
GET /v1/calls/{id}/events List call events #
GET /v1/calls/{id}/report Get call report #
POST /v1/calls/{id}/report/finalize Finalize call report #
GET /v1/calls/{id}/recording Get call recording URL #
POST /v1/calls/{id}/transfers/blind Start blind transfer #
POST /v1/calls/{id}/transfers/warm Start warm transfer #
POST /v1/calls/{id}/transfers/{transferId}/complete Complete warm transfer #
POST /v1/calls/{id}/transfers/{transferId}/cancel Cancel warm transfer #
GET /v1/callbacks List scheduled callbacks #
GET /v1/callbacks/{id} Get scheduled callback #
POST /v1/callbacks/{id}/cancel Cancel scheduled callback #
POST /v1/callbacks/{id}/dispatch Dispatch scheduled callback now #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/speko-telephony-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

speko-telephony-api-openapi.yml Raw ↑
openapi: 3.2.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:
  responses:
    ValidationError:
      description: Request body or query parameters failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            default:
              value:
                error: Invalid request body
                code: VALIDATION_ERROR
    Unauthorized:
      description: Missing or invalid bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            default:
              value:
                error: Unauthorized
                code: UNAUTHORIZED
    AgentNotFound:
      description: No agent with this id exists in the authenticated organization.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            default:
              value:
                error: not found
                code: NOT_FOUND
  schemas:
    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
    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
    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
    PhoneNumberKybAuthorizedRepresentative:
      type: object
      required:
      - name
      - title
      - email
      properties:
        name:
          type: string
        title:
          type: string
        email:
          type: string
          format: email
        phone:
          $ref: '#/components/schemas/E164'
    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'
    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
    PhoneNumberDirection:
      type: string
      enum:
      - inbound
      - outbound
      - both
    ScheduledCallbackStatus:
      type: string
      enum:
      - scheduled
      - dispatching
      - dispatched
      - cancelled
      - failed
    PhoneNumberKybDraftRequest:
      type: object
      required:
      - businessProfile
      - authorizedRepresentative
      properties:
        businessProfile:
          $ref: '#/components/schemas/PhoneNumberKybBusinessProfile'
        authorizedRepresentative:
          $ref: '#/components/schemas/PhoneNumberKybAuthorizedRepresentative'
        attestationAccepted:
          type: boolean
          default: false
    CallTranscriptEntry:
      type: object
      required:
      - id
      - index
      - source
      - text
      - started_at
      - metadata
      properties:
        id:
          type: string
        index:
          type: integer
        source:
          type: string
          enum:
          - user
          - agent
          - system
        text:
          type: string
        started_at:
          type: string
          format: date-time
        ended_at:
          type: string
          format: date-time
          nullable: true
        provider:
          type: string
          nullable: true
        model:
          type: string
          nullable: true
        metadata:
          $ref: '#/components/schemas/JsonObject'
    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'
    ScheduledCallbacksResponse:
      type: object
      required:
      - callbacks
      properties:
        callbacks:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledCallback'
    E164:
      type: string
      pattern: ^\+[1-9]\d{6,14}$
      examples:
      - '+12015551234'
    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
    TelephonyOptions:
      type: object
      properties:
        region:
          type: string
          description: Optional SIP routing region hint forwarded as `X-Speko-Region`.
        amd:
          type: object
          properties:
            mode:
              type: string
              enum:
              - agent
              - carrier
              - disabled
              default: agent
            timeoutSeconds:
              type: integer
              minimum: 1
              maximum: 60
    CallEventsResponse:
      type: object
      required:
      - events
      properties:
        events:
          type: array
          items:
            $ref: '#/components/schemas/CallEvent'
    PhoneNumberKybOverview:
      type: object
      required:
      - status
      - submission
      - prefill
      properties:
        status:
          type: string
          enum:
          - missing
          - draft
          - submitted
          - approved
          - rejected
          - revoked
        submission:
          $ref: '#/components/schemas/PhoneNumberKybSubmission'
        prefill:
          type: object
          nullable: true
          properties:
            businessProfile:
              $ref: '#/components/schemas/PhoneNumberKybBusinessProfile'
            authorizedRepresentative:
              $ref: '#/components/schemas/PhoneNumberKybAuthorizedRepresentative'
    WarmTransferRequest:
      type: object
      properties:
        to:
          $ref: '#/components/schemas/E164'
        destinations:
          type: array
          minItems: 1
          maxItems: 10
          items:
            $ref: '#/components/schemas/JsonObject'
        from:
          $ref: '#/components/schemas/E164'
        participantIdentity:
          type: string
        outboundTrunkId:
          type: string
        screeningPrompt:
          type: string
        summary:
          type: string
        ringingTimeout:
          type: integer
          minimum: 1
          maximum: 120
        waitUntilAnswered:
          type: boolean
        fallback:
          $ref: '#/components/schemas/JsonObject'
        voicemailDetection:
          $ref: '#/components/schemas/JsonObject'
        metadata:
          $ref: '#/components/schemas/JsonObject'
    JsonObject:
      type: object
      additionalProperties: true
    CallDetail:
      type: object
      required:
      - id
      - call_id
      - resource_uri
      - status
      - kind
      - created_at
      - transcript
      properties:
        id:
          type: string
        call_id:
          type: string
        resource_uri:
          type: string
        agent_id:
          type: string
          nullable: true
        status:
          type: string
        kind:
          type: string
        room_name:
          type: string
          nullable: true
        language:
          type: string
        pipeline_config:
          $ref: '#/components/schemas/JsonObject'
        metadata:
          $ref: '#/components/schemas/JsonObject'
        created_at:
          type: string
          format: date-time
        updated_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
        recording_duration_ms:
          type: integer
          nullable: true
        recording_resource_uri:
          type: string
        report:
          $ref: '#/components/schemas/CallReport'
        transfers:
          type: array
          items:
            $ref: '#/components/schemas/CallTransfer'
        transcript:
          type: object
          properties:
            entries:
              type: array
              items:
                $ref: '#/components/schemas/CallTranscriptEntry'
        span_tree:
          $ref: '#/components/schemas/JsonObject'
    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
       

# --- 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