On this page
What it verifies
An HTTP(S) monitor requests the URL at its interval from each of its regions. It checks the status code and, if set, a keyword or a regular expression in the body, and it records the response time. Optional sub-checks for the certificate, the security headers, and DNS hygiene run in the same monitor, so one failing host opens one incident rather than four.
Use it when
- A service has an HTTP endpoint that answers when the service is healthy: a health path, a home page, or an API route.
- The answer needs a content check, not only a reachability check: a status code, a string in the body, or a pattern.
- The certificate, the header posture, and the domain’s SPF, DMARC, and CAA records should be checked in the same monitor instead of in 3 extra monitors.
It runs no browser journey, does not log in, and follows at most 5 redirects. For a port without HTTP, use the TCP check. For a certificate that deserves its own incident, use the TLS certificate check.

Configuration
Target. A full URL including the scheme (https:// or http://). The probe resolves and validates the URL and every redirect hop before fetching. It refuses loopback, private, link-local, and cloud metadata addresses, so the monitor cannot be pointed into an internal network.
| Field | Required | Values and default | Meaning |
|---|---|---|---|
urlURL | yes | Full URL with scheme | The address the probe requests. The probe follows up to 5 redirect hops, and each hop passes the same target validation. |
expected_statusExpected status | optional | Exact status code, default: any 2xx | The answer must carry exactly this status code. Leave it empty to accept any 2xx. |
keywordBody contains (text) | optional | String | The response body must contain this text. Upper and lower case count. All assertions combine with AND. |
expected_regexBody matches regex | optional | Regular expression | The response body must match this pattern. |
method | optional | HTTP method, default GET | The request method, set over the API or MCP. The form always sends GET. |
headers | optional | Map of header name to value | Request headers the probe sends, for example Accept, set over the API or MCP. Host is ignored, and the headers follow a redirect only within the same origin. |
interval_secondsCheck interval | optional | Seconds, default 300, maximum 24 h, minimum set by the plan | How often each region runs the check. A value below the plan floor is raised to the floor, not rejected. |
regionsRegions | optional | Subset of na, eu, as, sa, af, oce. Default: the plan’s regions | Which continents run the check. Omit it and the plan picks its default set. |
address_familiesIP families | optional | ["ipv4"] (default) or ["ipv4", "ipv6"] | The probe checks every resolved address of each selected family on its own. With both families, family_fail_severity (degraded by default, or failed) sets the state when one family fails. |
TLS certificate
On an https URL, the same monitor judges the certificate it was served: the handshake, the chain, the issuer, and the subject. The form switches this sub-check on for every https URL.
| Field | Required | Values and default | Meaning |
|---|---|---|---|
tls_cert.enabled | yes | true | Switches the sub-check on. |
tls_cert.port | optional | Port, default: the URL’s port or 443 | The port for the TLS handshake. |
tls_cert.warn_days | optional | Days, default 14 | Below this remaining lifetime, the check carries a certificate advisory, and owners and admins get an hourly email and in-app notice. The advisory never changes the state, but an expired certificate fails the check. |
tls_cert.issuer_regex | optional | Regular expression | The issuer must match, for example Let's Encrypt. |
tls_cert.subject_regex | optional | Regular expression | The subject common name must match. |
tls_cert.allow_self_signed | optional | false (default) or true | Skips the trust, hostname, and time checks in the handshake. Use it only for internal services with their own CA. Expiry and the regex assertions still apply. |
Security headers
The probe sends a second request and checks its response for the selected headers. Only their presence counts. A missing header is a posture finding, not an outage, so the default severity is degraded.
| Field | Required | Values and default | Meaning |
|---|---|---|---|
security_headers.enabled | yes | true | Switches the sub-check on. |
security_headers.headers | yes | One or more of strict-transport-security, content-security-policy, x-content-type-options, x-frame-options, or referrer-policy | The headers that must be present. |
security_headers.missing_severity | optional | degraded (default) or failed | What a missing header does to the monitor’s state. |
DNS hygiene
The probe reads SPF, DMARC, and CAA of the domain as configuration. These records decide whether the domain’s mail is delivered and who may issue certificates for it. The finding appears with the result and never changes the monitor state.
| Field | Required | Values and default | Meaning |
|---|---|---|---|
dns_hygiene.enabled | yes | true | Switches the sub-check on. |
dns_hygiene.domain | optional | Domain, default: the URL’s host | The domain whose records the probe reads. |
How a check runs
- When a check is due, each region compiles the regex first. An invalid regex ends the check as an error. Every check times out after 10 s.
- The node resolves the host through its own resolver and validates every address of the selected family against the blocked ranges. Each address then gets its own request, with the connection pinned to that address.
- The probe follows redirects itself, at most 5 hops. It resolves and validates every hop again before it fetches it.
- The probe judges the status code first, then the keyword and the regex. It reads the body only when one of them is set, and all assertions combine with AND.
- Only a passing https check with the TLS certificate sub-check on runs the certificate policy, once per check. A passing or degraded check adds the header grade and the DNS hygiene finding as separate sub-results.
- The region sends its result to the control plane. The alert policy decides whether a failed result opens an incident once the quorum agrees. A degraded result stays out of the incident evaluation.

What a result contains
- Status code
- The final status after redirects, judged against
expected_status. - Response time
- Time to the answer, including the body when it is read, per region and per address (
latency_ms). - Detail line
- One line that says what happened, for example
HTTP 200,keyword not found, orregex did not match. It also names an unexpected status or the transport error. - Cause layer
- Whether a failure sat with the target’s DNS (name not found) or, after a successful lookup, with the target itself. Every other cause is reported as unknown.
- Certificate
- Common name and alternative names, issuer, validity dates with days left, and trust status.
- Security headers
- Which of the requested headers were present and which were missing.
- DNS hygiene
- The SPF, DMARC, and CAA findings, for example a DMARC policy of none or a missing CAA record.
- Region, family, address
- Every result carries the region that measured it, and one sub-result per IP family and per address.
States and severity
- okThe status matches and every assertion holds. A certificate inside its warning window keeps this state.
- degradedA security header is missing at the default severity, or one IP family fails while the other answers.
- downThe request fails, times out, or is blocked, or the status or an assertion misses. A failing certificate policy (expired, rejected handshake, issuer or subject mismatch) and a missing header at
failedseverity count too. - errorThe configuration cannot run, for example because of an invalid regex. It counts as an outage with severity critical.
Confirmed by quorum: by default, 2 regions must report the failure before an incident opens. The organization default asks for 2 regions and 2 consecutive checks. A monitor can carry its own rule with count or percent, consecutive checks, and a minimum duration.
Plans and limits
- Shortest interval
- 300 s on Free, 60 s on Pulse, 30 s on Sentinel, 15 s on Command, and 10 s on Enterprise. The web form offers 30 s, 1 min, 5 min, 15 min, and 1 h. The 15 s and 10 s floors are reachable only through MCP.
- Regions
- 2 of 6 on Free, 3 of 6 on Pulse, and all 6 from Sentinel.
- Monitors
- 10 on Free, 50 on Pulse, 150 on Sentinel, 500 on Command, and a custom quota on Enterprise. Eleven probe types share this quota, while host agents and heartbeats have their own. A pack of 50 more monitors costs €39.
From the pipeline or an agent
The same config works in the deploy step, in an MCP client such as Claude Code, and in the form above. create_monitor needs an organization-wide API key. If you omit regions, the plan picks its default.
{
"name": "Order API",
"type": "http",
"interval_seconds": 60,
"config": {
"url": "https://orders.example.com/health",
"expected_status": 200,
"keyword": "ok",
"tls_cert": { "enabled": true, "warn_days": 21 },
"security_headers": {
"enabled": true,
"headers": ["strict-transport-security", "content-security-policy"],
"missing_severity": "degraded"
},
"dns_hygiene": { "enabled": true }
}
}
Every interface, with its boundary
Limits
- The probe runs no browser journey, executes no JavaScript, and follows no login flow. It sends no request body and no cookies.
- Method and request headers are set over the API or MCP, not in the form.
- The probe follows at most 5 redirect hops, and a longer chain fails the check.
- The security header grade checks presence, not values.
- The probe refuses targets on private, loopback, link-local, and cloud metadata addresses.
- Not every region probes IPv6, so selecting
ipv6restricts the usable regions.