Developers

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: GET requests 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 gets 403 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#

MethodPathDescriptionAccess
GET/monitorsList all monitors, newest first. Optional ?tag= filter.Any key
GET/monitors/summaryCounts by status, open incidents and 24-hour uptime for the workspace.Any key
POST/monitorsCreate a monitor.Any key
GET/monitors/:idGet one monitor, including 24-hour and 30-day uptime.Any key
PUT/monitors/:idUpdate a monitor. Send only the fields you want to change.Any key
DELETE/monitors/:idDelete a monitor and its history. Returns 204.Any key
POST/monitors/:id/pausePause checks. Returns the monitor.Any key
POST/monitors/:id/resumeResume checks. Returns the monitor.Any key
POST/monitors/:id/reset-statsClear the monitor's statistics.Any key
POST/monitors/bulkPause, resume, delete, tag or move up to 500 monitors at once.Any key
POST/monitors/testRun a one-off check of a monitor definition without saving it. Same body as create.Any key
POST/monitors/:id/run-checkRun a check of a saved monitor now.Any key
GET/monitors/:id/checksCheck history, newest first, cursor-paginated.Any key
GET/monitors/:id/checks.csvExport check history as CSV (up to 50,000 rows).Any key
GET/monitors/:id/regionsThe monitor's probe regions.Any key
GET/monitors/:id/explanationWhy this alert for the monitor: its open incident's explanation, or its current per-region state against the quorum.Any key
GET/monitors/:id/flakinessThe monitor's 7- and 30-day flakiness score (0–100) with its reasons.Any key
PUT/monitors/:id/regionsSet the monitor's probe regions.Any key
GET/monitors/:id/notification-recipientsWho receives this monitor's alert emails.Any key
POST/monitors/:id/test-notificationSend a test alert email.Any key
GET/monitors/:id/domain-sslSSL certificate and domain expiry details.Any key
POST/monitors/:id/domain-ssl/refreshRe-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/rotateIssue a new heartbeat URL for a cron monitor. The old URL stops working immediately.Any key
POST/monitors/:id/cron-heartbeatRecord a heartbeat for a cron monitor using your API key.Any key
GET/monitors/:id/dns-recordsCurrent DNS records and recent changes of a DNS monitor. Optional ?limit=.Any key
POST/monitors/:id/dns-records/acceptAccept the current DNS answer as the new expected value.Any key
GET/monitors/:id/step-runsPer-step results of a multi-step API check.Any key

Create a monitor#

POST /monitors

FieldTypeRequiredDescription and limits
namestringYes1–255 characters.
typestringNohttp (default), api, ping, port, udp, cron, dns, multistep or mcp. Can't be changed after creation.
urlstringFor http, api and mcpA valid http:// or https:// URL (mcp needs https://). Must resolve to a public address.
interval_secondsintegerNo15–900. Can't be below your plan's minimum interval. Defaults to 120 seconds, or your plan's minimum if that is higher.
group_idUUID or nullNoMonitor group to put the monitor in.
escalation_policy_idUUID or nullNoEscalation policy to use.
tagsstring arrayNoUp to 20 tags, 1–32 characters each. Tags are lower-cased and de-duplicated.
regionsstring arrayNo1–50 probe region codes, such as fra1 or usa-az-probe. Defaults to your plan's locations.
configobjectDepends on typeType-specific settings. See Monitor config.
bash
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:

json
{
  "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:

FieldDescription
current_statusup, down, degraded, blocked, unknown, pending (no check yet), paused or maintenance. down means an incident is open.
last_statusStatus of the latest check, or null.
last_checked_atTime of the latest check (ISO 8601).
last_response_time_msResponse time of the latest check.
last_errorError of the latest check when it failed, otherwise null.
open_incident{ "id", "started_at" } of the open incident, or null.
under_maintenancetrue while a maintenance window covers the monitor.
uptime_24h, uptime_30dUptime percentage, or null with no data.
heartbeat_urlThe ping URL for cron monitors, otherwise null.
effective_timeout_msThe timeout actually used for checks.
effective_regionsThe 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:

KeyTypesDescription and limits
methodhttp, apiGET, HEAD, POST, PUT, PATCH, DELETE or OPTIONS.
headershttp, apiObject of request headers, up to 50 entries.
bodyhttp, apiRequest body to send.
timeoutallHTTP and API: 1,000–60,000 milliseconds. Ping, port and UDP: 1–30 seconds.
expected_status_codeshttp, apiArray of up to 500 accepted status codes.
keywordhttp, apiText the response must contain, up to 1,000 characters.
keyword_case_insensitivehttp, apitrue or false.
max_redirectshttp, api0–5.
max_response_time_mshttp, apiResponses slower than this count as failed, 1–600,000 ms.
degraded_response_time_mshttp, apiResponses slower than this are marked degraded. Must be lower than max_response_time_ms.
max_response_byteshttp, api1–10,485,760.
assertionsapiUp to 50 assertions on the response.
hostping, port, udpHostname or IP. Required for these types. Must be public.
portport, udp1–65535. Required for these types.
packet_countpingClamped to 1–10.
cron_expressioncronRequired for cron monitors.
grace_secondscron0–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

FieldTypeRequiredDescription
actionstringYespause, resume, delete, add_tags, remove_tags or move_group.
idsUUID arrayYes1–500 monitor IDs.
tagsstring arrayFor tag actionsTags to add or remove.
group_idUUID or nullFor move_groupTarget group. null removes the monitors from their group.
json
{ "updated": 12, "failed": [{ "id": "…", "error": "Monitor not found" }] }

Check history#

GET /monitors/:id/checks

ParameterDescription
limit1–500, default 50.
beforeUTC timestamp in the form YYYY-MM-DDTHH:MM:SS[.ffffff][Z]. Returns checks older than this. Pass next_before from the previous page unchanged.
regionOnly checks from this region code.
statusup, down, degraded, blocked, unknown, or problem (anything that isn't up).
json
{
  "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:

FieldTypeDescription
statusstringsuccess, ok, up, fail, failure, down or error.
execution_time_msintegerRun duration, 0 to 7 days in milliseconds.
execution_countintegerRun counter.
status_codeinteger0–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 parameterDescription
statusfail (also failure, failed, down, error, err) reports a failed run. ok and similar values, or no parameter, report success.
duration_msOptional 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.

bash
curl -fsS "https://api.sutramx.com/heartbeat/$HEARTBEAT_TOKEN?duration_ms=5230"

Monitor groups#

MethodPathDescriptionAccess
GET/monitor-groupsList groups.Any key
GET/monitor-groups/:id/summaryStatus summary of the monitors in a group.Any key
POST/monitor-groupsCreate a group. Returns 201.Any key
PUT/monitor-groups/:idRename a group.Any key
DELETE/monitor-groups/:idDelete a group.Any key
FieldTypeRequiredDescription
namestringYes on create1–255 characters.
notification_emailsstring arrayNoUp 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.

MethodPathParametersDescription
GET/stats/:id/statsdays (1 up to your plan's uptime history, default 30)Uptime percentage, total, successful and failed checks, average response time.
GET/stats/:id/checkslimit (1–5,000, default 100), regionRecent checks.
GET/stats/:id/incidentslimit (1–500, default 50)Incident history of the monitor.
GET/stats/:id/response-time-chartdays (1 up to your plan's uptime history, default 7), region, tzOffsetMinutes or timeZoneResponse times over time.
GET/stats/:id/response-seriesrange (1h, 6h, 24h, 7d, 30d; default 24h), regionResponse time series.
GET/stats/:id/uptime-historydays (1 up to your plan's uptime history, default 90), tzOffsetMinutes or timeZoneDaily uptime.
GET/stats/:id/24h-barsdays (1 up to your plan's uptime history, default 90), endDate, tzOffsetMinutes or timeZoneDaily status bars.
GET/stats/:id/region-statusesLatest status per region.
GET/stats/:id/pause-windowshours (1–8,760, default 720)When the monitor was paused.
json
{
  "uptime_percentage": 99.95,
  "total_checks": 43200,
  "successful_checks": 43178,
  "failed_checks": 22,
  "avg_response_time_ms": 214
}

Incidents#

MethodPathDescriptionAccess
GET/incidentsList incidents, paginated.Any key
GET/incidents/exportExport incidents as CSV, or JSON with ?format=json. Takes the same filters as the list.Any key
GET/incidents/:idIncident details.Any key
GET/incidents/:id/explanationWhy 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-timelineTimeline of checks, alerts and notes. limit (default 200) and cursor.Any key
POST/incidentsOpen a manual incident for a monitor. 409 if one is already open.Any key
POST/incidents/:id/acknowledgeAcknowledge the incident.Any key
POST/incidents/:id/resolveResolve the incident manually. 409 INCIDENT_RESOLVED if already resolved.Any key
DELETE/incidents/:id/snoozeUnsnooze the incident's alerts. (Snoozing is owner-only.)Any key
GET/incidents/:id/escalationEscalation status.Any key
POST/incidents/:id/escalation/acknowledgeAcknowledge the escalation.Any key
GET/incidents/:id/notesList notes.Any key
POST/incidents/:id/notesAdd a note. Returns 201.Any key
DELETE/incidents/:id/notes/:noteIdDelete a note.Any key
PUT/incidents/:id/postmortemSave the postmortem text.Any key
POST/incidents/:id/runbookAttach a runbook.Any key
PATCH/incidents/:id/runbook-steps/:stepIdMark a runbook step done or not done.Any key

List incidents#

GET /incidents

ParameterDescription
statusongoing, resolved, suppressed or acknowledged. Omit for all.
monitor_idOnly incidents of this monitor.
from, toISO 8601 bounds on the start time.
qSearch monitor names and URLs (up to 200 characters).
pagePage number, default 1.
page_size1–100, default 25.
json
{
  "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#

EndpointFieldTypeDescription
POST /incidentsmonitor_idUUID, requiredMonitor to open the incident for.
POST /incidents/:id/resolvenotestring, optionalUp to 5,000 characters.
POST /incidents/:id/notesbodystring, required1–5,000 characters.
POST /incidents/:id/notespublicboolean, optionalMarks the note as a public update.
PUT /incidents/:id/postmortempostmortemstring, requiredUp to 50,000 characters.
POST /incidents/:id/runbookrunbook_idUUID, optionalRunbook to attach.
PATCH /incidents/:id/runbook-steps/:stepIdis_completedboolean, requiredStep state.

Runbooks#

MethodPathDescription
GET/incidents/runbooksList runbooks.
POST/incidents/runbooksCreate a runbook.
PUT/incidents/runbooks/:runbookIdReplace a runbook.
DELETE/incidents/runbooks/:runbookIdDelete a runbook.
FieldTypeRequiredDescription
namestringYes1–255 characters.
stepsarrayYes1–100 steps, each { "title" (1–255 chars), "description" (up to 5,000 chars, optional) }.
monitor_typestringNoSuggest the runbook for this monitor type.
service_tagstringNoSuggest the runbook for monitors with this tag.
is_activebooleanNoWhether the runbook is offered.

Deploy events#

Deploy events need a plan with deployment correlation (Plan). See Deployment correlation.

MethodPathDescriptionAccess
GET/incidents/deploy-eventsRecent deploys. limit 1–100, default 20.Any key, Plan
POST/incidents/deploy-eventsRecord a deploy. Returns 201.Any key, Plan
GET/incidents/deploy-events/configYour signed deploy webhook URL settings.Any key, Plan
FieldTypeRequiredDescription
service_namestringYes1–255 characters.
environmentstringNo1–64 characters, such as production.
versionstringNo1–120 characters, such as a tag or commit SHA.
deployed_atstringNoISO 8601 time. Defaults to now.
metadataobjectNoAny 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#

MethodPathDescriptionAccess
GET/maintenanceList 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).

MethodPathDescriptionAccess
GET/status/pages/meList your status pages.Any key
GET/status/pages/overviewStatus pages with their current state.Any key
POST/status/pagesCreate a status page. Returns 201.Any key, Plan
GET/status/pages/:idStatus page details, including its monitors.Any key
PATCH/status/pages/:idUpdate a status page.Any key, Plan
DELETE/status/pages/:idDelete a status page.Any key
PUT/status/pages/:id/monitorsReplace the page's monitor list.Any key, Plan
POST/status/pages/:id/monitorsAdd one monitor to the page.Any key, Plan
DELETE/status/pages/:id/monitors/:monitorIdRemove a monitor from the page.Any key
GET/status/pages/monitor/:monitorIdThe status page a monitor is on.Any key
GET/status/pages/:id/accessWho can view the page (public, password or SSO).Any key
PUT/status/pages/:id/accessChange who can view the page.Owner only
POST/status/pages/:id/access/revoke-sessionsSign out every visitor of a private page.Owner only
GET/status/pages/:id/subscribersSubscribers by channel (email, Slack, webhook).Any key
GET/status/pages/:id/languagesPage languages and translations.Any key
PUT/status/pages/:id/languagesChange 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.

FieldTypeDescription and limits
titlestring1–255 characters.
descriptionstring or nullUp to 1,000 characters.
slugstring3–64 characters. Part of the public page URL.
is_publicbooleanWhether the page is published.
logo_urlstring or nullAn https:// URL, or ""/null to clear.
favicon_urlstring or nullAn https:// URL, or ""/null to clear. Setting a favicon needs white-label on your plan.
accent_colorstring or nullHex colour like #0d9488, or ""/null to clear.
hide_powered_bybooleanHide the SutramX footer. Needs white-label on your plan (403 WHITE_LABEL_NOT_ENTITLED otherwise).
show_response_timesbooleanShow 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.

MethodPathDescription
GET/status/:slugThe published page as JSON.
GET/status/:slug/historyDaily uptime history of each monitor on the page. Optional days (up to 90).
GET/status/:slug/badge.svgA status badge image.
GET/status/:slug/feed.xmlAtom 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.

MethodPathDescriptionAccess
GET/integrationsAvailable channel types with their fields, your connections and their status.Any key
GET/integrations/alert-contactsWorkspace email alert contacts.Any key
POST/integrations/:type/connectionsAdd a connection of a channel type, for example /integrations/slack/connections.Automation key
PUT/integrations/connections/:connectionIdEdit a connection. Blank secret fields keep the stored value.Automation key
DELETE/integrations/connections/:connectionIdRemove a connection.Automation key
PUT/integrations/connections/:connectionId/routingChoose which monitors the connection alerts for.Automation key
POST/integrations/connections/:connectionId/testSend 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, webhookwebhook_url
pagerdutyintegration_key
opsgenieapi_key, region (us or eu)
telegramchat_id
githubrepository (owner/repo), token
sms, voice, whatsappto (E.164 phone number, such as +1XXXXXXXXXX)
FieldTypeDescription
namestringLabel shown in the dashboard, up to 60 characters. Defaults to the channel name.
routing.scopestringall, groups or monitors.
routing.group_idsUUID arrayGroups to alert for when the scope is groups (up to 500).
routing.monitor_idsUUID arrayMonitors to alert for when the scope is monitors (up to 500).
routing.min_severitystringdown or degraded.
bash
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" }
  }'
json
{
  "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#

MethodPathDescriptionAccess
GET/alert-recipientsEmail alert recipients and whether each has confirmed.Any key
POST/alert-recipients/resendResend 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:

MethodPathDescription
GET/settings/escalation-policiesEscalation policies.
GET/settings/on-call-schedulesOn-call schedules.
GET/settings/on-call-schedules/currentWho is on call now.
GET/settings/suppression-windowsQuiet hours and deployment windows.
GET/settings/notificationsWorkspace notification preferences.
GET/settings/notification-attemptsAlert delivery statistics.

The team member list (/team/members) is not available to API keys.

Reliability#

MethodPathDescriptionAccess
GET/reliability/overviewWorkspace reliability overview.Any key
GET/reliability/monitor/:monitorIdReliability insights for one monitor.Any key
GET/reliability/dependenciesMonitor dependency graph.Any key, Plan
POST/reliability/dependenciesAdd a dependency.Owner only, Plan
DELETE/reliability/dependencies/:idRemove a dependency.Owner only, Plan
GET/reliability/slo-targetsSLO targets.Any key, Plan
POST/reliability/slo-targetsCreate or replace the SLO target of a monitor.Any key, Plan
PUT/reliability/slo-targets/:idUpdate an SLO target.Any key, Plan
DELETE/reliability/slo-targets/:idDelete 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):

FieldTypeRequiredDescription and limits
monitor_idUUIDYes on createThe monitor. Not accepted on PUT.
target_percentagenumberYes on create90–99.999.
sli_typestringNoavailability or latency.
window_minutesintegerNo60–43,200 (30 days).
burn_rate_fast_thresholdnumberNo0.1–100.
burn_rate_slow_thresholdnumberNo0.1–100.
is_enabledbooleanNoTurn the target on or off.

Website health#

Website health needs a plan that includes it.

MethodPathDescription
GET/website-healthSites and their latest reports.
POST/website-health/sitesAdd a site.
GET/website-health/sites/:idSite details.
PATCH/website-health/sites/:idUpdate a site.
DELETE/website-health/sites/:idDelete a site.
POST/website-health/sites/:id/runCrawl the site now (20 per hour).
GET/website-health/reports/:runIdA report.
GET/website-health/reports/:runId/issues.csvA report's issues as CSV.
FieldTypeDescription and limits
namestringRequired on create, 1–255 characters.
urlstringRequired on create, a valid URL up to 2,000 characters.
max_pagesinteger1–500.
max_depthinteger0–10.
check_external_linksbooleanAlso check links to other sites.
lighthouse_enabledbooleanRun Lighthouse audits.
lighthouse_urlsstring arrayUp to 3 URLs to audit.
lighthouse_form_factorstringmobile or desktop.
schedulestringdaily, weekly or manual.
notify_on_issuesbooleanAlert on new issues.
score_drop_thresholdinteger1–100.
is_activebooleanPause or resume scheduled runs.

See Website health for what each run checks.

Third-party status#

MethodPathDescription
GET/third-party-status/providersProviders you can follow.
GET/third-party-status/providers/:providerIdA provider and its components.
GET/third-party-status/subscriptionsProviders you follow.
POST/third-party-status/subscriptionsFollow a provider.
PATCH/third-party-status/subscriptions/:idChange a subscription.
DELETE/third-party-status/subscriptions/:idStop following a provider.
GET/third-party-status/status-pages/:statusPageIdThird-party services shown on a status page.
PUT/third-party-status/status-pages/:statusPageIdSet 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.

MethodPathDescription
GET/incident-comms/statusWhich AI features you have and how much allowance is left.
GET/incident-comms/incidents/:idSaved AI content for an incident.
POST/incident-comms/incidents/:id/summaryGenerate an incident summary.
POST/incident-comms/incidents/:id/postmortem/generateDraft a postmortem. Body: { "overwrite": true } (optional).
POST/incident-comms/incidents/:id/status-updatesDraft a status page update. Optional phase (investigating, identified, monitoring, resolved) and guidance (up to 1,000 characters).
PATCH/incident-comms/status-updates/:draftIdEdit a draft (body up to 5,000 characters, phase).
POST/incident-comms/status-updates/:draftId/publishPublish a draft.
POST/incident-comms/status-updates/:draftId/discardDiscard 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.

MethodPathDescriptionAccess
GET/automation/whoamiWorkspace, key access level, plan and limits.Any key
GET/automation/monitors/:keyGet a monitor by key (URL-encode the key).Any key
PUT/automation/monitors/:keyCreate or update the monitor with this key. Returns 201 when created, 200 when updated.Any key
DELETE/automation/monitors/:keyDelete the monitor with this key.Any key
PUT/automation/monitors/by-id/:id/keyGive an existing monitor a key ({ "key": "…" }), or remove it ({ "key": null }).Any key
POST/automation/monitors/planPreview the changes for a list of monitor specs. Writes nothing, so read-only keys can call it.Any key
POST/automation/monitors/applyApply 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.

bash
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):

FieldTypeDescription
monitorsarrayUp to 500 monitor specs.
prunebooleanDelete keyed monitors that aren't in the list.
adopt_by_namebooleanGive a key to an existing un-keyed monitor with the same name and type instead of creating a new one.
continue_on_errorbooleanapply only: keep going after a failed change.
expected_fingerprintstringapply only: the plan_fingerprint from the plan you reviewed. If the plan is different now, apply returns 409 PLAN_CHANGED.
allow_prune_without_fingerprintbooleanapply 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.

json
{
  "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#

MethodPathDescriptionAccess
GET/automation/otelCurrent export settings and delivery status.Automation key
PUT/automation/otelCreate or update the export.Automation key
DELETE/automation/otelRemove the export.Automation key
POST/automation/otel/testSend one test span (10 per 15 minutes).Automation key

OpenTelemetry export isn't generally available yet. The fields are described in GitHub, OTel & more.

Last updated . Something unclear or missing on this page? Tell us at support@sutramx.com.