Native channel: Webhooks

Send every alert as a JSON payload to any URL you own

The native webhook channel POSTs a structured JSON body the instant a monitor fails, and again when it recovers. Route it into your own services, a queue, a logger, or any tool that speaks HTTP. No middleware, no polling.

Works on every paid plan. 14-day trial, no card required.

POST /pulsestack-hook
200 OK
Content-Type: application/json
{
  "event": "monitor.down",
  "monitor": { "name": "Checkout API", "url": "https://api.acme.io/v2/checkout", "type": "API" },
  "error": "Down from 2/3 locations: London, New York",
  "locations": [
    { "locationCode": "LHR", "city": "London", "isUp": false, "statusCode": 503, "responseMs": 8412 },
    { "locationCode": "NYC", "city": "New York", "isUp": false, "statusCode": 503, "responseMs": 8120 },
    { "locationCode": "SYD", "city": "Sydney", "isUp": true, "statusCode": 200, "responseMs": 1290 }
  ],
  "timestamp": "2026-10-14T09:41:07.000Z"
}
Sent as soon as the failure is confirmed.
8
native alert channels
9
monitor types supported
1
generic webhook, any URL
2
events: failure and recovery

Connect a webhook in four steps

The generic webhook channel needs nothing more than a URL that accepts a POST. If your endpoint can read JSON, you are ready.

1

Add the contact

In the dashboard, open Alert Contacts, click Add contact and choose Webhook.

2

Paste your URL

Enter the endpoint in Webhook URL (http:// or https://). Requests are not signed, so put a long random token in the path or query string and check it in your handler.

3

Attach to monitors

Tick the contact under Notify on failure on each monitor, across any of the 9 types. A monitor with nothing ticked alerts every contact.

4

Send a test

Click Send test. Your endpoint receives a small request with event set to test, and must reply with a 2xx status.

What every payload carries

The body is deliberately flat and predictable so your handler can act on it without guesswork. Here is every field you can rely on.

FieldTypeMeaning
eventstringmonitor.down when a monitor goes down, monitor.up when it recovers.
monitor.namestringThe name you gave the monitor.
monitor.urlstringThe endpoint or host being watched.
monitor.typestringHTTP, KEYWORD, TCP_PING, PORT, API, HEARTBEAT, SSL, DNS or DOMAIN_EXPIRY.
errorstring | nullWhat failed, for example which locations. On recovery it is null, or the latest check result for heartbeat, SSL, DNS and domain expiry monitors.
downDurationstringOn recovery, how long the monitor was down, for example 11m 26s. Left out of monitor.down events.
locationsarrayThe latest result from each location: locationCode, city, isUp, statusCode, responseMs. Empty for heartbeat, SSL, DNS and domain expiry monitors.
timestampstringISO 8601 UTC time the alert was sent.

Failure out, recovery in

Two events share one shape. The event field tells them apart, and recovery adds downDuration, so a single handler covers both the incident and the all-clear.

Example failure event
{
  "event": "monitor.down",
  "monitor": { "name": "Marketing Site", "url": "https://www.example.com", "type": "HTTP" },
  "error": "Down from 2/3 locations: London, New York",
  "locations": [
    { "locationCode": "LHR", "city": "London", "isUp": false, "statusCode": 503, "responseMs": 8412 },
    { "locationCode": "NYC", "city": "New York", "isUp": false, "statusCode": 503, "responseMs": 8120 },
    { "locationCode": "SYD", "city": "Sydney", "isUp": true, "statusCode": 200, "responseMs": 1290 }
  ],
  "timestamp": "2026-10-14T09:41:07.000Z"
}
Example recovery event
{
  "event": "monitor.up",
  "monitor": { "name": "Marketing Site", "url": "https://www.example.com", "type": "HTTP" },
  "error": null,
  "downDuration": "11m 26s",
  "locations": [
    { "locationCode": "LHR", "city": "London", "isUp": true, "statusCode": 200, "responseMs": 182 },
    { "locationCode": "NYC", "city": "New York", "isUp": true, "statusCode": 200, "responseMs": 431 },
    { "locationCode": "SYD", "city": "Sydney", "isUp": true, "statusCode": 200, "responseMs": 1264 }
  ],
  "timestamp": "2026-10-14T09:52:33.000Z"
}

Everything the webhook channel includes

Native generic webhook to any HTTPS URL
Structured JSON body, flat and predictable
Fires on failure and on recovery
Failures double-checked before it fires
Monitor name, type and URL in every payload
HTTP code and response time included
Per-location results on each event
ISO 8601 UTC timestamps
Works across all 9 monitor types
Multiple webhooks per account
Zapier Catch Hooks get the JSON; Google Chat URLs get plain text
Combine with the other 7 native channels

Eight native alert channels

Webhooks are one of eight channels built directly into PulseStack. Use them alone or alongside any of the others on the same monitor.

SMS alerts are included on the Team and Enterprise plans. Zapier and Google Chat connect through this webhook channel rather than as native integrations. See all integrations.

What teams build with webhooks

Feed your own on-call tool

Pipe events into an internal router that already knows who is on rota, and let it decide who to page.

Log every state change

Append each payload to a data store or observability pipeline to build your own uptime history and audit trail.

Trigger automated remediation

Kick off a script that restarts a service, flushes a cache or fails over, the moment a down event lands.

Bridge to Zapier

Point the webhook at a Zapier Catch Hook and branch into the other apps your Zapier account connects. See the Zapier setup.

Post into Google Chat

Use a Google Chat space webhook URL: PulseStack™ spots chat.googleapis.com and sends a plain text message the space can show. See the Google Chat setup.

Update a custom status board

Have your receiver flip a tile on an internal dashboard so the whole team sees state without logging in.

Webhooks on every paid plan

Starter
9 pounds / mo

50 monitors, 60s checks, all monitor types, SSL, DNS and domain insights.

Pro
19 pounds / mo

150 monitors, 30s checks and competitor tracking.

Team
39 pounds / mo

500 monitors, 30s checks, server diagnostics, 3 seats and SMS alerts.

Enterprise
99 pounds / mo

2,000 monitors, 30s checks, 5 seats, SMS and PDF reports.

The Free plan covers 5 HTTP monitors with email alerts. Every paid plan starts with a 14-day trial and needs no card up front.

If webhook alerts do not arrive

Start with Send test next to the contact on the Alert Contacts page. Your endpoint should receive the request below and answer with a 2xx; any other reply shows as Webhook returned and the status code, for example Webhook returned 500.

{
  "event": "test",
  "message": "This is a test notification from PulseStack.",
  "timestamp": "2026-10-14T09:30:00.000Z"
}

Webhook questions, answered

What does PulseStack send to my webhook URL?

On each alert PulseStack™ POSTs a JSON payload containing the event, the monitor (its name, URL and type), the error, how long it was down (recovery only), the latest result from each location and a timestamp. You can parse that body and route it into any system you run.

When does the webhook fire?

Alerts fire on both failure and recovery. A failed check is re-tested a few seconds later, and a monitor is only marked down when at least two of the three check locations fail, so a single blip never triggers a page, while a genuine outage still alerts quickly.

Can I connect services that PulseStack does not natively support?

Yes. Zapier Catch Hooks and most automation tools take the JSON payload as it is. Google Chat is handled for you: when the URL starts with https://chat.googleapis.com/, PulseStack™ sends a plain text message instead, because Google Chat rejects fields it does not know.

Which monitor types can use a webhook alert?

All of them. All nine monitor types can route their alerts through the Webhook channel: HTTP, Keyword, TCP Ping, Port, API, Heartbeat, SSL certificate, DNS record and domain expiry.

Is the Webhook alert available on the free plan?

Webhooks are one of the eight native alert channels, but the free plan sends email alerts only. It includes 5 monitors with HTTP checks, and paid plans add all monitor types, more alert channels and a 14-day trial with no card needed, so you can wire webhooks into your full setup.

Do I need any middleware to receive webhooks?

No. You only need a URL that accepts an HTTP POST from the internet, such as a serverless function or an API route on your own server. PulseStack delivers the payload directly with no polling or extra infrastructure in between.

Are webhook requests signed?

No. PulseStack™ does not sign requests or add an authorisation header. Put a long random token in the URL path or query string and have your handler reject any request without it.

Wire your alerts into anything that speaks HTTP

Add the webhook channel, attach it to your monitors and start receiving structured JSON on failure and recovery. It takes minutes.