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

# How your calls went

> Every call your workspace made and took in a window, read as a whole: how many connected, how many the agent judged a success, the talk time, what the calls were charged, where they came from (campaigns, incoming calls, one-off calls from the API or the console, browser tests, text, realtime), each agent and number, a day-by-day count, how long callers waited for a reply, and an `attention` list of things that need you (an empty wallet, a number not added, an agent that could not take its calls). These are the figures on the console's Overview page.

`from`/`to` (RFC 3339, UTC) bound the window; calls count by when they were created, as [List calls](/api-reference/calls/list-calls) filters them. Without them it is the last 30 days. The window is at most 92 days. `daily` is one row per India day (Asia/Kolkata) the window touches.

Every key is always present. A rate or a reply time is `null` when there is nothing to divide or measure, never `0`. Money is call charges only, in paise (the statement has everything else). A `503` means the figures could not be read right now: retry, and don't read it as a quiet month.



## OpenAPI

````yaml /api-reference/openapi.json get /v2/insights
openapi: 3.1.0
info:
  title: Voice Infra API
  version: 2026-10-20.turn-taking
  description: >-
    The v2 API for voice agents, calls, campaigns, phone numbers and speech.
    Every request carries `Authorization: Bearer sk_live_…`. Generated from the
    API's own contract and its Postman collection.
servers:
  - url: https://sandbox.voice.miraiminds.co
    description: 'Sandbox: trial workspaces, before your company goes live'
  - url: https://prod.voice.miraiminds.co
    description: 'Production: workspaces that have gone live'
security:
  - bearerAuth: []
tags:
  - name: Agents
    description: >-
      An agent is what a call runs: its prompt (or a node flow, see the Flows
      section), voice, language and limits. Write it once and dial it as often
      as you like; each call fills in its own `variables`.


      Every save creates a new revision. You can read old revisions, roll back
      to one, and publish a draft when it is ready. None of the requests here
      place a call or charge your wallet.
  - name: Calls
    description: >-
      Place a call, follow it while it runs, then read what happened: the
      transcript, the recording, the post-call analysis.


      `POST /v2/calls` answers before the phone rings, with an id. Everything
      after that is about that id. Every call has a live event stream, phone
      calls included, so your own dashboard can show a call as it happens. Live
      control works on browser calls (`channel: "web"`) and realtime sessions
      only; a phone call answers it with `400 unsupported_channel`.
  - name: Flows
    description: >-
      A node-based agent runs the call as a graph of steps. Each node has its
      own instructions, and the agent moves to the next node when a transition's
      condition is met, so a call with branches (wrong person, not now,
      reschedule) stays easy to follow and to change.


      The usual path: draft a graph from a brief or from recordings of your real
      calls, check it, test it with simulated calls, then save it on an agent.
      Drafting, transcribing and testing use AI models and charge your wallet;
      checking, saving and reading are free.


      Full guide: https://docs.miraiminds.co/v2/node-agents
  - name: Tools and secrets
    description: >-
      Connect your own APIs to an agent. A tool runs at one of three moments:


      * `pre_call`, before dialling: fetch context for the greeting, or skip the
      call.

      * `on_call`, when the agent decides to use it mid-conversation: look
      something up, book something.

      * `post_call`, after the call has settled: send the outcome to your CRM,
      schedule a call back.


      The order here is the order you'd use them in: see what's available, store
      your credential as a secret, add a tool, test it against your endpoint,
      then read each call's tool runs. Tools themselves cost nothing extra.


      Tool definitions use Mirai's own templates, like `{{ args.date }}` and `{{
      secrets.crm_key }}`.


      A definition that doesn't validate comes back as a list, so you can fix
      everything at once: `{"error": "invalid_tools", "details": [{"path",
      "message"}]}`. Everything else uses the usual `{"error": {"code",
      "message"}}`.
  - name: Campaigns
    description: >-
      Call a whole list with one agent. Upload contacts, say which days and
      hours the campaign may ring, and start it. From then on it dials by
      itself: it paces itself, waits overnight, retries calls that didn't
      connect, skips numbers on your do-not-call list, and pauses itself when
      its budget or your wallet runs out, or when as many calls have connected
      as you asked for.


      Campaign calls are ordinary calls. They show up in `GET /v2/calls`, send
      the same `call.*` webhooks and bill the same per-minute rate. In a sandbox
      workspace every campaign runs and bills at T5 (₹5 a minute), whatever tier
      you ask for.


      Money on a campaign is in **paise**: `"budget_paise": 50000` is ₹500.


      The requests run top to bottom: create saves `campaign_id`, and the rest
      use it. Starting a campaign rings every contact on it, so put numbers
      you're allowed to call in the bodies first.
  - name: Do-not-call list
    description: >-
      Numbers your campaigns will never dial. The list covers every campaign in
      the workspace, including ones that are already running: it's checked at
      the moment a contact is about to be called, so a number added mid-campaign
      is skipped from then on. A skipped contact stays in its campaign as
      `suppressed` and costs nothing.


      It doesn't apply to single calls placed with `POST /v2/calls`; check the
      list yourself before those if you need to. It's your own list, not the
      national DND register, and adding a number here doesn't meet your DND
      obligations.
  - name: Phone numbers
    description: >-
      The numbers your agents answer. Each one comes from the **Telephony**
      section:


      * **Rented from Mirai.** Once the rental is active, the number shows up
      here by itself (`ownership: managed`).

      * **From your own Plivo account.** Connect the account in Telephony, list
      its numbers, then bring one here with [Import a Plivo
      number](/api-reference/phone-numbers/import-a-plivo-number) (`ownership:
      customer`). Plivo keeps billing you for it.

      * **On your own SIP trunk.** Connect the trunk in Telephony, then add each
      of its numbers with *Add a number on your SIP trunk* (`provider: sip`). It
      arrives `ready`: assign an agent and it answers.


      After that it's two steps, in this order: [Assign an
      agent](/api-reference/phone-numbers/assign-an-agent) (who answers), then
      [Turn on incoming
      calls](/api-reference/phone-numbers/turn-on-incoming-calls). `state` is
      `imported` until calls are on and `ready` after; `error` means the last
      attempt to turn calls on failed, and `setup_error` says why.


      Every change sends the number's current `version`, and each change raises
      it by one. If you're not sure what it is, read the number first; a stale
      version is a 409 `conflict` and changes nothing.


      To call out from one of your numbers, place a call with `phone_number_id`
      set to its id once it is `ready` (Indian destinations only). Calls on your
      numbers are billed like any other call.


      Every number also says how it is doing in `health`: `state` is `active`,
      `warming` (its first week, at half its pool's pace), `resting`, `cooling`
      (rested three times in a day; waits for you) or `retired`, with this
      hour's attempts and seven days of answers. You can rest, resume and retire
      your own numbers; a resting or retired number still answers calls to it.
  - name: Phone pools
    description: >-
      A pool is a group of your own phone numbers that a campaign, an agent or a
      single call can ring from. Each call takes the number best placed for it:
      a number a contact has already been rung from stays theirs on a retry,
      numbers in the contact's own circle come first, and the pool's pace
      (`max_per_hour`, per number) is held across every campaign and API call at
      once. A number whose answers drop well below its pool-mates' rests on its
      own for 45 minutes.


      Point a campaign at a pool with `pool_id` on [Create a
      campaign](/api-reference/campaigns/create-a-campaign), an agent with
      `calls_from: {"pool_id": …}`, or one call with `pool_id` on [Place a
      call](/api-reference/calls/place-a-call). `pool_id` and `phone_number_id`
      never go together. With nothing chosen, calls come from the agent's
      setting, then the pool marked `default_for_campaigns`, then the Mirai
      shared line. A call's `calls_from_source` is `pool` (with `pool_id`) when
      a pool picked its number.


      A single call on a pool whose numbers are all resting or at their pace
      this hour answers 409 `pool_busy` with `Retry-After`; one with no number
      that can call, 409 `pool_unavailable`. A campaign doesn't fail: it waits
      and carries on.


      `purpose` is what the calls are for: `outreach` (promotional),
      `reminders`, `support` or `other`. It sets the starting pace: 40 an hour
      for support, 60 otherwise. Pools are free; numbers are billed as numbers.
  - name: Telephony
    description: >-
      Getting a phone number for your agent. There are two ways, and a workspace
      can use both.


      **1. Rent a number from Mirai.** ₹500 a month, paid as ₹1,500 from your
      wallet every three months, renewing until you turn it off. Indian numbers
      need a business verification that Plivo approves once: read the
      requirements, submit your details and documents, then refresh until it's
      `accepted`. After that: search, quote, rent. The rented number appears in
      **Phone numbers** by itself.


      **2. Connect your own Plivo account.** Plivo keeps billing you directly.
      Connect it with your Auth ID and Auth Token, list the numbers it owns, and
      bring one over with [Import a Plivo
      number](/api-reference/phone-numbers/import-a-plivo-number). A Plivo main
      account can also rent new numbers through the same search → quote → rent
      requests, with its connection id as `account`.


      **3. Connect your own SIP trunk**, where [Get number
      options](/api-reference/telephony/get-number-options) lists `sip` for your
      workspace. Your carrier keeps billing you for the trunk. Tell us the
      carrier's address and the IP addresses it calls from, give your carrier
      the details in `sip` from [Get number
      options](/api-reference/telephony/get-number-options), then add the
      trunk's numbers by number with *Phone numbers → Add a number on your SIP
      trunk*.


      Either way you finish in **Phone numbers**: assign the agent that answers,
      then turn on incoming calls.


      The last two requests verify your own phone, so the workspace can ring it
      from Mirai's shared test number (test calls are placed from the Numbers
      page in the console).


      Indian (+91) numbers only for now. If phone numbers aren't available on
      the host you're calling, every request here answers 503
      `telephony_unavailable`.
  - name: Transcriptions
    description: >-
      Turn a recorded call (or any recording) into a transcript with speakers
      and timestamps. Hindi, English, Gujarati and mixed speech are written the
      way they were spoken, never translated. ₹18 per hour of audio; failed and
      degraded jobs are free.
  - name: Speech to text
    description: >-
      Speech to text in ten languages, two ways: send one recording and get its
      text back in the same request ([Transcribe a
      recording](/api-reference/speech-to-text/transcribe-a-recording)), or
      stream live audio over one WebSocket per call and read partial transcripts
      while people speak, then one final transcript per utterance. Language
      codes: hi-IN, en-IN, gu-IN, mr-IN, pa-IN, bn-IN, ta-IN, te-IN, kn-IN or
      ml-IN.


      `wss://sandbox.voice.miraiminds.co/v1/audio/transcriptions/stream?language_code=hi-IN&encoding=mulaw&sample_rate=8000&endpointing=manual`


      (`wss://prod.voice.miraiminds.co` once your company has gone live), with
      the header `Authorization: Bearer sk_live_YOUR_API_KEY`. 8 or 16 kHz,
      16-bit PCM, μ-law or A-law. A browser uses `?token=` from [Mint stream
      tokens](/api-reference/speech-to-text/mint-stream-tokens) instead, because
      it cannot set headers on a WebSocket.


      Send JSON text frames: `{"event": "speech_start"}`, then `{"event":
      "audio_input", "audio": "<base64 audio>"}` as the audio arrives, then
      `{"event": "speech_end"}`; `{"event": "end"}` closes the session. You
      receive `session.begin` first, `transcript.partial` while an utterance is
      open, exactly one `transcript.final` per utterance, and `session.end` with
      `audio_seconds_billed` and `cost_paise`.


      Every event, both endpointing modes, limits and errors:
      https://docs.miraiminds.co/v2/stt-quickstart
  - name: Text to speech
    description: >-
      Turn text into speech in one request, and read back what each request
      cost.
  - name: Wallet
    description: >-
      Your prepaid balance and every line that moved it. Calls, text to speech,
      flow drafts, transcriptions and number rentals all debit the same wallet.
  - name: Webhooks
    description: >-
      Get call events at your own HTTPS URL, signed, retried and kept for 30
      days.


      1. [Create a destination](/api-reference/webhooks/create-a-destination)
      with your URL. Save the `signing_secret` from that answer: it is shown
      once.

      2. [Subscribe a destination to
      events](/api-reference/webhooks/subscribe-a-destination-to-events), for
      one agent or the whole workspace. `call.completed` arrives when a call
      ends; `call.processing.completed` when the recording, transcript, results
      and post-call tools have all settled.

      3. [Send a test event](/api-reference/webhooks/send-a-test-event). It is a
      real POST to your URL with made-up call data and `test: true`. No call is
      placed.


      Every request carries `X-Mirai-Signature: t=<unix>,v1=<hex>`, an
      HMAC-SHA256 of `<unix>.<raw body>`, and `X-Mirai-Signed-With`, which names
      the secret that signed it. A destination's requests are signed with its
      own Destination secret; the `webhook_url` you pass when creating a call is
      signed with your Call webhook secret, the one shown with your API keys. A
      URL that is both gets each event once, with one secret. Delivery is at
      least once, so keep each event `id` and skip ones you've already handled.


      Changes send the resource's current `revision` (`if_revision`); a stale
      one is a 409 and changes nothing. Until the webhook release reaches your
      workspace these routes answer 404. The same settings are in the console
      under Webhooks, and on each agent in Agent Studio.
  - name: Sub-workspaces
    description: >-
      For partners who run calls for many brands. Each brand gets its own
      sub-workspace under your account, with its own agents, campaigns, calls,
      phone numbers, knowledge bases, tool secrets and do-not-call list. Money
      stays in one place: every brand spends from your account's wallet at your
      account's rates, and you get one invoice.


      **Acting as a brand.** Use your account's API key on any request in this
      collection and add one header:


      ```

      Mirai-Workspace: ws_6f1c0a9e2b7d4c3a8e5f9b10

      ```


      The value is the sub-workspace's `id` or the `external_id` you gave it.
      Without the header, or with your account's own id in it, the request acts
      on your account as it always has. `X-Workspace` and `Workspace` work too,
      so an integration that already sends v1's `workspace` header keeps working
      once your brands are set up here with their v1 workspace ids as
      `external_id`. If your account has no sub-workspaces, those two are
      ignored.


      A value that names none of your brands is `404 workspace_not_found`; an
      archived brand is `403 workspace_archived`. The header only looks among
      your own brands, so it can never reach someone else's workspace.


      Call webhooks and campaign webhooks from every brand are signed with your
      account's webhook secret, and requests for all your brands share your
      key's rate limit. `GET /v2/wallet` with the header shows the shared
      account balance.


      **Managing brands.** The requests below act on your account, so send them
      without the header: with one they answer `400`. Sub-workspaces are
      switched on per account with a limit. Ask us to turn them on for yours.
  - name: Reference
    description: The voice catalogue, and the API contract as a machine-readable document.
paths:
  /v2/insights:
    get:
      tags:
        - Calls
      summary: How your calls went
      description: >-
        Every call your workspace made and took in a window, read as a whole:
        how many connected, how many the agent judged a success, the talk time,
        what the calls were charged, where they came from (campaigns, incoming
        calls, one-off calls from the API or the console, browser tests, text,
        realtime), each agent and number, a day-by-day count, how long callers
        waited for a reply, and an `attention` list of things that need you (an
        empty wallet, a number not added, an agent that could not take its
        calls). These are the figures on the console's Overview page.


        `from`/`to` (RFC 3339, UTC) bound the window; calls count by when they
        were created, as [List calls](/api-reference/calls/list-calls) filters
        them. Without them it is the last 30 days. The window is at most 92
        days. `daily` is one row per India day (Asia/Kolkata) the window
        touches.


        Every key is always present. A rate or a reply time is `null` when there
        is nothing to divide or measure, never `0`. Money is call charges only,
        in paise (the statement has everything else). A `503` means the figures
        could not be read right now: retry, and don't read it as a quiet month.
      operationId: get_workspace_insights
      parameters:
        - name: from
          in: query
          required: false
          description: ''
          schema:
            type: string
          example: '2026-10-06T18:30:00Z'
        - name: to
          in: query
          required: false
          description: ''
          schema:
            type: string
          example: '2026-11-05T09:12:44Z'
      responses:
        '200':
          description: The last 30 days
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkspaceInsights'
              examples:
                The last 30 days:
                  summary: 200 — the last 30 days
                  value:
                    object: workspace_insights
                    workspace_id: ws_01K2M4N8B3C5D7F9G1H3J5K7M9
                    from: '2026-10-06T18:30:00Z'
                    to: '2026-11-05T09:12:44Z'
                    timezone: Asia/Kolkata
                    calls:
                      total: 1240
                      in_progress: 2
                      settled: 1238
                      connected: 812
                      not_answered: 301
                      failed: 38
                      stopped: 23
                      other: 64
                      short: 96
                      engaged: 503
                      talk_secs: 98412
                      talk_p50_secs: 94
                      connect_rate_pct: 65.6
                      failure_rate_pct: 3.1
                      short_rate_pct: 11.8
                    outcomes:
                      analysed: 790
                      success: 412
                      not_success: 318
                      no_verdict: 60
                      pending: 9
                      analysis_failed: 13
                      success_rate_pct: 56.4
                    money:
                      billed_paise: 1096500
                      billed_calls: 820
                      per_connected_paise: 1350
                      per_success_paise: 2661
                      per_talk_minute_paise: 669
                    quality:
                      calls_measured: 790
                      v2v_turns: 9120
                      v2v_p50_ms: 1080
                      v2v_p95_ms: 1620
                      first_audio_p50_ms: 2310
                    by_origin:
                      campaign:
                        calls: 980
                        connected: 610
                        failed: 30
                        stopped: 21
                        talk_secs: 71230
                        billed_paise: 812400
                        success: 318
                        not_success: 250
                      inbound:
                        calls: 160
                        connected: 142
                        failed: 4
                        stopped: 2
                        talk_secs: 19870
                        billed_paise: 201300
                        success: 70
                        not_success: 55
                      outbound:
                        calls: 64
                        connected: 38
                        failed: 3
                        stopped: 0
                        talk_secs: 5210
                        billed_paise: 64600
                        success: 18
                        not_success: 10
                      web:
                        calls: 30
                        connected: 18
                        failed: 1
                        stopped: 0
                        talk_secs: 1830
                        billed_paise: 15300
                        success: 5
                        not_success: 3
                      text:
                        calls: 4
                        connected: 2
                        failed: 0
                        stopped: 0
                        talk_secs: 120
                        billed_paise: 900
                        success: 1
                        not_success: 0
                      realtime:
                        calls: 2
                        connected: 2
                        failed: 0
                        stopped: 0
                        talk_secs: 152
                        billed_paise: 2000
                        success: 0
                        not_success: 0
                    by_agent:
                      - agent_id: agt_01K2M4P7QRSTVWXYZ0A1B2C3
                        name: Service reminder
                        deleted: false
                        calls: 1044
                        connected: 652
                        failed: 33
                        stopped: 21
                        short: 81
                        talk_secs: 76440
                        billed_paise: 877000
                        success: 336
                        not_success: 260
                        success_rate_pct: 56.4
                        v2v_p50_ms: 1060
                      - agent_id: agt_01K2M4Q2W4Y6A8C0E2G4J6L8N0
                        name: Front desk
                        deleted: false
                        calls: 196
                        connected: 160
                        failed: 5
                        stopped: 2
                        short: 15
                        talk_secs: 21972
                        billed_paise: 219500
                        success: 76
                        not_success: 58
                        success_rate_pct: 56.7
                        v2v_p50_ms: 1190
                    daily:
                      - day: '2026-11-04'
                        calls: 61
                        connected: 40
                        not_answered: 15
                        failed: 2
                        stopped: 1
                        talk_secs: 4870
                        billed_paise: 53800
                        success: 21
                        v2v_p50_ms: 1070
                      - day: '2026-11-05'
                        calls: 22
                        connected: 15
                        not_answered: 5
                        failed: 1
                        stopped: 0
                        talk_secs: 1760
                        billed_paise: 19700
                        success: 7
                        v2v_p50_ms: 1100
                    refused:
                      total: 12
                      by_code:
                        insufficient_balance: 12
                      last_at: '2026-11-02T06:41:09Z'
                    tools:
                      runs: 640
                      failed: 9
                    numbers:
                      - number_id: pn_01K2M4R6T8V0X2Z4B6D8F0H2K4
                        number: '+918035312390'
                        health_state: active
                        attempts: 812
                        answers: 529
                        answer_rate_pct: 65.1
                    inbound_misses:
                      numbers: 0
                      calls: 0
                      last_at: null
                    attention:
                      - code: wallet
                        severity: act
                        count: 35
                        last_at: '2026-11-02T06:41:09Z'
                        subject: null
        '400':
          description: A window over 92 days
          content:
            application/json:
              examples:
                A window over 92 days:
                  summary: 400 — a window over 92 days
                  value:
                    error:
                      code: invalid_request
                      message: the window is at most 92 days
        '503':
          description: Figures unavailable
          content:
            application/json:
              examples:
                Figures unavailable:
                  summary: 503 — figures unavailable
                  value:
                    error:
                      code: insights_unavailable
                      message: could not read the call record; try again shortly
components:
  schemas:
    WorkspaceInsights:
      additionalProperties: false
      description: >-
        GET /v2/insights: how this workspace's calls created in [from, to) went.
        Every key is always present; a rate or per-unit cost is null when its
        denominator is 0. Counts are calls, one per call id; money is call
        charges in paise.
      properties:
        attention:
          items:
            additionalProperties: false
            properties:
              code:
                enum:
                  - wallet
                  - inbound_misses
                  - agent_unavailable
                  - throttled
                  - failing_calls
                  - tool_failures
                  - short_calls
                  - number_resting
                type: string
              count:
                type: integer
              last_at:
                format: date-time
                type:
                  - string
                  - 'null'
              severity:
                enum:
                  - act
                  - watch
                type: string
              subject:
                additionalProperties: false
                properties:
                  id:
                    type: string
                  kind:
                    type: string
                  name:
                    type: string
                required:
                  - kind
                  - id
                  - name
                type:
                  - object
                  - 'null'
            required:
              - code
              - severity
              - count
              - last_at
              - subject
            type: object
          type: array
        by_agent:
          items:
            additionalProperties: false
            properties:
              agent_id:
                type: string
              billed_paise:
                type: integer
              calls:
                type: integer
              connected:
                type: integer
              deleted:
                type: boolean
              failed:
                type: integer
              name:
                type: string
              not_success:
                type: integer
              short:
                type: integer
              stopped:
                type: integer
              success:
                type: integer
              success_rate_pct:
                type:
                  - number
                  - 'null'
              talk_secs:
                type: integer
              v2v_p50_ms:
                type:
                  - integer
                  - 'null'
            required:
              - agent_id
              - name
              - deleted
              - calls
              - connected
              - failed
              - stopped
              - short
              - talk_secs
              - billed_paise
              - success
              - not_success
              - success_rate_pct
              - v2v_p50_ms
            type: object
          type: array
        by_origin:
          additionalProperties: false
          properties:
            campaign:
              additionalProperties: false
              properties:
                billed_paise:
                  type: integer
                calls:
                  type: integer
                connected:
                  type: integer
                failed:
                  type: integer
                not_success:
                  type: integer
                stopped:
                  type: integer
                success:
                  type: integer
                talk_secs:
                  type: integer
              required:
                - calls
                - connected
                - failed
                - stopped
                - talk_secs
                - billed_paise
                - success
                - not_success
              type: object
            inbound:
              additionalProperties: false
              properties:
                billed_paise:
                  type: integer
                calls:
                  type: integer
                connected:
                  type: integer
                failed:
                  type: integer
                not_success:
                  type: integer
                stopped:
                  type: integer
                success:
                  type: integer
                talk_secs:
                  type: integer
              required:
                - calls
                - connected
                - failed
                - stopped
                - talk_secs
                - billed_paise
                - success
                - not_success
              type: object
            outbound:
              additionalProperties: false
              properties:
                billed_paise:
                  type: integer
                calls:
                  type: integer
                connected:
                  type: integer
                failed:
                  type: integer
                not_success:
                  type: integer
                stopped:
                  type: integer
                success:
                  type: integer
                talk_secs:
                  type: integer
              required:
                - calls
                - connected
                - failed
                - stopped
                - talk_secs
                - billed_paise
                - success
                - not_success
              type: object
            realtime:
              additionalProperties: false
              properties:
                billed_paise:
                  type: integer
                calls:
                  type: integer
                connected:
                  type: integer
                failed:
                  type: integer
                not_success:
                  type: integer
                stopped:
                  type: integer
                success:
                  type: integer
                talk_secs:
                  type: integer
              required:
                - calls
                - connected
                - failed
                - stopped
                - talk_secs
                - billed_paise
                - success
                - not_success
              type: object
            text:
              additionalProperties: false
              properties:
                billed_paise:
                  type: integer
                calls:
                  type: integer
                connected:
                  type: integer
                failed:
                  type: integer
                not_success:
                  type: integer
                stopped:
                  type: integer
                success:
                  type: integer
                talk_secs:
                  type: integer
              required:
                - calls
                - connected
                - failed
                - stopped
                - talk_secs
                - billed_paise
                - success
                - not_success
              type: object
            web:
              additionalProperties: false
              properties:
                billed_paise:
                  type: integer
                calls:
                  type: integer
                connected:
                  type: integer
                failed:
                  type: integer
                not_success:
                  type: integer
                stopped:
                  type: integer
                success:
                  type: integer
                talk_secs:
                  type: integer
              required:
                - calls
                - connected
                - failed
                - stopped
                - talk_secs
                - billed_paise
                - success
                - not_success
              type: object
          required:
            - campaign
            - inbound
            - outbound
            - web
            - text
            - realtime
          type: object
        calls:
          additionalProperties: false
          properties:
            connect_rate_pct:
              type:
                - number
                - 'null'
            connected:
              type: integer
            engaged:
              type: integer
            failed:
              type: integer
            failure_rate_pct:
              type:
                - number
                - 'null'
            in_progress:
              type: integer
            not_answered:
              type: integer
            other:
              type: integer
            settled:
              type: integer
            short:
              type: integer
            short_rate_pct:
              type:
                - number
                - 'null'
            stopped:
              type: integer
            talk_p50_secs:
              type:
                - integer
                - 'null'
            talk_secs:
              type: integer
            total:
              type: integer
          required:
            - total
            - in_progress
            - settled
            - connected
            - not_answered
            - failed
            - stopped
            - other
            - short
            - engaged
            - talk_secs
            - talk_p50_secs
            - connect_rate_pct
            - failure_rate_pct
            - short_rate_pct
          type: object
        daily:
          items:
            additionalProperties: false
            properties:
              billed_paise:
                type: integer
              calls:
                type: integer
              connected:
                type: integer
              day:
                type: string
              failed:
                type: integer
              not_answered:
                type: integer
              stopped:
                type: integer
              success:
                type: integer
              talk_secs:
                type: integer
              v2v_p50_ms:
                type:
                  - integer
                  - 'null'
            required:
              - day
              - calls
              - connected
              - not_answered
              - failed
              - stopped
              - talk_secs
              - billed_paise
              - success
              - v2v_p50_ms
            type: object
          type: array
        from:
          format: date-time
          type: string
        inbound_misses:
          additionalProperties: false
          properties:
            calls:
              type: integer
            last_at:
              format: date-time
              type:
                - string
                - 'null'
            numbers:
              type: integer
          required:
            - numbers
            - calls
            - last_at
          type: object
        language:
          additionalProperties: false
          properties:
            calls_measured:
              type: integer
            calls_with_requests:
              type: integer
            followed:
              type: integer
            no_reply:
              type: integer
            not_followed:
              type: integer
            not_offered:
              type: integer
            requests:
              type: integer
            unclear:
              type: integer
          required:
            - calls_measured
            - calls_with_requests
            - requests
            - followed
            - not_followed
            - not_offered
            - no_reply
            - unclear
          type: object
        money:
          additionalProperties: false
          properties:
            billed_calls:
              type: integer
            billed_paise:
              type: integer
            per_connected_paise:
              type:
                - integer
                - 'null'
            per_success_paise:
              type:
                - integer
                - 'null'
            per_talk_minute_paise:
              type:
                - integer
                - 'null'
          required:
            - billed_paise
            - billed_calls
            - per_connected_paise
            - per_success_paise
            - per_talk_minute_paise
          type: object
        numbers:
          items:
            additionalProperties: false
            properties:
              answer_rate_pct:
                type:
                  - number
                  - 'null'
              answers:
                type: integer
              attempts:
                type: integer
              health_state:
                type: string
              number:
                type: string
              number_id:
                type: string
            required:
              - number_id
              - number
              - health_state
              - attempts
              - answers
              - answer_rate_pct
            type: object
          type: array
        object:
          enum:
            - workspace_insights
          type: string
        outcomes:
          additionalProperties: false
          properties:
            analysed:
              type: integer
            analysis_failed:
              type: integer
            no_verdict:
              type: integer
            not_success:
              type: integer
            pending:
              type: integer
            success:
              type: integer
            success_rate_pct:
              type:
                - number
                - 'null'
          required:
            - analysed
            - success
            - not_success
            - no_verdict
            - pending
            - analysis_failed
            - success_rate_pct
          type: object
        quality:
          additionalProperties: false
          properties:
            calls_measured:
              type: integer
            fallback_calls:
              type: integer
            first_audio_p50_ms:
              type:
                - integer
                - 'null'
            held_turns:
              type: integer
            hold_p50_ms:
              type:
                - integer
                - 'null'
            llm_p50_ms:
              type:
                - integer
                - 'null'
            llm_p95_ms:
              type:
                - integer
                - 'null'
            stt_p50_ms:
              type:
                - integer
                - 'null'
            stt_p95_ms:
              type:
                - integer
                - 'null'
            tts_p50_ms:
              type:
                - integer
                - 'null'
            tts_p95_ms:
              type:
                - integer
                - 'null'
            v2v_p50_ms:
              type:
                - integer
                - 'null'
            v2v_p95_ms:
              type:
                - integer
                - 'null'
            v2v_turns:
              type: integer
          required:
            - calls_measured
            - v2v_turns
            - v2v_p50_ms
            - v2v_p95_ms
            - first_audio_p50_ms
            - stt_p50_ms
            - stt_p95_ms
            - llm_p50_ms
            - llm_p95_ms
            - tts_p50_ms
            - tts_p95_ms
            - held_turns
            - hold_p50_ms
            - fallback_calls
          type: object
        refused:
          additionalProperties: false
          properties:
            by_code:
              additionalProperties:
                type: integer
              type: object
            last_at:
              format: date-time
              type:
                - string
                - 'null'
            total:
              type: integer
          required:
            - total
            - by_code
            - last_at
          type: object
        timezone:
          type: string
        to:
          format: date-time
          type: string
        tools:
          additionalProperties: false
          properties:
            failed:
              type: integer
            runs:
              type: integer
          required:
            - runs
            - failed
          type: object
        workspace_id:
          type: string
      required:
        - object
        - workspace_id
        - from
        - to
        - timezone
        - calls
        - outcomes
        - money
        - quality
        - language
        - by_origin
        - by_agent
        - daily
        - refused
        - tools
        - numbers
        - inbound_misses
        - attention
      type: object
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your workspace secret key, `sk_live_` followed by 32 hex characters.
        Create one in the console under **Developers**.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.