curl --request PATCH \
--url https://api.goyappr.com/agents/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"system_prompt": "<string>",
"background_sound_volume": 0.3,
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": true,
"is_active": true,
"lead_memory_enabled": true,
"vad_stop_secs": 2.525,
"vad_start_secs": 1.025,
"vad_confidence": 0.5,
"silence_timeout_secs": 455,
"max_continuous_speech_secs": 150,
"max_call_duration_secs": 1800,
"webhook_url": "<string>",
"webhook_events": [],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
}
}
'import requests
url = "https://api.goyappr.com/agents/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"system_prompt": "<string>",
"background_sound_volume": 0.3,
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": True,
"is_active": True,
"lead_memory_enabled": True,
"vad_stop_secs": 2.525,
"vad_start_secs": 1.025,
"vad_confidence": 0.5,
"silence_timeout_secs": 455,
"max_continuous_speech_secs": 150,
"max_call_duration_secs": 1800,
"webhook_url": "<string>",
"webhook_events": [],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
}
}
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({
name: '<string>',
description: '<string>',
system_prompt: '<string>',
background_sound_volume: 0.3,
temperature: 1,
greeting_message: '<string>',
agent_speaks_first: true,
is_active: true,
lead_memory_enabled: true,
vad_stop_secs: 2.525,
vad_start_secs: 1.025,
vad_confidence: 0.5,
silence_timeout_secs: 455,
max_continuous_speech_secs: 150,
max_call_duration_secs: 1800,
webhook_url: '<string>',
webhook_events: [],
webhook_headers: {Authorization: 'Bearer sk_live_…', 'X-Source': 'yappr'}
})
};
fetch('https://api.goyappr.com/agents/{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.goyappr.com/agents/{id}",
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([
'name' => '<string>',
'description' => '<string>',
'system_prompt' => '<string>',
'background_sound_volume' => 0.3,
'temperature' => 1,
'greeting_message' => '<string>',
'agent_speaks_first' => true,
'is_active' => true,
'lead_memory_enabled' => true,
'vad_stop_secs' => 2.525,
'vad_start_secs' => 1.025,
'vad_confidence' => 0.5,
'silence_timeout_secs' => 455,
'max_continuous_speech_secs' => 150,
'max_call_duration_secs' => 1800,
'webhook_url' => '<string>',
'webhook_events' => [
],
'webhook_headers' => [
'Authorization' => 'Bearer sk_live_…',
'X-Source' => 'yappr'
]
]),
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.goyappr.com/agents/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"background_sound_volume\": 0.3,\n \"temperature\": 1,\n \"greeting_message\": \"<string>\",\n \"agent_speaks_first\": true,\n \"is_active\": true,\n \"lead_memory_enabled\": true,\n \"vad_stop_secs\": 2.525,\n \"vad_start_secs\": 1.025,\n \"vad_confidence\": 0.5,\n \"silence_timeout_secs\": 455,\n \"max_continuous_speech_secs\": 150,\n \"max_call_duration_secs\": 1800,\n \"webhook_url\": \"<string>\",\n \"webhook_events\": [],\n \"webhook_headers\": {\n \"Authorization\": \"Bearer sk_live_…\",\n \"X-Source\": \"yappr\"\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.goyappr.com/agents/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"background_sound_volume\": 0.3,\n \"temperature\": 1,\n \"greeting_message\": \"<string>\",\n \"agent_speaks_first\": true,\n \"is_active\": true,\n \"lead_memory_enabled\": true,\n \"vad_stop_secs\": 2.525,\n \"vad_start_secs\": 1.025,\n \"vad_confidence\": 0.5,\n \"silence_timeout_secs\": 455,\n \"max_continuous_speech_secs\": 150,\n \"max_call_duration_secs\": 1800,\n \"webhook_url\": \"<string>\",\n \"webhook_events\": [],\n \"webhook_headers\": {\n \"Authorization\": \"Bearer sk_live_…\",\n \"X-Source\": \"yappr\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goyappr.com/agents/{id}")
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 \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"background_sound_volume\": 0.3,\n \"temperature\": 1,\n \"greeting_message\": \"<string>\",\n \"agent_speaks_first\": true,\n \"is_active\": true,\n \"lead_memory_enabled\": true,\n \"vad_stop_secs\": 2.525,\n \"vad_start_secs\": 1.025,\n \"vad_confidence\": 0.5,\n \"silence_timeout_secs\": 455,\n \"max_continuous_speech_secs\": 150,\n \"max_call_duration_secs\": 1800,\n \"webhook_url\": \"<string>\",\n \"webhook_events\": [],\n \"webhook_headers\": {\n \"Authorization\": \"Bearer sk_live_…\",\n \"X-Source\": \"yappr\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "prompt",
"flow_config": {
"nodes": [
{
"id": "<string>",
"type": "start",
"name": "<string>",
"position": {
"x": 123,
"y": 123
},
"agent_speaks_first": true,
"greeting": "<string>",
"is_literal": false,
"next_step_id": "<string>",
"auto_advance": true
}
],
"flow_config_version": "1",
"metadata": {
"custom_metadata_keys": [
"<string>"
]
}
},
"system_prompt": "<string>",
"description": "<string>",
"voice": "Michal",
"background_sound": "call_center",
"background_sound_volume": 0.3,
"language": "he",
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": true,
"vad_stop_secs": 0.5,
"vad_start_secs": 0.2,
"vad_confidence": 0.7,
"silence_timeout_secs": 60,
"max_continuous_speech_secs": 120,
"max_call_duration_secs": 600,
"lead_memory_enabled": true,
"is_active": true,
"webhook_url": "<string>",
"webhook_events": [
"call.started"
],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
},
"extraction_parameters": [
{
"name": "customerName",
"description": "The caller's full name as mentioned during the conversation"
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"code": "<string>"
}Update Agent
Send only the fields you want to change. All field names must be snake_case.
curl --request PATCH \
--url https://api.goyappr.com/agents/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"system_prompt": "<string>",
"background_sound_volume": 0.3,
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": true,
"is_active": true,
"lead_memory_enabled": true,
"vad_stop_secs": 2.525,
"vad_start_secs": 1.025,
"vad_confidence": 0.5,
"silence_timeout_secs": 455,
"max_continuous_speech_secs": 150,
"max_call_duration_secs": 1800,
"webhook_url": "<string>",
"webhook_events": [],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
}
}
'import requests
url = "https://api.goyappr.com/agents/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"system_prompt": "<string>",
"background_sound_volume": 0.3,
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": True,
"is_active": True,
"lead_memory_enabled": True,
"vad_stop_secs": 2.525,
"vad_start_secs": 1.025,
"vad_confidence": 0.5,
"silence_timeout_secs": 455,
"max_continuous_speech_secs": 150,
"max_call_duration_secs": 1800,
"webhook_url": "<string>",
"webhook_events": [],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
}
}
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({
name: '<string>',
description: '<string>',
system_prompt: '<string>',
background_sound_volume: 0.3,
temperature: 1,
greeting_message: '<string>',
agent_speaks_first: true,
is_active: true,
lead_memory_enabled: true,
vad_stop_secs: 2.525,
vad_start_secs: 1.025,
vad_confidence: 0.5,
silence_timeout_secs: 455,
max_continuous_speech_secs: 150,
max_call_duration_secs: 1800,
webhook_url: '<string>',
webhook_events: [],
webhook_headers: {Authorization: 'Bearer sk_live_…', 'X-Source': 'yappr'}
})
};
fetch('https://api.goyappr.com/agents/{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.goyappr.com/agents/{id}",
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([
'name' => '<string>',
'description' => '<string>',
'system_prompt' => '<string>',
'background_sound_volume' => 0.3,
'temperature' => 1,
'greeting_message' => '<string>',
'agent_speaks_first' => true,
'is_active' => true,
'lead_memory_enabled' => true,
'vad_stop_secs' => 2.525,
'vad_start_secs' => 1.025,
'vad_confidence' => 0.5,
'silence_timeout_secs' => 455,
'max_continuous_speech_secs' => 150,
'max_call_duration_secs' => 1800,
'webhook_url' => '<string>',
'webhook_events' => [
],
'webhook_headers' => [
'Authorization' => 'Bearer sk_live_…',
'X-Source' => 'yappr'
]
]),
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.goyappr.com/agents/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"background_sound_volume\": 0.3,\n \"temperature\": 1,\n \"greeting_message\": \"<string>\",\n \"agent_speaks_first\": true,\n \"is_active\": true,\n \"lead_memory_enabled\": true,\n \"vad_stop_secs\": 2.525,\n \"vad_start_secs\": 1.025,\n \"vad_confidence\": 0.5,\n \"silence_timeout_secs\": 455,\n \"max_continuous_speech_secs\": 150,\n \"max_call_duration_secs\": 1800,\n \"webhook_url\": \"<string>\",\n \"webhook_events\": [],\n \"webhook_headers\": {\n \"Authorization\": \"Bearer sk_live_…\",\n \"X-Source\": \"yappr\"\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.goyappr.com/agents/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"background_sound_volume\": 0.3,\n \"temperature\": 1,\n \"greeting_message\": \"<string>\",\n \"agent_speaks_first\": true,\n \"is_active\": true,\n \"lead_memory_enabled\": true,\n \"vad_stop_secs\": 2.525,\n \"vad_start_secs\": 1.025,\n \"vad_confidence\": 0.5,\n \"silence_timeout_secs\": 455,\n \"max_continuous_speech_secs\": 150,\n \"max_call_duration_secs\": 1800,\n \"webhook_url\": \"<string>\",\n \"webhook_events\": [],\n \"webhook_headers\": {\n \"Authorization\": \"Bearer sk_live_…\",\n \"X-Source\": \"yappr\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goyappr.com/agents/{id}")
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 \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"background_sound_volume\": 0.3,\n \"temperature\": 1,\n \"greeting_message\": \"<string>\",\n \"agent_speaks_first\": true,\n \"is_active\": true,\n \"lead_memory_enabled\": true,\n \"vad_stop_secs\": 2.525,\n \"vad_start_secs\": 1.025,\n \"vad_confidence\": 0.5,\n \"silence_timeout_secs\": 455,\n \"max_continuous_speech_secs\": 150,\n \"max_call_duration_secs\": 1800,\n \"webhook_url\": \"<string>\",\n \"webhook_events\": [],\n \"webhook_headers\": {\n \"Authorization\": \"Bearer sk_live_…\",\n \"X-Source\": \"yappr\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "prompt",
"flow_config": {
"nodes": [
{
"id": "<string>",
"type": "start",
"name": "<string>",
"position": {
"x": 123,
"y": 123
},
"agent_speaks_first": true,
"greeting": "<string>",
"is_literal": false,
"next_step_id": "<string>",
"auto_advance": true
}
],
"flow_config_version": "1",
"metadata": {
"custom_metadata_keys": [
"<string>"
]
}
},
"system_prompt": "<string>",
"description": "<string>",
"voice": "Michal",
"background_sound": "call_center",
"background_sound_volume": 0.3,
"language": "he",
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": true,
"vad_stop_secs": 0.5,
"vad_start_secs": 0.2,
"vad_confidence": 0.7,
"silence_timeout_secs": 60,
"max_continuous_speech_secs": 120,
"max_call_duration_secs": 600,
"lead_memory_enabled": true,
"is_active": true,
"webhook_url": "<string>",
"webhook_events": [
"call.started"
],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
},
"extraction_parameters": [
{
"name": "customerName",
"description": "The caller's full name as mentioned during the conversation"
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"code": "<string>"
}Authorizations
Your Yappr API key (e.g. ypr_live_...). Generate one in the dashboard under Settings → API Keys.
Path Parameters
Body
Replace the agent's flow graph (only valid when type='flow'). Each successful update writes a new flow_versions row, deduped by SHA-256 of the canonical JSON. type itself is immutable and rejected if present in the body.
Show child attributes
Show child attributes
The persona the agent speaks in, and the only thing that selects between Yappr's two voice families — there is no separate engine field, and engine / engine_voice are rejected if you send them.
Keren, Eitan, Hila, Ido, Boaz, Tali, Erez, Efrat are the second family, available to every workspace. Agents on these voices handle their own turn-taking and expressiveness, so temperature, vad_stop_secs, vad_start_secs and vad_confidence are rejected on them, and they cannot be used on a type='flow' agent. Any other name returns 400 listing every voice you may use.
Naming a voice from the other family MOVES the agent onto it. The move is lossless in both directions: the first family's voice is kept aside while the agent is on the second, so switching back restores it.
Michal, Yonatan, David, Rachel, Gil, Noa, Maya, Adam, Shira, Avigail, Amir, Liat, Omer, Tamar, Tom, Benny, Nir, Natan, Yael, Dvora, Yosef, Shir, Anat, Ariel, Roi, Shlomo, Dana, Alon, Ruth, Yuval, Keren, Eitan, Hila, Ido, Boaz, Tali, Erez, Efrat Ambient background sound mixed under the agent's voice during calls. Null means silent (default).
call_center, open_office, cafe, outdoor Volume of the background sound, 0.0–0.6. Capped to protect turn-taking.
0 <= x <= 0.6he, en 0 <= x <= 20.05 <= x <= 50.05 <= x <= 20 <= x <= 110 <= x <= 9000 <= x <= 3000 <= x <= 3600call.started, call.answered, call.ended, call.failed, call.no_answer, call.dnc_blocked, transcript.ready, call.analyzed Custom HTTP headers sent with every webhook delivery for this agent (e.g. an auth token). Flat name → string-value map, or null to clear. Headers that would override request routing or HTTP framing (Host, Content-Length, Transfer-Encoding, Connection, Expect, Keep-Alive, TE, Trailer, Upgrade, Proxy-*) are rejected with 400.
Show child attributes
Show child attributes
{
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
}
Response
Updated agent
prompt (default, legacy): a single system_prompt drives the call; the LLM decides when to call attached tools. flow: the call is driven by a flow_config graph of conversation, tool-call, and routing nodes. type is immutable post-create — to change types, create a new agent.
prompt, flow The flow graph. Required when type='flow', must be omitted/null when type='prompt'.
Show child attributes
Show child attributes
The persona the agent speaks in, and the only thing that selects between Yappr's two voice families — there is no separate engine field, and engine / engine_voice are rejected if you send them.
Keren, Eitan, Hila, Ido, Boaz, Tali, Erez, Efrat are the second family, available to every workspace. Agents on these voices handle their own turn-taking and expressiveness, so temperature, vad_stop_secs, vad_start_secs and vad_confidence are rejected on them, and they cannot be used on a type='flow' agent. Any other name returns 400 listing every voice you may use.
Always the name the agent actually speaks in, whichever family it is on.
Michal, Yonatan, David, Rachel, Gil, Noa, Maya, Adam, Shira, Avigail, Amir, Liat, Omer, Tamar, Tom, Benny, Nir, Natan, Yael, Dvora, Yosef, Shir, Anat, Ariel, Roi, Shlomo, Dana, Alon, Ruth, Yuval, Keren, Eitan, Hila, Ido, Boaz, Tali, Erez, Efrat Ambient background sound mixed under the agent's voice during calls. Null means silent (default).
call_center, open_office, cafe, outdoor Volume of the background sound, 0.0–0.6. Capped to protect turn-taking.
0 <= x <= 0.6he, en 0 <= x <= 2Seconds of silence before VAD confirms speech has stopped
0.05 <= x <= 5Seconds of speech before VAD confirms speech has started
0.05 <= x <= 2Minimum confidence threshold for voice detection
0 <= x <= 1Seconds of caller silence before auto-hangup. Prevents idle calls wasting credits.
10 <= x <= 900Max seconds one party can speak non-stop before auto-hangup. Catches answering machines. 0 = disabled.
0 <= x <= 300Hard cap on total call duration regardless of activity. 0 = no cap of the agent's own; the platform still ends the call after 65 minutes (3900 s), with the disconnect reason Platform call limit reached.
0 <= x <= 3600When true, the matched lead's long-term memory context is injected into the system prompt at call time.
Events posted to webhook_url as {event, timestamp, agent_id, company_id, call_id, data}.
call.failed and call.no_answer carry data.hangup_cause when the cause is known. For a call
from a number in your own Telnyx account that Telnyx
refused while it rang, call.failed has data.hangup_cause:
carrier_rejected— Telnyx refused the call (SIP 401, 403 or 407).carrier_number_invalid— Telnyx could not route the number called (SIP 404, 484 or 604).
The SIP code is not in the webhook; the carrier account keeps the last one in last_error.sip_code.
One Telnyx refused before it rang sends no webhook when POST /calls was placing it (the
request answers 422); from the queue it sends call.failed with data.error_reason instead.
call.started, call.answered, call.ended, call.failed, call.no_answer, call.dnc_blocked, transcript.ready, call.analyzed Custom HTTP headers sent with every webhook delivery for this agent (e.g. an auth token). Flat name → string-value map, or null to clear. Headers that would override request routing or HTTP framing (Host, Content-Length, Transfer-Encoding, Connection, Expect, Keep-Alive, TE, Trailer, Upgrade, Proxy-*) are rejected with 400.
Show child attributes
Show child attributes
{
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
}
AI extraction parameters — after each call, values are extracted from the transcript and included in the call.analyzed webhook payload (and stored on the call log).
Show child attributes
Show child attributes