Skip to content
Nominal

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/health

Type fields

FieldWhat it does
methodGET, POST, PUT, PATCH, DELETE, or HEAD. Defaults to GET.
request_headersSent with the request. Stored encrypted. Terraform: nested request_headers { key, value } blocks.
request_bodyRaw body. Use with POST, PUT, or PATCH.
follow_redirectsFollow 3xx responses. Defaults to on.
verify_tlsVerify the server certificate. Defaults to on.
proxy_urlHTTP (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] <= 299

Example conditions

[STATUS] == 200[BODY].status == "ok"[BODY] == pat(*"ok"*)[CERTIFICATE_EXPIRATION] > 48h[DOMAIN_EXPIRATION] > 720h

GraphQL

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"]
}