
A small, focused API proxy that turns a published Uptime Kuma status page into a stable, cacheable JSON API.
A small, focused API proxy that turns a published Uptime Kuma status page into a stable, cacheable JSON API.

A small, focused API proxy that turns a published Uptime Kuma status page into a stable, cacheable JSON API for web and mobile clients.
kuma-extended is designed to live on the same internal network as Uptime Kuma. It wraps Kuma's public /api/status-page/:slug endpoint behind a fixed contract with TTL caching, per-IP rate limiting, security headers, and an opt-in CORS surface.
This template deploys only the kuma-extended proxy. You must already have an Uptime Kuma instance running and reachable from the kuma-extended service.
On Zeabur, the easiest way is to deploy Uptime Kuma as another service in the same project. The two services can then reach each other using the internal hostname, e.g. http://uptime-kuma.<container-hostname>.zeabur.internal:3001.
| Variable | Required | Default | Description |
|---|---|---|---|
KUMA_BASE_URL | Yes | — | URL of the upstream Uptime Kuma instance |
KUMA_STATUS_PAGE_SLUG | No | default | Slug of the Kuma status page to proxy |
ALLOWED_ORIGIN | No | (empty) | CORS origin; empty disables CORS |
CACHE_TTL_SECONDS | No | 60 | TTL for cached Kuma responses |
KUMA_TIMEOUT_MS | No | 10000 | Timeout when calling Kuma |
RATE_LIMIT_PER_MINUTE | No | 120 | Per-IP refill rate for the token bucket |
RATE_LIMIT_BURST | No | 20 | Token bucket capacity (burst ceiling) |
All responses share the same envelope:
{ "ok": true, "data": { ... }, "meta": { ... } }
{ "ok": false, "error": { "code": "...", "message": "..." } }
GET /api/v1/status — Merged incident and maintenance feed for the configured status page.GET /healthz — Proxy liveness and Kuma's most recent sync state (not rate-limited).MIT — see kuma-extended on GitHub.
