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.
/v1/public/status/{slug}no authPublic 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
- 200 — Overall status, components, 7-day uptime, optional open incident.
- 404 — Page not found or visibility is private.
- 429 — Rate limit: 60 requests per minute per IP (Retry-After header).
{
"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).
GET https://api.stillonline.tech/v1/public/status/{slug}Private REST API
Pro or Ultimate plan. Create an API key in the dashboard.
Authorization: Bearer sk_live_…
Base: https://api.stillonline.tech/v1Errors: 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.
# 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.
$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_atThe 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.
/v1/healthno authAPI health
Lightweight liveness check for monitors and deploy smoke tests.
Responses
- 200 — Service is up. No API key; not subject to per-key private limits.
{
"status": "ok",
"service": "stillonline-api",
"version": "v1"
}GET https://api.stillonline.tech/v1/health/v1/projectsBearer sk_live_…List projects
Returns all non-deleted projects for the API key owner, newest first.
Responses
- 200 — Array of projects with status_page_id.
- 401 — Missing or invalid Bearer key.
- 429 — RATE_LIMIT — over 120 GET requests/min per API key (Retry-After).
{
"projects": [
{
"id": "clx…",
"name": "Acme",
"description": null,
"slug": "acme",
"timezone": "UTC",
"status_page_id": "clx…",
"created_at": "2026-05-27T10:00:00.000Z"
}
]
}GET https://api.stillonline.tech/v1/projects/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.
{
"name": "Acme API",
"url": "https://api.example.com/health",
"description": "Optional note"
}Responses
- 201 — Created project object.
- 400 — Invalid JSON or missing name/url.
- 403 — Plan limit (code PLAN_LIMIT_PROJECTS) or Free tier without API access.
- 401 — Unauthorized.
POST https://api.stillonline.tech/v1/projects/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
- 200 — Deleted.
- 404 — Project not found.
- 401 — Unauthorized.
- 429 — RATE_LIMIT — write bucket (Retry-After).
{ "deleted": true, "project_id": "clx…" }DELETE https://api.stillonline.tech/v1/projects/{id}/v1/projects/{id}/checksBearer sk_live_…List checks
All uptime checks for a project you own.
Parameters
id(path) · requiredProject id.
Responses
- 200 — Array of checks.
- 404 — Project not found.
- 401 — Unauthorized.
{
"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"
}
]
}GET https://api.stillonline.tech/v1/projects/{id}/checks/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.
{
"name": "API",
"url": "https://api.example.com/health",
"interval_seconds": 300
}Responses
- 201 — Created check.
- 403 — PLAN_LIMIT_CHECKS or PLAN_LIMIT_INTERVAL.
- 404 — Project not found.
- 401 — Unauthorized.
POST https://api.stillonline.tech/v1/projects/{id}/checks/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.
{
"enabled": false
}Responses
- 200 — Updated check object (see enabled and last_status).
- 400 — Invalid JSON (common with curl -d quoting on Windows PowerShell).
- 403 — PLAN_LIMIT_INTERVAL.
- 404 — Check not found.
- 401 — Unauthorized.
{
"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.
PATCH https://api.stillonline.tech/v1/checks/{id}/v1/checks/{id}Bearer sk_live_…Delete check
Permanently removes a check you own.
Parameters
id(path) · requiredCheck id.
Responses
- 200 — Deleted.
- 404 — Check not found.
- 401 — Unauthorized.
{ "deleted": true }DELETE https://api.stillonline.tech/v1/checks/{id}/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
- 200 — Status page object.
- 404 — Not found.
- 401 — Unauthorized.
{
"status_page": {
"id": "clx…",
"project_id": "clx…",
"slug": "acme",
"visibility": "public",
"project_name": "Acme"
}
}GET https://api.stillonline.tech/v1/status-pages/{id}/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.
{ "title": "Investigating API errors" }Responses
- 201 — Created incident.
- 404 — Status page not found.
- 401 — Unauthorized.
POST https://api.stillonline.tech/v1/status-pages/{id}/incidents/v1/incidents/{id}Bearer sk_live_…Get incident
Fetch one incident by id (open or resolved).
Parameters
id(path) · requiredIncident id.
Responses
- 200 — Incident object.
- 404 — Not found.
- 401 — Unauthorized.
{
"incident": {
"id": "clx…",
"status_page_id": "clx…",
"title": "Investigating API errors",
"status": "open",
"started_at": "2026-05-27T12:00:00.000Z",
"resolved_at": null
}
}GET https://api.stillonline.tech/v1/incidents/{id}Machine-readable spec: openapi.json (same paths and short English descriptions).