---
title: "Transcription Client Secrets"
method: POST
path: "/v1/realtime/client_secrets"
tags: ["transcription"]
---

# Transcription Client Secrets

`POST /v1/realtime/client_secrets`

## Request

- Base URL: `https://api.dotwave.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.dotwave.ai/v1/realtime/client_secrets`
- Auth: none declared

Creates a streaming transcription session with `nemotron-asr-streaming` and returns its client secret: the OpenAI-compatible path, which the OpenAI Realtime SDK's transcription helper calls. The request and the response are those of `POST /v1/live/client_secrets`, and the session is always a `transcription` one; a request naming another model is refused with 400 `invalid_parameter`. The session's language is `session.audio.input.transcription.language`, `auto` by default.

## Headers

- `authorization` string, nullable: `Bearer wk_…`: the project's API key (`Token` is an alias of `Bearer`). Create API keys in the console. New accounts start with $10 of credit; no card required.
- `x-api-key` string, nullable: The same API key, in place of the Authorization header.

## Request body

- ClientSecretRequest
  - `expires_after` ExpiresAfterRequest
    - `anchor` 'created_at'
    - `seconds` integer
  - `metadata` object
  - `session` RequestedSession
    - `audio` AudioRequest
      - `input` AudioInputRequest
        - `format` AudioFormatRequest
          - `rate` integer, nullable
          - `type` string
        - `noise_reduction` unknown
        - `transcription` TranscriptionRequest
          - `language` string, nullable: The language of the input audio. For a `transcription` session: `auto`, the model's own language detection, which is the default, or one of the languages `GET /v1/models` lists for the model; a `session.update` on the socket may change it until the first audio is sent. A `live` session runs in the duplex model's one language.
          - `model` string, nullable: The model, for clients that set it here as in the OpenAI Realtime API: `nemotron-asr-streaming` for a `transcription` session. `session.model` takes precedence.
          - `prompt` string, nullable
        - `turn_detection` TurnDetectionRequest
          - `eagerness` string, nullable
          - `idle_timeout_ms` integer
          - `prefix_padding_ms` integer, nullable
          - `silence_duration_ms` integer
          - `threshold` number, nullable
          - `type` 'server_vad' | 'semantic_vad'
    - `idle_timeout_ms` integer, nullable: Close a transcription session after this much time without audio. Defaults to 30,000 ms.
    - `include_frame_events` boolean: Include detailed transcription frame and input timing events. Off by default.
    - `ingress` IngressRequest
      - `hold_frames` integer, nullable: Extra buffering for audio that arrives late, from 1 to 3; higher values tolerate more network variation at some latency. Defaults: 1 for transcription, 1 for live.
    - `model` string, nullable: The model to open: `nemotron-voicechat` for a `live` session, `nemotron-asr-streaming` for a `transcription` session. Omitted, the session kind's model.
    - `type` 'live' | 'transcription': The session kind: `live`, a full-duplex conversation with `nemotron-voicechat`, or `transcription`, streaming speech-to-text with `nemotron-asr-streaming`. `POST /v1/realtime/client_secrets` always opens a `transcription` session.

## Response `200`

Successful Response

- ClientSecretResponse
  - `expires_at` integer, required
  - `session` ClientSecretSessionResponse, required
    - `audio` AudioResponse, required
      - `input` AudioInputResponse, required
        - `format` AudioFormatResponse, required
          - `rate` integer, nullable, required
          - `type` string, required
        - `noise_reduction` unknown
        - `transcription` TranscriptionResponse, required
          - `language` string, required
          - `model` string, required
          - `prompt` unknown
        - `turn_detection` TurnDetectionResponse, required
          - `idle_timeout_ms` integer, required
          - `prefix_padding_ms` unknown
          - `silence_duration_ms` integer, required
          - `threshold` unknown
          - `type` string, required
    - `id` string, required
    - `idle_timeout_ms` integer, required
    - `include_frame_events` boolean, required
    - `ingress` IngressResponse, required
      - `backlog_frames` integer, required
      - `frame_ms` integer, required
      - `hold_frames` integer, required
    - `live_url` string, required
    - `metadata` object, required
    - `model` string, required
    - `object` string, required
    - `pool` string, required
    - `region` string, required
    - `type` string, required
  - `value` string, required

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `409`: Conflict
- `422`: Validation Error
- `429`: Too Many Requests
- `500`: Internal Server Error
- `503`: Service Unavailable

---

[API](https://skmtc.dev/dotwave/apis/wave-live-api.md) - [All operations](https://skmtc.dev/dotwave/apis/wave-live-api/llms.txt) - [OpenAPI document](https://skmtc.dev/dotwave/apis/wave-live-api/revisions/57e80b62c850?raw)
