Monitors API
POST /v1/projects/{prj}/monitors creates a monitor. The body is the monitor spec; unknown fields are refused with a 422 naming the field. Kinds and their config are in check types.
{
"env_id": "env_01m72xrg...",
"name": "formflow health",
"kind": "http",
"service": "formflow-web",
"config": {"url": "https://formize.net/api/health", "method": "GET"},
"assertions": ["[STATUS] == 200"],
"interval_s": 60,
"timeout_ms": 10000,
"locations": ["default"],
"retry": {"mode": "fixed", "max": 1, "delay_ms": 1000, "recheck": false},
"quorum": {"min_fail": 1},
"alert": true
}Field | Notes |
|---|---|
| Required. |
| 10 to 86400, default 60 (http, tcp, udp, dns, icmp and grpc may go down to 1; playwright starts at 300). |
| 100 to 60000 (browser: 120000), at most the interval, default 10000. |
| An object, not a number: |
| An object: |
| Up to 10; default |
| A passing check slower than |
Locations
GET /v1/locations/public lists the managed locations. Today there is one: default, with no static egress IP list (egress_ips is empty), so there is nothing to allowlist yet; see static IPs. Multi-region checks and a region quorum are not available yet: quorum.min_fail only means something once a monitor runs from several locations. Private locations (private:<name>) work today and can be combined with default for a two-location quorum; see private locations.
Change a monitor
PUT .../monitors/{monitor}replaces the whole spec.PATCH .../monitors/{monitor}is a JSON merge patch (RFC 7386) over the monitor asGETreturns it: an object merges key by key,nullremoves a key, anything else replaces. The merged monitor is validated as forPUT. SendIf-Match: <updated_at>(the valueGETreturns) to get 412 when someone else changed it first.
curl -sS -X PATCH "$WT_API/v1/projects/$PRJ/monitors/$MON" -H "Authorization: Bearer $WT_API_KEY" \
-H "Content-Type: application/json" -H "If-Match: $UPDATED_AT" \
-d '{"interval_s":120,"retry":{"max":2}}'POST .../monitors/{monitor}/slo creates an SLO on the monitor.
Synthetic spans
Each check run is also written as an uptime.check span. These spans belong to the service watchtower-synthetics, carry wt.synthetic=true, and name the monitored service in target_service, so they never mix with the application's own spans. RED metrics, Apdex and release scores leave them out.