Beacon Start a page

API

Everything the web interface does is available over HTTP. Tokens are per-page and scoped: a read token cannot post an incident.

Read the current board

curl -s https://statuspage-eu.bulsan.site/api/v1/pages/acme/summary \
  -H "Authorization: Bearer $BEACON_READ_TOKEN"
{
  "page": "acme",
  "status": "operational",
  "updated_at": "2026-09-02T04:11:07Z",
  "components": [
    { "id": "checkout-api", "name": "Checkout API", "status": "operational", "uptime_90d": 0.9998 },
    { "id": "webhooks",     "name": "Webhooks",     "status": "degraded",    "uptime_90d": 0.9971 }
  ]
}

Post an incident update

curl -s -X POST https://statuspage-eu.bulsan.site/api/v1/pages/acme/incidents \
  -H "Authorization: Bearer $BEACON_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "title": "Webhook delivery delayed",
        "status": "investigating",
        "components": ["webhooks"],
        "body": "Delivery is running behind. Checkout API is unaffected."
      }'

Subsequent updates go to the same incident id with status moving through identified, monitoring and resolved. Subscribers are notified on every update, including the first.

Heartbeats

For jobs that have no endpoint to poll. Beacon alerts when the ping stops arriving:

# nightly backup, expected every 24h with a 2h grace period
0 2 * * *  /usr/local/bin/backup.sh && \
  curl -fsS -m 10 https://statuspage-eu.bulsan.site/hb/8c1f2a4e >/dev/null

Rate limits

Endpoint groupLimitBurst
Read (/summary, /components)60 / min120
Write (incidents, maintenance)20 / min40
Heartbeatno limit

Exceeding a limit returns 429 with Retry-After. We do not silently drop writes during an incident — that is exactly when you need them to land.