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

# list a campaign's calls

> every dial the campaign made, newest first: the contact's row as uploaded, how the dial went, and `call` — the conversation with its transcript, a short-lived signed `recordingUrl`, duration and cost (the same record as `GET /v1/calls/{call_id}`). `call` is `null` until the dial becomes a call, and for a dial the carrier refused. fetch recordings soon after listing: the URL expires.



## OpenAPI

````yaml /openapi.json get /v1/campaigns/{campaign_id}/calls
openapi: 3.1.0
info:
  title: silk api
  version: 1.0.0
  description: >-
    rumik ai's speech api. synthesize speech with the expressive `muga` model or
    the faster `mulberry` model over http or a streaming websocket session, run
    conversational voice agents over webrtc, a realtime pcm socket or the phone,
    and manage everything the agents playground does — agents, voices,
    variables, tools, phone numbers, sip trunks and outbound calls — with the
    same api key.
  contact:
    name: rumik ai
    url: https://rumik.ai
servers:
  - url: https://silk-api.rumik.ai
    description: production
security:
  - bearerAuth: []
tags:
  - name: speech
    description: text-to-speech over HTTP and WebSocket.
  - name: voice agents
    description: start calls with a deployed agent from your own app.
  - name: agents
    description: build, configure, deploy and inspect your agents.
  - name: calls
    description: place outbound phone calls and read call history.
  - name: voices
    description: the voices, languages and styles an agent may use.
  - name: variables
    description: account-wide `{name}` prompt variables and their defaults.
  - name: tools
    description: HTTP tools agents call before or during a call.
  - name: phone numbers
    description: 'numbers rented through rumik: search, rent, connect, release.'
  - name: sip trunks
    description: bring your own numbers over SIP.
  - name: campaign audiences
    description: >-
      the contact lists (CSV uploads) a campaign calls, and the columns its
      agent gets.
  - name: campaigns
    description: >-
      outbound campaigns: an agent calling an audience from your own number,
      with retries and a start time — and every call's transcript and recording.
paths:
  /v1/campaigns/{campaign_id}/calls:
    get:
      tags:
        - campaigns
      summary: list a campaign's calls
      description: >-
        every dial the campaign made, newest first: the contact's row as
        uploaded, how the dial went, and `call` — the conversation with its
        transcript, a short-lived signed `recordingUrl`, duration and cost (the
        same record as `GET /v1/calls/{call_id}`). `call` is `null` until the
        dial becomes a call, and for a dial the carrier refused. fetch
        recordings soon after listing: the URL expires.
      operationId: listCampaignCalls
      parameters:
        - name: campaign_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: the campaign's id.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
          description: page number, from 1.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 50
            minimum: 1
            default: 20
          description: page size (1–50, default 20).
      responses:
        '200':
          description: ok.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignCallList'
              examples:
                default:
                  value:
                    items:
                      - attemptId: 01a0e387-92b5-74c6-f132-4d5e6f708192
                        contactId: 01a0d276-81a4-73b5-e021-3c4d5e6f7081
                        phoneNumber: '+919876543210'
                        contactData:
                          name: Asha
                          city: Pune
                          mobile: '9876543210'
                        attemptNumber: 1
                        status: completed
                        startedAt: '2026-10-01T09:07:00Z'
                        endedAt: '2026-10-01T09:08:41Z'
                        endReason: customer_ended
                        durationSeconds: 97
                        errorMessage: null
                        call:
                          id: 01a05b4d-b1ad-7be0-8d29-04b2fd7e7dca
                          agentSlug: ua_fe3277d8
                          status: completed
                          channel: phone
                          systemInstruction: >-
                            You are the support agent for {company}. Be brief
                            and warm. When the caller asks for a human,
                            {{transfer_call}}.
                          greeting: Hi, this is {company} support. How can I help?
                          transcript:
                            - role: assistant
                              content: Hi, this is acme support. How can I help?
                              offsetSeconds: 0.4
                            - role: user
                              content: I need to change my delivery address.
                              offsetSeconds: 3.1
                          recordingUrl: https://storage.googleapis.com/…?X-Goog-Signature=…
                          startedAt: '2026-09-11T10:20:03Z'
                          endedAt: '2026-09-11T10:21:40Z'
                          durationSeconds: 97
                          durationMs: 97210
                          endReason: customer_ended
                          creditsCharged: null
                          creditBalanceAfter: null
                          errorMessage: null
                          summary: null
                          summaryGeneratedAt: null
                          createdAt: '2026-09-11T10:20:00Z'
                    count: 23
                    page: 1
                    totalPages: 2
        '401':
          description: >-
            `unauthorized` — key missing, malformed, unknown, revoked or
            expired.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                unauthorized:
                  value:
                    error: Invalid API key
                    code: unauthorized
        '403':
          description: '`forbidden_scope` — the key was created without the `agent` scope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                forbidden_scope:
                  value:
                    error: This API key lacks the 'agent' scope
                    code: forbidden_scope
        '404':
          description: '`campaign_not_found` — no such campaign on this account.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                campaign_not_found:
                  value:
                    error: Campaign not found
                    code: campaign_not_found
        '429':
          description: >-
            `rate_limited` — the key's per-minute budget is spent. `Retry-After`
            says how long to wait; the body carries `limit` and `current`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limited:
                  value:
                    error: Rate limit exceeded
                    code: rate_limited
                    limit: 100
                    current: 101
          headers:
            Retry-After:
              description: seconds to wait before retrying (per-key rate limit only).
              schema:
                type: integer
components:
  schemas:
    CampaignCallList:
      properties:
        items:
          items:
            $ref: '#/components/schemas/CampaignCall'
          type: array
        count:
          type: integer
        page:
          type: integer
        totalPages:
          type: integer
      type: object
      required:
        - items
        - count
        - page
        - totalPages
      title: CampaignCallList
    Error:
      type: object
      properties:
        error:
          type: string
          description: human-readable error message.
        code:
          type: string
          description: machine-readable error code.
    CampaignCall:
      properties:
        attemptId:
          type: string
          format: uuid
        contactId:
          type: string
          format: uuid
        phoneNumber:
          type: string
        contactData:
          additionalProperties:
            type: string
          type: object
          description: the contact's row as uploaded, every column.
        attemptNumber:
          type: integer
          description: 1 for the first dial of this contact, 2 for the first retry, …
        status:
          type: string
          description: >-
            `dialing`, `in_progress`, `completed`, `no_answer`, `failed` or
            `line_busy` (the line was full; redialled without using a retry).
        startedAt:
          type: string
          format: date-time
        endedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
        endReason:
          anyOf:
            - type: string
            - type: 'null'
        durationSeconds:
          anyOf:
            - type: integer
            - type: 'null'
        errorMessage:
          anyOf:
            - type: string
            - type: 'null'
          description: why the dial didn't connect, as the carrier answered it.
        call:
          anyOf:
            - $ref: '#/components/schemas/Call'
            - type: 'null'
          description: >-
            the conversation — the same record as `GET /v1/calls/{call_id}`,
            with `transcript` and a short-lived `recordingUrl`. null until the
            dial becomes a call.
      type: object
      required:
        - attemptId
        - contactId
        - phoneNumber
        - contactData
        - attemptNumber
        - status
        - startedAt
        - endedAt
        - endReason
        - durationSeconds
        - errorMessage
        - call
      title: CampaignCall
      description: >-
        one dial of a campaign: the contact, how it went, and the call with its
        transcript and recording.
    Call:
      properties:
        id:
          type: string
          format: uuid
          description: the call id — `callId` on the call endpoints.
        agentSlug:
          type: string
          description: >-
            the agent's handle at the time of the call (`ua_…`), or `draft` /
            `draft-test` for calls placed from an unsaved draft.
        status:
          $ref: '#/components/schemas/AgentRunStatus'
          description: >-
            `starting` (bot launching) → `running` → `completed`, or `failed`
            (never connected / errored) or `expired` (no end signal; never
            charged).
        channel:
          $ref: '#/components/schemas/AgentCallChannel'
          description: >-
            how the call reached the agent: `web` (browser, `/v1/webcall`),
            `phone` (PSTN, in or out) or `realtime` (`/v1/agent/connect`).
        systemInstruction:
          type: string
          description: the persona the call ran with.
        greeting:
          type: string
          description: the greeting the call opened with.
        transcript:
          anyOf:
            - items:
                $ref: '#/components/schemas/TranscriptMessage'
              type: array
            - type: 'null'
          description: the conversation, in order. present once the call has ended.
        recordingUrl:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            a signed URL for the recording, valid for a few minutes — fetch it,
            do not store it. null until the recording lands or when storage is
            off.
        startedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          description: when the caller connected.
        endedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          description: when the call ended.
        durationSeconds:
          anyOf:
            - type: integer
            - type: 'null'
          description: billed length of the call.
        durationMs:
          anyOf:
            - type: integer
            - type: 'null'
          description: the same, in milliseconds.
        endReason:
          anyOf:
            - type: string
            - type: 'null'
          description: why it ended, e.g. `customer_ended`, `never_connected`.
        creditsCharged:
          anyOf:
            - type: integer
            - type: 'null'
        creditBalanceAfter:
          anyOf:
            - type: integer
            - type: 'null'
        errorMessage:
          anyOf:
            - type: string
            - type: 'null'
          description: what went wrong, for a `failed` or `expired` call.
        summary:
          anyOf:
            - type: string
            - type: 'null'
          description: an on-demand summary (the dashboard's summary panel), or null.
        summaryGeneratedAt:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          description: when the call was placed.
      type: object
      required:
        - id
        - agentSlug
        - status
        - channel
        - systemInstruction
        - greeting
        - createdAt
      title: Call
      description: one call, in any channel, with its transcript and recording.
    AgentRunStatus:
      type: string
      enum:
        - starting
        - running
        - completed
        - failed
        - expired
      title: AgentRunStatus
      description: |-
        Lifecycle of a billed agent run.

        ``STARTING`` is written when the session is created and credits are
        reserved (cap); ``RUNNING`` once the bot reports a successful client
        connect. Terminal states are ``COMPLETED`` (actual duration billed),
        ``FAILED`` (never connected / errored) and ``EXPIRED`` (reaped — no end
        hook within grace; reservation fully refunded).
    AgentCallChannel:
      type: string
      enum:
        - web
        - phone
        - realtime
      title: AgentCallChannel
      description: |-
        How a call reached the agent: a browser (WebRTC) session, an outbound
        phone (PSTN) call, or the public realtime WebSocket.
    TranscriptMessage:
      additionalProperties: true
      type: object
      title: TranscriptMessage
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        your rumik api key, e.g. `rk_live_...`. create one in the rumik
        dashboard.

````

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