curl --request GET \
--url https://api.app.chainloop.dev/v1/findings/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.app.chainloop.dev/v1/findings/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.app.chainloop.dev/v1/findings/summary', 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.app.chainloop.dev/v1/findings/summary",
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.app.chainloop.dev/v1/findings/summary"
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.app.chainloop.dev/v1/findings/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.app.chainloop.dev/v1/findings/summary")
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{
"suggested_actions": {
"fixable_unassessed": 5,
"critical_high_unassessed": 5,
"total_unassessed": 7,
"exploitable_unassessed": 2
},
"by_severity": [
{
"severity": null,
"count": 4
},
{
"severity": null,
"count": 4
}
],
"last_scanned_at": "2000-01-23T04:56:07.000Z",
"total": 0,
"total_exploitable": 3,
"by_effective_assessment_status": [
{
"count": 6,
"status": "ASSESSMENT_STATUS_UNSPECIFIED"
},
{
"count": 6,
"status": "ASSESSMENT_STATUS_UNSPECIFIED"
}
],
"by_finding_type": [
{
"count": 9,
"finding_type": "FINDING_TYPE_UNSPECIFIED"
},
{
"count": 9,
"finding_type": "FINDING_TYPE_UNSPECIFIED"
}
],
"unassessed_by_severity_fixable": [
{
"severity": "FINDING_SEVERITY_UNSPECIFIED",
"is_fixable": true,
"count": 1
},
{
"severity": "FINDING_SEVERITY_UNSPECIFIED",
"is_fixable": true,
"count": 1
}
],
"total_fixable": 2
}{
"code": 0,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 6,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 1,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 5,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 5,
"details": [
{
"@type": "@type"
},
{
"@type": "@type"
}
],
"message": "message"
}Summarize findings
Return aggregate finding counts (totals, assessment breakdown, unassessed severity × fixable matrix, suggested-action scalars) for the current organization, with optional filters.
curl --request GET \
--url https://api.app.chainloop.dev/v1/findings/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.app.chainloop.dev/v1/findings/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.app.chainloop.dev/v1/findings/summary', 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.app.chainloop.dev/v1/findings/summary",
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.app.chainloop.dev/v1/findings/summary"
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.app.chainloop.dev/v1/findings/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.app.chainloop.dev/v1/findings/summary")
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{
"suggested_actions": {
"fixable_unassessed": 5,
"critical_high_unassessed": 5,
"total_unassessed": 7,
"exploitable_unassessed": 2
},
"by_severity": [
{
"severity": null,
"count": 4
},
{
"severity": null,
"count": 4
}
],
"last_scanned_at": "2000-01-23T04:56:07.000Z",
"total": 0,
"total_exploitable": 3,
"by_effective_assessment_status": [
{
"count": 6,
"status": "ASSESSMENT_STATUS_UNSPECIFIED"
},
{
"count": 6,
"status": "ASSESSMENT_STATUS_UNSPECIFIED"
}
],
"by_finding_type": [
{
"count": 9,
"finding_type": "FINDING_TYPE_UNSPECIFIED"
},
{
"count": 9,
"finding_type": "FINDING_TYPE_UNSPECIFIED"
}
],
"unassessed_by_severity_fixable": [
{
"severity": "FINDING_SEVERITY_UNSPECIFIED",
"is_fixable": true,
"count": 1
},
{
"severity": "FINDING_SEVERITY_UNSPECIFIED",
"is_fixable": true,
"count": 1
}
],
"total_fixable": 2
}{
"code": 0,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 6,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 1,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 5,
"details": [
"details",
"details"
],
"message": "message"
}{
"code": 5,
"details": [
{
"@type": "@type"
},
{
"@type": "@type"
}
],
"message": "message"
}Authorizations
Bearer token for authentication
Query Parameters
Filter by project name
Filter findings by project name
Filter by project version name
Filter findings by project version name
Filter by finding types
Filter by one or more finding types
FINDING_TYPE_UNSPECIFIED, FINDING_TYPE_VULNERABILITY Filter by one or more lifecycle statuses. Unset = no filter.
- FINDING_STATUS_OPEN: OPEN: newly detected finding, not yet triaged or acted upon
- FINDING_STATUS_IN_PROGRESS: IN_PROGRESS: finding is being investigated or actively remediated
- FINDING_STATUS_RESOLVED: RESOLVED: finding has been fixed, mitigated, or otherwise closed (see resolution_reason for details)
- FINDING_STATUS_REJECTED: REJECTED: finding has been dismissed by an operator (e.g. false positive, risk accepted, out of scope)
FINDING_STATUS_UNSPECIFIED, FINDING_STATUS_OPEN, FINDING_STATUS_IN_PROGRESS, FINDING_STATUS_RESOLVED, FINDING_STATUS_REJECTED Filter by artifact IDs (UUID); matches findings linked to any of the given artifacts
Filter findings by associated software component ID (UUID)
Response
A successful response.
Aggregate finding counts for dashboards
Total number of findings matching the request filters
Breakdown by effective assessment status (bucket with status unset = unassessed)
Show child attributes
Show child attributes
Unassessed findings bucketed by severity × is_fixable
Show child attributes
Show child attributes
SuggestedActionCounts are the four scalar counts driving the Suggested Actions card. All counts are restricted to unassessed findings matching the request's status/finding_type filters.
Show child attributes
Show child attributes
{
"fixable_unassessed": 5,
"critical_high_unassessed": 5,
"total_unassessed": 7,
"exploitable_unassessed": 2
}
Breakdown by finding type
Show child attributes
Show child attributes
Total findings whose linked vulnerability is in the CISA KEV catalog
Total findings with a fix available
Breakdown by severity across all findings
Show child attributes
Show child attributes
Most recent last_seen_at timestamp across matching findings
