Change an issue's status
PATCHhttps://api.fortwatch.ai/app/issues/{id}/status
Resolving starts a re-check scan of the asset, which counts toward the daily scan limits; when none can start, the issue still resolves and the next scheduled scan confirms the fix.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | integer |
Request body
JSON, required.
| Field | Type | Description |
|---|---|---|
status | string | Required. Dismissing has its own endpoint.One of: open, in_progress, resolved |
resolution | string | null |
Example request
curl -X PATCH "https://api.fortwatch.ai/app/issues/42/status" \
-H "Authorization: Bearer $FORTWATCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "open",
"resolution": "string"
}'Response 200
The request succeeded.
| Field | Type | Description |
|---|---|---|
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 | |
assetrequired | object | |
idrequired | number | |
namerequired | object | null | |
valuerequired | string | |
typerequired | string | |
cdnProviderrequired | object | null | |
projectrequired | object | |
idrequired | number | |
namerequired | string | |
_countrequired | object | |
findingsrequired | number | |
resolvedByUserrequired | object | |
firstNamerequired | string | |
lastNamerequired | string | |
dismissedByUserrequired | object | |
firstNamerequired | string | |
lastNamerequired | string | |
verification | 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 |
{
"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": "string",
"lastName": "string"
},
"asset": {
"id": 42,
"name": {},
"value": "app.example.com",
"type": "string",
"cdnProvider": {},
"project": {
"id": 42,
"name": "Production"
}
},
"_count": {
"findings": 1
},
"resolvedByUser": {
"firstName": "string",
"lastName": "string"
},
"dismissedByUser": {
"firstName": "string",
"lastName": "string"
},
"verification": {
"status": "queued",
"scanId": 42,
"reason": "string",
"nextScheduledAt": "2026-10-16T12:00:00.000Z"
}
}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. |
404 | Not found in your workspace. |
429 | Too many requests (RATE_LIMITED): wait the seconds Retry-After gives. |
Every code is explained in Errors.