Update an agent's mascot
Replace its look with an edited spec (normalised like a new one), change its speech bubble, or change sharing. Turning on the share link or the website widget lets anyone talk to the agent on your credit, within the caps in sharing, so sharing also needs calls:write. Requires agents:write.
curl --request PATCH \
--url https://api.voice.wixzel.com/v1/agents/{id}/mascot \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"welcome_message": "<string>",
"sharing": {
"link": true,
"embed": true,
"embed_origins": [
"<string>"
],
"max_call_seconds": 915,
"daily_minutes": 720,
"calls_per_visitor_daily": 50,
"max_concurrent_calls": 10
}
}
'import requests
url = "https://api.voice.wixzel.com/v1/agents/{id}/mascot"
payload = {
"welcome_message": "<string>",
"sharing": {
"link": True,
"embed": True,
"embed_origins": ["<string>"],
"max_call_seconds": 915,
"daily_minutes": 720,
"calls_per_visitor_daily": 50,
"max_concurrent_calls": 10
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
welcome_message: '<string>',
sharing: {
link: true,
embed: true,
embed_origins: ['<string>'],
max_call_seconds: 915,
daily_minutes: 720,
calls_per_visitor_daily: 50,
max_concurrent_calls: 10
}
})
};
fetch('https://api.voice.wixzel.com/v1/agents/{id}/mascot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voice.wixzel.com/v1/agents/{id}/mascot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'welcome_message' => '<string>',
'sharing' => [
'link' => true,
'embed' => true,
'embed_origins' => [
'<string>'
],
'max_call_seconds' => 915,
'daily_minutes' => 720,
'calls_per_visitor_daily' => 50,
'max_concurrent_calls' => 10
]
]),
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://api.voice.wixzel.com/v1/agents/{id}/mascot"
payload := strings.NewReader("{\n \"welcome_message\": \"<string>\",\n \"sharing\": {\n \"link\": true,\n \"embed\": true,\n \"embed_origins\": [\n \"<string>\"\n ],\n \"max_call_seconds\": 915,\n \"daily_minutes\": 720,\n \"calls_per_visitor_daily\": 50,\n \"max_concurrent_calls\": 10\n }\n}")
req, _ := http.NewRequest("PATCH", 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))
}HttpResponse<String> response = Unirest.patch("https://api.voice.wixzel.com/v1/agents/{id}/mascot")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"welcome_message\": \"<string>\",\n \"sharing\": {\n \"link\": true,\n \"embed\": true,\n \"embed_origins\": [\n \"<string>\"\n ],\n \"max_call_seconds\": 915,\n \"daily_minutes\": 720,\n \"calls_per_visitor_daily\": 50,\n \"max_concurrent_calls\": 10\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voice.wixzel.com/v1/agents/{id}/mascot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"welcome_message\": \"<string>\",\n \"sharing\": {\n \"link\": true,\n \"embed\": true,\n \"embed_origins\": [\n \"<string>\"\n ],\n \"max_call_seconds\": 915,\n \"daily_minutes\": 720,\n \"calls_per_visitor_daily\": 50,\n \"max_concurrent_calls\": 10\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "6a96a3ead6e886d42462dd3e",
"object": "agent",
"name": "<string>",
"system_prompt": "<string>",
"opening_message": "<string>",
"voice": {
"stt": {
"model": "deepgram/nova-3",
"language": "en-US",
"endpointing_ms": 1050
},
"llm": {
"model": "openrouter/gpt-4o-mini",
"temperature": 1,
"max_tokens": 2048
},
"tts": {
"model": "elevenlabs/eleven_flash_v2_5",
"voice": "21m00Tcm4TlvDq8ikWAM",
"stability": 0.5,
"similarity_boost": 0.5,
"speed": 0.95
},
"realtime": {
"model": "google/gemini-live",
"voice": "Charon",
"language": "auto"
},
"turn_taking": {
"interrupt_sensitivity": "normal",
"silence_wait_ms": 1600
}
},
"language": "<string>",
"knowledge_base_id": "6a96a3ead6e886d42462dd3e",
"outbound_phone_number_id": "6a96a3ead6e886d42462dd3e",
"appointment_booking_enabled": true,
"human_transfer": {
"destinations": [
{
"id": "billing",
"name": "Billing team",
"phone_number": "+14155550100",
"type": "phone",
"enabled": true,
"ring_timeout_seconds": 32
}
],
"enabled": false,
"mode": "blind",
"default_destination_id": "<string>",
"ring_timeout_seconds": 20,
"max_transfers_per_call": 3,
"return_to_agent_on_failure": true
},
"mcp_server_ids": [
"6a96a3ead6e886d42462dd3e"
],
"tool_ids": [
"6a96a3ead6e886d42462dd3e"
],
"mascot": {
"spec": {
"format": "wixzel.mascot",
"version": 1,
"name": "<string>",
"color": "#1388ff",
"shape": {
"kind": "drop",
"rotation": -8,
"aspect": 1,
"seed": 7,
"points": [
123
]
},
"eyes": {
"style": "pill",
"color": "#ffffff",
"width": 0.2,
"height": 0.42,
"gap": 0.42,
"x": 0,
"y": -0.12,
"tilt": 0,
"turn": 0
},
"mouth": {
"style": "smile",
"width": 123,
"y": 123
},
"personality": {
"bounce": 123,
"energy": 123
}
},
"welcome_message": "Hi! I’m Molly from Smile Dental. Tap Call to talk to me.",
"status": "ready",
"status_detail": "reading_website",
"error": {
"code": "<string>",
"message": "<string>"
},
"source": {
"type": "manual",
"description": "<string>",
"url": "<string>"
},
"brand": {
"primary_color": "<string>",
"site_name": "<string>"
},
"public_id": "m_4fT9qLx2Bv8K",
"sharing": {
"link": true,
"embed": true,
"embed_origins": [
"https://example.com",
"https://www.example.com"
],
"max_call_seconds": 300,
"daily_minutes": 60,
"calls_per_visitor_daily": 3,
"max_concurrent_calls": 2,
"caller_info": "none"
},
"updated_at": "2026-09-01T12:00:00.000Z"
},
"whatsapp": {
"account_id": "6a96a3ead6e886d42462dd3e",
"tools": {
"messages": true,
"templates": true,
"media": true,
"schedule": true,
"interactive": true
},
"templates": {
"follow_up": {
"name": "<string>",
"language": "<string>"
},
"reminder": {
"name": "<string>",
"language": "<string>"
},
"booking_confirmation": {
"name": "<string>",
"language": "<string>"
}
},
"allowed_templates": [
"<string>"
],
"auto_booking_confirmation": true,
"auto_reminder_minutes": 5040,
"chat_model": "openrouter/openai/gpt-4o-mini",
"max_sends_per_call": 5,
"allow_marketing": true
},
"created_at": "2026-09-01T12:00:00.000Z"
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}Authorizations
Your Wixzel Voice API key: Authorization: Bearer wv_live_.... Keys are scoped; grant only what the integration needs.
Path Parameters
^[0-9a-f]{24}$"6a96a3ead6e886d42462dd3e"
Body
Replaces the whole spec. Send the full spec you want, not just the changed fields.
Show child attributes
Show child attributes
What its speech bubble says before a call. Null or empty uses the agent’s opening line.
300Public link and embed settings. Turning either on lets strangers call the agent on your credit, so this also needs calls:write.
Show child attributes
Show child attributes
Response
The agent, with its updated mascot
^[0-9a-f]{24}$"6a96a3ead6e886d42462dd3e"
agent Either a composed pipeline (stt + llm + tts) or a single realtime model. Not both.
Show child attributes
Show child attributes
^[0-9a-f]{24}$"6a96a3ead6e886d42462dd3e"
^[0-9a-f]{24}$"6a96a3ead6e886d42462dd3e"
Hand a live caller to a person. Replaced as a whole on update, never merged.
Show child attributes
Show child attributes
MCP servers whose enabled tools this agent can use during a call.
^[0-9a-f]{24}$Your own tools (webhook and client) this agent can use during a call.
^[0-9a-f]{24}$The agent’s animated face, for the share link, the website widget and your own apps. Every agent has one.
Show child attributes
Show child attributes
WhatsApp: the number it sends from on calls, and its WhatsApp tools.
Show child attributes
Show child attributes
ISO 8601, always UTC.
"2026-09-01T12:00:00.000Z"
curl --request PATCH \
--url https://api.voice.wixzel.com/v1/agents/{id}/mascot \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"welcome_message": "<string>",
"sharing": {
"link": true,
"embed": true,
"embed_origins": [
"<string>"
],
"max_call_seconds": 915,
"daily_minutes": 720,
"calls_per_visitor_daily": 50,
"max_concurrent_calls": 10
}
}
'import requests
url = "https://api.voice.wixzel.com/v1/agents/{id}/mascot"
payload = {
"welcome_message": "<string>",
"sharing": {
"link": True,
"embed": True,
"embed_origins": ["<string>"],
"max_call_seconds": 915,
"daily_minutes": 720,
"calls_per_visitor_daily": 50,
"max_concurrent_calls": 10
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
welcome_message: '<string>',
sharing: {
link: true,
embed: true,
embed_origins: ['<string>'],
max_call_seconds: 915,
daily_minutes: 720,
calls_per_visitor_daily: 50,
max_concurrent_calls: 10
}
})
};
fetch('https://api.voice.wixzel.com/v1/agents/{id}/mascot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voice.wixzel.com/v1/agents/{id}/mascot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'welcome_message' => '<string>',
'sharing' => [
'link' => true,
'embed' => true,
'embed_origins' => [
'<string>'
],
'max_call_seconds' => 915,
'daily_minutes' => 720,
'calls_per_visitor_daily' => 50,
'max_concurrent_calls' => 10
]
]),
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://api.voice.wixzel.com/v1/agents/{id}/mascot"
payload := strings.NewReader("{\n \"welcome_message\": \"<string>\",\n \"sharing\": {\n \"link\": true,\n \"embed\": true,\n \"embed_origins\": [\n \"<string>\"\n ],\n \"max_call_seconds\": 915,\n \"daily_minutes\": 720,\n \"calls_per_visitor_daily\": 50,\n \"max_concurrent_calls\": 10\n }\n}")
req, _ := http.NewRequest("PATCH", 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))
}HttpResponse<String> response = Unirest.patch("https://api.voice.wixzel.com/v1/agents/{id}/mascot")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"welcome_message\": \"<string>\",\n \"sharing\": {\n \"link\": true,\n \"embed\": true,\n \"embed_origins\": [\n \"<string>\"\n ],\n \"max_call_seconds\": 915,\n \"daily_minutes\": 720,\n \"calls_per_visitor_daily\": 50,\n \"max_concurrent_calls\": 10\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voice.wixzel.com/v1/agents/{id}/mascot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"welcome_message\": \"<string>\",\n \"sharing\": {\n \"link\": true,\n \"embed\": true,\n \"embed_origins\": [\n \"<string>\"\n ],\n \"max_call_seconds\": 915,\n \"daily_minutes\": 720,\n \"calls_per_visitor_daily\": 50,\n \"max_concurrent_calls\": 10\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "6a96a3ead6e886d42462dd3e",
"object": "agent",
"name": "<string>",
"system_prompt": "<string>",
"opening_message": "<string>",
"voice": {
"stt": {
"model": "deepgram/nova-3",
"language": "en-US",
"endpointing_ms": 1050
},
"llm": {
"model": "openrouter/gpt-4o-mini",
"temperature": 1,
"max_tokens": 2048
},
"tts": {
"model": "elevenlabs/eleven_flash_v2_5",
"voice": "21m00Tcm4TlvDq8ikWAM",
"stability": 0.5,
"similarity_boost": 0.5,
"speed": 0.95
},
"realtime": {
"model": "google/gemini-live",
"voice": "Charon",
"language": "auto"
},
"turn_taking": {
"interrupt_sensitivity": "normal",
"silence_wait_ms": 1600
}
},
"language": "<string>",
"knowledge_base_id": "6a96a3ead6e886d42462dd3e",
"outbound_phone_number_id": "6a96a3ead6e886d42462dd3e",
"appointment_booking_enabled": true,
"human_transfer": {
"destinations": [
{
"id": "billing",
"name": "Billing team",
"phone_number": "+14155550100",
"type": "phone",
"enabled": true,
"ring_timeout_seconds": 32
}
],
"enabled": false,
"mode": "blind",
"default_destination_id": "<string>",
"ring_timeout_seconds": 20,
"max_transfers_per_call": 3,
"return_to_agent_on_failure": true
},
"mcp_server_ids": [
"6a96a3ead6e886d42462dd3e"
],
"tool_ids": [
"6a96a3ead6e886d42462dd3e"
],
"mascot": {
"spec": {
"format": "wixzel.mascot",
"version": 1,
"name": "<string>",
"color": "#1388ff",
"shape": {
"kind": "drop",
"rotation": -8,
"aspect": 1,
"seed": 7,
"points": [
123
]
},
"eyes": {
"style": "pill",
"color": "#ffffff",
"width": 0.2,
"height": 0.42,
"gap": 0.42,
"x": 0,
"y": -0.12,
"tilt": 0,
"turn": 0
},
"mouth": {
"style": "smile",
"width": 123,
"y": 123
},
"personality": {
"bounce": 123,
"energy": 123
}
},
"welcome_message": "Hi! I’m Molly from Smile Dental. Tap Call to talk to me.",
"status": "ready",
"status_detail": "reading_website",
"error": {
"code": "<string>",
"message": "<string>"
},
"source": {
"type": "manual",
"description": "<string>",
"url": "<string>"
},
"brand": {
"primary_color": "<string>",
"site_name": "<string>"
},
"public_id": "m_4fT9qLx2Bv8K",
"sharing": {
"link": true,
"embed": true,
"embed_origins": [
"https://example.com",
"https://www.example.com"
],
"max_call_seconds": 300,
"daily_minutes": 60,
"calls_per_visitor_daily": 3,
"max_concurrent_calls": 2,
"caller_info": "none"
},
"updated_at": "2026-09-01T12:00:00.000Z"
},
"whatsapp": {
"account_id": "6a96a3ead6e886d42462dd3e",
"tools": {
"messages": true,
"templates": true,
"media": true,
"schedule": true,
"interactive": true
},
"templates": {
"follow_up": {
"name": "<string>",
"language": "<string>"
},
"reminder": {
"name": "<string>",
"language": "<string>"
},
"booking_confirmation": {
"name": "<string>",
"language": "<string>"
}
},
"allowed_templates": [
"<string>"
],
"auto_booking_confirmation": true,
"auto_reminder_minutes": 5040,
"chat_model": "openrouter/openai/gpt-4o-mini",
"max_sends_per_call": 5,
"allow_marketing": true
},
"created_at": "2026-09-01T12:00:00.000Z"
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}
