← StillOnline

Documentation

REST API

HTTP API for status reads and project management. For Cursor and AI editors, use MCP separately.

See also: MCP setup

Public API

Read an open status page without authentication. Private pages return 404.

GET/v1/public/status/{slug}no auth

Public status JSON

Read the current status of a public status page — no API key. Use the page slug or project id from the dashboard URL.

Parameters

  • slug (path) · requiredStatus page slug or project id (cuid).

Responses

  • 200Overall status, components, 7-day uptime, optional open incident.
  • 404Page not found or visibility is private.
  • 429Rate limit: 60 requests per minute per IP (Retry-After header).
example
{
  "slug": "demo",
  "status": "operational",
  "updated_at": "2026-05-27T12:00:00.000Z",
  "components": [
    {
      "name": "Website",
      "url": "https://example.com",
      "status": "operational",
      "uptime_7d": 99.9
    }
  ],
  "active_incident": null
}

status / component status: "operational" | "degraded" | "down" | "probe_limited" | "unknown". Response is cached ~60s (Cache-Control).

HTTP
GET https://api.stillonline.tech/v1/public/status/{slug}

Private REST API

Pro or Ultimate plan. Create an API key in the dashboard.

HTTP
Authorization: Bearer sk_live_…
Base: https://api.stillonline.tech/v1

Errors: 401 — invalid or revoked key, or Free without API; 403 — plan limit (body code PLAN_LIMIT_*); 400 — invalid JSON; 429 — too many requests (code RATE_LIMIT, Retry-After header).

Rate limits (private API)

Counted per API key, 60-second window. Public GET /v1/public/status/{slug} — 60 requests/min per IP (no key).

  • Reads (GET): 120 requests/min per key
  • Writes (POST, PATCH, DELETE): 30 requests/min per key
  • GET /v1/health — no key, not counted against your key

Pause a single URL check

To stop monitoring one URL while other checks in the project keep running, call PATCH /v1/checks/{id} with {"enabled": false}. The dashboard shows a Paused badge on that row; resume via API only (enabled: true). Project Play/Pause controls apply to every check at once.

  • Probes for that URL stop; last_probed_at no longer updates.
  • last_status may still show OPERATIONAL — the last result before pause, not live status.
  • Check id: GET /v1/projects/{project_id}/checks or the project page in the dashboard.
curl (Linux / macOS)
# Pause one check (replace CHECK_ID and your key)
curl -sS -X PATCH https://api.stillonline.tech/v1/checks/CHECK_ID \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'

Windows (PowerShell) examples

On PowerShell, curl.exe -d '{"enabled":false}' often sends malformed JSON (Invalid JSON). Cyrillic in Invoke-RestMethod -Body without UTF-8 bytes may become "???????" — use the helper below.

PowerShell
$uri = "https://api.stillonline.tech/v1/checks/CHECK_ID"
$headers = @{ Authorization = "Bearer sk_live_…" }

# UTF-8 JSON body (Cyrillic-safe on Windows)
function Invoke-StillOnlineJson($Method, $Uri, $Headers, $JsonObject) {
  $utf8 = New-Object System.Text.UTF8Encoding $false
  $json = $JsonObject | ConvertTo-Json -Compress
  $bytes = $utf8.GetBytes($json)
  Invoke-RestMethod -Method $Method -Uri $Uri -Headers $Headers `
    -ContentType "application/json; charset=utf-8" -Body $bytes
}

# Pause / resume
Invoke-StillOnlineJson PATCH $uri $headers @{ enabled = $false }
Invoke-StillOnlineJson PATCH $uri $headers @{ enabled = $true }

# Rename (Cyrillic)
Invoke-StillOnlineJson PATCH $uri $headers @{ name = "Главная" }

# List checks
(Invoke-RestMethod -Uri "https://api.stillonline.tech/v1/projects/PROJECT_ID/checks" -Headers $headers).checks |
  Select-Object name, enabled, last_probed_at

The dashboard and browser are always UTF-8. Linux/macOS curl with -d and a UTF-8 terminal is fine. The API accepts charset=utf-8 and UTF-16 (BOM) request bodies.

GET/v1/healthno auth

API health

Lightweight liveness check for monitors and deploy smoke tests.

Responses

  • 200Service is up. No API key; not subject to per-key private limits.
example
{
  "status": "ok",
  "service": "stillonline-api",
  "version": "v1"
}
HTTP
GET https://api.stillonline.tech/v1/health
GET/v1/projectsBearer sk_live_…

List projects

Returns all non-deleted projects for the API key owner, newest first.

Responses

  • 200Array of projects with status_page_id.
  • 401Missing or invalid Bearer key.
  • 429RATE_LIMIT — over 120 GET requests/min per API key (Retry-After).
example
{
  "projects": [
    {
      "id": "clx…",
      "name": "Acme",
      "description": null,
      "slug": "acme",
      "timezone": "UTC",
      "status_page_id": "clx…",
      "created_at": "2026-05-27T10:00:00.000Z"
    }
  ]
}
HTTP
GET https://api.stillonline.tech/v1/projects
POST/v1/projectsBearer sk_live_…

Create project

Creates a project, status page, and the first HTTP check in one request.

Request body

JSON body. name and url are required.

JSON
{
  "name": "Acme API",
  "url": "https://api.example.com/health",
  "description": "Optional note"
}

Responses

  • 201Created project object.
  • 400Invalid JSON or missing name/url.
  • 403Plan limit (code PLAN_LIMIT_PROJECTS) or Free tier without API access.
  • 401Unauthorized.
HTTP
POST https://api.stillonline.tech/v1/projects
DELETE/v1/projects/{id}Bearer sk_live_…

Delete project

Soft-deletes a project (removed from dashboard; checks disabled). Public status URL may still show last known state.

Parameters

  • id (path) · requiredProject id.

Responses

  • 200Deleted.
  • 404Project not found.
  • 401Unauthorized.
  • 429RATE_LIMIT — write bucket (Retry-After).
example
{ "deleted": true, "project_id": "clx…" }
HTTP
DELETE https://api.stillonline.tech/v1/projects/{id}
GET/v1/projects/{id}/checksBearer sk_live_…

List checks

All uptime checks for a project you own.

Parameters

  • id (path) · requiredProject id.

Responses

  • 200Array of checks.
  • 404Project not found.
  • 401Unauthorized.
example
{
  "checks": [
    {
      "id": "clx…",
      "project_id": "clx…",
      "name": "API",
      "url": "https://api.example.com/health",
      "method": "GET",
      "interval_seconds": 300,
      "enabled": true,
      "last_status": "OPERATIONAL",
      "last_probed_at": "2026-05-27T12:00:00.000Z"
    }
  ]
}
HTTP
GET https://api.stillonline.tech/v1/projects/{id}/checks
POST/v1/projects/{id}/checksBearer sk_live_…

Create check

Adds an HTTP check to a project. interval_seconds must match your plan (Pro/Ultimate).

Parameters

  • id (path) · requiredProject id.

Request body

url required; name defaults to url; interval_seconds optional.

JSON
{
  "name": "API",
  "url": "https://api.example.com/health",
  "interval_seconds": 300
}

Responses

  • 201Created check.
  • 403PLAN_LIMIT_CHECKS or PLAN_LIMIT_INTERVAL.
  • 404Project not found.
  • 401Unauthorized.
HTTP
POST https://api.stillonline.tech/v1/projects/{id}/checks
PATCH/v1/checks/{id}Bearer sk_live_…

Update check

Partial update: name, enabled (pause or resume a single URL check), or interval_seconds. Dashboard Play/Pause affects all checks in the project; per-URL pause is API-only.

Parameters

  • id (path) · requiredCheck id.

Request body

Send only fields to change.

JSON
{
  "enabled": false
}

Responses

  • 200Updated check object (see enabled and last_status).
  • 400Invalid JSON (common with curl -d quoting on Windows PowerShell).
  • 403PLAN_LIMIT_INTERVAL.
  • 404Check not found.
  • 401Unauthorized.
example
{
  "check": {
    "id": "clx…",
    "project_id": "clx…",
    "name": "API",
    "url": "https://api.example.com/health",
    "method": "GET",
    "interval_seconds": 300,
    "enabled": false,
    "last_status": "OPERATIONAL",
    "last_probed_at": "2026-05-29T09:57:10.362Z"
  }
}

enabled: false stops probes for this URL only; other checks in the project keep running. The dashboard shows a Paused badge (no per-URL pause button).

last_status may stay OPERATIONAL after pause — it is the last result before probes stopped, not live health.

Resume: PATCH with {"enabled": true}. Project-wide pause/resume uses dashboard controls (sets enabled on all checks).

Request body must be UTF-8 (Content-Type: application/json; charset=utf-8). On Windows PowerShell, send UTF-8 bytes for Cyrillic names — see /docs/api#windows-powershell.

HTTP
PATCH https://api.stillonline.tech/v1/checks/{id}
DELETE/v1/checks/{id}Bearer sk_live_…

Delete check

Permanently removes a check you own.

Parameters

  • id (path) · requiredCheck id.

Responses

  • 200Deleted.
  • 404Check not found.
  • 401Unauthorized.
example
{ "deleted": true }
HTTP
DELETE https://api.stillonline.tech/v1/checks/{id}
GET/v1/status-pages/{id}Bearer sk_live_…

Get status page

Metadata for a status page: slug, visibility (public/private), linked project.

Parameters

  • id (path) · requiredStatus page id.

Responses

  • 200Status page object.
  • 404Not found.
  • 401Unauthorized.
example
{
  "status_page": {
    "id": "clx…",
    "project_id": "clx…",
    "slug": "acme",
    "visibility": "public",
    "project_name": "Acme"
  }
}
HTTP
GET https://api.stillonline.tech/v1/status-pages/{id}
POST/v1/status-pages/{id}/incidentsBearer sk_live_…

Create incident

Opens a manual incident on a status page (shown on the public page while open).

Parameters

  • id (path) · requiredStatus page id.

Request body

title is required.

JSON
{ "title": "Investigating API errors" }

Responses

  • 201Created incident.
  • 404Status page not found.
  • 401Unauthorized.
HTTP
POST https://api.stillonline.tech/v1/status-pages/{id}/incidents
GET/v1/incidents/{id}Bearer sk_live_…

Get incident

Fetch one incident by id (open or resolved).

Parameters

  • id (path) · requiredIncident id.

Responses

  • 200Incident object.
  • 404Not found.
  • 401Unauthorized.
example
{
  "incident": {
    "id": "clx…",
    "status_page_id": "clx…",
    "title": "Investigating API errors",
    "status": "open",
    "started_at": "2026-05-27T12:00:00.000Z",
    "resolved_at": null
  }
}
HTTP
GET https://api.stillonline.tech/v1/incidents/{id}

Machine-readable spec: openapi.json (same paths and short English descriptions).