API reference
Health
Liveness/readiness.
Liveness/readiness check (incl. DB connectivity)
GET /health
Public — no credentials
Public and token-blind: one body for every caller, and the Authorization header is never read — a missing, invalid or revoked token changes nothing and never yields a 401. The Sidekiq worker figures moved to the operator-only GET /admin/health.
Alert on status, not on the HTTP status code. The code is liveness for the load balancer — 503 only when the database is down — and a dead Sidekiq fleet stays 200 on purpose, because the API still serves every synchronous request while jobs queue. A monitor watching only the code therefore reports a healthy gateway while nothing broadcasts or confirms. status carries ok / degraded / error.
Responses
- 200 Service healthy. One public body for every caller — the endpoint is token-blind.
- 503 Degraded (database unreachable). Same public body as the 200.
curl "https://api.rail0.xyz/health"const res = await fetch("https://api.rail0.xyz/health");
if (!res.ok) { const { code, detail } = await res.json(); throw new Error(`${res.status} ${code}: ${detail}`);}const data = await res.json();require "json"require "net/http"
uri = URI("https://api.rail0.xyz/health")req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }raise "#{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)data = JSON.parse(res.body)package main
import ( "fmt" "io" "net/http")
func main() { url := "https://api.rail0.xyz/health" req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { panic(err) }
res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close()
data, err := io.ReadAll(res.Body) if err != nil { panic(err) } fmt.Println(res.Status, string(data))}Response 200
{ "status": "ok", "db": "ok", "timestamp": "2026-10-01T12:00:00Z", "api_version": "string", "contract_version": "string", "active_chains": 1, "active_contracts": 1}