Get health status
GET /v2/_hc returns either an anonymous summary or authenticated details. GET /_hc uses the same handler and response formats. When CP Auth is enabled, detail authorization is checked against the actual request path, so a token can be allowed on one path and denied on the other. This endpoint has no query parameters.
Request authentication
| Header | Required | Meaning |
|---|---|---|
Authorization |
No | Optional. Bearer <token> with the oracle scope enables details after CP Auth validation. Without this header, returns the summary. When CP Auth is disabled, always returns the summary even if credentials are supplied. Query-string tokens do not enable details. |
Anonymous response
Without a token, returns only these three status fields. All three also appear in the authenticated response.
| Response field | Type | Description |
|---|---|---|
status |
string |
Overall status: ok, degraded, or unhealthy. |
server.status |
string |
Server status: ok, degraded, or unavailable. |
worker.status |
string |
Worker status: starting, ok, degraded, stale, or unavailable. |
{
"status": "ok",
"server": {
"status": "ok"
},
"worker": {
"status": "ok"
}
}
Authenticated response
A validated Bearer token returns the following additional fields. CP Auth must be enabled. All timestamps are RFC 3339 UTC strings. A type ending in ? marks an optional field; empty feed maps may be omitted.
| Response field | Type | Description |
|---|---|---|
version |
string |
Server version. |
commit |
string |
Build commit. |
server.components |
object |
Component health, keyed by component name. Includes api, websocket, and configured components such as market_overview. |
server.components.api.status |
string |
API dependency health: starting, ok, degraded, or unavailable. |
server.components.market_overview.status |
string |
Market overview refresh health: ok or unavailable. Present when monitored. |
server.components.websocket.status |
string |
Realtime feed health: starting, ok, stale, or unavailable. |
server.components.websocket.last_message_at |
string? |
Last realtime market event received by this API server. |
server.components.websocket.tickers |
object? |
Aggregate ticker health, keyed by base symbol such as BTC. |
server.components.websocket.tickers.<symbol>.status |
string |
Asset ticker status: starting, ok, idle, or stale. |
server.components.websocket.tickers.<symbol>.last_message_at |
string? |
Last aggregate ticker event received for this asset. |
server.components.websocket.klines |
object? |
Aggregate 1m Kline event health, keyed by base symbol. |
server.components.websocket.klines.<symbol>.status |
string |
Asset 1m Kline feed status: starting, ok, idle, or stale. |
server.components.websocket.klines.<symbol>.last_message_at |
string? |
Last aggregate 1m Kline event received for this asset. |
server.components.websocket.source_tickers |
object? |
Observed source ticker health, keyed by exchange:pair:quote. |
server.components.websocket.source_tickers.<market>.status |
string |
Source event delivery status: ok or stale. |
server.components.websocket.source_tickers.<market>.symbol |
string |
Base symbol such as BTC. |
server.components.websocket.source_tickers.<market>.last_message_at |
string? |
Last source ticker event received by this API server. |
server.components.websocket.source_tickers.<market>.source_time |
string? |
Original exchange quote time (T in the WebSocket event). |
worker.heartbeat_at |
string? |
Worker heartbeat time; omitted when unavailable. |
{
"status": "ok",
"version": "dev",
"commit": "none",
"server": {
"status": "ok",
"components": {
"api": {
"status": "ok"
},
"market_overview": {
"status": "ok"
},
"websocket": {
"status": "ok",
"last_message_at": "2026-10-02T04:00:00Z",
"tickers": {
"BTC": {
"status": "ok",
"last_message_at": "2026-10-02T04:00:00Z"
}
},
"klines": {
"BTC": {
"status": "ok",
"last_message_at": "2026-10-02T04:00:00Z"
}
},
"source_tickers": {
"gmo_coin:BTC_JPY:JPY": {
"status": "ok",
"symbol": "BTC",
"last_message_at": "2026-10-02T04:00:00Z",
"source_time": "2026-10-02T03:59:50Z"
}
}
}
}
},
"worker": {
"status": "ok",
"heartbeat_at": "2026-10-02T04:00:00Z"
}
}
Feed maps use base symbols such as BTC; <market> means an exchange:pair:quote key, such as gmo_coin:BTC_JPY:JPY. A source ticker becomes stale after 30 seconds without an event; this diagnostic status and an old source_time do not degrade overall health. Repeated source heartbeats update last_message_at, while source_time remains the original quote time. idle indicates a quiet connected market.
HTTP status and authentication failures
Both response variants use the same health status: 200 can include degraded health; required dependencies that are unavailable or have stale checks produce 503. When CP Auth is enabled, malformed credentials or invalid keys return 401; expired or revoked keys can return 403. Other CP Auth failures retain their HTTP status and error code, with sanitized messages. Authentication failures return errors rather than a summary. Uptime monitors should omit Authorization to read public health independently of CP Auth availability and token permissions. If no health snapshot is available, returns 503 with the public JSON shape and unavailable server/worker statuses. Responses use Cache-Control: no-store and Vary: Authorization.
Authorizations
Required when cp_auth.enabled=true. The token must have the oracle scope.
Responses
Cached health summary, or detailed health after successful Bearer authentication.
