// interfaces
Findings
List, retrieve, update, delete, and triage security findings through the REST API.
Use the findings API to integrate findings from Superagent features, customer-provided security agents, and connected advisory sources with your own security workflows.
All requests require the Bearer authentication described in the REST API.
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 | Source-specific finding kind, such as 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, and report 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."
}
]
},
"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 | Source-specific finding kind |
report_id |
string | Source record UUID when the finding has one |
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 | Source record status |
triage |
object | Automated and manual triage state |
remediation |
object | Proposed remediation and code references |
board_position |
number or null | Position on the findings board |
report |
object | Source record summary when available |
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 |
Each affected_products entry contains ecosystem, packageName, and affectedVersions. ecosystem can be an empty string when no ecosystem is known.
For repository and GitHub advisory findings, report.repository contains the GitHub repository URL. For application findings, it contains the tested target URL. Other finding kinds expose their source context through the fields defined for that source.
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 application 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.
Finding comments
Comments are available on repository, application, agent, package, and GitHub advisory findings. Open the Comments tab in a finding's detail view to discuss evidence, progress, and decisions. Organization members can add comments and edit or delete their own comments. Owners can manage all comments. Organization API keys can manage all comments on findings in their organization.
| Method | Endpoint | Result |
|---|---|---|
GET |
/api/v1/findings/{finding_id}/comments |
200 with data and pagination, newest first |
POST |
/api/v1/findings/{finding_id}/comments |
201 with the created comment in data |
PATCH |
/api/v1/findings/{finding_id}/comments/{comment_id} |
200 with the updated comment in data |
DELETE |
/api/v1/findings/{finding_id}/comments/{comment_id} |
204 with no body |
Listing accepts limit (1–100, default 25) and offset (default 0). Creating and updating accept only body: non-empty Markdown text, up to 10,000 characters after trimming leading and trailing whitespace. Empty, whitespace-only, malformed, or oversized input returns 400 invalid_request.
curl https://superagent.sh/api/v1/findings/finding_uuid/comments \
-X POST \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{"body":"Verified the fix in staging. Ready for review."}'Each comment includes id, object: "finding_comment", finding_id, body, author (type, user_id, and name), can_manage, created_at, and updated_at. API and MCP comments use author type api_key, a null user_id, and name API key. Editing retains the original author and creation time. Deleting a finding also deletes its comments. Unknown findings, comments on a different finding, and findings outside the caller's organization return 404 not_found.
The equivalent MCP tools are list_finding_comments, create_finding_comment, update_finding_comment, and delete_finding_comment.
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.
The generic findings endpoint does not create findings manually. Superagent features, customer-provided security agents, and connected advisory sources create findings through their own interfaces.
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 |