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
pageIdpath | The 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.
pageIdpath | The page id, from GET /pages. |
Body
name | string | 1 to 80 characters. |
description | string, or null | Up to 200 characters. Null clears it. |
supportUrl | string, or null | Starts with http://, https:// or mailto:, up to 300 characters. Null clears it. |
uptimeTarget | number, or null | 90 to 99.999. Null turns the error budget off. |
timezone | string | An IANA zone such as Europe/Copenhagen. |
showDeploys | boolean | Draw deploy markers on the public page. |
showLocations | boolean | Show each region under the strips. |
latencyLocations | string[], or null | The regions whose readings count toward response times and slow alerts. Null: Europe. Stored on every plan, used on Hobby and Pro. |
uptimeRegions | string[], or null | The 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.
pageIdpath | The 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
pageIdpath | The 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.
pageIdpath | The page id, from GET /pages. |
Body
name | string | 1 to 80 characters. Left out on a new monitor, the host of url or host. Required for heartbeat and component. |
type | string (http, tcp, dns, ping, certificate, domain, heartbeat, component) | http unless given. Cannot change after creation. |
url | string | http: a URL, http or https. Without a scheme, https:// is added. |
host | string | tcp, dns, ping, certificate, domain: a hostname. |
port | integer | tcp: required. certificate: defaults to 443. |
dnsType | string (A, AAAA, CNAME, MX, TXT, NS) | dns: A (default), AAAA, CNAME, MX, TXT or NS. |
dnsExpect | string | dns: text an answer must contain, up to 500 characters. |
warnDays | integer | certificate: default 14. domain: default 30. |
periodMinutes | integer | heartbeat: required, minutes between pings, 1 to 44640. |
graceMinutes | integer | heartbeat: minutes of grace after the period, 0 to 10080. Default 0. |
groupName | string | Up to 60 characters. |
slowThresholdMs | integer | http, tcp, dns, ping: 1 to 9999, under the 10 second check timeout. |
slowThresholds | object, or null | http, 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. |
latencyLocations | string[], or null | http, 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. |
pinnedRegion | string, or null | http, 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. |
vendorUrl | string | component: 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. |
vendorComponent | string | component: one component on the vendor's page, by name, up to 200 characters. Left out, the whole page is followed. |
method | string (GET, HEAD, POST, PUT, PATCH, DELETE) | http: GET (default), HEAD, POST, PUT, PATCH or DELETE. |
headers | object | http: 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. |
body | string | http: sent as-is with methods that take one, up to 10,000 characters. Stored, never returned. |
expectStatus | integer | http: 100 to 599. |
keyword | string | http: up to 200 characters. |
keywordMode | string (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
pageIdpath | The 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.
pageIdpath | The page id, from GET /pages. |
monitorIdpath |
Body
name | string | 1 to 80 characters. Left out on a new monitor, the host of url or host. Required for heartbeat and component. |
type | string (http, tcp, dns, ping, certificate, domain, heartbeat, component) | http unless given. Cannot change after creation. |
url | string | http: a URL, http or https. Without a scheme, https:// is added. |
host | string | tcp, dns, ping, certificate, domain: a hostname. |
port | integer | tcp: required. certificate: defaults to 443. |
dnsType | string (A, AAAA, CNAME, MX, TXT, NS) | dns: A (default), AAAA, CNAME, MX, TXT or NS. |
dnsExpect | string | dns: text an answer must contain, up to 500 characters. |
warnDays | integer | certificate: default 14. domain: default 30. |
periodMinutes | integer | heartbeat: required, minutes between pings, 1 to 44640. |
graceMinutes | integer | heartbeat: minutes of grace after the period, 0 to 10080. Default 0. |
groupName | string | Up to 60 characters. |
slowThresholdMs | integer | http, tcp, dns, ping: 1 to 9999, under the 10 second check timeout. |
slowThresholds | object, or null | http, 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. |
latencyLocations | string[], or null | http, 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. |
pinnedRegion | string, or null | http, 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. |
vendorUrl | string | component: 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. |
vendorComponent | string | component: one component on the vendor's page, by name, up to 200 characters. Left out, the whole page is followed. |
method | string (GET, HEAD, POST, PUT, PATCH, DELETE) | http: GET (default), HEAD, POST, PUT, PATCH or DELETE. |
headers | object | http: 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. |
body | string | http: sent as-is with methods that take one, up to 10,000 characters. Stored, never returned. |
expectStatus | integer | http: 100 to 599. |
keyword | string | http: up to 200 characters. |
keywordMode | string (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.
pageIdpath | The 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.
pageIdpath | The page id, from GET /pages. |
openquery | Only 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.
pageIdpath | The page id, from GET /pages. |
Body
kind | string (incident, maintenance) | incident (default) or maintenance. |
titlerequired | string | 1 to 120 characters. |
status | string | incident: investigating (default), identified or monitoring. |
impact | string | incident: none, degraded, partial (default) or major. |
message | string | The first update or the notice, up to 4000 characters. Left empty, a standard line is used. |
startsAt | string | maintenance: ISO 8601. |
endsAt | string | maintenance: ISO 8601, within 7 days of the start. |
monitorIds | string[] | |
monitors | object[] | |
startedAt | string | incident: when it began, ISO 8601, up to a year back. Default now. |
resolvedAt | string | incident: when it ended, ISO 8601, for one entered after it was over. Nobody is told. |
notify | boolean | false keeps subscribers out of it: an incident's first update, or a maintenance window at the start and the end. Default true. |
remind | string[] | |
repeat | string (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. |
timezone | string | maintenance 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
pageIdpath | The 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.
pageIdpath | The page id, from GET /pages. |
incidentIdpath |
Body
title | string | 1 to 120 characters. |
impact | string | incident: none, degraded, partial or major. |
startsAt | string | maintenance: ISO 8601. |
endsAt | string | maintenance: ISO 8601. |
remind | string[] | |
monitorIds | string[] | |
monitors | object[] | |
postmortem | string, or null | Up to 20,000 characters. Null clears it. |
repeat | string, or null | maintenance: 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.
pageIdpath | The 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.
pageIdpath | The page id, from GET /pages. |
incidentIdpath |
Body
status | string | incident: investigating, identified, monitoring or resolved. maintenance: completed ends it now. |
messagerequired | string | The update. Required unless status is completed. |
notify | boolean | false 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.
pageIdpath | The 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.
pageIdpath | The page id, from GET /pages. |
Body
versionrequired | string | 1 to 80 characters: a version, a tag, a commit. |
url | string | http or https, up to 500 characters. |
note | string | Up to 500 characters. |
at | string | ISO 8601. Defaults to now; up to a year back and not more than five minutes ahead. |
monitorIds | string[] |
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
pageIdpath | The 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
id | string | The page id. Use it in every page route. |
name | string | Shown in the headline. |
slug | string | The address label under the root domain. |
url | string | Where the page is served for visitors. |
customDomain | string, or null | The owner's own hostname, if one is set. |
description | string, or null | One line under the headline. |
supportUrl | string, or null | A link under the headline. |
timezone | string | The IANA zone the page shows times in until a visitor's browser has loaded it; visitors then see their own. |
uptimeTarget | number, or null | The uptime target in percent, e.g. 99.9. |
passwordProtected | boolean | Whether visitors need the page's password. |
private | boolean | Whether only the people and email domains the owner allows can see the page. |
showDeploys | boolean | Whether deploy markers are drawn on the public page. |
showLocations | boolean | Whether the public page shows each region under the strips: a lane of its checks and its response times. |
latencyLocations | string[], or null | The regions whose readings count toward response times and slow alerts. The others count toward up and down only. Null: Europe, where StatOSS runs. |
uptimeRegions | string[], or null | The 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. |
createdAt | string | ISO 8601, UTC. |
Monitor
id | string | The monitor id. |
pageId | string | The page it is on. |
name | string | Shown on the page. |
type | string (http, tcp, dns, ping, certificate, domain, heartbeat, component) | What is checked. |
target | string | The URL, host and port, or record, in words. |
url | string, or null | http: the URL requested. |
host | string, or null | tcp, dns, ping, certificate, domain: the hostname. |
port | integer, or null | tcp and certificate: the port. |
dnsType | string, or null | dns: A, AAAA, CNAME, MX, TXT or NS. |
dnsExpect | string, or null | dns: text an answer must contain. |
warnDays | integer, or null | certificate and domain: fails this many days before expiry. |
expiresAt | string, or null | certificate and domain: when the certificate or the registration expires, ISO 8601, as the newest check read it. |
heartbeat | object, or null | periodSeconds: 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. |
group | string, or null | Monitors with the same group are shown together. |
method | string (GET, HEAD, POST, PUT, PATCH, DELETE), or null | http: the request method. |
expectStatus | integer, or null | http: the exact status expected, or null for any 2xx. |
keyword | string, or null | http: text the body must contain, or must not. |
keywordMode | string (present, absent), or null | present or absent. |
slowThresholdMs | integer, or null | A successful response slower than this is slow. |
slowThresholds | object, or null | Some regions' own thresholds, region to ms: a reading from one is slow above its number instead. Null: slowThresholdMs everywhere. |
latencyLocations | string[], or null | The monitor's own regions for response times. Null: its page's. |
pinnedRegion | string, or null | Checked from this region alone, for a site that lets only its fixed IP in. Null: every region. |
vendorUrl | string, or null | component: the vendor status page it follows. Pro. |
vendorComponent | string, or null | component: one component on the vendor's page, by name. |
position | integer | Order on the page, from 0. |
status | string (up, slow, down, unknown) | up, slow, down or unknown before the first check. |
since | string, or null | ISO 8601, UTC. |
downFrom | string[], or null | While down from some regions and up in the others: those regions. Null when not down, or down everywhere. |
lastCheck | object, or null | at: 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. |
uptime24h | number, or null | Share of checks passed in the last 24 hours, in percent. |
latencyMs24h | number, or null | Median 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. |
createdAt | string | ISO 8601, UTC. |
Incident
id | string | The incident id. |
kind | string (incident, maintenance) | incident or maintenance. |
title | string | The title. |
status | string | investigating, identified, monitoring or resolved; scheduled or completed for maintenance. |
impact | string (none, degraded, partial, major) | none, degraded, partial or major. |
startedAt | string | ISO 8601, UTC. |
endsAt | string, or null | ISO 8601, UTC. |
resolvedAt | string, or null | ISO 8601, UTC. |
automatic | boolean | Opened by a monitor going down. |
remind | string[], or null | |
repeat | object, or null | every: 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. |
postmortem | string, or null | The post-mortem, once written. |
monitors | object[] | |
updates | Update[] |
Update
id | string | The update id. |
status | string | The incident's status when it was posted. Imported history can carry in-progress, or the other service's own words. |
body | string | The words. |
createdAt | string | ISO 8601, UTC. |
Deploy
id | string | The deploy id. |
pageId | string | The page. |
version | string | What was deployed. |
url | string, or null | Where the release lives. |
note | string, or null | A line about it. |
monitorIds | string[], or null | |
at | string | ISO 8601, UTC. |
createdAt | string | ISO 8601, UTC. |
Key
id | string | The key's id. |
name | string | The name given at creation. |
access | string (read, write) | read, or write for read and write. |
pageId | string, or null | The one page the key reaches, or null for every page. |
createdAt | string | ISO 8601, UTC. |
Error
errorrequired | object | code: A short machine-readable reason: unauthenticated, read_only, not_found, bad_request, plan_limit, rate_limited, internal. message: What went wrong, in words. |