REST API

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

GET/v1/healthno key

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.

200
{
  "status": "ok",
  "timestamp": 1775647758094,
  "database": "connected"
}

In case of a problem, the response carries 503 and "database": "unreachable".

#Freshness of the sources

GET/v1/status

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.

200
{
  "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
    }
  }
}
FieldTypeDescription
countintegerNumber of rows available.
last_insertstring | nullISO 8601 timestamp of the last write.
age_secondsfloat | nullSeconds elapsed since.
is_stalebooleanTrue 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_secondsinteger | nullThe threshold applied. null means no threshold makes sense for this source (an index published once a day, for example).
per_exchangeobjectOn multi-venue sources: the age of each one. A single venue that has gone down is visible there.
any_exchange_stalebooleanAccompanies 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

GET/v1/symbolsdata_type · symbols

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.

200
{
  "status": "ok",
  "timestamp": 1775648758094,
  "data_type": "symbols",
  "data": [
    { "symbol": "BTCUSDT", "base_asset": "BTC", "name": "Bitcoin" },
    { "symbol": "ETHUSDT", "base_asset": "ETH", "name": "Ethereum" }
  ]
}
FieldTypeDescription
symbolstringThe identifier to pass in ?symbol=.
base_assetstringThe base asset (BTC, ETH). It is what the options routes take in ?asset=.
namestringThe full name, for display.

#Capability report

GET/v1/symbols/{symbol}/capabilitiesdata_type · symbol_capabilities

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"
FieldTypeDescription
symbolstringThe asset queried.
asset_classstringcrypto or stablecoin.
feeds_active_last_24hobjectEight 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_availablearrayThe metrics that can be computed: all their input streams are present.
computed_metrics_blockedobjectThe metrics prevented, with the missing streams and the reason.
computed_metrics_not_applicableobjectOn a stablecoin: every metric derived from the futures market, with its reason. This is intentional, not a failure.
stablecoin_notestringOn a stablecoin: what remains available on spot.

An unknown or disabled symbol returns 400 with the list of active symbols.