API docs
A read-only REST API for your status pages, their incidents and your monitors. It can’t create, edit or delete anything. Included in the Solo and Pro plans. Base URL: https://durianstatus.app/api/v1
Authentication
Create a key in Dashboard → Account → API keys. The key is shown once: we only keep a hash of it, so copy it somewhere safe. Send it in the X-API-KEY header (Authorization: Bearer <key> works too). A key reads only the pages, incidents and monitors of the account that created it. Revoke a key on the same page: requests with it stop working right away.
curl https://durianstatus.app/api/v1/pages -H "X-API-KEY: ds_your_key"401missing, unknown or revoked key.402the account has no Solo or Pro plan.429more than 60 requests in a minute with one key (retry after theRetry-Afterseconds).400a bad query parameter (theerrorfield says which),404an unknown path, or a page you don’t own.
GET/api/v1/pages
Your status pages, newest first, with their components. Query parameters, all optional:
slug: one page by its address (e.g.acme).since: an ISO 8601 date, only pages created after it.limit: 1 to 100 (default 25). When a page of results is full, pass itsnext_beforevalue asbeforeto get the next one.
{
"data": [
{
"id": "6f1c…",
"slug": "acme",
"name": "Acme",
"description": "Live status of Acme services.",
"website_url": "https://acme.example",
"status_url": "https://durianstatus.app/s/acme",
"published": true,
"private": false,
"status": "partial_outage",
"components": [
{ "id": "c1a2…", "name": "API", "status": "operational", "monitored": true },
{ "id": "c3b4…", "name": "Dashboard", "status": "partial_outage", "monitored": true }
],
"created_at": "2026-10-05T09:30:00.000Z"
}
],
"next_before": null
}status is the worst component status: operational, maintenance, degraded, partial_outage or major_outage. private is true when the page is behind a password.
GET/api/v1/incidents
Your incidents and maintenance windows, newest first, each with its timeline (updates, oldest first). Query parameters, all optional:
page: only one page, by slug or id (404if it isn’t yours).status:open(not resolved or completed), or one ofinvestigating,identified,monitoring,resolved,scheduled,in_progress,completed.kind:incidentormaintenance.since,limit,before: as above.
{
"data": [
{
"id": "9d2e…",
"page_id": "6f1c…",
"page_slug": "acme",
"kind": "incident",
"title": "Dashboard is slow",
"impact": "minor",
"status": "monitoring",
"automatic": false,
"scheduled_start": null,
"scheduled_end": null,
"component_ids": ["c3b4…"],
"timeline": [
{ "id": "u1…", "status": "investigating", "body": "We are looking into slow page loads.", "created_at": "2026-10-12T09:30:00.000Z" },
{ "id": "u2…", "status": "monitoring", "body": "A fix is out, we are watching.", "created_at": "2026-10-12T10:02:11.000Z" }
],
"created_at": "2026-10-12T09:30:00.000Z",
"resolved_at": null
}
],
"next_before": null
}automatic is true for an incident opened by a monitor. Maintenance windows carry scheduled_start and scheduled_end.
GET/api/v1/monitors
Your monitors, oldest first, with their current state and uptime. Optional page (slug or id) keeps one page’s monitors.
{
"data": [
{
"id": "m7f3…",
"page_id": "6f1c…",
"page_slug": "acme",
"component_id": "c1a2…",
"component_name": "API",
"kind": "http",
"target": "https://api.acme.example/health",
"enabled": true,
"state": "up",
"last_checked_at": "2026-10-12T10:05:00.000Z",
"last_status_code": 200,
"last_latency_ms": 143,
"open_incident_id": null,
"ssl_expires_at": "2027-01-04T00:00:00.000Z",
"uptime": { "last_30_days": 99.98, "last_90_days": 99.95 },
"created_at": "2026-10-05T09:40:00.000Z"
}
]
}state is up, down, paused (disabled) or unknown (not checked yet). uptime is the share of counted checks that passed over the last 30 and 90 days (UTC), rounded down to 0.01; checks paused by a maintenance window aren’t counted, and it is null when nothing was checked. target is the URL, or host:port for a TCP monitor.