---
title: "Recent alerts, resolved ones included, and whether anybody was told"
method: GET
path: "/v1/admin/alerts/recent"
tags: ["meta"]
---

# Recent alerts, resolved ones included, and whether anybody was told

`GET /v1/admin/alerts/recent`

## Request

- Base URL: `https://api.hyperresearch.ai`
- URL: `https://api.hyperresearch.ai/v1/admin/alerts/recent`
- Auth: API key in cookie `hr_session`

`GET /v1/admin/health/alerts` answers "what is open". This answers the two questions it cannot. First, what fired and then went away: a row with a `resolved_at` is the evidence that something was broken for six hours this morning, which is the question an operator asks afterwards. Second, whether a HUMAN was told — `notifications` is every operator email this deployment has produced, with its dedupe key and its delivery status, so "the alert row exists but the digest was suppressed because EMAIL_ENABLED is false" is readable rather than deducible. No customer identifier, query or address appears in it; the recipient is held as a hash, as everywhere in this lane.

## Response `200`

Recent alerts and the operator emails about them

- RecentPlatformAlerts
  - `as_of` string, required
  - `email_configured` boolean, required: Whether `OPERATOR_ALERT_EMAIL` holds an address. False means the operator lane is off and nobody is being told anything, whatever the rows below say.
  - `email_enabled` boolean, required: Whether this deployment would actually send: `EMAIL_ENABLED=true` plus a key plus a from-address. False means the rows below were written and suppressed.
  - `alerts` PlatformAlert[], required
    - `id` string, required
    - `kind` string, required
    - `severity` string, required
    - `subject` string, required
    - `detail` string, nullable, required: An operator sentence written by us. NEVER a provider response body — a vendor that echoes the Authorization header into an error would otherwise publish our key here.
    - `first_seen_at` string, required
    - `last_seen_at` string, required
    - `occurrences` integer, required
    - `resolved_at` string, nullable, required
  - `notifications` object[], required
    - `id` string, required
    - `template` string, required
    - `subject_id` string, nullable, required: The dedupe identity: `<alert key>:<window>` or `daily:<Denver day>`. `digest:<UTC hour>` rows are from the hourly digest retired on 2026-09-25.
    - `status` string, required
    - `attempts` integer, required
    - `last_error` string, nullable, required
    - `created_at` string, required
    - `sent_at` string, nullable, required

## Other responses

- `400`: Invalid request
- `401`: Authentication failed
- `403`: Insufficient scope or plan
- `404`: Not found
- `429`: Rate limited or over quota
- `500`: Internal error

---

[API](https://skmtc.dev/hyperresearch/apis/hyperresearch-cloud-api.md) · [All operations](https://skmtc.dev/hyperresearch/apis/hyperresearch-cloud-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hyperresearch/apis/hyperresearch-cloud-api/revisions/726ef831ebf4?raw)
