System and metadata
Four routes that serve no market metric: they say whether the service answers, whether the data is fresh, which assets exist, and what each one can actually serve.
#Health of the service
The probe. It says whether the service is up and whether its database answers. It is the only route that answers without a key, and it is never counted against the quota, which makes it the point a monitoring system can query without consuming anything.
{
"status": "ok",
"timestamp": 1775647758094,
"database": "connected"
}In case of a problem, the response carries 503 and "database": "unreachable".
#Freshness of the sources
For each source feeding the market core: the number of rows, the last insert, its age, and an is_stale flag computed server-side against a threshold specific to that source. It is the route to query before building an analysis: knowing that data is old is better than discovering it in a result.
{
"status": "ok",
"timestamp": 1775648290510,
"tables": {
"raw_exchange.klines_1m": {
"count": 4881977,
"last_insert": "2026-08-29T11:37:00+00:00",
"age_seconds": 70.5,
"is_stale": false,
"stale_threshold_seconds": 180
},
"raw_exchange.trades_raw": {
"count": 918964,
"last_insert": "2026-08-29T11:38:09+00:00",
"age_seconds": 1.5,
"is_stale": false,
"stale_threshold_seconds": 30,
"per_exchange": {
"venue_a": { "age_seconds": 1.2, "is_stale": false },
"venue_b": { "age_seconds": 2.0, "is_stale": false }
},
"any_exchange_stale": false
}
}
}| Field | Type | Description |
|---|---|---|
count | integer | Number of rows available. |
last_insert | string | null | ISO 8601 timestamp of the last write. |
age_seconds | float | null | Seconds elapsed since. |
is_stale | boolean | True if the age exceeds the threshold. An empty source that has a threshold is marked stale: “no data at all” is a stronger signal than “data running late”. |
stale_threshold_seconds | integer | null | The threshold applied. null means no threshold makes sense for this source (an index published once a day, for example). |
per_exchange | object | On multi-venue sources: the age of each one. A single venue that has gone down is visible there. |
any_exchange_stale | boolean | Accompanies per_exchange. The root flag rests on the freshest source: a dead venue would be invisible there as long as the others keep writing. This one surfaces it. |
#Symbol catalogue
The live list of the assets enabled. It is the authority: do not hard-code the list in a client, have it read at start-up.
{
"status": "ok",
"timestamp": 1775648758094,
"data_type": "symbols",
"data": [
{ "symbol": "BTCUSDT", "base_asset": "BTC", "name": "Bitcoin" },
{ "symbol": "ETHUSDT", "base_asset": "ETH", "name": "Ethereum" }
]
}| Field | Type | Description |
|---|---|---|
symbol | string | The identifier to pass in ?symbol=. |
base_asset | string | The base asset (BTC, ETH). It is what the options routes take in ?asset=. |
name | string | The full name, for display. |
#Capability report
What this asset can actually serve, measured over the last twenty-four hours. It makes it possible to anticipate an empty response instead of discovering it, and to tell a metric that makes no sense here from a metric momentarily blocked.
curl -H "X-API-KEY: $BYTNODE_KEY" \
"https://api.bytnode.com/v1/symbols/USDCUSDT/capabilities"| Field | Type | Description |
|---|---|---|
symbol | string | The asset queried. |
asset_class | string | crypto or stablecoin. |
feeds_active_last_24h | object | Eight streams, each true or false depending on whether it produced data over the window. Capability is not freshness: a stream active twenty hours ago is still true there. |
computed_metrics_available | array | The metrics that can be computed: all their input streams are present. |
computed_metrics_blocked | object | The metrics prevented, with the missing streams and the reason. |
computed_metrics_not_applicable | object | On a stablecoin: every metric derived from the futures market, with its reason. This is intentional, not a failure. |
stablecoin_note | string | On a stablecoin: what remains available on spot. |
An unknown or disabled symbol returns 400 with the list of active symbols.