Webhooks
Receive incident, monitor, and alert events at your own HTTP endpoint.
Webhooks
Outbound webhooks let you forward Happy Uptime events to your own infrastructure — Datadog, custom dashboards, internal Slack bots, ServiceNow, etc.
Add a webhook
Dashboard → Alerts → Channels → Add channel → Webhook, or via config:
yamlalert_channels: - id: ops-webhook type: webhook url: https://hooks.example.com/happyuptime secret: ${HU_WEBHOOK_SECRET} events: [monitor.down, monitor.up, incident.created, incident.resolved]
Payload
All webhooks POST JSON with this envelope:
json{ "event": "monitor.down", "delivered_at": "2026-04-17T14:32:11Z", "data": { "monitor": { "id": "mon_abc123", "name": "API", "url": "https://api.example.com/health", "status": "down" }, "check": { "region": "us-east", "status_code": 503, "response_time_ms": 8421, "error": "Service Unavailable" }, "incident": { "id": "inc_xyz789", "severity": "major" } }}
Events
| Event | Fires when |
|---|---|
monitor.down | Monitor transitions from up/degraded to down |
monitor.up | Monitor recovers to up |
monitor.degraded | Monitor enters degraded state |
incident.created | New incident opened |
incident.updated | Status update or severity change |
incident.resolved | Incident marked resolved |
oncall.handoff | Rotation hands off to next person |
oncall.page | On-call person paged |
Signature verification
Each request includes X-Happyuptime-Signature: sha256=<hex> — HMAC-SHA256 of the raw body using your webhook secret.
javascriptimport crypto from "crypto";function verify(req, secret) { const sig = req.headers["x-happyuptime-signature"].split("=")[1]; const expected = crypto.createHmac("sha256", secret).update(req.rawBody).digest("hex"); return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));}
Retries
Webhooks are retried with exponential backoff on any non-2xx response or timeout (10s):
| Attempt | Delay |
|---|---|
| 1 | immediate |
| 2 | 30s |
| 3 | 2m |
| 4 | 10m |
| 5 | 1h |
After 5 failures, the delivery is marked failed in the alert log. Channels with 50+ consecutive failures are paused automatically — you'll see a banner in Alerts → Channels.
Replay
From Alerts → Log, click any delivery to inspect the request/response and click Resend to replay it. Useful when you want to re-test after fixing your endpoint.