Conventions de l’API pour le code et les LLM
Les règles qui valent pour toutes les familles. Elles expliquent pourquoi deux appels au même endpoint peuvent différer, pourquoi un chiffre ne se compare pas à un autre, et ce que signifie l’absence d’une place de marché dans un agrégat.
Ces règles valent sur tous les canaux : REST, le flux WebSocket, et le serveur MCP par lequel les agents IA lisent les mêmes données de marché, sous les mêmes noms et unités.
#Symboles
104 actifs sont suivis : 102 perpétuels USDT-M et deux stablecoins, ces derniers en spot uniquement. La liste vivante est servie par /v1/symbols, et c’est elle qui fait foi.
| Symbole | Actif | Marchés collectés |
|---|---|---|
BTCUSDT | Bitcoin | spot + perpetual |
ETHUSDT | Ethereum | spot + perpetual |
SOLUSDT | Solana | spot + perpetual |
XRPUSDT | XRP | spot + perpetual |
DOGEUSDT | Dogecoin | spot + perpetual |
BNBUSDT | BNB | spot + perpetual |
TRXUSDT | TRON | spot + perpetual |
SUIUSDT | Sui | spot + perpetual |
HYPEUSDT | HYPE | spot + perpetual |
XLMUSDT | Stellar | spot + perpetual |
XMRUSDT | Monero | spot + perpetual |
LINKUSDT | Chainlink | spot + perpetual |
ADAUSDT | Cardano | spot + perpetual |
LTCUSDT | Litecoin | spot + perpetual |
UNIUSDT | Uniswap | spot + perpetual |
GRAMUSDT | Gram (formerly Toncoin) | spot + perpetual |
AVAXUSDT | Avalanche | spot + perpetual |
HBARUSDT | Hedera | spot + perpetual |
NEARUSDT | NEAR Protocol | spot + perpetual |
TAOUSDT | Bittensor | spot + perpetual |
ZECUSDT | Zcash | spot + perpetual |
BCHUSDT | Bitcoin Cash | spot + perpetual |
CCUSDT | Canton | spot + perpetual |
QNTUSDT | Quant | spot + perpetual |
ENAUSDT | Ethena | spot + perpetual |
AAVEUSDT | Aave | spot + perpetual |
ONDOUSDT | Ondo | spot + perpetual |
PUMPUSDT | Pump.fun | spot + perpetual |
WLDUSDT | Worldcoin | spot + perpetual |
ASTERUSDT | Aster | spot + perpetual |
DOTUSDT | Polkadot | spot + perpetual |
WLFIUSDT | World Liberty Financial | spot + perpetual |
MORPHOUSDT | Morpho | spot + perpetual |
SKYUSDT | Sky (formerly Maker) | spot + perpetual |
ETCUSDT | Ethereum Classic | spot + perpetual |
ICPUSDT | Internet Computer | spot + perpetual |
ARBUSDT | Arbitrum | spot + perpetual |
VVVUSDT | Venice Token | spot + perpetual |
JSTUSDT | JUST | spot + perpetual |
ALGOUSDT | Algorand | spot + perpetual |
KASUSDT | Kaspa | spot + perpetual |
POLUSDT | Polygon (formerly MATIC) | spot + perpetual |
JUPUSDT | Jupiter | spot + perpetual |
RENDERUSDT | Render | spot + perpetual |
ATOMUSDT | Cosmos | spot + perpetual |
FILUSDT | Filecoin | spot + perpetual |
INJUSDT | Injective | spot + perpetual |
AEROUSDT | Aerodrome Finance | spot + perpetual |
LITUSDT | Lighter | spot + perpetual |
ZROUSDT | LayerZero | spot + perpetual |
APTUSDT | Aptos | spot + perpetual |
CAKEUSDT | PancakeSwap | spot + perpetual |
STXUSDT | Stacks | spot + perpetual |
STABLEUSDT | Stable | spot + perpetual |
AKEUSDT | Akedo | spot + perpetual |
NIGHTUSDT | Midnight | spot + perpetual |
DASHUSDT | Dash | spot + perpetual |
TIAUSDT | Celestia | spot + perpetual |
PYTHUSDT | Pyth Network | spot + perpetual |
VETUSDT | VeChain | spot + perpetual |
CRVUSDT | Curve DAO | spot + perpetual |
TRUMPUSDT | Official Trump | spot + perpetual |
STRKUSDT | Starknet | spot + perpetual |
PENGUUSDT | Pudgy Penguins | spot + perpetual |
FETUSDT | Artificial Superintelligence Alliance | spot + perpetual |
VIRTUALUSDT | Virtuals Protocol | spot + perpetual |
GRASSUSDT | Grass | spot + perpetual |
SEIUSDT | Sei | spot + perpetual |
BSVUSDT | Bitcoin SV | spot + perpetual |
XPLUSDT | Plasma | spot + perpetual |
PENDLEUSDT | Pendle | spot + perpetual |
FFUSDT | Falcon Finance | spot + perpetual |
SPXUSDT | SPX6900 | spot + perpetual |
XTZUSDT | Tezos | spot + perpetual |
LDOUSDT | Lido DAO | spot + perpetual |
SHIBUSDT | Shiba Inu | spot + perpetual |
PEPEUSDT | Pepe | spot + perpetual |
CROUSDT | Cronos | spot + perpetual |
MUSDT | MemeCore | spot + perpetual |
MNTUSDT | Mantle | spot + perpetual |
ETHFIUSDT | Ether.fi | spot + perpetual |
RAYUSDT | Raydium | spot + perpetual |
SUNUSDT | Sun | spot + perpetual |
PIEVERSEUSDT | Pieverse | spot + perpetual |
KITEUSDT | Kite | spot + perpetual |
IMXUSDT | Immutable | spot + perpetual |
MONUSDT | Monad | spot + perpetual |
OPUSDT | Optimism | spot + perpetual |
CFXUSDT | Conflux | spot + perpetual |
LUNCUSDT | Terra Luna Classic | spot + perpetual |
GRTUSDT | The Graph | spot + perpetual |
KMNOUSDT | Kamino | spot + perpetual |
CVXUSDT | Convex Finance | spot + perpetual |
JTOUSDT | Jito | spot + perpetual |
KAIAUSDT | Kaia | spot + perpetual |
ARUSDT | Arweave | spot + perpetual |
BATUSDT | Basic Attention Token | spot + perpetual |
ENSUSDT | Ethereum Name Service | spot + perpetual |
COMPUSDT | Compound | spot + perpetual |
SYRUPUSDT | Maple Finance | spot + perpetual |
JASMYUSDT | JasmyCoin | spot + perpetual |
RUNEUSDT | THORChain | spot + perpetual |
USDCUSDT | USDC | spot |
USDTUSDC | USDT | spot |
symbol est obligatoire
Sur toutes les routes propres à un actif, dans n’importe quelle casse (btcusdt fonctionne ; l’enveloppe rend la forme canonique BTCUSDT, et asset et series suivent la même règle). Absent, la requête renvoie 422 ; inconnu ou désactivé, 422 avec la liste des valeurs acceptées. Il n’y a ni symbole par défaut ni repli : servir Bitcoin à qui n’a rien demandé produirait un chiffre juste attribué au mauvais actif.
Les données de tout le marché, au contraire, n’acceptent aucun symbole : Fear & Greed, marché global, macro, ETF, réseau Bitcoin, on-chain BTC et ETH. Les options se ciblent avec ?asset=BTC ou ?asset=ETH.
#Unités de temps
Sur la plupart des routes par intervalles, sept valeurs :
1m5m15m30m1h4h1d
Les bougies (/v1/klines) et les indicateurs techniques en acceptent une huitième, la semaine (qui commence le lundi à 00:00 UTC), parce qu’ils sont construits directement sur les bougies :
1m5m15m30m1h4h1d1w
Les exceptions : les routes d’options refusent 1m (leurs instantanés arrivent environ une fois par minute), les instruments macro intrajournaliers refusent 30m, et le pas facultatif de /v1/btc/fees/history et /v1/global/history vaut 1h, 4h ou 1d. Le contrat donne à chaque route sa liste exacte (un enum), et le catalogue de la famille (/v1/macro/intraday/series) les unités de temps de chaque instrument.
Une valeur hors liste renvoie 422 invalid_timeframe avec les valeurs acceptées, jamais un repli silencieux sur une autre unité de temps. Toute erreur de validation est un 422, corps de POST /v1/indicators et historiques d’options compris. Testez error.code : il dit quel paramètre est en cause. Comme symbol, timeframe et order ignorent la casse (1H vaut 1h), sauf 1M : ailleurs un mois, il est refusé ici, 1m étant une minute.
#Agrégation multi-places
Les métriques multi-places arrivent déjà fusionnées : c’est le contrat de la plateforme, et la raison pour laquelle plusieurs intégrations deviennent une seule. Trois règles de fusion, selon la nature de la grandeur :
| Nature | Type | Description |
|---|---|---|
sum | additive | Volumes, intérêt ouvert, nombre de transactions, liquidations, profondeur du carnet. Une place manquante rend mécaniquement le chiffre trop bas. |
open-interest-weighted average | rates and prices | Funding et base. La place qui porte le plus de positions pèse le plus, et c’est ce qui rend le composite représentatif. |
volume-weighted average | average prices | Prix moyens. Le poids naturel d’un prix moyen est le volume qui l’a produit. |
Le paramètre exchange n’existe sur aucune route : le passer renvoie 422.
#Bougies closes et période en cours
Toute route qui sert une donnée découpée en fenêtres porte un booléen is_closed sur chaque ligne, que vous l’ayez demandé ou non : bougies, bougies de trades, CVD, ratio achat/vente, taille des trades, grosses/petites liquidations, carnet, spreads entre places — et chaque ligne de chaque route /history (basis, open interest, funding, liquidations, macro, on-chain…). Leur dernière valeur est le dernier bucket CLOS de timeframe (obligatoire). Une dernière valeur calculée sur une fenêtre GLISSANTE (liquidations cumulées, variation d’open interest, funding cumulé, variation d’open interest des options) est toujours définitive et ne porte pas is_closed : time est la fin de sa fenêtre, window_start_at et window_s en donnent le début et la durée.
| Valeur | Type | Description |
|---|---|---|
true | boolean | La valeur est définitive : BytNode ne la recalculera pas, elle peut être stockée, sommée, comparée à un graphique. Une fenêtre multi-places se clôt dès que toutes les sources attendues l’ont livrée, et au plus tard max(20 s, 1 % de sa durée) après sa fin ; elle est alors figée. Le CVD attend plus longtemps : il se clôt 90 s après la fin de sa fenêtre. Le carnet est une photo prise à la fin de chaque bucket : toute ligne servie est déjà définitive. Une source qui révise ses propres chiffres (macro, on-chain) peut encore republier une valeur close. |
false | boolean | La valeur est provisoire. Deux appels successifs peuvent renvoyer des chiffres différents pour la même ligne. |
Par défaut, seules les fenêtres closes sont servies. Pour voir la période en cours, ajoutez ?live=1 :
# The latest CLOSED hourly candle: its value will not move again.
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h"
# The candle IN PROGRESS: provisional, flagged is_closed: false.
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h&live=1"Ce qu’il faut savoir de ?live=1
- C’est facultatif. Sans elle, la réponse est strictement celle d’avant.
- Uniquement sur les routes de dernière valeur qui le déclarent :
/v1/klines,/v1/cvd,/v1/trades-kline(et leurs variantes/spotet/futures),/v1/funding/rateet/v1/spread/interexchange; ailleurs, c’est un paramètre inconnu (422). Les routes/historyne servent que des fenêtres closes, par définition. - Jamais de
null. Si la période en cours n’a encore rien reçu (un marché calme), c’est la dernière fenêtre close qui est renvoyée à la place. - La valeur ne saute pas à la clôture. Provisoire et définitive sortent de la même définition : quand la période se clôt, la ligne se fige sur le chiffre qu’elle affichait.
Fraîcheur atteignable : environ deux secondes sur les transactions, les bougies, le CVD et les écarts. Le carnet d’ordres n’a pas de période en cours : chaque ligne est la photo d’une minute close, live n’y est donc pas accepté.
#Unités et échelles
Une proportion ne s’écrit jamais de deux façons. Le suffixe d’un champ donne son échelle, et la règle vaut dans toutes les familles, du cœur de marché aux satellites :
| Suffixe | Type | Description |
|---|---|---|
…_pct | percentage | Un pourcentage : 58.5 signifie 58,5 %. basis_pct, oi_change_pct, rate_pct, apr_pct. |
…_ratio | quotient | Un quotient sans dimension. Une part d’un tout est une fraction : 0.585 signifie 58,5 % (buy_ratio, staking_ratio). Un quotient de deux grandeurs peut dépasser 1 ou être signé : put_call_ratio 1.2 = 1,2 put par call, imbalance_ratio de −1 à 1. |
…_bps | basis points | Des points de base : 1 pb vaut 0,01 %. premium_bps, max_spread_bps. |
#Horodatages et ordre
- Les horodatages des données sont en ISO 8601, en UTC, avec le suffixe
Zet trois chiffres fixes de millisecondes :2026-08-29T11:38:00.000Z.timeest TOUJOURS dans ce format, séries quotidiennes comprises (un jour est daté à minuit UTC) et il n’y a pas de clédateà côté ; une date seule (2026-08-29) n’apparaît que dans les clés qui désignent un jour métier, commefiled_dateouoldest_input_date.timesuit l’une de deux règles, et la référence de chaque route dit laquelle : sur une série découpée en buckets (bougies, CVD, carnet par bucket, funding par période de 8 h), c’est le début du bucket, jamais sa fin ; sur une valeur ponctuelle (dernière valeur, fenêtre glissante, prévision, composite), c’est l’instant auquel la valeur se rapporte — la fin d’une fenêtre glissante, le règlement que vise une prévision, l’entrée la plus récente d’un composite (qui donne aussioldest_input_date). La valeur courante d’une route en buckets est son dernier bucket CLOS, daté à son début comme la première ligne de son/history:/v1/klines,/v1/cvd,/v1/buy-sell-ratio,/v1/trades/avg-size,/v1/liquidations/big-small-ratio,/v1/orderbook(toutes exigenttimeframe). L’enveloppe de/v1/options/max-pain/historyrappelleexpirysous la forme du jour d’échéance (YYYY-MM-DD), quelle que soit la forme envoyée. - Les bornes de requête (
since_ms,until_msetbefore_ms) sont en millisecondes depuis l’époque Unix.since_msetuntil_mssont inclusives (à la milliseconde),before_msest exclusive.since_ms=0veut dire le début des données. Une borne négative, unsince_mssupérieur àuntil_ms(égal lit cette milliseconde) ou supérieur ou égal àbefore_ms,until_msetbefore_msensemble, une borne en secondes, en microsecondes ou en nanosecondes, ou toute autre borne antérieure au 2009-01-03 (le premier bloc Bitcoin) rend422avant toute exécution. - Les tableaux de valeurs (la série d’un indicateur, la série interne d’un CVD) vont du plus ancien au plus récent.
- Les listes d’historique sont renvoyées du plus récent au plus ancien par défaut — la ligne la plus fraîche vient en premier —, ou du plus ancien au plus récent avec
order=asc. - La journée commence à minuit UTC : c’est l’alignement des séries quotidiennes.