Premiers pas

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.

SymboleActifMarchés collectés
BTCUSDTBitcoinspot + perpetual
ETHUSDTEthereumspot + perpetual
SOLUSDTSolanaspot + perpetual
XRPUSDTXRPspot + perpetual
DOGEUSDTDogecoinspot + perpetual
BNBUSDTBNBspot + perpetual
TRXUSDTTRONspot + perpetual
SUIUSDTSuispot + perpetual
HYPEUSDTHYPEspot + perpetual
XLMUSDTStellarspot + perpetual
XMRUSDTMonerospot + perpetual
LINKUSDTChainlinkspot + perpetual
ADAUSDTCardanospot + perpetual
LTCUSDTLitecoinspot + perpetual
UNIUSDTUniswapspot + perpetual
GRAMUSDTGram (formerly Toncoin)spot + perpetual
AVAXUSDTAvalanchespot + perpetual
HBARUSDTHederaspot + perpetual
NEARUSDTNEAR Protocolspot + perpetual
TAOUSDTBittensorspot + perpetual
ZECUSDTZcashspot + perpetual
BCHUSDTBitcoin Cashspot + perpetual
CCUSDTCantonspot + perpetual
QNTUSDTQuantspot + perpetual
ENAUSDTEthenaspot + perpetual
AAVEUSDTAavespot + perpetual
ONDOUSDTOndospot + perpetual
PUMPUSDTPump.funspot + perpetual
WLDUSDTWorldcoinspot + perpetual
ASTERUSDTAsterspot + perpetual
DOTUSDTPolkadotspot + perpetual
WLFIUSDTWorld Liberty Financialspot + perpetual
MORPHOUSDTMorphospot + perpetual
SKYUSDTSky (formerly Maker)spot + perpetual
ETCUSDTEthereum Classicspot + perpetual
ICPUSDTInternet Computerspot + perpetual
ARBUSDTArbitrumspot + perpetual
VVVUSDTVenice Tokenspot + perpetual
JSTUSDTJUSTspot + perpetual
ALGOUSDTAlgorandspot + perpetual
KASUSDTKaspaspot + perpetual
POLUSDTPolygon (formerly MATIC)spot + perpetual
JUPUSDTJupiterspot + perpetual
RENDERUSDTRenderspot + perpetual
ATOMUSDTCosmosspot + perpetual
FILUSDTFilecoinspot + perpetual
INJUSDTInjectivespot + perpetual
AEROUSDTAerodrome Financespot + perpetual
LITUSDTLighterspot + perpetual
ZROUSDTLayerZerospot + perpetual
APTUSDTAptosspot + perpetual
CAKEUSDTPancakeSwapspot + perpetual
STXUSDTStacksspot + perpetual
STABLEUSDTStablespot + perpetual
AKEUSDTAkedospot + perpetual
NIGHTUSDTMidnightspot + perpetual
DASHUSDTDashspot + perpetual
TIAUSDTCelestiaspot + perpetual
PYTHUSDTPyth Networkspot + perpetual
VETUSDTVeChainspot + perpetual
CRVUSDTCurve DAOspot + perpetual
TRUMPUSDTOfficial Trumpspot + perpetual
STRKUSDTStarknetspot + perpetual
PENGUUSDTPudgy Penguinsspot + perpetual
FETUSDTArtificial Superintelligence Alliancespot + perpetual
VIRTUALUSDTVirtuals Protocolspot + perpetual
GRASSUSDTGrassspot + perpetual
SEIUSDTSeispot + perpetual
BSVUSDTBitcoin SVspot + perpetual
XPLUSDTPlasmaspot + perpetual
PENDLEUSDTPendlespot + perpetual
FFUSDTFalcon Financespot + perpetual
SPXUSDTSPX6900spot + perpetual
XTZUSDTTezosspot + perpetual
LDOUSDTLido DAOspot + perpetual
SHIBUSDTShiba Inuspot + perpetual
PEPEUSDTPepespot + perpetual
CROUSDTCronosspot + perpetual
MUSDTMemeCorespot + perpetual
MNTUSDTMantlespot + perpetual
ETHFIUSDTEther.fispot + perpetual
RAYUSDTRaydiumspot + perpetual
SUNUSDTSunspot + perpetual
PIEVERSEUSDTPieversespot + perpetual
KITEUSDTKitespot + perpetual
IMXUSDTImmutablespot + perpetual
MONUSDTMonadspot + perpetual
OPUSDTOptimismspot + perpetual
CFXUSDTConfluxspot + perpetual
LUNCUSDTTerra Luna Classicspot + perpetual
GRTUSDTThe Graphspot + perpetual
KMNOUSDTKaminospot + perpetual
CVXUSDTConvex Financespot + perpetual
JTOUSDTJitospot + perpetual
KAIAUSDTKaiaspot + perpetual
ARUSDTArweavespot + perpetual
BATUSDTBasic Attention Tokenspot + perpetual
ENSUSDTEthereum Name Servicespot + perpetual
COMPUSDTCompoundspot + perpetual
SYRUPUSDTMaple Financespot + perpetual
JASMYUSDTJasmyCoinspot + perpetual
RUNEUSDTTHORChainspot + perpetual
USDCUSDTUSDCspot
USDTUSDCUSDTspot

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 :

NatureTypeDescription
sumadditiveVolumes, intérêt ouvert, nombre de transactions, liquidations, profondeur du carnet. Une place manquante rend mécaniquement le chiffre trop bas.
open-interest-weighted averagerates and pricesFunding 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 averageaverage pricesPrix 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.

ValeurTypeDescription
truebooleanLa 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.
falsebooleanLa 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 :

curl
# 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 /spot et /futures), /v1/funding/rate et /v1/spread/interexchange ; ailleurs, c’est un paramètre inconnu (422). Les routes /history ne 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 :

SuffixeTypeDescription
…_pctpercentageUn pourcentage : 58.5 signifie 58,5 %. basis_pct, oi_change_pct, rate_pct, apr_pct.
…_ratioquotientUn 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.
…_bpsbasis pointsDes 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 Z et trois chiffres fixes de millisecondes : 2026-08-29T11:38:00.000Z. time est 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, comme filed_date ou oldest_input_date. time suit 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 aussi oldest_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 exigent timeframe). L’enveloppe de /v1/options/max-pain/history rappelle expiry sous 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_ms et before_ms) sont en millisecondes depuis l’époque Unix. since_ms et until_ms sont inclusives (à la milliseconde), before_ms est exclusive. since_ms=0 veut dire le début des données. Une borne négative, un since_ms supérieur à until_ms (égal lit cette milliseconde) ou supérieur ou égal à before_ms, until_ms et before_ms ensemble, une borne en secondes, en microsecondes ou en nanosecondes, ou toute autre borne antérieure au 2009-01-03 (le premier bloc Bitcoin) rend 422 avant 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.