Update Assistant
curl --request PUT \
--url https://app.famulor.de/api/user/assistant/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"type": "<string>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', type: '<string>'})
};
fetch('https://app.famulor.de/api/user/assistant/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.famulor.de/api/user/assistant/{id}"
payload = {
"name": "<string>",
"type": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/assistant/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'type' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.de/api/user/assistant/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"type\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"message": "Assistant updated successfully",
"data": {
"id": 789,
"name": "Updated Sales Assistant",
"status": "active",
"type": "outbound",
"mode": "pipeline"
}
}
{
"message": "Assistant not found"
}
{
"message": "Validation failed",
"errors": {
"speech_speed": ["Speech speed must be between 0.7 and 1.2."],
"voice_id": ["The selected voice is not compatible with the selected engine type."],
"allow_interruptions": ["Interruptions cannot be disabled in multimodal or dualplex mode."]
}
}
Update Assistant
Update the configuration of an existing AI assistant
PUT
/
api
/
user
/
assistant
/
{id}
Update Assistant
curl --request PUT \
--url https://app.famulor.de/api/user/assistant/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"type": "<string>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', type: '<string>'})
};
fetch('https://app.famulor.de/api/user/assistant/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.famulor.de/api/user/assistant/{id}"
payload = {
"name": "<string>",
"type": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/assistant/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'type' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.de/api/user/assistant/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"type\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"message": "Assistant updated successfully",
"data": {
"id": 789,
"name": "Updated Sales Assistant",
"status": "active",
"type": "outbound",
"mode": "pipeline"
}
}
{
"message": "Assistant not found"
}
{
"message": "Validation failed",
"errors": {
"speech_speed": ["Speech speed must be between 0.7 and 1.2."],
"voice_id": ["The selected voice is not compatible with the selected engine type."],
"allow_interruptions": ["Interruptions cannot be disabled in multimodal or dualplex mode."]
}
}
This endpoint allows you to update the configuration of an existing AI assistant. All fields are optional – only the fields provided will be updated. For detailed field descriptions and options, see Create Assistant.
Path Parameter
integer
required
The unique identifier of the assistant to be updated
Request Body
Core Fields
string
The name of the assistant (max. 255 characters)
integer
The voice ID to be used for the assistant. Use the Get Voices endpoint with the
mode parameter to get voices compatible with your engine mode.integer
The language ID for the assistant. Use the Get Languages endpoint to retrieve available languages.
string
The assistant type. Options:
inbound, outboundstring
The engine mode. Options:
pipeline, multimodal, dualplexChanging the mode resets mode-specific settings to their default values for the new mode.
string
The timezone for the assistant (e.g., “Europe/Berlin”, “America/New_York”)
string
The initial message the assistant will speak at call start (max. 200 characters)
string
The system prompt defining the assistant’s behaviour and personality
Mode-Specific Fields
integer
The LLM model ID to use. Only applicable in
pipeline mode.Use the Get Models endpoint to retrieve available models.integer
The multimodal model ID. Applicable only in
multimodal and dualplex modes.Use the Get Models endpoint to retrieve available multimodal models.integer
Fallback LLM model ID for tool calls in multimodal/dualplex modes. Set to
null to remove.number
Sensitivity of speaker turn detection for multimodal/dualplex modes (0-1). Set to
null for automatic.Secondary Languages
integer[]
Array of additional language IDs the assistant can speak. Replaces existing secondary languages. Pass an empty array
[] to remove all secondary languages."secondary_language_ids": [2, 3, 4]
Knowledgebase Settings
integer
The ID of the knowledgebase to link. Set to
null to remove.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)
Organization
integer
ID of a folder to move this assistant into. Must belong to your account. Set to
null to make it uncategorized. Omit to leave the folder unchanged.integer[]
Array of label IDs for this assistant. Each label must belong to your account. When provided, this replaces the assistant’s current labels. Omit to leave labels unchanged; send
[] to remove all labels."label_ids": [3, 5]
Phone Number
integer
The ID of a phone number to assign. Set to
null to unassign. Must belong to your account.For
inbound assistants, the phone number cannot be a caller ID type and must not already be assigned to another inbound assistant.Custom Mid-Call Tools
integer[]
Array of custom mid-call tool IDs to synchronize. Replaces all existing tool assignments. Pass an empty array
[] to remove all tools. Each tool must belong to your account."tool_ids": [1, 5, 12]
Built-in Tools
array
Array of built-in tools. Replaces all existing built-in tools. Pass an empty array
[] to remove all tools.Show Tool Types
Show Tool Types
call_transfer - Transfer the call to another phone number
phone_number(required): Phone number to transfer todescription: When to transfer the callcustom: If true, AI can determine transfer number dynamicallytimezone: Timezone for transfer availabilitywarm_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.”)
supervisor_phone(required): Phone number to dial for the warm transfer (e.g., “+14155552001”). Ifcustom_sipis enabled, this is a SIP address or internal extension instead.outbound_phone_id(required): ID of the phone number used to dial the supervisor. See Get Phone Numbers.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 whencaller_id_modeiscustom.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.”)
description: When the AI should end the call
description: When to use DTMF input (for IVR navigation)
timeout: Seconds to wait for input, 1–30 (default:5)stop_key: Key that ends input. Options:#(default),*
calcom_api_key(required): Your Cal.com API keycalcom_event_slug(required): The event type slug from Cal.comcalcom_team_slug: Team slug if the event belongs to a Cal.com teamcalcom_endpoint: Cal.com API region. Options:us(default —https://api.cal.com),eu(https://api.cal.eu),custom(usescalcom_custom_endpoint)calcom_custom_endpoint: Custom Cal.com API base URL. Only used whencalcom_endpointiscustom(e.g.,https://my-calcom-instance.com).calcom_booking_fields: Array of custom booking fields for the event. Each field has:slug(required),type(required, e.g. “text”, “email”, “phone”, “select”),label(required),required(default:false),options(array of options for select fields)description: When to offer scheduling
assistant_id(required): ID of the target assistant. Must belong to your account and cannot be the assistant being updated (no self-transfer).description: When to transfer (max 500 chars, default: “Transfer the conversation to this assistant when appropriate.”)message_before_transfer: Optional message the AI speaks before switching to the target assistant (max 500 chars).speak_transfer_greeting: If true, the target assistant speaks its configured initial message after the transfer completes (default:true)
"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": "assistant_transfer",
"assistant_id": 14765,
"description": "Transfer to the Support Assistant when the customer needs technical help.",
"message_before_transfer": "Sure — let me transfer you to our support specialist.",
"speak_transfer_greeting": true
},
{
"type": "end_call",
"description": "End call when done"
}
]
When you list assistants, each configured tool is returned as
{ "type": "...", "data": { ... } } with the same field names nested under data (not top-level).Speech and TTS Settings
boolean
Whether emotional text-to-speech synthesis is enabled
number
Voice stability setting (0-1). Higher = more consistent voice
number
Voice similarity setting (0-1). Higher = closer to original voice
number
Speech speed multiplier (0.7-1.2)
number
LLM temperature setting (0-1). Lower = more deterministic
integer
Custom TTS provider ID. Set to
null to use the system default voice. See Get Synthesizer Providers.integer
Custom STT provider ID. Pipeline mode only. Set to
null to use the system default voice. See Get Transcriber Providers.Call Behavior Settings
boolean
Whether caller interruptions are allowed.
Cannot be disabled in
multimodal and dualplex modes.boolean
Whether filler audio should be used during processing.
Available only in
pipeline mode.object
Custom filler profiles per category. Replaces the existing filler configuration. Each category is an array of short phrases.
positive: Fillers for affirmative responsesnegative: Fillers for negative/neutral responsesquestion: Fillers when processing a questionneutral: Fillers for neutral confirmations
"filler_config": {
"positive": ["Great!", "Perfect!"],
"negative": ["Hmm.", "Understood."],
"question": ["Good question.", "One moment."],
"neutral": ["Okay.", "Noted."]
}
boolean
Whether the call should be recorded
boolean
Whether noise cancellation should be enabled
boolean
If true, the assistant waits for the customer to speak first
Timing Settings
integer
Maximum call duration in seconds (20-1200)
integer
Maximum silence duration before re-engagement in seconds (1-360)
integer
Maximum silence at the start of the call before termination (1-120 seconds). Set to
null to disable.integer
Maximum ringing time before aborting (1-60 seconds)
Re-Engagement Settings
integer
Interval for re-engagement in seconds (7-600)
string
Custom prompt for re-engagement messages (max. 1000 characters). Set to
null to use the default.Voicemail Settings
boolean
Whether to end the call when voicemail is detected
string
Message to leave on voicemail before hanging up (max. 1000 characters). Set to
null to disable.Endpoint Detection
string
Type of voice activity detection. Options:
vad, ainumber
Endpoint sensitivity level (0-5)
number
Interruption sensitivity level (0-5)
integer
Minimum number of words before interruption is allowed (0-10). Set to
null to disable.Ambient Sound
string
Background ambient sound. Options:
off, office, city, forest, crowded_room, cafe, naturenumber
Volume of the ambient sound (0-1)
Webhook Configuration
boolean
Whether webhook notifications are enabled
string
The webhook URL for post-call notifications. Set to
null to remove.boolean
Whether webhooks should be sent only for successfully completed calls (not on failed/no-answer)
boolean
Whether the recording URL should be included in the webhook payload
Post-Call Evaluation
boolean
Whether AI-based post-call evaluation is enabled
array
Schema definition for extracting post-call data. Replaces the existing schema.
Variables
object
Key-value pairs for custom variables. Replaces all existing variables.
"variables": {
"company_name": "Acme Corp",
"product": "Premium Widget"
}
Example Requests
Update Basic Settings
{
"name": "Updated Assistant Name",
"initial_message": "Hello! How can I help you today?",
"max_duration": 900
}
Switch to Multimodal Mode
{
"mode": "multimodal",
"voice_id": 41,
"multimodal_model_id": 1,
"chat_llm_fallback_id": 2,
"knowledgebase_mode": "function_call"
}
Update Tools and Knowledgebase
{
"tool_ids": [1, 5, 12],
"knowledgebase_id": 3,
"knowledgebase_mode": "prompt"
}
Update Re-Engagement and Voicemail
{
"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 earliest convenience."
}
Remove Optional Settings
{
"phone_number_id": null,
"webhook_url": null,
"tool_ids": [],
"secondary_language_ids": []
}
Response
string
Success message confirming the assistant update
object
{
"message": "Assistant updated successfully",
"data": {
"id": 789,
"name": "Updated Sales Assistant",
"status": "active",
"type": "outbound",
"mode": "pipeline"
}
}
{
"message": "Assistant not found"
}
{
"message": "Validation failed",
"errors": {
"speech_speed": ["Speech speed must be between 0.7 and 1.2."],
"voice_id": ["The selected voice is not compatible with the selected 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 the
modeparameter to get compatible voices - For multimodal/dualplex modes,
knowledgebase_modemust be set tofunction_call - In multimodal/dualplex modes, interruptions (
allow_interruptions) cannot be disabled - Changing mode resets mode-specific settings (LLM model, multimodal model, providers)