List issues
GEThttps://api.fortwatch.ai/app/issues
Issues, one per kind of problem and asset, with the asset, assignee, status, severity, reachability and SLA. Filter by status, severity, category, asset, project, reachability or text, and sort. Paged in the body (issues, total, page, limit): 100 by default, at most 500.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status | query | string | |
severity | query | string | |
category | query | string | |
assetId | query | integer | |
projectId | query | integer | |
reachability | query | string | |
q | query | string | |
sort | query | string | |
page | query | number | |
limit | query | number |
Example request
curl -X GET "https://api.fortwatch.ai/app/issues" \
-H "Authorization: Bearer $FORTWATCH_API_KEY"Response 200
The request succeeded.
| Field | Type | Description |
|---|---|---|
issuesrequired | object[] | |
idrequired | number | |
workspaceIdrequired | number | |
assetIdrequired | number | |
titlerequired | string | |
descriptionrequired | string | null | |
severityrequired | string | |
statusrequired | string | |
templateIdrequired | string | null | |
dedupKeyrequired | string | |
assignedTorequired | number | null | |
resolutionrequired | string | null | |
resolvedByrequired | string | null | |
resolvedByScanIdrequired | number | null | |
resolvedByUserIdrequired | number | null | |
dismissedByUserIdrequired | number | null | |
categoryrequired | string | |
dueDaterequired | string (date-time) | null | |
resolvedAtrequired | string (date-time) | null | |
lastReopenedAtrequired | string (date-time) | null | |
dismissReasonrequired | string | null | |
dismissNotesrequired | string | null | |
dismissExpiresAtrequired | string (date-time) | null | |
firstSeenAtrequired | string (date-time) | |
lastSeenAtrequired | string (date-time) | |
lastCheckedAtrequired | string (date-time) | null | |
reachabilityrequired | string | |
verificationScanIdrequired | number | null | |
verificationSkippedrequired | string | null | |
createdAtrequired | string (date-time) | |
updatedAtrequired | string (date-time) | |
assigneerequired | object | |
firstNamerequired | string | |
lastNamerequired | string | |
resolvedByUserrequired | object | |
firstNamerequired | string | |
lastNamerequired | string | |
dismissedByUserrequired | object | |
firstNamerequired | string | |
lastNamerequired | string | |
assetrequired | object | |
idrequired | number | |
namerequired | object | null | |
valuerequired | string | |
typerequired | string | |
cdnProviderrequired | object | null | |
projectrequired | object | |
findingsrequired | object[] | |
scannerrequired | string | |
remediationrequired | object | null | |
referencerequired | object | null | |
matchedAtrequired | object | null | |
scanIdrequired | object | null | |
namerequired | string | |
templateIdrequired | object | null | |
_countrequired | object | |
findingsrequired | number | |
seenInLatestScanrequired | boolean | |
proofrequired | object | null | |
reproducerequired | object | null | |
vantagerequired | object | null | |
verificationrequired | object | |
statusrequired | string | One of: queued, running, done, failed, skipped |
scanIdrequired | number | null | |
reasonrequired | string | null | Why no re-check started: limit, asset_not_active, ownership_unverified, error |
nextScheduledAtrequired | string (date-time) | null | The asset's next scheduled scan, when no re-check started |
totalrequired | number | |
pagerequired | number | |
limitrequired | number | |
countsrequired | object | |
currentrequired | number | |
fixedrequired | number | |
dismissedrequired | number | |
totalrequired | number | |
byStatusrequired | object | |
openrequired | number | |
in_progressrequired | number | |
resolvedrequired | number | |
dismissedrequired | number | |
severityBreakdownrequired | object | |
slaTargetsrequired | object | |
criticalrequired | number | |
highrequired | number | |
mediumrequired | number | |
lowrequired | number |
{
"issues": [
{
"id": 42,
"workspaceId": 42,
"assetId": 42,
"title": "string",
"description": "string",
"severity": "string",
"status": "string",
"templateId": "string",
"dedupKey": "string",
"assignedTo": 1,
"resolution": "string",
"resolvedBy": "string",
"resolvedByScanId": 42,
"resolvedByUserId": 42,
"dismissedByUserId": 42,
"category": "string",
"dueDate": "2026-10-16T12:00:00.000Z",
"resolvedAt": "2026-10-16T12:00:00.000Z",
"lastReopenedAt": "2026-10-16T12:00:00.000Z",
"dismissReason": "string",
"dismissNotes": "string",
"dismissExpiresAt": "2026-10-16T12:00:00.000Z",
"firstSeenAt": "2026-10-16T12:00:00.000Z",
"lastSeenAt": "2026-10-16T12:00:00.000Z",
"lastCheckedAt": "2026-10-16T12:00:00.000Z",
"reachability": "string",
"verificationScanId": 42,
"verificationSkipped": "string",
"createdAt": "2026-10-16T12:00:00.000Z",
"updatedAt": "2026-10-16T12:00:00.000Z",
"assignee": {
"firstName": null,
"lastName": null
},
"resolvedByUser": {
"firstName": null,
"lastName": null
},
"dismissedByUser": {
"firstName": null,
"lastName": null
},
"asset": {
"id": null,
"name": {},
"value": null,
"type": null,
"cdnProvider": {},
"project": {}
},
"findings": [
{}
],
"_count": {
"findings": null
},
"seenInLatestScan": true,
"proof": {},
"reproduce": {},
"vantage": {},
"verification": {
"status": "queued",
"scanId": null,
"reason": null,
"nextScheduledAt": null
}
}
],
"total": 1,
"page": 1,
"limit": 1,
"counts": {
"current": 1,
"fixed": 1,
"dismissed": 1,
"total": 1,
"byStatus": {
"open": 1,
"in_progress": 1,
"resolved": 1,
"dismissed": 1
}
},
"severityBreakdown": {},
"slaTargets": {
"critical": 1,
"high": 1,
"medium": 1,
"low": 1
}
}Errors
400 | The request is not valid: a field is missing or has the wrong shape (the message names it). |
401 | No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN). |
403 | Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies. |
429 | Too many requests (RATE_LIMITED): wait the seconds Retry-After gives. |
Every code is explained in Errors.