# 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.

Closes 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-Key` required
- **Modes:** Test and live
- **Authentication:** API key with the `org:read` scope
- **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

```http
POST /api/v1/alerts/alr_01m4ttwd3veh9apbewxheq5xab/resolve
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
```

Response (`200`):

```json
{
  "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`](https://ownrecord.io/docs/reference/errors.md#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`](https://ownrecord.io/docs/reference/errors.md#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`](https://ownrecord.io/docs/reference/errors.md#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](https://ownrecord.io/docs/reference.md#common-errors): [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed), [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`invalid_json`](https://ownrecord.io/docs/reference/errors.md#invalid_json), [`unsupported_media_type`](https://ownrecord.io/docs/reference/errors.md#unsupported_media_type), [`authentication_required`](https://ownrecord.io/docs/reference/errors.md#authentication_required), [`api_key_invalid`](https://ownrecord.io/docs/reference/errors.md#api_key_invalid), [`idempotency_key_required`](https://ownrecord.io/docs/reference/errors.md#idempotency_key_required), [`idempotency_key_reused`](https://ownrecord.io/docs/reference/errors.md#idempotency_key_reused), [`idempotency_in_progress`](https://ownrecord.io/docs/reference/errors.md#idempotency_in_progress), [`approval_required`](https://ownrecord.io/docs/reference/errors.md#approval_required), [`approval_rejected`](https://ownrecord.io/docs/reference/errors.md#approval_rejected), [`approval_expired`](https://ownrecord.io/docs/reference/errors.md#approval_expired), [`stale_approval`](https://ownrecord.io/docs/reference/errors.md#stale_approval), [`approval_policy_denied`](https://ownrecord.io/docs/reference/errors.md#approval_policy_denied), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
