curl --request GET \
--url https://api-prod.voltai.ai/chat/conversation/{conversation_id}/ \
--header 'x-api-key: <api-key>'import requests
url = "https://api-prod.voltai.ai/chat/conversation/{conversation_id}/"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api-prod.voltai.ai/chat/conversation/{conversation_id}/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-prod.voltai.ai/chat/conversation/{conversation_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api-prod.voltai.ai/chat/conversation/{conversation_id}/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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-prod.voltai.ai/chat/conversation/{conversation_id}/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.voltai.ai/chat/conversation/{conversation_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"final_answer": "<string>",
"thinking": "<string>",
"chat_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chat_url": "<string>",
"conversation_id": 123,
"sources": [
{
"source_name": "<string>",
"page": 123,
"url": "<string>",
"id": "<string>",
"type": "<string>",
"display_name": "<string>"
}
],
"tools": [
{
"id": "<string>",
"name": "<string>",
"status": "running",
"display_name": "<string>",
"title": "<string>",
"input": {},
"output": "<string>",
"subagent_instance_id": "<string>"
}
],
"content": [
{
"type": "text",
"text": "<string>",
"subagent_instance_id": "<string>"
}
],
"status": "Completed"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Get Conversation by ID
Fetch a previously stored question/answer turn by its conversation_id.
curl --request GET \
--url https://api-prod.voltai.ai/chat/conversation/{conversation_id}/ \
--header 'x-api-key: <api-key>'import requests
url = "https://api-prod.voltai.ai/chat/conversation/{conversation_id}/"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api-prod.voltai.ai/chat/conversation/{conversation_id}/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-prod.voltai.ai/chat/conversation/{conversation_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api-prod.voltai.ai/chat/conversation/{conversation_id}/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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-prod.voltai.ai/chat/conversation/{conversation_id}/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.voltai.ai/chat/conversation/{conversation_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"final_answer": "<string>",
"thinking": "<string>",
"chat_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"chat_url": "<string>",
"conversation_id": 123,
"sources": [
{
"source_name": "<string>",
"page": 123,
"url": "<string>",
"id": "<string>",
"type": "<string>",
"display_name": "<string>"
}
],
"tools": [
{
"id": "<string>",
"name": "<string>",
"status": "running",
"display_name": "<string>",
"title": "<string>",
"input": {},
"output": "<string>",
"subagent_instance_id": "<string>"
}
],
"content": [
{
"type": "text",
"text": "<string>",
"subagent_instance_id": "<string>"
}
],
"status": "Completed"
}{
"detail": "<string>"
}{
"detail": "<string>"
}GET /chat/conversation/{conversation_id}/ to retrieve a turn created by an earlier POST /chat/query/. Send X-API-KEY in the header; the only input is the conversation_id path parameter.
Use it to re-display a prior turn, hand a turn between systems, or recover a result after an SSE stream disconnects (the agent still finishes and persists the answer).
This endpoint is read-only. It does not run the agent, consume session capacity, or count against the per-user concurrency limit.
Status
Every200 response includes a top-level status so callers polling an async turn can tell whether the answer is ready:
Completed— the turn finished. The body carries the full answer payload (same shape asPOST /chat/query/).AwaitingInput— the turn is paused waiting on user input. The body containsstatus,conversation_id,chat_id, and adetailmessage.Processing— the agent is still running. Poll again shortly.Failed— the turn stopped without producing an answer.
Response
Whenstatus is Completed, the answer fields match POST /chat/query/: final_answer, chat_id, chat_url, conversation_id, sources, tools, content, plus status.
Returns 404 if no conversation with this ID exists in the API key’s organization.
Example Response (Completed)
{
"status": "Completed",
"final_answer": "EMEM is embedded memory integrated into the device for storing code and data.",
"chat_id": "2d8a39d8-29d6-4f0f-bc5f-4c5f0f9c9d54",
"chat_url": "https://voltai.ai/ExampleOrg/chat/2d8a39d8-29d6-4f0f-bc5f-4c5f0f9c9d54",
"conversation_id": 184217,
"sources": [
{
"id": "0351-E1",
"source_name": "example-datasheet.pdf",
"page": 12,
"type": "text",
"url": "https://voltai.ai/ExampleOrg/library?source_name=example-datasheet.pdf&source_type=text&source_page=12",
"display_name": "Library Search"
}
],
"tools": [
{
"id": "call_8c2f",
"name": "search_library",
"display_name": "Library Search",
"title": "Searching \"EMEM\" in Datasheets",
"input": { "query": "EMEM" },
"output": "Found 3 matching chunks…",
"status": "success"
}
],
"content": [
{
"type": "tool",
"id": "call_8c2f",
"name": "search_library",
"display_name": "Library Search",
"title": "Searching \"EMEM\" in Datasheets",
"input": { "query": "EMEM" },
"output": "Found 3 matching chunks…",
"status": "success"
},
{
"type": "text",
"text": "EMEM is embedded memory integrated into the device for storing code and data."
}
]
}
Example Response (Processing)
{
"status": "Processing",
"conversation_id": 184217,
"chat_id": "2d8a39d8-29d6-4f0f-bc5f-4c5f0f9c9d54"
}
Example Response (Failed)
{
"status": "Failed",
"conversation_id": 184217,
"chat_id": "2d8a39d8-29d6-4f0f-bc5f-4c5f0f9c9d54",
"detail": "Conversation failed to produce a response."
}
Authorizations
Path Parameters
The integer identifier returned in conversation_id from a prior /chat/query/ response (or the start / done SSE events).
Response
The conversation's current state. Inspect the status field: when it is Completed the body carries the full answer in the same shape as the JSON response from POST /chat/query/; when it is Processing, AwaitingInput, or Failed only the lightweight status fields are returned.
- Option 1
- Option 2
Response body for GET /chat/conversation/{conversation_id}/. The shape depends on the turn's status: a Completed turn returns the full answer payload; a Processing or Failed turn returns only the status fields.
Cleaned answer text returned by the agent. Internal markup (<answer>, <ref>, <abbr>, citation tokens) is stripped.
Aggregated reasoning string from the legacy multi-agent orchestrator: per-agent entries are concatenated in execution order, each prefixed by a header line and separated by a blank line. Empty under the current agent pipeline — use tools and content to inspect the reasoning trail instead.
Thread identifier: the Chat UUID for this conversation. Reuse this value in subsequent requests to continue the same thread.
Web UI link to this thread: https://voltai.ai/{organization_name}/chat/{chat_id} using the resolved organization's name.
Identifier of the specific question/answer turn within the thread. A new conversation_id is generated for every /chat/query/ request. Use it with GET /chat/conversation/{conversation_id}/ to fetch this exact turn later.
Evidence cited by the agent. Each entry is annotated with the tool that surfaced it (display_name) and a stable id for joining back to citation tokens in final_answer.
Show child attributes
Show child attributes
Every tool call the agent made while answering this turn, in execution order. Lets non-streaming clients see the same reasoning trail that SSE clients receive as live tool_call / tool_output frames.
Show child attributes
Show child attributes
Raw agent transcript for the turn: an ordered list of text and tool items as the agent produced them. text items concatenate to final_answer; tool items mirror the entries in tools.
Text fragment emitted by the agent (main agent or a subagent). Concatenate all main-agent text items in order to reconstruct the agent's prose.
- Option 1
- Option 2
Show child attributes
Show child attributes
The turn finished and its answer is included in this response.
Completed