- Home
- Integrations
- Webhook
Signed webhooks: the full incident as JSON
Tenium POSTs a JSON body to your URL when an incident opens, is acknowledged or resolves, and when an SSL certificate or heartbeat needs attention. Every request is signed with HMAC-SHA256, so your endpoint can prove it came from us.
Down
POST https://example.com/tenium-hook Content-Type: application/json X-Tenium-Signature: t=1737279554,v1=5f3a9c1e07b2…
{
"event": "down",
"sentAt": "2026-01-19T09:39:14Z",
"account": {
"id": "0f8e…",
"name": "Your Studio"
},
"clientWorkspace": {
"id": "9a8b…",
"name": "Client A"
},
"monitor": {
"id": "a3f1…",
"name": "Client A shop",
"type": "http",
"url": "https://shop.clienta.com"
},
"incident": {
"id": "e5b4…",
"status": "open",
"startedAt": "2026-01-19T09:35:02Z",
"resolvedAt": null,
"durationSec": null,
"summary": "HTTP 503 Service Unavailable",
"confirmedBy": [
"fra",
"lon",
"nyc"
],
"url": "https://app.tenium.app/incidents/e5b4…"
}
} Back up
POST https://example.com/tenium-hook Content-Type: application/json X-Tenium-Signature: t=1737279554,v1=5f3a9c1e07b2…
{
"event": "up",
"sentAt": "2026-01-19T09:39:14Z",
"account": {
"id": "0f8e…",
"name": "Your Studio"
},
"clientWorkspace": {
"id": "9a8b…",
"name": "Client A"
},
"monitor": {
"id": "a3f1…",
"name": "Client A shop",
"type": "http",
"url": "https://shop.clienta.com"
},
"incident": {
"id": "e5b4…",
"status": "resolved",
"startedAt": "2026-01-19T09:35:02Z",
"resolvedAt": "2026-01-19T09:39:14Z",
"durationSec": 252,
"summary": "4m 12s",
"confirmedBy": [
"fra",
"lon",
"nyc"
],
"url": "https://app.tenium.app/incidents/e5b4…"
}
} SSL expiry
POST https://example.com/tenium-hook Content-Type: application/json X-Tenium-Signature: t=1737279554,v1=5f3a9c1e07b2…
{
"event": "ssl_expiry",
"sentAt": "2026-01-19T09:39:14Z",
"account": {
"id": "0f8e…",
"name": "Your Studio"
},
"clientWorkspace": {
"id": "9a8b…",
"name": "Client A"
},
"monitor": {
"id": "a3f1…",
"name": "Client A shop",
"type": "http",
"url": "https://shop.clienta.com"
},
"expiry": {
"kind": "ssl",
"daysLeft": 7,
"expiresAt": "2026-01-26T00:00:00Z"
}
} Heartbeat missed
POST https://example.com/tenium-hook Content-Type: application/json X-Tenium-Signature: t=1737279554,v1=5f3a9c1e07b2…
{
"event": "heartbeat_missed",
"sentAt": "2026-01-19T09:39:14Z",
"account": {
"id": "0f8e…",
"name": "Your Studio"
},
"clientWorkspace": {
"id": "9a8b…",
"name": "Client A"
},
"monitor": {
"id": "a3f1…",
"name": "Nightly backup",
"type": "heartbeat",
"url": "https://shop.clienta.com"
},
"incident": {
"id": "e5b4…",
"status": "open",
"startedAt": "2026-01-19T09:35:02Z",
"resolvedAt": null,
"durationSec": null,
"summary": "No ping received for 26 min",
"confirmedBy": [
"fra",
"lon",
"nyc"
],
"url": "https://app.tenium.app/incidents/e5b4…"
}
} Simulation: nothing is sent from this page.
Set it up
- 1
Expose an endpoint
Create an https endpoint that accepts a JSON POST and answers 2xx. Anything else counts as a failed delivery.
WebhookSaved - 2
Paste the URL and keep the secret
Open Integrations, choose Webhook, paste the URL and, if you want signed requests, set a secret. Then press Send test; you receive an event named test.
Save the contact first
- 3
Verify the signature, then attach
Compute HMAC-SHA256 over the raw body with your secret and compare it to the header. Then attach the contact to monitors.
Save the contact first
Interactive mock, nothing is saved.
What is in the message
- A JSON body with the event, monitor, account, client and incident
- Events: down, blocked, up, degraded, heartbeat_missed, ssl_expiry, domain_expiry, test
- An X-Tenium-Signature header you can verify
Alert text is generated by Tenium and is currently English.
Plan and limits
- Available from Pro ($29/month)
- Included onPro, Agency
- Outbound alerts per hour on your planFree 40 · Starter 300 · Pro 1,500 · Agency 6,000
- Alert delay before sendingAvailable on Pro and Agency
Good to know
- Full field list and a Node verification example: docs, API webhook payloads.
- Failed deliveries (non-2xx, 429, network errors or a 10 s timeout) are retried up to 3 attempts in total, 30 seconds apart.
How alerts and escalation work
Contacts, routing, delays and acknowledgement are explained in the docs.
Webhook FAQ
How do I verify that a request came from Tenium?
Read the X-Tenium-Signature header (t=timestamp,v1=signature), compute HMAC-SHA256 of the timestamp, a dot and the raw body with your secret, compare in constant time and reject requests older than five minutes. The docs include a Node example.
What happens if my endpoint is down?
A non-2xx answer, a 429, a network error or a 10 second timeout counts as a failed delivery and is retried, up to 3 attempts in total, 30 seconds apart.
Can I use it to open tickets or restart a server?
Yes, that is the point: the payload has everything needed to create a ticket, post to an internal tool or trigger a script. Zapier (Agency) does the same without code.
Which plan includes Webhook?
Webhook is available from the Pro plan ($29/month) and on every plan above it.
How do I test Webhook alerts?
Open Settings, Contacts and press Send test next to the contact. A message labelled TEST arrives within seconds. Add at least one monitor first, because the checker sends the alerts.
Can I delay Webhook until nobody has reacted?
Yes, on Pro and Agency. Give the contact an alert delay in minutes: it fires only if the incident is still open then, and acknowledging the incident cancels it.
Connect your first channel in a minute
Start free with email, Discord and Google Chat. 30 monitors, no card.