API de données d’options crypto
Les données de marché des options BTC et ETH agrégées sur plusieurs places : open interest, volume, ratio put/call, max pain, volatilité implicite et grecques. Une API REST et un serveur MCP au lieu d’interroger chaque plateforme et de convertir ses conventions vous-même.
Les calls et les puts sur Bitcoin et Ethereum, agrégés sur plusieurs places, normalisés en dollars et recalculés selon une seule convention. Dix-sept routes qui répondent à une question : où le marché place son risque, et à quel prix.
#Données d’options crypto pour agents IA et LLM
« Où est le max pain de BTC pour l’échéance de vendredi ? », « La volatilité implicite d’ETH monte-t-elle ? », « Que dit le ratio put/call ? » : un agent IA répond avec cette famille par l’outil MCP get_options_data, qui prend un actif plutôt qu’une paire.
{
"name": "get_options_data",
"arguments": {
"asset": "BTC",
"fields": ["options_summary", "options_put_call_ratio", "options_iv"]
}
}- Pour le LLM : le max pain est un centre de gravité statistique, pas une prévision, et seuls BTC et ETH ont des options ici :
BTCUSDTest refusé, l’actif estBTC. - Pour les développeurs :
/v1/options/summarydonne à un agent IA en tool calling toute la photo d’un actif en une requête ; l’outil MCP ajoute les chiffres de chaque échéance avecexpiries. - 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.
#Le principe
Trois choses distinguent cette famille des autres familles.
- Deux actifs seulement : Bitcoin et Ethereum. Ailleurs, ce marché n’a pas de profondeur.
- Le ciblage se fait avec
?asset=, obligatoire, avec l’actif seul (BTCouETH) et non avec?symbol=. PasserBTCUSDT, ou aucun actif, est refusé en 422. - Les grecques sont recalculées selon une convention unique, plutôt que reprises de chaque place : les signes et conventions y diffèrent trop pour être additionnés tels quels.
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
asset | string | requis | BTC ou ETH. Obligatoire : sans lui, 422. |
timeframe | string | obligatoire là où il est accepté | Sur toute route /history et sur /v1/options/iv/klines, /v1/options/oi/change : 5m, 15m, 30m, 1h, 4h, 1d (1m n’est pas servi dans cette famille) ; sur /v1/options/oi/change, la fenêtre de la variation. Les autres dernières valeurs (summary, oi, volume, iv, put-call-ratio, greeks, expiry, max-pain, oi/distribution) n’en prennent pas. |
limit | integer | 100 | Sur les routes /history. |
expiry | string | — | Obligatoire sur /v1/options/max-pain/history, filtre facultatif sur /v1/options/oi/distribution. Une date (2026-10-30) ou la date-heure de l’échéance telle que servie. |
since_ms / until_ms | integer | — | Fenêtre datée, acceptée par les historiques de cette famille. |
#Vue d’ensemble
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 options snapshot (all venues read together). |
underlying_price_usd | USD | Index (spot) price of the underlying, from the options venues. Each expiry's ATM strike and greeks use that expiry's own forward price. Not the latest trade price: that is the `price` of `/v1/price-change`, i.e. the close of `/v1/klines?live=1`. |
oi_total_usd | USD | Total open interest, USD. |
oi_call_usd | USD | Call open interest, USD. |
oi_put_usd | USD | Put open interest, USD. |
volume_total_usd | USD | Total traded volume, USD. |
volume_call_usd | USD | Call volume, USD. |
volume_put_usd | USD | Put volume, USD. |
put_call_ratio | puts / calls | Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts. |
put_call_label | `bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1). | |
iv_atm_30d_pct | percent (58.5 = 58.5 %) | At-the-money implied volatility at a constant 30-day maturity, annualised, in percent (55.2 = 55.2 %). Interpolated in total variance (IV² × time) between the two expiries around 30 days, so it does not jump when the nearest expiry rolls off; the ATM IV of each expiry is on `/v1/options/expiry`. |
nearest_expiry | The next expiry: its instant, the time left, max pain, put/call ratio, ATM IV. | |
nearest_expiry.expiry_at | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter. |
nearest_expiry.time_to_expiry_s | seconds | Time left before expiry, in seconds. |
nearest_expiry.max_pain_strike_usd | USD | Strike at which option holders lose the most at expiry (max pain). |
nearest_expiry.put_call_ratio | puts / calls | Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts. |
nearest_expiry.iv_atm_pct | percent (58.5 = 58.5 %) | At-the-money implied volatility of THIS expiry, annualised, in percent (55.2 = 55.2 %). |
coverage | `oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all). | |
coverage.oi_coverage_ratio | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Un seul appel pour le tableau complet : positions ouvertes, volume, ratio put/call, volatilité implicite à la monnaie, et le détail de l’échéance la plus proche.
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/options/summary?asset=BTC"| Champ | Type | Description |
|---|---|---|
asset (envelope) | string | BTC ou ETH. |
underlying_price_usd | float | Prix de l’indice (spot) du sous-jacent. Le strike à la monnaie et les grecs de chaque échéance utilisent le prix à terme de cette échéance. |
oi_total_usd, oi_call_usd, oi_put_usd | float | Positions ouvertes en dollars : total, calls, puts. |
volume_total_usd, volume_call_usd, volume_put_usd | float | Volume échangé en dollars, même découpage. |
put_call_ratio | float | Ratio puts sur calls. |
put_call_label | string | Une lecture qualitative du ratio. |
iv_atm_30d_pct | float | Volatilité implicite à la monnaie interpolée à 30 jours, en pourcentage (48.2 = 48,2 %). |
nearest_expiry | object | L’échéance la plus proche : date, jours restants, max pain, et son propre put/call et sa volatilité. |
coverage | object | oi_coverage_ratio : la part de l’intérêt ouvert que représentent les places agrégées, en fraction entre 0 et 1. |
#Intérêt ouvert et volume
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 options snapshot (all venues read together). |
oi_total_usd | USD | Total open interest, USD. |
oi_call_usd | USD | Call open interest, USD. |
oi_put_usd | USD | Put open interest, USD. |
oi_call | base asset quantity (BTC for BTCUSDT) | Call open interest, in coins (base asset). |
oi_put | base asset quantity (BTC for BTCUSDT) | Put open interest, in coins (base asset). |
coverage | `oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all). | |
coverage.oi_coverage_ratio | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Les 7 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket; the value is the LAST options snapshot of the bucket. |
oi_total_usd | USD | Total open interest, USD. |
oi_call_usd | USD | Call open interest, USD. |
oi_put_usd | USD | Put open interest, USD. |
oi_call | base asset quantity (BTC for BTCUSDT) | Call open interest, in coins (base asset). |
oi_put | base asset quantity (BTC for BTCUSDT) | Put open interest, in coins (base asset). |
is_closed | `true` = the row is final; `false` = provisional: the latest bucket while it still settles (a few seconds after its end, e.g. a candle whose volumes are not final yet), or the period in progress with `?live=1` on the routes that take it. Exception, rare: when a venue delivers trades LATE (seconds to minutes, e.g. during a burst), a closed row built from trades (trade candles, candle volumes, CVD, buy/sell ratio, trades per second) is corrected afterwards to include them, usually within minutes and at most one hour later; the correction only adds the late trades. |
Les positions ouvertes, en unités de l’actif et en dollars, réparties entre calls et puts.
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 options snapshot (all venues read together). |
window_start_at | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Instant of the reference snapshot: the latest one at least `timeframe` before `time`. |
window_s | seconds | Actual distance between the two snapshots, in whole seconds (`timeframe` or a little more: snapshots arrive every minute). |
oi_change_call_usd | USD | Change of call open interest from `window_start_at` to `time`, USD. |
oi_change_put_usd | USD | Change of put open interest from `window_start_at` to `time`, USD. |
oi_change_total_usd | USD | Change of total open interest from `window_start_at` to `time`, USD. |
Les 5 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket; the value is the LAST options snapshot of the bucket. |
oi_change_call_usd | USD | Change of call open interest from `window_start_at` to `time`, USD. |
oi_change_put_usd | USD | Change of put open interest from `window_start_at` to `time`, USD. |
oi_change_total_usd | USD | Change of total open interest from `window_start_at` to `time`, USD. |
is_closed | `true` = the row is final; `false` = provisional: the latest bucket while it still settles (a few seconds after its end, e.g. a candle whose volumes are not final yet), or the period in progress with `?live=1` on the routes that take it. Exception, rare: when a venue delivers trades LATE (seconds to minutes, e.g. during a burst), a closed row built from trades (trade candles, candle volumes, CVD, buy/sell ratio, trades per second) is corrected afterwards to include them, usually within minutes and at most one hour later; the correction only adds the late trades. |
La variation sur la fenêtre, calculée à la demande : dernière valeur moins première. Chaque ligne porte oi_change_call_usd et oi_change_put_usd.
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 options snapshot (all venues read together). |
expiry_at | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter. |
strike_usd | USD | Strike price. |
oi_call_usd | USD | Call open interest at this strike, USD. `null` = no call listed. |
oi_put_usd | USD | Put open interest at this strike, USD. `null` = no put listed. |
La répartition de l’intérêt ouvert par prix d’exercice et par échéance. C’est la carte des niveaux où le marché a réellement engagé du capital : les murs de strikes que le sous-jacent devra franchir.
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 options snapshot (all venues read together). |
volume_total_usd | USD | Total traded volume, USD. |
volume_call_usd | USD | Call volume, USD. |
volume_put_usd | USD | Put volume, USD. |
coverage | `oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all). | |
coverage.oi_coverage_ratio | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Les 5 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket; the value is the LAST options snapshot of the bucket. |
volume_total_usd | USD | Total traded volume, USD. |
volume_call_usd | USD | Call volume, USD. |
volume_put_usd | USD | Put volume, USD. |
is_closed | `true` = the row is final; `false` = provisional: the latest bucket while it still settles (a few seconds after its end, e.g. a candle whose volumes are not final yet), or the period in progress with `?live=1` on the routes that take it. Exception, rare: when a venue delivers trades LATE (seconds to minutes, e.g. during a burst), a closed row built from trades (trade candles, candle volumes, CVD, buy/sell ratio, trades per second) is corrected afterwards to include them, usually within minutes and at most one hour later; the correction only adds the late trades. |
#Put/call et max pain
Les 3 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 options snapshot (all venues read together). |
put_call_ratio | puts / calls | Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts. |
put_call_label | `bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1). |
Les 4 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the bucket; the value is the LAST options snapshot of the bucket. |
put_call_ratio | puts / calls | Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts. |
put_call_label | `bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1). | |
is_closed | `true` = the row is final; `false` = provisional: the latest bucket while it still settles (a few seconds after its end, e.g. a candle whose volumes are not final yet), or the period in progress with `?live=1` on the routes that take it. Exception, rare: when a venue delivers trades LATE (seconds to minutes, e.g. during a burst), a closed row built from trades (trade candles, candle volumes, CVD, buy/sell ratio, trades per second) is corrected afterwards to include them, usually within minutes and at most one hour later; the correction only adds the late trades. |
Le rapport entre puts et calls, en intérêt ouvert comme en volume. En dessous de 1, les calls dominent. Au-dessus, la couverture à la baisse prend le dessus.
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 options snapshot (all venues read together). |
expiry_at | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter. |
time_to_expiry_s | seconds | Time left before expiry, in seconds. |
max_pain_strike_usd | USD | Strike at which option holders lose the most at expiry (max pain). |
put_call_ratio | puts / calls | Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts. |
oi_call_usd | USD | Call open interest, USD. |
oi_put_usd | USD | Put open interest, USD. |
Les 4 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The instant of the options snapshot the max pain was computed on (one row per snapshot, about every minute; no `timeframe`). |
max_pain_strike_usd | USD | Strike at which option holders lose the most at expiry (max pain). |
put_call_ratio | puts / calls | Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts. |
is_closed | `true` = the row is final; `false` = provisional: the latest bucket while it still settles (a few seconds after its end, e.g. a candle whose volumes are not final yet), or the period in progress with `?live=1` on the routes that take it. Exception, rare: when a venue delivers trades LATE (seconds to minutes, e.g. during a burst), a closed row built from trades (trade candles, candle volumes, CVD, buy/sell ratio, trades per second) is corrected afterwards to include them, usually within minutes and at most one hour later; the correction only adds the late trades. |
L’historique du max pain est celui d’une échéance : expiry y est obligatoire. Donnez-la telle que servie par /v1/options/max-pain ou /v1/options/expiry (2026-10-01T08:00:00.000Z), ou par sa seule date (2026-10-01) : les deux désignent la même échéance. Absente, la requête renvoie 422 missing_parameter, et l’erreur liste les échéances valides de l’actif.
Ce qu’est le max pain
Le prix d’exercice auquel la valeur totale des contrats arrivant à échéance serait la plus basse, donc celui où les acheteurs de calls et de puts perdent le plus. C’est un centre de gravité statistique, pas une prévision : son intérêt est de dire à quel niveau les positions existantes créent une tension.
#Volatilité implicite
Les 2 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 options snapshot (all venues read together). |
iv_atm_30d_pct | percent (58.5 = 58.5 %) | At-the-money implied volatility at a constant 30-day maturity, annualised, in percent (55.2 = 55.2 %). Interpolated in total variance (IV² × time) between the two expiries around 30 days, so it does not jump when the nearest expiry rolls off; the ATM IV of each expiry is on `/v1/options/expiry`. |
La volatilité implicite à la monnaie à maturité constante de 30 jours, en pourcentage (iv_atm_30d_pct) : interpolée en variance totale entre les deux échéances qui encadrent 30 jours, elle ne saute donc pas quand l’échéance la plus proche expire. Elle mesure ce que le marché paie pour se couvrir, indépendamment de la direction. La volatilité à la monnaie de chaque échéance est sur /v1/options/expiry.
Les 6 champs de cette route (d’après le contrat)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Start of the latest CLOSED bucket; the candle summarises its options snapshots. |
open_pct | percent (58.5 = 58.5 %) | 30-day ATM IV at the start of the bucket. |
high_pct | percent (58.5 = 58.5 %) | Highest 30-day ATM IV. |
low_pct | percent (58.5 = 58.5 %) | Lowest 30-day ATM IV. |
close_pct | percent (58.5 = 58.5 %) | 30-day ATM IV at the end of the bucket. |
is_closed | `true` = the row is final; `false` = provisional: the latest bucket while it still settles (a few seconds after its end, e.g. a candle whose volumes are not final yet), or the period in progress with `?live=1` on the routes that take it. Exception, rare: when a venue delivers trades LATE (seconds to minutes, e.g. during a burst), a closed row built from trades (trade candles, candle volumes, CVD, buy/sell ratio, trades per second) is corrected afterwards to include them, usually within minutes and at most one hour later; the correction only adds the late trades. |
La même volatilité, en bougies OHLC dérivées à la demande, elles aussi en pourcentage. Chaque ligne porte time, open, high, low, close. De quoi tracer la volatilité comme on trace un prix. Comme sur tous les historiques de cette famille, seules les bougies closes sont servies : celle en cours n’apparaît jamais.
#Grecques et échéances
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 options snapshot (all venues read together). |
delta | delta | Aggregated delta of open options, OI-weighted (per unit of underlying). |
gamma | delta per USD | Change of delta for a 1 USD move of the underlying, OI-weighted. |
theta | USD per day | Time decay per day, OI-weighted. |
vega | USD per volatility point | Value change for +1 point of implied volatility, OI-weighted. |
coverage | `oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all). | |
coverage.oi_coverage_ratio | fraction (0.585 = 58.5 %) | Share of the open interest covered by the contributing venues. |
Delta, gamma, vega et thêta agrégés, pondérés par l’intérêt ouvert. Ils sont recalculés selon une convention unique, ce qui les rend additionnables entre places, ce que les valeurs publiées par chacune ne permettraient pas.
Les 11 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 options snapshot (all venues read together). |
expiry_at | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | Expiry instant (08:00 UTC). Pass its date part (`YYYY-MM-DD`) as the `expiry` parameter. |
time_to_expiry_s | seconds | Time left before expiry, in seconds. |
oi_call_usd | USD | Call open interest, USD. |
oi_put_usd | USD | Put open interest, USD. |
put_call_ratio | puts / calls | Put/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts. |
max_pain_strike_usd | USD | Strike at which option holders lose the most at expiry (max pain). |
top_call_strike_usd | USD | Strike with the largest call open interest. |
top_put_strike_usd | USD | Strike with the largest put open interest. |
iv_atm_pct | percent (58.5 = 58.5 %) | At-the-money implied volatility of THIS expiry, annualised, in percent (55.2 = 55.2 %). |
put_call_label | `bullish` (put_call_ratio < 0.7), `neutral`, or `bearish` (put_call_ratio > 1). |
La synthèse par échéance : positions ouvertes, ratio put/call, max pain et volatilité pour chaque date. C’est la vue à consulter avant une grosse échéance, quand le dénouement des positions pèse sur le sous-jacent.