curl --request POST \ --url https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "persona": { "label": "بے صبرا گاہک", "behavior": "Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.", "path": "negative" }, "context": "Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.", "variables": { "name": "عائشہ صدیقی", "city": "لاہور", "dream": "پانی میں چلنے کا خواب" }}'
import requests
url = "https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate"
payload = {
"persona": {
"label": "بے صبرا گاہک",
"behavior": "Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.",
"path": "negative"
},
"context": "Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.",
"variables": {
"name": "عائشہ صدیقی",
"city": "لاہور",
"dream": "پانی میں چلنے کا خواب"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
persona: {
label: 'بے صبرا گاہک',
behavior: 'Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.',
path: 'negative'
},
context: 'Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.',
variables: {name: 'عائشہ صدیقی', city: 'لاہور', dream: 'پانی میں چلنے کا خواب'}
})
};
fetch('https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate', 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.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'persona' => [
'label' => 'بے صبرا گاہک',
'behavior' => 'Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.',
'path' => 'negative'
],
'context' => 'Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.',
'variables' => [
'name' => 'عائشہ صدیقی',
'city' => 'لاہور',
'dream' => 'پانی میں چلنے کا خواب'
]
]),
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.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate"
payload := strings.NewReader("{\n \"persona\": {\n \"label\": \"بے صبرا گاہک\",\n \"behavior\": \"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.\",\n \"path\": \"negative\"\n },\n \"context\": \"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.\",\n \"variables\": {\n \"name\": \"عائشہ صدیقی\",\n \"city\": \"لاہور\",\n \"dream\": \"پانی میں چلنے کا خواب\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"persona\": {\n \"label\": \"بے صبرا گاہک\",\n \"behavior\": \"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.\",\n \"path\": \"negative\"\n },\n \"context\": \"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.\",\n \"variables\": {\n \"name\": \"عائشہ صدیقی\",\n \"city\": \"لاہور\",\n \"dream\": \"پانی میں چلنے کا خواب\"\n }\n}")
.asString();
require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"persona\": {\n \"label\": \"بے صبرا گاہک\",\n \"behavior\": \"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.\",\n \"path\": \"negative\"\n },\n \"context\": \"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.\",\n \"variables\": {\n \"name\": \"عائشہ صدیقی\",\n \"city\": \"لاہور\",\n \"dream\": \"پانی میں چلنے کا خواب\"\n }\n}"
response = http.request(request)
puts response.read_body
event: turn
data: {"index":1,"role":"agent","text":"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔"}
event: turn
data: {"index":2,"role":"caller","text":"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟"}
event: done
data: {"personaId":"b8bed320-xxxx-xxxx-xxxx-xxxxxxxxxxxx","personaLabel":"بے صبرا گاہک","archetype":"happy","path":"negative","turns":[{"speaker":"agent","text":"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔"},{"speaker":"caller","text":"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟"}]}
Authoring an assistant
Rehearse a call against a persona
Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant’s own LLM provider, model, and generation settings. Despite the builds path, it works on any assistant — built or hand-written.
Three inputs aim the simulation:
persona — who answers. behavior goes verbatim into the caller model’s system prompt; path defaults to negative, because the uncooperative arc is where prompts break.
context — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief’s context; with neither, the caller answers like a genuine cold call.
variables — the customer record for this one call, same as variables on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it.
Anything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.
POST
/
realtime-assistants
/
builds
/
{assistantId}
/
simulate
Rehearse a call against a persona
curl --request POST \ --url https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "persona": { "label": "بے صبرا گاہک", "behavior": "Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.", "path": "negative" }, "context": "Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.", "variables": { "name": "عائشہ صدیقی", "city": "لاہور", "dream": "پانی میں چلنے کا خواب" }}'
import requests
url = "https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate"
payload = {
"persona": {
"label": "بے صبرا گاہک",
"behavior": "Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.",
"path": "negative"
},
"context": "Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.",
"variables": {
"name": "عائشہ صدیقی",
"city": "لاہور",
"dream": "پانی میں چلنے کا خواب"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
persona: {
label: 'بے صبرا گاہک',
behavior: 'Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.',
path: 'negative'
},
context: 'Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.',
variables: {name: 'عائشہ صدیقی', city: 'لاہور', dream: 'پانی میں چلنے کا خواب'}
})
};
fetch('https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate', 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.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'persona' => [
'label' => 'بے صبرا گاہک',
'behavior' => 'Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.',
'path' => 'negative'
],
'context' => 'Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.',
'variables' => [
'name' => 'عائشہ صدیقی',
'city' => 'لاہور',
'dream' => 'پانی میں چلنے کا خواب'
]
]),
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.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate"
payload := strings.NewReader("{\n \"persona\": {\n \"label\": \"بے صبرا گاہک\",\n \"behavior\": \"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.\",\n \"path\": \"negative\"\n },\n \"context\": \"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.\",\n \"variables\": {\n \"name\": \"عائشہ صدیقی\",\n \"city\": \"لاہور\",\n \"dream\": \"پانی میں چلنے کا خواب\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"persona\": {\n \"label\": \"بے صبرا گاہک\",\n \"behavior\": \"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.\",\n \"path\": \"negative\"\n },\n \"context\": \"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.\",\n \"variables\": {\n \"name\": \"عائشہ صدیقی\",\n \"city\": \"لاہور\",\n \"dream\": \"پانی میں چلنے کا خواب\"\n }\n}")
.asString();
require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}/simulate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"persona\": {\n \"label\": \"بے صبرا گاہک\",\n \"behavior\": \"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.\",\n \"path\": \"negative\"\n },\n \"context\": \"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.\",\n \"variables\": {\n \"name\": \"عائشہ صدیقی\",\n \"city\": \"لاہور\",\n \"dream\": \"پانی میں چلنے کا خواب\"\n }\n}"
response = http.request(request)
puts response.read_body
event: turn
data: {"index":1,"role":"agent","text":"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔"}
event: turn
data: {"index":2,"role":"caller","text":"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟"}
event: done
data: {"personaId":"b8bed320-xxxx-xxxx-xxxx-xxxxxxxxxxxx","personaLabel":"بے صبرا گاہک","archetype":"happy","path":"negative","turns":[{"speaker":"agent","text":"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔"},{"speaker":"caller","text":"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟"}]}
What the person picking up knows about who is ringing them and why. Overrides the context in the assistant's stored brief; with neither, they go in cold.
The contact record for this one simulated call, handed to the agent under test as its caller record. Falls back to the first sampleRows entry of the stored brief. Keys are at most 64 characters, and the whole object under 3000 characters of JSON.
Show child attributes
Response
An event stream, not a JSON body. It looks like this on the wire:
event: turn data: {"index":1,"role":"agent","text":"السلام علیکم، میں شفا کلینک سے ثناء بات کر رہی ہوں۔"}
: ping
event: turn data: {"index":2,"role":"caller","text":"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟"}
turn carries {index, role, text} — index is 1-based speaking order, role is agent or caller.
Exactly one terminal event ends the stream: done with the whole transcript, or error with a {message} — a conversation that broke mid-flight, or one that hit the five-minute ceiling.
Either side can end the conversation, and the caller often does — don't assume the transcript ends on the agent's closing line.
On done, personaId is minted for this run and archetype is always happy, whatever path you sent.
: ping keepalives arrive every 15 seconds; SSE parsers drop them.
A stream that ends with neither terminal event is a dropped connection — there is no resume, so run it again.
The response is of type string.
{"docsConfig":{"theme":"mint","$schema":"https://leaves.mintlify.com/schema/docs.json","name":"Uplift AI API Docs","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/upliftai/2tcJSpA9F8g1W_V1/logo/logo.png?fit=max\u0026auto=format\u0026n=2tcJSpA9F8g1W_V1\u0026q=85\u0026s=c3823c19a41e66e704751aa27b97cde9","dark":"https://mintcdn.com/upliftai/2tcJSpA9F8g1W_V1/logo/logo.png?fit=max\u0026auto=format\u0026n=2tcJSpA9F8g1W_V1\u0026q=85\u0026s=c3823c19a41e66e704751aa27b97cde9"},"favicon":"https://mintcdn.com/upliftai/2tcJSpA9F8g1W_V1/favicon.ico?fit=max\u0026auto=format\u0026n=2tcJSpA9F8g1W_V1\u0026q=85\u0026s=a680f5e0b8dc59015e866648796975b1","appearance":{"default":"light","strict":true},"navbar":{"links":[{"href":"mailto:founders@upliftai.org","label":"Support"}],"primary":{"type":"button","label":"Sign Up","href":"https://upliftai.org"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/upliftai"}},"integrations":{"posthog":{"apiKey":"phc_EGK5H7jrhZrIhLXWfAWCmjjljJQwF6ejp1P73EtmG7q","apiHost":"https://us.i.posthog.com"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"upliftai","hasAudioNarration":false,"actualSubdomain":"upliftai","customDomains":["docs.upliftai.org"],"gitSource":{"type":"github","owner":"uplift-initiative","repo":"runtime-api-mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6ae19c28ba4b20fd94ecdb26","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"Voice Agents","count":81},{"language":"default","tag":"API Reference","count":51},{"language":"default","tag":"Orator API","count":25},{"language":"default","tag":"SDKs","count":18},{"language":"default","tag":"Assistants","count":16},{"language":"default","tag":"Campaigns","count":11},{"language":"default","tag":"Contacts","count":11},{"language":"default","tag":"Orator REST API","count":9},{"language":"default","tag":"Node.js SDK","count":8},{"language":"default","tag":"Campaign outcomes","count":7}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".urdu{font-family:'Noto Nastaliq Urdu', sans-serif;font-size:1.2em;line-height:1.5em;text-align:justify;direction:rtl;unicode-bidi:embed;font-weight:normal;font-style:normal;font-variant:normal;text-transform:none}"}],"page":{"pagePath":"api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona","slug":"/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona","pageMetadata":{"title":"Rehearse a call against a persona","description":"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant's own LLM provider, model, and generation settings. Despite the `builds` path, it works on any assistant — built or hand-written.\n\nThree inputs aim the simulation:\n\n- `persona` — who answers. `behavior` goes verbatim into the caller model's system prompt; `path` defaults to `negative`, because the uncooperative arc is where prompts break.\n- `context` — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief's context; with neither, the caller answers like a genuine cold call.\n- `variables` — the customer record for this one call, same as `variables` on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it.\n\nAnything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/builds/{assistantId}/simulate","href":"/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant’s own LLM provider, model, and generation settings. Despite the \", _jsx(_components.code, {\n children: \"builds\"\n }), \" path, it works on any assistant — built or hand-written.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Three inputs aim the simulation:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"persona\"\n }), \" — who answers. \", _jsx(_components.code, {\n children: \"behavior\"\n }), \" goes verbatim into the caller model’s system prompt; \", _jsx(_components.code, {\n children: \"path\"\n }), \" defaults to \", _jsx(_components.code, {\n children: \"negative\"\n }), \", because the uncooperative arc is where prompts break.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"context\"\n }), \" — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief’s context; with neither, the caller answers like a genuine cold call.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"variables\"\n }), \" — the customer record for this one call, same as \", _jsx(_components.code, {\n children: \"variables\"\n }), \" on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Anything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.\"\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Rehearse a call against a persona","description":"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant's own LLM provider, model, and generation settings. Despite the `builds` path, it works on any assistant — built or hand-written.\n\nThree inputs aim the simulation:\n\n- `persona` — who answers. `behavior` goes verbatim into the caller model's system prompt; `path` defaults to `negative`, because the uncooperative arc is where prompts break.\n- `context` — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief's context; with neither, the caller answers like a genuine cold call.\n- `variables` — the customer record for this one call, same as `variables` on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it.\n\nAnything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/builds/{assistantId}/simulate","href":"/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/upliftai/ed1a602c792dd94e/data/voices.js"],"openApiReferenceData":{"operation":{"operationId":"simulateAssistantBuild","tags":["Authoring an assistant"],"summary":"Rehearse a call against a persona","description":"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant's own LLM provider, model, and generation settings. Despite the `builds` path, it works on any assistant — built or hand-written.\n\nThree inputs aim the simulation:\n\n- `persona` — who answers. `behavior` goes verbatim into the caller model's system prompt; `path` defaults to `negative`, because the uncooperative arc is where prompts break.\n- `context` — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief's context; with neither, the caller answers like a genuine cold call.\n- `variables` — the customer record for this one call, same as `variables` on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it.\n\nAnything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.","parameters":["595ad448-c777-4eec-8888-2efe4e08f4c2"],"requestBody":"bdb74c77-4c04-4272-ae1f-b7f3d2ee758f","responses":{"200":"392725bc-8ccd-4607-8a1f-19d9c2531858","400":"f45b3ec1-4382-4415-8ec5-7d415fd9492f","401":"2672e7bb-ec9d-40b0-a6f4-47e23443c14a","403":"aa0a3b38-f2b5-4ba5-97d6-60ec730a2557","404":"6d1eec0e-e5f9-4cf4-bae9-ce8ab7b2f573"},"method":"post","type":"path","servers":["f8e1e33f-9cf0-4bbb-b41e-9136c129f7ef"],"security":["73bac4ee-98c5-4fa2-834c-9f180d41c637"],"path":"/realtime-assistants/builds/{assistantId}/simulate","baseUrlOptions":["https://api.upliftai.org/v1"],"title":"Rehearse a call against a persona","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"595ad448-c777-4eec-8888-2efe4e08f4c2":{"name":"assistantId","in":"path","required":true,"description":"The assistant to rehearse.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"The assistant to rehearse.","uniqueKey":"","typeLabel":"string\u003cuuid>"},"example":"452dda41-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"persona":{"type":"object","description":"Who picks up. Kept separate from `context` and `variables` so one persona can be re-run across scenarios and contacts.","properties":{"label":{"type":"string","minLength":1,"maxLength":120,"description":"Short name for the persona, echoed back on the transcript.","isRequired":true,"uniqueKey":"persona.label","typeLabel":"string"},"behavior":{"type":"string","minLength":1,"maxLength":1000,"description":"How they behave on the call, in plain language. Goes into the persona model's prompt verbatim, so write instructions rather than adjectives.","isRequired":true,"uniqueKey":"persona.behavior","typeLabel":"string"},"path":{"type":"string","enum":["happy","negative"],"default":"negative","description":"How the conversation was meant to go, recorded on the transcript. `behavior` is what actually drives the caller.","uniqueKey":"persona.path","typeLabel":"enum\u003cstring>"}},"required":["label","behavior"],"isRequired":true,"uniqueKey":"persona","typeLabel":"object"},"context":{"type":"string","maxLength":8000,"description":"What the person picking up knows about who is ringing them and why. Overrides the `context` in the assistant's stored brief; with neither, they go in cold.","uniqueKey":"context","typeLabel":"string"},"variables":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"variables.additionalProperties","typeLabel":"string"},"description":"The contact record for this one simulated call, handed to the agent under test as its caller record. Falls back to the first `sampleRows` entry of the stored brief. Keys are at most 64 characters, and the whole object under 3000 characters of JSON.","uniqueKey":"variables","typeLabel":"object"}},"required":["persona"],"uniqueKey":"","typeLabel":"object"},"example":{"persona":{"label":"بے صبرا گاہک","behavior":"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.","path":"negative"},"context":"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.","variables":{"name":"عائشہ صدیقی","city":"لاہور","dream":"پانی میں چلنے کا خواب"}},"examples":{"Example":{"title":"Example","value":{"persona":{"label":"بے صبرا گاہک","behavior":"Interrupts early, demands to know who is calling and where they got the number, and hangs up if the answer is vague.","path":"negative"},"context":"Khwab Clinic, Lahore. You booked a dream-interpretation session last week and the clinic is calling back to walk you through the dream you submitted.","variables":{"name":"عائشہ صدیقی","city":"لاہور","dream":"پانی میں چلنے کا خواب"}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"392725bc-8ccd-4607-8a1f-19d9c2531858":{"description":"An event stream, not a JSON body. It looks like this on the wire:\n\n```text\nevent: turn\ndata: {\"index\":1,\"role\":\"agent\",\"text\":\"السلام علیکم، میں شفا کلینک سے ثناء بات کر رہی ہوں۔\"}\n\n: ping\n\nevent: turn\ndata: {\"index\":2,\"role\":\"caller\",\"text\":\"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟\"}\n\nevent: done\ndata: {\"personaId\":\"b8bed320-…\",\"personaLabel\":\"بے صبرا گاہک\",\"archetype\":\"happy\",\"path\":\"negative\",\"turns\":[…]}\n```\n\n- `turn` carries `{index, role, text}` — `index` is 1-based speaking order, `role` is `agent` or `caller`.\n- Exactly one terminal event ends the stream: `done` with the whole transcript, or `error` with a `{message}` — a conversation that broke mid-flight, or one that hit the five-minute ceiling.\n- Either side can end the conversation, and the caller often does — don't assume the transcript ends on the agent's closing line.\n- On `done`, `personaId` is minted for this run and `archetype` is always `happy`, whatever `path` you sent.\n- `: ping` keepalives arrive every 15 seconds; SSE parsers drop them.\n- A stream that ends with neither terminal event is a dropped connection — there is no resume, so run it again.","content":{"text/event-stream":{"schema":{"type":"string","uniqueKey":"","typeLabel":"string"},"example":"event: turn\ndata: {\"index\":1,\"role\":\"agent\",\"text\":\"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔\"}\n\nevent: turn\ndata: {\"index\":2,\"role\":\"caller\",\"text\":\"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟\"}\n\nevent: done\ndata: {\"personaId\":\"b8bed320-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\"personaLabel\":\"بے صبرا گاہک\",\"archetype\":\"happy\",\"path\":\"negative\",\"turns\":[{\"speaker\":\"agent\",\"text\":\"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔\"},{\"speaker\":\"caller\",\"text\":\"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟\"}]}\n","examples":{"Example":{"title":"Example","value":"event: turn\ndata: {\"index\":1,\"role\":\"agent\",\"text\":\"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔\"}\n\nevent: turn\ndata: {\"index\":2,\"role\":\"caller\",\"text\":\"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟\"}\n\nevent: done\ndata: {\"personaId\":\"b8bed320-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\"personaLabel\":\"بے صبرا گاہک\",\"archetype\":\"happy\",\"path\":\"negative\",\"turns\":[{\"speaker\":\"agent\",\"text\":\"السلام علیکم، میں خواب کلینک سے ڈاکٹر عامرہ بات کر رہی ہوں۔\"},{\"speaker\":\"caller\",\"text\":\"جی، کون؟ آپ کو میرا نمبر کہاں سے ملا؟\"}]}\n"}},"exampleType":"examples"}},"exampleType":"examples"},"f45b3ec1-4382-4415-8ec5-7d415fd9492f":{"description":"Validation failed, or the assistant's LLM cannot be simulated.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"oneOf":[{"type":"string","description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","uniqueKey":"message.oneOf.1.items.[INDEX]","typeLabel":"string"},"description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"message","typeLabel":"string | string[]"},"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"statusCode":{"type":"integer","uniqueKey":"statusCode","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"examples":{"validation":{"title":"validation","value":{"message":["persona.behavior should not be empty","persona.path must be one of the following values: happy, negative"],"error":"Bad Request","statusCode":400}},"unsupportedProvider":{"title":"unsupportedProvider","value":{"message":"Simulation does not support LLM provider 'anthropic'","error":"Bad Request","statusCode":400}}},"exampleType":"examples"}},"exampleType":"examples"},"2672e7bb-ec9d-40b0-a6f4-47e23443c14a":{"description":"A bearer key was sent but is not recognized.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"oneOf":[{"type":"string","description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","uniqueKey":"message.oneOf.1.items.[INDEX]","typeLabel":"string"},"description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"message","typeLabel":"string | string[]"},"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"statusCode":{"type":"integer","uniqueKey":"statusCode","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"invalid authorization","error":"Unauthorized","statusCode":401},"examples":{"Example":{"title":"Example","value":{"message":"invalid authorization","error":"Unauthorized","statusCode":401}}},"exampleType":"examples"}},"exampleType":"examples"},"aa0a3b38-f2b5-4ba5-97d6-60ec730a2557":{"description":"No API key sent, or the key lacks permission for this resource.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"oneOf":[{"type":"string","description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","uniqueKey":"message.oneOf.1.items.[INDEX]","typeLabel":"string"},"description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"message","typeLabel":"string | string[]"},"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"statusCode":{"type":"integer","uniqueKey":"statusCode","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"Forbidden resource","error":"Forbidden","statusCode":403},"examples":{"Example":{"title":"Example","value":{"message":"Forbidden resource","error":"Forbidden","statusCode":403}}},"exampleType":"examples"}},"exampleType":"examples"},"6d1eec0e-e5f9-4cf4-bae9-ce8ab7b2f573":{"description":"No such resource in the API key's project.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"oneOf":[{"type":"string","description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","uniqueKey":"message.oneOf.1.items.[INDEX]","typeLabel":"string"},"description":"One message per failed field for validation errors, a single string otherwise.","uniqueKey":"message.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"message","typeLabel":"string | string[]"},"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"statusCode":{"type":"integer","uniqueKey":"statusCode","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"Realtime assistant not found: 00000000-0000-4000-8000-000000000000","error":"Not Found","statusCode":404},"examples":{"Example":{"title":"Example","value":{"message":"Realtime assistant not found: 00000000-0000-4000-8000-000000000000","error":"Not Found","statusCode":404}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"73bac4ee-98c5-4fa2-834c-9f180d41c637":{"apiKey":{"type":"http","scheme":"bearer","description":"Project API key (`sk_api_…`).","scopes":[],"schemeName":"apiKey"}}},"servers":{"f8e1e33f-9cf0-4bbb-b41e-9136c129f7ef":{"url":"https://api.upliftai.org/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Project API key (`sk_api_…`).","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Project API key (`sk_api_…`).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"voice-agents/api-reference/openapi.yaml"},"subdomain":"upliftai","siteName":"Uplift AI API Docs","title":"Rehearse a call against a persona - Uplift AI API Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T06:54:41.123Z","originalFileLocation":"api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"light\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant\u0026#x27;s own LLM provider, model, and generation settings. Despite the builds path, it works on any assistant — built or hand-written. Three inputs aim the simulation: - persona — who answers. behavior goes verbatim into the caller model\u0026#x27;s system prompt; path defaults to negative, because the uncooperative arc is where prompts break. - context — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief\u0026#x27;s context; with neither, the caller answers like a genuine cold call. - variables — the customer record for this one call, same as variables on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it. Anything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Uplift AI API Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Rehearse a call against a persona - Uplift AI API Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant\u0026#x27;s own LLM provider, model, and generation settings. Despite the builds path, it works on any assistant — built or hand-written. Three inputs aim the simulation: - persona — who answers. behavior goes verbatim into the caller model\u0026#x27;s system prompt; path defaults to negative, because the uncooperative arc is where prompts break. - context — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief\u0026#x27;s context; with neither, the caller answers like a genuine cold call. - variables — the customer record for this one call, same as variables on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it. Anything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Uplift AI API Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://upliftai.mintlify.site/_mintlify/api/og/v2?division=Authoring+an+assistant\u0026amp;title=Rehearse+a+call+against+a+persona\u0026amp;description=Text-only%3A+no+call+is+placed%2C+and+it+runs+whatever+prompt+the+assistant+has+saved+right+now%2C+on+the+assistant%27s+own+LLM+provider%2C+model%2C+and+generation+settings\u0026amp;theme=bb6dd6d40a49e0d34c2227da\u0026amp;signature=ad601765c3c90acf37a950e1ba61ac31a4f4c1f87741dfc32aa6db4b3bc11de7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Rehearse a call against a persona - Uplift AI API Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant\u0026#x27;s own LLM provider, model, and generation settings. Despite the builds path, it works on any assistant — built or hand-written. Three inputs aim the simulation: - persona — who answers. behavior goes verbatim into the caller model\u0026#x27;s system prompt; path defaults to negative, because the uncooperative arc is where prompts break. - context — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief\u0026#x27;s context; with neither, the caller answers like a genuine cold call. - variables — the customer record for this one call, same as variables on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it. Anything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://upliftai.mintlify.site/_mintlify/api/og/v2?division=Authoring+an+assistant\u0026amp;title=Rehearse+a+call+against+a+persona\u0026amp;description=Text-only%3A+no+call+is+placed%2C+and+it+runs+whatever+prompt+the+assistant+has+saved+right+now%2C+on+the+assistant%27s+own+LLM+provider%2C+model%2C+and+generation+settings\u0026amp;theme=bb6dd6d40a49e0d34c2227da\u0026amp;signature=ad601765c3c90acf37a950e1ba61ac31a4f4c1f87741dfc32aa6db4b3bc11de7\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/upliftai/JKzTglt2sBZGZsC-/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Uplift AI API Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.upliftai.org/#organization\",\"name\":\"Uplift AI API Docs\",\"url\":\"https://docs.upliftai.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/upliftai/2tcJSpA9F8g1W_V1/logo/logo.png?fit=max\u0026auto=format\u0026n=2tcJSpA9F8g1W_V1\u0026q=85\u0026s=c3823c19a41e66e704751aa27b97cde9\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.upliftai.org#website\",\"name\":\"Uplift AI API Docs\",\"url\":\"https://docs.upliftai.org\",\"publisher\":{\"@id\":\"https://docs.upliftai.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona#webpage\",\"url\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona\",\"name\":\"Rehearse a call against a persona\",\"description\":\"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant's own LLM provider, model, and generation settings. Despite the builds path, it works on any assistant — built or hand-written. Three inputs aim the simulation: - persona — who answers. behavior goes verbatim into the caller model's system prompt; path defaults to negative, because the uncooperative arc is where prompts break. - context — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief's context; with neither, the caller answers like a genuine cold call. - variables — the customer record for this one call, same as variables on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it. Anything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.\",\"dateModified\":\"2026-10-28T06:54:41.123Z\",\"isPartOf\":{\"@id\":\"https://docs.upliftai.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.upliftai.org/voice-agents/api-reference/limits\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Authoring an assistant\",\"item\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/build-an-assistant-from-a-brief\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Rehearse a call against a persona\",\"item\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona#apireference\",\"headline\":\"Rehearse a call against a persona\",\"name\":\"Rehearse a call against a persona\",\"description\":\"Text-only: no call is placed, and it runs whatever prompt the assistant has saved right now, on the assistant's own LLM provider, model, and generation settings. Despite the builds path, it works on any assistant — built or hand-written. Three inputs aim the simulation: - persona — who answers. behavior goes verbatim into the caller model's system prompt; path defaults to negative, because the uncooperative arc is where prompts break. - context — the scene: what the caller already knows about who is calling and why. Omit it to fall back to the build brief's context; with neither, the caller answers like a genuine cold call. - variables — the customer record for this one call, same as variables on a real outbound call. Both sides see it: the agent substitutes its tokens, the caller answers consistently with it. Anything wrong with the setup — an unsupported provider, a bad body — fails as a plain JSON 400 before any streaming starts. Seen enough mid-conversation? Just disconnect: the run stops server-side, and so does the spend.\",\"url\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona\",\"mainEntityOfPage\":{\"@id\":\"https://docs.upliftai.org/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona#webpage\"},\"dateModified\":\"2026-10-28T06:54:41.123Z\",\"publisher\":{\"@id\":\"https://docs.upliftai.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.upliftai.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Uplift AI API Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Uplift AI API Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona.md","siteName":"Uplift AI API Docs","nav":{"global":null,"tabs":[{"tab":"Orator API","pages":[{"title":"Orator API","href":"/introduction"}]},{"tab":"Voice Agents","groups":[{"group":"Getting started","pages":[{"title":"Overview","href":"/voice-agents/getting-started/overview"},{"title":"Quickstart: Web","href":"/voice-agents/getting-started/quickstart-web"},{"title":"Quickstart: Phone","href":"/voice-agents/getting-started/quickstart-phone"}]},{"group":"Concepts","pages":[{"title":"How it works","href":"/voice-agents/concepts/how-it-works"},{"title":"Tools overview","href":"/voice-agents/concepts/tools-overview"},{"title":"Phone call states","href":"/voice-agents/concepts/phone-call-states"},{"title":"Pricing","href":"/voice-agents/concepts/pricing"}]},{"group":"Assistants","pages":[{"title":"Working with assistants","href":"/voice-agents/assistants/working-with-assistants"},{"title":"Draft and publish","href":"/voice-agents/assistants/versions"},{"title":"Transient vs stored assistants","href":"/voice-agents/assistants/transient-vs-stored"},{"title":"Provider \u0026 model reference","href":"/voice-agents/assistants/providers-and-models"},{"title":"Recommended stack","href":"/voice-agents/assistants/recommended-stack"},{"title":"Voice prompting","href":"/voice-agents/assistants/voice-prompting"},{"title":"Build, refine \u0026 simulate","href":"/voice-agents/assistants/build-refine-simulate"},{"title":"Scorecards","href":"/voice-agents/assistants/scorecards"}]},{"group":"Tools","pages":[{"title":"Client tools","href":"/voice-agents/tools/client-tools"},{"title":"Webhook tools","href":"/voice-agents/tools/webhook-tools"},{"title":"End call","href":"/voice-agents/tools/system/end-call"}]},{"group":"Personalization","pages":[{"title":"Variables","href":"/voice-agents/personalization/variables"},{"title":"Per-call instructions","href":"/voice-agents/personalization/per-call-instructions"}]},{"group":"Calling","pages":[{"title":"Outbound calls","href":"/voice-agents/calling/outbound"},{"title":"Inbound calls","href":"/voice-agents/calling/inbound"},{"title":"Phone numbers \u0026 concurrency","href":"/voice-agents/calling/concurrency"},{"title":"Call end reasons","href":"/voice-agents/calling/call-end-reasons"},{"title":"Session details \u0026 transcripts","href":"/voice-agents/calling/session-details"},{"title":"Live listen","href":"/voice-agents/calling/live-listen"}]},{"group":"Campaigns","pages":[{"title":"Getting started with batch calling","href":"/voice-agents/campaigns/getting-started"},{"title":"[ ] Static vs continuous campaigns","hidden":true,"href":"/voice-agents/campaigns/static-vs-continuous"},{"title":"[ ] Static campaigns","hidden":true,"href":"/voice-agents/campaigns/static"},{"title":"[ ] Continuous campaigns","hidden":true,"href":"/voice-agents/campaigns/continuous"},{"title":"[ ] Contacts","hidden":true,"href":"/voice-agents/campaigns/contacts"},{"title":"[ ] Scheduling \u0026 retries","hidden":true,"href":"/voice-agents/campaigns/scheduling-and-retries"},{"title":"[ ] Goals \u0026 scorecards","hidden":true,"href":"/voice-agents/campaigns/goals-and-scorecards"},{"title":"[ ] Results \u0026 stats","hidden":true,"href":"/voice-agents/campaigns/results"}]},{"group":"Webhooks","pages":[{"title":"Webhooks","href":"/voice-agents/webhooks/overview"},{"title":"Event reference","href":"/voice-agents/webhooks/events"}]},{"group":"Frontend","pages":[{"title":"[ ] Architecture","hidden":true,"href":"/voice-agents/frontend/architecture"},{"title":"[ ] React","hidden":true,"href":"/voice-agents/frontend/react"},{"title":"[ ] Widget embed","hidden":true,"href":"/voice-agents/frontend/widget"},{"title":"[ ] Monitoring UI","hidden":true,"href":"/voice-agents/frontend/monitoring-ui"}]},{"group":"Testing","pages":[{"title":"Simulating conversations","href":"/voice-agents/testing/simulation"}]},{"group":"Guides","pages":[{"title":"[ ] Appointment scheduling","hidden":true,"href":"/voice-agents/guides/appointment-scheduling"},{"title":"[ ] Event invitation","hidden":true,"href":"/voice-agents/guides/event-invitation"},{"title":"[ ] Sales / lead qualification","hidden":true,"href":"/voice-agents/guides/lead-qualification"},{"title":"[ ] Payment reminder","hidden":true,"href":"/voice-agents/guides/payment-reminder"},{"title":"[ ] Order confirmation","hidden":true,"href":"/voice-agents/guides/order-confirmation"}]},{"group":"API Reference","pages":[{"title":"Phone numbers \u0026 limits","href":"/voice-agents/api-reference/limits"},{"group":"Assistants","pages":[{"title":"Create an assistant","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants","href":"/api-reference/assistants/create-an-assistant"},{"title":"List assistants","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants","href":"/api-reference/assistants/list-assistants"},{"title":"Get an assistant","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/{realtimeAssistantId}","href":"/api-reference/assistants/get-an-assistant"},{"title":"Update an assistant","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/{realtimeAssistantId}","href":"/api-reference/assistants/update-an-assistant"},{"title":"Delete an assistant","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml delete /realtime-assistants/{realtimeAssistantId}","href":"/api-reference/assistants/delete-an-assistant"},{"title":"Publish an assistant version","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/{realtimeAssistantId}/publish","href":"/api-reference/assistants/publish-an-assistant-version"},{"title":"List published versions","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/{realtimeAssistantId}/versions","href":"/api-reference/assistants/list-published-versions"},{"title":"Get an assistant's publish state","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/{realtimeAssistantId}/metadata","href":"/api-reference/assistants/get-an-assistants-publish-state"}]},{"group":"Authoring an assistant","pages":[{"title":"Build an assistant from a brief","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/builds","href":"/api-reference/authoring-an-assistant/build-an-assistant-from-a-brief"},{"title":"Poll a build's progress","description":"Works for refine runs too — poll whichever `buildId` you got back. Runs take minutes, so poll every few seconds. `done` only means the pipeline stopped; whether the grader was satisfied is `result.passed`. Live detail (`phase`, `round`, transcript counts) is kept for an hour after the run last moved; after that the poll still returns the outcome — `result` on success, `error` on failure.","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/builds/status/{buildId}","href":"/api-reference/authoring-an-assistant/poll-a-builds-progress"},{"title":"Rehearse a call against a persona","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/builds/{assistantId}/simulate","href":"/api-reference/authoring-an-assistant/rehearse-a-call-against-a-persona"},{"title":"Refine a built assistant's prompt","description":"A finished refine regenerates the assistant's `name` and its whole `config` from the brief, overwriting any edits you made by hand — only the prompt carries forward. It reruns the same rehearse-and-grade rounds as a build, so it takes minutes: [poll the build status](/api-reference/authoring-an-assistant/poll-a-builds-progress). Starting one while another build is in flight still returns 200, then surfaces as `failed` in that poll.","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/builds/{assistantId}/refine","href":"/api-reference/authoring-an-assistant/refine-a-built-assistants-prompt"},{"title":"Get an assistant's build record","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/builds/{assistantId}","href":"/api-reference/authoring-an-assistant/get-an-assistants-build-record"}]},{"group":"Starting a conversation","pages":[{"title":"Create a web session token","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/{realtimeAssistantId}/session","href":"/api-reference/starting-a-conversation/create-a-web-session-token"},{"title":"Open a session without an API key","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/{realtimeAssistantId}/public-session","href":"/api-reference/starting-a-conversation/open-a-session-without-an-api-key"},{"title":"Start a session from inline config","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/adhoc/session","href":"/api-reference/starting-a-conversation/start-a-session-from-inline-config"},{"title":"Dispatch a call from this assistant","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/{realtimeAssistantId}/call","href":"/api-reference/starting-a-conversation/dispatch-a-call-from-this-assistant"}]},{"group":"Sessions \u0026 call records","pages":[{"title":"List an assistant's sessions","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/{realtimeAssistantId}/sessions","href":"/api-reference/sessions-\u0026-call-records/list-an-assistants-sessions"},{"title":"Get a session's status","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/sessions/{sessionId}","href":"/api-reference/sessions-\u0026-call-records/get-a-sessions-status"},{"title":"Get a call's transcript and outcomes","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /realtime-assistants/sessions/{sessionId}/detail","href":"/api-reference/sessions-\u0026-call-records/get-a-calls-transcript-and-outcomes"},{"title":"Listen in on a live call","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /realtime-assistants/sessions/{sessionId}/listen","href":"/api-reference/sessions-\u0026-call-records/listen-in-on-a-live-call"}]},{"group":"Campaigns","pages":[{"title":"Create a campaign","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns","href":"/api-reference/campaigns/create-a-campaign"},{"title":"List campaigns","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /campaigns","href":"/api-reference/campaigns/list-campaigns"},{"title":"Get a campaign","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /campaigns/{campaignId}","href":"/api-reference/campaigns/get-a-campaign"},{"title":"Update a campaign","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml patch /campaigns/{campaignId}","href":"/api-reference/campaigns/update-a-campaign"},{"title":"Schedule a campaign launch","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns/{campaignId}/schedule","href":"/api-reference/campaigns/schedule-a-campaign-launch"},{"title":"Launch a campaign now","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns/{campaignId}/launch","href":"/api-reference/campaigns/launch-a-campaign-now"},{"title":"Append contacts to a campaign","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns/{campaignId}/contacts","href":"/api-reference/campaigns/append-contacts-to-a-campaign"},{"title":"Pause campaign dialing","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns/{campaignId}/pause","href":"/api-reference/campaigns/pause-campaign-dialing"},{"title":"Resume a paused campaign","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns/{campaignId}/resume","href":"/api-reference/campaigns/resume-a-paused-campaign"},{"title":"Close a continuous campaign","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns/{campaignId}/close","href":"/api-reference/campaigns/close-a-continuous-campaign"}]},{"group":"Campaign outcomes","pages":[{"title":"Aggregate stats for a campaign","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /campaigns/{campaignId}/stats","href":"/api-reference/campaign-outcomes/aggregate-stats-for-a-campaign"},{"title":"List a campaign's outcomes","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /campaigns/{campaignId}/results","href":"/api-reference/campaign-outcomes/list-a-campaigns-outcomes"},{"title":"List a campaign's calls","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /campaigns/{campaignId}/calls","href":"/api-reference/campaign-outcomes/list-a-campaigns-calls"},{"title":"List a campaign's callback requests","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /campaigns/{campaignId}/callbacks","href":"/api-reference/campaign-outcomes/list-a-campaigns-callback-requests"},{"title":"Update a callback's status","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml patch /campaigns/callbacks/{callbackId}","href":"/api-reference/campaign-outcomes/update-a-callbacks-status"},{"title":"Add a note to a callback","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /campaigns/callbacks/{callbackId}/notes","href":"/api-reference/campaign-outcomes/add-a-note-to-a-callback"},{"title":"List a campaign's conversion records","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /campaigns/{campaignId}/conversions","href":"/api-reference/campaign-outcomes/list-a-campaigns-conversion-records"}]},{"group":"Contacts","pages":[{"title":"Upload a contact file","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /contact-lists/uploads","href":"/api-reference/contacts/upload-a-contact-file"},{"title":"Re-preview an upload with a mapping","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /contact-lists/uploads/{uploadId}/preview","href":"/api-reference/contacts/re-preview-an-upload-with-a-mapping"},{"title":"Dry-run a contact import","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /contact-sources/preview","href":"/api-reference/contacts/dry-run-a-contact-import"},{"title":"Create a contact list","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /contact-lists","href":"/api-reference/contacts/create-a-contact-list"},{"title":"List contact lists","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /contact-lists","href":"/api-reference/contacts/list-contact-lists"},{"title":"Get a contact list's metadata","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /contact-lists/{listId}","href":"/api-reference/contacts/get-a-contact-lists-metadata"},{"title":"Page through a list's contacts","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /contact-lists/{listId}/contacts","href":"/api-reference/contacts/page-through-a-lists-contacts"},{"group":"Google Sheet sources","pages":[{"title":"Register a Google Sheet as a source","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /contact-sources","href":"/api-reference/google-sheet-sources/register-a-google-sheet-as-a-source"},{"title":"List registered contact sources","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /contact-sources","href":"/api-reference/google-sheet-sources/list-registered-contact-sources"},{"title":"Get a contact source's metadata","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml get /contact-sources/{sourceId}","href":"/api-reference/google-sheet-sources/get-a-contact-sources-metadata"},{"title":"Re-check a registered sheet","deprecated":null,"version":null,"openapi":"/voice-agents/api-reference/openapi.yaml post /contact-sources/{sourceId}/preview","href":"/api-reference/google-sheet-sources/re-check-a-registered-sheet"}]}]},{"group":"Integrations \u0026 delivery health","pages":[{"title":"Webhooks on the portal","href":"/voice-agents/api-reference/webhooks-on-the-portal"}]}]}]},{"tab":"Integration API","hidden":true,"pages":[{"title":"Integration API","href":"/voice-agents/api-reference/integration-api"}]},{"tab":"Realtime Assistants","hidden":true,"pages":[{"title":"Realtime Assistants","href":"/assistants/introduction"}]},{"tab":"Tutorials","pages":[{"title":"Tutorials","href":"/tutorials/livekit-voice-agent"}]},{"tab":"Syngenta Assistant","hidden":true,"pages":[{"title":"Syngenta Assistant","href":"/syngenta/authentication"}]}]},"basePath":"","title":"Rehearse a call against a persona - Uplift AI API Docs","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C9Wu0MeN.js","utils-jWgu-6Qf.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DBD8f9qn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BGuX1ui5.js","snippetPresets-Evy63nQB.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BQHO1lnV.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-B6C8m-t_.js","shallow-BG4cT0fH.js","getApiPlaygroundDisplay-CgEPrE-D.js","CodeSnippet-CU8JyZ9N.js","CodeSnippets-BnxHU32T.js","Page-D6S0Yh6q.js","getPastedJson-CwiYOonh.js","icon-DYDpWmDf.js","MethodPill-C-J-l7_c.js","DuplicateIcon-B6ARwg9w.js","createIcon-Dsv4MtDq.js","DynamicMarkdown-CtasenyM.js","SectionHeading-YNcgYwjB.js","axios-vUo_bRtp.js","Markdown-CwLx6PAg.js","clsx-C3kuh_dz.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CmKHfscc.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-U3mI6Ljh.js"]}