Findings

Findings are issues discovered by agents during test runs, discoveries, and test plans. Each finding includes severity, evidence linking back to specific agent trace steps, and a lifecycle status (open, regressed, resolved, dismissed).

GET /api/v1/findings

List findings

Returns tenant findings visible to the authenticated principal. Defaults to active findings (open and regressed) when status is omitted. Follow next_cursor with the same filters and sort to read subsequent pages.

Parameters

ParameterTypeInRequiredDescription
project_iduuidqueryNoRestrict results to one project.
severitystringqueryNoSeverity filter.
statusstringqueryNoComma-separated lifecycle status filter.
sourcestringqueryNoFinding source filter.
typestringqueryNoFinding type filter.
date_rangestringqueryNoRecently observed findings window.
daydatequeryNoCalendar day on which the finding was first seen.
querystringqueryNoCase-insensitive title substring.
sortstringqueryNoFinding ordering.
limitintegerqueryNoMaximum findings to return.
cursorstringqueryNoContinue pagination from the next_cursor of the previous page. Opaque; send it with the same sort and filters.
not_seen_daysintegerqueryNoOnly findings whose last recorded observation is older than N days. This does not establish that a relevant test ran or that the issue was fixed. Staleness alone is not evidence for resolving or dismissing a finding.
urlstringqueryNoCase-insensitive fragment of the finding's normalized host and path.
agent_iduuidqueryNoOnly findings with evidence observed by this agent run.

Example Request

curl
curl "http://app.aiqaramba.com/api/v1/findings" \
  -H "Authorization: Bearer $AIQA_API_KEY"

Status Codes

CodeDescription
200Matching findings.
400The request is malformed or failed validation.
401Authentication is missing or invalid.
500The server could not complete the request.

Response Fields (200)

FieldTypeDescription
findingsobject[]
findings[].iduuid
findings[].tenant_iduuid
findings[].project_iduuid
findings[].typestring
findings[].severitystring
findings[].titlestring
findings[].descriptionstring
findings[].urlstring
findings[].elementstring
findings[].sourcestring
findings[].originstring
findings[].impactstring
findings[].remediationstring
findings[].statusstringFinding lifecycle state. Values: open, regressed, resolved, dismissed.
findings[].github_repostring
findings[].github_issue_numberinteger
findings[].github_issue_urlstring
findings[].github_issue_created_atdate-time
findings[].created_atdate-time
findings[].first_seen_atdate-time
findings[].last_seen_atdate-time
findings[].evidence_countinteger
findings[].last_agent_iduuid
findings[].last_agent_namestring
findings[].test_iduuid
findings[].test_namestring
totalintegerFindings matching the filters across every page.
next_cursorstringOpaque cursor for the next page; absent on the last page.
GET /api/v1/findings/summary

Summarize findings

Returns counts of the tenant's visible findings by status, severity, type, and source. Defaults to all lifecycle states, unlike the findings list which defaults to open and regressed. Supply matching status filters when comparing the summary with the list.

Parameters

ParameterTypeInRequiredDescription
project_iduuidqueryNoRestrict results to one project.
severitystringqueryNoComma-separated severity filter.
statusstringqueryNoComma-separated lifecycle status filter; every state when omitted.
sourcestringqueryNoComma-separated source filter.
typestringqueryNoComma-separated finding type filter.
date_rangestringqueryNoOnly findings observed within a recent window.
not_seen_daysintegerqueryNoOnly findings whose last recorded observation is older than N days. This does not establish that a relevant test ran or that the issue was fixed. Staleness alone is not evidence for resolving or dismissing a finding.
urlstringqueryNoCase-insensitive fragment of the finding's normalized host and path.
agent_iduuidqueryNoOnly findings with evidence observed by this agent run.

Example Request

curl
curl "http://app.aiqaramba.com/api/v1/findings/summary" \
  -H "Authorization: Bearer $AIQA_API_KEY"

Status Codes

CodeDescription
200Tenant findings summary.
400The request is malformed or failed validation.
401Authentication is missing or invalid.
500The server could not complete the request.

Response Fields (200)

FieldTypeDescription
totalinteger
by_statusobjectCounts keyed by a finding classification value.
by_severityobjectCounts keyed by a finding classification value.
by_typeobjectCounts keyed by a finding classification value.
by_sourceobjectCounts keyed by a finding classification value.
POST /api/v1/findings/transition

Transition findings in bulk

Applies one lifecycle action to up to 100 findings atomically with a shared reason. If any finding is missing, hidden, or cannot take the action from its current state, nothing changes.

Request Body (application/json)

FieldTypeRequiredDescription
actionstringYesLifecycle action a caller may apply to a finding.
idsstring[]Yes
reasonstringYesWhy this action is being applied to every listed finding.

Example Request

curl
curl -X POST "http://app.aiqaramba.com/api/v1/findings/transition" \
  -H "Authorization: Bearer $AIQA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "action": "<string>",
    "ids": ["<string>"],
    "reason": "<string>"
  }'

Status Codes

CodeDescription
200The action was applied to every listed finding.
400The request is malformed or failed validation.
401Authentication is missing or invalid.
404The requested resource does not exist.
409The request conflicts with the current resource state.
500The server could not complete the request.

Response Fields (200)

FieldTypeDescription
actionstringLifecycle action a caller may apply to a finding. Values: resolve, dismiss, reopen.
updatedintegerFindings the action was applied to.
idsuuid[]
GET /api/v1/findings/{id}

Get a finding

Returns a visible tenant finding with its evidence chain and its lifecycle history (every resolve, dismiss, reopen, and regress with who applied it and why).

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesFinding ID.

Example Request

curl
curl "http://app.aiqaramba.com/api/v1/findings/<id>" \
  -H "Authorization: Bearer $AIQA_API_KEY"

Status Codes

CodeDescription
200Finding and evidence.
400The request is malformed or failed validation.
401Authentication is missing or invalid.
404The requested resource does not exist.
500The server could not complete the request.

Response Fields (200)

FieldTypeDescription
findingobjectA tenant finding and its current lifecycle state.
finding.iduuid
finding.tenant_iduuid
finding.project_iduuid
finding.typestring
finding.severitystring
finding.titlestring
finding.descriptionstring
finding.urlstring
finding.elementstring
finding.sourcestring
finding.originstring
finding.impactstring
finding.remediationstring
finding.statusstringFinding lifecycle state. Values: open, regressed, resolved, dismissed.
finding.status_changed_atdate-timeWhen the finding last changed state. Who changed it and why is in the history returned by getFinding.
finding.github_repostring
finding.github_issue_numberinteger
finding.github_issue_urlstring
finding.github_issue_created_atdate-time
finding.github_pr_numberinteger
finding.github_pr_urlstring
finding.github_pr_created_atdate-time
finding.first_seen_atdate-time
finding.last_seen_atdate-time
finding.created_atdate-time
finding.updated_atdate-time
evidenceobject[]
evidence[].agent_iduuid
evidence[].agent_namestring
evidence[].test_iduuid
evidence[].test_namestring
evidence[].trace_step_iduuid
evidence[].trace_step_indexinteger
evidence[].observed_atdate-time
historyobject[]Every recorded status transition, oldest first. Empty for a finding that has never left open. The finding's current status equals the `to` of the last entry.
history[].occurred_atdate-time
history[].actionstringThe lifecycle action that was applied. regress is only ever applied by the auditor. Values: resolve, dismiss, reopen, regress.
history[].fromstringFinding lifecycle state. Values: open, regressed, resolved, dismissed.
history[].tostringFinding lifecycle state. Values: open, regressed, resolved, dismissed.
history[].reasonstringWhy the action was applied. Absent when the web UI applied it without a reason.
history[].channelstringThe surface the action came through. Values: web, api, chat, auditor.
history[].actorobjectWho applied a lifecycle action. Exactly one id is present, matching the kind.
history[].actor.kindstringuser is a signed-in person (web, chat, or a user-owned API key); api_key is a tenant-owned key with no person behind it; auditor is the audit worker acting on a run's outcome. Values: user, api_key, auditor.
history[].actor.user_iduuid
history[].actor.api_key_iduuid
history[].actor.agent_iduuidThe run whose audit triggered the change, for the auditor.
POST /api/v1/findings/{id}/dismiss

Dismiss a finding

Marks the finding dismissed (not a bug, obsolete, or a test-fixture artifact) and records who did it and why in the finding history. Dismissing an already dismissed finding is a no-op and records nothing.

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesFinding ID.

Request Body (application/json)

FieldTypeRequiredDescription
reasonstringYesWhy this action is being applied. Recorded in the finding history so a scripted decision stays auditable.

Example Request

curl
curl -X POST "http://app.aiqaramba.com/api/v1/findings/<id>/dismiss" \
  -H "Authorization: Bearer $AIQA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "reason": "<string>"
  }'

Status Codes

CodeDescription
200The dismissed finding.
400The request is malformed or failed validation.
401Authentication is missing or invalid.
404The requested resource does not exist.
409The request conflicts with the current resource state.
500The server could not complete the request.

Response Fields (200)

FieldTypeDescription
iduuid
tenant_iduuid
project_iduuid
typestring
severitystring
titlestring
descriptionstring
urlstring
elementstring
sourcestring
originstring
impactstring
remediationstring
statusstringFinding lifecycle state. Values: open, regressed, resolved, dismissed.
status_changed_atdate-timeWhen the finding last changed state. Who changed it and why is in the history returned by getFinding.
github_repostring
github_issue_numberinteger
github_issue_urlstring
github_issue_created_atdate-time
github_pr_numberinteger
github_pr_urlstring
github_pr_created_atdate-time
first_seen_atdate-time
last_seen_atdate-time
created_atdate-time
updated_atdate-time
POST /api/v1/findings/{id}/reopen

Reopen a finding

Returns a resolved or dismissed finding to open and records who did it and why in the finding history. Reopening an open finding is a no-op and records nothing.

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesFinding ID.

Request Body (application/json)

FieldTypeRequiredDescription
reasonstringYesWhy this action is being applied. Recorded in the finding history so a scripted decision stays auditable.

Example Request

curl
curl -X POST "http://app.aiqaramba.com/api/v1/findings/<id>/reopen" \
  -H "Authorization: Bearer $AIQA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "reason": "<string>"
  }'

Status Codes

CodeDescription
200The reopened finding.
400The request is malformed or failed validation.
401Authentication is missing or invalid.
404The requested resource does not exist.
409The request conflicts with the current resource state.
500The server could not complete the request.

Response Fields (200)

FieldTypeDescription
iduuid
tenant_iduuid
project_iduuid
typestring
severitystring
titlestring
descriptionstring
urlstring
elementstring
sourcestring
originstring
impactstring
remediationstring
statusstringFinding lifecycle state. Values: open, regressed, resolved, dismissed.
status_changed_atdate-timeWhen the finding last changed state. Who changed it and why is in the history returned by getFinding.
github_repostring
github_issue_numberinteger
github_issue_urlstring
github_issue_created_atdate-time
github_pr_numberinteger
github_pr_urlstring
github_pr_created_atdate-time
first_seen_atdate-time
last_seen_atdate-time
created_atdate-time
updated_atdate-time
POST /api/v1/findings/{id}/resolve

Resolve a finding

Marks the finding resolved (fixed, or no longer reproducible) and records who did it and why in the finding history. Resolving an already resolved finding is a no-op and records nothing.

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesFinding ID.

Request Body (application/json)

FieldTypeRequiredDescription
reasonstringYesWhy this action is being applied. Recorded in the finding history so a scripted decision stays auditable.

Example Request

curl
curl -X POST "http://app.aiqaramba.com/api/v1/findings/<id>/resolve" \
  -H "Authorization: Bearer $AIQA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "reason": "<string>"
  }'

Status Codes

CodeDescription
200The resolved finding.
400The request is malformed or failed validation.
401Authentication is missing or invalid.
404The requested resource does not exist.
409The request conflicts with the current resource state.
500The server could not complete the request.

Response Fields (200)

FieldTypeDescription
iduuid
tenant_iduuid
project_iduuid
typestring
severitystring
titlestring
descriptionstring
urlstring
elementstring
sourcestring
originstring
impactstring
remediationstring
statusstringFinding lifecycle state. Values: open, regressed, resolved, dismissed.
status_changed_atdate-timeWhen the finding last changed state. Who changed it and why is in the history returned by getFinding.
github_repostring
github_issue_numberinteger
github_issue_urlstring
github_issue_created_atdate-time
github_pr_numberinteger
github_pr_urlstring
github_pr_created_atdate-time
first_seen_atdate-time
last_seen_atdate-time
created_atdate-time
updated_atdate-time