curl "https://first-signal-api.fly.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/issues?limit=10" \
-H "Authorization: Bearer $SIGNAL_API_KEY"import requests
url = "https://first-signal-api.fly.dev/v1/agents/{agentId}/issues"
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}/issues', 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}/issues",
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}/issues"
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}/issues")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://first-signal-api.fly.dev/v1/agents/{agentId}/issues")
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": "list",
"data": [
{
"object": "issue",
"id": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"key": "tool_timeout:check_availability",
"code": "tool_timeout",
"title": "The agent did not reply in Book appointment",
"klass": "technical",
"lane": null,
"status": "discovered",
"source": "detector",
"countOnly": false,
"location": {
"kind": "tool",
"id": "check_availability",
"label": "check_availability"
},
"cause": {
"code": "tool_latency",
"label": "The availability lookup takes longer than the caller waits",
"detail": "check_availability answered after 9.4 s at the median on these calls; callers spoke again or hung up before it returned."
},
"causeEstablished": true,
"causeSummary": "The availability lookup takes longer than the caller waits",
"section": "fix",
"sectionNote": null,
"target": {
"kind": "tool",
"id": "check_availability",
"label": "check_availability"
},
"symptoms": [
{
"code": "dead_air",
"label": "Silence while a tool runs",
"count": 15
}
],
"intentSlug": "book_appointment",
"likelyCause": null,
"recommendation": "Cache the next seven days of openings, or have the agent say it is checking before the lookup starts.",
"volume": 15,
"rate": 0.03,
"failedOutcomeShare": 0.8,
"impact": "high",
"confidence": 0.86,
"priorityScore": 41.2,
"downstreamOf": null,
"consequences": [],
"firstSeenVersion": 6,
"lastSeenVersion": 8,
"fellOnLive": false,
"diagnosis": null,
"createdAt": "2026-09-12T10:01:44.000Z",
"updatedAt": "2026-10-02T08:30:12.000Z"
}
],
"hasMore": true,
"nextCursor": "<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"
}
}List issues
The agent’s issues as its board shows them, Fix, Improve and Cause not established together, highest priority first, with any issue the live version fixed (fellOnLive: none of its calls shows it) after every one still happening: open ones, without consequences of another issue unless asked for. Only confirmed patterns are listed, and never what callers did that the agent could not have handled. A pattern whose cause is not established is listed with section: "not_established" and causeEstablished: false; it is not a Fix item and should be reported as a pattern whose cause is not established. These are listed after every Fix and Improve item, on every page, each group highest priority first. Anything else held back is found by id only, with section: "hidden" and the reason in sectionNote. Withdrawn issues (the analysis stopped producing them) are never listed.
curl "https://first-signal-api.fly.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/issues?limit=10" \
-H "Authorization: Bearer $SIGNAL_API_KEY"import requests
url = "https://first-signal-api.fly.dev/v1/agents/{agentId}/issues"
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}/issues', 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}/issues",
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}/issues"
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}/issues")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://first-signal-api.fly.dev/v1/agents/{agentId}/issues")
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": "list",
"data": [
{
"object": "issue",
"id": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"key": "tool_timeout:check_availability",
"code": "tool_timeout",
"title": "The agent did not reply in Book appointment",
"klass": "technical",
"lane": null,
"status": "discovered",
"source": "detector",
"countOnly": false,
"location": {
"kind": "tool",
"id": "check_availability",
"label": "check_availability"
},
"cause": {
"code": "tool_latency",
"label": "The availability lookup takes longer than the caller waits",
"detail": "check_availability answered after 9.4 s at the median on these calls; callers spoke again or hung up before it returned."
},
"causeEstablished": true,
"causeSummary": "The availability lookup takes longer than the caller waits",
"section": "fix",
"sectionNote": null,
"target": {
"kind": "tool",
"id": "check_availability",
"label": "check_availability"
},
"symptoms": [
{
"code": "dead_air",
"label": "Silence while a tool runs",
"count": 15
}
],
"intentSlug": "book_appointment",
"likelyCause": null,
"recommendation": "Cache the next seven days of openings, or have the agent say it is checking before the lookup starts.",
"volume": 15,
"rate": 0.03,
"failedOutcomeShare": 0.8,
"impact": "high",
"confidence": 0.86,
"priorityScore": 41.2,
"downstreamOf": null,
"consequences": [],
"firstSeenVersion": 6,
"lastSeenVersion": 8,
"fellOnLive": false,
"diagnosis": null,
"createdAt": "2026-09-12T10:01:44.000Z",
"updatedAt": "2026-10-02T08:30:12.000Z"
}
],
"hasMore": true,
"nextCursor": "<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"
Query Parameters
Items per page, 1 to 100.
1 <= x <= 10025
nextCursor from the previous page.
1Only these statuses, repeated or comma separated. When given, it is the whole status filter and includeResolved is not consulted.
1discovered, investigating, fix_deployed, measuring, resolved, regressed Only these classes, repeated or comma separated. Without it, every class the board shows. "behaviour" (what callers did that the agent could not have handled) is in neither section of the board, so asking for it lists nothing.
1technical, flow, content, behaviour Include resolved issues. Without status, resolved issues are left out, as on the board.
true, false Include issues that are a consequence of another (downstreamOf set). Left out by default, as on the board, which shows them under the issue they follow from.
true, false Was this page helpful?