Resolve an alert
The alerts.resolve operation: POST /api/v1/alerts/{id}/resolve in the REST API and the alerts_resolve tool in the MCP server.
/api/v1/alerts/{id}/resolveCloses an alert by hand: the problem is dealt with. If it happens again, a new alert is raised (and
delivered again). Many alerts also resolve themselves when their condition clears (e.g. a retried job
finished); then resolvedBy is null. Resolving a resolved alert changes nothing.
Needs write access to what the alert is about at its legal entity or brand, as for acknowledging.
At a glance
- REST:
POST /api/v1/alerts/{id}/resolve - MCP tool:
alerts_resolve - Operation ID:
alerts.resolve - Scope: Organization
- Permission:
org:read - Risk tier:
write - Dry run: Supported (send
Ownrecord-Dry-Run: true) - Idempotency:
Idempotency-Keyrequired - Modes: Test and live
- Authentication: API key with the
org:readscope - Since: M7
Request
Path parameters
| Field | Type | Description |
|---|---|---|
id | alr_… ID |
Body
This operation takes no body.
Response
200 OK with a JSON object:
| Field | Type | Description |
|---|---|---|
id | alr_… ID | |
object | "alert" | |
code | string | |
severity | one of info, high, critical | |
family | one of 14 values, e.g. registrations, filings, ledger (all in the OpenAPI document) | |
message | string | |
link | string | |
entityId | ent_… ID or null | |
brandId | brd_… ID or null | |
livemode | boolean | |
status | one of open, acked, resolved | |
occurrences | integer (at least 1) | |
lastRaisedAt | date-time | |
acknowledgedAt | date-time or null | |
acknowledgedBy | string or null | |
resolvedAt | date-time or null | |
resolvedBy | string or null | |
delivery | object | |
delivery.status | one of none, pending, delivered, failed | |
delivery.attempts | integer (at least 0) | |
delivery.lastError | string or null | |
delivery.email | object | |
delivery.email.sent | integer (at least 0) | |
delivery.email.failed | integer (at least 0) | |
delivery.slack | array of object | |
delivery.slack[].channelId | string | |
delivery.slack[].status | one of sent, failed | |
delivery.slack[].at | date-time | |
delivery.slack[].error | string or null | |
createdAt | date-time | |
updatedAt | date-time | |
version | integer (at least 1) |
Examples
Close an alert that was dealt with
POST /api/v1/alerts/alr_01m4ttwd3veh9apbewxheq5xab/resolve
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Response (200):
{
"id": "alr_01m4ttwd3veh9apbewxheq5xab",
"object": "alert",
"code": "REG_AUTO_BLOCKED",
"severity": "critical",
"family": "registrations",
"message": "EU_OSS_NON_UNION was blocked for new consumer sales on 2026-11-07: the grace deadline 2026-11-10 is near and no application was submitted.",
"link": "/console/acme/e/acme-hr/jurisdictions/EU_OSS_NON_UNION",
"entityId": "ent_01m4ttwd3veh9apbewxheq5xh4",
"brandId": null,
"livemode": true,
"status": "resolved",
"occurrences": 1,
"lastRaisedAt": "2026-10-13T12:00:00.000Z",
"acknowledgedAt": null,
"acknowledgedBy": null,
"resolvedAt": "2026-10-13T12:30:00.000Z",
"resolvedBy": "usr_01m4ttwd3veh9apbewxheq5xh6",
"delivery": {
"status": "delivered",
"attempts": 1,
"lastError": null,
"email": {
"sent": 2,
"failed": 0
},
"slack": [
{
"channelId": "sec_01m4ttwd3veh9apbewxheq5xad",
"status": "sent",
"at": "2026-10-13T12:00:00.000Z",
"error": null
}
]
},
"createdAt": "2026-10-13T12:00:00.000Z",
"updatedAt": "2026-10-13T12:30:00.000Z",
"version": 2
}
Errors
| Code | HTTP status | When | What to do |
|---|---|---|---|
resource_not_found | 404 | No alert with this ID that you may see, in this organization and mode. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |
permission_denied | 403 | Your role may see the alert but not act on what it is about. | Ask an organization owner or admin for a role or scope that allows this action. |
version_conflict | 409 | The alert changed at the same moment; retry. | Fetch the object again and retry the change. |
It can also return these common errors: validation_failed, api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.