Documentation
Everything a check can express, in one page.
Probe types
| Type | What it does | Default timeout |
|---|---|---|
http | GET or POST, follows redirects unless disabled | 5s |
tcp | Connect only, measures handshake time | 3s |
tls | Handshake plus certificate inspection | 5s |
dns | Resolves a name, optionally asserts the answer | 2s |
Expectations
A check passes when every expectation holds. An empty expect block
means "any response at all counts as up", which is rarely what you want.
expect:
status: 200 # exact code, or a range like 2xx
body_contains: "ok" # substring, case sensitive
header:
content-type: application/json
max_latency: 800ms # fail if slower, even on 200
Intervals and flapping
State changes only after threshold consecutive results agree.
The default is 2, which removes most single-packet noise without adding
a meaningful delay to real outages.
interval: 60s
timeout: 5s
threshold: 2
regions: [eu-central, eu-west]
Notifications
webhook— POST with a JSON body describing the transition.email— one message per transition, no batching.silent— record only, useful while tuning a new check.
Webhook payload
{
"check": "api-health",
"from": "up",
"to": "down",
"at": "2026-02-14T09:31:02Z",
"reason": "status 503, expected 200",
"latency_ms": 1841
}
Certificate warnings
For tls and https probes the certificate is inspected on every
run. A warning fires once per day inside the window, and the check itself only
fails when the certificate is actually invalid — not when it is merely close to expiry.
tls:
warn_before: 21d
require_chain: true
Limits
Response bodies are read up to 256 KiB and discarded after matching. Redirect chains stop at 10 hops. A single check may target one host; use separate checks for separate hosts so their history stays separate.