Système et métadonnées
Cinq routes qui ne servent aucune métrique de marché : elles disent si le service répond, si les données sont fraîches, quels actifs existent, ce que chacun peut réellement servir, et ce que votre clé peut faire.
Un agent IA pose les mêmes questions par un seul outil MCP : get_system_info renvoie la santé du service et votre offre (familles, profondeur d’historique, débit, quota restant) sans entamer votre quota, et à la demande les paires servies et la fraîcheur des données. Voir le serveur MCP.
#Santé du service
Les 1 champs de cette route (d’après le contrat)
database | `connected` when the service reaches its database. A failing check answers 503 `service_unavailable` with `database` in `error.details`. |
La sonde. Elle dit si le service est en marche et si sa base de données répond. C’est la seule route qui répond sans clé, et elle n’est jamais décomptée du quota, ce qui en fait le point qu’un système de supervision peut interroger sans rien consommer.
{
"status": "ok",
"server_time": "2026-11-08T12:51:13.156Z",
"data_type": "health",
"data": {
"database": "connected"
}
}En cas de problème : 503 avec le corps d’erreur (error.code: "service_unavailable", et database: "unreachable", service et retry_after_s sous error.details), et l’en-tête Retry-After.
#Fraîcheur des flux
Les 15 champs de cette route (d’après le contrat)
computed_at | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | When the status was measured: the OLDEST of its measurements (each data family is measured on its own, cached up to 5 minutes for market feeds and 30 seconds for the others). Every `age_s` is measured at or after this instant, not at `server_time`. |
state | `ok`, or `degraded` when at least one feed is stale or failed its check. The envelope's `status` stays `ok` (the request succeeded). | |
feed_count | count | Public feeds checked. |
stale_feed_count | count | Feeds older than their threshold. |
error_feed_count | count | Feeds that could not be checked. |
max_age_s | seconds | Age of the oldest feed. |
feeds | One row per public feed. | |
feeds.feed | Public feed name. The closed list of this contract version; `routes` gives the routes each one supplies. | |
feeds.family | Data family the feed belongs to, as in `/v1/limits` and the `x-family` of each route: `price_volume`, `derivatives`, `microstructure`, `trades`, `options`, `onchain`, `macro`, `etf`, `tokenomics` or `sentiment`. | |
feeds.routes | The public routes (contract paths) this feed supplies: watch this feed to know whether they are fresh. A per-timeframe feed (`cvd_1h`) supplies them at that timeframe. | |
feeds.age_s | seconds | Age of the latest row of the feed. For a feed made of several series (one per asset, per macro series, per ETF), the age of its OLDEST series. For the market-hours intraday series (`macro_intraday_<tf>`, not `_continuous`), counted on weekdays only, like their threshold. `null` if the feed is empty or could not be checked. |
feeds.expected_interval_s | seconds | Maximum legitimate age of the feed. |
feeds.threshold_s | seconds | Age above which the feed is stale (1.5 × expected_interval_s). |
feeds.is_stale | Whether the feed is stale: older than `threshold_s`, or (series feed) at least one of its series is. `null` when the feed could not be checked (counted in `error_feed_count`). | |
feeds.stale_venue_count | count | Venues lagging on this feed; `null` when the feed is not split by venue (every non-market feed). |
Une ligne par flux de données, sous son nom public : son âge, le rythme auquel il doit publier, et un drapeau is_stale calculé côté serveur. La règle est la même pour tous les flux : un flux est en retard quand il n’a rien livré depuis 1,5 × son rythme attendu. Aucune table interne, aucun nom de place, aucun compte de lignes. C’est la route à interroger avant de construire une analyse : savoir qu’une donnée est ancienne vaut mieux que de le découvrir dans un résultat. Elle couvre toutes les familles : prix et volumes, dérivés, flux d’ordres, transactions, mais aussi options, on-chain, macro, ETF, tokenomics et sentiment. Une série lente n’est pas une série en retard : une série macro mensuelle ou un dépôt ETF trimestriel atteint légitimement un âge de plusieurs semaines, et son expected_interval_s le dit.
{
"status": "ok",
"server_time": "2026-11-08T12:51:14.698Z",
"data_type": "status",
"data": {
"computed_at": "2026-11-08T12:51:13.669Z",
"state": "ok",
"feed_count": 82,
"stale_feed_count": 0,
"error_feed_count": 0,
"max_age_s": 7649473.7,
"feeds": [
{
"feed": "klines_futures_1m",
"family": "price_volume",
"routes": [
"/v1/klines",
"/v1/klines/history"
],
"age_s": 73.7,
"expected_interval_s": 120,
"threshold_s": 180,
"is_stale": false,
"stale_venue_count": 0
},
{
"feed": "klines_1m",
"family": "price_volume",
"routes": [
"/v1/klines",
"/v1/klines/history"
],
"age_s": 73.7,
"expected_interval_s": 180,
"threshold_s": 270,
"is_stale": false,
"stale_venue_count": 0
},
{
"feed": "klines_multi",
"family": "price_volume",
"routes": [
"/v1/klines",
"/v1/klines/history"
],
"age_s": 373.7,
"expected_interval_s": 660,
"threshold_s": 990,
"is_stale": false,
"stale_venue_count": null
}
]
}
}| Champ | Type | Description |
|---|---|---|
status | string | Toujours ok quand la requête a abouti ; l’état des flux est data.state. |
server_time | string | L’instant où la réponse a été produite, en ISO 8601 UTC à la milliseconde. |
data.computed_at | string | L’instant de la mesure : la plus ancienne de ses mesures (les flux de marché sont en cache jusqu’à cinq minutes, les autres familles trente secondes). Chaque age_s se mesure à cet instant ou après, pas à server_time. |
data.state | string | ok, ou degraded dès qu’un flux est en retard ou que sa vérification a échoué. |
data.feed_count | integer | Nombre de flux vérifiés. |
data.stale_feed_count | integer | Nombre de flux en retard. |
data.error_feed_count | integer | Nombre de flux dont la vérification a échoué. |
data.max_age_s | float | null | Le plus grand âge observé parmi les flux. |
data.feeds | array | Une entrée par flux, décrite ci-dessous. |
| Champ de chaque flux | Type | Description |
|---|---|---|
feed | string | Le nom public du flux : klines_1m, funding_rate, cvd_1h, options_aggregates, btc_mempool, macro_daily_weekly, etf_filings… La liste fermée est dans le contrat (enum de feed). |
family | string | La famille de quota du flux, comme dans /v1/limits et le x-family de chaque route : price_volume, derivatives, microstructure, trades, options, onchain, macro, etf, tokenomics ou sentiment. |
routes | string[] | Les routes publiques qui servent la donnée de ce flux : un flux en retard dit quelles routes sont touchées. |
age_s | float | null | Secondes écoulées depuis la dernière livraison. Pour un flux fait de plusieurs séries (une par actif, par série macro, par ETF), l’âge de sa série la plus ancienne ; pour les séries macro intraday aux heures de marché (macro_intraday_1m … macro_intraday_1d), compté en jours ouvrés seulement, comme leur seuil. null si le flux n’a encore aucune donnée, ou si la vérification a échoué. |
expected_interval_s | integer | Le rythme attendu : l’âge le plus long encore légitime pour ce flux (un jour pour une série quotidienne, par exemple). |
threshold_s | integer | Le seuil appliqué, toujours 1,5 × expected_interval_s. |
is_stale | boolean | null | Vrai si le flux dépasse son seuil, si une seule de ses places le dépasse, ou (flux à séries) si une seule de ses séries le dépasse. null si la vérification a échoué : il est alors compté dans error_feed_count. |
stale_venue_count | integer | null | Le nombre de places en retard sur ce flux, jamais leurs noms. null quand le flux n’est pas ventilé par place (tout flux hors des familles de marché). |
#Catalogue des symboles
Les 5 champs de cette route (d’après le contrat)
symbol | Trading pair, e.g. `BTCUSDT`. | |
base_asset | Base asset of the pair. | |
name | Human-readable name. | |
quote_asset | Quote currency of the pair (`USDT` for BTCUSDT, `USDC` for USDTUSDC): the currency of its prices. | |
markets | Markets served for the pair: `spot` and `futures` (USDT-margined perpetual), or `spot` only for the two stablecoin pairs (their `/futures` routes answer `unavailable: not_applicable`). |
La liste vivante des actifs activés. C’est elle qui fait foi : ne codez pas la liste en dur dans un client, faites-la lire au démarrage.
{
"status": "ok",
"server_time": "2026-11-08T12:51:15.750Z",
"data_type": "symbols",
"data": [
{
"symbol": "AAVEUSDT",
"base_asset": "AAVE",
"name": "Aave",
"quote_asset": "USDT",
"markets": [
"spot",
"futures"
]
},
{
"symbol": "ADAUSDT",
"base_asset": "ADA",
"name": "Cardano",
"quote_asset": "USDT",
"markets": [
"spot",
"futures"
]
}
]
}| Champ | Type | Description |
|---|---|---|
symbol | string | L’identifiant à passer dans ?symbol=. |
base_asset | string | L’actif de base (BTC, ETH). C’est ce que les routes d’options prennent dans ?asset=. |
name | string | Le nom complet, pour l’affichage. |
quote_asset | string | La devise de cotation : la devise des prix de la paire (USDT pour BTCUSDT, USDC pour USDTUSDC). |
markets | string[] | Les marchés servis : spot et futures, ou spot seul pour les deux paires de stablecoins. |
#Rapport de capacités
Les 25 champs de cette route (d’après le contrat)
asset_class | `crypto` or `stablecoin` (spot only, no futures metrics). | |
feeds_active_last_24h | Per source feed, under its `/v1/status` name (`trades_spot`, `trades_kline_futures_seconds`, `oi`, `funding_rate`, `klines_1m`...): whether it received data for this symbol in the last 24 h. | |
feeds_active_last_24h.klines_futures_1m | `true` when the `klines_futures_1m` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.trades_spot | `true` when the `trades_spot` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.trades_futures | `true` when the `trades_futures` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.oi | base asset quantity (BTC for BTCUSDT) | `true` when the `oi` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. |
feeds_active_last_24h.funding_rate | `true` when the `funding_rate` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.liquidations_events | `true` when the `liquidations_events` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.trades_kline_futures_seconds | `true` when the `trades_kline_futures_seconds` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.klines_futures_multi | `true` when the `klines_futures_multi` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.klines_1m | `true` when the `klines_1m` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.klines_multi | `true` when the `klines_multi` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
feeds_active_last_24h.orderbook_1m | `true` when the `orderbook_1m` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time. | |
computed_metrics_available | Derived metrics available for the symbol. | |
computed_metrics_blocked | Derived metrics unavailable, with the missing feeds. | |
feeds_not_applicable | Feeds that do not exist for this symbol (the futures feeds of a spot-only stablecoin), under their `/v1/status` names. | |
stablecoin_note | Spot-only stablecoin: why its futures feeds and derived metrics do not apply. Absent for any other symbol. | |
computed_metrics_not_applicable | Derived metrics that do not apply (stablecoins have no futures). | |
computed_metrics_not_applicable.basis | Why `basis` does not apply to this symbol. | |
computed_metrics_not_applicable.oi_change | base asset quantity (BTC for BTCUSDT) | Why `oi_change` does not apply to this symbol. |
computed_metrics_not_applicable.liquidations_cumulative | Why `liquidations_cumulative` does not apply to this symbol. | |
computed_metrics_not_applicable.liquidations_big_small_ratio | Why `liquidations_big_small_ratio` does not apply to this symbol. | |
computed_metrics_not_applicable.funding_cumulative | Why `funding_cumulative` does not apply to this symbol. | |
computed_metrics_not_applicable.indicators | Why `indicators` does not apply to this symbol. | |
computed_metrics_not_applicable.trades_kline_futures | Why `trades_kline_futures` does not apply to this symbol. |
Ce que cet actif peut réellement servir, mesuré sur les dernières vingt-quatre heures. Il permet d’anticiper une réponse vide au lieu de la découvrir, et de distinguer une métrique qui n’a pas de sens ici d’une métrique momentanément bloquée.
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/capabilities?symbol=BTCUSDT"| Champ | Type | Description |
|---|---|---|
symbol | string | L’actif interrogé — dans l’enveloppe, à côté de data. |
asset_class | string | crypto ou stablecoin. |
feeds_active_last_24h | object | Les flux sondés, chacun vrai ou faux selon qu’il a produit des données sur la fenêtre, ou null quand sa sonde n’a pas conclu à temps. La capacité n’est pas la fraîcheur : un flux actif il y a vingt heures y est encore vrai. Sur un stablecoin, seul le flux spot est sondé. |
computed_metrics_available | array | Les métriques calculables : tous leurs flux d’entrée sont présents. |
computed_metrics_blocked | object | Les métriques empêchées, avec les flux manquants et la raison. undetermined_feeds liste ceux dont la sonde a dépassé son délai : inconnus, pas absents. |
computed_metrics_not_applicable | object | Sur un stablecoin : chaque métrique dérivée du marché à terme, avec sa raison. C’est voulu, pas une panne. |
feeds_not_applicable | array | Sur un stablecoin : les flux futures, qui ne sont pas sondés plutôt que d’être déclarés faux. |
stablecoin_note | string | Sur un stablecoin : ce qui reste disponible en spot. |
Un symbole inconnu ou désactivé renvoie 422 invalid_symbol avec la liste des symboles actifs.
#Les limites de votre offre
Les 18 champs de cette route (d’après le contrat)
plan | Your plan: `free`, `traders`, `financial`, `startup` or `enterprise` (`legacy` for an internal unmetered key: every limit below is then unset). | |
families | Data families your plan includes (`price_volume`, `derivatives`, `microstructure`, `trades`, `snapshot`, `indicators`, `macro`, `options`, `onchain`, `etf`, `tokenomics`, `sentiment`); `null` = all of them. A route outside them answers 403 `plan_family`. | |
history | History window per timeframe, one object per timeframe the API serves. | |
history.timeframe | The timeframe the window applies to. | |
history.window_s | seconds | How far back this timeframe may be read, in seconds, measured from now; `null` = unlimited. Beyond it: 403 `history_depth`. |
trades_window_s | seconds | How far back individual trades (`/v1/trades/spot`, `/futures`, `/large`) may be read, in seconds; `0` = not in your plan (family `trades`), `null` = unlimited. |
liquidations_events_count | count | How many of the most recent individual liquidations `/v1/liquidations/events` may return, counted from the latest: 100 (Free), 500 (Traders), 1,000 (Financial), 10,000 (Startup); a larger `limit` answers 403 `history_depth`. `null` = no count set (Enterprise, or an unmetered key): up to 10,000 per call, the route's maximum. `0` = not in your plan (family `derivatives`). |
rate | The per-minute rate, as a token bucket; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`rate` policy). | |
rate.requests_per_minute | count | Requests per minute of your plan (the bucket refills at this pace). |
rate.burst_count | count | Capacity of the bucket: requests you can send at once. |
rate.refill_s | seconds | Seconds to refill the bucket from empty. |
rate.remaining_count | count | Requests left right now (after this one). |
rate.reset_s | seconds | Seconds until fully restored. |
quota | The monthly quota; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`quota` policy). It resets on the 1st of the month, 00:00 UTC. | |
quota.monthly_count | count | Requests included per calendar month. |
quota.month_length_s | seconds | Length of the current calendar month, in seconds. |
quota.remaining_count | count | Requests left right now (after this one). |
quota.reset_s | seconds | Seconds until fully restored. |
Ce que votre clé peut faire, lu dans l’offre qui a servi CETTE requête : les familles de données de marché incluses, la fenêtre d’historique de chaque unité de temps, la fenêtre tick par tick, le nombre de liquidations individuelles, et le débit par minute et le quota mensuel avec ce qu’il en reste. Dimensionnez limit et since_ms à partir d’elle avant de paginer, au lieu de découvrir la fenêtre par un 403 history_depth. Non décomptée de votre quota. Avec une clé non comptée, chaque limite vaut null.
curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/limits"| Champ | Type | Description |
|---|---|---|
plan | string | null | Votre offre : free, traders, financial, startup ou enterprise. |
families | string[] | null | Les familles de données de marché incluses dans votre offre ; null = toutes. Une route hors de ces familles répond 403 plan_family. |
history[].timeframe / window_s | string / integer | null | Une entrée par timeframe : jusqu’où il peut être lu, en secondes (window_s) ; 0 = hors de votre offre, null = sans limite. |
trades_window_s | integer | null | Jusqu’où les trades individuels (/v1/trades/*) peuvent être lus, en secondes ; 0 = hors de votre offre (famille trades), null = sans limite. |
liquidations_events_count | integer | null | Combien des liquidations individuelles les plus récentes /v1/liquidations/events peut rendre. |
rate | object | null | Le débit par minute en seau à jetons : requests_per_minute, burst_count (la capacité de rafale), refill_s (secondes pour se remplir à vide), remaining_count, reset_s. Les mêmes valeurs que les en-têtes RateLimit. |
quota | object | null | Le quota mensuel : monthly_count, month_length_s, remaining_count, reset_s (jusqu’au 1er du mois suivant, 00:00 UTC). |