curl --request POST \
--url https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"result": "shadow",
"lane": "anam",
"mode": "shadow",
"turnKey": "t_1700000000000_3",
"heardTimeline": [
{
"atMs": -900,
"text": "can you book"
},
{
"atMs": -300,
"text": "can you book a room for tomorrow"
}
],
"finalText": "can you book a room for tomorrow",
"lastAssistant": "Anything else I can help with?",
"outcome": "hit_end",
"intervalMs": 1500,
"decideMs": 140,
"fluxDecideMs": 620,
"maxSilenceTaken": false,
"voiceEndSource": "flux_conf",
"verdicts": [
{
"phase": "end",
"cause": "end",
"atMs": 0,
"p": 0.92,
"ok": true,
"ms": 230,
"text": "can you book a room for tomorrow"
}
],
"barges": [],
"reopens": [],
"toolsUsed": [
"search_knowledge"
],
"toolsDropped": 0
}
'import requests
url = "https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec"
payload = {
"result": "shadow",
"lane": "anam",
"mode": "shadow",
"turnKey": "t_1700000000000_3",
"heardTimeline": [
{
"atMs": -900,
"text": "can you book"
},
{
"atMs": -300,
"text": "can you book a room for tomorrow"
}
],
"finalText": "can you book a room for tomorrow",
"lastAssistant": "Anything else I can help with?",
"outcome": "hit_end",
"intervalMs": 1500,
"decideMs": 140,
"fluxDecideMs": 620,
"maxSilenceTaken": False,
"voiceEndSource": "flux_conf",
"verdicts": [
{
"phase": "end",
"cause": "end",
"atMs": 0,
"p": 0.92,
"ok": True,
"ms": 230,
"text": "can you book a room for tomorrow"
}
],
"barges": [],
"reopens": [],
"toolsUsed": ["search_knowledge"],
"toolsDropped": 0
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
result: 'shadow',
lane: 'anam',
mode: 'shadow',
turnKey: 't_1700000000000_3',
heardTimeline: [
{atMs: -900, text: 'can you book'},
{atMs: -300, text: 'can you book a room for tomorrow'}
],
finalText: 'can you book a room for tomorrow',
lastAssistant: 'Anything else I can help with?',
outcome: 'hit_end',
intervalMs: 1500,
decideMs: 140,
fluxDecideMs: 620,
maxSilenceTaken: false,
voiceEndSource: 'flux_conf',
verdicts: [
{
phase: 'end',
cause: 'end',
atMs: 0,
p: 0.92,
ok: true,
ms: 230,
text: 'can you book a room for tomorrow'
}
],
barges: [],
reopens: [],
toolsUsed: ['search_knowledge'],
toolsDropped: 0
})
};
fetch('https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec', 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://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec",
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([
'result' => 'shadow',
'lane' => 'anam',
'mode' => 'shadow',
'turnKey' => 't_1700000000000_3',
'heardTimeline' => [
[
'atMs' => -900,
'text' => 'can you book'
],
[
'atMs' => -300,
'text' => 'can you book a room for tomorrow'
]
],
'finalText' => 'can you book a room for tomorrow',
'lastAssistant' => 'Anything else I can help with?',
'outcome' => 'hit_end',
'intervalMs' => 1500,
'decideMs' => 140,
'fluxDecideMs' => 620,
'maxSilenceTaken' => false,
'voiceEndSource' => 'flux_conf',
'verdicts' => [
[
'phase' => 'end',
'cause' => 'end',
'atMs' => 0,
'p' => 0.92,
'ok' => true,
'ms' => 230,
'text' => 'can you book a room for tomorrow'
]
],
'barges' => [
],
'reopens' => [
],
'toolsUsed' => [
'search_knowledge'
],
'toolsDropped' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <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://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec"
payload := strings.NewReader("{\n \"result\": \"shadow\",\n \"lane\": \"anam\",\n \"mode\": \"shadow\",\n \"turnKey\": \"t_1700000000000_3\",\n \"heardTimeline\": [\n {\n \"atMs\": -900,\n \"text\": \"can you book\"\n },\n {\n \"atMs\": -300,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"finalText\": \"can you book a room for tomorrow\",\n \"lastAssistant\": \"Anything else I can help with?\",\n \"outcome\": \"hit_end\",\n \"intervalMs\": 1500,\n \"decideMs\": 140,\n \"fluxDecideMs\": 620,\n \"maxSilenceTaken\": false,\n \"voiceEndSource\": \"flux_conf\",\n \"verdicts\": [\n {\n \"phase\": \"end\",\n \"cause\": \"end\",\n \"atMs\": 0,\n \"p\": 0.92,\n \"ok\": true,\n \"ms\": 230,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"barges\": [],\n \"reopens\": [],\n \"toolsUsed\": [\n \"search_knowledge\"\n ],\n \"toolsDropped\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-access-token", "<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.post("https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"result\": \"shadow\",\n \"lane\": \"anam\",\n \"mode\": \"shadow\",\n \"turnKey\": \"t_1700000000000_3\",\n \"heardTimeline\": [\n {\n \"atMs\": -900,\n \"text\": \"can you book\"\n },\n {\n \"atMs\": -300,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"finalText\": \"can you book a room for tomorrow\",\n \"lastAssistant\": \"Anything else I can help with?\",\n \"outcome\": \"hit_end\",\n \"intervalMs\": 1500,\n \"decideMs\": 140,\n \"fluxDecideMs\": 620,\n \"maxSilenceTaken\": false,\n \"voiceEndSource\": \"flux_conf\",\n \"verdicts\": [\n {\n \"phase\": \"end\",\n \"cause\": \"end\",\n \"atMs\": 0,\n \"p\": 0.92,\n \"ok\": true,\n \"ms\": 230,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"barges\": [],\n \"reopens\": [],\n \"toolsUsed\": [\n \"search_knowledge\"\n ],\n \"toolsDropped\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"result\": \"shadow\",\n \"lane\": \"anam\",\n \"mode\": \"shadow\",\n \"turnKey\": \"t_1700000000000_3\",\n \"heardTimeline\": [\n {\n \"atMs\": -900,\n \"text\": \"can you book\"\n },\n {\n \"atMs\": -300,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"finalText\": \"can you book a room for tomorrow\",\n \"lastAssistant\": \"Anything else I can help with?\",\n \"outcome\": \"hit_end\",\n \"intervalMs\": 1500,\n \"decideMs\": 140,\n \"fluxDecideMs\": 620,\n \"maxSilenceTaken\": false,\n \"voiceEndSource\": \"flux_conf\",\n \"verdicts\": [\n {\n \"phase\": \"end\",\n \"cause\": \"end\",\n \"atMs\": 0,\n \"p\": 0.92,\n \"ok\": true,\n \"ms\": 230,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"barges\": [],\n \"reopens\": [],\n \"toolsUsed\": [\n \"search_knowledge\"\n ],\n \"toolsDropped\": 0\n}"
response = http.request(request)
puts response.read_bodyReport one voice turn-prediction outcome
One record per predicted user turn: timings, verdict summaries and enums, and the
words the prediction worked on — the heard text as it grew (heardTimeline), the
final text, the text each check judged, each interruption’s words and the twin’s
last spoken words. shadow records (and any record when prediction is on) are kept
as a 30-day sample, used to improve the turn-taking model; the words are kept with
the same care as the conversation history and are never written to logs. commit,
discard and blocked are accepted and logged. One record per turnKey is kept,
with a daily per-user limit; a repeat or a record over the limit is still answered 204.
Unknown enum values, out-of-range numbers, over-long arrays, over-long or non-string
text, tool names that are not [a-z0-9_] identifiers or bad ids reject the body
with 400 (text is not trimmed: send it within the limits). Unknown keys are dropped.
Keep the whole record under 48 KB.
curl --request POST \
--url https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"result": "shadow",
"lane": "anam",
"mode": "shadow",
"turnKey": "t_1700000000000_3",
"heardTimeline": [
{
"atMs": -900,
"text": "can you book"
},
{
"atMs": -300,
"text": "can you book a room for tomorrow"
}
],
"finalText": "can you book a room for tomorrow",
"lastAssistant": "Anything else I can help with?",
"outcome": "hit_end",
"intervalMs": 1500,
"decideMs": 140,
"fluxDecideMs": 620,
"maxSilenceTaken": false,
"voiceEndSource": "flux_conf",
"verdicts": [
{
"phase": "end",
"cause": "end",
"atMs": 0,
"p": 0.92,
"ok": true,
"ms": 230,
"text": "can you book a room for tomorrow"
}
],
"barges": [],
"reopens": [],
"toolsUsed": [
"search_knowledge"
],
"toolsDropped": 0
}
'import requests
url = "https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec"
payload = {
"result": "shadow",
"lane": "anam",
"mode": "shadow",
"turnKey": "t_1700000000000_3",
"heardTimeline": [
{
"atMs": -900,
"text": "can you book"
},
{
"atMs": -300,
"text": "can you book a room for tomorrow"
}
],
"finalText": "can you book a room for tomorrow",
"lastAssistant": "Anything else I can help with?",
"outcome": "hit_end",
"intervalMs": 1500,
"decideMs": 140,
"fluxDecideMs": 620,
"maxSilenceTaken": False,
"voiceEndSource": "flux_conf",
"verdicts": [
{
"phase": "end",
"cause": "end",
"atMs": 0,
"p": 0.92,
"ok": True,
"ms": 230,
"text": "can you book a room for tomorrow"
}
],
"barges": [],
"reopens": [],
"toolsUsed": ["search_knowledge"],
"toolsDropped": 0
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
result: 'shadow',
lane: 'anam',
mode: 'shadow',
turnKey: 't_1700000000000_3',
heardTimeline: [
{atMs: -900, text: 'can you book'},
{atMs: -300, text: 'can you book a room for tomorrow'}
],
finalText: 'can you book a room for tomorrow',
lastAssistant: 'Anything else I can help with?',
outcome: 'hit_end',
intervalMs: 1500,
decideMs: 140,
fluxDecideMs: 620,
maxSilenceTaken: false,
voiceEndSource: 'flux_conf',
verdicts: [
{
phase: 'end',
cause: 'end',
atMs: 0,
p: 0.92,
ok: true,
ms: 230,
text: 'can you book a room for tomorrow'
}
],
barges: [],
reopens: [],
toolsUsed: ['search_knowledge'],
toolsDropped: 0
})
};
fetch('https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec', 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://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec",
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([
'result' => 'shadow',
'lane' => 'anam',
'mode' => 'shadow',
'turnKey' => 't_1700000000000_3',
'heardTimeline' => [
[
'atMs' => -900,
'text' => 'can you book'
],
[
'atMs' => -300,
'text' => 'can you book a room for tomorrow'
]
],
'finalText' => 'can you book a room for tomorrow',
'lastAssistant' => 'Anything else I can help with?',
'outcome' => 'hit_end',
'intervalMs' => 1500,
'decideMs' => 140,
'fluxDecideMs' => 620,
'maxSilenceTaken' => false,
'voiceEndSource' => 'flux_conf',
'verdicts' => [
[
'phase' => 'end',
'cause' => 'end',
'atMs' => 0,
'p' => 0.92,
'ok' => true,
'ms' => 230,
'text' => 'can you book a room for tomorrow'
]
],
'barges' => [
],
'reopens' => [
],
'toolsUsed' => [
'search_knowledge'
],
'toolsDropped' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <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://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec"
payload := strings.NewReader("{\n \"result\": \"shadow\",\n \"lane\": \"anam\",\n \"mode\": \"shadow\",\n \"turnKey\": \"t_1700000000000_3\",\n \"heardTimeline\": [\n {\n \"atMs\": -900,\n \"text\": \"can you book\"\n },\n {\n \"atMs\": -300,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"finalText\": \"can you book a room for tomorrow\",\n \"lastAssistant\": \"Anything else I can help with?\",\n \"outcome\": \"hit_end\",\n \"intervalMs\": 1500,\n \"decideMs\": 140,\n \"fluxDecideMs\": 620,\n \"maxSilenceTaken\": false,\n \"voiceEndSource\": \"flux_conf\",\n \"verdicts\": [\n {\n \"phase\": \"end\",\n \"cause\": \"end\",\n \"atMs\": 0,\n \"p\": 0.92,\n \"ok\": true,\n \"ms\": 230,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"barges\": [],\n \"reopens\": [],\n \"toolsUsed\": [\n \"search_knowledge\"\n ],\n \"toolsDropped\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-access-token", "<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.post("https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"result\": \"shadow\",\n \"lane\": \"anam\",\n \"mode\": \"shadow\",\n \"turnKey\": \"t_1700000000000_3\",\n \"heardTimeline\": [\n {\n \"atMs\": -900,\n \"text\": \"can you book\"\n },\n {\n \"atMs\": -300,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"finalText\": \"can you book a room for tomorrow\",\n \"lastAssistant\": \"Anything else I can help with?\",\n \"outcome\": \"hit_end\",\n \"intervalMs\": 1500,\n \"decideMs\": 140,\n \"fluxDecideMs\": 620,\n \"maxSilenceTaken\": false,\n \"voiceEndSource\": \"flux_conf\",\n \"verdicts\": [\n {\n \"phase\": \"end\",\n \"cause\": \"end\",\n \"atMs\": 0,\n \"p\": 0.92,\n \"ok\": true,\n \"ms\": 230,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"barges\": [],\n \"reopens\": [],\n \"toolsUsed\": [\n \"search_knowledge\"\n ],\n \"toolsDropped\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/ai/rtProxy/voiceTurn/spec")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"result\": \"shadow\",\n \"lane\": \"anam\",\n \"mode\": \"shadow\",\n \"turnKey\": \"t_1700000000000_3\",\n \"heardTimeline\": [\n {\n \"atMs\": -900,\n \"text\": \"can you book\"\n },\n {\n \"atMs\": -300,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"finalText\": \"can you book a room for tomorrow\",\n \"lastAssistant\": \"Anything else I can help with?\",\n \"outcome\": \"hit_end\",\n \"intervalMs\": 1500,\n \"decideMs\": 140,\n \"fluxDecideMs\": 620,\n \"maxSilenceTaken\": false,\n \"voiceEndSource\": \"flux_conf\",\n \"verdicts\": [\n {\n \"phase\": \"end\",\n \"cause\": \"end\",\n \"atMs\": 0,\n \"p\": 0.92,\n \"ok\": true,\n \"ms\": 230,\n \"text\": \"can you book a room for tomorrow\"\n }\n ],\n \"barges\": [],\n \"reopens\": [],\n \"toolsUsed\": [\n \"search_knowledge\"\n ],\n \"toolsDropped\": 0\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
JWT token passed in x-access-token header
Body
^[A-Za-z0-9_-]{1,64}$shadow, commit, discard, blocked ^[A-Za-z0-9_-]{1,64}$anam, cartesia, embed, elevenlabs, gemini, gpt_live shadow, on The predictor's moment C (barge) mode for this turn; on when the lane acted on its barge decisions.
shadow, on hit_fast, hit_end, miss_drift, miss_end, fresh, blocked, error, none ttl, mute, stt, ended, nonce, instruction, same_miss, drift, cut, refused, blocked, error, deadline, fingerprint predict, eager, end, flux 10The user's final text for the turn.
4000Each heard update that changed the text (the text so far for the turn).
60Show child attributes
Show child attributes
The end of what the twin last said, as the prediction saw it.
600The t0 of the last decision's text, relative to the first decision's t0 (0 when the turn did not reopen).
x >= 0The last decision's time, relative to the first decision's t0.
x >= 0flux_conf, flux_same, fallback none, knowledge, web, memory, files 10Show child attributes
Show child attributes
40Show child attributes
Show child attributes
10Show child attributes
Show child attributes
10^[a-z0-9_]{1,64}$Response
Accepted (also when prediction is off, for a repeated turnKey, or over the daily limit).
Was this page helpful?