# Mailbox health alerts

> The last 50 mailbox-health alerts that are still open for your user, newest first. Alerts whose fault has since been seen to clear are left out. These are the…

Source: https://warmerly.com/docs/warmup/mailbox-health-alerts

```text
GET /alerts
```

The last 50 mailbox-health alerts that are still open for your user, newest first. Alerts whose fault has since been seen to clear are left out. These are the same events that trigger a health email, so polling this is the pull equivalent of [webhooks](https://warmerly.com/docs/webhooks) for anyone who would rather not run an endpoint.

```json
{
  "alerts": [
    {
      "id": "c3f1a2b4-5d6e-4f70-8a91-b2c3d4e5f607",
      "accountId": "3a6f9e2e-4b7a-4e9a-9b1d-6e3a2f8c1a10",
      "kind": "score_drop",
      "severity": "warning",
      "title": "Warmup health dropped for jane@yourdomain.com",
      "body": "Health score fell from 82 to 61 over the last 24 hours.",
      "scoreBefore": 82,
      "scoreAfter": 61,
      "sentAt": "2026-09-11T06:02:00.000Z",
      "createdAt": "2026-09-11T06:01:58.000Z"
    }
  ]
}
```

| `kind` | Meaning |
| --- | --- |
| `score_drop` | Health score fell sharply. |
| `score_floor` | Health score is below the acceptable floor. |
| `oauth_disconnected` | A Google/Microsoft grant was revoked or expired, reconnect needed. |
| `auth_fail` | SMTP/IMAP authentication is failing. |
| `dns_changed` | The domain's SPF/DKIM/DMARC result changed since the last check. |
| `domain_blocklisted` | The sending domain appeared on a public blocklist. |
| `ip_blocklisted` | The mail server's IP appeared on a public blocklist. |
| `spam_flag` | The mailbox or workspace was flagged for spam-like outcomes. |
| `delivery_unobservable` | Mail is going out but nothing can be classified, so health cannot be measured at all. This is distinct from a bad score: there is no score. |

`severity` is `info`, `warning` or `critical`. `sentAt` is when the notification went out (`null` if it has not been sent), as opposed to `createdAt`, when the condition was detected. Each alert is the stored row, so it also carries `userId`, `fingerprint` and `resolvedAt` (always `null` here).

## More from Warmup

- [Per-account health and job history](https://warmerly.com/docs/warmup/per-account-health-and-job-history): Two account-scoped endpoints give you the same data filtered to a single mailbox. Both take the account ID…
- [Pause and resume warmup on an account](https://warmerly.com/docs/warmup/pause-and-resume-warmup-on-an-account): Warmup only runs against accounts with status = active or aging. Pausing an account stops it from being…
- [Is warmup actually running?](https://warmerly.com/docs/warmup/is-warmup-actually-running): Whether Warmerly's warmup workers are alive. A plain authenticated caller gets the derived flag:
