curl --request GET \
--url https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "b424880f-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "building",
"promptVersion": 1,
"brief": {
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goal": "payment_reminder",
"voiceId": "v_meklc281",
"gender": "female",
"context": "Bright Future School, Rawalpindi. Call parents about the pending monthly fee, tell them the amount and the due date, and ask when they can pay.",
"sampleRows": [
{
"name": "فرحان ملک",
"phone": "+923215558842",
"amount": "12,500",
"dueDate": "25 اگست"
}
]
},
"updatedAt": "2026-08-18T05:16:58.583Z"
}Get an assistant's build record
The durable record behind an assistant’s builds: the brief, prompt version, gate result, and chosen sample transcripts — it never expires. It is not live progress: status is whatever the last run wrote when it ended, so an in-flight refine still reads the previous outcome. Poll the build status for anything currently running.
curl --request GET \
--url https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/realtime-assistants/builds/{assistantId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "b424880f-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "building",
"promptVersion": 1,
"brief": {
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goal": "payment_reminder",
"voiceId": "v_meklc281",
"gender": "female",
"context": "Bright Future School, Rawalpindi. Call parents about the pending monthly fee, tell them the amount and the due date, and ask when they can pay.",
"sampleRows": [
{
"name": "فرحان ملک",
"phone": "+923215558842",
"amount": "12,500",
"dueDate": "25 اگست"
}
]
},
"updatedAt": "2026-08-18T05:16:58.583Z"
}Authorizations
Project API key (sk_api_…).
Path Parameters
The assistantId the build returned.
Response
The build record.
passed, agentName, businessName and sampleTranscripts land only when a build finishes; the rest is written the moment it starts.
building while the first run is in flight, then ready on success or failed on a crash — the reason lands in error. A refine keeps the previous value until its run ends.
building, ready, failed Counts up once per rewrite, so anything above 1 means the grader sent the prompt back.
Whether the final round ended with nothing flagged. false means the rounds ran out with the grader still objecting: the assistant is callable either way, so read the sample transcripts first.
The name the assistant introduces itself by, chosen during authoring.
The business it says it is calling for, taken from the brief.
The brief this build ran from, echoed with the ids it was stored under. A refine that sends a new brief replaces it.
Show child attributes
Show child attributes
The cleanest rehearsal on each path — fewest findings, longest conversation breaking ties. Either path may be missing.
Show child attributes
Show child attributes
The run that last wrote this record — what the status poll's durable fallback matches on.
Why the last run failed. Only present when status is failed.
When the record was last written — build start or finish.
