Premiers pas

Conventions

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.

#Symboles

Vingt-deux actifs sont suivis : vingt 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
USDCUSDTUSDCspot
USDTUSDCUSDTspot

symbol est obligatoire

Sur toutes les routes propres à un actif. Absent, la requête renvoie 422 ; inconnu ou désactivé, 400 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 les routes par intervalles, sept valeurs :

1m5m15m30m1h4h1d

Les indicateurs techniques en acceptent une huitième, la semaine, parce qu’ils sont calculés directement sur les bougies :

1m5m15m30m1h4h1d1w

Deux exceptions à retenir :

  • Le ratio long/short refuse 1m : aucune place ne publie de ratio de compte global à cette unité de temps.
  • Les instruments macro intrajournaliers refusent 30m et cinq d’entre eux ne sont servis qu’en 1d. Le catalogue de la famille dit lesquels.

Une valeur hors liste renvoie 422 avec les valeurs acceptées, jamais un repli silencieux sur une autre unité de temps.

#Agrégation multi-places

Aucune réponse ne nomme sa place de marché. 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, base, ratio long/short. 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 pricesVWAP et prix de référence. Le poids naturel d’un prix moyen est le volume qui l’a produit.

Une seule exception dans toute l’API : /v1/spread/interexchange nomme les places, un écart n’ayant pas de sens sans elles. Partout ailleurs le paramètre exchange n’existe pas : le passer renvoie 422.

#Bougies closes et période en cours

Six familles servent des données découpées en fenêtres : les bougies de transactions, le VWAP par fenêtre, le CVD, le carnet d’ordres agrégé, les écarts entre places et le ratio long/short. Sur celles-ci, chaque ligne porte un booléen is_closed, que vous l’ayez demandé ou non.

ValeurTypeDescription
truebooleanLa valeur est définitive et immuable. Elle ne bougera plus jamais : on peut la stocker, l’additionner, la comparer à un graphique.
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_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_KEY" \
  "https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h&live=1"

Ce qu’il faut savoir de ?live=1

  • C’est une option. Sans elle, la réponse est strictement celle d’avant.
  • Uniquement sur les routes de dernière valeur. Les routes /history ne servent que des données closes, par définition ; le paramètre y est ignoré.
  • 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, le VWAP, le CVD et les écarts ; six à dix secondes sur le carnet d’ordres ; une minute sur le ratio long/short, que les places ne publient pas plus vite.

#Couverture des sources

Comme la place n’est jamais nommée, un funding calculé sur deux places a la même forme qu’un funding calculé sur six. Deux mécanismes restituent l’information :

  • venue_count, ligne par ligne : le nombre réel pour la fenêtre concernée. Il varie d’une fenêtre à l’autre, il ne peut donc pas être un attribut global. Le funding le nomme exchange_count, pour des raisons historiques.
  • la clé coverage du snapshot, pour ce qui est constant sur toutes les lignes : combien de places étaient attendues, et l’effet d’une absence.
coverage
{
  "coverage": {
    "oi_history": {
      "status": "available",
      "effect": "additive",
      "count_field": "venue_count",
      "venues_expected": 6
    },
    "cvd@1h": { "status": "unavailable", "reason": "pre_aggregated" }
  }
}
CléTypeDescription
effect: additivestringUne place manquante rend mécaniquement le chiffre trop bas. Ne présentez jamais la baisse comme un événement de marché : dites « au moins X ».
effect: weightedstringLe niveau reste valable mais peut être biaisé. Ne le comparez pas à un historique calculé sur plus de places.
venues_expectedintegerLe dénominateur observé sur une fenêtre glissante, jamais déclaré. Il varie selon l’actif et la métrique : certains actifs ne sont pas listés partout, et toutes les places ne publient pas les liquidations.
status: unavailablestringLa couverture n’est pas connue pour ce champ : soit la place a été fusionnée à l’écriture, soit les lignes sont antérieures à la mesure. N’en concluez pas qu’elle est complète.

#Horodatages et ordre

  • Les horodatages des données sont en ISO 8601, en UTC : 2026-08-29T11:38:00+00:00. La clé bucket désigne le début de la fenêtre, jamais sa fin.
  • Les bornes de requête (since_ms et until_ms) sont en millisecondes depuis l’époque Unix. Une borne négative, ou un since_ms supérieur à until_ms, renvoie 422.
  • 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. La ligne la plus fraîche vient en premier.
  • La journée commence à minuit UTC : c’est la remise à zéro du VWAP intrajournalier, et l’alignement des séries quotidiennes.