---
title: "Complete the open (final) turn of a conversation"
method: POST
path: "/v1/converse"
tags: ["Speech"]
---

# Complete the open (final) turn of a conversation

`POST /v1/converse`

Given a conversation, complete its last ('open') turn. A speaker-only open turn is authored (text + audio); an open turn with text is rendered as that speaker, conditioned on the prior turns (contextual TTS).

## Request body

- ConverseRequest — Complete the open (final) turn of a conversation. Every turn except the last must carry ``text`` and/or ``audio_wav_b64`` (grounded history). The **last** turn is the one to generate: it may be ``speaker``-only (model authors text + audio) or ``speaker`` + ``text`` (render that text as contextual TTS). A last turn already carrying both text and audio has nothing to generate → ``400``; audio alone on the last turn is ignored — reference audio belongs on history turns.
  - `conversation` ConversationTurnModel[], required — The conversation, oldest turn first; the last turn is the open turn to complete.
    - `speaker` string — Role label for this turn (one of the model's `speakers`).
    - `text` string, nullable — Text spoken in this turn, if known.
    - `audio_wav_b64` string, nullable — Base64 16-bit PCM WAV of this turn's audio, if any.
  - `model` string, nullable — Public model id (see GET /v1/models). Omit/null for the default model.
  - `params` GenParamsModel — Generation knobs, all optional — the defaults are the tuned production sampling, shared by every generation endpoint (served with UI ranges at GET /v1/info).
    - `temperature` number
    - `acoustic_temperature` number, nullable — Temperature for the voice's fine acoustic detail; null = follow `temperature`.
    - `top_k` integer, nullable — Sample from the k most-likely tokens; null = full vocabulary.
    - `max_new_tokens` integer, nullable — Optional generation cap; null uses the model's remaining context window.
    - `audio_quality` 'low' | 'medium' | 'high' — Playback fidelity: high = full quality (default); lower tiers reduce fidelity, not payload size.

## Response `200`

Successful Response

- ConverseResponse
  - `request_id` string, required — Correlation id; identical to the `X-Request-ID` response header.
  - `model` string, required — Resolved public model id that served the request.
  - `reply` ConverseReply, required
    - `speaker` string, required
    - `text` string, required
    - `audio` AudioPayload
      - `format` string — Container/encoding of `data_b64` (16-bit PCM WAV).
      - `sample_rate` integer, required — Sample rate of the audio in Hz.
      - `audio_quality` 'low' | 'medium' | 'high', required — Fidelity tier this audio was rendered at (high = full quality).
      - `data_b64` string, required — Base64-encoded 16-bit PCM WAV (mono).
  - `usage` Usage, required
    - `input_chars` integer — Characters of input text billed for this request.
    - `input_audio_seconds` number — Seconds of input audio supplied (converse).
    - `output_audio_seconds` number — Seconds of audio generated.
  - `meta` object

## Other responses

- `400` — Semantically invalid request.
- `401` — Missing or invalid API key.
- `422` — Request validation failed.
- `429` — Rate limit exceeded.
- `500` — Unexpected internal error.
- `502` — The inference backend failed.
- `503` — API-key verification is temporarily unavailable.

---

[API](https://skmtc.net/kalpalabs/apis/kalpa-speech-api.md) · [All operations](https://skmtc.net/kalpalabs/apis/kalpa-speech-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/kalpalabs/kalpa-speech-api/versions/60add3abf640/schema)
