API REST

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

GET/v1/healthsans cléRéférence complète
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.

200
{
  "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_atISO 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_countcountPublic feeds checked.
stale_feed_countcountFeeds older than their threshold.
error_feed_countcountFeeds that could not be checked.
max_age_ssecondsAge of the oldest feed.
feedsOne row per public feed.
feeds.feedPublic feed name. The closed list of this contract version; `routes` gives the routes each one supplies.
feeds.familyData 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.routesThe 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_ssecondsAge 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_ssecondsMaximum legitimate age of the feed.
feeds.threshold_ssecondsAge above which the feed is stale (1.5 × expected_interval_s).
feeds.is_staleWhether 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_countcountVenues 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.

200
{
  "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
      }
    ]
  }
}
ChampTypeDescription
statusstringToujours ok quand la requête a abouti ; l’état des flux est data.state.
server_timestringL’instant où la réponse a été produite, en ISO 8601 UTC à la milliseconde.
data.computed_atstringL’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.statestringok, ou degraded dès qu’un flux est en retard ou que sa vérification a échoué.
data.feed_countintegerNombre de flux vérifiés.
data.stale_feed_countintegerNombre de flux en retard.
data.error_feed_countintegerNombre de flux dont la vérification a échoué.
data.max_age_sfloat | nullLe plus grand âge observé parmi les flux.
data.feedsarrayUne entrée par flux, décrite ci-dessous.
Champ de chaque fluxTypeDescription
feedstringLe 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).
familystringLa 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.
routesstring[]Les routes publiques qui servent la donnée de ce flux : un flux en retard dit quelles routes sont touchées.
age_sfloat | nullSecondes é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_sintegerLe rythme attendu : l’âge le plus long encore légitime pour ce flux (un jour pour une série quotidienne, par exemple).
threshold_sintegerLe seuil appliqué, toujours 1,5 × expected_interval_s.
is_staleboolean | nullVrai 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_countinteger | nullLe 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

GET/v1/symbolsdata_type · symbolsRéférence complète
Les 5 champs de cette route (d’après le contrat)
symbolTrading pair, e.g. `BTCUSDT`.
base_assetBase asset of the pair.
nameHuman-readable name.
quote_assetQuote currency of the pair (`USDT` for BTCUSDT, `USDC` for USDTUSDC): the currency of its prices.
marketsMarkets 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.

200
{
  "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"
      ]
    }
  ]
}
ChampTypeDescription
symbolstringL’identifiant à passer dans ?symbol=.
base_assetstringL’actif de base (BTC, ETH). C’est ce que les routes d’options prennent dans ?asset=.
namestringLe nom complet, pour l’affichage.
quote_assetstringLa devise de cotation : la devise des prix de la paire (USDT pour BTCUSDT, USDC pour USDTUSDC).
marketsstring[]Les marchés servis : spot et futures, ou spot seul pour les deux paires de stablecoins.

#Rapport de capacités

GET/v1/capabilitiesdata_type · capabilitiesRéférence complète
Les 25 champs de cette route (d’après le contrat)
asset_class`crypto` or `stablecoin` (spot only, no futures metrics).
feeds_active_last_24hPer 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.oibase 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_availableDerived metrics available for the symbol.
computed_metrics_blockedDerived metrics unavailable, with the missing feeds.
feeds_not_applicableFeeds that do not exist for this symbol (the futures feeds of a spot-only stablecoin), under their `/v1/status` names.
stablecoin_noteSpot-only stablecoin: why its futures feeds and derived metrics do not apply. Absent for any other symbol.
computed_metrics_not_applicableDerived metrics that do not apply (stablecoins have no futures).
computed_metrics_not_applicable.basisWhy `basis` does not apply to this symbol.
computed_metrics_not_applicable.oi_changebase asset quantity (BTC for BTCUSDT)Why `oi_change` does not apply to this symbol.
computed_metrics_not_applicable.liquidations_cumulativeWhy `liquidations_cumulative` does not apply to this symbol.
computed_metrics_not_applicable.liquidations_big_small_ratioWhy `liquidations_big_small_ratio` does not apply to this symbol.
computed_metrics_not_applicable.funding_cumulativeWhy `funding_cumulative` does not apply to this symbol.
computed_metrics_not_applicable.indicatorsWhy `indicators` does not apply to this symbol.
computed_metrics_not_applicable.trades_kline_futuresWhy `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"
ChampTypeDescription
symbolstringL’actif interrogé — dans l’enveloppe, à côté de data.
asset_classstringcrypto ou stablecoin.
feeds_active_last_24hobjectLes 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_availablearrayLes métriques calculables : tous leurs flux d’entrée sont présents.
computed_metrics_blockedobjectLes 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_applicableobjectSur un stablecoin : chaque métrique dérivée du marché à terme, avec sa raison. C’est voulu, pas une panne.
feeds_not_applicablearraySur un stablecoin : les flux futures, qui ne sont pas sondés plutôt que d’être déclarés faux.
stablecoin_notestringSur 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

GET/v1/limitsdata_type · limitsRéférence complète
Les 18 champs de cette route (d’après le contrat)
planYour plan: `free`, `traders`, `financial`, `startup` or `enterprise` (`legacy` for an internal unmetered key: every limit below is then unset).
familiesData 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`.
historyHistory window per timeframe, one object per timeframe the API serves.
history.timeframeThe timeframe the window applies to.
history.window_ssecondsHow far back this timeframe may be read, in seconds, measured from now; `null` = unlimited. Beyond it: 403 `history_depth`.
trades_window_ssecondsHow 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_countcountHow 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`).
rateThe per-minute rate, as a token bucket; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`rate` policy).
rate.requests_per_minutecountRequests per minute of your plan (the bucket refills at this pace).
rate.burst_countcountCapacity of the bucket: requests you can send at once.
rate.refill_ssecondsSeconds to refill the bucket from empty.
rate.remaining_countcountRequests left right now (after this one).
rate.reset_ssecondsSeconds until fully restored.
quotaThe 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_countcountRequests included per calendar month.
quota.month_length_ssecondsLength of the current calendar month, in seconds.
quota.remaining_countcountRequests left right now (after this one).
quota.reset_ssecondsSeconds 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"
ChampTypeDescription
planstring | nullVotre offre : free, traders, financial, startup ou enterprise.
familiesstring[] | nullLes 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_sstring / integer | nullUne entrée par timeframe : jusqu’où il peut être lu, en secondes (window_s) ; 0 = hors de votre offre, null = sans limite.
trades_window_sinteger | nullJusqu’où les trades individuels (/v1/trades/*) peuvent être lus, en secondes ; 0 = hors de votre offre (famille trades), null = sans limite.
liquidations_events_countinteger | nullCombien des liquidations individuelles les plus récentes /v1/liquidations/events peut rendre.
rateobject | nullLe 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.
quotaobject | nullLe quota mensuel : monthly_count, month_length_s, remaining_count, reset_s (jusqu’au 1er du mois suivant, 00:00 UTC).