curl --request GET \
--url https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace', 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.cloudhumans.com/claudia/v1/messages/{messageId}/trace",
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.cloudhumans.com/claudia/v1/messages/{messageId}/trace"
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.cloudhumans.com/claudia/v1/messages/{messageId}/trace")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace")
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{
"messageId": "6683f1c2a4b19e0012ab34cd",
"projectName": "acme_support",
"conversationId": "3f1c8a52-1c4e-4d0a-9a1b-2f6de2a3c111",
"assistants": {},
"trace": {
"id": "deadbeef",
"observations": [
{
"id": "obs-root",
"name": "AGENTIC_REACT_AGENT",
"type": "SPAN",
"parentObservationId": "obs-root",
"startTime": "2026-06-10T12:00:00Z",
"endTime": "2026-06-10T12:00:01Z",
"status": "ok",
"statusMessage": "tool timeout",
"metadata": {}
}
],
"name": "message-processing",
"timestamp": "2026-06-10T12:00:00Z"
},
"judge": {
"action": "CONTINUE",
"selectedAgent": "billing_agent",
"selectedAgentId": "agent-7",
"fallbackReason": "out_of_list",
"hallucinated": false,
"reasoning": "The customer asked about an invoice, so I am routing to billing."
},
"modelDecision": {
"usedSectionIds": [
"<string>"
],
"relevantSectionIds": [
"<string>"
],
"sections": [
{
"id": "665f1c2a4b19e0012ab34c99",
"usedInResponse": true,
"title": "Como pagar boleto",
"score": 0.91,
"type": "N1",
"tag": "faq",
"topic": "pagamentos",
"wasSelected": true
}
],
"responseType": "ClarificationResponse",
"agentAction": "NO_ACTION",
"classifierAction": "CLARIFY",
"modelReasoning": "Usei a seção sec-1 porque cobre a pergunta sobre boleto; descartei sec-2 por tratar de cartão.",
"classificationReasoning": "Duas seções competem pela intenção do cliente.",
"clarificationReasoning": "A pergunta é ambígua entre boleto e cartão.",
"noValidContentReasoning": "Nenhuma seção cobre segunda via de boleto."
}
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}Get a message's execution trace
The execution tree behind one processed message: the agent hand-offs, tool calls, generations and routing decision that produced it, with per-step timing and status. Take messageId and conversationId from getConversationSummary’s message list — a response message’s own id resolves it directly; a customer message’s id also resolves the same trace, as a fallback. Prompt and generation CONTENTS (the assembled system prompt, tool payloads, model completions) and section content are never included — resolve a section’s text with getEntry. The response also carries modelDecision, ClaudIA’s persisted record of what the model saw and used: the sections retrieval brought (with score and selection flags), the ids it declared it used, the classifier’s routing (RESPOND/CLARIFY/NO_VALID_CONTENT) and the written reasoning, including the routing judge’s.
curl --request GET \
--url https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace', 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.cloudhumans.com/claudia/v1/messages/{messageId}/trace",
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.cloudhumans.com/claudia/v1/messages/{messageId}/trace"
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.cloudhumans.com/claudia/v1/messages/{messageId}/trace")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudhumans.com/claudia/v1/messages/{messageId}/trace")
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{
"messageId": "6683f1c2a4b19e0012ab34cd",
"projectName": "acme_support",
"conversationId": "3f1c8a52-1c4e-4d0a-9a1b-2f6de2a3c111",
"assistants": {},
"trace": {
"id": "deadbeef",
"observations": [
{
"id": "obs-root",
"name": "AGENTIC_REACT_AGENT",
"type": "SPAN",
"parentObservationId": "obs-root",
"startTime": "2026-06-10T12:00:00Z",
"endTime": "2026-06-10T12:00:01Z",
"status": "ok",
"statusMessage": "tool timeout",
"metadata": {}
}
],
"name": "message-processing",
"timestamp": "2026-06-10T12:00:00Z"
},
"judge": {
"action": "CONTINUE",
"selectedAgent": "billing_agent",
"selectedAgentId": "agent-7",
"fallbackReason": "out_of_list",
"hallucinated": false,
"reasoning": "The customer asked about an invoice, so I am routing to billing."
},
"modelDecision": {
"usedSectionIds": [
"<string>"
],
"relevantSectionIds": [
"<string>"
],
"sections": [
{
"id": "665f1c2a4b19e0012ab34c99",
"usedInResponse": true,
"title": "Como pagar boleto",
"score": 0.91,
"type": "N1",
"tag": "faq",
"topic": "pagamentos",
"wasSelected": true
}
],
"responseType": "ClarificationResponse",
"agentAction": "NO_ACTION",
"classifierAction": "CLARIFY",
"modelReasoning": "Usei a seção sec-1 porque cobre a pergunta sobre boleto; descartei sec-2 por tratar de cartão.",
"classificationReasoning": "Duas seções competem pela intenção do cliente.",
"clarificationReasoning": "A pergunta é ambígua entre boleto e cartão.",
"noValidContentReasoning": "Nenhuma seção cobre segunda via de boleto."
}
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The message id, from getConversationSummary's message list.
Query Parameters
The conversation this message belongs to.
Response
The trace, lean-projected. trace is absent when Langfuse has not ingested it yet for this message — retry shortly, this is not an error.
The execution tree behind one processed message — steps, agent hand-offs, tool calls, routing decision, timing and errors — plus the model's persisted decision record (modelDecision): the sections it saw and used, the classifier routing, and the written reasoning. A LEAN projection: prompt/generation CONTENTS and section CONTENT are never included.
The message this trace was resolved for — from getConversationSummary's message list.
"6683f1c2a4b19e0012ab34cd"
The ClaudIA project this trace belongs to.
"acme_support"
The conversation this message belongs to — the same id you passed as conversationId.
"3f1c8a52-1c4e-4d0a-9a1b-2f6de2a3c111"
Directory of the agents that ran, keyed by assistant_id/agent_id, so an observation's metadata.assistant_id can be resolved to a display name and role. Empty when there is no trace yet, or the directory could not be resolved.
Show child attributes
Show child attributes
The trace itself. Absent when Langfuse has not ingested it yet for this message — retry shortly, this is not an error.
Show child attributes
Show child attributes
The routing judge's validated decision for this message. Absent when the trace has no judge observation — a non-agentic path, or a trace predating this instrumentation.
Show child attributes
Show child attributes
What the model saw and used to produce this reply: the sections retrieved (with score and selection flags), the ids it declared it used, the classifier's routing, and the model's own written reasoning. Read from ClaudIA's persisted decision record, independent of the Langfuse trace — it can be present when trace is still absent. Absent for a message that has no decision record (e.g. a customer turn, or a reply the platform did not audit).
Show child attributes
Show child attributes