Alert log

Every dispatch attempt — Slack, webhook, email, PagerDuty, etc. — is logged with its request body (webhooks), response code, response snippet, attempt count, and final status.

List

GET /alerts/log

Query params:

ParamMeaning
monitor_idFilter by monitor
statussent, pending, failed, suppressed
json
{ "alerts": [ { "id": "log_abc", "channel_id": "ch_webhook_ops", "channel_type": "webhook", "channel_name": "Ops bus", "event_type": "monitor.down", "status": "sent", "attempts": 1, "response_code": 200, "delivery_id": "whd_8k3nP2oQ1xR7vL9m", "sent_at": "2026-04-22T20:01:23Z", "created_at": "2026-04-22T20:01:23Z" } ]}

Inspect one

GET /alerts/log/:id

Returns the full row including request_body (webhook payload as sent) and response_snippet (first 2 KB of the response body).

Replay a webhook delivery

POST /alerts/log/:id/retryscope: write

Re-sends the original signed request body. The replay keeps the same delivery_id (safe against downstream idempotency checks) and adds X-Happyuptime-Delivery-Retry: true. A fresh alert_log row is inserted with delivery_id = replay_of:<original_id>.

Restrictions:

  • Only webhook channels are replayable — managed integrations (Slack, PagerDuty, etc.) do not store replayable bodies.
  • The original request_body must still be present (deliveries older than 30 days may be pruned).
json
{ "replayed_log_id": "log_def", "success": true, "response_code": 200, "error": null}

30-day stats

GET /alerts/log/stats

json
{ "stats": { "total": 1247, "sent": 1198, "failed": 32, "suppressed": 17 }}