API reference
Endpoint-by-endpoint reference for the SutramX REST API: monitors, incidents, status pages, alert channels, request bodies and response schemas.
This reference lists the endpoints you can call with a SutramX API key, grouped by resource. For authentication, rate limits, pagination and the error format, read the REST API guide first.
All paths are relative to https://api.sutramx.com. Every request needs Authorization: Bearer sk_... unless it is marked as public. IDs are UUIDs.
The Access column uses these labels:
- Any key:
GETrequests work with every key, including read-only keys. Requests that change something (POST,PUT,PATCH,DELETE) need a Standard or Automation key; a read-only key gets403 READ_ONLY_ACCESS. - Automation key: needs a key created with the Automation access level.
- Owner only: needs the workspace owner's dashboard session. API keys get
403 WORKSPACE_OWNER_REQUIRED. - Plan: also needs a plan that includes the feature. Otherwise you get
403 FEATURE_NOT_AVAILABLE. See Plans & limits.
Endpoints not listed here (team members, billing, API keys, workspace settings, alert routing defaults) need a signed-in dashboard session and reject API keys.
Monitors#
| Method | Path | Description | Access |
|---|---|---|---|
GET | /monitors | List all monitors, newest first. Optional ?tag= filter. | Any key |
GET | /monitors/summary | Counts by status, open incidents and 24-hour uptime for the workspace. | Any key |
POST | /monitors | Create a monitor. | Any key |
GET | /monitors/:id | Get one monitor, including 24-hour and 30-day uptime. | Any key |
PUT | /monitors/:id | Update a monitor. Send only the fields you want to change. | Any key |
DELETE | /monitors/:id | Delete a monitor and its history. Returns 204. | Any key |
POST | /monitors/:id/pause | Pause checks. Returns the monitor. | Any key |
POST | /monitors/:id/resume | Resume checks. Returns the monitor. | Any key |
POST | /monitors/:id/reset-stats | Clear the monitor's statistics. | Any key |
POST | /monitors/bulk | Pause, resume, delete, tag or move up to 500 monitors at once. | Any key |
POST | /monitors/test | Run a one-off check of a monitor definition without saving it. Same body as create. | Any key |
POST | /monitors/:id/run-check | Run a check of a saved monitor now. | Any key |
GET | /monitors/:id/checks | Check history, newest first, cursor-paginated. | Any key |
GET | /monitors/:id/checks.csv | Export check history as CSV (up to 50,000 rows). | Any key |
GET | /monitors/:id/regions | The monitor's probe regions. | Any key |
GET | /monitors/:id/explanation | Why this alert for the monitor: its open incident's explanation, or its current per-region state against the quorum. | Any key |
GET | /monitors/:id/flakiness | The monitor's 7- and 30-day flakiness score (0–100) with its reasons. | Any key |
PUT | /monitors/:id/regions | Set the monitor's probe regions. | Any key |
GET | /monitors/:id/notification-recipients | Who receives this monitor's alert emails. | Any key |
POST | /monitors/:id/test-notification | Send a test alert email. | Any key |
GET | /monitors/:id/domain-ssl | SSL certificate and domain expiry details. | Any key |
POST | /monitors/:id/domain-ssl/refresh | Re-check SSL and domain expiry now. | Any key |
GET | /monitors/discover-subdomains?domain= | Find subdomains of a domain that you could monitor. | Any key |
POST | /monitors/:id/heartbeat/rotate | Issue a new heartbeat URL for a cron monitor. The old URL stops working immediately. | Any key |
POST | /monitors/:id/cron-heartbeat | Record a heartbeat for a cron monitor using your API key. | Any key |
GET | /monitors/:id/dns-records | Current DNS records and recent changes of a DNS monitor. Optional ?limit=. | Any key |
POST | /monitors/:id/dns-records/accept | Accept the current DNS answer as the new expected value. | Any key |
GET | /monitors/:id/step-runs | Per-step results of a multi-step API check. | Any key |
Create a monitor#
POST /monitors
| Field | Type | Required | Description and limits |
|---|---|---|---|
name | string | Yes | 1–255 characters. |
type | string | No | http (default), api, ping, port, udp, cron, dns, multistep or mcp. Can't be changed after creation. |
url | string | For http, api and mcp | A valid http:// or https:// URL (mcp needs https://). Must resolve to a public address. |
interval_seconds | integer | No | 15–900. Can't be below your plan's minimum interval. Defaults to 120 seconds, or your plan's minimum if that is higher. |
group_id | UUID or null | No | Monitor group to put the monitor in. |
escalation_policy_id | UUID or null | No | Escalation policy to use. |
tags | string array | No | Up to 20 tags, 1–32 characters each. Tags are lower-cased and de-duplicated. |
regions | string array | No | 1–50 probe region codes, such as fra1 or usa-az-probe. Defaults to your plan's locations. |
config | object | Depends on type | Type-specific settings. See Monitor config. |
curl -s -X POST "https://api.sutramx.com/monitors" \
-H "Authorization: Bearer $SUTRAMX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Checkout API",
"type": "http",
"url": "https://api.example.com/health",
"interval_seconds": 60,
"regions": ["fra1", "usa-az-probe"],
"tags": ["checkout", "prod"],
"config": {
"method": "GET",
"timeout": 10000,
"expected_status_codes": [200],
"keyword": "ok"
}
}'The response is 201 with the new monitor. An abridged example:
{
"id": "6f1c2a7e-3b0d-4c8e-9f51-2d7a9b1e4c10",
"name": "Checkout API",
"type": "http",
"url": "https://api.example.com/health",
"interval_seconds": 60,
"is_active": true,
"group_id": null,
"tags": ["checkout", "prod"],
"config": { "method": "GET", "timeout": 10000, "expected_status_codes": [200], "keyword": "ok" },
"created_at": "2026-10-02T08:15:00.000Z"
}The workspace owner's email must be verified before monitors can be created (403 EMAIL_VERIFICATION_REQUIRED). Creating a monitor over your plan's monitor limit returns 403 ENTITLEMENT_LIMIT_REACHED.
Monitor object#
GET /monitors and GET /monitors/:id return monitors with these computed fields in addition to the stored ones:
| Field | Description |
|---|---|
current_status | up, down, degraded, blocked, unknown, pending (no check yet), paused or maintenance. down means an incident is open. |
last_status | Status of the latest check, or null. |
last_checked_at | Time of the latest check (ISO 8601). |
last_response_time_ms | Response time of the latest check. |
last_error | Error of the latest check when it failed, otherwise null. |
open_incident | { "id", "started_at" } of the open incident, or null. |
under_maintenance | true while a maintenance window covers the monitor. |
uptime_24h, uptime_30d | Uptime percentage, or null with no data. |
heartbeat_url | The ping URL for cron monitors, otherwise null. |
effective_timeout_ms | The timeout actually used for checks. |
effective_regions | The regions the monitor is checked from on your plan. |
Update a monitor#
PUT /monitors/:id accepts name, url, interval_seconds, is_active, group_id, escalation_policy_id, config and tags, with the same limits as create. You can't change type; create a new monitor instead. To change regions, use PUT /monitors/:id/regions.
Monitor config#
The config object holds type-specific settings. It can have up to 50 keys and must be at most 32 KB as JSON. The most common keys:
| Key | Types | Description and limits |
|---|---|---|
method | http, api | GET, HEAD, POST, PUT, PATCH, DELETE or OPTIONS. |
headers | http, api | Object of request headers, up to 50 entries. |
body | http, api | Request body to send. |
timeout | all | HTTP and API: 1,000–60,000 milliseconds. Ping, port and UDP: 1–30 seconds. |
expected_status_codes | http, api | Array of up to 500 accepted status codes. |
keyword | http, api | Text the response must contain, up to 1,000 characters. |
keyword_case_insensitive | http, api | true or false. |
max_redirects | http, api | 0–5. |
max_response_time_ms | http, api | Responses slower than this count as failed, 1–600,000 ms. |
degraded_response_time_ms | http, api | Responses slower than this are marked degraded. Must be lower than max_response_time_ms. |
max_response_bytes | http, api | 1–10,485,760. |
assertions | api | Up to 50 assertions on the response. |
host | ping, port, udp | Hostname or IP. Required for these types. Must be public. |
port | port, udp | 1–65535. Required for these types. |
packet_count | ping | Clamped to 1–10. |
cron_expression | cron | Required for cron monitors. |
grace_seconds | cron | 0–604,800 seconds. |
The full set of options for each type, including DNS and multi-step checks, is described on the monitor pages: HTTP & keyword, API & multi-step checks, Ping, TCP & UDP, DNS and Heartbeat & cron.
config.notification_emails (per-monitor alert recipients) changes where alerts go. When sent with an API key on POST /monitors or PUT /monitors/:id, it is ignored. An automation key can set it through monitoring as code; other keys get 403 ALERT_ROUTING_NOT_ALLOWED there.
Bulk actions#
POST /monitors/bulk
| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | pause, resume, delete, add_tags, remove_tags or move_group. |
ids | UUID array | Yes | 1–500 monitor IDs. |
tags | string array | For tag actions | Tags to add or remove. |
group_id | UUID or null | For move_group | Target group. null removes the monitors from their group. |
{ "updated": 12, "failed": [{ "id": "…", "error": "Monitor not found" }] }Check history#
GET /monitors/:id/checks
| Parameter | Description |
|---|---|
limit | 1–500, default 50. |
before | UTC timestamp in the form YYYY-MM-DDTHH:MM:SS[.ffffff][Z]. Returns checks older than this. Pass next_before from the previous page unchanged. |
region | Only checks from this region code. |
status | up, down, degraded, blocked, unknown, or problem (anything that isn't up). |
{
"items": [
{
"id": "b3f0…",
"checked_at": "2026-10-02T08:20:00.412873Z",
"region": "fra1",
"status": "up",
"status_code": 200,
"response_time_ms": 182,
"error_type": null,
"error_message": null
}
],
"next_before": "2026-10-02T08:20:00.412873Z"
}Check timestamps have microsecond precision.
GET /monitors/:id/checks.csv accepts from, to (ISO 8601), region and status. If the range has more than 50,000 rows, the newest rows are returned and the X-Export-Truncated: true header is set.
Regions#
PUT /monitors/:id/regions takes { "regions": ["fra1", "usa-az-probe"] } (1–50 region codes). The regions you can use depend on your plan. See Regions & confirmation.
Test notification#
POST /monitors/:id/test-notification sends a test alert email. The optional email field must be one of the monitor's alert recipients or a workspace member. Without it, the first recipient is used.
Cron heartbeats#
For cron jobs, the simplest option is the monitor's public heartbeat_url, which needs no API key. See Heartbeats.
POST /monitors/:id/cron-heartbeat records a heartbeat with your API key instead. All fields are optional:
| Field | Type | Description |
|---|---|---|
status | string | success, ok, up, fail, failure, down or error. |
execution_time_ms | integer | Run duration, 0 to 7 days in milliseconds. |
execution_count | integer | Run counter. |
status_code | integer | 0–999, such as the job's exit code. |
Heartbeats#
GET, POST or HEAD /heartbeat/:token is public: the token in the URL is the credential. Copy the URL from the monitor's heartbeat_url.
| Query parameter | Description |
|---|---|
status | fail (also failure, failed, down, error, err) reports a failed run. ok and similar values, or no parameter, report success. |
duration_ms | Optional run duration in milliseconds, 0 to 7 days. |
The response is 200 with the text OK (also for a paused monitor, whose pings are ignored), 404 for an unknown token, and 400 for a bad parameter. Any request body is ignored.
curl -fsS "https://api.sutramx.com/heartbeat/$HEARTBEAT_TOKEN?duration_ms=5230"Monitor groups#
| Method | Path | Description | Access |
|---|---|---|---|
GET | /monitor-groups | List groups. | Any key |
GET | /monitor-groups/:id/summary | Status summary of the monitors in a group. | Any key |
POST | /monitor-groups | Create a group. Returns 201. | Any key |
PUT | /monitor-groups/:id | Rename a group. | Any key |
DELETE | /monitor-groups/:id | Delete a group. | Any key |
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes on create | 1–255 characters. |
notification_emails | string array | No | Up to 20 emails that get alerts for the group. Changing this is owner-only and returns 403 with an API key. |
Stats#
All stats endpoints take a monitor ID and are limited to 1,000 requests per minute. Uptime history goes back 365 days on Starter and 730 days on Growth and Pro. timeZone takes an IANA zone such as Asia/Kolkata.
| Method | Path | Parameters | Description |
|---|---|---|---|
GET | /stats/:id/stats | days (1 up to your plan's uptime history, default 30) | Uptime percentage, total, successful and failed checks, average response time. |
GET | /stats/:id/checks | limit (1–5,000, default 100), region | Recent checks. |
GET | /stats/:id/incidents | limit (1–500, default 50) | Incident history of the monitor. |
GET | /stats/:id/response-time-chart | days (1 up to your plan's uptime history, default 7), region, tzOffsetMinutes or timeZone | Response times over time. |
GET | /stats/:id/response-series | range (1h, 6h, 24h, 7d, 30d; default 24h), region | Response time series. |
GET | /stats/:id/uptime-history | days (1 up to your plan's uptime history, default 90), tzOffsetMinutes or timeZone | Daily uptime. |
GET | /stats/:id/24h-bars | days (1 up to your plan's uptime history, default 90), endDate, tzOffsetMinutes or timeZone | Daily status bars. |
GET | /stats/:id/region-statuses | Latest status per region. | |
GET | /stats/:id/pause-windows | hours (1–8,760, default 720) | When the monitor was paused. |
{
"uptime_percentage": 99.95,
"total_checks": 43200,
"successful_checks": 43178,
"failed_checks": 22,
"avg_response_time_ms": 214
}Incidents#
| Method | Path | Description | Access |
|---|---|---|---|
GET | /incidents | List incidents, paginated. | Any key |
GET | /incidents/export | Export incidents as CSV, or JSON with ?format=json. Takes the same filters as the list. | Any key |
GET | /incidents/:id | Incident details. | Any key |
GET | /incidents/:id/explanation | Why this alert: region votes, quorum rule, failure class, alert decision, fault verdict and contributing findings (vendor, checker, last mile). | Any key |
GET | /incidents/:id/replay-timeline | Timeline of checks, alerts and notes. limit (default 200) and cursor. | Any key |
POST | /incidents | Open a manual incident for a monitor. 409 if one is already open. | Any key |
POST | /incidents/:id/acknowledge | Acknowledge the incident. | Any key |
POST | /incidents/:id/resolve | Resolve the incident manually. 409 INCIDENT_RESOLVED if already resolved. | Any key |
DELETE | /incidents/:id/snooze | Unsnooze the incident's alerts. (Snoozing is owner-only.) | Any key |
GET | /incidents/:id/escalation | Escalation status. | Any key |
POST | /incidents/:id/escalation/acknowledge | Acknowledge the escalation. | Any key |
GET | /incidents/:id/notes | List notes. | Any key |
POST | /incidents/:id/notes | Add a note. Returns 201. | Any key |
DELETE | /incidents/:id/notes/:noteId | Delete a note. | Any key |
PUT | /incidents/:id/postmortem | Save the postmortem text. | Any key |
POST | /incidents/:id/runbook | Attach a runbook. | Any key |
PATCH | /incidents/:id/runbook-steps/:stepId | Mark a runbook step done or not done. | Any key |
List incidents#
GET /incidents
| Parameter | Description |
|---|---|
status | ongoing, resolved, suppressed or acknowledged. Omit for all. |
monitor_id | Only incidents of this monitor. |
from, to | ISO 8601 bounds on the start time. |
q | Search monitor names and URLs (up to 200 characters). |
page | Page number, default 1. |
page_size | 1–100, default 25. |
{
"items": [
{
"id": "0c9e…",
"monitor_id": "6f1c…",
"monitor_name": "Checkout API",
"monitor_url": "https://api.example.com/health",
"monitor_type": "http",
"started_at": "2026-10-01T22:04:10.000Z",
"resolved_at": "2026-10-01T22:11:40.000Z",
"duration_seconds": 450,
"alert_suppressed": false,
"suppression_reason": null,
"is_flapping": false,
"confirmations": 2,
"confirming_regions": ["fra1", "usa-az-probe"],
"confirming_region_names": ["FRA1 (Frankfurt, Germany)", "AZ (Arizona, USA)"],
"regions_total": 2,
"acknowledged_at": null,
"acknowledged_by_name": null,
"snoozed_until": null,
"resolved_manually": false,
"github_issue_url": null
}
],
"total": 1,
"page": 1,
"page_size": 25,
"counts": { "all": 1, "ongoing": 0, "resolved": 1, "suppressed": 0 }
}Incident request bodies#
| Endpoint | Field | Type | Description |
|---|---|---|---|
POST /incidents | monitor_id | UUID, required | Monitor to open the incident for. |
POST /incidents/:id/resolve | note | string, optional | Up to 5,000 characters. |
POST /incidents/:id/notes | body | string, required | 1–5,000 characters. |
POST /incidents/:id/notes | public | boolean, optional | Marks the note as a public update. |
PUT /incidents/:id/postmortem | postmortem | string, required | Up to 50,000 characters. |
POST /incidents/:id/runbook | runbook_id | UUID, optional | Runbook to attach. |
PATCH /incidents/:id/runbook-steps/:stepId | is_completed | boolean, required | Step state. |
Runbooks#
| Method | Path | Description |
|---|---|---|
GET | /incidents/runbooks | List runbooks. |
POST | /incidents/runbooks | Create a runbook. |
PUT | /incidents/runbooks/:runbookId | Replace a runbook. |
DELETE | /incidents/runbooks/:runbookId | Delete a runbook. |
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 1–255 characters. |
steps | array | Yes | 1–100 steps, each { "title" (1–255 chars), "description" (up to 5,000 chars, optional) }. |
monitor_type | string | No | Suggest the runbook for this monitor type. |
service_tag | string | No | Suggest the runbook for monitors with this tag. |
is_active | boolean | No | Whether the runbook is offered. |
Deploy events#
Deploy events need a plan with deployment correlation (Plan). See Deployment correlation.
| Method | Path | Description | Access |
|---|---|---|---|
GET | /incidents/deploy-events | Recent deploys. limit 1–100, default 20. | Any key, Plan |
POST | /incidents/deploy-events | Record a deploy. Returns 201. | Any key, Plan |
GET | /incidents/deploy-events/config | Your signed deploy webhook URL settings. | Any key, Plan |
| Field | Type | Required | Description |
|---|---|---|---|
service_name | string | Yes | 1–255 characters. |
environment | string | No | 1–64 characters, such as production. |
version | string | No | 1–120 characters, such as a tag or commit SHA. |
deployed_at | string | No | ISO 8601 time. Defaults to now. |
metadata | object | No | Any extra details. |
GitHub and GitLab deploy payloads must go to your signed deploy webhook URL, not this endpoint. Sending source: "github" or "gitlab" here returns 400 USE_SIGNED_DEPLOY_HOOK.
Maintenance windows#
| Method | Path | Description | Access |
|---|---|---|---|
GET | /maintenance | List maintenance windows. | Any key |
Creating, editing and deleting maintenance windows silences alerts, so it is owner-only and can't be done with an API key. See Maintenance windows.
Status pages#
Creating and changing status pages needs a plan that includes status pages (Plan).
| Method | Path | Description | Access |
|---|---|---|---|
GET | /status/pages/me | List your status pages. | Any key |
GET | /status/pages/overview | Status pages with their current state. | Any key |
POST | /status/pages | Create a status page. Returns 201. | Any key, Plan |
GET | /status/pages/:id | Status page details, including its monitors. | Any key |
PATCH | /status/pages/:id | Update a status page. | Any key, Plan |
DELETE | /status/pages/:id | Delete a status page. | Any key |
PUT | /status/pages/:id/monitors | Replace the page's monitor list. | Any key, Plan |
POST | /status/pages/:id/monitors | Add one monitor to the page. | Any key, Plan |
DELETE | /status/pages/:id/monitors/:monitorId | Remove a monitor from the page. | Any key |
GET | /status/pages/monitor/:monitorId | The status page a monitor is on. | Any key |
GET | /status/pages/:id/access | Who can view the page (public, password or SSO). | Any key |
PUT | /status/pages/:id/access | Change who can view the page. | Owner only |
POST | /status/pages/:id/access/revoke-sessions | Sign out every visitor of a private page. | Owner only |
GET | /status/pages/:id/subscribers | Subscribers by channel (email, Slack, webhook). | Any key |
GET | /status/pages/:id/languages | Page languages and translations. | Any key |
PUT | /status/pages/:id/languages | Change page languages. | Any key, Plan |
Create and update fields#
POST /status/pages accepts title (required, 1–255 characters), description (up to 1,000 characters or null) and is_public (boolean).
PATCH /status/pages/:id accepts any of these. Unknown fields are rejected.
| Field | Type | Description and limits |
|---|---|---|
title | string | 1–255 characters. |
description | string or null | Up to 1,000 characters. |
slug | string | 3–64 characters. Part of the public page URL. |
is_public | boolean | Whether the page is published. |
logo_url | string or null | An https:// URL, or ""/null to clear. |
favicon_url | string or null | An https:// URL, or ""/null to clear. Setting a favicon needs white-label on your plan. |
accent_color | string or null | Hex colour like #0d9488, or ""/null to clear. |
hide_powered_by | boolean | Hide the SutramX footer. Needs white-label on your plan (403 WHITE_LABEL_NOT_ENTITLED otherwise). |
show_response_times | boolean | Show response times on the page. |
PUT /status/pages/:id/monitors takes { "monitors": [{ "monitor_id": "…", "section": "API" }] } with up to 500 entries. section is optional (up to 100 characters). POST /status/pages/:id/monitors takes { "monitorId": "…", "section": "API" }.
Access and language settings, and their plan requirements, are covered in Private pages & SSO and Branding & custom domains. Custom domains are owner-only.
Public status page endpoints#
These endpoints are public (no key) and limited to 60 requests per minute per IP. :slug is the page's slug.
| Method | Path | Description |
|---|---|---|
GET | /status/:slug | The published page as JSON. |
GET | /status/:slug/history | Daily uptime history of each monitor on the page. Optional days (up to 90). |
GET | /status/:slug/badge.svg | A status badge image. |
GET | /status/:slug/feed.xml | Atom feed of incidents and maintenance. Not available for private pages. |
Alert channels#
Alert channels (Slack, Microsoft Teams, Discord, webhooks, PagerDuty, Opsgenie, GitHub and others) are called integrations in the API. Each channel type can have up to 10 connections.
| Method | Path | Description | Access |
|---|---|---|---|
GET | /integrations | Available channel types with their fields, your connections and their status. | Any key |
GET | /integrations/alert-contacts | Workspace email alert contacts. | Any key |
POST | /integrations/:type/connections | Add a connection of a channel type, for example /integrations/slack/connections. | Automation key |
PUT | /integrations/connections/:connectionId | Edit a connection. Blank secret fields keep the stored value. | Automation key |
DELETE | /integrations/connections/:connectionId | Remove a connection. | Automation key |
PUT | /integrations/connections/:connectionId/routing | Choose which monitors the connection alerts for. | Automation key |
POST | /integrations/connections/:connectionId/test | Send a test alert. | Any key |
Connection body#
The body has the channel's fields at the top level, plus optional name and routing:
Channel type (:type) | Fields |
|---|---|
slack, discord, msteams, googlechat, mattermost, zapier, webhook | webhook_url |
pagerduty | integration_key |
opsgenie | api_key, region (us or eu) |
telegram | chat_id |
github | repository (owner/repo), token |
sms, voice, whatsapp | to (E.164 phone number, such as +1XXXXXXXXXX) |
| Field | Type | Description |
|---|---|---|
name | string | Label shown in the dashboard, up to 60 characters. Defaults to the channel name. |
routing.scope | string | all, groups or monitors. |
routing.group_ids | UUID array | Groups to alert for when the scope is groups (up to 500). |
routing.monitor_ids | UUID array | Monitors to alert for when the scope is monitors (up to 500). |
routing.min_severity | string | down or degraded. |
curl -s -X POST "https://api.sutramx.com/integrations/slack/connections" \
-H "Authorization: Bearer $SUTRAMX_AUTOMATION_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "#ops-alerts",
"webhook_url": "https://hooks.slack.com/services/T000/B000/XXXX",
"routing": { "scope": "all", "min_severity": "down" }
}'{
"success": true,
"message": "#ops-alerts connected",
"connection_id": "1d2e…",
"name": "#ops-alerts",
"integration_type": "slack",
"auto_test": true
}A new webhook connection also returns signing_secret once. Store it to verify deliveries. See Webhooks.
Whether a channel type is available depends on your plan (403 FEATURE_NOT_AVAILABLE otherwise). SMS, WhatsApp and voice alerts use alert credits. See Alert credits.
Alert recipients#
| Method | Path | Description | Access |
|---|---|---|---|
GET | /alert-recipients | Email alert recipients and whether each has confirmed. | Any key |
POST | /alert-recipients/resend | Resend the confirmation email. Body: { "email": "…" }. | Any key |
Adding and removing recipients is owner-only. See Email & push.
Alerting settings (read-only)#
API keys can read, but not change, the workspace's alerting setup:
| Method | Path | Description |
|---|---|---|
GET | /settings/escalation-policies | Escalation policies. |
GET | /settings/on-call-schedules | On-call schedules. |
GET | /settings/on-call-schedules/current | Who is on call now. |
GET | /settings/suppression-windows | Quiet hours and deployment windows. |
GET | /settings/notifications | Workspace notification preferences. |
GET | /settings/notification-attempts | Alert delivery statistics. |
The team member list (/team/members) is not available to API keys.
Reliability#
| Method | Path | Description | Access |
|---|---|---|---|
GET | /reliability/overview | Workspace reliability overview. | Any key |
GET | /reliability/monitor/:monitorId | Reliability insights for one monitor. | Any key |
GET | /reliability/dependencies | Monitor dependency graph. | Any key, Plan |
POST | /reliability/dependencies | Add a dependency. | Owner only, Plan |
DELETE | /reliability/dependencies/:id | Remove a dependency. | Owner only, Plan |
GET | /reliability/slo-targets | SLO targets. | Any key, Plan |
POST | /reliability/slo-targets | Create or replace the SLO target of a monitor. | Any key, Plan |
PUT | /reliability/slo-targets/:id | Update an SLO target. | Any key, Plan |
DELETE | /reliability/slo-targets/:id | Delete an SLO target. | Any key, Plan |
Add a dependency (POST /reliability/dependencies): parent_monitor_id (UUID, required), child_monitor_id (UUID, required) and suppression_mode (optional, suppress_child_if_parent_down).
SLO target (POST /reliability/slo-targets):
| Field | Type | Required | Description and limits |
|---|---|---|---|
monitor_id | UUID | Yes on create | The monitor. Not accepted on PUT. |
target_percentage | number | Yes on create | 90–99.999. |
sli_type | string | No | availability or latency. |
window_minutes | integer | No | 60–43,200 (30 days). |
burn_rate_fast_threshold | number | No | 0.1–100. |
burn_rate_slow_threshold | number | No | 0.1–100. |
is_enabled | boolean | No | Turn the target on or off. |
Website health#
Website health needs a plan that includes it.
| Method | Path | Description |
|---|---|---|
GET | /website-health | Sites and their latest reports. |
POST | /website-health/sites | Add a site. |
GET | /website-health/sites/:id | Site details. |
PATCH | /website-health/sites/:id | Update a site. |
DELETE | /website-health/sites/:id | Delete a site. |
POST | /website-health/sites/:id/run | Crawl the site now (20 per hour). |
GET | /website-health/reports/:runId | A report. |
GET | /website-health/reports/:runId/issues.csv | A report's issues as CSV. |
| Field | Type | Description and limits |
|---|---|---|
name | string | Required on create, 1–255 characters. |
url | string | Required on create, a valid URL up to 2,000 characters. |
max_pages | integer | 1–500. |
max_depth | integer | 0–10. |
check_external_links | boolean | Also check links to other sites. |
lighthouse_enabled | boolean | Run Lighthouse audits. |
lighthouse_urls | string array | Up to 3 URLs to audit. |
lighthouse_form_factor | string | mobile or desktop. |
schedule | string | daily, weekly or manual. |
notify_on_issues | boolean | Alert on new issues. |
score_drop_threshold | integer | 1–100. |
is_active | boolean | Pause or resume scheduled runs. |
See Website health for what each run checks.
Third-party status#
| Method | Path | Description |
|---|---|---|
GET | /third-party-status/providers | Providers you can follow. |
GET | /third-party-status/providers/:providerId | A provider and its components. |
GET | /third-party-status/subscriptions | Providers you follow. |
POST | /third-party-status/subscriptions | Follow a provider. |
PATCH | /third-party-status/subscriptions/:id | Change a subscription. |
DELETE | /third-party-status/subscriptions/:id | Stop following a provider. |
GET | /third-party-status/status-pages/:statusPageId | Third-party services shown on a status page. |
PUT | /third-party-status/status-pages/:statusPageId | Set the third-party services shown on a status page. |
Subscription fields: provider_id (required on create, up to 60 characters), component_ids (up to 200), keywords (up to 20, each up to 60 characters), notify (boolean), notify_maintenance (boolean) and min_severity (minor, major or critical). Following providers needs a plan that includes third-party status. See Third-party status.
AI incident assist#
These endpoints need a plan that includes the AI features, and each generation counts toward your monthly AI allowance. Generations are limited to 30 per 10 minutes per workspace.
| Method | Path | Description |
|---|---|---|
GET | /incident-comms/status | Which AI features you have and how much allowance is left. |
GET | /incident-comms/incidents/:id | Saved AI content for an incident. |
POST | /incident-comms/incidents/:id/summary | Generate an incident summary. |
POST | /incident-comms/incidents/:id/postmortem/generate | Draft a postmortem. Body: { "overwrite": true } (optional). |
POST | /incident-comms/incidents/:id/status-updates | Draft a status page update. Optional phase (investigating, identified, monitoring, resolved) and guidance (up to 1,000 characters). |
PATCH | /incident-comms/status-updates/:draftId | Edit a draft (body up to 5,000 characters, phase). |
POST | /incident-comms/status-updates/:draftId/publish | Publish a draft. |
POST | /incident-comms/status-updates/:draftId/discard | Discard a draft. |
See AI incident assist.
Monitoring as code#
These endpoints manage monitors by a stable key you choose, so a config file or script can create a monitor the first time and update it on every later run. A key is 1–128 characters: letters, digits and . _ : / -, starting with a letter or digit.
| Method | Path | Description | Access |
|---|---|---|---|
GET | /automation/whoami | Workspace, key access level, plan and limits. | Any key |
GET | /automation/monitors/:key | Get a monitor by key (URL-encode the key). | Any key |
PUT | /automation/monitors/:key | Create or update the monitor with this key. Returns 201 when created, 200 when updated. | Any key |
DELETE | /automation/monitors/:key | Delete the monitor with this key. | Any key |
PUT | /automation/monitors/by-id/:id/key | Give an existing monitor a key ({ "key": "…" }), or remove it ({ "key": null }). | Any key |
POST | /automation/monitors/plan | Preview the changes for a list of monitor specs. Writes nothing, so read-only keys can call it. | Any key |
POST | /automation/monitors/apply | Apply a list of monitor specs. | Any key |
A monitor spec has the same fields as POST /monitors (except group_id and escalation_policy_id), plus key, paused (boolean) and regions (null resets to your plan's default regions). Fields you leave out aren't managed: an existing monitor keeps its value. Changing type replaces the monitor (its history is deleted); on apply, that needs the plan confirmation described below.
curl -s -X PUT "https://api.sutramx.com/automation/monitors/checkout-api" \
-H "Authorization: Bearer $SUTRAMX_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Checkout API", "type": "http", "url": "https://api.example.com/health", "interval_seconds": 60 }'plan and apply take this body (up to 2 MB):
| Field | Type | Description |
|---|---|---|
monitors | array | Up to 500 monitor specs. |
prune | boolean | Delete keyed monitors that aren't in the list. |
adopt_by_name | boolean | Give a key to an existing un-keyed monitor with the same name and type instead of creating a new one. |
continue_on_error | boolean | apply only: keep going after a failed change. |
expected_fingerprint | string | apply only: the plan_fingerprint from the plan you reviewed. If the plan is different now, apply returns 409 PLAN_CHANGED. |
allow_prune_without_fingerprint | boolean | apply only: allow deletes and type-change replaces without expected_fingerprint. |
plan returns changes (each with action: create, update, replace, delete or noop), a summary, warnings and a plan_fingerprint. apply returns ok, summary, per-monitor results and plan_fingerprint, with status 207 if some changes failed. An apply that would delete or replace monitors needs expected_fingerprint or allow_prune_without_fingerprint; otherwise it returns 428 PRUNE_CONFIRMATION_REQUIRED and changes nothing.
{
"workspace_id": "a71c…",
"user_email": "owner@example.com",
"auth_type": "api_key",
"api_key_access": "standard",
"workspace_role": "member",
"read_only": false,
"can_manage_alert_channels": false,
"plan": "growth",
"market": "global",
"limits": { "monitors": 200, "min_interval_seconds": 30, "probe_locations": 5, "status_pages": 10 }
}The example above is a whoami response with illustrative values. The plan and limits you see are your own.
OpenTelemetry export#
| Method | Path | Description | Access |
|---|---|---|---|
GET | /automation/otel | Current export settings and delivery status. | Automation key |
PUT | /automation/otel | Create or update the export. | Automation key |
DELETE | /automation/otel | Remove the export. | Automation key |
POST | /automation/otel/test | Send one test span (10 per 15 minutes). | Automation key |
OpenTelemetry export isn't generally available yet. The fields are described in GitHub, OTel & more.
Related
- REST API guide
- Developer overview
- Webhooks
- Monitors overview
- Plans & limits
- Features: API Monitoring
- Free tools: HTTP Status Code Reference and Unix Timestamp Converter
- Integrations: Webhooks alerts setup
- More from SutramX: Developers & API
Last updated . Something unclear or missing on this page? Tell us at support@sutramx.com.