API de datos de opciones cripto
Los datos de mercado de opciones de BTC y ETH agregados en varios mercados: open interest, volumen, ratio put/call, max pain, volatilidad implícita y griegas. Una API REST y un servidor MCP en lugar de consultar cada plataforma y convertir sus convenciones.
Calls y puts sobre Bitcoin y Ethereum, agregados en varios mercados, normalizados en dólares y recalculados con una sola convención. Diecisiete rutas que responden a una pregunta: dónde pone el mercado su riesgo, y a qué precio.
#Datos de opciones cripto para agentes de IA y LLM
«¿Dónde está el max pain de BTC para el vencimiento del viernes?», «¿Sube la volatilidad implícita de ETH?», «¿Qué dice el ratio put/call?»: un agente de IA responde con esta familia mediante la herramienta MCP get_options_data, que toma un activo en lugar de un par.
{
"name": "get_options_data",
"arguments": {
"asset": "BTC",
"fields": ["options_summary", "options_put_call_ratio", "options_iv"]
}
}- Para el LLM: el max pain es un centro de gravedad estadístico, no una previsión, y solo BTC y ETH tienen opciones aquí:
BTCUSDTse rechaza, el activo esBTC. - Para desarrolladores:
/v1/options/summaryda a un agente de IA con tool calling la foto completa de un activo en una petición; la herramienta MCP añade las cifras de cada vencimiento conexpiries. - Dónde funciona: Claude, ChatGPT, Cursor y cualquier cliente MCP, incluidos los frameworks de agentes compatibles con MCP, como LangChain o n8n.
Conecta tu agente de IA con la guía del servidor MCP, o enséñale BytNode con los Agent Skills de código abierto.
#El principio
Tres cosas distinguen esta familia de las demás familias.
- Solo dos activos: Bitcoin y Ethereum. En los demás, este mercado no tiene profundidad.
- La selección se hace con
?asset=, obligatorio, con el activo solo (BTCoETH) y no con?symbol=. PasarBTCUSDT, o ningún activo, se rechaza con un 422. - Las griegas se recalculan con una sola convención, en lugar de tomarse de cada mercado: los signos y convenciones difieren demasiado para sumarlas tal cual.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
asset | string | obligatorio | BTC o ETH. Obligatorio: sin él, 422. |
timeframe | string | obligatorio donde se acepta | En toda ruta /history y en /v1/options/iv/klines, /v1/options/oi/change: 5m, 15m, 30m, 1h, 4h, 1d (1m no se sirve en esta familia); en /v1/options/oi/change, la ventana de la variación. Los demás últimos valores (summary, oi, volume, iv, put-call-ratio, greeks, expiry, max-pain, oi/distribution) no lo aceptan. |
limit | integer | 100 | En las rutas /history. |
expiry | string | — | Obligatorio en /v1/options/max-pain/history, filtro opcional en /v1/options/oi/distribution. Una fecha (2026-10-30) o la fecha-hora del vencimiento tal como se sirve. |
since_ms / until_ms | integer | — | Ventana fechada, aceptada por los historiales de esta familia. |
#Resumen
Los 19 campos de esta ruta (según el contrato)
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. |
Una sola llamada para el cuadro completo: posiciones abiertas, volumen, ratio put/call, volatilidad implícita at the money y el detalle del vencimiento más próximo.
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/options/summary?asset=BTC"| Campo | Tipo | Descripción |
|---|---|---|
asset (envelope) | string | BTC o ETH. |
underlying_price_usd | float | Precio del índice (spot) del subyacente. El strike at-the-money y las griegas de cada vencimiento usan el precio a plazo de ese vencimiento. |
oi_total_usd, oi_call_usd, oi_put_usd | float | Posiciones abiertas en dólares: total, calls, puts. |
volume_total_usd, volume_call_usd, volume_put_usd | float | Volumen negociado en dólares, mismo desglose. |
put_call_ratio | float | Ratio de puts sobre calls. |
put_call_label | string | Una lectura cualitativa del ratio. |
iv_atm_30d_pct | float | Volatilidad implícita at-the-money interpolada a 30 días, en porcentaje (48.2 = 48,2 %). |
nearest_expiry | object | El vencimiento más próximo: fecha, días restantes, max pain y su propio put/call y volatilidad. |
coverage | object | oi_coverage_ratio: la parte del interés abierto que representan los mercados agregados, como fracción entre 0 y 1. |
#Interés abierto y volumen
Los 8 campos de esta ruta (según el contrato)
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. |
Los 7 campos de esta ruta (según el contrato)
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. |
Las posiciones abiertas, en unidades del activo y en dólares, repartidas entre calls y puts.
Los 6 campos de esta ruta (según el contrato)
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. |
Los 5 campos de esta ruta (según el contrato)
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 variación en la ventana, calculada bajo demanda: último valor menos primero. Cada fila lleva oi_change_call_usd y oi_change_put_usd.
Los 5 campos de esta ruta (según el contrato)
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. |
El reparto del interés abierto por precio de ejercicio y por vencimiento. Es el mapa de los niveles donde el mercado ha comprometido capital de verdad: los muros de strikes que el subyacente tendrá que cruzar.
Los 6 campos de esta ruta (según el contrato)
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. |
Los 5 campos de esta ruta (según el contrato)
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 y max pain
Los 3 campos de esta ruta (según el contrato)
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). |
Los 4 campos de esta ruta (según el contrato)
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. |
La relación entre puts y calls, tanto en interés abierto como en volumen. Por debajo de 1 dominan los calls. Por encima, se impone la cobertura bajista.
Los 7 campos de esta ruta (según el contrato)
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. |
Los 4 campos de esta ruta (según el contrato)
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. |
El historial del max pain es el de un vencimiento: expiry es obligatorio allí. Indícalo tal como lo sirven /v1/options/max-pain o /v1/options/expiry (2026-10-01T08:00:00.000Z), o solo con su fecha (2026-10-01): ambas formas designan el mismo vencimiento. Si falta, la petición devuelve 422 missing_parameter, y el error enumera los vencimientos válidos del activo.
Qué es el max pain
El precio de ejercicio al que el valor total de los contratos que vencen sería el más bajo, es decir, aquel en el que los compradores de calls y puts pierden más. Es un centro de gravedad estadístico, no una previsión: su interés es decir en qué nivel las posiciones existentes generan tensión.
#Volatilidad implícita
Los 2 campos de esta ruta (según el contrato)
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 volatilidad implícita at-the-money a vencimiento constante de 30 días, en porcentaje (iv_atm_30d_pct): interpolada en varianza total entre los dos vencimientos que rodean los 30 días, por eso no salta cuando vence el vencimiento más próximo. Mide lo que el mercado paga por cubrirse, con independencia de la dirección. La volatilidad at-the-money de cada vencimiento está en /v1/options/expiry.
Los 6 campos de esta ruta (según el contrato)
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 misma volatilidad, en velas OHLC derivadas bajo demanda, también en porcentaje. Cada fila lleva time, open, high, low, close. Suficiente para representar la volatilidad como se representa un precio. Como en todos los historiales de esta familia, solo se sirven velas cerradas: la que está en curso nunca aparece.
#Griegas y vencimientos
Los 7 campos de esta ruta (según el contrato)
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 y theta agregadas, ponderadas por el interés abierto. Se recalculan con una sola convención, lo que permite sumarlas entre mercados, algo que los valores publicados por cada uno no permitirían.
Los 11 campos de esta ruta (según el contrato)
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). |
El resumen por vencimiento: posiciones abiertas, ratio put/call, max pain y volatilidad para cada fecha. Es la vista que consultar antes de un gran vencimiento, cuando el cierre de posiciones pesa sobre el subyacente.