Base URL:
https://theroyalglow.in · Auth: Public. Unlike every other
endpoint, GET /api/health does not use the { success, data } envelope —
it returns its own documented HealthStatus contract and its own status codes.
The response always sends Cache-Control: no-store and an X-Health-Status
header. The admin app exposes an identical probe at
admin.theroyalglow.in/api/health; this page documents the customer probe on
theroyalglow.in.GET /api/health
Runs three independent dependency checks (database, Redis, R2) in parallel and reports an overall status. The handler is fully guarded — each check is wrapped so the endpoint never throws. Minimum role: PublicResponse shape
Response fields
Each component check is
{ status: "pass" | "fail" | "skip", latencyMs: number, message?: string }.
pass — dependency responded successfully
pass — dependency responded successfully
The dependency responded successfully within the check window.
fail — configured but unreachable or errored
fail — configured but unreachable or errored
The dependency is configured but unreachable or errored. A
message explains why.skip — not configured, so not checked
skip — not configured, so not checked
The dependency is not configured, so it was not checked. Redis reports
skip when UPSTASH_REDIS_REST_URL/UPSTASH_REDIS_REST_TOKEN are unset; R2
reports skip when NEXT_PUBLIC_R2_PUBLIC_URL is unset.Overall status rules
The database is the only hard dependency. Askip never degrades the
overall status.
So a no-keys local/dev environment (Redis and R2 unconfigured →
skip) reports
healthy with a 200. Only a failing database produces a 503.
Status examples
- Healthy
- Degraded
- Unhealthy
Redis and R2 unconfigured (
skip); database passes → 200.