StatOSS

API

Everything the dashboard does, over HTTPS with a key. JSON in, JSON out, stable ids, ISO times.

Keys and scopes

Keys are made under Account, API keys. Each is shown once and stored as a hash. A key has two scopes: what it may do, read or read and write; and what it reaches, every page on the account or one named page. A CI job that posts deploy markers gets a write key for one page; a dashboard that reads everything gets a read key for every page. Revoking is one click, and the list shows when each key was last used.

Calling it

The base is https://statoss.com/api/v1. Send the key as Authorization: Bearer sk_... on every request, and JSON bodies with Content-Type: application/json. The document at /api/v1/openapi.json describes all of it in OpenAPI 3.1 for generators, and this page is rendered from the same document. Agents can use the MCP endpoint instead, with the same key.

curl https://statoss.com/api/v1/pages \
  -H "Authorization: Bearer sk_..."

Errors and limits

Every error is { "error": { "code", "message" } } with an HTTP status: 401 for no key or a bad one, 403 for a read key on a write route, 404 for anything the key does not reach, 400 for a body that did not pass, 422 when the plan is full, 429 past 120 requests a minute per key, with a Retry-After in seconds, 500 when it is our fault. Read keys and write keys count against the same limit, and an MCP batch counts as one request per message (at most 20 per POST). The public /mcp next to a page has the same budget, per page.

Older names

Monitors were called checkpoints until 14 September 2026, and scripts written before then keep working. The /checkpoints paths answer the same as /monitors, a body may still send checkpointIds, and answers carry checkpoint, checkpoints and checkpointIds next to the new names. Over MCP, list_checkpoints and create_checkpoint still answer.

Keys

What the key in use can do.

get/meThe key in use

Says what the key may do and which pages it reaches.

curl https://statoss.com/api/v1/me \
  -H "Authorization: Bearer sk_..."

200: The key.

{
  "key": {
    "id": "1a2b3c4d-6666-4d5e-8f7a-9b8c7d6e5f4a",
    "name": "CI",
    "access": "write",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "createdAt": "2026-09-15T08:00:00.000Z"
  }
}

Errors: 401 No key, or a key that is not valid. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

Pages

Status pages and their current status.

get/pagesList pages

Every page the key reaches, oldest first.

curl https://statoss.com/api/v1/pages \
  -H "Authorization: Bearer sk_..."

200: The pages.

Errors: 401 No key, or a key that is not valid. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

get/pages/{pageId}One page

pageIdpathThe page id, from GET /pages.
curl https://statoss.com/api/v1/pages/PAGE_ID \
  -H "Authorization: Bearer sk_..."

200: The page.

Errors: 401 No key, or a key that is not valid. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

patch/pages/{pageId}Change a page's words

Name, description, support link, uptime target, time zone and whether deploys show. The address, the domain and the plan are not changed here.

pageIdpathThe page id, from GET /pages.

Body

namestring1 to 80 characters.
descriptionstring, or nullUp to 200 characters. Null clears it.
supportUrlstring, or nullStarts with http://, https:// or mailto:, up to 300 characters. Null clears it.
uptimeTargetnumber, or null90 to 99.999. Null turns the error budget off.
timezonestringAn IANA zone such as Europe/Copenhagen.
showDeploysbooleanDraw deploy markers on the public page.
showLocationsbooleanShow each region under the strips.
latencyLocationsstring[], or nullThe regions whose readings count toward response times and slow alerts. Null: Europe. Stored on every plan, used on Hobby and Pro.
uptimeRegionsstring[], or nullThe regions whose checks count toward uptime. Null or every region: all, including ones added later. Hobby and Pro.
curl -X PATCH https://statoss.com/api/v1/pages/PAGE_ID \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"description":"Current status of the Northwind API, dashboard and website.","uptimeTarget":99.9}'

200: The page after the change.

Errors: 400 The body did not pass validation. · 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

get/pages/{pageId}/statusCurrent status

The same document the page serves at /status.json, whatever its password: the headline state, every monitor with its state and 24-hour figures, open incidents, and maintenance in progress or planned within the next week. Times inside incidents and maintenance are epoch milliseconds, as on the public feed; the Incident resource elsewhere uses ISO 8601.

pageIdpathThe page id, from GET /pages.
curl https://statoss.com/api/v1/pages/PAGE_ID/status \
  -H "Authorization: Bearer sk_..."

200: The status.

Errors: 401 No key, or a key that is not valid. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

Monitors

What a page checks.

get/pages/{pageId}/monitorsList monitors

pageIdpathThe page id, from GET /pages.
curl https://statoss.com/api/v1/pages/PAGE_ID/monitors \
  -H "Authorization: Bearer sk_..."

200: The monitors in page order.

{
  "monitors": [
    {
      "id": "0f7c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
      "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
      "name": "API",
      "type": "http",
      "target": "https://api.example.com/health",
      "url": "https://api.example.com/health",
      "host": null,
      "port": null,
      "dnsType": null,
      "dnsExpect": null,
      "warnDays": null,
      "expiresAt": null,
      "heartbeat": null,
      "group": "Backend",
      "method": "GET",
      "expectStatus": null,
      "keyword": "ok",
      "keywordMode": "present",
      "slowThresholdMs": 800,
      "position": 0,
      "status": "up",
      "since": "2026-09-13T20:11:00.000Z",
      "lastCheck": {
        "at": "2026-09-15T09:41:03.000Z",
        "ok": true,
        "statusCode": 200,
        "latencyMs": 142,
        "error": null
      },
      "uptime24h": 100,
      "latencyMs24h": 151,
      "createdAt": "2026-09-01T08:00:00.000Z"
    }
  ]
}

Errors: 401 No key, or a key that is not valid. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

post/pages/{pageId}/monitorsAdd a monitor

The fields that count depend on type; the rest are ignored. The plan's monitor count applies, except to components. The first check runs within a minute.

pageIdpathThe page id, from GET /pages.

Body

namestring1 to 80 characters. Left out on a new monitor, the host of url or host. Required for heartbeat and component.
typestring (http, tcp, dns, ping, certificate, domain, heartbeat, component)http unless given. Cannot change after creation.
urlstringhttp: a URL, http or https. Without a scheme, https:// is added.
hoststringtcp, dns, ping, certificate, domain: a hostname.
portintegertcp: required. certificate: defaults to 443.
dnsTypestring (A, AAAA, CNAME, MX, TXT, NS)dns: A (default), AAAA, CNAME, MX, TXT or NS.
dnsExpectstringdns: text an answer must contain, up to 500 characters.
warnDaysintegercertificate: default 14. domain: default 30.
periodMinutesintegerheartbeat: required, minutes between pings, 1 to 44640.
graceMinutesintegerheartbeat: minutes of grace after the period, 0 to 10080. Default 0.
groupNamestringUp to 60 characters.
slowThresholdMsintegerhttp, tcp, dns, ping: 1 to 9999, under the 10 second check timeout.
slowThresholdsobject, or nullhttp, tcp, dns, ping: some regions' own thresholds, region to ms (1 to 9999), e.g. {"north-america": 800}. A reading from one is slow above its number instead of slowThresholdMs. Null: none. Left out on an update, they stay. Hobby and Pro.
latencyLocationsstring[], or nullhttp, tcp, dns, ping: the regions whose readings count toward response time and slowness. Null: the page's. Left out on an update, it stays. Hobby and Pro.
pinnedRegionstring, or nullhttp, tcp, dns, ping, certificate, domain: check from this region alone (europe, north-america, south-america, africa, asia, oceania). Null or empty: every region. Left out on an update, it stays. Hobby and Pro.
vendorUrlstringcomponent: a vendor's status page to follow (Statuspage, incident.io, Instatus, Better Stack, status.io, Sorry, StatOSS, or Slack's or Heroku's), e.g. https://www.githubstatus.com. Pro.
vendorComponentstringcomponent: one component on the vendor's page, by name, up to 200 characters. Left out, the whole page is followed.
methodstring (GET, HEAD, POST, PUT, PATCH, DELETE)http: GET (default), HEAD, POST, PUT, PATCH or DELETE.
headersobjecthttp: request headers as name to value. A name is letters, digits and hyphens; a value has no line breaks or other control characters. Up to 4000 characters in all. Stored, never returned.
bodystringhttp: sent as-is with methods that take one, up to 10,000 characters. Stored, never returned.
expectStatusintegerhttp: 100 to 599.
keywordstringhttp: up to 200 characters.
keywordModestring (present, absent)present or absent.
curl -X POST https://statoss.com/api/v1/pages/PAGE_ID/monitors \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"API","type":"http","url":"https://api.example.com/health","groupName":"Backend","keyword":"ok","slowThresholdMs":800}'

201: The new monitor.

{
  "monitor": {
    "id": "0f7c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "name": "API",
    "type": "http",
    "target": "https://api.example.com/health",
    "url": "https://api.example.com/health",
    "host": null,
    "port": null,
    "dnsType": null,
    "dnsExpect": null,
    "warnDays": null,
    "expiresAt": null,
    "heartbeat": null,
    "group": "Backend",
    "method": "GET",
    "expectStatus": null,
    "keyword": "ok",
    "keywordMode": "present",
    "slowThresholdMs": 800,
    "position": 0,
    "status": "unknown",
    "since": null,
    "lastCheck": null,
    "uptime24h": null,
    "latencyMs24h": null,
    "createdAt": "2026-09-01T08:00:00.000Z"
  }
}

Errors: 400 The body did not pass validation. · 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 422 The plan's limit is reached. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

get/pages/{pageId}/monitors/{monitorId}One monitor

pageIdpathThe page id, from GET /pages.
monitorIdpath
curl https://statoss.com/api/v1/pages/PAGE_ID/monitors/MONITOR_ID \
  -H "Authorization: Bearer sk_..."

200: The monitor.

{
  "monitor": {
    "id": "0f7c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "name": "API",
    "type": "http",
    "target": "https://api.example.com/health",
    "url": "https://api.example.com/health",
    "host": null,
    "port": null,
    "dnsType": null,
    "dnsExpect": null,
    "warnDays": null,
    "expiresAt": null,
    "heartbeat": null,
    "group": "Backend",
    "method": "GET",
    "expectStatus": null,
    "keyword": "ok",
    "keywordMode": "present",
    "slowThresholdMs": 800,
    "position": 0,
    "status": "up",
    "since": "2026-09-13T20:11:00.000Z",
    "lastCheck": {
      "at": "2026-09-15T09:41:03.000Z",
      "ok": true,
      "statusCode": 200,
      "latencyMs": 142,
      "error": null
    },
    "uptime24h": 100,
    "latencyMs24h": 151,
    "createdAt": "2026-09-01T08:00:00.000Z"
  }
}

Errors: 401 No key, or a key that is not valid. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

patch/pages/{pageId}/monitors/{monitorId}Change a monitor

Send only what changes; a field left out keeps its value and null clears it. The type cannot change; make a new monitor instead.

pageIdpathThe page id, from GET /pages.
monitorIdpath

Body

namestring1 to 80 characters. Left out on a new monitor, the host of url or host. Required for heartbeat and component.
typestring (http, tcp, dns, ping, certificate, domain, heartbeat, component)http unless given. Cannot change after creation.
urlstringhttp: a URL, http or https. Without a scheme, https:// is added.
hoststringtcp, dns, ping, certificate, domain: a hostname.
portintegertcp: required. certificate: defaults to 443.
dnsTypestring (A, AAAA, CNAME, MX, TXT, NS)dns: A (default), AAAA, CNAME, MX, TXT or NS.
dnsExpectstringdns: text an answer must contain, up to 500 characters.
warnDaysintegercertificate: default 14. domain: default 30.
periodMinutesintegerheartbeat: required, minutes between pings, 1 to 44640.
graceMinutesintegerheartbeat: minutes of grace after the period, 0 to 10080. Default 0.
groupNamestringUp to 60 characters.
slowThresholdMsintegerhttp, tcp, dns, ping: 1 to 9999, under the 10 second check timeout.
slowThresholdsobject, or nullhttp, tcp, dns, ping: some regions' own thresholds, region to ms (1 to 9999), e.g. {"north-america": 800}. A reading from one is slow above its number instead of slowThresholdMs. Null: none. Left out on an update, they stay. Hobby and Pro.
latencyLocationsstring[], or nullhttp, tcp, dns, ping: the regions whose readings count toward response time and slowness. Null: the page's. Left out on an update, it stays. Hobby and Pro.
pinnedRegionstring, or nullhttp, tcp, dns, ping, certificate, domain: check from this region alone (europe, north-america, south-america, africa, asia, oceania). Null or empty: every region. Left out on an update, it stays. Hobby and Pro.
vendorUrlstringcomponent: a vendor's status page to follow (Statuspage, incident.io, Instatus, Better Stack, status.io, Sorry, StatOSS, or Slack's or Heroku's), e.g. https://www.githubstatus.com. Pro.
vendorComponentstringcomponent: one component on the vendor's page, by name, up to 200 characters. Left out, the whole page is followed.
methodstring (GET, HEAD, POST, PUT, PATCH, DELETE)http: GET (default), HEAD, POST, PUT, PATCH or DELETE.
headersobjecthttp: request headers as name to value. A name is letters, digits and hyphens; a value has no line breaks or other control characters. Up to 4000 characters in all. Stored, never returned.
bodystringhttp: sent as-is with methods that take one, up to 10,000 characters. Stored, never returned.
expectStatusintegerhttp: 100 to 599.
keywordstringhttp: up to 200 characters.
keywordModestring (present, absent)present or absent.
curl -X PATCH https://statoss.com/api/v1/pages/PAGE_ID/monitors/MONITOR_ID \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"slowThresholdMs":500}'

200: The monitor after the change.

Errors: 400 The body did not pass validation. · 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

delete/pages/{pageId}/monitors/{monitorId}Remove a monitor

Removes the monitor and its history. No undo.

pageIdpathThe page id, from GET /pages.
monitorIdpath
curl -X DELETE https://statoss.com/api/v1/pages/PAGE_ID/monitors/MONITOR_ID \
  -H "Authorization: Bearer sk_..."

204: Removed.

Errors: 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

Incidents

Incidents and maintenance windows, with updates.

get/pages/{pageId}/incidentsList incidents

Newest first, with every update. Pass open=true for only what is still open.

pageIdpathThe page id, from GET /pages.
openqueryOnly open incidents and unfinished maintenance.
limitquery
curl https://statoss.com/api/v1/pages/PAGE_ID/incidents \
  -H "Authorization: Bearer sk_..."

200: The incidents.

{
  "incidents": [
    {
      "id": "3c9e8f7a-2222-4b1c-8d7e-6f5a4b3c2d1e",
      "kind": "incident",
      "title": "Elevated API error rate",
      "status": "identified",
      "impact": "partial",
      "startedAt": "2026-09-15T09:02:00.000Z",
      "endsAt": null,
      "resolvedAt": null,
      "automatic": false,
      "postmortem": null,
      "monitors": [
        {
          "id": "0f7c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
          "name": "API"
        }
      ],
      "updates": [
        {
          "id": "7a6b5c4d-3333-4e2f-9a8b-1c2d3e4f5a6b",
          "status": "identified",
          "body": "A bad deploy. Rolling back.",
          "createdAt": "2026-09-15T09:20:00.000Z"
        },
        {
          "id": "8b7c6d5e-4444-4f3a-8b9c-2d3e4f5a6b7c",
          "status": "investigating",
          "body": "We are seeing elevated error rates on the API and are looking into it.",
          "createdAt": "2026-09-15T09:02:00.000Z"
        }
      ]
    }
  ]
}

Errors: 401 No key, or a key that is not valid. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

post/pages/{pageId}/incidentsOpen an incident or plan maintenance

Opens an incident, or with kind maintenance plans a window. Subscribers are told, the same as from the dashboard. An incident with an impact sets the page's headline while it is open.

pageIdpathThe page id, from GET /pages.

Body

kindstring (incident, maintenance)incident (default) or maintenance.
titlerequiredstring1 to 120 characters.
statusstringincident: investigating (default), identified or monitoring.
impactstringincident: none, degraded, partial (default) or major.
messagestringThe first update or the notice, up to 4000 characters. Left empty, a standard line is used.
startsAtstringmaintenance: ISO 8601.
endsAtstringmaintenance: ISO 8601, within 7 days of the start.
monitorIdsstring[]
monitorsobject[]
startedAtstringincident: when it began, ISO 8601, up to a year back. Default now.
resolvedAtstringincident: when it ended, ISO 8601, for one entered after it was over. Nobody is told.
notifybooleanfalse keeps subscribers out of it: an incident's first update, or a maintenance window at the start and the end. Default true.
remindstring[]
repeatstring (weekly, monthly, monthly-weekday)maintenance: weekly (the same weekday), monthly (the same date, or the month's last day) or monthly-weekday (the second Tuesday, the last Friday). Each window after the first is planned a week before it starts.
timezonestringmaintenance with repeat: the IANA zone the time repeats in, e.g. Europe/Copenhagen. Default UTC.
curl -X POST https://statoss.com/api/v1/pages/PAGE_ID/incidents \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"title":"Elevated API error rate","status":"investigating","impact":"partial","message":"We are seeing elevated error rates on the API and are looking into it.","monitorIds":["0f7c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f"]}'

201: The incident.

{
  "incident": {
    "id": "3c9e8f7a-2222-4b1c-8d7e-6f5a4b3c2d1e",
    "kind": "incident",
    "title": "Elevated API error rate",
    "status": "identified",
    "impact": "partial",
    "startedAt": "2026-09-15T09:02:00.000Z",
    "endsAt": null,
    "resolvedAt": null,
    "automatic": false,
    "postmortem": null,
    "monitors": [
      {
        "id": "0f7c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
        "name": "API"
      }
    ],
    "updates": [
      {
        "id": "7a6b5c4d-3333-4e2f-9a8b-1c2d3e4f5a6b",
        "status": "identified",
        "body": "A bad deploy. Rolling back.",
        "createdAt": "2026-09-15T09:20:00.000Z"
      },
      {
        "id": "8b7c6d5e-4444-4f3a-8b9c-2d3e4f5a6b7c",
        "status": "investigating",
        "body": "We are seeing elevated error rates on the API and are looking into it.",
        "createdAt": "2026-09-15T09:02:00.000Z"
      }
    ]
  }
}

Errors: 400 The body did not pass validation. · 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

get/pages/{pageId}/incidents/{incidentId}One incident

pageIdpathThe page id, from GET /pages.
incidentIdpath
curl https://statoss.com/api/v1/pages/PAGE_ID/incidents/INCIDENT_ID \
  -H "Authorization: Bearer sk_..."

200: The incident.

{
  "incident": {
    "id": "3c9e8f7a-2222-4b1c-8d7e-6f5a4b3c2d1e",
    "kind": "incident",
    "title": "Elevated API error rate",
    "status": "identified",
    "impact": "partial",
    "startedAt": "2026-09-15T09:02:00.000Z",
    "endsAt": null,
    "resolvedAt": null,
    "automatic": false,
    "postmortem": null,
    "monitors": [
      {
        "id": "0f7c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
        "name": "API"
      }
    ],
    "updates": [
      {
        "id": "7a6b5c4d-3333-4e2f-9a8b-1c2d3e4f5a6b",
        "status": "identified",
        "body": "A bad deploy. Rolling back.",
        "createdAt": "2026-09-15T09:20:00.000Z"
      },
      {
        "id": "8b7c6d5e-4444-4f3a-8b9c-2d3e4f5a6b7c",
        "status": "investigating",
        "body": "We are seeing elevated error rates on the API and are looking into it.",
        "createdAt": "2026-09-15T09:02:00.000Z"
      }
    ]
  }
}

Errors: 401 No key, or a key that is not valid. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

patch/pages/{pageId}/incidents/{incidentId}Edit an incident

Title, impact, the window, the monitors, the post-mortem. Nothing is posted or mailed; that is what updates are for.

pageIdpathThe page id, from GET /pages.
incidentIdpath

Body

titlestring1 to 120 characters.
impactstringincident: none, degraded, partial or major.
startsAtstringmaintenance: ISO 8601.
endsAtstringmaintenance: ISO 8601.
remindstring[]
monitorIdsstring[]
monitorsobject[]
postmortemstring, or nullUp to 20,000 characters. Null clears it.
repeatstring, or nullmaintenance: null stops the repeating entry this window was planned from. The windows already planned stay.
curl -X PATCH https://statoss.com/api/v1/pages/PAGE_ID/incidents/INCIDENT_ID \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"impact":"major"}'

200: The incident after the change.

Errors: 400 The body did not pass validation. · 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

delete/pages/{pageId}/incidents/{incidentId}Delete an incident

Removes it and its updates from the page. No undo.

pageIdpathThe page id, from GET /pages.
incidentIdpath
curl -X DELETE https://statoss.com/api/v1/pages/PAGE_ID/incidents/INCIDENT_ID \
  -H "Authorization: Bearer sk_..."

204: Deleted.

Errors: 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

post/pages/{pageId}/incidents/{incidentId}/updatesPost an update

Adds an update and tells subscribers. On an incident, status resolved closes it. On a maintenance window, status completed ends it now. An update on an automatic incident makes it manual: it no longer resolves itself.

pageIdpathThe page id, from GET /pages.
incidentIdpath

Body

statusstringincident: investigating, identified, monitoring or resolved. maintenance: completed ends it now.
messagerequiredstringThe update. Required unless status is completed.
notifybooleanfalse posts it without telling subscribers. Default true.
curl -X POST https://statoss.com/api/v1/pages/PAGE_ID/incidents/INCIDENT_ID/updates \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"status":"resolved","message":"Rolled back. Error rates are normal again."}'

201: The incident with the new update.

Errors: 400 The body did not pass validation. · 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

Deploys

Markers on the response-time chart.

get/pages/{pageId}/deploysList deploys

The last 50 markers, newest first.

pageIdpathThe page id, from GET /pages.
curl https://statoss.com/api/v1/pages/PAGE_ID/deploys \
  -H "Authorization: Bearer sk_..."

200: The deploys.

{
  "deploys": [
    {
      "id": "5d4c3b2a-5555-4a9b-8c7d-6e5f4a3b2c1d",
      "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
      "version": "v2.14.0",
      "url": "https://github.com/example/api/releases/tag/v2.14.0",
      "note": null,
      "monitorIds": null,
      "at": "2026-09-15T08:58:00.000Z",
      "createdAt": "2026-09-15T08:58:04.000Z"
    }
  ]
}

Errors: 401 No key, or a key that is not valid. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

post/pages/{pageId}/deploysMark a deploy

Draws a marker on the response-time chart in the dashboard and, when the page shows deploys, on the public page. Post it from CI after a release.

pageIdpathThe page id, from GET /pages.

Body

versionrequiredstring1 to 80 characters: a version, a tag, a commit.
urlstringhttp or https, up to 500 characters.
notestringUp to 500 characters.
atstringISO 8601. Defaults to now; up to a year back and not more than five minutes ahead.
monitorIdsstring[]
curl -X POST https://statoss.com/api/v1/pages/PAGE_ID/deploys \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"version":"v2.14.0","url":"https://github.com/example/api/releases/tag/v2.14.0"}'

201: The marker.

{
  "deploy": {
    "id": "5d4c3b2a-5555-4a9b-8c7d-6e5f4a3b2c1d",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "version": "v2.14.0",
    "url": "https://github.com/example/api/releases/tag/v2.14.0",
    "note": null,
    "monitorIds": null,
    "at": "2026-09-15T08:58:00.000Z",
    "createdAt": "2026-09-15T08:58:04.000Z"
  }
}

Errors: 400 The body did not pass validation. · 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

delete/pages/{pageId}/deploys/{deployId}Remove a deploy marker

pageIdpathThe page id, from GET /pages.
deployIdpath
curl -X DELETE https://statoss.com/api/v1/pages/PAGE_ID/deploys/DEPLOY_ID \
  -H "Authorization: Bearer sk_..."

204: Removed.

Errors: 401 No key, or a key that is not valid. · 403 A read-only key on a write route. · 404 Nothing by that id that this key reaches. · 429 More than 120 requests in a minute on this key. Retry-After says in how many seconds the minute is up. · 500 Something went wrong on our side.

Resources

The shapes the API sends. Times are ISO 8601 in UTC; ids are stable for the life of the thing.

Page

idstringThe page id. Use it in every page route.
namestringShown in the headline.
slugstringThe address label under the root domain.
urlstringWhere the page is served for visitors.
customDomainstring, or nullThe owner's own hostname, if one is set.
descriptionstring, or nullOne line under the headline.
supportUrlstring, or nullA link under the headline.
timezonestringThe IANA zone the page shows times in until a visitor's browser has loaded it; visitors then see their own.
uptimeTargetnumber, or nullThe uptime target in percent, e.g. 99.9.
passwordProtectedbooleanWhether visitors need the page's password.
privatebooleanWhether only the people and email domains the owner allows can see the page.
showDeploysbooleanWhether deploy markers are drawn on the public page.
showLocationsbooleanWhether the public page shows each region under the strips: a lane of its checks and its response times.
latencyLocationsstring[], or nullThe regions whose readings count toward response times and slow alerts. The others count toward up and down only. Null: Europe, where StatOSS runs.
uptimeRegionsstring[], or nullThe regions whose checks count toward uptime: a monitor down from one of them is down. The others are still checked and shown. Null: all of them.
createdAtstringISO 8601, UTC.

Monitor

idstringThe monitor id.
pageIdstringThe page it is on.
namestringShown on the page.
typestring (http, tcp, dns, ping, certificate, domain, heartbeat, component)What is checked.
targetstringThe URL, host and port, or record, in words.
urlstring, or nullhttp: the URL requested.
hoststring, or nulltcp, dns, ping, certificate, domain: the hostname.
portinteger, or nulltcp and certificate: the port.
dnsTypestring, or nulldns: A, AAAA, CNAME, MX, TXT or NS.
dnsExpectstring, or nulldns: text an answer must contain.
warnDaysinteger, or nullcertificate and domain: fails this many days before expiry.
expiresAtstring, or nullcertificate and domain: when the certificate or the registration expires, ISO 8601, as the newest check read it.
heartbeatobject, or nullperiodSeconds: Seconds between expected pings. graceSeconds: Seconds of grace after the period. lastPingAt: ISO 8601, UTC. pingUrl: The address the job requests, by GET or POST, each time it runs. Only for a key with write access; null for a read key.
groupstring, or nullMonitors with the same group are shown together.
methodstring (GET, HEAD, POST, PUT, PATCH, DELETE), or nullhttp: the request method.
expectStatusinteger, or nullhttp: the exact status expected, or null for any 2xx.
keywordstring, or nullhttp: text the body must contain, or must not.
keywordModestring (present, absent), or nullpresent or absent.
slowThresholdMsinteger, or nullA successful response slower than this is slow.
slowThresholdsobject, or nullSome regions' own thresholds, region to ms: a reading from one is slow above its number instead. Null: slowThresholdMs everywhere.
latencyLocationsstring[], or nullThe monitor's own regions for response times. Null: its page's.
pinnedRegionstring, or nullChecked from this region alone, for a site that lets only its fixed IP in. Null: every region.
vendorUrlstring, or nullcomponent: the vendor status page it follows. Pro.
vendorComponentstring, or nullcomponent: one component on the vendor's page, by name.
positionintegerOrder on the page, from 0.
statusstring (up, slow, down, unknown)up, slow, down or unknown before the first check.
sincestring, or nullISO 8601, UTC.
downFromstring[], or nullWhile down from some regions and up in the others: those regions. Null when not down, or down everywhere.
lastCheckobject, or nullat: ISO 8601, UTC. ok: Whether it passed. statusCode: http: the status received. latencyMs: The response time, in milliseconds. error: Why it failed, when it did.
uptime24hnumber, or nullShare of checks passed in the last 24 hours, in percent.
latencyMs24hnumber, or nullMedian response time over the last 24 hours, as the page shows it: each counted region levelled to its fastest shared place, several regions averaged. Null for heartbeat, certificate and domain monitors.
createdAtstringISO 8601, UTC.

Incident

idstringThe incident id.
kindstring (incident, maintenance)incident or maintenance.
titlestringThe title.
statusstringinvestigating, identified, monitoring or resolved; scheduled or completed for maintenance.
impactstring (none, degraded, partial, major)none, degraded, partial or major.
startedAtstringISO 8601, UTC.
endsAtstring, or nullISO 8601, UTC.
resolvedAtstring, or nullISO 8601, UTC.
automaticbooleanOpened by a monitor going down.
remindstring[], or null
repeatobject, or nullevery: weekly, monthly or monthly-weekday. timezone: The zone its time repeats in. seriesId: The repeating entry every window from it shares. stoppedAt: ISO 8601, UTC.
postmortemstring, or nullThe post-mortem, once written.
monitorsobject[]
updatesUpdate[]

Update

idstringThe update id.
statusstringThe incident's status when it was posted. Imported history can carry in-progress, or the other service's own words.
bodystringThe words.
createdAtstringISO 8601, UTC.

Deploy

idstringThe deploy id.
pageIdstringThe page.
versionstringWhat was deployed.
urlstring, or nullWhere the release lives.
notestring, or nullA line about it.
monitorIdsstring[], or null
atstringISO 8601, UTC.
createdAtstringISO 8601, UTC.

Key

idstringThe key's id.
namestringThe name given at creation.
accessstring (read, write)read, or write for read and write.
pageIdstring, or nullThe one page the key reaches, or null for every page.
createdAtstringISO 8601, UTC.

Error

errorrequiredobjectcode: A short machine-readable reason: unauthenticated, read_only, not_found, bad_request, plan_limit, rate_limited, internal. message: What went wrong, in words.