Get a chat thread
curl --request GET \
--url https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}', 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://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}",
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://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}"
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://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}")
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{
"chatId": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"user": {
"id": 123,
"type": "internal",
"email": "<string>",
"externalId": "<string>",
"name": "<string>"
},
"agentId": 123,
"initialContext": "<string>",
"source": "web",
"title": "<string>",
"turns": [
{
"files": [
"<string>"
],
"index": 123,
"messageId": "<string>",
"prompt": "<string>",
"queries": [
{
"messageId": "<string>",
"status": "success",
"tool": "<string>",
"dataSource": "<string>",
"error": "<string>",
"feedback": {
"createdAt": "<string>",
"isPositive": true,
"userId": 123
},
"rowCount": 123,
"sql": "<string>",
"title": "<string>"
}
],
"tools": [
"<string>"
],
"endedAt": "<string>",
"finalAnswer": "<string>",
"startedAt": "<string>"
}
]
}Chat History
Get a chat thread
GET
/
api
/
v1
/
deployments
/
{deploymentId}
/
chat-history
/
threads
/
{chatId}
Get a chat thread
curl --request GET \
--url https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}', 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://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}",
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://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}"
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://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{tenant}.cubecloud.dev/api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}")
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{
"chatId": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"user": {
"id": 123,
"type": "internal",
"email": "<string>",
"externalId": "<string>",
"name": "<string>"
},
"agentId": 123,
"initialContext": "<string>",
"source": "web",
"title": "<string>",
"turns": [
{
"files": [
"<string>"
],
"index": 123,
"messageId": "<string>",
"prompt": "<string>",
"queries": [
{
"messageId": "<string>",
"status": "success",
"tool": "<string>",
"dataSource": "<string>",
"error": "<string>",
"feedback": {
"createdAt": "<string>",
"isPositive": true,
"userId": 123
},
"rowCount": 123,
"sql": "<string>",
"title": "<string>"
}
],
"tools": [
"<string>"
],
"endedAt": "<string>",
"finalAnswer": "<string>",
"startedAt": "<string>"
}
]
}🔒 Admin only. Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role.
One chat thread with all of its turns, oldest first. A turn is one prompt and everything the agent did to answer it: the final answer, the tools it called, and each query it ran with its SQL, status, row count and any thumbs-up/down feedback. Query result rows are never included. A prompt, answer or SQL longer than 20,000 characters, or an error longer than 2,000, is cut and ends in
….
Chat history export is in preview: when it is not enabled for the account, 404 is returned.Authorizations
Token authentication. Send Authorization: Bearer <YOUR_TOKEN>.
Response
200 - application/json
The thread id, as used in chat URLs and the Chat API.
When the thread last changed, normally its latest turn.
Show child attributes
Show child attributes
Null for the Auto agent.
The surface inside the app the thread began on; null when it was not recorded.
Where the thread was started; null for a source this API does not name.
Available options:
web, api, mcp, slack, scheduled Oldest first. Present on a single thread, and on a list with includeTurns=true.
Show child attributes
Show child attributes