For the complete documentation index, see llms.txt. This page is also available as Markdown.

Voice Configuration

Configure per-service voice latency, fillers, barge-in, response limits, provider inheritance, call forwarding, and conversation tool availability.

Every voice service has a voice_config object that controls how the real-time pipeline behaves during calls. It covers latency tuning, filler behavior, response length limits, barge-in sensitivity, emotion modulation, voice model and TTS provider selection, and tool access. If you leave voice_config null, the service has no service-level overrides.

Each field is optional, but inheritance depends on the field. session_provider resolves service > agent > environment. tts_provider resolves service > agent > workspace > environment. Per-language maps check the exact language, base language, and multilingual key in that order, with service > agent > workspace precedence within each key. Unset tuning fields use their runtime defaults.

Field Reference

Latency

These fields control how quickly the agent responds after the caller stops speaking.

Field
Type
Default
Description

max_buffer_delay_ms

int (200-1000)

500

How long the pipeline buffers generated text before sending it to TTS. Lower values make the agent start speaking sooner, but may produce choppier speech because each TTS chunk has less context.

eager_eot_threshold

float (0.0-1.0)

inherited

End-of-turn confidence threshold. Higher values make the system more aggressive about deciding the caller has finished talking. A value of 0.8 means "start responding when 80% confident the caller is done." Lower values reduce latency but increase the chance of cutting the caller off mid-sentence.

eot_timeout_ms

int

inherited

Hard silence timeout in milliseconds. If the caller stops speaking for this long, the system forces an end-of-turn regardless of the confidence score. Useful as a safety net for the confidence-based detection.

post_eot_pause_ms

int

200

Intentional breath after the caller stops speaking, in milliseconds.

transition_deadline_ms

int

800

Maximum silence after caller end-of-turn before a filler is injected, in milliseconds.

empathy_hold_ms

int

500

Intentional silence held for empathy moments, in milliseconds.

Fillers

Fillers are the short sounds or phrases the agent produces while the LLM generates the full response. They fill what would otherwise be dead air.

Field
Type
Default
Description

filler_style

"backchannel", "phrase", or "silent"

"backchannel"

Controls the agent's autonomous fillers. Only silent changes runtime behavior: it mutes the agent's autonomous backchannels (the navigation acknowledgment and tool-wait acknowledgments). backchannel and phrase are currently advisory: the per-tool wait style is driven by the context graph's progress hints, not this field. Explicit context graph progress phrases still play even under silent.

filler_vocabulary

list[str]

null

Custom words for the short acknowledgment played when navigation is skipped (e.g., ["Mm", "Yeah", "Mhm"]). Does not change tool-execution wait phrases - those come from progress_vocabulary or the context graph's progress phrases.

backchannel_delay_ms

int (400-1000)

400

How many milliseconds the pipeline waits before playing a backchannel when navigation is skipped (the caller said something that doesn't require a state change). Lower values make the agent feel more responsive; higher values feel more deliberate.

progress_vocabulary

list[str]

null

Custom phrases for the tool-execution wait filler (distinct from filler_vocabulary). Ignored when the active tool's context graph progress hint is deterministic - scripted progress phrases play verbatim in that case.

filler_cooldown_ms

int

2000

Minimum gap in milliseconds between consecutive fillers.

progress_interval_ms

int

3000

How often to produce progress audio during tool execution, in milliseconds.

Response

Response limits are applied while generated text is consumed. Sentence counting is approximate across streamed fragments; these settings are not exact bounds on an utterance a caller will hear.

Field
Type
Default
Description

max_response_sentences

int

null (unlimited)

Streamed-response sentence cap. Counting is approximate across streamed fragments.

max_response_words

int

null (unlimited)

Streamed-response word cap, enforced while consuming generated text.

Barge-in

Barge-in is when the caller interrupts agent speech. Recognition, the service minimum speech duration, and active turn policy govern the greeting as well as later speech. There is no separate greeting-shield setting; the runtime default minimum is 500ms.

Field
Type
Default
Description

barge_in_min_speech_s

float

0.5

Minimum caller-speech duration used by barge-in detection. Detection also depends on the active turn policy and audio path; the main path checks recognized words and additional gates. This setting does not guarantee that every short interjection interrupts or that noise can never interrupt.

barge_in_cooldown_s

float

1.5

Cooldown period after a barge-in before another one can fire. Prevents rapid-fire interruptions where the caller and agent keep cutting each other off.

Emotion Modulation

Field
Type
Default
Description

min_tts_speed

float (0.5-1.0) or null

null (no floor)

Minimum TTS speed the empathy engine can set. The empathy system reduces speaking speed after detecting caller distress, but without a floor the reduction can make the agent sound unnaturally slow. Set this to prevent over-modulation while preserving the warmth response. Values are relative to normal speed (e.g., 0.85 means the agent never drops below 85% of normal speed).

Voice Model and TTS Provider

Field
Type
Default
Description

session_provider

"amigo" or "gpt_realtime"

inherited

Overrides the voice model family at the service level. Null inherits the agent value and then the environment default.

tts_provider

"cartesia" or "elevenlabs"

inherited

Overrides the TTS provider at the service level. Null inherits from the agent, then the workspace; see Default TTS Model when none is named.

tts_config

object

null

Provider-specific configuration bag; keys depend on tts_provider.

language_providers

object

null

Per-language TTS provider map (up to 10 entries). Keys are BCP-47 language codes or multilingual.

realtime

object

null

Realtime session controls. Requires session_provider gpt_realtime; see Realtime Session Models.

Realtime Session Models

On the gpt_realtime runtime, realtime.model accepts gpt-realtime-2.1, the default, and gpt-realtime-2.1-mini. Caller-audio transcription, realtime.transcription.model, accepts gpt-transcribe, which is also its default. Other ids return 422, including gpt-realtime-1.5, gpt-realtime-2, whisper-1, gpt-4o-mini-transcribe, and gpt-4o-transcribe, which were accepted before October 9, 2026. realtime.reasoning_effort is accepted with either model.

Default TTS Model

A call or voice note whose service, agent, and workspace name no tts_provider speaks Cartesia when any TTS setting is stored: a workspace voice_id, tts_model, pronunciation_dict_id, or tts_config, an agent voice_config with a voice_id or tts_config, or a service tts_config. With none of these stored, the call speaks ElevenLabs eleven_v4_turbo with the ElevenLabs default voice. That default replaced Cartesia Sonic 3.6 on October 12, 2026. A matching language_providers entry still decides the provider for its language. To keep an unconfigured service on Cartesia, set tts_provider to cartesia.

When the resolved configuration stores no model, Cartesia calls use Sonic 3.6 (sonic-3.6-2026-08-27). It replaced Sonic 3.5 as the default on October 8, 2026, and Sonic 3.5 is no longer a platform default. Voice IDs, speed, volume, and other request settings carry over unchanged. ElevenLabs calls with no stored model use eleven_v4_turbo, which replaced eleven_flash_v2_5 as the default on October 9, 2026.

A stored model always wins over the default: tts_config.model at the workspace, agent, or service level, or a per-language entry's config.model. To keep a call on a specific model, pin it in the service tts_config.model. The service voice_config.tts_model field was removed on October 9, 2026: a request that sends it is accepted, but the value is ignored, and a stored value no longer selects a model. A matching language_providers entry, including multilingual, brings only its own config, so pin the model in that entry's config.model too. An entry without one uses the default even when the base config pins a model.

Retired Cartesia Models

Cartesia stops serving some models, and a call pinned to one would produce no audio. When the resolved model is one of these, the call uses Sonic 3.6 instead. Voice, speed, volume, tone, and language settings are unchanged, and the stored configuration is not rewritten.

The remap covers sonic, sonic-english, sonic-multilingual, sonic-2024-10-19, sonic-2024-12-12, sonic-2 and its snapshots, sonic-turbo and its snapshots, and sonic-3-2025-10-27. Cartesia retires sonic-2, sonic-turbo, and sonic-3-2025-10-27 after October 20, 2026. Since October 10, 2026, it also covers the superseded Sonic 3 and Sonic 3.5 ids: sonic-3, sonic-3-preview, sonic-3-2026-01-12, sonic-3.5, and sonic-3.5-2026-05-04. sonic-3.6, sonic-preview, and ids the platform does not recognize are sent as stored.

This applies to every place a model can be stored. Replace retired pins with a current model so the configuration shows what the call speaks.

Retired ElevenLabs Models

A stored ElevenLabs pin of eleven_flash_v2_5, eleven_flash_v2, eleven_turbo_v2_5, eleven_turbo_v2, eleven_multilingual_v2, eleven_multilingual_v1, or eleven_monolingual_v1 uses eleven_v4_turbo instead, on live calls and audio-turn voice notes. The Developer Console's ElevenLabs settings save eleven_multilingual_v2, so those services move too. The voice and stored configuration are unchanged.

On eleven_v4_turbo, only stability is applied. It defaults to 0.5; configuration or a sympathetic tone can change it. style and speed, whether configured or emotion-driven, and stored similarity_boost and use_speaker_boost have no effect on this model. A service that depends on a slower or faster speaking rate should be re-tested.

ElevenLabs voice runs only eleven_v3* and eleven_v4* models. A stored model that is neither one of those nor a retired id listed above, for example a bare v3, eleven_ttv_v3, eleven_english_sts_v2, or a case variant such as Eleven_v4_turbo, now fails the voice session at setup with an error naming the id, instead of connecting a call that never speaks. Pin a current eleven_v3* or eleven_v4* id, or leave the model unset to use the default.

A call to a caller whose record has no language speaks the workspace language, so a Spanish or Arabic workspace no longer speaks English to those callers.

Call Forwarding

A service destination must also be on the provisioned voice use case's allowed_forwarding_numbers. Confirm the Channel Manager forwarding restrictions before using transfers.

Configure forwarding in voice_config.forwarding. Omitting that block or setting it to null leaves the forwarding tool unavailable. When present, choose warm or cold transfer explicitly and configure either a fixed destination or dynamic destination mode. There is no workspace-number fallback.

A fixed destination sets forward_to to one E.164 number. Dynamic mode sets forward_to to null and lists every number a transfer may dial in approved_destinations, a map of E.164 number to a label for what answers there, such as {"+16095550199": "Scheduling desk"}, with up to 50 entries. The agent picks from those numbers and sees their labels. Any other number is refused without dialing, and a dynamic block with no approved destinations offers no forward_call tool. Setting approved_destinations with a fixed forward_to returns 422.

The removed forward_call_enabled flag is not the current enablement control. The embedded service schema is authoritative for the forwarding object. Active turn policy can further restrict forwarding. See Call Forwarding for the hold and answer-handling sequence.

Named Presets

Agent Forge exposes four named presets. A preset sets multiple fields at once as a starting configuration.

Preset
TTS Model
Buffer Delay
Filler Style
Backchannel Delay
Response Cap
Best For

ultra_low_latency

(default)

200ms

backchannel

400ms

1 sentence

Quick intake, high-volume triage, yes/no flows

balanced

(default)

500ms

(default)

(default)

(unlimited)

General-purpose conversations

quality

(default)

500ms

phrase

(default)

(unlimited)

Sensitive topics, empathetic conversations where natural speech quality matters more than speed

gpt_realtime

n/a

n/a

n/a

n/a

n/a

Realtime speech-to-speech provider selection where enabled

Presets are a starting point. You can apply a preset and then override individual fields on top of it. Presets no longer select a Cartesia model: the tts_model value they set is ignored, so pin a model in tts_config.model when you need one.

API Usage

Voice config is a field on the service model. You set it when creating or updating a service.

Setting voice config via PUT

Update a service

put

Update a service's configuration. Requires Service.update permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
service_idstring · uuidRequired
Body
namestring · min: 1 · max: 256 · nullableOptional
descriptionstring · max: 2000 · nullableOptional
agent_idstring · uuid · nullableOptional
context_graph_idstring · uuid · nullableOptional
keytermsstring[] · max: 500 · nullableOptional
is_activeboolean · nullableOptional
tool_capacityinteger · min: 1 · max: 10 · nullableOptional
channel_typestring · enum · nullableOptionalPossible values:
environmentstring · enum · nullableOptionalPossible values:
Responses
200

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
namestringRequired
descriptionstringRequired
agent_idstring · uuidRequired
context_graph_idstring · uuidRequired
agent_namestring · nullableOptional
context_graph_namestring · nullableOptional
keytermsstring[]Required
is_activebooleanRequired
tool_capacityintegerRequired
channel_typestring · enumOptionalDefault: voicePossible values:
environmentstring · enumOptionalDefault: productionPossible values:
is_systembooleanOptionalDefault: false
created_atstring · date-timeRequired
updated_atstring · date-timeRequired
put/v1/{workspace_id}/services/{service_id}
PUT /v1/{workspace_id}/services/{service_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 1911

{
  "name": "text",
  "description": "text",
  "agent_id": "123e4567-e89b-12d3-a456-426614174000",
  "context_graph_id": "123e4567-e89b-12d3-a456-426614174000",
  "keyterms": [
    "text"
  ],
  "is_active": true,
  "version_sets": {
    "ANY_ADDITIONAL_PROPERTY": {
      "agent_version_number": 1,
      "context_graph_version_number": 1,
      "llm_model_preferences": {
        "ANY_ADDITIONAL_PROPERTY": {
          "llm_name": "text",
          "params": {
            "ANY_ADDITIONAL_PROPERTY": "anything"
          },
          "experience_controls": {
            "reasoning_effort": "none",
            "temperature": 1,
            "top_p": 1
          }
        }
      }
    }
  },
  "tags": [
    {
      "key": "text",
      "value": "text"
    }
  ],
  "tool_capacity": 1,
  "channel_type": "voice",
  "environment": "sandbox",
  "voice_config": {
    "max_buffer_delay_ms": 1,
    "eager_eot_threshold": 1,
    "eot_timeout_ms": 1,
    "filler_style": "backchannel",
    "filler_vocabulary": [
      "text"
    ],
    "backchannel_delay_ms": 400,
    "max_response_sentences": 1,
    "max_response_words": 1,
    "barge_in_min_speech_s": 1,
    "barge_in_cooldown_s": 1,
    "min_tts_speed": 1,
    "post_eot_pause_ms": 1,
    "transition_deadline_ms": 1,
    "progress_interval_ms": 1,
    "empathy_hold_ms": 1,
    "filler_cooldown_ms": 1,
    "progress_vocabulary": [
      "text"
    ],
    "tts_provider": "cartesia",
    "tts_config": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "language_providers": {
      "ANY_ADDITIONAL_PROPERTY": {
        "provider": "cartesia",
        "config": {
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      }
    },
    "session_provider": "amigo",
    "realtime": {
      "model": "gpt-realtime-2.1",
      "voice": "alloy",
      "speed": 1,
      "noise_reduction": "near_field",
      "transcription": {
        "model": "gpt-transcribe",
        "language": "text",
        "prompt": "text"
      },
      "turn_detection": {
        "type": "server_vad",
        "threshold": 1,
        "prefix_padding_ms": 1,
        "silence_duration_ms": 1,
        "idle_timeout_ms": 1
      },
      "reasoning_effort": "low",
      "max_output_tokens": 1,
      "truncation": {
        "type": "auto",
        "retention_ratio": 1,
        "post_instructions_tokens": 1
      },
      "required_tool_on_first_caller_turn": "text"
    },
    "forwarding": {
      "forward_to": "text",
      "warm_transfer": true,
      "approved_destinations": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  },
  "accepted_context": [
    {
      "key": "text",
      "type": "string",
      "description": "text",
      "required": true
    }
  ]
}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "name": "text",
  "description": "text",
  "agent_id": "123e4567-e89b-12d3-a456-426614174000",
  "context_graph_id": "123e4567-e89b-12d3-a456-426614174000",
  "agent_name": "text",
  "context_graph_name": "text",
  "keyterms": [
    "text"
  ],
  "is_active": true,
  "version_sets": {
    "ANY_ADDITIONAL_PROPERTY": {
      "agent_version_number": 1,
      "context_graph_version_number": 1,
      "llm_model_preferences": {
        "ANY_ADDITIONAL_PROPERTY": {
          "llm_name": "text",
          "params": {
            "ANY_ADDITIONAL_PROPERTY": "anything"
          },
          "experience_controls": {
            "reasoning_effort": "none",
            "temperature": 1,
            "top_p": 1
          }
        }
      }
    }
  },
  "tags": [
    {
      "key": "text",
      "value": "text"
    }
  ],
  "tool_capacity": 1,
  "channel_type": "voice",
  "environment": "production",
  "voice_config": {
    "max_buffer_delay_ms": 1,
    "eager_eot_threshold": 1,
    "eot_timeout_ms": 1,
    "filler_style": "backchannel",
    "filler_vocabulary": [
      "text"
    ],
    "backchannel_delay_ms": 400,
    "max_response_sentences": 1,
    "max_response_words": 1,
    "barge_in_min_speech_s": 1,
    "barge_in_cooldown_s": 1,
    "min_tts_speed": 1,
    "post_eot_pause_ms": 1,
    "transition_deadline_ms": 1,
    "progress_interval_ms": 1,
    "empathy_hold_ms": 1,
    "filler_cooldown_ms": 1,
    "progress_vocabulary": [
      "text"
    ],
    "tts_provider": "cartesia",
    "tts_config": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "language_providers": {
      "ANY_ADDITIONAL_PROPERTY": {
        "provider": "cartesia",
        "config": {
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      }
    },
    "session_provider": "amigo",
    "realtime": {
      "model": "gpt-realtime-2.1",
      "voice": "alloy",
      "speed": 1,
      "noise_reduction": "near_field",
      "transcription": {
        "model": "gpt-transcribe",
        "language": "text",
        "prompt": "text"
      },
      "turn_detection": {
        "type": "server_vad",
        "threshold": 1,
        "prefix_padding_ms": 1,
        "silence_duration_ms": 1,
        "idle_timeout_ms": 1
      },
      "reasoning_effort": "low",
      "max_output_tokens": 1,
      "truncation": {
        "type": "auto",
        "retention_ratio": 1,
        "post_instructions_tokens": 1
      },
      "required_tool_on_first_caller_turn": "text"
    },
    "forwarding": {
      "forward_to": "text",
      "warm_transfer": true,
      "approved_destinations": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  },
  "accepted_context": [
    {
      "key": "text",
      "type": "string",
      "description": "text",
      "required": true
    }
  ],
  "is_system": false,
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

The voice_config object is replaced wholesale, not merged. Merge behavior on service update applies only across other top-level service fields - within voice_config, whatever you send becomes the entire config. To change one field, send the full object: read the current config via GET, modify the field, and PUT the complete object back.

A partial body like this:

changes the filler style, but it also drops every omitted nullable field (max_buffer_delay_ms, eot_timeout_ms, and so on return to their field-specific inheritance or runtime defaults) and resets defaulted fields to their defaults (backchannel_delay_ms to 400, forwarding to null).

Reading current config

The service response includes the full voice_config object:

Get a service

get

Retrieve a service by ID. Requires Service.view permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
service_idstring · uuidRequired
Responses
200

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
namestringRequired
descriptionstringRequired
agent_idstring · uuidRequired
context_graph_idstring · uuidRequired
agent_namestring · nullableOptional
context_graph_namestring · nullableOptional
keytermsstring[]Required
is_activebooleanRequired
tool_capacityintegerRequired
channel_typestring · enumOptionalDefault: voicePossible values:
environmentstring · enumOptionalDefault: productionPossible values:
is_systembooleanOptionalDefault: false
created_atstring · date-timeRequired
updated_atstring · date-timeRequired
get/v1/{workspace_id}/services/{service_id}
GET /v1/{workspace_id}/services/{service_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "name": "text",
  "description": "text",
  "agent_id": "123e4567-e89b-12d3-a456-426614174000",
  "context_graph_id": "123e4567-e89b-12d3-a456-426614174000",
  "agent_name": "text",
  "context_graph_name": "text",
  "keyterms": [
    "text"
  ],
  "is_active": true,
  "version_sets": {
    "ANY_ADDITIONAL_PROPERTY": {
      "agent_version_number": 1,
      "context_graph_version_number": 1,
      "llm_model_preferences": {
        "ANY_ADDITIONAL_PROPERTY": {
          "llm_name": "text",
          "params": {
            "ANY_ADDITIONAL_PROPERTY": "anything"
          },
          "experience_controls": {
            "reasoning_effort": "none",
            "temperature": 1,
            "top_p": 1
          }
        }
      }
    }
  },
  "tags": [
    {
      "key": "text",
      "value": "text"
    }
  ],
  "tool_capacity": 1,
  "channel_type": "voice",
  "environment": "production",
  "voice_config": {
    "max_buffer_delay_ms": 1,
    "eager_eot_threshold": 1,
    "eot_timeout_ms": 1,
    "filler_style": "backchannel",
    "filler_vocabulary": [
      "text"
    ],
    "backchannel_delay_ms": 400,
    "max_response_sentences": 1,
    "max_response_words": 1,
    "barge_in_min_speech_s": 1,
    "barge_in_cooldown_s": 1,
    "min_tts_speed": 1,
    "post_eot_pause_ms": 1,
    "transition_deadline_ms": 1,
    "progress_interval_ms": 1,
    "empathy_hold_ms": 1,
    "filler_cooldown_ms": 1,
    "progress_vocabulary": [
      "text"
    ],
    "tts_provider": "cartesia",
    "tts_config": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "language_providers": {
      "ANY_ADDITIONAL_PROPERTY": {
        "provider": "cartesia",
        "config": {
          "ANY_ADDITIONAL_PROPERTY": "anything"
        }
      }
    },
    "session_provider": "amigo",
    "realtime": {
      "model": "gpt-realtime-2.1",
      "voice": "alloy",
      "speed": 1,
      "noise_reduction": "near_field",
      "transcription": {
        "model": "gpt-transcribe",
        "language": "text",
        "prompt": "text"
      },
      "turn_detection": {
        "type": "server_vad",
        "threshold": 1,
        "prefix_padding_ms": 1,
        "silence_duration_ms": 1,
        "idle_timeout_ms": 1
      },
      "reasoning_effort": "low",
      "max_output_tokens": 1,
      "truncation": {
        "type": "auto",
        "retention_ratio": 1,
        "post_instructions_tokens": 1
      },
      "required_tool_on_first_caller_turn": "text"
    },
    "forwarding": {
      "forward_to": "text",
      "warm_transfer": true,
      "approved_destinations": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  },
  "accepted_context": [
    {
      "key": "text",
      "type": "string",
      "description": "text",
      "required": true
    }
  ],
  "is_system": false,
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

Fields that are null apply no service-level override. Depending on the field, the runtime then consults agent, workspace, or environment configuration, or uses a runtime default. See Field-Specific Resolution.

CLI Usage

The forge CLI provides a shorthand for voice config operations.

Apply a preset

This sets all the fields in the preset at once.

Set individual fields

Read current config

Field-Specific Resolution

Voice settings do not use one universal first-non-null cascade. Resolution depends on the field:

Configuration
Resolution order

Session provider

Service, then agent, then environment

Flat TTS provider

Service, then agent, then workspace. With none named, Cartesia when any TTS setting is stored, otherwise ElevenLabs; see Default TTS Model

Per-language TTS provider

Exact language, base language, then multilingual; for each key, service, then agent, then workspace

TTS provider configuration and model

Workspace settings form the base, agent tts_config overrides them, and service tts_config overrides both; unresolved values use the environment configuration. When a per-language entry selects the provider, that entry's config replaces the merged base provider config

Service tuning fields

The service value applies when set; otherwise the field's documented runtime default or supported fallback applies

Workspace Voice Settings

Workspace Voice Settings provide baseline voice identity, tone, speed, volume, language, keyterms, and sensitive topics. See Workspaces for how those settings interact with service overrides.

Get voice settings

get

Get the voice experience settings for a workspace.

Returns voice identity, domain vocabulary, and post-call intelligence configuration. These settings shape how the AI agent sounds and what domain-specific terms it recognizes accurately.

Permissions

  • Requires authenticated API key (any role).
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Responses
200

Successful Response

application/json

Voice experience state — what the PM configured.

voice_idstring · nullableRequired
tonestring · nullableRequired
speednumber · nullableRequired
volumenumber · nullableRequired
languagestringRequired
keytermsstring[]Required
pronunciation_dict_idstring · nullableRequired
sensitive_topicsstring[]Required
post_call_analysis_enabledbooleanRequired
stt_providerstring · enum · nullableRequiredPossible values:
tts_providerstring · enum · nullableRequiredPossible values:
get/v1/{workspace_id}/settings/voice
GET /v1/{workspace_id}/settings/voice HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "voice_id": "text",
  "tone": "text",
  "speed": 1,
  "volume": 1,
  "language": "text",
  "keyterms": [
    "text"
  ],
  "pronunciation_dict_id": "text",
  "sensitive_topics": [
    "text"
  ],
  "post_call_analysis_enabled": true,
  "stt_provider": "deepgram",
  "tts_provider": "cartesia",
  "tts_config": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "language_providers": {
    "ANY_ADDITIONAL_PROPERTY": {
      "provider": "cartesia",
      "config": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  }
}

Update voice settings

put

Update the voice experience settings for a workspace.

Only provided fields are updated; omitted fields retain their current values. Set a field to null to reset it to default.

Voice Identity & Style

  • voice_id: Voice identity UUID — determines the agent's voice persona
  • tone: Emotional baseline (calm, sympathetic, enthusiastic, content, curious, cheerful, serious, friendly). The system also adapts tone dynamically based on real-time caller emotion analysis; this setting provides the baseline when no strong emotional signal is detected.
  • speed: Speech rate multiplier (0.5-2.0)
  • volume: Volume multiplier (0.0-1.0)
  • language: BCP-47 language tag (default en)

Speech Recognition Boost

  • keyterms: Exact words the speech recognition engine should prioritize. Use for specific names, drug names, and org jargon. Example: ["Dr. Ramirez", "metformin", "HIPAA"]

Post-Call Intelligence

  • post_call_analysis_enabled: Run automated quality scoring after each call ends (default true)

Permissions

  • Requires admin or owner role.
Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Body

Voice experience control plane — PM-facing, high-level controls.

Controls the caller experience without exposing engineering internals. Emotion detection, filler speech, model selection, and buffer tuning are always-on internals managed by engineering.

voice_idstring · max: 128 · nullableOptional
tonestring · max: 2000 · nullableOptional
speednumber · nullableOptional
volumenumber · nullableOptional
languagestring · max: 32 · nullableOptional
keytermsstring[] · max: 200 · nullableOptional
pronunciation_dict_idstring · max: 128 · nullableOptional
sensitive_topicsstring[] · max: 50 · nullableOptional
post_call_analysis_enabledboolean · nullableOptional
stt_providerstring · enum · nullableOptionalPossible values:
tts_providerstring · enum · nullableOptionalPossible values:
Responses
200

Successful Response

application/json

Voice experience state — what the PM configured.

voice_idstring · nullableRequired
tonestring · nullableRequired
speednumber · nullableRequired
volumenumber · nullableRequired
languagestringRequired
keytermsstring[]Required
pronunciation_dict_idstring · nullableRequired
sensitive_topicsstring[]Required
post_call_analysis_enabledbooleanRequired
stt_providerstring · enum · nullableRequiredPossible values:
tts_providerstring · enum · nullableRequiredPossible values:
put/v1/{workspace_id}/settings/voice
PUT /v1/{workspace_id}/settings/voice HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 410

{
  "voice_id": "text",
  "tone": "text",
  "speed": 1,
  "volume": 1,
  "language": "text",
  "keyterms": [
    "text"
  ],
  "pronunciation_dict_id": "text",
  "sensitive_topics": [
    "text"
  ],
  "post_call_analysis_enabled": true,
  "stt_provider": "deepgram",
  "tts_provider": "cartesia",
  "tts_config": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "language_providers": {
    "ANY_ADDITIONAL_PROPERTY": {
      "provider": "cartesia",
      "config": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  }
}
{
  "voice_id": "text",
  "tone": "text",
  "speed": 1,
  "volume": 1,
  "language": "text",
  "keyterms": [
    "text"
  ],
  "pronunciation_dict_id": "text",
  "sensitive_topics": [
    "text"
  ],
  "post_call_analysis_enabled": true,
  "stt_provider": "deepgram",
  "tts_provider": "cartesia",
  "tts_config": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "language_providers": {
    "ANY_ADDITIONAL_PROPERTY": {
      "provider": "cartesia",
      "config": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  }
}

Context Graph TurnPolicy and channel overrides control separate state- and channel-specific behavior. They can gate capabilities or alter objectives and guidance, but they are not additional tiers in a generic voice-setting cascade.

Turn-Level Emotion Selection

During each turn, the voice pipeline selects an emotional tone alongside the state transition, based on the caller's emotional state and the conversation context. The selected tone is applied to the entire response - the filler and the main response share it - so each turn is spoken with one consistent voice.

Available Emotions

The pipeline chooses from eight emotions:

Emotion
When to use

friendly

Default warmth. General conversations, greetings, confirmations.

sympathetic

Caller is frustrated, upset, or sharing bad news.

calm

Sensitive topics, de-escalation, anxious callers.

enthusiastic

Positive outcomes, good news, caller is excited.

serious

Important information, disclaimers, medical details.

cheerful

Light conversations, small talk, closing on a positive note.

curious

Asking clarifying questions, exploring a topic.

content

Neutral satisfaction. Wrapping up, confirmations after a good interaction.

Because the tone applies to the whole utterance, the prosody stays consistent from the first filler word to the end of the response - there are no uncanny emotional shifts partway through a sentence.

The empathy system can override the turn-level selection at higher tiers. At Tier 2 (full empathy), the system forces warmth regardless of the selected emotion. At Tier 3 (hold space), filler is suppressed entirely and silence replaces speech.

Last updated

Was this helpful?