Updating threat status
PATCH /v1/threats/{threat_id} records your organization's verdict on a
threat — the same actions an analyst has in MySecutec, available to your SOAR
or automation tooling. It is the API's first write operation.
curl -s -X PATCH \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "false_positive", "status_note": "known scanner, triaged"}' \
"https://api.secutec.com/v1/threats/5f3b94b1-35ad-49bb-b118-8e8fc24abf80"
The response is the full updated threat, bare — the same object
GET /v1/threats/{threat_id} returns, so no follow-up read is needed.
The request body
| Field | Required | Meaning |
|---|---|---|
status |
yes | Your verdict: unsolved, solved, false_positive or accepted. |
status_note |
only for accepted |
Free-text note explaining the verdict. Accepting a risk needs a reason. |
Two things the body does not take:
-
pending. It is computed by the platform (see below), never assigned. Sending it answers400with typehttps://api.secutec.com/errors/request/invalid-status-transition:{ "type": "https://api.secutec.com/errors/request/invalid-status-transition", "title": "Bad Request", "status": 400, "detail": "This status cannot be set. Settable statuses: unsolved, solved, false_positive, accepted.", "instance": "/v1/threats/5f3b94b1-35ad-49bb-b118-8e8fc24abf80" } -
Unknown fields. Any key other than the two above is rejected with a
422rather than silently ignored — if the API accepted-and-dropped it, a future version that adds the field would silently change what your stored requests do.
Read the response — the status you get back can differ
Setting status records your verdict. The status field in the response is
the platform's recalculated effective status, and on threats the platform
verifies automatically it can legitimately differ from what you sent:
- Marking such a threat
solvedis a claim of remediation. The effective status becomespendinguntil the next scan confirms the fix — the response to your PATCH already shows"status": "pending". - If the next scan still detects the threat, the effective status reverts to
unsolved; if the threat is gone, it becomessolved. false_positiveandacceptedare sticky — they hold regardless of what later scans observe.
Always take the effective status from the response body rather than assuming it equals your input.
Retries and the delta stream
The gateway forwards your update exactly once — it never retries a write on your behalf. If your request times out, the outcome is unknown: re-sending the same request is safe and reaches the same end state, but it re-stamps the status-change timestamp.
A successful update bumps the threat's updated_at, so the threat is
re-delivered on your next GET /v1/threats delta poll — including updates
your own automation just made. De-duplicate on id as usual (see
Pagination & deltas).
Errors
| Status | type suffix |
When |
|---|---|---|
400 |
request/invalid-status-transition |
status is pending |
400 |
request/invalid-filter |
{threat_id} in the path is not a UUID |
404 |
resource/not-found |
No threat with that id exists for your organization |
422 |
request/validation |
Malformed body: unknown status value, missing status_note on accepted, unknown field |
See Errors for the error format and the full catalog.