DurianStatus

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"
  • 401 missing, unknown or revoked key.
  • 402 the account has no Solo or Pro plan.
  • 429 more than 60 requests in a minute with one key (retry after the Retry-After seconds).
  • 400 a bad query parameter (the error field says which), 404 an 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 its next_before value as before to 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 (404 if it isn’t yours).
  • status: open (not resolved or completed), or one of investigating, identified, monitoring, resolved, scheduled, in_progress, completed.
  • kind: incident or maintenance.
  • 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.