Monitors / HTTP
HTTP
Request a URL. Assert status, body, timing, and certificate expiry.
How it works
The probe sends an HTTP request with the method, headers, and body you configure. Redirects and TLS verification are optional. The response status, decoded body, latency, resolved IP, and (for HTTPS) certificate expiry become placeholders for conditions.
JSON bodies are decoded so you can write [BODY].status == "ok". Anything else is treated as a string. Certificate expiry is read from a TLS handshake to the URL host, not from the HTTP response.
Target
Full URL, including scheme. HTTPS also fills [CERTIFICATE_EXPIRATION].
https://example.com/healthType fields
| Field | What it does |
|---|---|
method | GET, POST, PUT, PATCH, DELETE, or HEAD. Defaults to GET. |
request_headers | Sent with the request. Stored encrypted. Terraform: nested request_headers { key, value } blocks. |
request_body | Raw body. Use with POST, PUT, or PATCH. |
follow_redirects | Follow 3xx responses. Defaults to on. |
verify_tls | Verify the server certificate. Defaults to on. |
proxy_url | HTTP (http://proxy:8080) or SOCKS (socks5://, socks5h://). Blank HTTP checks also honor HTTP_PROXY / ALL_PROXY. |
Placeholders
Available on this type. See conditions for operators and pat() / has() / len() / any().
[STATUS] [BODY] [CONNECTED] [RESPONSE_TIME] [IP] [CERTIFICATE_EXPIRATION] [DOMAIN_EXPIRATION]
Defaults
New monitors of this type start with:
[STATUS] >= 200[STATUS] <= 299Example conditions
[STATUS] == 200[BODY].status == "ok"[BODY] == pat(*"ok"*)[CERTIFICATE_EXPIRATION] > 48h[DOMAIN_EXPIRATION] > 720hGraphQL
type is Http. Same fields as the admin, camelCase in the input (intervalSeconds, requestBody, probeIds).
mutation {
createMonitor(input: {
name: "API"
type: Http
target: "https://example.com/health"
conditions: ["[STATUS] == 200", "[RESPONSE_TIME] < 400"]
}) { id }
}Terraform
Resource is nominal_monitor from returnearly/nominal. type is Http. Shared arguments match the shared fields in snake_case (name, target, interval_seconds, probe_ids, channel_ids). Omitted conditions use the type defaults.
Type arguments: method, request_headers, request_body, follow_redirects, verify_tls, proxy_url. Headers are nested request_headers blocks with key and value. proxy_url is sensitive.
resource "nominal_monitor" "api" {
name = "API"
type = "Http"
target = "https://example.com/health"
method = "GET"
request_headers {
key = "Accept"
value = "application/json"
}
conditions = ["[STATUS] == 200", "[RESPONSE_TIME] < 400"]
}