Skip to content
ScaledPapers

Account

Status Pages API

The Status Pages API is at https://api.scaledpapers.com. Authenticate with the same key you use for the Checks API: Authorization: Bearer sp_…. Creating and revoking keys still happens in API Keys.

Every request acts as the account that owns the key — you can only see and change your own status pages.

Create a status page

curl https://api.scaledpapers.com/v1/sites \
  -H "Authorization: Bearer sp_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme",
    "slug": "acme",
    "url": "https://acme.com"
  }'
  • name and slug are required. Slug is lowercase letters, numbers, and hyphens (2-40 chars) and cannot change later.
  • url is optional — it creates a website component for the page.
  • The page is live at https://acme.status.scaledpapers.com.
  • A taken slug returns 409 with {"detail":"That slug is taken"}.

List and read pages

curl https://api.scaledpapers.com/v1/sites \
  -H "Authorization: Bearer sp_…"

Each row includes slug, name, and the worst open incident status. GET /v1/sites/{slug} returns the full bundle: components, groups, incidents, uptime payload, and Slack connection state.

Delete a page

DELETE /v1/sites/{slug} removes the public page, its components, incidents, and the owner Slack connection. This cannot be undone.

Add a component

curl https://api.scaledpapers.com/v1/sites/acme/components \
  -H "Authorization: Bearer sp_…" \
  -H "Content-Type: application/json" \
  -d '{"name": "Payments API", "url": "https://api.acme.com"}'

Components are the services shown on the public page — they are not checks. Rename with PATCH /v1/sites/{slug}/components/{id}; delete with DELETE.

Use the Checks API: send site_id, site_slug, and component_id together on PATCH /v1/endpoints/{id}. alert_incident_enabled opens an incident when the check is down; display_metrics shows latency on the public page. A component can be linked to only one check.

Create an incident

curl https://api.scaledpapers.com/v1/sites/acme/incidents \
  -H "Authorization: Bearer sp_…" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Payments API errors",
    "body": "We are looking into the issue.",
    "status": "investigating",
    "impact": "major",
    "component_ids": ["m3vnq6ytahvq"]
  }'
  • title and body are required. component_ids is optional: it takes component public ids — the same 12-character ids as in console component URLs (/app/{slug}/components/{id}) — internal integer ids also work. Omit it for a site-wide incident with no affected components.
  • status: investigating, identified, monitoring, resolved. impact: minor, major, critical.
  • Backfill a past incident with opened_at + resolved_at (status is forced to resolved).
  • Email subscribers and Slack notifications fire exactly as they do from the console. A site-wide incident notifies only visitors subscribed to all components; a component incident also notifies subscribers watching that component.

Post an update

curl https://api.scaledpapers.com/v1/sites/acme/incidents/{public_id}/updates \
  -H "Authorization: Bearer sp_…" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "identified",
    "body": "Root cause found, deploying a fix."
  }'

{public_id} is the 12-character id from the incident (incidents/{id} on the public page). Status resolved closes the incident. Resolving from the Checks API (a linked check recovering) posts the same update shape.

The response is 201 with the full incident: status is the new current status, updates lists all updates newest-first (the first entry is the one you just posted), and resolved_at stays null until a resolved update sets it. Subscribers and Slack are notified before the response returns.

What is not on the API yet

Component groups, Slack integration connect, and visitor subscriber management stay console-only for now.