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 Settings, 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. A key works while the person who made it can open the team in the dashboard, and is refused with a 403 when they cannot.

A key for every page can make pages, within the plan; a key for one page gets a 403. Deleting a page needs a write key made by the team's owner or an admin, and the page's address as confirm. The logo, own domain and access of a page follow the same plan rules as in the dashboard.

An MCP client can sign a person in with OAuth instead of a key, as Signing in shows.

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.

Setting up an account

A key that writes can finish setting up an account: add alert destinations and pick which ones a page sends to, change a page's alert settings and send a test alert, add and remove subscribers, invite people to the team and set their roles, and make and revoke API keys. The same calls are MCP tools, listed under MCP and agents.

A key acts as the person who made it, and a token as the person who signed in. The team and the API keys are for the owner and admins; a key made by someone who is now a member, or who cannot enter the team (its plan has none, or it needs two-factor sign-in they lack), is refused. A key held to one page changes that page's alert settings and subscribers, and makes and revokes keys held to that page; the account's destinations and team are out of its reach. A key makes keys no broader than itself: not more access, and from a key held to one page only for that page. The new key is in the answer once. A key made through a connected app is deleted when the app is disconnected or its access revoked.

An email destination gets no alerts until the link mailed to it is opened. An email subscriber added by the API gets the same confirmation mail as the subscribe form and is not subscribed until it opens the link; the plan's subscriber limits and the mail limits apply. Importing subscribers in bulk is in the dashboard.

Billing, passwords, two-factor sign-in, single sign-on and deleting the account are in the dashboard only.

Keys

What the key in use can do.

get/meThe key in use

Says what the key may do and which pages it reaches. Through an OAuth access token, `key` stands for the grant and `oauth` says who it acts for.

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.

post/pagesMake a page

Makes a status page, and its first monitor when url is given. Needs a key for every page; a key held to one page gets a 403. The plan's page count applies.

Body

namestring1 to 80 characters. Left out, taken from url.
slugstringThe address under statoss.com: 3 to 40 lowercase letters, digits and hyphens. Hobby and Pro; on Free the address is assigned and sending one is a 422. Left out, one is assigned from the name.
urlstringThe first monitor's address. Without a scheme, https:// is added. The page is made without a monitor when the plan has no room for one.
curl -X POST https://statoss.com/api/v1/pages \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Northwind","slug":"northwind","url":"https://api.northwind.example/health"}'

201: The page, and its monitor. (PageCreated)

{
  "page": {
    "id": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "name": "Northwind",
    "slug": "northwind",
    "url": "https://northwind.statoss.com",
    "customDomain": null,
    "description": null,
    "supportUrl": null,
    "timezone": "UTC",
    "uptimeTarget": null,
    "passwordProtected": false,
    "private": false,
    "showDeploys": false,
    "showLocations": true,
    "latencyLocations": null,
    "uptimeRegions": null,
    "accent": null,
    "theme": "auto",
    "noindex": false,
    "range": "24h",
    "poweredBy": true,
    "foldGroups": false,
    "vendorsCount": true,
    "logoUrl": null,
    "faviconUrl": null,
    "createdAt": "2026-10-12T08:00:00.000Z"
  },
  "monitor": null
}

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, or a key that may not do this.; 409 It cannot be done as things stand.; 422 The plan does not include this, or its 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}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

Name, address, description, support link, uptime target, time zone, which regions count, and how the page looks: accent, theme, search engines, the opening range, the footer. Send only what changes. The logo, the domain and who can open the page have routes of their own; the plan is not changed here.

pageIdpathThe page id, from GET /pages.

Body

namestring1 to 80 characters.
slugstringThe address under statoss.com: 3 to 40 lowercase letters, digits and hyphens. Hobby and Pro; the old address stops working. On other plans a different address is a 422.
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. Hobby and Pro; a 422 on Free.
latencyLocationsstring[], or nullThe regions whose readings count toward response times and slow alerts. Null: Europe. Hobby and Pro; a 422 on Free.
uptimeRegionsstring[], or nullThe regions whose checks count toward uptime. Null or every region: all, including ones added later. Hobby and Pro; a 422 on Free.
accentstring, or null#rrggbb, for links and buttons. Null clears it.
themestring (auto, light, dark)auto follows the visitor's system; light or dark fixes it.
noindexbooleantrue asks search engines to leave the page out.
rangestring (24h, 7d, 90d, 1y)The range the page opens on, within the plan's history: 24h, 7d, 90d or 1y.
poweredBybooleanfalse leaves "Powered by StatOSS" out of the footer. Pro.
foldGroupsbooleanShow the page's groups folded.
vendorsCountbooleanCount components that follow a vendor in the headline status. 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 404 Nothing by that id that this key reaches.; 409 The new address is taken.; 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.

delete/pages/{pageId}Delete a page

Deletes the page with its monitors, history, incidents and subscribers, and frees its address. Only a key made by the team's owner or an admin can. Send confirm as the page's address, in the query or the body; without it the answer is 200 with what would go and nothing is deleted.

pageIdpathThe page id, from GET /pages.
confirmqueryThe page's address, its slug, exactly.
curl -X DELETE https://statoss.com/api/v1/pages/PAGE_ID \
  -H "Authorization: Bearer sk_..."

200: Without confirm: what would go. (PageRemoval)

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, or a key that may not do this.; 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.

Page settings

A page's logo, favicon, own domain and who can open it. The logo and favicon are sent as the image itself, not JSON, and have no MCP tool.

put/pages/{pageId}/faviconSet the favicon

The icon in the visitor's browser tab. Without one, the logo is used. PNG, JPEG, WebP, GIF, SVG or ICO, up to 512 KB. Send the file as the body.

pageIdpathThe page id, from GET /pages.
curl -X PUT https://statoss.com/api/v1/pages/PAGE_ID/favicon \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: image/png" \
  --data-binary @image

200: The stored image.

{
  "asset": {
    "kind": "favicon",
    "url": "https://northwind.statoss.com/favicon?v=1760256000000",
    "contentType": "image/png",
    "bytes": 8123,
    "updatedAt": "2026-10-12T08: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, or a key that may not do this.; 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}/faviconRemove the favicon

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

204: Removed, or there was none.

Errors: 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a key that may not do this.; 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.

put/pages/{pageId}/domainSet the page's own domain

Serves the page at a hostname of its own. Pro. The hostname is checked at once; the answer says where it stands, which DNS records to add at the domain's provider (the CNAME or addresses, and a TXT record that shows the domain is the page's) and which of them it did not find. A hostname on another page that is not served there is taken from it when this page's TXT record is in DNS, never because DNS points here: the 409 names the record to add.

pageIdpathThe page id, from GET /pages.

Body

domainrequiredstringA hostname such as status.example.com, without a path. A scheme is dropped.
curl -X PUT https://statoss.com/api/v1/pages/PAGE_ID/domain \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"domain":"status.example.com"}'

200: Where the domain stands.

{
  "domain": {
    "domain": "status.example.com",
    "verified": false,
    "status": "waiting",
    "live": false,
    "problem": null,
    "message": "status.example.com saved. DNS does not point here yet.",
    "registerFailed": false,
    "served": true,
    "owned": false,
    "missing": [
      "dns",
      "txt"
    ],
    "records": [
      {
        "type": "CNAME",
        "name": "status",
        "value": "edge.statoss.com"
      },
      {
        "type": "TXT",
        "name": "_statoss.status",
        "value": "statoss-verify=0123456789abcdef0123456789abcdef"
      }
    ],
    "dnsProvider": "Cloudflare"
  }
}

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, or a key that may not do this.; 404 Nothing by that id that this key reaches.; 409 It cannot be done as things stand.; 422 The plan does not include this, or its 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.

delete/pages/{pageId}/domainRemove the page's own domain

Takes the hostname off the page, which keeps its address under statoss.com. Another page may use the hostname after.

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

204: Removed, or there was none.

Errors: 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a key that may not do this.; 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}/domain/checkCheck the page's own domain

Looks again at DNS: the TXT record that shows the domain is the page's and the CNAME or addresses, and then at the edge, the hostname and its certificate. Nothing is registered at the edge until the TXT record is seen. Call it after adding the records until status is live; missing names the ones not found.

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

200: Where the domain stands.

{
  "domain": {
    "domain": "status.example.com",
    "verified": true,
    "status": "live",
    "live": true,
    "problem": null,
    "message": "status.example.com is live.",
    "registerFailed": false,
    "served": true,
    "owned": false,
    "missing": [
      "dns",
      "txt"
    ],
    "records": [
      {
        "type": "CNAME",
        "name": "status",
        "value": "edge.statoss.com"
      },
      {
        "type": "TXT",
        "name": "_statoss.status",
        "value": "statoss-verify=0123456789abcdef0123456789abcdef"
      }
    ],
    "dnsProvider": "Cloudflare"
  }
}

Errors: 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a key that may not do this.; 404 Nothing by that id that this key reaches.; 409 It cannot be done as things stand.; 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.; 503 The edge would not register the hostname yet. Check again in a moment.

get/pages/{pageId}/accessWho can open the page

Public, behind a shared password, or private to the people and email domains allowed. A password or its hash is never shown. The list of people (viewers) is in the answer to a write key only.

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

200: Who can open it.

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}/accessChange who can open the page

Send only what changes. A private page is Pro, and so is a password; a page is never both. Each person added to a private page is mailed a link. Networks are Enterprise.

pageIdpathThe page id, from GET /pages.

Body

privatebooleantrue makes the page private (Pro) and takes its password away; false opens it. A new viewer secret signs everyone out when it flips.
passwordstring, or nullA shared password, 6 to 200 characters (Pro), for a page that is not private. Null takes it away.
viewerDomainsstring[]Private page: email domains whose addresses may open it. Replaces the list. Domains anyone can have an address at, such as gmail.com, are refused.
viewerNetworksstring[]Private page, Enterprise: networks that open it without signing in. Replaces the list.
addViewersstring[]People to allow, up to 100. Each is mailed a link while the page is private.
removeViewersstring[]People to take off the list, up to 100.
signOutViewersbooleantrue signs every viewer out and changes the page's key.
curl -X PATCH https://statoss.com/api/v1/pages/PAGE_ID/access \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"private":true,"viewerDomains":["northwind.example"],"addViewers":["[email protected]"]}'

200: Who can open it now.

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, or a key that may not do this.; 404 Nothing by that id that this key reaches.; 422 The plan does not include this, or its 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.

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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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}/monitors/{monitorId}/checkCheck a monitor now

Runs one check and records it, as the dashboard's Check now does. Twelve a minute for the account; past that, a 429. A monitor the plan has paused is not checked.

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

200: The monitor and what the check found. (MonitorCheck)

Errors: 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a key that may not do this.; 404 Nothing by that id that this key reaches.; 409 It cannot be done as things stand.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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.

Alert destinations

Where the account's alerts can go: email addresses, chat channels, pagers and webhooks. Pages pick from the list.

get/alert-destinationsList alert destinations

The account's destinations, oldest first, with the pages that send to each. A key that writes also sees where each points. A key held to one page, or a token held to one app, does not reach the account's destinations.

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

200: The destinations.

{
  "destinations": [
    {
      "id": "5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f",
      "kind": "email",
      "name": "[email protected]",
      "target": "[email protected]",
      "secret": null,
      "eu": false,
      "emergency": false,
      "confirmed": false,
      "available": true,
      "pageIds": [
        "7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77"
      ],
      "createdAt": "2026-10-12T08:00:00.000Z"
    }
  ]
}

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

post/alert-destinationsAdd an alert destination

Adds a destination to the account, ticked on pageIds. The same one again is found, not doubled. An email address is mailed a link and gets no alerts until it is opened. Chat, pager and webhook destinations are on Hobby and Pro. At most 50 destinations, and 20 on a page.

Body

kindrequiredstring (email, slack, discord, webhook, pagerduty, opsgenie, ntfy, telegram, pushover, teams)What kind of destination.
targetrequiredstringWhere it goes: an email address, a webhook URL, an integration key, a Telegram chat ID or a Pushover user key.
secretstringntfy: the access token. Telegram: the bot token. Pushover: the application token. A webhook that is given none gets a signing secret made for it.
eubooleanOpsgenie: the EU region.
emergencybooleanPushover: down alerts repeat until acknowledged.
pageIdsstring[]The pages that send alerts here. A change replaces the list.
curl -X POST https://statoss.com/api/v1/alert-destinations \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"kind":"email","target":"[email protected]","pageIds":["7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77"]}'

200: It was on the list already.

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 422 The plan or a limit does not allow it.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

patch/alert-destinations/{destinationId}Change an alert destination

Points it somewhere else and sets the pages that send to it; what the body leaves out stays. An email address and a Slack channel that was connected are not changed, only their pages.

destinationIdpathThe destination id, from GET /alert-destinations.

Body

targetstringWhere it goes: an email address, a webhook URL, an integration key, a Telegram chat ID or a Pushover user key.
secretstringntfy: the access token. Telegram: the bot token. Pushover: the application token. A webhook that is given none gets a signing secret made for it.
eubooleanOpsgenie: the EU region.
emergencybooleanPushover: down alerts repeat until acknowledged.
pageIdsstring[]The pages that send alerts here. A change replaces the list.
curl -X PATCH https://statoss.com/api/v1/alert-destinations/DESTINATION_ID \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"pageIds":["7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77"]}'

200: The destination.

{
  "destination": {
    "id": "5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f",
    "kind": "email",
    "name": "[email protected]",
    "target": "[email protected]",
    "secret": null,
    "eu": false,
    "emergency": false,
    "confirmed": false,
    "available": true,
    "pageIds": [
      "7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77"
    ],
    "createdAt": "2026-10-12T08:00:00.000Z"
  }
}

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 422 The plan or a limit does not allow it.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

delete/alert-destinations/{destinationId}Remove an alert destination

Removes it from the account and from every page that sends to it.

destinationIdpathThe destination id, from GET /alert-destinations.
curl -X DELETE https://statoss.com/api/v1/alert-destinations/DESTINATION_ID \
  -H "Authorization: Bearer sk_..."

204: Removed.

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

post/alert-destinations/{destinationId}/testSend a test alert

Sends one test alert to the destination. One that refuses it answers sent: false with why. An email address that is not confirmed is a 409, and at most 5 test emails an hour go to one address.

destinationIdpathThe destination id, from GET /alert-destinations.
curl -X POST https://statoss.com/api/v1/alert-destinations/DESTINATION_ID/test \
  -H "Authorization: Bearer sk_..."

200: Whether it took the alert.

{
  "sent": true,
  "error": null
}

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 409 It cannot be done as things stand.; 422 The plan or a limit does not allow it.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

Alert settings

When a page's alerts go out and to whom, and a test alert.

get/pages/{pageId}/alert-settingsA page's alert settings

Whether alerts go out, how often they repeat, the destinations and people they go to, who is paged and when subscribers hear of an outage.

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

200: The settings.

{
  "settings": {
    "pageId": "7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77",
    "alertsEnabled": true,
    "alertOwnerEmail": true,
    "repeatAlertMinutes": 30,
    "monthlyReport": false,
    "destinationIds": [
      "5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f"
    ],
    "destinations": [
      {
        "id": "5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f",
        "kind": "email",
        "name": "[email protected]",
        "confirmed": true,
        "available": true
      }
    ],
    "memberIds": [],
    "escalationPolicyId": null,
    "ackTimeoutMinutes": 0,
    "subscriberOutageMinutes": 5
  }
}

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, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

patch/pages/{pageId}/alert-settingsChange a page's alert settings

What the dashboard's Notifications tab saves; what the body leaves out stays. Everything is checked before anything is saved. The escalation policy and the acknowledgement time are for the owner's and admins' keys, with on-call. The monthly report and subscriberOutageMinutes are on Pro.

pageIdpathThe page id, from GET /pages.

Body

alertsEnabledbooleanAlerts on or off.
alertOwnerEmailbooleanThe account's own address gets the alerts.
repeatAlertMinutesinteger0 to 1440.
monthlyReportbooleanPro.
destinationIdsstring[]The account's destinations the page sends to, replacing the list. At most 20.
memberIdsstring[]People on the team besides the owner, replacing the list.
escalationPolicyIdstring, or nullOne of the team's policies, or null for none. With on-call.
ackTimeoutMinutesinteger (0, 30, 60, 240, 480, 1440)With on-call.
subscriberOutageMinutesinteger0 to 1440, or -1 for never. Pro.
curl -X PATCH https://statoss.com/api/v1/pages/PAGE_ID/alert-settings \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"repeatAlertMinutes":30,"destinationIds":["5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f"]}'

200: The settings after the change.

{
  "settings": {
    "pageId": "7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77",
    "alertsEnabled": true,
    "alertOwnerEmail": true,
    "repeatAlertMinutes": 30,
    "monthlyReport": false,
    "destinationIds": [
      "5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f"
    ],
    "destinations": [
      {
        "id": "5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f",
        "kind": "email",
        "name": "[email protected]",
        "confirmed": true,
        "available": true
      }
    ],
    "memberIds": [],
    "escalationPolicyId": null,
    "ackTimeoutMinutes": 0,
    "subscriberOutageMinutes": 5
  }
}

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 422 The plan or a limit does not allow it.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

post/pages/{pageId}/alert-settings/testSend a test alert for a page

Sends one test alert to every destination the page sends to, as saved, and says which took it. A 409 when alerts are off or nothing can take them yet. Email is left out past 5 test emails an hour.

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

200: What each destination answered. (PageAlertTest)

{
  "sent": true,
  "emailSkipped": false,
  "results": [
    {
      "destinationId": "5b0f3c1e-0000-4d2a-9f8e-7a6b5c4d3e2f",
      "kind": "email",
      "name": "email to [email protected]",
      "sent": true,
      "error": null
    }
  ]
}

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 409 It cannot be done as things stand.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

Subscribers

A page's subscribers: email addresses that confirm, and webhooks and channels the owner adds.

get/pages/{pageId}/subscribersList a page's subscribers

Newest first, a page at a time, with the counts by kind and the page's allowance. A webhook shows its host, not its URL.

pageIdpathThe page id, from GET /pages.
limitqueryHow many, from 1 to 100.
cursorqueryThe cursor the last page gave, for the next.
kindqueryOnly this kind.
statusqueryOnly confirmed, or only unconfirmed ones.
curl https://statoss.com/api/v1/pages/PAGE_ID/subscribers \
  -H "Authorization: Bearer sk_..."

200: The subscribers.

{
  "subscribers": [
    {
      "id": "2e8a6c4b-0000-4f1d-b3a9-0c8e6a4b2d10",
      "pageId": "7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77",
      "kind": "email",
      "target": "[email protected]",
      "confirmed": false,
      "confirmedAt": null,
      "monitorIds": null,
      "secret": null,
      "createdAt": "2026-10-12T08:05:00.000Z"
    }
  ],
  "cursor": null,
  "counts": {
    "total": 1,
    "confirmed": 0,
    "unconfirmed": 1,
    "byKind": {
      "email": 1,
      "webhook": 0,
      "slack": 0,
      "discord": 0,
      "teams": 0
    }
  },
  "allowance": {
    "included": 1000,
    "blocks": 0,
    "cap": 1000,
    "overage": false,
    "confirmed": 0
  }
}

Errors: 400 The body or the query did not pass validation.; 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, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

post/pages/{pageId}/subscribersAdd a subscriber

Subscribers are on Pro. An email address gets the confirmation mail the page's form sends and is not subscribed until its link is opened; it is never marked confirmed here. A webhook url is confirmed at once and answers with its signing secret, and a Discord or Teams webhook adds that channel. The list's allowance and the mail limits apply. Bulk import is in the dashboard.

pageIdpathThe page id, from GET /pages.

Body

emailstringThe address to subscribe. It gets the confirmation mail and is subscribed once it opens the link. Instead of url.
urlstringAn https webhook that gets every incident update as signed JSON, or a Discord or Teams webhook for that channel. Instead of email.
monitorIdsstring[]Only these monitors' incidents. Left out, none or all of them: the whole page.
curl -X POST https://statoss.com/api/v1/pages/PAGE_ID/subscribers \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]"}'

200: The address was on the list unconfirmed and its link was mailed again, or it was mailed too recently to send another.

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 409 It cannot be done as things stand.; 422 The plan or a limit does not allow it.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

delete/pages/{pageId}/subscribers/{subscriberId}Remove a subscriber

pageIdpathThe page id, from GET /pages.
subscriberIdpathThe subscriber id, from the page's list of subscribers.
curl -X DELETE https://statoss.com/api/v1/pages/PAGE_ID/subscribers/SUBSCRIBER_ID \
  -H "Authorization: Bearer sk_..."

204: Removed.

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

Team

The people on the account, invitations, and roles. For the owner and admins.

get/teamThe team

The people with their roles, the invitations still open, and the seats. For the owner's and admins' keys. A key held to one page, or a token held to one app, does not reach the team.

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

200: The team. (Team)

{
  "team": {
    "id": "u-4f2a",
    "name": "Acme",
    "ownerEmail": "[email protected]",
    "open": true,
    "requireTwoFactor": false,
    "seats": {
      "used": 2,
      "included": 3,
      "max": 25
    }
  },
  "members": [
    {
      "id": "m-1",
      "userId": "u-4f2a",
      "name": "Owen",
      "email": "[email protected]",
      "role": "owner",
      "twoFactor": true,
      "joinedAt": "2026-09-01T09:00:00.000Z"
    }
  ],
  "invitations": [
    {
      "id": "i-1",
      "email": "[email protected]",
      "role": "member",
      "expiresAt": "2026-10-19T08:00:00.000Z"
    }
  ]
}

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

post/team/invitationsInvite someone

Invites by email as an admin or a member, with the dashboard's mail, open for a week. The same role again sends a reminder and answers 200; another role replaces the invitation. Teams are on Pro, 3 people included and $5 a month for each one after, up to 25; past the included seats only the owner invites. At most 20 invitations wait, and the mail limits apply.

Body

emailrequiredstringWho to invite.
rolerequiredstring (admin, member)What they can do.
curl -X POST https://statoss.com/api/v1/team/invitations \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","role":"member"}'

200: A reminder for an invitation still open.

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 409 It cannot be done as things stand.; 422 The plan or a limit does not allow it.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

delete/team/invitations/{invitationId}Cancel an invitation

Cancels one that has not been answered.

invitationIdpathThe invitation id, from GET /team.
curl -X DELETE https://statoss.com/api/v1/team/invitations/INVITATION_ID \
  -H "Authorization: Bearer sk_..."

204: Cancelled.

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

patch/team/members/{memberId}Change a role

Makes a member an admin or an admin a member. The owner's role never changes. An admin made a member loses the invitations they sent.

memberIdpathThe member id, from GET /team.

Body

rolerequiredstring (admin, member)The new role.
curl -X PATCH https://statoss.com/api/v1/team/members/MEMBER_ID \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"role":"admin"}'

200: The member.

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

delete/team/members/{memberId}Remove a person

Removes them from the team. The API keys they made stop working and the invitations they sent are cancelled. The owner stays.

memberIdpathThe member id, from GET /team.
curl -X DELETE https://statoss.com/api/v1/team/members/MEMBER_ID \
  -H "Authorization: Bearer sk_..."

204: Removed.

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

API keys

The account's API keys. A key makes keys no broader than itself, and one made through a connected app is deleted when the app is disconnected or its access revoked. For the owner and admins.

get/keysList API keys

Newest first, never the key itself. For the owner's and admins' keys. A key held to one page sees the keys held to its page.

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

200: The keys.

{
  "keys": [
    {
      "id": "k-9a1b",
      "name": "CI",
      "prefix": "sk_Ab3dEf",
      "access": "write",
      "pageId": "7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77",
      "madeBy": null,
      "createdAt": "2026-10-12T08:10:00.000Z",
      "lastUsedAt": null
    }
  ]
}

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

post/keysMake an API key

Needs a key that writes, and the owner's or an admin's. The new key is no broader than the one making it: not more access, and from a key held to one page only for that page (a 403 otherwise). A token follows its person's role and scope, and a key made through a connected app is deleted when the app is disconnected or its access revoked (madeBy names it). At most 25 keys. The secret is in this answer once and is not stored.

Body

namerequiredstringWhat the key is for, up to 60 characters.
accessstring (read, write)read, or write for read and write. Default read.
pageIdstring, or nullHold the key to this page. Left out: every page, or the page the key making it is held to.
curl -X POST https://statoss.com/api/v1/keys \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"CI","access":"write","pageId":"7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77"}'

201: The key and its secret. (NewApiKey)

{
  "key": {
    "id": "k-9a1b",
    "name": "CI",
    "prefix": "sk_Ab3dEf",
    "access": "write",
    "pageId": "7c2d9e4a-0000-4b1c-8a3f-2e1d0c9b8a77",
    "madeBy": null,
    "createdAt": "2026-10-12T08:10:00.000Z",
    "lastUsedAt": null
  },
  "secret": "sk_Ab3dEf..."
}

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 422 The plan or a limit does not allow it.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

delete/keys/{keyId}Revoke an API key

Whatever uses it stops working. A key held to one page revokes only the keys held to its page.

keyIdpathThe key id, from GET /keys.
curl -X DELETE https://statoss.com/api/v1/keys/KEY_ID \
  -H "Authorization: Bearer sk_..."

204: Revoked.

Errors: 401 No key, or a key that is not valid.; 403 A read-only key, a key that does not reach this, or a person who is not the team's owner or an admin.; 404 Nothing by that id that this key reaches.; 429 More than 120 requests in a minute on this key, or too many mails or tests for now. Retry-After says in how many seconds to try again.; 500 Something went wrong on our side.

Apps

Apps that send errors, and each app's own levels, categories, fields and the rules that sort events into them.

get/appsList apps

The apps the key reaches: all of the team's, or those on the key's page.

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

200: The apps.

{
  "apps": [
    {
      "id": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
      "name": "Checkout API",
      "slug": "checkout-api",
      "num": 42,
      "platform": "node",
      "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
      "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/appsMake an app

Makes an app with its first key. A key held to a page puts it on that page; any other key may name one of the team's pages, or none. At most 100 apps.

Body

namerequiredstringUp to 80 characters.
platformstring, or nulljavascript, node, nextjs, react, python, go, php or ruby.
pageIdstring, or nullThe status page it shows on.
curl -X POST https://statoss.com/api/v1/apps \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Checkout API","platform":"node","pageId":"9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b"}'

201: The app and its first key.

{
  "app": {
    "id": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
    "name": "Checkout API",
    "slug": "checkout-api",
    "num": 42,
    "platform": "node",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "errorsShare": 50,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "dsn": "https://[email protected]/42",
    "firstEventAt": "2026-09-01T08:12:00.000Z",
    "lastEventAt": "2026-10-08T11:58:00.000Z"
  },
  "key": {
    "key": "3f2c9a1b7d6e4f5a8b9c0d1e2f3a4b5c",
    "label": "Default",
    "dsn": "https://[email protected]/42",
    "allowedWebsites": [],
    "ratePerMinute": 1200,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "revokedAt": null
  }
}

Errors: 400 The body or the query 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/apps/{app}One app

Its name, slug, platform, page, the DSN of its oldest live key (null for a read key), and when it first and last sent an event.

apppathThe app's id or slug, from GET /apps.
curl https://statoss.com/api/v1/apps/APP \
  -H "Authorization: Bearer sk_..."

200: The app.

{
  "app": {
    "id": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
    "name": "Checkout API",
    "slug": "checkout-api",
    "num": 42,
    "platform": "node",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "errorsShare": 50,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "dsn": "https://[email protected]/42",
    "firstEventAt": "2026-09-01T08:12:00.000Z",
    "lastEventAt": "2026-10-08T11:58: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/apps/{app}Change an app

Name, slug, platform, page or errorsShare; what the body leaves out stays. A key held to a page cannot move the app off it.

apppathThe app's id or slug, from GET /apps.

Body

namestringUp to 80 characters.
slugstringLowercase letters, digits and dashes, up to 40.
platformstring, or nullThe platform, or null.
pageIdstring, or nullThe page it shows on, or null.
errorsShareintegerThe percent of the team's monthly errors the app may use, 1 to 100. Past it intake refuses the app's errors until the month turns; the team's own quota holds as well.
curl -X PATCH https://statoss.com/api/v1/apps/APP \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Checkout","slug":"checkout","errorsShare":25}'

200: The app.

{
  "app": {
    "id": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
    "name": "Checkout API",
    "slug": "checkout-api",
    "num": 42,
    "platform": "node",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "errorsShare": 50,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "dsn": "https://[email protected]/42",
    "firstEventAt": "2026-09-01T08:12:00.000Z",
    "lastEventAt": "2026-10-08T11:58:00.000Z"
  }
}

Errors: 400 The body or the query 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/apps/{app}Remove an app

Removes the app with its keys, alert rules and issues; its rules' open alerts are resolved. Without confirm, answers with what would go and changes nothing.

apppathThe app's id or slug, from GET /apps.
confirmquerytrue goes ahead; "confirm": true in the body does the same. Left out, the answer says what would happen and nothing changes.
curl -X DELETE https://statoss.com/api/v1/apps/APP \
  -H "Authorization: Bearer sk_..."

200: Without confirm: what would go.

Errors: 400 The body or the query 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/apps/{app}/keysList an app's keys

Its keys, newest first, the revoked ones too. A read key gets each key's label and times; the key and its DSN are null.

apppathThe app's id or slug, from GET /apps.
limitqueryHow many, from 1 to 100.
cursorqueryThe cursor the last page gave, for the next.
curl https://statoss.com/api/v1/apps/APP/keys \
  -H "Authorization: Bearer sk_..."

200: The keys.

{
  "keys": [
    {
      "key": "3f2c9a1b7d6e4f5a8b9c0d1e2f3a4b5c",
      "label": "Default",
      "dsn": "https://[email protected]/42",
      "allowedWebsites": [],
      "ratePerMinute": 1200,
      "createdAt": "2026-09-01T08:00:00.000Z",
      "revokedAt": null
    }
  ],
  "cursor": null
}

Errors: 400 The body or the query did not pass validation.; 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/apps/{app}/keysAdd a key

Up to 10 live keys per app. A key for a web page can be given its allowed websites and a lower rate at once.

apppathThe app's id or slug, from GET /apps.

Body

labelstringWhat it is for, up to 60 characters.
allowedWebsitesstring[]Host names, with a leading *. for the sites below one; up to 50. Left out or empty allows any website.
ratePerMinuteintegerEvents a minute, 10 to 1200. Left out, 1200.
curl -X POST https://statoss.com/api/v1/apps/APP/keys \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"label":"Website","allowedWebsites":["example.com","*.example.com"],"ratePerMinute":300}'

201: The key.

Errors: 400 The body or the query 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.

patch/apps/{app}/keys/{key}Change a key's allowed websites or rate

Protects a key that sits in a web page, where anyone can read it: allowedWebsites lists the hosts it may be used from (intake refuses a request whose Origin or Referer names another; a request with neither is taken), ratePerMinute lowers the events a minute it may send. What the body leaves out stays. A revoked key cannot be changed.

apppathThe app's id or slug, from GET /apps.
keypathThe key, from the list of keys.

Body

allowedWebsitesstring[]Host names, with a leading *. for the sites below one; up to 50. Empty allows any website.
ratePerMinuteintegerEvents a minute, 10 to 1200.
curl -X PATCH https://statoss.com/api/v1/apps/APP/keys/KEY \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"allowedWebsites":["example.com","*.example.com"],"ratePerMinute":300}'

200: The key.

Errors: 400 The body or the query 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.; 409 The key is revoked.; 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/apps/{app}/keys/{key}Revoke a key

Intake refuses events sent with it from then on. The last live key stays: add another first. Without confirm, answers with what it would do.

apppathThe app's id or slug, from GET /apps.
keypathThe key, from the list of keys.
confirmquerytrue goes ahead; "confirm": true in the body does the same. Left out, the answer says what would happen and nothing changes.
curl -X DELETE https://statoss.com/api/v1/apps/APP/keys/KEY \
  -H "Authorization: Bearer sk_..."

200: Without confirm: what it would do.

Errors: 400 The body or the query 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.; 409 Revoked already, or the last live key.; 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/apps/{app}/schemaAn app's schema

Its levels, categories, fields and rules, with the version. The five built-in levels are always there.

apppathThe app's id or slug, from GET /apps.
curl https://statoss.com/api/v1/apps/APP/schema \
  -H "Authorization: Bearer sk_..."

200: The schema. (AppSchema)

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/apps/{app}/schema/planPlan a change

Checks up to 50 changes without making them, and answers with what each would do, any warnings and a handle that apply takes within 15 minutes, with the same key. confirm is true for a merge or a remove. Instead of changes, desired takes a whole schema as code declares it (levels, categories and fields, each with only the settings to set, and rules); the server works out the changes and answers them in changes, or no handle and the summary "No change". prune also removes kept values and rules it leaves out.

apppathThe app's id or slug, from GET /apps.

Body

changesSchemaChangeInput[]
desiredobjectA whole schema: {"levels": {"payment-failed": {"like": "error"}}, "categories": {"billing": {"label": "Billing"}}, "fields": {"route": {"filterable": true}}, "rules": [...]}.
prunebooleanWith desired: remove kept values and rules it leaves out.
curl -X POST https://statoss.com/api/v1/apps/APP/schema/plan \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"changes":[{"op":"set","kind":"category","key":"billing","label":"Billing","color":"plum"}]}'

200: The plan. (SchemaPlan)

{
  "handle": "q3V9cXJ0eW1vZGVsc2NoZW1h",
  "expiresAt": "2026-10-08T12:15:00.000Z",
  "version": 3,
  "summary": "Changed the category billing",
  "effects": [
    {
      "what": "category billing",
      "action": "changed",
      "before": {
        "kept": false,
        "label": null,
        "color": null,
        "severity": null,
        "position": 0,
        "hidden": false,
        "mergedInto": null,
        "ownerId": null,
        "fieldType": null,
        "unit": null,
        "filterable": false
      },
      "after": {
        "kept": true,
        "label": "Billing",
        "color": "plum",
        "severity": null,
        "position": 0,
        "hidden": false,
        "mergedInto": null,
        "ownerId": null,
        "fieldType": null,
        "unit": null,
        "filterable": false
      }
    }
  ],
  "warnings": [],
  "confirm": false
}

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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 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/apps/{app}/schema/applyApply a plan

Makes the planned changes, if the schema has not changed since the plan. The change is recorded and can be undone.

apppathThe app's id or slug, from GET /apps.

Body

handlerequiredstringThe handle plan gave.
curl -X POST https://statoss.com/api/v1/apps/APP/schema/apply \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"handle":"q3V9cXJ0eW1vZGVsc2NoZW1h"}'

200: The change, what it did, and the schema after. (SchemaApplied)

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, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 404 Nothing by that id that this key reaches.; 409 Something changed since: plan again, or undo the later change first.; 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/apps/{app}/schema/changesList changes

The app's schema changes, newest first, from the dashboard, the API and the MCP.

apppathThe app's id or slug, from GET /apps.
limitqueryHow many, from 1 to 100; a 400 outside that.
curl https://statoss.com/api/v1/apps/APP/schema/changes \
  -H "Authorization: Bearer sk_..."

200: The changes.

Errors: 400 The body did not pass validation.; 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/apps/{app}/schema/changes/{changeId}/undoUndo a change

Puts back what the change touched, if each row and rule still reads as the change left it; otherwise a 409 says which changed since. The undo is a change of its own.

apppathThe app's id or slug, from GET /apps.
changeIdpathThe change id, from apply or the list of changes.
curl -X POST https://statoss.com/api/v1/apps/APP/schema/changes/CHANGE_ID/undo \
  -H "Authorization: Bearer sk_..."

200: The undo, what it did, and the schema after. (SchemaApplied)

Errors: 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a key whose maker cannot open the team now: a key works while the person who made it can open the team.; 404 Nothing by that id that this key reaches.; 409 Something changed since: plan again, or undo the later change first.; 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.

Issues

The events of an app grouped into issues, as the dashboard's Issues lists them, and the changes people make to them.

get/issuesList issues

Issues of the key's apps seen in the range, as the dashboard lists them, with counts for the environment and range. q is the search language (/docs/search) as Issues reads it: words in the title and culprit, /regex/, level:, category:, priority:, assigned:, is:, age:, firstSeen:, lastSeen:, times_seen: and fields such as browser:Firefox, with -term or !key:value to leave out, a OR b, key:[a, b], * at either end of a value, key:>500 and has:key. Of the 1,000 seen latest. A search that does not read answers 400 with why.

appsqueryApps by id or slug, comma-separated; every app the key reaches when left out.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back.
tabqueryWhich issues.
sortquerylast and first are by when seen.
qqueryThe search (/docs/search), up to 500 characters.
cursorqueryThe cursor the last page gave, for the next one.
limitquery
curl https://statoss.com/api/v1/issues \
  -H "Authorization: Bearer sk_..."

200: The issues. (IssueList)

{
  "issues": [
    {
      "id": "2b7e1c4d-8888-4f1a-9b2c-3d4e5f6a7b8c",
      "shortId": "CHECKOUT-API-12",
      "app": {
        "id": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
        "name": "Checkout API",
        "slug": "checkout-api"
      },
      "title": "TypeError: Cannot read properties of undefined (reading 'total')",
      "culprit": "priceCart (src/cart.ts)",
      "type": "error",
      "platform": "node",
      "level": {
        "key": "error",
        "label": "Error",
        "color": "red"
      },
      "category": {
        "key": "billing",
        "label": "Billing",
        "color": "plum"
      },
      "status": "unresolved",
      "substatus": "new",
      "priority": "high",
      "assignee": null,
      "firstSeen": "2026-10-08T09:12:44.000Z",
      "lastSeen": "2026-10-08T11:58:02.000Z",
      "firstRelease": "[email protected]",
      "lastRelease": "[email protected]",
      "timesSeen": 214,
      "counts": {
        "events": 214,
        "users": 37
      },
      "resolvedAt": null,
      "resolvedInRelease": null,
      "archivedUntil": null,
      "resolveInNextRelease": null,
      "reviewed": false,
      "url": "https://statoss.com/app/issues/2b7e1c4d-8888-4f1a-9b2c-3d4e5f6a7b8c"
    }
  ],
  "total": 1,
  "cursor": null,
  "countsError": null
}

Errors: 400 The query or body did not pass validation.; 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.

get/issues/{issueId}An issue

The issue with counts and its tags' common values over the environment and range, its latest event in short (exception, frames with source lines, the last 20 breadcrumbs, tags) and its activity. If events cannot be read, the issue still comes back, with eventsError set.

issueIdpathThe issue's id, or its short id such as WEB-12.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back.
curl https://statoss.com/api/v1/issues/{issueId} \
  -H "Authorization: Bearer sk_..."

200: The issue. (IssueDetail)

Errors: 400 The query or body did not pass validation.; 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/issues/{issueId}Change an issue

Any of status, resolveInNextRelease, priority, assignee and reviewed, made in that order. Resolving or archiving resolves the issue's alerts, which tells whoever they went to.

issueIdpathThe issue's id, or its short id such as WEB-12.

Body

statusstring (unresolved, resolved, archived)A new status.
untilstringWith archived: when the archive ends, ISO 8601, within a year. For good when left out.
resolveInNextReleasebooleantrue: resolves once a release after the app's newest reports in. Not with status.
prioritystring (high, medium, low)high, medium or low.
assigneestring, or nullA team member's email or id; null for nobody.
reviewedbooleantrue takes it off the For review tab.
curl -X PATCH https://statoss.com/api/v1/issues/{issueId} \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"status":"resolved","assignee":"[email protected]"}'

200: The issue after. (Issue)

Errors: 400 The query or 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/issues/{issueId}/eventsAn issue's events

Newest first, in the environment, and within the range when one is given; every event kept otherwise.

issueIdpathThe issue's id, or its short id such as WEB-12.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back; every event kept when left out.
cursorqueryThe cursor the last page gave, for the next one.
limitquery
curl https://statoss.com/api/v1/issues/{issueId}/events \
  -H "Authorization: Bearer sk_..."

200: The events. (EventList)

Errors: 400 The query or body did not pass validation.; 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.; 503 Events could not be read just now; try again shortly.

post/issues/{issueId}/commentsComment on an issue

Adds a comment to its activity, in the name of the key's maker.

issueIdpathThe issue's id, or its short id such as WEB-12.

Body

bodyrequiredstringUp to 5,000 characters.
curl -X POST https://statoss.com/api/v1/issues/{issueId}/comments \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"body":"Fixed in 2.14.1, deploying now."}'

201: The comment. (IssueComment)

Errors: 400 The query or 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.

post/issues/mergeMerge issues

Merges issues of one app into the oldest: their events, hashes and activity move to it and the others are removed, with their alerts resolved. A merge cannot be undone, so without "confirm": true the answer says what it would do and nothing changes.

Body

issueIdsrequiredstring[]
confirmbooleantrue makes the merge.
curl -X POST https://statoss.com/api/v1/issues/merge \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"issueIds":["CHECKOUT-API-12","CHECKOUT-API-15"],"confirm":true}'

200: What it did, or would do. (IssueMerge)

Errors: 400 The query or 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.

Events

Events as Explore finds them, and one whole.

get/eventsSearch events

Events as Explore finds them, newest first: in the apps, environment and range, at the levels and in the categories (by key or label), with each field holding its value, and matching q. q is the search language (/docs/search) as Explore reads it: words, phrases and /regex/ in the title, culprit or message, level:, category: and fields, with -term or !key:value to leave out, a OR b, key:[a, b], * at either end of a value, key:>500 and has:key. A search that does not read answers 400 with why.

appsqueryApps by id or slug, comma-separated; every app the key reaches when left out.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back.
levelqueryA level by key or label; give it again for more.
categoryqueryA category by key or label; give it again for more.
fieldquerykey:value, such as route:/pay; give it again for more, up to 10.
qqueryThe search (/docs/search), up to 200 characters.
cursorqueryThe cursor the last page gave, for the next one.
limitquery
curl https://statoss.com/api/v1/events \
  -H "Authorization: Bearer sk_..."

200: The events. (EventList)

Errors: 400 The query or body did not pass validation.; 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.; 503 Events could not be read just now; try again shortly.

get/events/{eventId}An event

The whole event as it was stored, scrubbed, with its issue: exceptions and frames with variables, breadcrumbs, request, user, contexts, tags, extra and the grouping used.

eventIdpath32 hex digits, dashes or not.
appqueryThe app's id or slug; every app the key reaches when left out.
curl https://statoss.com/api/v1/events/{eventId} \
  -H "Authorization: Bearer sk_..."

200: The event. (Event)

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.; 503 Events could not be read just now; try again shortly.

Releases

Releases read from events or made by sentry-cli, and the source map bundles uploaded for them.

get/releasesList releases

Releases of the key's apps, newest first by their first event, with the issues each brought, brought back and resolved.

appsqueryApps by id or slug, comma-separated; every app the key reaches when left out.
cursorqueryThe cursor the last page gave, for the next one.
limitquery
curl https://statoss.com/api/v1/releases \
  -H "Authorization: Bearer sk_..."

200: The releases. (ReleaseList)

Errors: 400 The query or body did not pass validation.; 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.

get/releases/{releaseId}A release

Its new, regressed and resolved issues, up to 200 each, and the deploy marker of its version on the app's page.

releaseIdpathThe release id, or its version with app.
appqueryThe app's id or slug, to name the release by version.
curl https://statoss.com/api/v1/releases/{releaseId} \
  -H "Authorization: Bearer sk_..."

200: The release. (ReleaseDetail)

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.

get/apps/{app}/sourcemapsList source map bundles

The bundles sentry-cli uploaded for the app, newest first, with the debug ids of their maps.

apppathThe app's id or slug, from GET /apps.
releasequeryOnly the bundles of this release.
cursorqueryThe cursor the last page gave, for the next one.
limitquery
curl https://statoss.com/api/v1/apps/APP/sourcemaps \
  -H "Authorization: Bearer sk_..."

200: The bundles. (SourceMapList)

Errors: 400 The query or body did not pass validation.; 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.

Alert rules

When an app's issues alert: new, regressed, escalating, or so many events in so many minutes. On-call alerts.

get/apps/{app}/alert-rulesList an app's alert rules

Its issue alert rules, newest first. Issue alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
limitqueryHow many, from 1 to 100.
cursorqueryThe cursor the last page gave, for the next.
curl https://statoss.com/api/v1/apps/APP/alert-rules \
  -H "Authorization: Bearer sk_..."

200: The rules.

{
  "alertRules": [
    {
      "id": "2b3c4d5e-8888-4f6a-9b0c-1d2e3f4a5b6c",
      "appId": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
      "name": "New and regressed issues",
      "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
      "enabled": true,
      "onNew": true,
      "onRegressed": true,
      "onEscalating": false,
      "eventCount": 0,
      "eventMinutes": 60,
      "minPriority": "high",
      "minLevel": null,
      "environments": [
        "production"
      ],
      "release": null,
      "tags": [],
      "categories": [],
      "throttle": "release",
      "ownRouting": false,
      "repeatMinutes": 0,
      "groupMinutes": 0,
      "destinationIds": [],
      "memberIds": [],
      "paging": "none",
      "summary": "New issues, regressions; high priority; production; once per release",
      "createdAt": "2026-09-02T10:00:00.000Z",
      "lastFiredAt": null
    }
  ],
  "cursor": null
}

Errors: 400 The body or the query did not pass validation.; 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/apps/{app}/alert-rulesMake an alert rule

What the body leaves out takes the default rule's: new and regressed high-priority issues, once per release, to the page's destinations, paging nobody. At most 20 rules per app. Issue alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.

Body

namestringThe rule's name, up to 80 characters.
pageIdstringThe page whose on-call takes its alerts. A new rule takes the app's page unless given.
enabledbooleanOff keeps the rule without alerting.
onNewbooleanAlerts on a new issue.
onRegressedbooleanAlerts on a regression.
onEscalatingbooleanAlerts when an issue escalates: an hour with at least 50 events and ten times its hourly average over the week before.
eventCountintegerAlerts when an issue takes so many events in eventMinutes; 0 is off.
eventMinutesinteger (1, 5, 15, 60, 1440)The minutes eventCount is counted over.
minPrioritystring (high, medium, low)The issue's priority at least this; low takes any.
minLevelstring (debug, info, warning, error, fatal), or nullThe event's level at least this; null for any.
environmentsstring[]Up to 10 environments an event must be in; empty for any.
releasestring, or nullThe release an event must name; ending in * matches the start. Null for any.
tagsobject[]Up to 5 tags an event must all have. Also taken as an object of key and value.
categoriesstring[]Up to 20 category keys, one of which the issue's category reads as through the app's schema; empty for any.
throttlestring (release, 30, 60, 1440, 10080)How often one issue may alert: release (once per release and once per regression, once a day without a release), or at most every 30, 60, 1440 or 10080 minutes.
ownRoutingbooleantrue sends to destinationIds and memberIds; false to where the page's alerts go.
repeatMinutesinteger (0, 1, 2, 5, 10, 15, 30, 60)Minutes between repeats while triggered; 0 for none.
groupMinutesinteger (0, 2, 5, 10, 30)Minutes in which later alerts join the first; 0 is off.
destinationIdsstring[]With ownRouting: the team's alert destinations.
memberIdsstring[]With ownRouting: people in the team to notify.
pagingstringWho is paged: "page" (the page's escalation policy), "none", or the id of one of the team's policies. Escalation is on Pro; elsewhere it is kept as it was.
curl -X POST https://statoss.com/api/v1/apps/APP/alert-rules \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Checkout errors","onNew":true,"onRegressed":true,"minLevel":"error","environments":["production"]}'

201: The rule.

{
  "alertRule": {
    "id": "2b3c4d5e-8888-4f6a-9b0c-1d2e3f4a5b6c",
    "appId": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
    "name": "New and regressed issues",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "enabled": true,
    "onNew": true,
    "onRegressed": true,
    "onEscalating": false,
    "eventCount": 0,
    "eventMinutes": 60,
    "minPriority": "high",
    "minLevel": null,
    "environments": [
      "production"
    ],
    "release": null,
    "tags": [],
    "categories": [],
    "throttle": "release",
    "ownRouting": false,
    "repeatMinutes": 0,
    "groupMinutes": 0,
    "destinationIds": [],
    "memberIds": [],
    "paging": "none",
    "summary": "New issues, regressions; high priority; production; once per release",
    "createdAt": "2026-09-02T10:00:00.000Z",
    "lastFiredAt": null
  }
}

Errors: 400 The body or the query 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/apps/{app}/alert-rules/{ruleId}One alert rule

Issue alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
ruleIdpathThe rule id, from the list of rules.
curl https://statoss.com/api/v1/apps/APP/alert-rules/RULE_ID \
  -H "Authorization: Bearer sk_..."

200: The rule.

{
  "alertRule": {
    "id": "2b3c4d5e-8888-4f6a-9b0c-1d2e3f4a5b6c",
    "appId": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
    "name": "New and regressed issues",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "enabled": true,
    "onNew": true,
    "onRegressed": true,
    "onEscalating": false,
    "eventCount": 0,
    "eventMinutes": 60,
    "minPriority": "high",
    "minLevel": null,
    "environments": [
      "production"
    ],
    "release": null,
    "tags": [],
    "categories": [],
    "throttle": "release",
    "ownRouting": false,
    "repeatMinutes": 0,
    "groupMinutes": 0,
    "destinationIds": [],
    "memberIds": [],
    "paging": "none",
    "summary": "New issues, regressions; high priority; production; once per release",
    "createdAt": "2026-09-02T10:00:00.000Z",
    "lastFiredAt": null
  }
}

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/apps/{app}/alert-rules/{ruleId}Change an alert rule

What the body leaves out stays. Issue alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
ruleIdpathThe rule id, from the list of rules.

Body

namestringThe rule's name, up to 80 characters.
pageIdstringThe page whose on-call takes its alerts. A new rule takes the app's page unless given.
enabledbooleanOff keeps the rule without alerting.
onNewbooleanAlerts on a new issue.
onRegressedbooleanAlerts on a regression.
onEscalatingbooleanAlerts when an issue escalates: an hour with at least 50 events and ten times its hourly average over the week before.
eventCountintegerAlerts when an issue takes so many events in eventMinutes; 0 is off.
eventMinutesinteger (1, 5, 15, 60, 1440)The minutes eventCount is counted over.
minPrioritystring (high, medium, low)The issue's priority at least this; low takes any.
minLevelstring (debug, info, warning, error, fatal), or nullThe event's level at least this; null for any.
environmentsstring[]Up to 10 environments an event must be in; empty for any.
releasestring, or nullThe release an event must name; ending in * matches the start. Null for any.
tagsobject[]Up to 5 tags an event must all have. Also taken as an object of key and value.
categoriesstring[]Up to 20 category keys, one of which the issue's category reads as through the app's schema; empty for any.
throttlestring (release, 30, 60, 1440, 10080)How often one issue may alert: release (once per release and once per regression, once a day without a release), or at most every 30, 60, 1440 or 10080 minutes.
ownRoutingbooleantrue sends to destinationIds and memberIds; false to where the page's alerts go.
repeatMinutesinteger (0, 1, 2, 5, 10, 15, 30, 60)Minutes between repeats while triggered; 0 for none.
groupMinutesinteger (0, 2, 5, 10, 30)Minutes in which later alerts join the first; 0 is off.
destinationIdsstring[]With ownRouting: the team's alert destinations.
memberIdsstring[]With ownRouting: people in the team to notify.
pagingstringWho is paged: "page" (the page's escalation policy), "none", or the id of one of the team's policies. Escalation is on Pro; elsewhere it is kept as it was.
curl -X PATCH https://statoss.com/api/v1/apps/APP/alert-rules/RULE_ID \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'

200: The rule after.

{
  "alertRule": {
    "id": "2b3c4d5e-8888-4f6a-9b0c-1d2e3f4a5b6c",
    "appId": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
    "name": "New and regressed issues",
    "pageId": "9b1d4f2a-1111-4e3c-9a8b-7c6d5e4f3a2b",
    "enabled": true,
    "onNew": true,
    "onRegressed": true,
    "onEscalating": false,
    "eventCount": 0,
    "eventMinutes": 60,
    "minPriority": "high",
    "minLevel": null,
    "environments": [
      "production"
    ],
    "release": null,
    "tags": [],
    "categories": [],
    "throttle": "release",
    "ownRouting": false,
    "repeatMinutes": 0,
    "groupMinutes": 0,
    "destinationIds": [],
    "memberIds": [],
    "paging": "none",
    "summary": "New issues, regressions; high priority; production; once per release",
    "createdAt": "2026-09-02T10:00:00.000Z",
    "lastFiredAt": null
  }
}

Errors: 400 The body or the query 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/apps/{app}/alert-rules/{ruleId}Remove an alert rule

Resolves its open alerts; their issues stay as they are. Without confirm, answers with what it would do. Issue alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
ruleIdpathThe rule id, from the list of rules.
confirmquerytrue goes ahead; "confirm": true in the body does the same. Left out, the answer says what would happen and nothing changes.
curl -X DELETE https://statoss.com/api/v1/apps/APP/alert-rules/RULE_ID \
  -H "Authorization: Bearer sk_..."

200: Without confirm: what it would do.

Errors: 400 The body or the query 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.

Dashboards

The team's own dashboards of widgets, read with their numbers, changed by plan then apply.

get/dashboardsList dashboards

The team's own dashboards, newest first. Each app's own dashboard is not among them: it follows the app's schema.

limitqueryHow many, from 1 to 100.
cursorqueryThe cursor the last page gave, for the next.
curl https://statoss.com/api/v1/dashboards \
  -H "Authorization: Bearer sk_..."

200: The dashboards.

Errors: 400 The body or the query did not pass validation.; 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.

get/dashboards/{dashboardId}One dashboard

Its widgets in order. With data=1, each widget's numbers (data, or dataError when they could not be read) over the range, from the apps the key reaches. A key held to a page sees only that page's apps in queries and numbers.

dashboardIdpathThe dashboard id, from GET /dashboards.
dataquery1 adds each widget's numbers.
rangequeryWith data: how far back, up to now.
environmentqueryWith data: one environment's events only.
curl https://statoss.com/api/v1/dashboards/DASHBOARD_ID \
  -H "Authorization: Bearer sk_..."

200: The dashboard. With data, each widget also has data (WidgetData) and dataError.

{
  "dashboard": {
    "id": "8a7b6c5d-aaaa-4e3f-9a1b-2c3d4e5f6a7b",
    "name": "Checkout",
    "createdAt": "2026-10-01T09:00:00.000Z",
    "updatedAt": "2026-10-01T09:00:00.000Z",
    "widgets": [
      {
        "id": "4d5e6f7a-9999-4b1c-8d2e-3f4a5b6c7d8e",
        "position": 0,
        "kind": "bar",
        "title": "",
        "shownTitle": "Events by level",
        "width": "full",
        "query": {
          "apps": [
            "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d"
          ],
          "measure": "events",
          "groupBy": "level",
          "field": null,
          "levels": [],
          "categories": [],
          "fields": [],
          "text": ""
        },
        "body": null,
        "createdAt": "2026-10-01T09:00:00.000Z",
        "updatedAt": "2026-10-01T09:00:00.000Z"
      }
    ]
  }
}

Errors: 400 The body or the query did not pass validation.; 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/dashboards/planPlan a change

Checks up to 50 changes to one dashboard (dashboardId), or to a new one (changes starting with create_dashboard), without making them, and answers with what each would do and a handle that apply takes within 15 minutes, with the same key. confirm is true for a removal. A key held to a page cannot change a dashboard that shows other apps.

Body

dashboardIdstringThe dashboard; left out with create_dashboard.
changesrequiredDashboardChange[]
curl -X POST https://statoss.com/api/v1/dashboards/plan \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"dashboardId":"8a7b6c5d-aaaa-4e3f-9a1b-2c3d4e5f6a7b","changes":[{"op":"add_widget","kind":"bar","width":"full","query":{"apps":["6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d"],"groupBy":"level"}}]}'

200: The plan. (DashboardPlan)

{
  "handle": "d9V2cXJ0eW1vZGVsZGFzaA",
  "expiresAt": "2026-10-08T12:15:00.000Z",
  "dashboardId": "8a7b6c5d-aaaa-4e3f-9a1b-2c3d4e5f6a7b",
  "summary": "Added the widget Events by level",
  "effects": [
    {
      "what": "widget Events by level",
      "action": "added",
      "before": null,
      "after": {
        "position": 1,
        "kind": "bar",
        "width": "full"
      }
    }
  ],
  "warnings": [],
  "confirm": false
}

Errors: 400 The body or the query did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key, or a key held to a page on a dashboard that shows other apps.; 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/dashboards/applyApply a plan

Makes the planned changes, all of them or none, if the dashboard has not changed since the plan.

Body

handlerequiredstringThe handle plan gave.
curl -X POST https://statoss.com/api/v1/dashboards/apply \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"handle":"d9V2cXJ0eW1vZGVsZGFzaA"}'

200: The dashboard after (null when removed), and what changed. (DashboardApplied)

Errors: 400 The body or the query 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.; 409 Something changed since, or it cannot be done as things stand.; 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.

Views

Saved views: a search and the filter bar kept under a name for the team, in Logs, Issues and Explore.

get/viewsList saved views

The team's saved views, by area then name. A key held to a page sees only its apps in each.

areaqueryOnly this area's; every area when left out.
curl https://statoss.com/api/v1/views \
  -H "Authorization: Bearer sk_..."

200: The views. (SavedViewList)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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/viewsSave a view

Saves a search and the filter bar under a name for the team; up to 100 in an area. A key held to a page names its apps in filters.apps.

Body

curl -X POST https://statoss.com/api/v1/views \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"area":"logs","name":"Checkout errors","query":"service:checkout level:>=error","filters":{"apps":["checkout-api"],"environment":"production"}}'

201: The view. (SavedView)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a token for someone who does not manage the team.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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/views/{viewId}Change a view

Any of name, query and filters; filters are replaced whole.

viewIdpathThe view id, from GET /views.

Body

curl -X PATCH https://statoss.com/api/v1/views/{viewId} \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Checkout 5xx"}'

200: The view after. (SavedView)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a token for someone who does not manage the team.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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/views/{viewId}Remove a view

Removes it for everyone on the team. Without "confirm": true in the body (or ?confirm=true) nothing changes and the answer says what it would do.

viewIdpathThe view id, from GET /views.
confirmquerytrue goes ahead; "confirm": true in the body does the same. Left out, the answer says what would happen and nothing changes.
curl -X DELETE https://statoss.com/api/v1/views/{viewId} \
  -H "Authorization: Bearer sk_..."

200: What it would do, without confirm. (SavedViewRemoval)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a token for someone who does not manage the team.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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.

Logs

Log lines of the key's apps: search, live tail, one line with the lines around it, volume, facets and patterns.

get/logsSearch logs

Lines of the key's apps that match q in the environment and range, newest first, a page at a time.

qqueryThe search (/docs/search) as Logs reads it, up to 2,000 characters: words and "phrases" in the body, /regex/, key:value for an attribute or a column (service:, env:, release:, source:, trace:, pattern:) with * at either end, key:[a, b], key:>500, key:/regex/, has:key, level:error or level:>=warn, -term or !key:value to leave out, a OR b.
appsqueryApps by id or slug, comma-separated, up to 50; every app the key reaches when left out.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back.
fromqueryThe start, ISO 8601 or milliseconds since 1970; with to, at most 31 days. from and to win over range.
toqueryThe end, ISO 8601 or milliseconds, not included; now when left out.
cursorqueryThe cursor the last page gave, for the next one.
limitquery
curl https://statoss.com/api/v1/logs \
  -H "Authorization: Bearer sk_..."

200: The lines. (LogList)

{
  "logs": [
    {
      "id": "1791460800123456789-3f2a9c41d0b7e655",
      "appId": "6e5d4c3b-7777-4b8a-9c0d-1e2f3a4b5c6d",
      "appSlug": "checkout-api",
      "time": "2026-10-08T12:00:00.123456789Z",
      "severity": 17,
      "level": "error",
      "levelLabel": "Error",
      "body": "POST /pay 502 upstream timed out after 30s",
      "service": "checkout",
      "environment": "production",
      "release": "[email protected]",
      "source": "otlp",
      "traceId": "4bf92f3577b34da6a3ce929d0e0e4736",
      "spanId": "00f067aa0ba902b7",
      "attributes": {
        "http.route": "/pay",
        "http.status_code": "502"
      },
      "pattern": "8423917740921178124"
    }
  ],
  "cursor": null
}

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 422 too_broad: ClickHouse stopped the search at its limits (8 seconds and the row caps). Narrow the range or the search.; 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.; 503 Logs could not be read just now; try again shortly.

get/logs/tailTail logs

Lines written after the token, in the order they were written, oldest first; without after, the newest 50 written in the last hour and a token. A line shows once it has been written for three seconds. Poll with the after each answer gives.

qqueryThe search (/docs/search) as Logs reads it, up to 2,000 characters: words and "phrases" in the body, /regex/, key:value for an attribute or a column (service:, env:, release:, source:, trace:, pattern:) with * at either end, key:[a, b], key:>500, key:/regex/, has:key, level:error or level:>=warn, -term or !key:value to leave out, a OR b.
appsqueryApps by id or slug, comma-separated, up to 50; every app the key reaches when left out.
environmentqueryAn environment's name; every one when left out.
afterqueryThe after the last call gave.
limitquery500 with after, 50 without, when left out.
curl https://statoss.com/api/v1/logs/tail \
  -H "Authorization: Bearer sk_..."

200: The lines and the token. (LogTail)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 422 too_broad: ClickHouse stopped the search at its limits (8 seconds and the row caps). Narrow the range or the search.; 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.; 503 Logs could not be read just now; try again shortly.

get/logs/{logId}A log line

The line, the 25 lines before and after it from its app and service, and the issues whose events carry its trace.

logIdpathThe line's id, as a list gives it.
appqueryThe line's app, by id or slug.
curl https://statoss.com/api/v1/logs/{logId} \
  -H "Authorization: Bearer sk_..."

200: The line. (LogDetail)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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.; 503 Logs could not be read just now; try again shortly.

get/logs/volumeLog volume

Lines per bucket by severity range, 60 to 120 buckets over the range widened to whole buckets. With no search, from the per-minute sums kept 400 days; with one, counted from the lines.

qqueryThe search (/docs/search) as Logs reads it, up to 2,000 characters: words and "phrases" in the body, /regex/, key:value for an attribute or a column (service:, env:, release:, source:, trace:, pattern:) with * at either end, key:[a, b], key:>500, key:/regex/, has:key, level:error or level:>=warn, -term or !key:value to leave out, a OR b.
appsqueryApps by id or slug, comma-separated, up to 50; every app the key reaches when left out.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back.
fromqueryThe start, ISO 8601 or milliseconds since 1970; with to, at most 31 days. from and to win over range.
toqueryThe end, ISO 8601 or milliseconds, not included; now when left out.
curl https://statoss.com/api/v1/logs/volume \
  -H "Authorization: Bearer sk_..."

200: The buckets. (LogVolume)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 422 too_broad: ClickHouse stopped the search at its limits (8 seconds and the row caps). Narrow the range or the search.; 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.; 503 Logs could not be read just now; try again shortly.

get/logs/facetsLog facets

Counts by level, service and environment, and the 20 commonest attribute keys with their 10 commonest values (counts approximate), over the newest minutes holding about 100,000 lines, or with a search over the whole range.

qqueryThe search (/docs/search) as Logs reads it, up to 2,000 characters: words and "phrases" in the body, /regex/, key:value for an attribute or a column (service:, env:, release:, source:, trace:, pattern:) with * at either end, key:[a, b], key:>500, key:/regex/, has:key, level:error or level:>=warn, -term or !key:value to leave out, a OR b.
appsqueryApps by id or slug, comma-separated, up to 50; every app the key reaches when left out.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back.
fromqueryThe start, ISO 8601 or milliseconds since 1970; with to, at most 31 days. from and to win over range.
toqueryThe end, ISO 8601 or milliseconds, not included; now when left out.
curl https://statoss.com/api/v1/logs/facets \
  -H "Authorization: Bearer sk_..."

200: The facets. (LogFacets)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 422 too_broad: ClickHouse stopped the search at its limits (8 seconds and the row caps). Narrow the range or the search.; 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.; 503 Logs could not be read just now; try again shortly.

get/logs/patternsLog patterns

The commonest patterns of the lines that match (numbers, ids, addresses and quoted strings masked as <*>), most lines first, each with its newest line, first and last seen and its level mix.

qqueryThe search (/docs/search) as Logs reads it, up to 2,000 characters: words and "phrases" in the body, /regex/, key:value for an attribute or a column (service:, env:, release:, source:, trace:, pattern:) with * at either end, key:[a, b], key:>500, key:/regex/, has:key, level:error or level:>=warn, -term or !key:value to leave out, a OR b.
appsqueryApps by id or slug, comma-separated, up to 50; every app the key reaches when left out.
environmentqueryAn environment's name; every one when left out.
rangequeryHow far back.
fromqueryThe start, ISO 8601 or milliseconds since 1970; with to, at most 31 days. from and to win over range.
toqueryThe end, ISO 8601 or milliseconds, not included; now when left out.
limitquery
curl https://statoss.com/api/v1/logs/patterns \
  -H "Authorization: Bearer sk_..."

200: The patterns. (LogPatternList)

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 422 too_broad: ClickHouse stopped the search at its limits (8 seconds and the row caps). Narrow the range or the search.; 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.; 503 Logs could not be read just now; try again shortly.

Log alerts

An app's log alert rules: a search and a condition over a window that opens an on-call alert.

get/apps/{app}/log-alertsList an app's log alerts

Its log alert rules on pages the key reaches, newest first. Log alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
limitqueryHow many, from 1 to 100.
cursorqueryThe cursor the last page gave, for the next one.
curl https://statoss.com/api/v1/apps/APP/log-alerts \
  -H "Authorization: Bearer sk_..."

200: The rules.

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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/apps/{app}/log-alertsMake a log alert

What the body leaves out takes the default rule's: at least 10 lines in 5 minutes, firing at once and resolving after 5 quiet minutes, to the page's destinations, paging nobody. At most 20 rules per app. Log alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.

Body

namestringThe rule's name, up to 80 characters.
pageIdstringThe page whose on-call takes its alerts. A new rule takes the app's page unless given.
enabledbooleanOff keeps the rule without checking it.
querystringThe lines it counts: the Logs search; empty for every line.
kindstring (match, fewer, absent)match: at least threshold lines in the window; fewer: fewer than threshold; absent: no line at all.
thresholdintegerLines; not for absent.
windowMinutesintegerThe window the lines are counted over.
confirmMinutesintegerHow long the condition holds before it fires; 0 is at once.
recoverMinutesintegerHow long it is false before the alert resolves; 0 is at once.
environmentsstring[]
ownRoutingbooleantrue sends to destinationIds and memberIds; false to where the page's alerts go.
repeatMinutesinteger (0, 1, 2, 5, 10, 15, 30, 60)Minutes between repeats while triggered; 0 for none.
groupMinutesinteger (0, 2, 5, 10, 30)Minutes in which later alerts join the first; 0 is off.
destinationIdsstring[]
memberIdsstring[]
pagingstringWho is paged: "page" (the page's escalation policy), "none", or the id of one of the team's policies. Escalation is on Pro.
curl -X POST https://statoss.com/api/v1/apps/APP/log-alerts \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"Checkout 5xx","query":"service:checkout http.status_code:>=500","threshold":20,"windowMinutes":5,"environments":["production"]}'

201: The rule.

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a token for someone who does not manage the team.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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/apps/{app}/log-alerts/{ruleId}One log alert

Log alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
ruleIdpathThe rule id, from the list of rules.
curl https://statoss.com/api/v1/apps/APP/log-alerts/RULE_ID \
  -H "Authorization: Bearer sk_..."

200: The rule.

Errors: 401 No key, or a key that is not valid.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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/apps/{app}/log-alerts/{ruleId}Change a log alert

What the body leaves out stays. Its condition starts over; turning it off resolves its alert. Log alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
ruleIdpathThe rule id, from the list of rules.

Body

namestringThe rule's name, up to 80 characters.
pageIdstringThe page whose on-call takes its alerts. A new rule takes the app's page unless given.
enabledbooleanOff keeps the rule without checking it.
querystringThe lines it counts: the Logs search; empty for every line.
kindstring (match, fewer, absent)match: at least threshold lines in the window; fewer: fewer than threshold; absent: no line at all.
thresholdintegerLines; not for absent.
windowMinutesintegerThe window the lines are counted over.
confirmMinutesintegerHow long the condition holds before it fires; 0 is at once.
recoverMinutesintegerHow long it is false before the alert resolves; 0 is at once.
environmentsstring[]
ownRoutingbooleantrue sends to destinationIds and memberIds; false to where the page's alerts go.
repeatMinutesinteger (0, 1, 2, 5, 10, 15, 30, 60)Minutes between repeats while triggered; 0 for none.
groupMinutesinteger (0, 2, 5, 10, 30)Minutes in which later alerts join the first; 0 is off.
destinationIdsstring[]
memberIdsstring[]
pagingstringWho is paged: "page" (the page's escalation policy), "none", or the id of one of the team's policies. Escalation is on Pro.
curl -X PATCH https://statoss.com/api/v1/apps/APP/log-alerts/RULE_ID \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'

200: The rule after.

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a token for someone who does not manage the team.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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/apps/{app}/log-alerts/{ruleId}Remove a log alert

Resolves its open alert. Without confirm, answers with what it would do. Log alerts are on-call alerts: without on-call (Hobby and Pro) these paths answer 404.

apppathThe app's id or slug, from GET /apps.
ruleIdpathThe rule id, from the list of rules.
confirmquerytrue goes ahead; "confirm": true in the body does the same. Left out, the answer says what would happen and nothing changes.
curl -X DELETE https://statoss.com/api/v1/apps/APP/log-alerts/RULE_ID \
  -H "Authorization: Bearer sk_..."

200: Without confirm: what it would do.

Errors: 400 The query or body did not pass validation.; 401 No key, or a key that is not valid.; 403 A read-only key on a write route, or a token for someone who does not manage the team.; 404 Nothing by that id that this key reaches, or the team has no logs.; 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.

On call

Who is on call now, by schedule and by escalation policy level, and a page's alerts.

get/pages/{pageId}/alertsList a page's alerts

Its open alerts, triggered before acknowledged, or with status=resolved the last 100 resolved. Alerts that joined another's group are shown under it. Without on-call, a 404.

pageIdpathThe page id, from GET /pages.
statusqueryopen, or resolved for the last 100.
curl https://statoss.com/api/v1/pages/PAGE_ID/alerts \
  -H "Authorization: Bearer sk_..."

200: The alerts.

{
  "alerts": [
    {
      "id": "9d1c2b3a-0000-4b8a-9c0d-1e2f3a4b5c6d",
      "pageId": "6e5d4c3b-1111-4b8a-9c0d-1e2f3a4b5c6d",
      "number": 12,
      "status": "triggered",
      "severity": "critical",
      "summary": "Checkout is down",
      "affected": "checkout-api",
      "from": "Checkout API",
      "count": 1,
      "createdAt": "2026-10-08T09:30:00.000Z",
      "acknowledgedAt": null,
      "acknowledgedBy": null,
      "resolvedAt": null,
      "resolvedBy": null,
      "acknowledgedUntil": null,
      "snoozed": false,
      "heldByMaintenance": false,
      "groupedInto": null,
      "grouped": 0,
      "url": "https://statoss.com/app/6e5d4c3b-1111-4b8a-9c0d-1e2f3a4b5c6d/alerts/9d1c2b3a-0000-4b8a-9c0d-1e2f3a4b5c6d"
    }
  ]
}

Errors: 400 The body or the query did not pass validation.; 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.

get/pages/{pageId}/alerts/{alertId}One alert

The alert with what its sender said and its timeline. Without on-call, a 404.

pageIdpathThe page id, from GET /pages.
alertIdpathThe alert id, from the list of alerts.
curl https://statoss.com/api/v1/pages/PAGE_ID/alerts/ALERT_ID \
  -H "Authorization: Bearer sk_..."

200: The alert.

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}/alerts/{alertId}/{action}Acknowledge, unacknowledge, resolve or snooze an alert

Needs a write key. snooze needs minutes, a whole number from 1 to 10080: nobody is paged or reminded until they run out, when the alert is triggered again if still open. A 409 when the alert is past that already. Without on-call, a 404.

pageIdpathThe page id, from GET /pages.
alertIdpathThe alert id, from the list of alerts.
actionpathWhat to do.

Body

notestringAdded to the alert's timeline.
minutesintegersnooze: how long, from 1 to 10080.
curl -X POST https://statoss.com/api/v1/pages/PAGE_ID/alerts/ALERT_ID/{action} \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{"note":"Looking into it."}'

200: The alert after.

Errors: 400 The body or the query 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.; 409 Something changed since, or it cannot be done as things stand.; 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}/on-callWho is on call

Each of the team's schedules with whoever is on call now and until when, and each policy that pages for the page (its own, and those its sources page through), level by level, with who it would page now. Schedules and policies are on Pro; elsewhere both lists are empty. Without on-call, a 404.

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

200: Who is on call. (OnCall)

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.

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.
accentstring, or nullThe accent colour as #rrggbb, for links and buttons.
themestring (auto, light, dark)auto follows the visitor's system; light or dark fixes it.
noindexbooleanWhether search engines are asked to leave the page out.
rangestring (24h, 7d, 90d, 1y)The range the page opens on.
poweredBybooleanWhether the footer says "Powered by StatOSS". Only Pro can leave it out; on other plans it is shown whatever this says.
foldGroupsbooleanWhether the page shows its groups folded.
vendorsCountbooleanWhether components that follow a vendor count in the headline status.
logoUrlstring, or nullWhere the logo is served, or null when there is none.
faviconUrlstring, or nullWhere the favicon is served, or null when there is none.
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.

Domain

domainstring, or nullThe hostname, or null when the page has none.
verifiedbooleanWhether the page counts the domain as pointing here.
statusstring (none, waiting, validating, live, problem)none, waiting (for DNS or the TXT record), validating (the certificate), live or problem.
livebooleanWhether the domain serves the page over HTTPS.
problemstring, or nullFor status problem: the edge's own words.
messagestringWhere it stands, in a sentence.
registerFailedbooleanThe edge would not register the hostname yet; checking again tries again.
servedbooleanWhether the plan serves the domain. After a move off Pro it is kept and not served.
ownedbooleanWhether the page has shown the domain is its own: its TXT record was seen. Until then nothing is registered at the edge or served, whatever DNS says.
missingstring (dns, txt)[]The records the last check did not find: dns is the CNAME or the address records, txt is the TXT record.
recordsDnsRecord[]The records to add at the domain's DNS provider, two of them: a subdomain gets a CNAME to the edge host, and a bare domain a CNAME at Cloudflare and A and AAAA records elsewhere; and a TXT record named _statoss under the hostname (_statoss.status for status.example.com, _statoss for a bare domain) with the value statoss-verify= and the page's token, which shows the domain is the page's. Both are needed, in either order.
dnsProviderstring, or nullWhere the domain's DNS lives, when it could be told.

Access

pageIdstringThe page.
modestring (public, password, private)public, password or private.
privatebooleanOnly the people and email domains allowed open the page.
passwordProtectedbooleanA shared password is set. It is never shown.
viewerDomainsstring[]Private page: email domains whose addresses may open it.
viewerNetworksstring[], or nullPrivate page, Enterprise: networks that open it without signing in. Null on other plans.
viewersobject[]The people on a private page's list. Only in the answer to a key that can write; a read key gets the rest without it.
allowedobjectprivate: The plan has private pages. password: The plan has password protection. networks: The team has Enterprise, which allows networks.

App

idstringThe app id.
namestringThe app's name.
slugstringUnique in the team. Works wherever an app id does.
numintegerThe number in its DSN.
platformstring, or nullWhat the setup snippet is written for, such as node or python.
pageIdstring, or nullThe status page it shows on, if any.
errorsShareintegerThe percent of the team's monthly errors the app may use; past it intake refuses the app's errors until the month turns.
createdAtstringISO 8601, UTC.

AppDetail

idstringThe app id.
namestringThe app's name.
slugstringUnique in the team. Works wherever an app id does.
numintegerThe number in its DSN.
platformstring, or nullWhat the setup snippet is written for.
pageIdstring, or nullThe status page it shows on, if any.
errorsShareintegerThe percent of the team's monthly errors the app may use; past it intake refuses the app's errors until the month turns. 50 unless set.
createdAtstringISO 8601, UTC.
dsnstring, or nullThe DSN of its oldest live key. Only for a key with write access; null for a read key.
firstEventAtstring, or nullISO 8601, UTC.
lastEventAtstring, or nullISO 8601, UTC.

AppKey

keystring, or null32 hex characters, the public part of the DSN. Revoking takes it. Only for a key with write access; null for a read key.
labelstringWhat it is for.
dsnstring, or nullThe DSN an SDK is given. Only for a key with write access; null for a read key.
allowedWebsitesstring[]The websites the key may be used from: host names, with a leading *. for the sites below one. Empty allows any website. Intake refuses a request whose Origin or Referer names another host; a request with neither header is taken.
ratePerMinuteintegerEvents a minute the key may send before intake answers 429.
createdAtstringISO 8601, UTC.
revokedAtstring, or nullISO 8601, UTC.

AppSchema

appApp
versionintegerCounts the app's changes; a plan made before a later one is refused.
levelsSchemaLevel[]
categoriesSchemaCategory[]
fieldsSchemaField[]
rulesSchemaRule[]

SchemaPlan

handlestring, or nullGive it to apply, with the same key. Null when there is no change to apply.
expiresAtstring, or nullWhen the handle stops working; null without a handle.
versionintegerThe schema's version the plan was made against.
summarystringWhat the changes do, in words.
effectsSchemaEffect[]
warningsstring[]
confirmbooleanA merge or a remove: an agent asks its person before applying.
changesSchemaChangeInput[]Only with desired: the changes the server worked out from it, empty for none.

SchemaChange

idstringThe change id. Undo takes it.
atstringISO 8601, UTC.
actorstringWho: a person's email or an API key.
viastring (dashboard, api, mcp)How.
summarystringWhat it did, in words.
undoOfstring, or nullThe change this one undid.

AlertRule

idstringThe rule id.
appIdstringThe app it watches.
namestringThe rule's name, up to 80 characters.
pageIdstringThe page whose on-call takes its alerts. A new rule takes the app's page unless given.
enabledbooleanOff keeps the rule without alerting.
onNewbooleanAlerts on a new issue.
onRegressedbooleanAlerts on a regression.
onEscalatingbooleanAlerts when an issue escalates: an hour with at least 50 events and ten times its hourly average over the week before.
eventCountintegerAlerts when an issue takes so many events in eventMinutes; 0 is off.
eventMinutesinteger (1, 5, 15, 60, 1440)The minutes eventCount is counted over.
minPrioritystring (high, medium, low)The issue's priority at least this; low takes any.
minLevelstring (debug, info, warning, error, fatal), or nullThe event's level at least this; null for any.
environmentsstring[]Up to 10 environments an event must be in; empty for any.
releasestring, or nullThe release an event must name; ending in * matches the start. Null for any.
tagsobject[]Up to 5 tags an event must all have. Also taken as an object of key and value.
categoriesstring[]Up to 20 category keys, one of which the issue's category reads as through the app's schema; empty for any.
throttlestring (release, 30, 60, 1440, 10080)How often one issue may alert: release (once per release and once per regression, once a day without a release), or at most every 30, 60, 1440 or 10080 minutes.
ownRoutingbooleantrue sends to destinationIds and memberIds; false to where the page's alerts go.
repeatMinutesinteger (0, 1, 2, 5, 10, 15, 30, 60)Minutes between repeats while triggered; 0 for none.
groupMinutesinteger (0, 2, 5, 10, 30)Minutes in which later alerts join the first; 0 is off.
destinationIdsstring[]With ownRouting: the team's alert destinations.
memberIdsstring[]With ownRouting: people in the team to notify.
pagingstringWho is paged: "page" (the page's escalation policy), "none", or the id of one of the team's policies. Escalation is on Pro; elsewhere it is kept as it was.
summarystringWhat it alerts on and how often, in words.
createdAtstringISO 8601, UTC.
lastFiredAtstring, or nullISO 8601, UTC.

Dashboard

idstringThe dashboard id.
namestringIts name.
createdAtstringISO 8601, UTC.
updatedAtstringISO 8601, UTC.
widgetsWidget[]
rangestring (1h, 24h, 7d, 14d, 30d, 90d)With data: the range read.
environmentstring, or nullWith data: the environment read, or null.
fromstringISO 8601, UTC.
tostringISO 8601, UTC.

Widget

idstringThe widget id.
positionintegerIts place on the dashboard, from 0.
kindstring (bar, line, number, table, text, stream)bar or line: over time, one series per group; number: the total; table: the top ten groups; text: words the team writes.
titlestringIts title; empty for the name its query gives it.
widthstring (half, full)Half or full width.
queryWidgetQuery, or nullapps: App ids; none means every app the key reaches. measure: What it counts. groupBy: What it groups by. field: The field to group by, for groupBy field. levels: Levels to keep, by key or label; none for all. categories: Categories to keep, by key or label; none for all. fields: text: Words in the title, culprit or message. search: The search (/docs/search): for events and users as Explore reads it, up to 200 characters; for log lines (measure logs) and log streams as Logs reads it, field then an attribute's key.
bodystring, or nulltext widgets: the text, up to 2,000 characters.
shownTitlestringIts title, or the name its query gives it.
createdAtstringISO 8601, UTC.
updatedAtstringISO 8601, UTC.
dataWidgetData, or nullOnly with ?data=1: its numbers over the range; null for a text widget or when they could not be read.from: ISO 8601, UTC. to: ISO 8601, UTC. bucketMs: Each point's span, in milliseconds. total: Events, or users summed across apps. groups: How many groups there were before the largest were kept. series: rows:
dataErrorstring, or nullOnly with ?data=1: why data is null, such as that the numbers could not be read; null otherwise.

WidgetQuery

appsstring[]App ids; none means every app the key reaches.
measurestring (events, users, logs)What it counts.
groupBystring (none, level, category, environment, release, field, issue, service)What it groups by.
fieldstring, or nullThe field to group by, for groupBy field.
levelsstring[]Levels to keep, by key or label; none for all.
categoriesstring[]Categories to keep, by key or label; none for all.
fieldsobject[]
textstringWords in the title, culprit or message.
searchstringThe search (/docs/search): for events and users as Explore reads it, up to 200 characters; for log lines (measure logs) and log streams as Logs reads it, field then an attribute's key.

WidgetData

fromstringISO 8601, UTC.
tostringISO 8601, UTC.
bucketMsintegerEach point's span, in milliseconds.
totalintegerEvents, or users summed across apps.
groupsintegerHow many groups there were before the largest were kept.
seriesobject[]
rowsobject[]

DashboardPlan

handlestringGive it to apply, with the same key, within 15 minutes.
expiresAtstringISO 8601, UTC.
dashboardIdstring, or nullThe dashboard; null when the plan makes one.
summarystringWhat the changes do, in words.
effectsDashboardEffect[]
warningsstring[]
confirmbooleanA removal: an agent asks its person before applying.

Issue

idstringThe issue id.
shortIdstringThe app's slug upper-cased and a number: WEB-12.
appobjectid: The app id. name: The app's name. slug: The app's slug.
titlestringThe exception's type and value, or the message.
culpritstringWhere it happened: a function and file, or a transaction.
typestring (error, default)error for an exception, default for a message.
platformstringAs the SDK sent it, such as node or javascript.
levelobjectkey: The level it reads as, merges followed. label: The name shown. color: A colour by name.
categoryobject, or nullkey: The category it reads as, merges followed. label: The name shown. color: A colour by name.
statusstring (unresolved, resolved, archived)Where it stands.
substatusstring (new, ongoing, regressed), or nullWhy it is unresolved; null when it is not.
prioritystring (high, medium, low)Set by its level until someone sets it.
assigneeobject, or nullid: The person's id. name: Their name. email: Their email.
firstSeenstringISO 8601, UTC.
lastSeenstringISO 8601, UTC.
firstReleasestring, or nullThe release its first event named.
lastReleasestring, or nullThe release its latest event named.
timesSeenintegerEvents counted since it was made.
countsobject, or nullevents: Events in the environment and range asked. users: Users they reached, as far as events say.
resolvedAtstring, or nullISO 8601, UTC.
resolvedInReleasestring, or nullThe release that resolved it.
archivedUntilstring, or nullISO 8601, UTC.
resolveInNextReleaseobject, or nullafter: The app's newest release when asked; null when it had none. since: ISO 8601, UTC.
reviewedbooleanTaken off the For review tab.
urlstringThe issue in the dashboard.

EventRow

idstringThe event id, 32 hex digits.
timestampstringISO 8601, UTC.
appobjectid: The app id. name: The app's name. slug: The app's slug.
issueobject, or nullid: The issue id. shortId: Such as WEB-12.
levelobjectkey: The level it reads as, merges followed. label: The name shown. color: A colour by name.
categoryobject, or nullkey: The category it reads as, merges followed. label: The name shown. color: A colour by name.
titlestringThe exception's type and value, or the message.
culpritstringWhere it happened.
environmentstring, or nullAs sent.
releasestring, or nullAs sent.

Release

idstringThe release id.
appobjectid: The app id. name: The app's name. slug: The app's slug.
versionstringAs events and sentry-cli name it.
firstSeenstring, or nullISO 8601, UTC.
lastSeenstring, or nullISO 8601, UTC.
eventsintegerEvents that named it.
releasedAtstring, or nullISO 8601, UTC.
createdAtstringISO 8601, UTC.
newIssuesintegerIssues its events brought.
regressionsintegerIssues it brought back.
resolvedintegerIssues it resolved, from resolve in the next release.

SourceMapBundle

idstringThe bundle id.
checksumstringThe sha1 of its zip.
releasestring, or nullThe release it was uploaded for.
diststring, or nullThe dist it was uploaded for.
mapsintegerSource maps stored from it.
debugIdsstring[]
sizeintegerBytes of the zip.
createdAtstringISO 8601, UTC.

Alert

idstringThe alert id.
pageIdstringThe page it is on.
numberintegerCounts up per page: #12 in the dashboard.
statusstring (triggered, acknowledged, resolved)triggered, acknowledged or resolved.
severitystring (critical, error, warning, info)critical, error, warning or info.
summarystringWhat the sender says happened.
affectedstring, or nullWhat the sender says is affected.
fromstringThe source's name, or the monitor's for an outage.
countintegerHow many times it came in.
createdAtstringISO 8601, UTC.
acknowledgedAtstring, or nullISO 8601, UTC.
acknowledgedBystring, or nullWho acknowledged it.
resolvedAtstring, or nullISO 8601, UTC.
resolvedBystring, or nullWho or what resolved it.
acknowledgedUntilstring, or nullWhen the acknowledgement or snooze runs out and it is triggered again; null for good.
snoozedbooleantrue when acknowledgedUntil is a snooze.
heldByMaintenancebooleanWaiting for a maintenance window over the whole page to end.
groupedIntostring, or nullThe alert it joined, when it is in a group.
groupedintegerHow many open alerts joined it.
urlstringThe alert in the dashboard.

AlertDetail

idstringThe alert id.
pageIdstringThe page it is on.
numberintegerCounts up per page: #12 in the dashboard.
statusstring (triggered, acknowledged, resolved)triggered, acknowledged or resolved.
severitystring (critical, error, warning, info)critical, error, warning or info.
summarystringWhat the sender says happened.
affectedstring, or nullWhat the sender says is affected.
fromstringThe source's name, or the monitor's for an outage.
countintegerHow many times it came in.
createdAtstringISO 8601, UTC.
acknowledgedAtstring, or nullISO 8601, UTC.
acknowledgedBystring, or nullWho acknowledged it.
resolvedAtstring, or nullISO 8601, UTC.
resolvedBystring, or nullWho or what resolved it.
acknowledgedUntilstring, or nullWhen the acknowledgement or snooze runs out and it is triggered again; null for good.
snoozedbooleantrue when acknowledgedUntil is a snooze.
heldByMaintenancebooleanWaiting for a maintenance window over the whole page to end.
groupedIntostring, or nullThe alert it joined, when it is in a group.
groupedintegerHow many open alerts joined it.
urlstringThe alert in the dashboard.
dedupKeystringWhat later events name it by while it is open.
viastring (pagerduty, pagerduty-v1, opsgenie, sentry, monitor, issue, log)Which way it came in.
detailsobjectdescription: The sender's description. fields: The sender's details, each a list of a name and its value. links: tags: The sender's tags.
timelineobject[]

OnCall

pageIdstringThe page.
atstringISO 8601, UTC.
schedulesobject[]
policiesobject[]

AlertDestination

idstringThe destination id.
kindstring (email, slack, discord, webhook, pagerduty, opsgenie, ntfy, telegram, pushover, teams)What kind of destination it is.
namestringHow the dashboard names it: an address, a channel, a host, or the last four characters of a key.
targetstring, or nullAn email address. Other kinds: where it points, only for a key that writes; null for a read key and for a Slack channel that was connected.
secretstring, or nullA webhook's signing secret or an ntfy token, only for a key that writes. A bot's or an application's token is never shown.
eubooleanOpsgenie: the EU region.
emergencybooleanPushover: down alerts repeat until acknowledged.
confirmedbooleanfalse: an email address waits for the link mailed to it and gets no alerts until it is opened.
availablebooleanfalse: a plan without chat alerts keeps the destination and does not use it.
pageIdsstring[]The pages that send alerts here.
createdAtstringISO 8601, UTC.

AlertSettings

pageIdstringThe page.
alertsEnabledbooleanfalse: the page still shows every outage and nobody is told.
alertOwnerEmailbooleanWhether the account's own address gets the alerts.
repeatAlertMinutesintegerMinutes between repeats of the down alert while down; 0 for none.
monthlyReportbooleanWhether the owner gets the monthly uptime report.
destinationIdsstring[]The account's destinations the page sends to, at most 20.
destinationsobject[]
memberIdsstring[]People on the team (user ids) whose addresses also get the alerts.
escalationPolicyIdstring, or nullThe on-call escalation policy that pages for the page.
ackTimeoutMinutesinteger (0, 30, 60, 240, 480, 1440)How long an acknowledgement lasts before the alert pages again; 0 is until resolved.
subscriberOutageMinutesintegerMinutes an automatic incident is open before subscribers are told; -1 is never.

Subscriber

idstringThe subscriber id.
pageIdstringThe page.
kindstring (email, webhook, slack, discord, teams)How they are told.
targetstringAn address; a webhook's host, as its URL is a secret; a channel's name.
confirmedbooleanfalse: an email address that has not opened its link is not subscribed and gets nothing.
confirmedAtstring, or nullISO 8601, UTC.
monitorIdsstring[], or nullThe monitors they follow; null is the whole page.
secretstring, or nullA webhook's signing secret, only for a key that writes; null otherwise.
createdAtstringISO 8601, UTC.

Team

teamobjectid: The team id, which is its owner's user id. name: The team's name. ownerEmail: The owner's address. open: false: the team's plan has no team, so its other people cannot open it. requireTwoFactor: Whether people need two-factor sign-in. seats:
membersTeamMember[]
invitationsTeamInvitation[]

ApiKey

idstringThe key id.
namestringThe name given at creation.
prefixstringThe first characters of the key, to tell keys apart.
accessstring (read, write)read, or write for read and write.
pageIdstring, or nullThe one page the key reaches, or null for every page.
madeBystring, or nullThe name of the connected app whose token made the key, or null for a key made in the dashboard or by another key. The key is deleted when the app is disconnected or its access revoked.
createdAtstringISO 8601, UTC.
lastUsedAtstring, or nullISO 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, forbidden, not_found, bad_request, conflict, plan_limit, too_broad, rate_limited, suspended, out_of_reach, internal, unavailable. message: What went wrong, in words.