API de données on-chain
Les métriques on-chain de Bitcoin et d’Ethereum dans une seule API : MVRV, NVT, adresses actives, état du réseau et du mempool, offre d’ETH, gas, staking, DeFi et ratios. Plus besoin de brancher séparément un fournisseur d’analyse on-chain, un nœud Ethereum et un explorateur de blocs : une clé, un format, toutes les données.
Ce que dit la chaîne, indépendamment du carnet d’ordres : l’état du réseau Bitcoin, sa valorisation rapportée à l’usage, et les huit familles Ethereum. Toutes ces routes portent sur tout le marché : elles n’acceptent pas de ?symbol=.
#Données on-chain pour agents IA et LLM
« Le MVRV de Bitcoin est-il en zone d’euphorie ? », « Combien d’ETH est staké ? », « Ethereum est-il déflationniste cette semaine ? » : un agent IA lit les réseaux Bitcoin et Ethereum par l’outil MCP get_onchain_data, sans nœud ni explorateur de blocs.
{
"name": "get_onchain_data",
"arguments": {
"fields": ["btc_mvrv", "eth_staking", "eth_deflation"]
}
}- Pour le LLM : les métriques on-chain décrivent un réseau entier et ne prennent pas de paire ; un MVRV au-dessus de 3,5 a historiquement signifié l’euphorie, sous 1 un marché sous son coût moyen — une lecture, pas un signal.
- Pour les développeurs : chaque métrique est une route (
/v1/btc/mvrv,/v1/btc/mempool…), donc un outil pour votre propre agent IA quand vous le construisez en tool calling. - Où ça tourne : Claude, ChatGPT, Cursor et tout client MCP, y compris les frameworks d’agents qui parlent MCP, comme LangChain ou n8n.
Branchez votre agent IA avec le guide du serveur MCP, ou apprenez-lui BytNode avec les Agent Skills open source.
#Cadence et portée
Ces familles ne se rafraîchissent pas au rythme du marché, et les interroger chaque minute ne sert à rien.
- Le réseau Bitcoin : le mempool et les frais bougent chaque minute, l’état du réseau toutes les cinq minutes, le minage toutes les dix.
- La valorisation on-chain de Bitcoin : un point par jour, daté par
timeà minuit UTC. - Ethereum : quelques minutes pour l’offre, le gas et la DeFi ; une heure pour le staking. L’historique est quotidien.
Chaque route a son historique sous /history, avec une limit. Aucune n’accepte de symbole : passer ?symbol=BTCUSDT est refusé plutôt qu’ignoré, pour éviter qu’un chiffre de tout le marché soit attribué à un seul actif.
#Le réseau Bitcoin
Les 14 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
difficulty | difficulty units | Network mining difficulty (on a difficulty-adjustment row, the difficulty after it). |
block_height | block height | Height of a block: the latest block on `/v1/btc/network`; the reward sample in `latest_reward`; the block where a difficulty adjustment took effect on `/v1/btc/mining/history?dataset=difficulty`. |
progress_pct | percent (58.5 = 58.5 %) | Progress through the current 2016-block difficulty period. |
difficulty_change_pct | percent (58.5 = 58.5 %) | Expected difficulty change at the next adjustment (`/v1/btc/mining/history?dataset=difficulty`: the change applied at that adjustment). |
block_time | Average block time over 24 h (`avg_24h_s`), its deviation from the 600 s target, and a `label`. | |
block_time.avg_24h_s | seconds | Average block time over 24 hours. |
block_time.deviation_s | seconds | avg_24h_s - 600. |
block_time.label | 24 h block time versus the 600 s target: `slow` (> +30 s), `fast` (< -30 s) or `on_target`. | |
next_adjustment | Next difficulty adjustment: progress, expected change, date, remaining blocks and time. | |
next_adjustment.estimated_retarget_at | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Estimated instant of the next adjustment. |
next_adjustment.remaining_block_count | count | Blocks left before the adjustment. |
next_adjustment.next_retarget_block_height | block height | Height of the block of the next adjustment. |
next_adjustment.remaining_s | seconds | Estimated time left before the adjustment, seconds. |
| Champ | Type | Description |
|---|---|---|
block_height | integer | Hauteur du dernier bloc. |
difficulty | float | Difficulté actuelle. |
progress_pct | float | Avancement dans la période d’ajustement en cours, en pourcentage. |
difficulty_change_pct | float | Variation projetée au prochain ajustement, en pourcentage. |
block_time | object | Le temps moyen entre blocs et son écart à la cible de dix minutes. |
Les 10 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
tx_count | count | Unconfirmed transactions in the mempool. |
vsize | virtual bytes | Total virtual size of the mempool. |
total_fee_sats | satoshis | Total fees waiting in the mempool. |
fee_histogram | `[fee_rate, vsize]` pairs: how much virtual size (virtual bytes) waits at each fee rate (sat/vB). | |
trend | Mempool size change over 1 h, 4 h and 24 h, and its `label` (`filling`, `draining`, `stable`). | |
trend.vsize_change_1h | virtual bytes | Mempool size change over 1 hour. |
trend.vsize_change_4h | virtual bytes | Mempool size change over 4 hours. |
trend.vsize_change_24h | virtual bytes | Mempool size change over 24 hours. |
trend.label | `filling` (vsize grew over 1 h), `draining` (shrank) or `stable`. |
| Champ | Type | Description |
|---|---|---|
tx_count | integer | Transactions en attente. |
vsize | integer | Poids total en attente. |
total_fee_sats | integer | Frais cumulés des transactions en attente, en satoshis. |
fee_histogram | array | La répartition des frais proposés, par palier. |
trend | object | Un signal de remplissage : filling, draining ou stable. |
Les 14 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
fastest_fee_sat_vb | satoshis per virtual byte (sat/vB) | Fee rate for the next block. |
half_hour_fee_sat_vb | satoshis per virtual byte (sat/vB) | Fee rate for confirmation within ~30 minutes. |
hour_fee_sat_vb | satoshis per virtual byte (sat/vB) | Fee rate for confirmation within ~1 hour. |
economy_fee_sat_vb | satoshis per virtual byte (sat/vB) | Fee rate for a low-priority confirmation. |
minimum_fee_sat_vb | satoshis per virtual byte (sat/vB) | Minimum relay fee rate. |
fastest_fee_precise_sat_vb | satoshis per virtual byte (sat/vB) | `fastest_fee_sat_vb`, unrounded. |
half_hour_fee_precise_sat_vb | satoshis per virtual byte (sat/vB) | `half_hour_fee_sat_vb`, unrounded. |
hour_fee_precise_sat_vb | satoshis per virtual byte (sat/vB) | `hour_fee_sat_vb`, unrounded. |
economy_fee_precise_sat_vb | satoshis per virtual byte (sat/vB) | `economy_fee_sat_vb`, unrounded. |
minimum_fee_precise_sat_vb | satoshis per virtual byte (sat/vB) | `minimum_fee_sat_vb`, unrounded. |
fee_pressure | `fastest_economy_ratio` = fastest / economy fee rate, and its `label`: `normal` (<= 2), `elevated` (> 2), `congested` (> 5). | |
fee_pressure.fastest_economy_ratio | fastest / economy | Fastest fee rate divided by the economy fee rate (a quotient). |
fee_pressure.label | Fee pressure: `normal` (ratio <= 2), `elevated` (> 2) or `congested` (> 5). |
| Champ | Type | Description |
|---|---|---|
fastest_fee_sat_vb / half_hour_fee_sat_vb / hour_fee_sat_vb / economy_fee_sat_vb / minimum_fee_sat_vb | integer | Frais recommandés par niveau de priorité, en satoshis par octet virtuel, arrondis à l’entier. |
fastest_fee_precise_sat_vb / half_hour_fee_precise_sat_vb / hour_fee_precise_sat_vb / economy_fee_precise_sat_vb / minimum_fee_precise_sat_vb | float | Les mêmes, en valeurs fractionnaires : utile pour un service qui construit des transactions. |
fee_pressure | object | Une lecture qualitative de la congestion. |
/v1/btc/fees/history rend par défaut une ligne par lecture de la source (une par minute) ; ?timeframe=1h, 4h ou 1d garde la dernière lecture de chaque bucket clos, datée au début du bucket.
Les 19 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
concentration | Mining pool concentration over the last period. | |
concentration.total_block_count | count | Blocks in the period. |
concentration.top1_share_pct | percent (58.5 = 58.5 %) | Share of blocks mined by the largest pool. |
concentration.top3_share_pct | percent (58.5 = 58.5 %) | Share of blocks mined by the three largest pools. |
concentration.pool_count | count | Number of pools that mined at least one block. |
concentration.label | Centralisation risk from the top-3 pool share: `healthy` (<= 40 %), `moderate` (> 40 %), `high_risk` (> 50 %). | |
latest_reward | Average block reward (subsidy + fees) of the latest blocks, in satoshis and USD. | |
latest_reward.time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
latest_reward.block_height | block height | Height of a block: the latest block on `/v1/btc/network`; the reward sample in `latest_reward`; the block where a difficulty adjustment took effect on `/v1/btc/mining/history?dataset=difficulty`. |
latest_reward.avg_reward_sats | satoshis | Average block reward. |
latest_reward.avg_reward_usd | USD | Average block reward in USD. |
latest_reward.btc_price_usd | USD | BTC price in USD at the time of the row: the current price on `/v1/eth/price-btc`, the price at the block of the reward in `latest_reward` of `/v1/btc/mining` (used for `avg_reward_usd`). |
pools | Pools ranked by blocks mined: `name`, `slug`, `block_count`, `rank`, `share_pct`. | |
pools.name | Human-readable name. | |
pools.slug | Stable identifier. | |
pools.block_count | count | Blocks mined over the period. |
pools.rank | rank (1 = first) | Rank. |
pools.share_pct | percent (58.5 = 58.5 %) | Share of blocks. |
Concentration des pools, récompenses de bloc et difficulté. L’historique accepte un paramètre dataset pour choisir entre concentration, rewards, difficulty et fee_rates.
| Champ | Type | Description |
|---|---|---|
concentration | object | top1_share_pct et top3_share_pct : la part des blocs minés par le premier pool et par les trois premiers, en pourcentage. Chaque pool de la liste porte son propre share_pct. |
latest_reward | object | La dernière récompense de bloc observée, en sats et en USD, avec le cours du BTC à ce bloc (btc_price_usd, block_height, et l’heure du bloc dans time) — pas le cours actuel. |
#Valorisation on-chain de Bitcoin
Quatre métriques qui rapportent le prix à l’usage réel de la chaîne. Chacune expose une label : un repère de lecture, jamais un signal d’exécution.
Les 4 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The day the value refers to, at midnight UTC. |
mvrv | dimensionless ratio | Market value / realised value. |
label | `undervalued` (<= 1), `fair` (> 1), `elevated` (> 2.5), `overvalued` (> 3.5). | |
change_30d_pct | percent (58.5 = 58.5 %) | Relative change of the value over 30 days, percent. |
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/btc/mvrv"Le MVRV compare la capitalisation à la valeur à laquelle les pièces ont bougé pour la dernière fois. Au-dessus de 3,5, l’histoire parle d’euphorie ; en dessous de 1, le marché se traite sous son coût d’acquisition moyen.
Les 4 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The day the value refers to, at midnight UTC. |
nvt | dimensionless ratio | Market cap / on-chain transaction volume of the day (NVT ratio), change returned to the sender excluded. |
nvt_signal | dimensionless ratio | NVT Signal: market cap of the day / 90-day average of the on-chain transaction volume in USD. `null` with less than 90 days of data. |
label | Zone of the NVT Signal against its own last 730 days (share of those days when it was lower): `undervalued` (below 25 %), `fair` (from 25 %), `overvalued` (from 75 %), `bubble` (from 95 %). `null` with less than 365 days of NVT Signal. |
Le NVT rapporte la capitalisation au volume des transactions on-chain : un ratio cours/chiffre d’affaires appliqué à un réseau. Il est dérivé à la demande, et servi avec nvt_signal, sa version lissée sur quatre-vingt-dix jours, moins bruitée.
Les 6 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The day the value refers to, at midnight UTC. |
active_addresses | count | Addresses active on the day. |
active_addresses_sma_7d | count | 7-day simple moving average of active_addresses. |
active_addresses_sma_30d | count | 30-day simple moving average of active_addresses. |
sma_7d_vs_30d_pct | percent (58.5 = 58.5 %) | (7-day simple moving average - 30-day simple moving average) / 30-day average, percent. |
label | 7-day vs 30-day average: `accelerating` (> +5 %), `decelerating` (< -5 %) or `stable`. |
Le nombre d’adresses actives, avec ses moyennes à sept et trente jours et le momentum qui les compare. C’est la mesure la plus directe de l’usage.
Les 4 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The day the value refers to, at midnight UTC. |
revenue_per_difficulty_usd | USD per unit of difficulty | Miners' daily revenue (USD) divided by the network difficulty of the day: revenue per unit of work. Read it against its 30-day average. |
revenue_per_difficulty_sma_30d_usd | USD per unit of difficulty | 30-day simple moving average of revenue_per_difficulty_usd. |
label | `healthy` (at or above its 30-day average), `stress` (below it), `capitulation` (below 70 % of it — historically near BTC bottoms). |
Le rapport entre les revenus des mineurs et la difficulté. Quand il s’effondre, les mineurs les moins efficaces vendent leurs réserves, créant une pression vendeuse qui n’apparaît pas dans le carnet d’ordres.
#On-chain Ethereum
Huit familles, toutes sur tout le marché, toutes avec un historique quotidien.
Les 9 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
execution_issuance_cumulative | ETH | Cumulative execution-layer issuance (genesis + proof-of-work rewards before the Merge), as published by Etherscan. NOT the supply: `total_supply` = this + `consensus_rewards_cumulative` - `burnt_fees_cumulative` (was `eth_supply`). |
consensus_rewards_cumulative | ETH | Cumulative consensus-layer issuance (staking rewards) since the Beacon Chain launch. NOT the ETH staked: see `total_staked` on `/v1/eth/staking`. |
burnt_fees_cumulative | ETH | ETH burnt since EIP-1559 (cumulative). |
withdrawn_cumulative | ETH | ETH withdrawn from staking (cumulative). |
total_supply | coins | Total coins issued (circulating + locked), net of burns. |
burn_24h | ETH | ETH burnt over the last 24 h. |
net_issuance_24h | ETH | New ETH issued minus ETH burnt over 24 h. Negative = deflationary. |
label | `deflationary` (24 h net issuance < 0), `inflationary` (> 0) or `neutral`. |
| Champ | Type | Description |
|---|---|---|
execution_issuance_cumulative | float | ETH émis sur la couche d’exécution depuis la genèse (allocation de genèse comprise), en ETH — pas l’offre en circulation. L’offre vaut total_supply = execution_issuance_cumulative + consensus_rewards_cumulative − burnt_fees_cumulative. |
consensus_rewards_cumulative | float | Émission cumulée de la couche de consensus. Ce n’est pas la quantité stakée : celle-ci est servie par /v1/eth/staking, sous total_staked. |
burnt_fees_cumulative | float | Total brûlé depuis l’origine. |
withdrawn_cumulative | float | ETH retirés du staking, en cumul. |
total_supply | float | Offre totale d’ETH : execution_issuance_cumulative + consensus_rewards_cumulative − burnt_fees_cumulative. |
burn_24h | float | Brûlé sur les dernières 24 h. |
net_issuance_24h | float | Émission moins brûlage. Négative, l’offre se contracte. |
label | string | Une lecture qualitative de l’émission nette. |
Les 4 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
base_fee_gwei | gwei | EIP-1559 base fee (burnt). |
gas_used_ratio | fraction (0.585 = 58.5 %) | Block gas used / gas target over recent blocks. |
label | Congestion: `low` (gas_used_ratio < 0.5), `normal`, or `high` (> 0.8). |
Les 7 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
base_fee_gwei | gwei | EIP-1559 base fee (burnt). |
gas_used_ratio | fraction (0.585 = 58.5 %) | Block gas used / gas target over recent blocks. |
gas_sma_7d_gwei | gwei | 7-day simple moving average of the base fee. |
gas_sma_30d_gwei | gwei | 30-day simple moving average of the base fee. |
sma_7d_vs_30d_pct | percent (58.5 = 58.5 %) | (7-day simple moving average - 30-day simple moving average) / 30-day average, percent. |
label | `high_demand` (gas_used_ratio > 0.8 and sma_7d_vs_30d_pct > 0), `low_demand` (< 0.5 and sma_7d_vs_30d_pct < 0), otherwise `normal`. |
Le prix du gas, sa congestion, puis son momentum : la valeur actuelle comparée à ses moyennes à sept et trente jours, avec le régime qui en découle. Le gas est la mesure la plus réactive de la demande de blocs sur Ethereum.
Les 5 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
staking_ratio | fraction (0.585 = 58.5 %) | Share of the ETH supply staked. |
total_staked | ETH | ETH staked (beacon chain). |
total_supply | coins | Total coins issued (circulating + locked), net of burns. |
apr_pct | percent (58.5 = 58.5 %) | Annualised rate in percent. |
| Champ | Type | Description |
|---|---|---|
staking_ratio | float | Part de l’offre immobilisée, en fraction : 0.28 signifie 28 %. |
total_staked / total_supply | float | L’ETH réellement staké (la somme des soldes des validateurs) et l’offre totale, les deux termes du ratio. |
apr_pct | float | null | Rendement annuel du staking, en pourcentage : 3.1 signifie 3,1 % par an. Calculé de la même façon sur la valeur courante et dans l’historique. |
Les 5 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
burn_24h | ETH | ETH burnt over the last 24 h. |
net_issuance_24h | ETH | New ETH issued minus ETH burnt over 24 h. Negative = deflationary. |
net_issuance_annualized_pct | percent (58.5 = 58.5 %) | Net issuance annualised, as a percent of supply. Negative = the supply shrinks. |
label | `deflationary` (24 h net issuance < 0) or `inflationary`. |
Le brûlage face à l’émission, annualisés, avec la zone qui en résulte. C’est la lecture monétaire d’Ethereum : à forte activité, le réseau détruit plus qu’il n’émet.
Les 8 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
tvl_usd | USD | Total value locked in Ethereum DeFi. |
dex_volume_24h_usd | USD | DEX volume over 24 h. |
dex_volume_7d_usd | USD | DEX volume over 7 days. |
eth_market_cap_usd | USD | ETH market capitalisation. |
defi_health_ratio | fraction (0.585 = 58.5 %) | tvl_usd / eth_market_cap_usd. |
defi_health_change_30d_pct | percent (58.5 = 58.5 %) | Relative change of `defi_health_ratio` (TVL / ETH market cap) over 30 days, percent. |
label | 30-day trend of `defi_health_ratio` (TVL / ETH market cap): `growing`, `declining` or `stable`. |
| Champ | Type | Description |
|---|---|---|
tvl_usd | float | Valeur totale immobilisée dans la DeFi Ethereum. |
dex_volume_24h_usd / dex_volume_7d_usd | float | Volume échangé sur les places décentralisées. |
eth_market_cap_usd | float | Capitalisation de l’ETH. |
defi_health_ratio | float | Le rapport entre l’activité DeFi et la capitalisation. |
defi_health_change_30d_pct | float | La tendance sur trente jours de la TVL, en pourcentage. |
Les 5 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
staking_ratio | fraction (0.585 = 58.5 %) | Share of the ETH supply staked. |
net_issuance_annualized_pct | percent (58.5 = 58.5 %) | Net issuance annualised, as a percent of supply. Negative = the supply shrinks. |
squeeze_index | score from 0 to 100 | Supply squeeze index: combines the staked share and net issuance. Higher = less liquid ETH available. |
label | `low` (< 33), `moderate` (>= 33), `high` (>= 66). |
Un indice composite qui croise le taux d’immobilisation et la contraction de l’offre : plus il monte, plus l’offre disponible se raréfie.
Les 6 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Point-in-time value: the instant of the measurement (when the source was read). |
eth_price_usd | USD | ETH price. |
btc_price_usd | USD | BTC price in USD at the time of the row: the current price on `/v1/eth/price-btc`, the price at the block of the reward in `latest_reward` of `/v1/btc/mining` (used for `avg_reward_usd`). |
eth_price_btc | BTC | ETH price in BTC (ETH price / BTC price). |
change_7d_pct | percent (58.5 = 58.5 %) | Relative change of the value over 7 days, percent. |
label | 7-day momentum of ETH/BTC: `eth_outperform` (> 0), `btc_outperform` (< 0) or `neutral`. |
Le ratio ETH/BTC, sa capitalisation relative et son momentum sur sept jours : la mesure de la rotation entre les deux actifs de référence.
Une dépendance à connaître
Les familles supply, gas, deflation et squeeze viennent d'une source amont unique ; tant qu’elle est indisponible, elles répondent vide avec la raison no_api_key dans le snapshot. staking combine plusieurs sources : le montant staké vient de l'API publique de la Beacon chain et ne demande aucune clé ; quand il date de plus d'1,5 fois son rythme de collecte, staking_ratio et l'indice squeeze valent null plutôt qu'une valeur périmée. defi et price-btc restent servis.