curl --request PUT \
--url https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <x-api-key>' \
--data '
{
"intent": "<string>",
"success_criteria": "<string>",
"name": "<string>",
"tag": "<string>",
"custom_voice_id": "<string>",
"custom_background_noise_url": "<string>",
"phone_number": "<string>",
"extension": "<string>",
"outbound_text_number": "<string>",
"follow_up_sms_success_criteria": "<string>",
"background_noise_volume": 0.5,
"expected_tool_calls": [
{
"name": "<string>",
"parameters": {},
"output": "<unknown>"
}
],
"allow_end_call_tool": true,
"allow_silence_tool": true,
"allow_dtmf_tool": true,
"silence_tool_instructions": "<string>",
"endpointing_delay": 123,
"creativity": 1,
"hangup_phrases": [
"<string>"
],
"hangup_instructions": "<string>",
"silence_timeout": 16,
"simulation_ids": [
123
],
"traits": [
{
"trait_name": "<string>",
"value": "<unknown>",
"is_sip_header": false
}
],
"interruptions": {},
"scripted_responses": [
{
"match_phrase": "<string>",
"response_value": "<string>",
"scripted_response_audio_snippet_url": "<string>",
"occurrence_n": 1,
"silence_duration": 1
}
],
"scripted_responses_ordered": true,
"role_description": "<string>",
"speaks_first_config": {
"speaks_first": true,
"message": "<string>",
"dynamic": true
},
"original_transcript": "<string>",
"formatted_transcript": [
{}
],
"enriched_playback": [
{}
],
"num_runs": 2,
"livekit_metadata": {},
"always_on_mode": true,
"always_on_active": true,
"test_name": "<string>",
"journey_steps": [
{
"step": 1,
"intent": "",
"success_criteria": "",
"modality": "voice",
"wait_seconds": 123,
"response_window_seconds": 123,
"unresponsive": false,
"phone_number": "<string>"
}
],
"override_conflict": false
}
'import requests
url = "https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}"
payload = {
"intent": "<string>",
"success_criteria": "<string>",
"name": "<string>",
"tag": "<string>",
"custom_voice_id": "<string>",
"custom_background_noise_url": "<string>",
"phone_number": "<string>",
"extension": "<string>",
"outbound_text_number": "<string>",
"follow_up_sms_success_criteria": "<string>",
"background_noise_volume": 0.5,
"expected_tool_calls": [
{
"name": "<string>",
"parameters": {},
"output": "<unknown>"
}
],
"allow_end_call_tool": True,
"allow_silence_tool": True,
"allow_dtmf_tool": True,
"silence_tool_instructions": "<string>",
"endpointing_delay": 123,
"creativity": 1,
"hangup_phrases": ["<string>"],
"hangup_instructions": "<string>",
"silence_timeout": 16,
"simulation_ids": [123],
"traits": [
{
"trait_name": "<string>",
"value": "<unknown>",
"is_sip_header": False
}
],
"interruptions": {},
"scripted_responses": [
{
"match_phrase": "<string>",
"response_value": "<string>",
"scripted_response_audio_snippet_url": "<string>",
"occurrence_n": 1,
"silence_duration": 1
}
],
"scripted_responses_ordered": True,
"role_description": "<string>",
"speaks_first_config": {
"speaks_first": True,
"message": "<string>",
"dynamic": True
},
"original_transcript": "<string>",
"formatted_transcript": [{}],
"enriched_playback": [{}],
"num_runs": 2,
"livekit_metadata": {},
"always_on_mode": True,
"always_on_active": True,
"test_name": "<string>",
"journey_steps": [
{
"step": 1,
"intent": "",
"success_criteria": "",
"modality": "voice",
"wait_seconds": 123,
"response_window_seconds": 123,
"unresponsive": False,
"phone_number": "<string>"
}
],
"override_conflict": False
}
headers = {
"X-API-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
intent: '<string>',
success_criteria: '<string>',
name: '<string>',
tag: '<string>',
custom_voice_id: '<string>',
custom_background_noise_url: '<string>',
phone_number: '<string>',
extension: '<string>',
outbound_text_number: '<string>',
follow_up_sms_success_criteria: '<string>',
background_noise_volume: 0.5,
expected_tool_calls: [{name: '<string>', parameters: {}, output: '<unknown>'}],
allow_end_call_tool: true,
allow_silence_tool: true,
allow_dtmf_tool: true,
silence_tool_instructions: '<string>',
endpointing_delay: 123,
creativity: 1,
hangup_phrases: ['<string>'],
hangup_instructions: '<string>',
silence_timeout: 16,
simulation_ids: [123],
traits: [{trait_name: '<string>', value: '<unknown>', is_sip_header: false}],
interruptions: {},
scripted_responses: [
{
match_phrase: '<string>',
response_value: '<string>',
scripted_response_audio_snippet_url: '<string>',
occurrence_n: 1,
silence_duration: 1
}
],
scripted_responses_ordered: true,
role_description: '<string>',
speaks_first_config: {speaks_first: true, message: '<string>', dynamic: true},
original_transcript: '<string>',
formatted_transcript: [{}],
enriched_playback: [{}],
num_runs: 2,
livekit_metadata: {},
always_on_mode: true,
always_on_active: true,
test_name: '<string>',
journey_steps: [
{
step: 1,
intent: '',
success_criteria: '',
modality: 'voice',
wait_seconds: 123,
response_window_seconds: 123,
unresponsive: false,
phone_number: '<string>'
}
],
override_conflict: false
})
};
fetch('https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}', 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.getbluejay.ai/v1/update-digital-human/{digital_human_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([
'intent' => '<string>',
'success_criteria' => '<string>',
'name' => '<string>',
'tag' => '<string>',
'custom_voice_id' => '<string>',
'custom_background_noise_url' => '<string>',
'phone_number' => '<string>',
'extension' => '<string>',
'outbound_text_number' => '<string>',
'follow_up_sms_success_criteria' => '<string>',
'background_noise_volume' => 0.5,
'expected_tool_calls' => [
[
'name' => '<string>',
'parameters' => [
],
'output' => '<unknown>'
]
],
'allow_end_call_tool' => true,
'allow_silence_tool' => true,
'allow_dtmf_tool' => true,
'silence_tool_instructions' => '<string>',
'endpointing_delay' => 123,
'creativity' => 1,
'hangup_phrases' => [
'<string>'
],
'hangup_instructions' => '<string>',
'silence_timeout' => 16,
'simulation_ids' => [
123
],
'traits' => [
[
'trait_name' => '<string>',
'value' => '<unknown>',
'is_sip_header' => false
]
],
'interruptions' => [
],
'scripted_responses' => [
[
'match_phrase' => '<string>',
'response_value' => '<string>',
'scripted_response_audio_snippet_url' => '<string>',
'occurrence_n' => 1,
'silence_duration' => 1
]
],
'scripted_responses_ordered' => true,
'role_description' => '<string>',
'speaks_first_config' => [
'speaks_first' => true,
'message' => '<string>',
'dynamic' => true
],
'original_transcript' => '<string>',
'formatted_transcript' => [
[
]
],
'enriched_playback' => [
[
]
],
'num_runs' => 2,
'livekit_metadata' => [
],
'always_on_mode' => true,
'always_on_active' => true,
'test_name' => '<string>',
'journey_steps' => [
[
'step' => 1,
'intent' => '',
'success_criteria' => '',
'modality' => 'voice',
'wait_seconds' => 123,
'response_window_seconds' => 123,
'unresponsive' => false,
'phone_number' => '<string>'
]
],
'override_conflict' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <x-api-key>"
],
]);
$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.getbluejay.ai/v1/update-digital-human/{digital_human_id}"
payload := strings.NewReader("{\n \"intent\": \"<string>\",\n \"success_criteria\": \"<string>\",\n \"name\": \"<string>\",\n \"tag\": \"<string>\",\n \"custom_voice_id\": \"<string>\",\n \"custom_background_noise_url\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"extension\": \"<string>\",\n \"outbound_text_number\": \"<string>\",\n \"follow_up_sms_success_criteria\": \"<string>\",\n \"background_noise_volume\": 0.5,\n \"expected_tool_calls\": [\n {\n \"name\": \"<string>\",\n \"parameters\": {},\n \"output\": \"<unknown>\"\n }\n ],\n \"allow_end_call_tool\": true,\n \"allow_silence_tool\": true,\n \"allow_dtmf_tool\": true,\n \"silence_tool_instructions\": \"<string>\",\n \"endpointing_delay\": 123,\n \"creativity\": 1,\n \"hangup_phrases\": [\n \"<string>\"\n ],\n \"hangup_instructions\": \"<string>\",\n \"silence_timeout\": 16,\n \"simulation_ids\": [\n 123\n ],\n \"traits\": [\n {\n \"trait_name\": \"<string>\",\n \"value\": \"<unknown>\",\n \"is_sip_header\": false\n }\n ],\n \"interruptions\": {},\n \"scripted_responses\": [\n {\n \"match_phrase\": \"<string>\",\n \"response_value\": \"<string>\",\n \"scripted_response_audio_snippet_url\": \"<string>\",\n \"occurrence_n\": 1,\n \"silence_duration\": 1\n }\n ],\n \"scripted_responses_ordered\": true,\n \"role_description\": \"<string>\",\n \"speaks_first_config\": {\n \"speaks_first\": true,\n \"message\": \"<string>\",\n \"dynamic\": true\n },\n \"original_transcript\": \"<string>\",\n \"formatted_transcript\": [\n {}\n ],\n \"enriched_playback\": [\n {}\n ],\n \"num_runs\": 2,\n \"livekit_metadata\": {},\n \"always_on_mode\": true,\n \"always_on_active\": true,\n \"test_name\": \"<string>\",\n \"journey_steps\": [\n {\n \"step\": 1,\n \"intent\": \"\",\n \"success_criteria\": \"\",\n \"modality\": \"voice\",\n \"wait_seconds\": 123,\n \"response_window_seconds\": 123,\n \"unresponsive\": false,\n \"phone_number\": \"<string>\"\n }\n ],\n \"override_conflict\": false\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<x-api-key>")
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.put("https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}")
.header("X-API-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"intent\": \"<string>\",\n \"success_criteria\": \"<string>\",\n \"name\": \"<string>\",\n \"tag\": \"<string>\",\n \"custom_voice_id\": \"<string>\",\n \"custom_background_noise_url\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"extension\": \"<string>\",\n \"outbound_text_number\": \"<string>\",\n \"follow_up_sms_success_criteria\": \"<string>\",\n \"background_noise_volume\": 0.5,\n \"expected_tool_calls\": [\n {\n \"name\": \"<string>\",\n \"parameters\": {},\n \"output\": \"<unknown>\"\n }\n ],\n \"allow_end_call_tool\": true,\n \"allow_silence_tool\": true,\n \"allow_dtmf_tool\": true,\n \"silence_tool_instructions\": \"<string>\",\n \"endpointing_delay\": 123,\n \"creativity\": 1,\n \"hangup_phrases\": [\n \"<string>\"\n ],\n \"hangup_instructions\": \"<string>\",\n \"silence_timeout\": 16,\n \"simulation_ids\": [\n 123\n ],\n \"traits\": [\n {\n \"trait_name\": \"<string>\",\n \"value\": \"<unknown>\",\n \"is_sip_header\": false\n }\n ],\n \"interruptions\": {},\n \"scripted_responses\": [\n {\n \"match_phrase\": \"<string>\",\n \"response_value\": \"<string>\",\n \"scripted_response_audio_snippet_url\": \"<string>\",\n \"occurrence_n\": 1,\n \"silence_duration\": 1\n }\n ],\n \"scripted_responses_ordered\": true,\n \"role_description\": \"<string>\",\n \"speaks_first_config\": {\n \"speaks_first\": true,\n \"message\": \"<string>\",\n \"dynamic\": true\n },\n \"original_transcript\": \"<string>\",\n \"formatted_transcript\": [\n {}\n ],\n \"enriched_playback\": [\n {}\n ],\n \"num_runs\": 2,\n \"livekit_metadata\": {},\n \"always_on_mode\": true,\n \"always_on_active\": true,\n \"test_name\": \"<string>\",\n \"journey_steps\": [\n {\n \"step\": 1,\n \"intent\": \"\",\n \"success_criteria\": \"\",\n \"modality\": \"voice\",\n \"wait_seconds\": 123,\n \"response_window_seconds\": 123,\n \"unresponsive\": false,\n \"phone_number\": \"<string>\"\n }\n ],\n \"override_conflict\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"intent\": \"<string>\",\n \"success_criteria\": \"<string>\",\n \"name\": \"<string>\",\n \"tag\": \"<string>\",\n \"custom_voice_id\": \"<string>\",\n \"custom_background_noise_url\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"extension\": \"<string>\",\n \"outbound_text_number\": \"<string>\",\n \"follow_up_sms_success_criteria\": \"<string>\",\n \"background_noise_volume\": 0.5,\n \"expected_tool_calls\": [\n {\n \"name\": \"<string>\",\n \"parameters\": {},\n \"output\": \"<unknown>\"\n }\n ],\n \"allow_end_call_tool\": true,\n \"allow_silence_tool\": true,\n \"allow_dtmf_tool\": true,\n \"silence_tool_instructions\": \"<string>\",\n \"endpointing_delay\": 123,\n \"creativity\": 1,\n \"hangup_phrases\": [\n \"<string>\"\n ],\n \"hangup_instructions\": \"<string>\",\n \"silence_timeout\": 16,\n \"simulation_ids\": [\n 123\n ],\n \"traits\": [\n {\n \"trait_name\": \"<string>\",\n \"value\": \"<unknown>\",\n \"is_sip_header\": false\n }\n ],\n \"interruptions\": {},\n \"scripted_responses\": [\n {\n \"match_phrase\": \"<string>\",\n \"response_value\": \"<string>\",\n \"scripted_response_audio_snippet_url\": \"<string>\",\n \"occurrence_n\": 1,\n \"silence_duration\": 1\n }\n ],\n \"scripted_responses_ordered\": true,\n \"role_description\": \"<string>\",\n \"speaks_first_config\": {\n \"speaks_first\": true,\n \"message\": \"<string>\",\n \"dynamic\": true\n },\n \"original_transcript\": \"<string>\",\n \"formatted_transcript\": [\n {}\n ],\n \"enriched_playback\": [\n {}\n ],\n \"num_runs\": 2,\n \"livekit_metadata\": {},\n \"always_on_mode\": true,\n \"always_on_active\": true,\n \"test_name\": \"<string>\",\n \"journey_steps\": [\n {\n \"step\": 1,\n \"intent\": \"\",\n \"success_criteria\": \"\",\n \"modality\": \"voice\",\n \"wait_seconds\": 123,\n \"response_window_seconds\": 123,\n \"unresponsive\": false,\n \"phone_number\": \"<string>\"\n }\n ],\n \"override_conflict\": false\n}"
response = http.request(request)
puts response.read_body{
"digital_human": {
"intent": "<string>",
"success_criteria": "<string>",
"id": 123,
"bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tag": "<string>",
"tags": [
"<string>"
],
"system_prompt_rule_ids": [
"<string>"
],
"system_prompt_rule_quotes": [
"<string>"
],
"name": "<string>",
"language": "en",
"accent": "multilingual",
"gender": "male",
"custom_voice_id": "<string>",
"background_noise": "<string>",
"custom_background_noise_url": "<string>",
"voice_speed": "<string>",
"audio_quality": "<string>",
"connection_quality": "<string>",
"fluency": "<string>",
"verbosity": "<string>",
"phone_number": "<string>",
"extension": "<string>",
"outbound_text_number": "<string>",
"follow_up_sms_success_criteria": "<string>",
"websocket_url": "<string>",
"background_noise_volume": 123,
"expected_tool_calls": [
{
"name": "<string>",
"parameters": {},
"output": "<unknown>"
}
],
"allow_end_call_tool": true,
"allow_silence_tool": true,
"allow_dtmf_tool": true,
"default_dtmf_or_voiced": "voiced",
"silence_tool_instructions": "default",
"endpointing_delay": 123,
"creativity": 123,
"hangup_phrases": [
"<string>"
],
"hangup_instructions": "<string>",
"silence_timeout": 123,
"role_description": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"traits": [
{
"trait_name": "<string>",
"trait_data_type": "BOOLEAN",
"value": "<unknown>",
"is_sip_header": false
}
],
"interruptions": {},
"scripted_responses": [
{
"match_type": "exact",
"match_phrase": "<string>",
"response_type": "phrase",
"occurrence_mode": "always",
"response_value": "<string>",
"scripted_response_audio_snippet_url": "<string>",
"occurrence_n": 1,
"silence_duration": 1
}
],
"scripted_responses_ordered": false,
"speaks_first_config": {
"speaks_first": true,
"mode": "custom",
"message": "<string>",
"dynamic": true
},
"original_transcript": "<string>",
"formatted_transcript": [
{}
],
"enriched_playback": [
{}
],
"workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_path_index": 123,
"tested_path": [
"<string>"
],
"livekit_metadata": {},
"test_name": "<string>",
"journey_steps": [
{
"step": 1,
"intent": "",
"success_criteria": "",
"modality": "voice",
"direction": "inbound",
"wait_seconds": 123,
"response_window_seconds": 123,
"unresponsive": false,
"phone_number": "<string>"
}
],
"always_on_mode": true,
"always_on_active": false,
"num_runs": 1,
"attack_vector": "<string>",
"attack_type": "<string>",
"attack_plan": {}
},
"simulation_ids": [
123
],
"simulation_id": 123
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Update Digital Human
Update a Digital Human by ID. Returns 404 if the Digital Human does not exist or belongs to a different organization.
curl --request PUT \
--url https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <x-api-key>' \
--data '
{
"intent": "<string>",
"success_criteria": "<string>",
"name": "<string>",
"tag": "<string>",
"custom_voice_id": "<string>",
"custom_background_noise_url": "<string>",
"phone_number": "<string>",
"extension": "<string>",
"outbound_text_number": "<string>",
"follow_up_sms_success_criteria": "<string>",
"background_noise_volume": 0.5,
"expected_tool_calls": [
{
"name": "<string>",
"parameters": {},
"output": "<unknown>"
}
],
"allow_end_call_tool": true,
"allow_silence_tool": true,
"allow_dtmf_tool": true,
"silence_tool_instructions": "<string>",
"endpointing_delay": 123,
"creativity": 1,
"hangup_phrases": [
"<string>"
],
"hangup_instructions": "<string>",
"silence_timeout": 16,
"simulation_ids": [
123
],
"traits": [
{
"trait_name": "<string>",
"value": "<unknown>",
"is_sip_header": false
}
],
"interruptions": {},
"scripted_responses": [
{
"match_phrase": "<string>",
"response_value": "<string>",
"scripted_response_audio_snippet_url": "<string>",
"occurrence_n": 1,
"silence_duration": 1
}
],
"scripted_responses_ordered": true,
"role_description": "<string>",
"speaks_first_config": {
"speaks_first": true,
"message": "<string>",
"dynamic": true
},
"original_transcript": "<string>",
"formatted_transcript": [
{}
],
"enriched_playback": [
{}
],
"num_runs": 2,
"livekit_metadata": {},
"always_on_mode": true,
"always_on_active": true,
"test_name": "<string>",
"journey_steps": [
{
"step": 1,
"intent": "",
"success_criteria": "",
"modality": "voice",
"wait_seconds": 123,
"response_window_seconds": 123,
"unresponsive": false,
"phone_number": "<string>"
}
],
"override_conflict": false
}
'import requests
url = "https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}"
payload = {
"intent": "<string>",
"success_criteria": "<string>",
"name": "<string>",
"tag": "<string>",
"custom_voice_id": "<string>",
"custom_background_noise_url": "<string>",
"phone_number": "<string>",
"extension": "<string>",
"outbound_text_number": "<string>",
"follow_up_sms_success_criteria": "<string>",
"background_noise_volume": 0.5,
"expected_tool_calls": [
{
"name": "<string>",
"parameters": {},
"output": "<unknown>"
}
],
"allow_end_call_tool": True,
"allow_silence_tool": True,
"allow_dtmf_tool": True,
"silence_tool_instructions": "<string>",
"endpointing_delay": 123,
"creativity": 1,
"hangup_phrases": ["<string>"],
"hangup_instructions": "<string>",
"silence_timeout": 16,
"simulation_ids": [123],
"traits": [
{
"trait_name": "<string>",
"value": "<unknown>",
"is_sip_header": False
}
],
"interruptions": {},
"scripted_responses": [
{
"match_phrase": "<string>",
"response_value": "<string>",
"scripted_response_audio_snippet_url": "<string>",
"occurrence_n": 1,
"silence_duration": 1
}
],
"scripted_responses_ordered": True,
"role_description": "<string>",
"speaks_first_config": {
"speaks_first": True,
"message": "<string>",
"dynamic": True
},
"original_transcript": "<string>",
"formatted_transcript": [{}],
"enriched_playback": [{}],
"num_runs": 2,
"livekit_metadata": {},
"always_on_mode": True,
"always_on_active": True,
"test_name": "<string>",
"journey_steps": [
{
"step": 1,
"intent": "",
"success_criteria": "",
"modality": "voice",
"wait_seconds": 123,
"response_window_seconds": 123,
"unresponsive": False,
"phone_number": "<string>"
}
],
"override_conflict": False
}
headers = {
"X-API-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
intent: '<string>',
success_criteria: '<string>',
name: '<string>',
tag: '<string>',
custom_voice_id: '<string>',
custom_background_noise_url: '<string>',
phone_number: '<string>',
extension: '<string>',
outbound_text_number: '<string>',
follow_up_sms_success_criteria: '<string>',
background_noise_volume: 0.5,
expected_tool_calls: [{name: '<string>', parameters: {}, output: '<unknown>'}],
allow_end_call_tool: true,
allow_silence_tool: true,
allow_dtmf_tool: true,
silence_tool_instructions: '<string>',
endpointing_delay: 123,
creativity: 1,
hangup_phrases: ['<string>'],
hangup_instructions: '<string>',
silence_timeout: 16,
simulation_ids: [123],
traits: [{trait_name: '<string>', value: '<unknown>', is_sip_header: false}],
interruptions: {},
scripted_responses: [
{
match_phrase: '<string>',
response_value: '<string>',
scripted_response_audio_snippet_url: '<string>',
occurrence_n: 1,
silence_duration: 1
}
],
scripted_responses_ordered: true,
role_description: '<string>',
speaks_first_config: {speaks_first: true, message: '<string>', dynamic: true},
original_transcript: '<string>',
formatted_transcript: [{}],
enriched_playback: [{}],
num_runs: 2,
livekit_metadata: {},
always_on_mode: true,
always_on_active: true,
test_name: '<string>',
journey_steps: [
{
step: 1,
intent: '',
success_criteria: '',
modality: 'voice',
wait_seconds: 123,
response_window_seconds: 123,
unresponsive: false,
phone_number: '<string>'
}
],
override_conflict: false
})
};
fetch('https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}', 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.getbluejay.ai/v1/update-digital-human/{digital_human_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([
'intent' => '<string>',
'success_criteria' => '<string>',
'name' => '<string>',
'tag' => '<string>',
'custom_voice_id' => '<string>',
'custom_background_noise_url' => '<string>',
'phone_number' => '<string>',
'extension' => '<string>',
'outbound_text_number' => '<string>',
'follow_up_sms_success_criteria' => '<string>',
'background_noise_volume' => 0.5,
'expected_tool_calls' => [
[
'name' => '<string>',
'parameters' => [
],
'output' => '<unknown>'
]
],
'allow_end_call_tool' => true,
'allow_silence_tool' => true,
'allow_dtmf_tool' => true,
'silence_tool_instructions' => '<string>',
'endpointing_delay' => 123,
'creativity' => 1,
'hangup_phrases' => [
'<string>'
],
'hangup_instructions' => '<string>',
'silence_timeout' => 16,
'simulation_ids' => [
123
],
'traits' => [
[
'trait_name' => '<string>',
'value' => '<unknown>',
'is_sip_header' => false
]
],
'interruptions' => [
],
'scripted_responses' => [
[
'match_phrase' => '<string>',
'response_value' => '<string>',
'scripted_response_audio_snippet_url' => '<string>',
'occurrence_n' => 1,
'silence_duration' => 1
]
],
'scripted_responses_ordered' => true,
'role_description' => '<string>',
'speaks_first_config' => [
'speaks_first' => true,
'message' => '<string>',
'dynamic' => true
],
'original_transcript' => '<string>',
'formatted_transcript' => [
[
]
],
'enriched_playback' => [
[
]
],
'num_runs' => 2,
'livekit_metadata' => [
],
'always_on_mode' => true,
'always_on_active' => true,
'test_name' => '<string>',
'journey_steps' => [
[
'step' => 1,
'intent' => '',
'success_criteria' => '',
'modality' => 'voice',
'wait_seconds' => 123,
'response_window_seconds' => 123,
'unresponsive' => false,
'phone_number' => '<string>'
]
],
'override_conflict' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <x-api-key>"
],
]);
$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.getbluejay.ai/v1/update-digital-human/{digital_human_id}"
payload := strings.NewReader("{\n \"intent\": \"<string>\",\n \"success_criteria\": \"<string>\",\n \"name\": \"<string>\",\n \"tag\": \"<string>\",\n \"custom_voice_id\": \"<string>\",\n \"custom_background_noise_url\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"extension\": \"<string>\",\n \"outbound_text_number\": \"<string>\",\n \"follow_up_sms_success_criteria\": \"<string>\",\n \"background_noise_volume\": 0.5,\n \"expected_tool_calls\": [\n {\n \"name\": \"<string>\",\n \"parameters\": {},\n \"output\": \"<unknown>\"\n }\n ],\n \"allow_end_call_tool\": true,\n \"allow_silence_tool\": true,\n \"allow_dtmf_tool\": true,\n \"silence_tool_instructions\": \"<string>\",\n \"endpointing_delay\": 123,\n \"creativity\": 1,\n \"hangup_phrases\": [\n \"<string>\"\n ],\n \"hangup_instructions\": \"<string>\",\n \"silence_timeout\": 16,\n \"simulation_ids\": [\n 123\n ],\n \"traits\": [\n {\n \"trait_name\": \"<string>\",\n \"value\": \"<unknown>\",\n \"is_sip_header\": false\n }\n ],\n \"interruptions\": {},\n \"scripted_responses\": [\n {\n \"match_phrase\": \"<string>\",\n \"response_value\": \"<string>\",\n \"scripted_response_audio_snippet_url\": \"<string>\",\n \"occurrence_n\": 1,\n \"silence_duration\": 1\n }\n ],\n \"scripted_responses_ordered\": true,\n \"role_description\": \"<string>\",\n \"speaks_first_config\": {\n \"speaks_first\": true,\n \"message\": \"<string>\",\n \"dynamic\": true\n },\n \"original_transcript\": \"<string>\",\n \"formatted_transcript\": [\n {}\n ],\n \"enriched_playback\": [\n {}\n ],\n \"num_runs\": 2,\n \"livekit_metadata\": {},\n \"always_on_mode\": true,\n \"always_on_active\": true,\n \"test_name\": \"<string>\",\n \"journey_steps\": [\n {\n \"step\": 1,\n \"intent\": \"\",\n \"success_criteria\": \"\",\n \"modality\": \"voice\",\n \"wait_seconds\": 123,\n \"response_window_seconds\": 123,\n \"unresponsive\": false,\n \"phone_number\": \"<string>\"\n }\n ],\n \"override_conflict\": false\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<x-api-key>")
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.put("https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}")
.header("X-API-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"intent\": \"<string>\",\n \"success_criteria\": \"<string>\",\n \"name\": \"<string>\",\n \"tag\": \"<string>\",\n \"custom_voice_id\": \"<string>\",\n \"custom_background_noise_url\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"extension\": \"<string>\",\n \"outbound_text_number\": \"<string>\",\n \"follow_up_sms_success_criteria\": \"<string>\",\n \"background_noise_volume\": 0.5,\n \"expected_tool_calls\": [\n {\n \"name\": \"<string>\",\n \"parameters\": {},\n \"output\": \"<unknown>\"\n }\n ],\n \"allow_end_call_tool\": true,\n \"allow_silence_tool\": true,\n \"allow_dtmf_tool\": true,\n \"silence_tool_instructions\": \"<string>\",\n \"endpointing_delay\": 123,\n \"creativity\": 1,\n \"hangup_phrases\": [\n \"<string>\"\n ],\n \"hangup_instructions\": \"<string>\",\n \"silence_timeout\": 16,\n \"simulation_ids\": [\n 123\n ],\n \"traits\": [\n {\n \"trait_name\": \"<string>\",\n \"value\": \"<unknown>\",\n \"is_sip_header\": false\n }\n ],\n \"interruptions\": {},\n \"scripted_responses\": [\n {\n \"match_phrase\": \"<string>\",\n \"response_value\": \"<string>\",\n \"scripted_response_audio_snippet_url\": \"<string>\",\n \"occurrence_n\": 1,\n \"silence_duration\": 1\n }\n ],\n \"scripted_responses_ordered\": true,\n \"role_description\": \"<string>\",\n \"speaks_first_config\": {\n \"speaks_first\": true,\n \"message\": \"<string>\",\n \"dynamic\": true\n },\n \"original_transcript\": \"<string>\",\n \"formatted_transcript\": [\n {}\n ],\n \"enriched_playback\": [\n {}\n ],\n \"num_runs\": 2,\n \"livekit_metadata\": {},\n \"always_on_mode\": true,\n \"always_on_active\": true,\n \"test_name\": \"<string>\",\n \"journey_steps\": [\n {\n \"step\": 1,\n \"intent\": \"\",\n \"success_criteria\": \"\",\n \"modality\": \"voice\",\n \"wait_seconds\": 123,\n \"response_window_seconds\": 123,\n \"unresponsive\": false,\n \"phone_number\": \"<string>\"\n }\n ],\n \"override_conflict\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"intent\": \"<string>\",\n \"success_criteria\": \"<string>\",\n \"name\": \"<string>\",\n \"tag\": \"<string>\",\n \"custom_voice_id\": \"<string>\",\n \"custom_background_noise_url\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"extension\": \"<string>\",\n \"outbound_text_number\": \"<string>\",\n \"follow_up_sms_success_criteria\": \"<string>\",\n \"background_noise_volume\": 0.5,\n \"expected_tool_calls\": [\n {\n \"name\": \"<string>\",\n \"parameters\": {},\n \"output\": \"<unknown>\"\n }\n ],\n \"allow_end_call_tool\": true,\n \"allow_silence_tool\": true,\n \"allow_dtmf_tool\": true,\n \"silence_tool_instructions\": \"<string>\",\n \"endpointing_delay\": 123,\n \"creativity\": 1,\n \"hangup_phrases\": [\n \"<string>\"\n ],\n \"hangup_instructions\": \"<string>\",\n \"silence_timeout\": 16,\n \"simulation_ids\": [\n 123\n ],\n \"traits\": [\n {\n \"trait_name\": \"<string>\",\n \"value\": \"<unknown>\",\n \"is_sip_header\": false\n }\n ],\n \"interruptions\": {},\n \"scripted_responses\": [\n {\n \"match_phrase\": \"<string>\",\n \"response_value\": \"<string>\",\n \"scripted_response_audio_snippet_url\": \"<string>\",\n \"occurrence_n\": 1,\n \"silence_duration\": 1\n }\n ],\n \"scripted_responses_ordered\": true,\n \"role_description\": \"<string>\",\n \"speaks_first_config\": {\n \"speaks_first\": true,\n \"message\": \"<string>\",\n \"dynamic\": true\n },\n \"original_transcript\": \"<string>\",\n \"formatted_transcript\": [\n {}\n ],\n \"enriched_playback\": [\n {}\n ],\n \"num_runs\": 2,\n \"livekit_metadata\": {},\n \"always_on_mode\": true,\n \"always_on_active\": true,\n \"test_name\": \"<string>\",\n \"journey_steps\": [\n {\n \"step\": 1,\n \"intent\": \"\",\n \"success_criteria\": \"\",\n \"modality\": \"voice\",\n \"wait_seconds\": 123,\n \"response_window_seconds\": 123,\n \"unresponsive\": false,\n \"phone_number\": \"<string>\"\n }\n ],\n \"override_conflict\": false\n}"
response = http.request(request)
puts response.read_body{
"digital_human": {
"intent": "<string>",
"success_criteria": "<string>",
"id": 123,
"bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tag": "<string>",
"tags": [
"<string>"
],
"system_prompt_rule_ids": [
"<string>"
],
"system_prompt_rule_quotes": [
"<string>"
],
"name": "<string>",
"language": "en",
"accent": "multilingual",
"gender": "male",
"custom_voice_id": "<string>",
"background_noise": "<string>",
"custom_background_noise_url": "<string>",
"voice_speed": "<string>",
"audio_quality": "<string>",
"connection_quality": "<string>",
"fluency": "<string>",
"verbosity": "<string>",
"phone_number": "<string>",
"extension": "<string>",
"outbound_text_number": "<string>",
"follow_up_sms_success_criteria": "<string>",
"websocket_url": "<string>",
"background_noise_volume": 123,
"expected_tool_calls": [
{
"name": "<string>",
"parameters": {},
"output": "<unknown>"
}
],
"allow_end_call_tool": true,
"allow_silence_tool": true,
"allow_dtmf_tool": true,
"default_dtmf_or_voiced": "voiced",
"silence_tool_instructions": "default",
"endpointing_delay": 123,
"creativity": 123,
"hangup_phrases": [
"<string>"
],
"hangup_instructions": "<string>",
"silence_timeout": 123,
"role_description": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"traits": [
{
"trait_name": "<string>",
"trait_data_type": "BOOLEAN",
"value": "<unknown>",
"is_sip_header": false
}
],
"interruptions": {},
"scripted_responses": [
{
"match_type": "exact",
"match_phrase": "<string>",
"response_type": "phrase",
"occurrence_mode": "always",
"response_value": "<string>",
"scripted_response_audio_snippet_url": "<string>",
"occurrence_n": 1,
"silence_duration": 1
}
],
"scripted_responses_ordered": false,
"speaks_first_config": {
"speaks_first": true,
"mode": "custom",
"message": "<string>",
"dynamic": true
},
"original_transcript": "<string>",
"formatted_transcript": [
{}
],
"enriched_playback": [
{}
],
"workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_path_index": 123,
"tested_path": [
"<string>"
],
"livekit_metadata": {},
"test_name": "<string>",
"journey_steps": [
{
"step": 1,
"intent": "",
"success_criteria": "",
"modality": "voice",
"direction": "inbound",
"wait_seconds": 123,
"response_window_seconds": 123,
"unresponsive": false,
"phone_number": "<string>"
}
],
"always_on_mode": true,
"always_on_active": false,
"num_runs": 1,
"attack_vector": "<string>",
"attack_type": "<string>",
"attack_plan": {}
},
"simulation_ids": [
123
],
"simulation_id": 123
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}# Bluejay — Testing & Monitoring Platform for Conversational AI Agents
You are a senior backend engineer integrating the Bluejay API. Think step-by-step: first understand the endpoint, then plan the integration, then implement with minimal changes.
## Update Digital Human — PUT /v1/update-digital-human/{digital_human_id}
> **What this endpoint does:** Update a Digital Human by ID. Returns 404 if the Digital Human does not exist or belongs to a different organization. Body fields are patch-style: omit a field to leave it unchanged; include `allow_silence_tool` and/or `silence_tool_instructions` to update them (use the string `"default"` for built-in silence-tool behavior). **Effective tag:** If the body includes `tag`, workflow rules use that tag; otherwise they use existing stored tags. **Workflow-tagged (tag lowercased contains `workflow`):** **400** if intent, success_criteria, role_description, original_transcript, or formatted_transcript **change** from stored values. Same values as DB (idempotent full PUT) are OK. `enriched_playback` remains updatable. **Transcript update behavior (three cases):** - `original_transcript` only: the middleware calls an LLM formatter to produce `formatted_transcript`; both are stored. - Both `original_transcript` and `formatted_transcript`: LLM formatting is skipped; both values are stored as-is and intent/description is derived from the formatted transcript. - `formatted_transcript` only: LLM formatting is skipped; `formatted_transcript` is stored, `original_transcript` is set to null in the DB, and intent/description is derived from the formatted transcript. See docs: Workflow tags & enriched playback.
**Endpoint:** PUT `https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}`
**Auth:** `X-API-Key` header
**Content-Type:** application/json
### Required Parameters
| Name | Type | Description |
|------|------|-------------|
| digital_human_id | integer | |
| X-API-Key | string | API key required to authenticate requests. |
Review the full parameter list at https://docs.getbluejay.ai/api-reference/endpoint/update-digital-human and include any optional parameters (e.g., `intent`, `success_criteria`, `name`, `tag`, `language`, `accent`) that serve your integration's use case and align with Bluejay's testing and monitoring capabilities.
### Request Body
```json
{
"intent": "string",
"success_criteria": "string",
"name": "string",
"tag": "string",
"language": "en",
"accent": "multilingual",
"gender": "male",
"background_noise": "none",
"voice_speed": "slowest",
"audio_quality": "high",
"fluency": "beginner",
"verbosity": "low",
"phone_number": "string",
"outbound_text_number": "string",
"background_noise_volume": 1.0,
"expected_tool_calls": [
{
"name": "example_name",
"parameters": {
"key": "value"
}
}
],
"allow_end_call_tool": true,
"endpointing_delay": 1.0,
"creativity": 1.0,
"hangup_phrases": [
"string"
],
"hangup_instructions": "string",
"allow_silence_tool": false,
"silence_tool_instructions": "default",
"silence_timeout": 123,
"simulation_ids": [
123
],
"traits": [
{
"trait_name": "example_name",
"trait_data_type": "BOOLEAN",
"value": "string",
"is_sip_header": false
}
],
"interruptions": {
"type": "none"
},
"scripted_responses": [
{
"match_type": "exact",
"match_phrase": "string",
"response_type": "phrase",
"response_value": "string",
"occurrence_mode": "always",
"occurrence_n": 123,
"silence_duration": 123
}
],
"role_description": "string",
"speaks_first_config": {
"speaks_first": true,
"mode": "custom",
"message": "string"
},
"original_transcript": "string",
"formatted_transcript": [
{
"key": "value"
}
],
"enriched_playback": [
{
"key": "value"
}
],
"num_runs": 123,
"livekit_metadata": {
"key": "value"
},
"always_on_mode": true,
"always_on_active": true,
"override_conflict": true
}
```
> **Note:** `endpointing_delay` is referenced as **patience** in the UI. It controls how long (in seconds) the Digital Human waits after silence before assuming the speaker has finished talking. On an SMS Digital Human it is the minimum wait (in seconds) before a reply is sent, counting the time spent composing it. Requests may send it as `patience` instead; `endpointing_delay` is kept for existing integrations and wins if both are given.
### Example
**PUT with body:**
```python
import requests
def update_digital_human(digital_human_id: int, payload: dict, api_key: str) -> dict:
url = f"https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id}"
headers = {"X-API-Key": api_key}
response = requests.put(url, headers=headers, json=payload)
response.raise_for_status()
return response.json()
```
### Constraints
- Minimal changes — only add/change files needed for this integration.
- Match existing codebase patterns (naming, file structure, error handling).
- Include error handling for 400: Workflow-tagged Digital Human: field changes not allowed, or business-rule violation (e.g. invalid phone number, invalid accent); 404: Digital Human not found or belongs to a different organization; 422: Validation Error.
### Integration Checklist
Before writing code, verify:
1. Which module/service owns this API domain in the codebase?
2. What HTTP client and error-handling patterns does the project use?
3. Are there existing types/interfaces to extend?
Then implement the integration, export it, and confirm it compiles/passes lint.
Path Parameters
Body
Request model for updating a digital human — only provided fields are changed.
Every field must default to None: a non-None default gets filled in by Pydantic on partial payloads and silently overwrites the stored value on every update (MCP, bluejay-as-code, and FE bulk edits all send partial payloads).
The scenario the digital human enacts, in ONE OR TWO SENTENCES: what this caller wants, not how to behave. It fills one slot in a prompt that ALREADY renders traits, verbosity, fluency, a not-the-agent guardrail and end-of-call instructions, so restating those here is duplicate prompt. Anything shaped like 'if the agent says X, do Y' does not belong here — prose makes it non-deterministic. Move it: case facts the agent may ask for (member ID, DOB, order number) to traits; lines that must be said verbatim, a keypad entry, or a deliberate pause to scripted_responses; who opens the call to speaks_first_config; voice and call conditions to their own fields; and lower creativity for repeatability. If you reach for 'correctly', 'appropriately' or 'successfully' you are describing what the AGENT should do — that goes in success_criteria.
The pass/fail condition for this one test, in ONE OR TWO observable outcomes the transcript can settle. Not a rubric: a scored checklist, a per-dimension score, or anything you want graded on every call in the suite belongs in a custom metric (create_custom_metrics), not in this string. Describe the AGENT's outcome, never the digital human's own actions — those are intent.
Name of the digital human
Tag for categorizing the digital human
Language the digital human speaks
en, es, pt, ja, tr, hi, ar, he, ru, zh, ml, fr, yue, vi, de, ko, ur, te, ta, mal, kn, mr, gu, tl, el, ad Accent of the digital human
multilingual, american, american2, mature, southern, italian, indian, british, australian, scottish, irish, welsh, mexican, spanish, portuguese, french, turkish, japanese, hindi, arabic, egyptian, levantine, hebrew, russian, chinese, german, korean, urdu, telugu, tamil, malayalam, kannada, marathi, gujarati, vietnamese, cantonese, tagalog, greek, autodetect, watson, watsonbritish, watsonaustralian, watsoncanadian Gender of the digital human
male, female ElevenLabs voice_id of a cloned voice. Send empty string or null to clear and revert to the stock accent voice.
Type of background noise
none, office, talking, traffic, cafe, park, tv, noisy_restaurant, hospital, airport, street, subway_station, supermarket, construction, rain, wind, quiet_home, driving, factory, school, custom Bucket-relative path of the uploaded custom background noise audio; required when background_noise is 'custom'
Speed of the digital human's voice
slowest, slow, normal, fast, fastest Audio quality of the digital human's voice
high, medium, low, horrible How often the caller's line drops out: none, low, medium or high
none, low, medium, high Fluency level of the digital human's speech
beginner, intermediate, native Verbosity level of the digital human's responses
low, medium, high Phone number for the digital human
Extension dialed as DTMF after connecting when this DH calls an inbound agent. Send null or an empty string to clear it.
Outbound text number
Criteria the captured follow-up SMS is graded against
Volume of background noise
0 <= x <= 1Expected tool call outputs
Show child attributes
Show child attributes
Allow the digital human to end the tool call
Allow the digital human to use the silence tool
Allow the digital human to use the DTMF tool
Controls whether the agent submits numerical values via DTMF or voice. 'voiced' = speak numbers (default), 'dtmf' = use DTMF tones for eligible numerical inputs
voiced, dtmf Tool instructions; set to "default" for built-in behavior or custom text
Seconds the digital human waits before it replies. Named patience in the UI, and accepted under either name.
Model temperature for the digital human's own speech. Lower it (0.0-0.3) when you want the same call twice — regression tests and anything compared run over run. Keep near the 0.7 default for exploratory or red-team cases.
0 <= x <= 2Phrases that trigger hangup
Freeform instructions for how/when to hang up. Omit the field to leave the stored value alone; send the literal string "default" to reset to the tuned built-in end-of-call behavior, which already handles ordinary goodbyes. Any other string REPLACES it, so write one only for a condition the default would miss.
Silence timeout in seconds
x >= 15Array of simulation IDs to associate with this digital human. If provided, completely replaces existing associations.
Case facts THIS CALLER holds and can recite when the agent asks — member ID, DOB, order number, policy number, zip. Traits are the determinism lever: any case-specific value written into intent prose should be a trait instead. NOT a place for internal or agent-side information (what the CRM holds, what the agent should say or look up, expected tool arguments, grader notes) — a caller cannot know those, and the schema has no notion of an internal trait. If provided, completely replaces existing traits.
Show child attributes
Show child attributes
Simple interruption configuration with predefined levels.
- Default
- Keywords
- Contextual
Show child attributes
Show child attributes
The 'if the agent says X, the caller does Y' rules for this test, as data instead of prose — a verbatim line, a keypad entry (DTMF), or a deliberate silence. Writing the same rule into intent makes it advisory; putting it here makes it deterministic. If provided, completely replaces existing scripted responses.
Show child attributes
Show child attributes
When true, scripted_responses run as a script in list order: only the next unfired one is armed, each fires once, and a blank match_phrase fires on the digital human's next turn. When false any scripted response fires whenever its match_phrase comes up.
Who this caller is, in one short line. Identity and disposition only: what they are calling about is intent, the facts they can recite are traits, how they sound is language/accent/fluency/verbosity. Never internal or agent-side information — the digital human only knows what a real caller would know.
Who opens the call, and the caller's opening line when it must be fixed — owns the opener so intent does not have to describe it. Read the dynamic field before setting a custom message: on an agent that greets callers, a dynamic custom opener is discarded. If provided, completely replaces existing speaks first config.
Show child attributes
Show child attributes
Original transcript text. If changed from the current value, utterances are re-extracted and the intent is regenerated.
Pre-computed structured transcript as [{role, utterance}]. When provided alongside original_transcript, skips the LLM formatting call.
Show child attributes
Show child attributes
Optional enriched playback stored as JSONB: a list of turn objects
Number of times this digital human is run per simulation run (run count).
x >= 1LiveKit-specific configuration and metadata for this digital human. If provided, completely replaces existing metadata.
Whether always-on mode is enabled for this digital human
When true, this DH actively receives calls on phone_number; when false, number is assigned but inactive
User-facing label for this digital human
Ordered journey steps. If provided, completely replaces existing journey steps.
Show child attributes
Show child attributes
When true, allows activation to replace an existing always-on active DH using the same phone number.
Response
Successful Response
Response model for digital human operations with clear separation of digital human data and simulation context.