Webhooks
The JSON that a webhook alert channel receives for outages and recoveries, and how to verify its HMAC signature in your code.
A webhook channel sends every alert as a POST request with a JSON body to an address you choose. Webhooks are available on Solo and Team.
Headers
X-Uptime-Event–down,up,degraded,ssl_expiringand othersX-Uptime-Signature–t=<unix time>,sha256=<hex>User-Agent: UptimeGlass-Webhook/1
Body
{
"version": 1,
"event": "down",
"severity": "down",
"occurred_at": "2026-10-22T13:10:00+00:00",
"title": "shop.example.com is down",
"summary": "The server answered with an error (HTTP 500).",
"monitor": { "id": 184, "url": "https://shop.example.com" },
"incident_id": 3519,
"details": { "URL": "https://shop.example.com", "HTTP code": "500" },
"excerpt": null,
"link": "https://uptimeglass.com/app/monitors/184"
}
Verify the signature
The secret is shown once when you create the channel. The signature is HMAC-SHA256(secret, "<t>.<raw body>"). Refuse requests older than 5 minutes so a captured request cannot be replayed. In PHP:
[$t, $sig] = sscanf($_SERVER['HTTP_X_UPTIME_SIGNATURE'], 't=%d,sha256=%s');
$body = file_get_contents('php://input');
$expected = hash_hmac('sha256', $t . '.' . $body, $secret);
if (! is_int($t) || abs(time() - $t) > 300 || ! hash_equals($expected, (string) $sig)) {
http_response_code(401);
exit;
}
Answer and retries
Answer with any 2xx status within 10 seconds. A failed delivery is tried again after 10 and 30 seconds; after the third failure Settings → Alerts shows the channel's last error.
Updated 22 October 2026. Something missing or wrong? Tell us.