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:

yaml
alert_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

EventFires when
monitor.downMonitor transitions from up/degraded to down
monitor.upMonitor recovers to up
monitor.degradedMonitor enters degraded state
incident.createdNew incident opened
incident.updatedStatus update or severity change
incident.resolvedIncident marked resolved
oncall.handoffRotation hands off to next person
oncall.pageOn-call person paged

Signature verification

Each request includes X-Happyuptime-Signature: sha256=<hex> — HMAC-SHA256 of the raw body using your webhook secret.

javascript
import 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):

AttemptDelay
1immediate
230s
32m
410m
51h

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.

Ask a question... ⌘I