curl "https://first-signal-api.fly.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/calls/0b9e8d7c-6f5a-4b3c-9d2e-1f0a9b8c7d6e/trace" \
-H "Authorization: Bearer $SIGNAL_API_KEY"import requests
url = "https://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/trace"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/trace")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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{
"object": "trace",
"callId": "3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"providerCallId": "<string>",
"version": 123,
"direction": "<string>",
"status": "<string>",
"startedAt": "2026-10-02T14:03:07.120Z",
"endedAt": "2026-10-02T14:03:07.120Z",
"durationMs": 123,
"disconnectionReason": "<string>",
"turns": [
{
"index": 7,
"role": "agent",
"text": "Let me check what we have open next week.",
"noise": false,
"startSec": 41.2,
"endSec": 43.9,
"nodeId": "node_book_appointment",
"nodeName": "Book appointment"
}
],
"toolCalls": [
{
"index": 2,
"turnIndex": 7,
"name": "check_availability",
"arguments": "{\"service\":\"cleaning\",\"week\":\"2026-10-05\"}",
"result": null,
"success": false,
"failureKind": "timeout",
"latencyMs": 9400,
"startSec": 43.9,
"endSec": 53.3,
"nodeId": "node_book_appointment"
}
],
"path": [
{
"order": 123,
"nodeId": "<string>",
"nodeName": "<string>",
"firstTurnIndex": 123,
"turnCount": 123,
"startSec": 123,
"endSec": 123,
"arrivedBy": "<string>"
}
],
"transitions": [
{
"from": "<string>",
"to": "<string>",
"kind": "<string>"
}
],
"latency": {
"e2eP50Ms": 123,
"e2eP90Ms": 123,
"e2eMaxMs": 123,
"asrP50Ms": 123,
"llmP50Ms": 123,
"ttsP50Ms": 123,
"knowledgeBaseP50Ms": 123
},
"measures": {
"turnCount": 123,
"userTurnCount": 123,
"agentTurnCount": 123,
"agentWordShare": 123,
"longestSilenceSec": 123,
"silenceCount": 123,
"agentRepeatCount": 123,
"userRepeatCount": 123,
"userCorrectionCount": 123,
"nodeRevisitMax": 123,
"distinctNodeCount": 123,
"toolCallCount": 123,
"toolFailureCount": 123
},
"platform": {
"collectedVariables": {},
"givenVariables": {},
"transcript": "<string>"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}Get a call's trace
The call as Signal reads it: turns, tool calls, the path through the flow, latency by layer, and measurements. Facts the platform recorded, with none of its own judgements.
curl "https://first-signal-api.fly.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/calls/0b9e8d7c-6f5a-4b3c-9d2e-1f0a9b8c7d6e/trace" \
-H "Authorization: Bearer $SIGNAL_API_KEY"import requests
url = "https://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/trace"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/trace")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://first-signal-api.fly.dev/v1/agents/{agentId}/calls/{callId}/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{
"object": "trace",
"callId": "3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"providerCallId": "<string>",
"version": 123,
"direction": "<string>",
"status": "<string>",
"startedAt": "2026-10-02T14:03:07.120Z",
"endedAt": "2026-10-02T14:03:07.120Z",
"durationMs": 123,
"disconnectionReason": "<string>",
"turns": [
{
"index": 7,
"role": "agent",
"text": "Let me check what we have open next week.",
"noise": false,
"startSec": 41.2,
"endSec": 43.9,
"nodeId": "node_book_appointment",
"nodeName": "Book appointment"
}
],
"toolCalls": [
{
"index": 2,
"turnIndex": 7,
"name": "check_availability",
"arguments": "{\"service\":\"cleaning\",\"week\":\"2026-10-05\"}",
"result": null,
"success": false,
"failureKind": "timeout",
"latencyMs": 9400,
"startSec": 43.9,
"endSec": 53.3,
"nodeId": "node_book_appointment"
}
],
"path": [
{
"order": 123,
"nodeId": "<string>",
"nodeName": "<string>",
"firstTurnIndex": 123,
"turnCount": 123,
"startSec": 123,
"endSec": 123,
"arrivedBy": "<string>"
}
],
"transitions": [
{
"from": "<string>",
"to": "<string>",
"kind": "<string>"
}
],
"latency": {
"e2eP50Ms": 123,
"e2eP90Ms": 123,
"e2eMaxMs": 123,
"asrP50Ms": 123,
"llmP50Ms": 123,
"ttsP50Ms": 123,
"knowledgeBaseP50Ms": 123
},
"measures": {
"turnCount": 123,
"userTurnCount": 123,
"agentTurnCount": 123,
"agentWordShare": 123,
"longestSilenceSec": 123,
"silenceCount": 123,
"agentRepeatCount": 123,
"userRepeatCount": 123,
"userCorrectionCount": 123,
"nodeRevisitMax": 123,
"distinctNodeCount": 123,
"toolCallCount": 123,
"toolFailureCount": 123
},
"platform": {
"collectedVariables": {},
"givenVariables": {},
"transcript": "<string>"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}Authorizations
An API key (sig_...), or a session token from the web app.
Path Parameters
The agent's id.
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
The call's id in Signal (not the platform's call id).
Response
The trace.
trace The call's id in Signal.
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
The platform's call status.
"2026-10-02T14:03:07.120Z"
"2026-10-02T14:03:07.120Z"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The flow steps the call went through, in order. A step visited twice appears twice.
Show child attributes
Show child attributes
Each move between consecutive steps of path, by step id.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Measurements of the conversation. Counts, not findings: whether any of them is a problem is for the issues to say.
Show child attributes
Show child attributes
What the platform recorded, never what it concluded: the platform's own summary, sentiment and success flag are not included. No link to the call's audio is given: the recording stays with the platform.
Show child attributes
Show child attributes
Was this page helpful?