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

# Update assistant

> Update an existing AI assistant's configuration

This endpoint allows you to update an existing AI assistant's configuration. All fields are optional - only provide the fields you want to update.

### Path Parameters

**id** `integer` *required*

The unique identifier of the assistant to update

### Request Body

#### Core Fields

**name** `string`

The name of the assistant (max 255 characters)

**voice\_id** `integer`

The voice ID to use for the assistant. Use the [Get Voices](https://docs.lacy.ai/api-reference/assistants/get-voices.md) endpoint with the `mode` parameter to get compatible voices for your engine mode.

**language\_id** `integer`

The language ID for the assistant. Use the [Get Languages](https://docs.lacy.ai/api-reference/assistants/get-languages.md) endpoint to get available languages.

**type** `string`

The assistant type. Options: `inbound`, `outbound`

**mode** `string`

The engine mode. Options: `pipeline`, `multimodal`, `dualplex`

> [!WARNING]
>
> Changing the mode will reset mode-specific settings to defaults for the new mode.

**timezone** `string`

The timezone for the assistant (e.g., "Europe/Bucharest", "America/New\_York")

**initial\_message** `string`

The initial message the assistant will speak when the call starts (max 200 characters)

**system\_prompt** `string`

The system prompt that defines the assistant's behavior and personality

#### Mode-Specific Fields

**llm\_model\_id** `integer`

The LLM model ID to use. Only applies to `pipeline` mode.

Use the [Get Models](https://docs.lacy.ai/api-reference/assistants/get-models.md) endpoint to get available models.

**multimodal\_model\_id** `integer`

The multimodal model ID. Only applies to `multimodal` and `dualplex` modes.

Use the [Get Models](https://docs.lacy.ai/api-reference/assistants/get-models.md) endpoint to get available multimodal models.

**chat\_llm\_fallback\_id** `integer`

Fallback LLM model ID for tool calls in multimodal/dualplex modes. Set to `null` to remove.

**turn\_detection\_threshold** `number`

Turn detection sensitivity for multimodal/dualplex modes (0-1). Set to `null` for auto.

#### Secondary Languages

**secondary\_language\_ids** `integer[]`

Array of additional language IDs the assistant can speak. Replaces existing secondary languages. Pass an empty array `[]` to remove all secondary languages.

```json theme={null}
"secondary_language_ids": [2, 3, 4]
```

#### Knowledgebase Settings

**knowledgebase\_id** `integer`

The knowledgebase ID to attach. Set to `null` to remove knowledgebase.

**knowledgebase\_mode** `string`

How to use the knowledgebase. Options:

* `function_call` - AI calls a function to search (required for multimodal/dualplex)
* `prompt` - Knowledge is injected into prompt (pipeline only)

#### Phone Number

**phone\_number\_id** `integer`

The ID of a phone number to assign. Set to `null` to unassign. Must belong to your account.

> [!WARNING]
>
> For `inbound` assistants, the phone number cannot be a Caller ID type and cannot be already assigned to another inbound assistant.

#### Custom Mid-Call Tools

**tool\_ids** `integer[]`

Array of custom mid-call tool IDs to sync. **Replaces all existing tool assignments.** Pass an empty array `[]` to remove all tools. Each tool must belong to your account.

```json theme={null}
"tool_ids": [1, 5, 12]
```

#### Built-in Tools

**tools** `array`

Array of built-in tools. **Replaces all existing built-in tools.** Pass an empty array `[]` to remove all tools.

**Tool types**

**call\_transfer** - Transfer the call to another phone number

* `phone_number` (required): Phone number to transfer to
* `description`: When to transfer the call
* `custom`: If true, AI can determine transfer number dynamically
* `timezone`: Timezone for transfer availability
* `warm_transfer`: Send a message to the customer before transferring (default: `false`)
* `warm_transfer_message`: Prompt telling the AI what to say before transferring (e.g., "Tell the customer that the call is being transferred.")

**warm\_call\_transfer** - Warm transfer with supervisor briefing

* `supervisor_phone` (required): Phone number to dial for the warm transfer (e.g., "+14155552001"). If `custom_sip` is enabled, this is a SIP address or internal extension instead.
* `outbound_phone_id` (required): ID of the phone number used to dial the supervisor.
* `description` (required): **When to transfer** — describes when the AI should initiate the warm transfer (e.g., "Transfer the call to a human supervisor when the customer requests to speak with a real person.")
* `custom_sip`: Enable to enter a custom SIP address or internal extension instead of a phone number (default: `false`)
* `caller_id_mode`: What phone number the supervisor sees when receiving the call. Options: `outbound_number` (default — shows the outbound phone number), `customer_number` (shows the caller's number), `custom` (shows a custom number)
* `custom_caller_id`: Custom phone number shown to supervisor. Only used when `caller_id_mode` is `custom`.
* `hold_music`: Audio played to the caller while on hold. Options: `hold_music` (default — plays default hold music), `none` (silence, no music)
* `hold_music_volume`: Volume level for hold music, 0-100 (default: `80`)
* `hold_message`: Message spoken to caller before placing them on hold (default: "Please hold while I connect you with a supervisor.")
* `summary_instructions`: Instructions for how the AI should brief the supervisor about the call (default: "Introduce the conversation from your perspective:\n- WHO is calling (name, company if mentioned)\n- WHY they called (their goal or problem)\n- WHY a human is needed at this point\n\nKeep it brief (2-3 sentences).")
* `briefing_initial_message`: The first message the AI says to the supervisor when they answer (default: "Hello! I have a caller on the line who needs your assistance. May I brief you on the situation?")
* `connected_message`: Message spoken to caller after supervisor is connected (default: "You are now connected with a supervisor. I'll leave you to it.")

**end\_call** - End the call programmatically

* `description`: When the AI should end the call

**dtmf\_input** - Send DTMF tones (keypad input)

* `description`: When to use DTMF input (for IVR navigation)

**collect\_keypad** - Collect keypad input from the caller

* `timeout`: Seconds to wait for input, 1-30 (default: 5)
* `stop_key`: Key that ends input. Options: `#` (default), `*`

**calendar\_integration** - Schedule appointments via Cal.com

* `calcom_api_key` (required): Your Cal.com API key
* `calcom_event_slug` (required): The event type slug from Cal.com
* `calcom_team_slug`: Team slug if the event belongs to a Cal.com team
* `calcom_endpoint`: Cal.com API region. Options: `us` (default — `https://api.cal.com`), `eu` (`https://api.cal.eu`), `custom` (uses `calcom_custom_endpoint`)
* `calcom_custom_endpoint`: Custom Cal.com API base URL. Only used when `calcom_endpoint` is `custom` (e.g., `https://my-calcom-instance.com`).
* `calcom_booking_fields`: Array of custom booking fields for the event. Each field has:
  * `slug` (required): Field identifier
  * `type` (required): Field type (e.g., "text", "email", "phone", "select")
  * `label` (required): Display label
  * `required`: Whether the field is required (default: `false`)
  * `options`: Array of options for select fields
* `description`: When to offer scheduling

```json theme={null}
"tools": [
  {
    "type": "dtmf_input",
    "description": "Navigate IVR when needed"
  },
  {
    "type": "warm_call_transfer",
    "supervisor_phone": "+1234567890",
    "outbound_phone_id": 7,
    "description": "Transfer the call to a human supervisor when the customer requests to speak with a real person.",
    "custom_sip": false,
    "caller_id_mode": "outbound_number",
    "hold_music": "hold_music",
    "hold_music_volume": 80,
    "hold_message": "Please hold while I connect you with a supervisor.",
    "summary_instructions": "Introduce the conversation from your perspective:\n- WHO is calling (name, company if mentioned)\n- WHY they called (their goal or problem)\n- WHY a human is needed at this point\n\nKeep it brief (2-3 sentences).",
    "briefing_initial_message": "Hello! I have a caller on the line who needs your assistance. May I brief you on the situation?",
    "connected_message": "You are now connected with a supervisor. I'll leave you to it."
  },
  {
    "type": "collect_keypad",
    "timeout": 5,
    "stop_key": "#"
  },
  {
    "type": "end_call",
    "description": "End call when done"
  }
]
```

#### Voice and TTS Settings

**tts\_emotion\_enabled** `boolean`

Whether to enable emotional text-to-speech synthesis

**voice\_stability** `number`

Voice stability setting (0-1). Higher = more consistent voice

**voice\_similarity** `number`

Voice similarity setting (0-1). Higher = closer to original voice

**speech\_speed** `number`

Speech speed multiplier (0.7-1.2)

**llm\_temperature** `number`

LLM temperature setting (0-1). Lower = more deterministic

**synthesizer\_provider\_id** `integer`

Custom TTS provider ID. Set to `null` to use language default. Use the [Get Synthesizer Providers](https://docs.lacy.ai/api-reference/assistants/get-synthesizer-providers.md) endpoint to discover available providers.

**transcriber\_provider\_id** `integer`

Custom STT provider ID. Pipeline mode only. Set to `null` to use language default. Use the [Get Transcriber Providers](https://docs.lacy.ai/api-reference/assistants/get-transcriber-providers.md) endpoint to discover available providers.

#### Call Behavior Settings

**allow\_interruptions** `boolean`

Whether to allow caller interruptions.

> [!WARNING]
>
> Cannot be disabled for `multimodal` and `dualplex` modes.

**fillers** `boolean`

Whether to use filler audio during processing.

> [!WARNING]
>
> Only available for `pipeline` mode.

**filler\_config** `object`

Custom filler word profiles per category. Replaces existing filler config. Each category is an array of short phrases.

* `positive`: Filler words for positive/affirmative responses
* `negative`: Filler words for negative/neutral responses
* `question`: Filler words when processing a question
* `neutral`: Filler words for neutral acknowledgments

```json theme={null}
"filler_config": {
  "positive": ["Great!", "Perfect!"],
  "negative": ["Hmm.", "I see."],
  "question": ["Good question.", "Let me check."],
  "neutral": ["Ok.", "Noted."]
}
```

**record** `boolean`

Whether to record the call

**enable\_noise\_cancellation** `boolean`

Whether to enable noise cancellation

**wait\_for\_customer** `boolean`

If true, the assistant waits for the customer to speak first

#### Timing Settings

**max\_duration** `integer`

Maximum call duration in seconds (20-1200)

**max\_silence\_duration** `integer`

Maximum silence duration before re-engagement in seconds (1-360)

**max\_initial\_silence\_duration** `integer`

Maximum silence at call start before ending (1-120 seconds). Set to `null` to disable.

**ringing\_time** `integer`

Maximum ringing time before giving up (1-60 seconds)

#### Re-engagement Settings

**reengagement\_interval** `integer`

Re-engagement interval in seconds (7-600)

**reengagement\_prompt** `string`

Custom prompt for re-engagement messages (max 1000 characters). Set to `null` to use default.

#### Voicemail Settings

**end\_call\_on\_voicemail** `boolean`

Whether to end call when voicemail is detected

**voice\_mail\_message** `string`

Message to leave on voicemail before hanging up (max 1000 characters). Set to `null` to disable.

#### Endpoint Detection

**endpoint\_type** `string`

Voice activity detection type. Options: `vad`, `ai`

**endpoint\_sensitivity** `number`

Endpoint sensitivity level (0-5)

**interrupt\_sensitivity** `number`

Interrupt sensitivity level (0-5)

**min\_interrupt\_words** `integer`

Minimum words before interruption is allowed (0-10). Set to `null` to disable.

#### Ambient Sound

**ambient\_sound** `string`

Background ambient sound. Options: `off`, `office`, `city`, `forest`, `crowded_room`, `cafe`, `nature`

**ambient\_sound\_volume** `number`

Ambient sound volume level (0-1)

#### Webhook Configuration

**is\_webhook\_active** `boolean`

Whether webhook notifications are enabled

**webhook\_url** `string`

The webhook URL for post-call notifications. Set to `null` to remove.

**send\_webhook\_only\_on\_completed** `boolean`

Whether to send webhooks only on completed calls (not failed/no-answer)

**include\_recording\_in\_webhook** `boolean`

Whether to include recording URL in webhook payload

#### Post-Call Evaluation

**post\_call\_evaluation** `boolean`

Whether to enable AI post-call evaluation

**post\_call\_schema** `array`

Schema definition for post-call data extraction. Replaces existing schema.

**post\_call\_schema properties**

**name** `string` *required*

Field name (3-16 chars, lowercase, alphanumeric and underscores only)

**type** `string` *required*

Data type. Options: `string`, `number`, `bool`

**description** `string` *required*

Description of what this field represents (3-255 characters)

#### Variables

**variables** `object`

Key-value pairs of custom variables. **Replaces all existing variables.**

```json theme={null}
"variables": {
  "company_name": "Acme Corp",
  "product": "Premium Widget"
}
```

#### Conversation Ended Settings

**conversation\_inactivity\_timeout** `integer`

Minutes of chat inactivity before the conversation is considered ended (1-1440). Set to `null` to disable. Default: `30`

**conversation\_ended\_retrigger** `boolean`

Whether to allow re-triggering the conversation after it ends due to inactivity

**conversation\_ended\_webhook\_url** `string`

Webhook URL called when a chat conversation ends due to inactivity. Set to `null` to remove. Separate from the main call webhook.

***

## Example Requests

### Update Basic Settings

```json theme={null}
{
  "name": "Updated Assistant Name",
  "initial_message": "Hello! How may I assist you?",
  "max_duration": 900
}
```

### Switch to Multimodal Mode

```json theme={null}
{
  "mode": "multimodal",
  "voice_id": 41,
  "multimodal_model_id": 1,
  "chat_llm_fallback_id": 2,
  "knowledgebase_mode": "function_call"
}
```

### Update Tools and Knowledgebase

```json theme={null}
{
  "tool_ids": [1, 5, 12],
  "knowledgebase_id": 3,
  "knowledgebase_mode": "prompt"
}
```

### Update Re-engagement and Voicemail

```json theme={null}
{
  "reengagement_interval": 15,
  "reengagement_prompt": "Are you still there? I'm here to help.",
  "end_call_on_voicemail": true,
  "voice_mail_message": "Hello, please call us back at your convenience."
}
```

### Remove Optional Settings

```json theme={null}
{
  "phone_number_id": null,
  "webhook_url": null,
  "tool_ids": [],
  "secondary_language_ids": []
}
```

***

## Response

**message** `string`

Success message confirming assistant update

**data** `object`

**properties**

**id** `integer`

The unique identifier of the updated assistant

**name** `string`

The name of the assistant

**status** `string`

The current status of the assistant

**type** `string`

The type (`inbound` or `outbound`)

**mode** `string`

The engine mode (`pipeline`, `multimodal`, or `dualplex`)

```json 200 Success Response theme={null}
{
  "message": "Assistant updated successfully",
  "data": {
    "id": 789,
    "name": "Updated Sales Assistant",
    "status": "active",
    "type": "outbound",
    "mode": "pipeline"
  }
}
```

```json 404 Not Found theme={null}
{
  "message": "Assistant not found"
}
```

```json 422 Validation Error theme={null}
{
  "message": "Validation failed",
  "errors": {
    "speech_speed": ["The speech speed must be between 0.7 and 1.2."],
    "voice_id": ["The selected voice is not compatible with the chosen engine type."],
    "allow_interruptions": ["Interruptions cannot be disabled in multimodal or dualplex mode."]
  }
}
```

***

## Notes

* Only the fields you provide in the request body will be updated
* To remove optional fields, explicitly set them to `null`
* To clear arrays (tools, secondary languages), pass an empty array `[]`
* The assistant must belong to the authenticated user
* Use the Get Voices endpoint with `mode` parameter to get compatible voices
* For multimodal/dualplex modes, `knowledgebase_mode` must be `function_call`
* For multimodal/dualplex modes, `allow_interruptions` cannot be disabled
* Changing the mode resets mode-specific settings (LLM model, multimodal model, providers)


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