---
title: "Update Call Agent"
method: PATCH
path: "/v2/call-agent"
tags: ["call-agent"]
---

# Update Call Agent

`PATCH /v2/call-agent`

## Request

- Base URL: `https://api.stuut.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stuut.ai/v2/call-agent`
- Auth: HTTP bearer

Update Call Agent

Update voice and personality settings for the organization's call agent.

## Request body

- UpdateCallAgentRequest: Update call agent voice and personality settings.
  - `end_call_on_recording_refusal` boolean, nullable: Whether to hang up the call if the user does not consent to recording
  - `recording_disclaimer_required` boolean, nullable: Whether the call agent must include the recording disclaimer. Only Stuut staff can update this field.
  - `outbound_begin_message` string, nullable: The opening line of the call agent.
  - `outbound_voicemail_message` string, nullable: The complete LiveKit voicemail template, translated to the call language. Null or blank uses the default.
  - `voice_id` string, nullable: Voice DB ID (vce_...)
  - `voice_speed` 'slowest' | 'slow' | 'normal' | 'fast' | 'fastest'
  - `voice_temperature` number, nullable: Voice temperature 0.0-2.0
  - `language_code` string, nullable: BCP-47 starting language for the call agent (e.g. 'en-US', 'nl-NL'). When stt_mode=AUTO, this is the starting hint (observer may swap). When stt_mode=OFF, this is a hard pin and required. Overridden per-call by partner.retell_language_code when set.
  - `stt_mode` 'auto' | 'flux' | 'off' | 'scribe': STT model selection mode for voice agents. AUTO: Multilingual Scribe (never pinned) + LanguageObserver hot-swaps STT to the detected language; a configured `language_code` is only a detection hint. FLUX: Legacy fixed-language preference. It respects the resolved partner/agent language and uses Flux only for English. Hidden from new UI; no observer. OFF: Fixed language — Flux for English, otherwise Nova-3 or pinned Scribe. No observer. SCRIBE: Legacy multilingual Scribe, no observer. Hidden from the UI; kept for existing rows.
  - `llm_model` 'openai/gpt-4.1' | 'openai/gpt-4.1-mini' | 'google/gemini-3-flash-preview' | 'google/gemini-3.1-flash-lite' | 'google/gemma-4-31b-it': LLM models, LiveKit Inference form (``<provider>/<model>``). Staff-picker options are marked below (all stream + support tool calling). GEMINI_3_FLASH is the default primary, GEMINI_3_1_FLASH_LITE is the language observer, and GEMMA_4_31B is the backup. They are runtime choices, not staff picker options; PICKABLE_LLM_MODELS defines the explicit overrides.
  - `tts_model` 'eleven_flash_v2_5' | 'eleven_flash_v2' | 'eleven_multilingual_v2': Supported TTS client IDs; provider routing is separate from model inventory. ElevenLabs uses bare IDs with its direct client. English-only choices require a fixed English call, not an AUTO language hint.
  - `custom_prompt` string, nullable: Staff-only override for the base outbound prompt. Jinja-rendered against the call context. Include `{{ base_prompt }}` anywhere in the text to inject the rendered OUTBOUND_AGENT_TEMPLATE at that position; omit the token to fully replace the base prompt.

## Response `200`

Successful Response

- CallAgentResponse: Call agent with current voice details.
  - `id` string, required
  - `end_call_on_recording_refusal` boolean, required
  - `recording_disclaimer_required` boolean, required
  - `outbound_begin_message` string, nullable, required
  - `outbound_voicemail_message` string, nullable, required
  - `voice_id` string, nullable, required
  - `voice` VoiceSchema, required: A selectable voice and its provider-specific preview metadata.
    - `id` string, required
    - `name` string, nullable, required
    - `accent` string, nullable, required
    - `age` string, nullable, required
    - `gender` string, required
    - `provider` string, required
    - `preview_audio_url` string, nullable, required
  - `voice_speed` 'slowest' | 'slow' | 'normal' | 'fast' | 'fastest', required
  - `voice_temperature` number, required
  - `stt_mode` 'auto' | 'flux' | 'off' | 'scribe', required: STT model selection mode for voice agents. AUTO: Multilingual Scribe (never pinned) + LanguageObserver hot-swaps STT to the detected language; a configured `language_code` is only a detection hint. FLUX: Legacy fixed-language preference. It respects the resolved partner/agent language and uses Flux only for English. Hidden from new UI; no observer. OFF: Fixed language — Flux for English, otherwise Nova-3 or pinned Scribe. No observer. SCRIBE: Legacy multilingual Scribe, no observer. Hidden from the UI; kept for existing rows.
  - `llm_model` 'openai/gpt-4.1' | 'openai/gpt-4.1-mini' | 'google/gemini-3-flash-preview' | 'google/gemini-3.1-flash-lite' | 'google/gemma-4-31b-it', required: LLM models, LiveKit Inference form (``<provider>/<model>``). Staff-picker options are marked below (all stream + support tool calling). GEMINI_3_FLASH is the default primary, GEMINI_3_1_FLASH_LITE is the language observer, and GEMMA_4_31B is the backup. They are runtime choices, not staff picker options; PICKABLE_LLM_MODELS defines the explicit overrides.
  - `tts_model` 'eleven_flash_v2_5' | 'eleven_flash_v2' | 'eleven_multilingual_v2', required: Supported TTS client IDs; provider routing is separate from model inventory. ElevenLabs uses bare IDs with its direct client. English-only choices require a fixed English call, not an AUTO language hint.
  - `language_code` string, nullable, required
  - `custom_prompt` string, nullable, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/stuut/apis/stuut-api.md) - [All operations](https://skmtc.dev/stuut/apis/stuut-api/llms.txt) - [OpenAPI document](https://skmtc.dev/stuut/apis/stuut-api/revisions/3b5ab941f918?raw)
