13.8Common tasks
All these calls work with an API key. They assume you set $OBSRVLY_KEY and $API as in 13.3. Replace each <…> with your own value.
List your monitors#
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/ListMonitors" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"limit": 50}'Create a URL monitor checked every minute#
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/CreateUrlMonitor" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "checkout",
"url": "https://example.com/health",
"method": "GET", "intervalSeconds": 60}'intervalSecondsis required for URL monitors. Your plan's minimum interval still applies.- Other fields you can send:
headers,body(base64),locations,assertions,alertChannelIdsandtimeoutMs. - Other create calls:
CreateApiMonitor,CreateBrowserMonitor,CreateHeartbeatMonitor,CreateTcpMonitor,CreateUdpMonitor,CreatePingMonitor,CreateDnsMonitor,CreateCertMonitor,CreateDomainMonitorandBulkCreateUrlMonitors(13.5). Chapter 2 shows each monitor type.
Pause and resume a monitor#
# Pause
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/UpdateMonitor" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "<monitor-id>", "activated": false}'
# Resume
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/UpdateMonitor" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "<monitor-id>", "activated": true}'Mute a monitor until a set time#
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/UpdateMonitor" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "<monitor-id>", "muted": true,
"muteUntil": "2026-10-28T09:00:00Z"}'Send "muted": false to unmute. Send "clearMuteUntil": true to remove the end time, so the mute stays until you remove it. See 3.4.
Run a check now, for example after a deploy#
curl -s "$API/scheduler/obsrvly.v1.SchedulerService/TriggerNow" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"monitorId": "<monitor-id>"}'- You can add
locationto run from one of the monitor's regions. - You can do this once per monitor every 30 seconds.
- The
executionIdin the answer is not the ID of the result. Wait a little, then read the result withListExecutions. - To see when the monitor runs next, call
GetSchedulewith{"monitorId": "<monitor-id>"}. It returnsintervalSeconds,activated,nextRunAtandlastRunAt(empty if it never ran).
Read the latest results#
curl -s "$API/result/obsrvly.v1.ResultService/ListExecutions" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"monitorId": "<monitor-id>", "limit": 20}'Read uptime and response times#
curl -s "$API/result/obsrvly.v1.ResultService/GetMonitorSummary" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"monitorId": "<monitor-id>",
"window": "SUMMARY_WINDOW_7D"}'The answer has uptimePct, p50Ms, p95Ms, p99Ms, lastStatus, lastCheckAt and overdue. See 13.6 for how to read -1 and overdue.
p50Ms, p95Ms and p99Ms are response times in ms (milliseconds). Half, 95% and 99% of checks were faster than these.
Acknowledge an incident#
# Find open incidents
curl -s "$API/alert/obsrvly.v1.AlertService/ListIncidents" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "firing"}'
# Acknowledge one, using its alertId
curl -s "$API/alert/obsrvly.v1.AlertService/AcknowledgeIncident" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"alertId": "<alert-id>"}'- Reminders for the incident stop.
- The incident shows it was acknowledged by the key, under the key's name.
- A notice is sent to your Slack, Teams, Discord, Telegram and PagerDuty channels only. Email and webhook channels get no notice.
- You cannot undo an acknowledgement. See 9.6.
Send reminders while an incident stays open#
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/UpdateMonitor" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "<monitor-id>",
"renotifyIntervalSeconds": 1800}'Use 0 to turn reminders off, or a value from 300 to 86400 seconds. See 9.7.
Find out why nobody was alerted#
curl -s "$API/alert/obsrvly.v1.AlertService/ListEvaluations" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"monitorId": "<monitor-id>"}'Each record has an outcome. It is one of: below_threshold, already_firing, cooldown, awaiting_regions, fired, fired_muted, fired_maintenance, reminder_sent, reminder_muted, reminder_maintenance or reminder_acknowledged.
To see the alert policy in force, call GetAlertPolicy (add monitorId for one monitor). It returns failureThreshold and cooldownSeconds. To change them for one monitor, send them with UpdateMonitor (0 means use the team default). Your team's defaults can be changed only in the dashboard (9.4).
Plan a maintenance window#
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/CreateMaintenanceWindow" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "database upgrade",
"startsAt": "2026-11-02T22:00:00Z",
"endsAt": "2026-11-02T23:00:00Z",
"monitorIds": ["<monitor-id>"]}'- Leave
monitorIdsempty to cover every monitor. - A window can be at most 7 days long and can start at most 90 days ahead.
- Your team can have up to 100 windows that have not ended.
- Use
ListMaintenanceWindowsto see them andDeleteMaintenanceWindowwith{"id": "<window-id>"}to remove one. See 3.5.
Update your status page#
Call GetStatusPage with {} to read the page. Call SaveStatusPage with {"page": {…}} to save it. Each save replaces the whole page, so start from what GetStatusPage returned. See chapter 12.
Read the notification log and test a channel#
ListNotifications(areanotification) lists every notification obsrvly tried to send. Each has anevent(fire,resolved,reminderoracknowledged) and astatus(sent,failedorskipped).TestChannelwith{"channelId": "<channel-id>"}sends a test alert. The answer has astatusand anerrorMessage. See 10.9.
curl -s "$API/notification/obsrvly.v1.NotificationService/TestChannel" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{"channelId": "<channel-id>"}'Check your plan limits#
curl -s "$API/monitor/obsrvly.v1.MonitorConfigService/GetPlanLimitUsage" \
-H "Authorization: Bearer $OBSRVLY_KEY" \
-H "Content-Type: application/json" \
-d '{}'The answer lists each limit with kind, used, limit and level. level is PLAN_LIMIT_LEVEL_NEARING from 80% and PLAN_LIMIT_LEVEL_REACHED at 100%. A missing used means 0.
Get the screenshot of a failed browser check#
This call is a plain GET, not a POST. Send only the key.
curl -s -H "Authorization: Bearer $OBSRVLY_KEY" \
"$API/result/v1/monitors/<monitor-id>/executions/<execution-id>/screenshot"
# {"url": "https://...", "expires_at": "2026-10-12T08:19:10Z"}
curl -s -o failure.jpg "<url>"- The link works for 5 minutes and needs no key. Anyone with the link can open the image until then.
- Screenshots are kept for 14 days.
- A
404means there is no screenshot for that check. - Step messages in browser results count steps from 0. Step 0 is your first step. See 7.9.