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.
| 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 |
USDCUSDT | USDC | spot |
USDTUSDC | USDT | spot |
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
30met cinq d’entre eux ne sont servis qu’en1d. 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 :
| 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, 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 average | average prices | VWAP 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.
| Valeur | Type | Description |
|---|---|---|
true | boolean | La valeur est définitive et immuable. Elle ne bougera plus jamais : on peut la stocker, l’additionner, la comparer à un graphique. |
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_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
/historyne 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 nommeexchange_count, pour des raisons historiques.- la clé
coveragedu snapshot, pour ce qui est constant sur toutes les lignes : combien de places étaient attendues, et l’effet d’une absence.
{
"coverage": {
"oi_history": {
"status": "available",
"effect": "additive",
"count_field": "venue_count",
"venues_expected": 6
},
"cvd@1h": { "status": "unavailable", "reason": "pre_aggregated" }
}
}| Clé | Type | Description |
|---|---|---|
effect: additive | string | Une 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: weighted | string | Le niveau reste valable mais peut être biaisé. Ne le comparez pas à un historique calculé sur plus de places. |
venues_expected | integer | Le 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: unavailable | string | La 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ébucketdésigne le début de la fenêtre, jamais sa fin. - Les bornes de requête (
since_msetuntil_ms) sont en millisecondes depuis l’époque Unix. Une borne négative, ou unsince_mssupérieur àuntil_ms, renvoie422. - 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.