Monitors
Monitor types, regions and checks, heartbeat monitors, tags, and binding monitors to services.
Monitors
A monitor is an active or passive health check on one target. upzero runs the
active types (HTTP, TCP, ping, DNS) from two probe regions on a fixed
schedule, and accepts heartbeat monitors as pushes from your own cron jobs or
schedulers. Every check that comes back writes a row to the monitor's check
history, and the monitor's live status (pending, up, down, paused)
updates from it.
No Monitors screen in the console yet
Monitoring is one of the console's eight planned sections, and it has not
been built. There is no monitor list, no create form, and no detail page.
Today, monitors are created and managed through the API directly, and
up0 monitors covers listing and service binding. This page documents that
real surface, not the planned one. This section was walked on a local kind
cluster rather than staging, because staging's profile runs no monitoring
plane, so a monitor created there never gets checked.

What is live
| Type | Live | Config |
|---|---|---|
| HTTP | Yes | Monitor types |
| TCP | Yes | Monitor types |
| Ping | Yes | Monitor types |
| DNS | Yes | Monitor types |
| Heartbeat | Yes | Heartbeat monitors |
| Browser | No | the field shape exists in the API schema, but no prober executes it |
Creating a monitor
POST /api/v1/me/monitors requires your own signed-in session (a bearer
token), not an API key. This is deliberate: an API key can list, pause,
resume and delete monitors once they exist, but creating one always takes a
real person's session.
curl -X POST https://api.up0.io/api/v1/me/monitors \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Production API",
"type": "http",
"url": "https://example.com",
"interval_seconds": 300,
"config": { "method": "GET", "expected_status": [200] }
}'interval_seconds is plan-gated, not a scheduling knob (see
Regions and checks for what actually
governs check frequency). Creating below your plan's minimum interval fails
with 402 INTERVAL_RESTRICTED. The limits below are the plans row each
organization is actually seeded with
(backend/alembic/versions/0001_squashed_schema.py), not the plan-tier
constants defined elsewhere in the codebase but never read by this check:
| Plan | Minimum interval | Monitor limit |
|---|---|---|
| Free | 300s | 10 |
| Starter | 60s | 50 |
| Pro | 30s | 200 |
| Business | 10s | 300 |
Managing a monitor once it exists
Reading, pausing, resuming and deleting a monitor all accept either your own
session or an API key scoped monitors:write (monitors:read for reads),
created under Settings → API keys:

curl https://api.up0.io/api/v1/me/monitors/<MONITOR_ID>/pause \
-H "X-API-Key: up0_live_..." \
-X POST -d '{}'Monitor types
Config fields per type, as the API actually validates them.
Regions and checks
US-East and EU-West, the fixed 30s scrape, and what a check row is.
Heartbeat monitors
Push URL, grace period, and what a missed ping produces.
Tags
Org-level labels, and what they can't do yet.
Binding to services
up0 monitors bind/unbind, and what it changes on a service page.