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 group | Limit | Burst |
|---|---|---|
| Read (/summary, /components) | 60 / min | 120 |
| Write (incidents, maintenance) | 20 / min | 40 |
| Heartbeat | no 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.