Skip to content

Monitoring webhooks with a contract you build on.

Every confirmed failure leaves as a flat JSON object POSTed to your URL — the same eleven fields for all twelve monitor types, retried five times if your endpoint does not answer 2xx.

one shape · all twelve types · 2xx or five retries

Not a message, a contract

Every other channel ends at a person, and people are forgiving readers. Code is not — which is why the interesting part is never the payload, but the guarantees behind it.

Written for a reader

“Something broke” — you work out the rest

A message
read once, then closed
read, then gone
Nothing to build on
no shape · no retries

Wording can drift between releases because the reader adapts. The moment software depends on it, that informality becomes a fault in your integration.

Written for a consumer

Eleven fields, five retries, one shape

One POST
backup probes agreed
2xx or we retry
Your code decides
ticket · bot · row

One object for all twelve monitor types: write one handler, branch on two fields. It is retried five times before it drops, so duplicates are possible — documented rather than discovered.

Keep the channels a person reads. This one is for the part that should need nobody at all. A Wednesday night at a logistics API:

Nobody was woken, nothing lost

At 02:17 a dispatch node at a logistics company starts timing out. The only thing awake is ops-bridge — forty lines that receive Uptimia’s POST and decide what happens next.

02:17 The POST lands, already confirmedops-bridge answers 200 first, then works — the budget is for the reply POST · 84 ms
02:18 The same event arrives twiceDelivery is at-least-once — the handler keys on the incident start retry · ignored
02:18 A ticket opens itselfmonitor_unique_id picks the runbook — no triage at 02:18 ticket · runbook
02:31 ✅ The recovery POST closes itSame shape, status up — incident_duration_seconds: 843 up · 14 min
14 mindown → up
The report nobody wroteon the 1st
Month end: the availability figures went to three customers straight out of ops-bridge's own tables. Every incident was already a row — nothing exported from a dashboard.
843 seconds, recorded1 handler, 12 monitor types0 pages sent0 lines of scraping
The alert became data — a message is gone when you close it; an event your code accepted is still there a year later. queryable, not just readable

A URL and a header

No app to authorise, no library to install. Uptimia needs somewhere to POST and, if the endpoint is protected, whatever gets it through the door.

Step 130 seconds

Register the endpoint

Add a Webhooks integration under Alerting → Integrations and paste the URL. It must be public http(s), and redirects are not followed — so register the URL that actually answers.

ops.caldmont.com/hooks Save integration
public https · TLS verified · no private ranges
Step 21 minute

Add whatever gets you past the door

Optional, and sent exactly as written: one per line, Name: value. That is where a token goes. There is no body signature, so the URL is a credential too.

Custom headers
Authorization: Bearer …X-Source: uptimia
passed through untouched · Content-Type added for you
Step 320 seconds

Attach it, then prove it answers

A webhook is a contact like any other: attach it to the monitors you want and it fires on their next confirmed incident. Send test posts the real shape with placeholder values.

Test delivery
monitor_status: test · severity: test · same eleven fields
answer any 2xx and you are wired up
Technical setup guide

Register a webhook endpoint

The Help Center covers the implementation: adding the URL, writing the custom headers, sending a test POST, and reading what a failed delivery is telling you.

  • Adding a webhook
  • Adding custom headers
  • Sending a test
  • Attaching the webhook to monitors
  • Troubleshooting

Twelve monitor types. One payload shape.

An expiring certificate, a cron job that never checked in and a server over its CPU threshold all arrive as the same flat object. Two fields tell them apart.

"uptime"HTTP checks on your pages
"ssl"Certificate expiry and validity
"domain"Registration and renewal dates
"server"CPU, memory, disk and load
11 fields the same object every time
"heartbeat"Cron jobs that stopped reporting
"transaction"Multi-step browser journeys
"dns"Records and nameserver health
"blacklist"Domain and IP reputation
Nothing gets renamed under you — four more types post the same object, and a storm adds a group key beside the existing ones. 12 types · 1 handler

Chat bridges, database rows, automated actions

Once an incident is an object your code has accepted, the useful applications stop looking like alerting.

The channel we do not speak
Zulip, Rocket.Chat, a bot you wrote — anything on a URL.
Reformat the wording as you like
Route on monitor_type or name
Deliver to the room that owns it
no SDK, no library
Records that outlive the incident
Your ticket queue, your warehouse, your SLA table.
Open on down, close on up
Duration arrives pre-calculated
Join on monitor_unique_id
your schema, not ours
Actions rather than messages
Annotate a graph, drain a node, raise a flag.
The failure was confirmed first
Gate on severity before anything destructive
You own the action, we only report it
deliberately one-way
Pair it with a channel somebody reads SlackMS TeamsEmailTelegramTwilio SMSPagerDutyDiscord

Other channels tell a person.This one tells your code.

The whole platform on the trial — twelve monitor types, 171+ checkpoints, and every confirmed incident delivered as an object you own.

Start your free 30-day trial
30 days free no credit card cancel anytime

The delivery guarantees, written down

Nobody can write a dependable handler against “we will send you a notification”. These are the actual guarantees.

At-least-once, with five retries

Ten seconds to answer, and any 2xx counts as accepted. Anything else is re-queued and retried five times, each wait a minute longer than the last, then dropped — so answer first and do the work afterwards.

Ten seconds to respondBUDGET Any 2xx means acceptedSUCCESS Five retries, then droppedBACKOFF

One flat object, eleven keys

No nesting, no envelope, no schema that changes with the check type. Two fields discriminate; the other nine never change meaning — including monitor_notes, the runbook line whoever set the monitor up left behind.

11 fields · all 12 types

A storm adds a key

Monitors failing together become one request with an extra group object — members, counts, acknowledgement. Handlers that ignore it keep working.

additive · never renamed

Your headers, passed through

Sent verbatim, so a bearer token or shared secret works. There is no body signature — check the header server-side, and keep the URL secret.

bearer token · secret URL

Where it will refuse to post

Public http(s) only; loopback and private ranges are rejected. The address is resolved once and pinned, redirects ignored, TLS verified.

no localhost · no rebinding

No acknowledge link — on purpose

Channels a person reads carry a signed link that stops the ladder. Machines get the facts and nothing else — a log pipeline that can silence a pager eventually will.

Every field, every eventSENT The ability to silence itWITHHELD

How monitoring webhooks work

Uptimia checks your websites from 171+ external locations and, when a check fails, sends an HTTP POST with a JSON body to any URL you register. The body is a flat object of eleven fields: id, monitor_type, monitor_name, monitor_unique_id, monitor_status, severity, incident_start_time and incident_end_time as ISO 8601 timestamps, incident_duration_seconds, a one-line message, and monitor_notes — the note the person who set the monitor up wrote for whoever picks the incident up. The same shape arrives for all twelve monitor types, so one handler covers every one. Your endpoint has ten seconds to answer; any 2xx means accepted, anything else is retried up to five times.

“Every request means something is down”

The bug everyone writes on day one

monitor_status: up
severity arrives empty
treated as an outage
Somebody paged
because the site came back

Recoveries, warnings and tests share one endpoint. monitor_status is down, up or test; severity is critical or trouble, and empty on recovery. Branch on both.

Confirmed before it exists

Confirmed before your code hears

171+ locations
loading the real page
re-tested first
One request
per confirmed incident

Automation is only as trustworthy as its trigger. A web check is never alerted on one checkpoint’s opinion — a suspected failure is re-tested from other probes first.

The body

Eleven fields, every event

What is always present, and what it holds.

See every alert channel
FieldExampleWhat it holds
id4172The monitor's numeric id inside Uptimia
monitor_typeuptimeWhich of the twelve check types fired
monitor_nameDispatch APIThe name you gave it (site name for uptime checks)
monitor_unique_iddispatch-api-euYour own identifier — the key to join on
monitor_statusdowndown, up or test
severitycriticalcritical or trouble — empty on a recovery
incident_start_time2026-07-24T02:17:04+02:00ISO 8601, account time zone
incident_end_time2026-07-24T02:31:07+02:00Empty while the incident is open
incident_duration_seconds843Zero until the incident closes
message*ALERT*: Project … is DOWNThe one-line summary other channels receive
monitor_notesFailover: drain eu-west-2 firstThe monitor's note — empty when nobody wrote one

Custom webhooks FAQ

01What exactly do you send?+
A single HTTP POST with Content-Type: application/json and a flat body of eleven fields — no query string, no form encoding, no wrapper object. Every field sits at the top level, and the same eleven arrive for every monitor type and every status, including the test.
02How do I authenticate the request?+
With custom headers: anything you enter is sent verbatim, one per line in Name: value form, so a bearer token or shared secret works. There is no HMAC signature over the body, so treat the URL as a credential too — long, random, and replaced if it leaks.
03What happens if my endpoint is slow or down?+
The request is given ten seconds. Any 2xx means accepted; anything else is re-queued with escalating backoff and retried five times, then discarded. Answer 200 immediately and do the slow part after — the budget covers the response, not the work.
04Will I ever receive the same event twice?+
Yes, and you should plan for it. Delivery is at least once: an endpoint that accepts an event but answers too slowly still sees the retry. Deduplicate on the monitor plus incident_start_time — both stay identical across retries.
05Can I point it at localhost or an internal address?+
No. Only public http and https URLs are accepted, and loopback, private and link-local ranges are refused both on save and again at send time — a webhook able to reach internal services would be a request-forgery tool wearing a monitoring badge. Use a tunnel while building.
06Do you follow redirects?+
No. The URL you register is the one that receives the body; a 301 or 302 counts as a failed delivery rather than a hop to follow. The hostname is resolved once and pinned for the call, so it cannot be re-pointed between the safety check and the request.
07What arrives when several monitors fail at once?+
One request for the whole group rather than one per monitor, with an extra group object beside the usual fields: its id, the member list, how many are still down, and whether anybody has acknowledged it. The original eleven fields describe the group's anchor monitor — monitor_notes carries the note when the group holds a single monitor and is empty when it summarises several.
08Can my handler acknowledge, or reply?+
No, and that is deliberate. Acknowledgement links go only to channels a person reads; an automated consumer gets facts, never the ability to silence an escalation. The only thing Uptimia reads from your response is the status code.
09What does “Send test” actually post?+
The real shape with placeholder contents: monitor_status and severity both read test, the name reads “Test monitor”, and the three incident fields read “None” instead of timestamps. It proves the endpoint answers — filter it out before writing to a table you rely on.
10How many endpoints can I have, and is it included?+
Add as many as you need and attach each to different monitors — a webhook behaves like any other contact. It is one of the 12 built-in alert channels, included on every plan and in the 30-day trial, and it runs beside them: one failure can page a person and update a system in the same second.

One URL, every confirmed incident

Register an endpoint, attach it to the monitors that matter, and every confirmed failure arrives as an object your systems can file and act on.

No SDK Eleven fields 30-day free trial No credit card
Custom webhooks are one of 12 built-in alert channels — every Uptimia monitor type posts the same shape.