curl --request GET \
--url {scheme}://{host}:{port}/{basePath}/analytics/top-resources \
--header 'X-API-Key: <api-key>'import requests
url = "{scheme}://{host}:{port}/{basePath}/analytics/top-resources"
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('{scheme}://{host}:{port}/{basePath}/analytics/top-resources', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "62437",
CURLOPT_URL => "{scheme}://{host}:{port}/{basePath}/analytics/top-resources",
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 := "{scheme}://{host}:{port}/{basePath}/analytics/top-resources"
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("{scheme}://{host}:{port}/{basePath}/analytics/top-resources")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("{scheme}://{host}:{port}/{basePath}/analytics/top-resources")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"apiVersion": "v1",
"kind": "TopResources",
"metadata": {
"totalCount": 3,
"page": 1,
"pageSize": 3
},
"items": [
{
"kind": "Deployment",
"name": "payment-service",
"namespace": "production",
"incidentCount": 12,
"lastIncident": "2026-03-19T14:30:00Z"
},
{
"kind": "Deployment",
"name": "checkout-service",
"namespace": "production",
"incidentCount": 8,
"lastIncident": "2026-03-18T22:00:00Z"
},
{
"kind": "StatefulSet",
"name": "redis-cluster",
"namespace": "data",
"incidentCount": 5,
"lastIncident": "2026-03-17T09:15:00Z"
}
]
}
Analytics Top Resources
Returns the most incident-prone resources, sorted by incident count, to find problem areas that need structural fixes
curl --request GET \
--url {scheme}://{host}:{port}/{basePath}/analytics/top-resources \
--header 'X-API-Key: <api-key>'import requests
url = "{scheme}://{host}:{port}/{basePath}/analytics/top-resources"
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('{scheme}://{host}:{port}/{basePath}/analytics/top-resources', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "62437",
CURLOPT_URL => "{scheme}://{host}:{port}/{basePath}/analytics/top-resources",
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 := "{scheme}://{host}:{port}/{basePath}/analytics/top-resources"
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("{scheme}://{host}:{port}/{basePath}/analytics/top-resources")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("{scheme}://{host}:{port}/{basePath}/analytics/top-resources")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"apiVersion": "v1",
"kind": "TopResources",
"metadata": {
"totalCount": 3,
"page": 1,
"pageSize": 3
},
"items": [
{
"kind": "Deployment",
"name": "payment-service",
"namespace": "production",
"incidentCount": 12,
"lastIncident": "2026-03-19T14:30:00Z"
},
{
"kind": "Deployment",
"name": "checkout-service",
"namespace": "production",
"incidentCount": 8,
"lastIncident": "2026-03-18T22:00:00Z"
},
{
"kind": "StatefulSet",
"name": "redis-cluster",
"namespace": "data",
"incidentCount": 5,
"lastIncident": "2026-03-17T09:15:00Z"
}
]
}
2026-03-01T00:00:00Z). An unparseable value is ignored.viewer. Covers every namespace. Issues created in the window are grouped by their target resource (kind, name, namespace) and sorted by incidentCount, highest first. lastIncident is the creation time of the newest Issue for that resource.
{
"apiVersion": "v1",
"kind": "TopResources",
"metadata": {
"totalCount": 3,
"page": 1,
"pageSize": 3
},
"items": [
{
"kind": "Deployment",
"name": "payment-service",
"namespace": "production",
"incidentCount": 12,
"lastIncident": "2026-03-19T14:30:00Z"
},
{
"kind": "Deployment",
"name": "checkout-service",
"namespace": "production",
"incidentCount": 8,
"lastIncident": "2026-03-18T22:00:00Z"
},
{
"kind": "StatefulSet",
"name": "redis-cluster",
"namespace": "data",
"incidentCount": 5,
"lastIncident": "2026-03-17T09:15:00Z"
}
]
}
Authorizations
API key sent in the X-API-Key header. Keys are read from the Secret chatcli-operator-secrets, key api-keys (fallback: ConfigMap chatcli-operator-config, key api-keys) in the operator namespace, as a YAML list of {key, role, name, description} (name is the identity recorded on approval decisions); the operator chart creates it only with apiKeys.create: true. Roles: viewer < operator < admin — any other role string is denied everywhere. Changes are picked up within about 30 seconds; deleting both the Secret and the ConfigMap revokes every key. With no keys configured every /api/ call returns 401, unless CHATCLI_OPERATOR_DEV_MODE=true, which grants admin without a key (development only).
Query Parameters
Start of the time range (RFC3339). Unparseable values are ignored.
"2026-03-01T00:00:00Z"
End of the time range (RFC3339). Unparseable values are ignored.
"2026-03-19T23:59:59Z"
Maximum number of resources.
x >= 1