Skip to content

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_expiring and others
  • X-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.