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

# Get a call's transcript

> Returns what was said on one call, line by line, in the order it was said. Find call ids
with `POST /v1/objects/call/query`.

A key reads the calls the person who created it can open in the app: their own, the ones
shared with the workspace and, for an admin, every call. Any other call answers `404`, as
an id that does not exist does.


> [!NOTE]
>
> The Clearskies API is in beta and available on request. To turn it on for your workspace, email
> [support@clearskies.cc](mailto:support@clearskies.cc).


## OpenAPI

````yaml api-reference/openapi.yaml GET /v1/objects/call/{id}/transcript
openapi: 3.1.0
info:
  title: Clearskies Public API
  version: '1'
  description: >
    Read the accounts, calls, contacts and deals in your Context Graph, and the
    transcripts of

    your calls, from your own code.


    Every response is a JSON envelope. A success carries `ok: true` and the
    result in `data`; a

    failure carries `ok: false` and an `error` whose `code` is the value to
    branch on. Both carry

    `requestId`, which support resolves a report against.


    The fields available can differ between workspaces, so read an object's
    schema with

    `GET /v1/objects/{object}` before you query it. The schema lists every field
    you can select,

    filter, sort, group or measure, and the filter operators each one accepts.
servers:
  - url: https://api.clearskies.cc
security:
  - apiKey: []
tags:
  - name: Objects
    description: The object types the API serves, and the fields each one carries.
  - name: Records
    description: Query and aggregate the records of one object type.
  - name: Calls
    description: Read what was said on a call.
paths:
  /v1/objects/call/{id}/transcript:
    get:
      tags:
        - Calls
      summary: Get a call's transcript
      description: >
        Returns what was said on one call, line by line, in the order it was
        said. Find call ids

        with `POST /v1/objects/call/query`.


        A key reads the calls the person who created it can open in the app:
        their own, the ones

        shared with the workspace and, for an admin, every call. Any other call
        answers `404`, as

        an id that does not exist does.
      operationId: getCallTranscript
      parameters:
        - name: id
          in: path
          required: true
          description: The call's `id`.
          schema:
            type: string
      responses:
        '200':
          description: The call's transcript.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SuccessEnvelope'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/Transcript'
              example:
                ok: true
                data:
                  callId: 0198c7e3-2b6d-7c10-9a4e-5f8b1d2c3e70
                  status: available
                  lines:
                    - speaker: Dana Kim
                      timestamp: '1:05'
                      text: Let's talk pricing.
                    - speaker: Eli Park
                      timestamp: '1:09'
                      text: Sounds good.
                requestId: 0199f2b0-7c41-7a3e-9d6c-2f5a1b8e4c07
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/TenantBlocked'
        '404':
          $ref: '#/components/responses/CallNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
components:
  headers:
    X-RateLimit-Limit:
      description: >
        Requests the key can make in a burst. The rate-limit headers are sent on
        the responses

        that list them, while the rate limiter is reachable.
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests left in the current budget.
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Seconds until the budget is full again.
      schema:
        type: integer
    X-Request-ID:
      description: >-
        Identifies this call, as `requestId` in the body does. Quote either to
        support.
      schema:
        type: string
    Retry-After:
      description: Seconds to wait before retrying.
      schema:
        type: integer
  schemas:
    SuccessEnvelope:
      type: object
      required:
        - ok
        - data
        - requestId
      properties:
        ok:
          type: boolean
          const: true
        data: {}
        requestId:
          type: string
          description: Identifies this call. Quote it when you contact support.
        traceId:
          type: string
          description: Present on a traced request.
    Transcript:
      type: object
      required:
        - callId
        - status
        - lines
      properties:
        callId:
          type: string
        status:
          $ref: '#/components/schemas/TranscriptStatus'
        lines:
          type: array
          items:
            $ref: '#/components/schemas/TranscriptLine'
    TranscriptStatus:
      type: string
      enum:
        - available
        - pending
        - none
        - empty
        - failed
        - deleted
      description: >
        - `available`: `lines` holds the transcript.

        - `pending`: the call's recording or transcript is being processed.
        Fetch it again
          shortly. A call still pending after a few hours has most likely stalled.
        - `none`: no transcript is stored or being processed. A call that has
        not ended yet can
          still get one.
        - `empty`: the call was transcribed, and the transcript holds no speech.

        - `failed`: transcription failed, or the stored transcript cannot be
        read. Rarely, a later
          upload replaces it.
        - `deleted`: the call was transcribed, and its transcript is no longer
        stored.


        `lines` is empty for every status but `available`.


        This is the status to act on. A call record's `transcriptStatus` field
        is the stored

        file's upload state (`uploading`, `completed`, `failed`, `unavailable`,
        or null), and a

        call whose file is `completed` can still read `empty` or `deleted` here.
    TranscriptLine:
      type: object
      required:
        - speaker
        - timestamp
        - text
      properties:
        speaker:
          type:
            - string
            - 'null'
          description: >
            Who spoke, as the recording labels them. A label is not always a
            person: a line no one

            was attributed to reads `Other speaker(s)`, and some recorders label
            by audio channel,

            such as `microphone`. Null when the recording gave no label.
        timestamp:
          type:
            - string
            - 'null'
          description: >
            How far into the call the line starts, as the recording wrote it,
            such as `1:05`.

            Null when it gave none.
        text:
          type: string
    ErrorEnvelope:
      type: object
      required:
        - ok
        - error
        - requestId
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              $ref: '#/components/schemas/ErrorCode'
            message:
              type: string
              description: >
                A diagnosis for a person to read. Its wording changes over time,
                so branch on

                `code`, not on this text.
        requestId:
          type: string
          description: Identifies this call. Quote it when you contact support.
        traceId:
          type: string
          description: Present on a traced request.
    ErrorCode:
      type: string
      description: The value to branch on when a request fails.
      enum:
        - BAD_REQUEST
        - UNAUTHORIZED
        - TENANT_BLOCKED
        - NOT_FOUND
        - RATE_LIMITED
        - INTERNAL_ERROR
        - SERVICE_UNAVAILABLE
        - GATEWAY_TIMEOUT
  responses:
    Unauthorized:
      description: >
        The key was not accepted: it is missing, malformed, unknown or revoked;
        the person who

        created it has been deactivated or has left the workspace; or the
        workspace is inactive.

        Every case answers the same way, so check each when a key that worked
        starts failing.
      headers:
        WWW-Authenticate:
          schema:
            type: string
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    TenantBlocked:
      description: The key's workspace is blocked.
      headers:
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    CallNotFound:
      description: >-
        No call has this id, or the key's owner cannot open it. The two answer
        alike.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    RateLimited:
      description: >
        The key has spent its request budget, or has too many requests in
        flight. Wait for

        `Retry-After` seconds, then retry.
      headers:
        Retry-After:
          $ref: '#/components/headers/Retry-After'
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    InternalError:
      description: The request failed on our side. Quote `requestId` to support.
      headers:
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    ServiceUnavailable:
      description: >-
        The key could not be verified because a service it depends on did not
        answer. Retry.
      headers:
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    GatewayTimeout:
      description: >-
        The request ran past its deadline. Narrow the query with filters and
        retry.
      headers:
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >
        An API key created under Context Graph → API keys in the app sidebar,
        sent as `Authorization: Bearer csk_…`.

        The key is checked on every request, so a revoked key fails on its next
        call.

````

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