curl --request POST \
--url https://pria.praxislxp.com/api/ai/rtSave/conversation \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"sessionId": "<string>",
"inputs": [
"<string>"
],
"outputs": [
"<string>"
],
"tools": [
{
"name": "<string>",
"success": true,
"responseDurationMs": 123
}
],
"usage": {
"input_tokens": 123,
"output_tokens": 123
},
"sdkTranscriptOrigin": "<string>",
"provider": "<string>",
"voiceSeconds": 123
}
'import requests
url = "https://pria.praxislxp.com/api/ai/rtSave/conversation"
payload = {
"sessionId": "<string>",
"inputs": ["<string>"],
"outputs": ["<string>"],
"tools": [
{
"name": "<string>",
"success": True,
"responseDurationMs": 123
}
],
"usage": {
"input_tokens": 123,
"output_tokens": 123
},
"sdkTranscriptOrigin": "<string>",
"provider": "<string>",
"voiceSeconds": 123
}
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({
sessionId: '<string>',
inputs: ['<string>'],
outputs: ['<string>'],
tools: [{name: '<string>', success: true, responseDurationMs: 123}],
usage: {input_tokens: 123, output_tokens: 123},
sdkTranscriptOrigin: '<string>',
provider: '<string>',
voiceSeconds: 123
})
};
fetch('https://pria.praxislxp.com/api/ai/rtSave/conversation', 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/rtSave/conversation",
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([
'sessionId' => '<string>',
'inputs' => [
'<string>'
],
'outputs' => [
'<string>'
],
'tools' => [
[
'name' => '<string>',
'success' => true,
'responseDurationMs' => 123
]
],
'usage' => [
'input_tokens' => 123,
'output_tokens' => 123
],
'sdkTranscriptOrigin' => '<string>',
'provider' => '<string>',
'voiceSeconds' => 123
]),
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/rtSave/conversation"
payload := strings.NewReader("{\n \"sessionId\": \"<string>\",\n \"inputs\": [\n \"<string>\"\n ],\n \"outputs\": [\n \"<string>\"\n ],\n \"tools\": [\n {\n \"name\": \"<string>\",\n \"success\": true,\n \"responseDurationMs\": 123\n }\n ],\n \"usage\": {\n \"input_tokens\": 123,\n \"output_tokens\": 123\n },\n \"sdkTranscriptOrigin\": \"<string>\",\n \"provider\": \"<string>\",\n \"voiceSeconds\": 123\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/rtSave/conversation")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"sessionId\": \"<string>\",\n \"inputs\": [\n \"<string>\"\n ],\n \"outputs\": [\n \"<string>\"\n ],\n \"tools\": [\n {\n \"name\": \"<string>\",\n \"success\": true,\n \"responseDurationMs\": 123\n }\n ],\n \"usage\": {\n \"input_tokens\": 123,\n \"output_tokens\": 123\n },\n \"sdkTranscriptOrigin\": \"<string>\",\n \"provider\": \"<string>\",\n \"voiceSeconds\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/ai/rtSave/conversation")
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 \"sessionId\": \"<string>\",\n \"inputs\": [\n \"<string>\"\n ],\n \"outputs\": [\n \"<string>\"\n ],\n \"tools\": [\n {\n \"name\": \"<string>\",\n \"success\": true,\n \"responseDurationMs\": 123\n }\n ],\n \"usage\": {\n \"input_tokens\": 123,\n \"output_tokens\": 123\n },\n \"sdkTranscriptOrigin\": \"<string>\",\n \"provider\": \"<string>\",\n \"voiceSeconds\": 123\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"historyId": "<string>"
}Save realtime conversation
Saves a realtime conversation to history after the session ends. Records inputs, outputs, tool usage, and token consumption.
curl --request POST \
--url https://pria.praxislxp.com/api/ai/rtSave/conversation \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"sessionId": "<string>",
"inputs": [
"<string>"
],
"outputs": [
"<string>"
],
"tools": [
{
"name": "<string>",
"success": true,
"responseDurationMs": 123
}
],
"usage": {
"input_tokens": 123,
"output_tokens": 123
},
"sdkTranscriptOrigin": "<string>",
"provider": "<string>",
"voiceSeconds": 123
}
'import requests
url = "https://pria.praxislxp.com/api/ai/rtSave/conversation"
payload = {
"sessionId": "<string>",
"inputs": ["<string>"],
"outputs": ["<string>"],
"tools": [
{
"name": "<string>",
"success": True,
"responseDurationMs": 123
}
],
"usage": {
"input_tokens": 123,
"output_tokens": 123
},
"sdkTranscriptOrigin": "<string>",
"provider": "<string>",
"voiceSeconds": 123
}
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({
sessionId: '<string>',
inputs: ['<string>'],
outputs: ['<string>'],
tools: [{name: '<string>', success: true, responseDurationMs: 123}],
usage: {input_tokens: 123, output_tokens: 123},
sdkTranscriptOrigin: '<string>',
provider: '<string>',
voiceSeconds: 123
})
};
fetch('https://pria.praxislxp.com/api/ai/rtSave/conversation', 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/rtSave/conversation",
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([
'sessionId' => '<string>',
'inputs' => [
'<string>'
],
'outputs' => [
'<string>'
],
'tools' => [
[
'name' => '<string>',
'success' => true,
'responseDurationMs' => 123
]
],
'usage' => [
'input_tokens' => 123,
'output_tokens' => 123
],
'sdkTranscriptOrigin' => '<string>',
'provider' => '<string>',
'voiceSeconds' => 123
]),
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/rtSave/conversation"
payload := strings.NewReader("{\n \"sessionId\": \"<string>\",\n \"inputs\": [\n \"<string>\"\n ],\n \"outputs\": [\n \"<string>\"\n ],\n \"tools\": [\n {\n \"name\": \"<string>\",\n \"success\": true,\n \"responseDurationMs\": 123\n }\n ],\n \"usage\": {\n \"input_tokens\": 123,\n \"output_tokens\": 123\n },\n \"sdkTranscriptOrigin\": \"<string>\",\n \"provider\": \"<string>\",\n \"voiceSeconds\": 123\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/rtSave/conversation")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"sessionId\": \"<string>\",\n \"inputs\": [\n \"<string>\"\n ],\n \"outputs\": [\n \"<string>\"\n ],\n \"tools\": [\n {\n \"name\": \"<string>\",\n \"success\": true,\n \"responseDurationMs\": 123\n }\n ],\n \"usage\": {\n \"input_tokens\": 123,\n \"output_tokens\": 123\n },\n \"sdkTranscriptOrigin\": \"<string>\",\n \"provider\": \"<string>\",\n \"voiceSeconds\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/ai/rtSave/conversation")
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 \"sessionId\": \"<string>\",\n \"inputs\": [\n \"<string>\"\n ],\n \"outputs\": [\n \"<string>\"\n ],\n \"tools\": [\n {\n \"name\": \"<string>\",\n \"success\": true,\n \"responseDurationMs\": 123\n }\n ],\n \"usage\": {\n \"input_tokens\": 123,\n \"output_tokens\": 123\n },\n \"sdkTranscriptOrigin\": \"<string>\",\n \"provider\": \"<string>\",\n \"voiceSeconds\": 123\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"historyId": "<string>"
}Authorizations
JWT token passed in x-access-token header
Body
Realtime session ID. For OpenAI GPT-Live, the session id returned by /rtSession — the voice minutes are billed only for a session the server started for this user.
User inputs from the session
AI outputs from the session
Tools used during the session
Show child attributes
Show child attributes
Token usage for the session
Show child attributes
Show child attributes
Browser origin of the page that received this session's live transcript through the iframe SDK (audit; empty when none did)
Voice provider that ran the session (anam_pria_custom_llm, cartesia, google_cli, xai_cli, openai_live). Persisted as the record's rtProvider so readers label the model by lane; omitted by OpenAI Realtime, which the server derives from the twin's rtModel.
OpenAI GPT-Live only — cumulative voice seconds reported by the session. The server bounds it to the time since the session started and bills only the seconds not billed by an earlier save.
Was this page helpful?