API
Findings
List, retrieve, update, delete, and triage security findings through the REST API.
Use the findings API to integrate repository findings, Web app findings, and GitHub advisories with your own security workflows.
All requests require the Bearer authentication described in the API overview.
List findings
GET /api/v1/findings returns paginated finding summaries.
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit |
integer | 25 |
Number of results, from 1 through 100 |
offset |
integer | 0 |
Number of matching results to skip; minimum 0 |
kind |
string | All | repository_red_team, web_app_red_team, or github_advisory |
triage_status |
string | All | new, triaging, in_review, or resolved |
curl "https://superagent.sh/api/v1/findings?kind=repository_red_team&triage_status=new&limit=50" \
-H "Authorization: Bearer sk_live_..."Response
200 OK
{
"data": [
{
"id": "finding_uuid",
"object": "finding",
"kind": "repository_red_team",
"report_id": "report_uuid",
"title": "SQL injection in search endpoint",
"description": "User input is interpolated into a SQL query.",
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
"severity": null,
"risk_level": "high",
"weakness": "CWE-89",
"cwe_ids": ["CWE-89"],
"advisory_url": null,
"source": "superagent",
"status": "in_review",
"triage_status": "new",
"triage_resolution": null,
"board_position": 1000,
"report": {
"repository": "https://github.com/acme/web",
"label": "acme/web",
"status": "in_review"
},
"created_at": "2026-07-22T07:00:00.000Z",
"updated_at": "2026-07-22T07:00:00.000Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1,
"has_more": false
}
}has_more is true when another page is available. Add the current limit to offset to request the next page.
List items expose triage_status and triage_resolution as top-level fields. They do not include the detailed triage, remediation, or affected_products fields returned by the retrieve endpoint.
Retrieve a finding
GET /api/v1/findings/{finding_id} returns full triage, remediation, report, and pull-request context.
curl https://superagent.sh/api/v1/findings/finding_uuid \
-H "Authorization: Bearer sk_live_..."Response
200 OK
{
"data": {
"id": "finding_uuid",
"object": "finding",
"kind": "repository_red_team",
"report_id": "report_uuid",
"title": "SQL injection in search endpoint",
"description": "User input is interpolated into a SQL query.",
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
"severity": null,
"risk_level": "high",
"weakness": "CWE-89",
"cwe_ids": ["CWE-89"],
"affected_products": [],
"advisory_url": null,
"source": "superagent",
"status": "in_review",
"triage": {
"status": "in_review",
"resolution": null,
"summary": "The vulnerable query is reachable by authenticated users.",
"recommendation": "Use a parameterized query.",
"report_markdown": "## Verification\n\nThe issue was reproduced.",
"verification_status": "confirmed",
"evidence": {
"request": "GET /api/search?q=test"
},
"started_at": "2026-07-22T07:05:00.000Z",
"completed_at": "2026-07-22T07:10:00.000Z"
},
"remediation": {
"proposed_patch": {
"summary": "Use a parameterized query.",
"diff": "diff --git a/app/api/search/route.ts...",
"files": ["app/api/search/route.ts"]
},
"code_references": [
{
"file": "app/api/search/route.ts",
"lineStart": 42,
"lineEnd": 44,
"symbol": "GET",
"excerpt": "const result = await sql(query)",
"reason": "The query includes untrusted input."
}
],
"pull_request": {
"status": "idle",
"url": null,
"branch": null,
"started_at": null,
"completed_at": null
}
},
"board_position": 1000,
"report": {
"repository": "https://github.com/acme/web",
"label": "acme/web",
"status": "in_review"
},
"created_at": "2026-07-22T07:00:00.000Z",
"updated_at": "2026-07-22T07:10:00.000Z"
}
}Finding fields
| Field | Type | Description |
|---|---|---|
id |
string | Finding UUID |
object |
string | Always finding |
kind |
string | repository_red_team, web_app_red_team, or github_advisory |
report_id |
string | Source report UUID; for a GitHub advisory, this is the advisory UUID |
title |
string | Finding title |
description |
string | Detailed finding description |
cvss_vector |
string or null | CVSS vector |
severity |
string or null | Source severity |
risk_level |
string or null | Normalized risk level |
weakness |
string | Primary weakness or CWE |
cwe_ids |
string[] | CWE identifiers |
affected_products |
object[] | Affected product metadata |
advisory_url |
string or null | Source advisory URL |
source |
string | Finding source |
status |
string or null | Parent report status for report findings, or advisory state for GitHub advisories |
triage |
object | Automated and manual triage state |
remediation |
object | Proposed remediation and pull-request state |
board_position |
number or null | Position on the findings board |
report |
object | Source report summary |
created_at |
string | Creation time |
updated_at |
string | Last update time |
The triage object contains:
| Field | Type | Description |
|---|---|---|
status |
string | new, triaging, in_review, or resolved |
resolution |
string or null | fixed, accepted_risk, false_positive, or wont_fix |
summary |
string or null | Automated triage summary |
recommendation |
string or null | Recommended action |
report_markdown |
string or null | Full triage report in Markdown |
verification_status |
string or null | confirmed, not_reproducible, inconclusive, or heuristic |
evidence |
JSON value or null | Structured evidence captured during triage |
started_at |
string or null | Triage start time |
completed_at |
string or null | Triage completion time |
The remediation object contains:
| Field | Type | Description |
|---|---|---|
proposed_patch |
object or null | Patch summary, unified diff, and affected files |
code_references |
object[] | References with file, optional lineStart, lineEnd, and symbol, plus excerpt and reason |
pull_request.status |
string | idle, creating, created, or failed |
pull_request.url |
string or null | Pull-request URL |
pull_request.branch |
string or null | Pull-request branch |
pull_request.started_at |
string or null | Pull-request creation start time |
pull_request.completed_at |
string or null | Pull-request creation completion time |
Each affected_products entry contains ecosystem, packageName, and affectedVersions. ecosystem can be an empty string when no ecosystem is known.
report.repository contains the GitHub repository URL for repository and GitHub advisory findings, and the tested target URL for Web app findings.
Findings outside the API key's organization return 404 not_found, the same response used for an unknown finding ID.
Update a finding
PATCH /api/v1/findings/{finding_id} updates the finding's triage lifecycle.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
triage_status |
string | Yes | new, in_review, or resolved |
triage_resolution |
string or null | When resolving | fixed, accepted_risk, false_positive, or wont_fix |
board_position |
number, numeric string, or null | No | Position on the findings board; unsupported for Web app findings |
curl https://superagent.sh/api/v1/findings/finding_uuid \
-X PATCH \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"triage_status": "resolved",
"triage_resolution": "fixed",
"board_position": 1000
}'The endpoint returns 200 OK with the full finding payload. Resolving without triage_resolution returns 400 invalid_request.
Delete a finding
DELETE /api/v1/findings/{finding_id} permanently deletes a finding. This action cannot be undone.
curl https://superagent.sh/api/v1/findings/finding_uuid \
-X DELETE \
-H "Authorization: Bearer sk_live_..."The endpoint returns 204 No Content with an empty response body.
Findings cannot be created manually. They originate from reports and GitHub advisories.
Trigger finding triage
POST /api/v1/findings/{finding_id}/triage starts billable automated triage. The request has no body.
curl https://superagent.sh/api/v1/findings/finding_uuid/triage \
-X POST \
-H "Authorization: Bearer sk_live_..."Response
202 Accepted
{
"data": {
"id": "finding_uuid",
"object": "finding",
"kind": "repository_red_team",
"triage_status": "triaging"
}
}If triage is already active, the endpoint returns 409 conflict.
Errors
| HTTP status | Code | Meaning |
|---|---|---|
400 |
invalid_request |
Invalid field, query parameter, or state transition |
401 |
unauthorized |
Missing or invalid API key |
404 |
not_found |
Finding does not exist or belongs to another organization |
409 |
conflict |
Triage is already in progress |
500 |
internal_error |
Unexpected server failure |