Datos de mercado

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.

MCP tools/call
El posicionamiento de calls y puts de BTC en una llamada MCP.
{
  "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í: BTCUSDT se rechaza, el activo es BTC.
  • Para desarrolladores: /v1/options/summary da 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 con expiries.
  • 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 (BTC o ETH) y no con ?symbol=. Pasar BTCUSDT, 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ámetroTipoPor defectoDescripción
assetstringobligatorioBTC o ETH. Obligatorio: sin él, 422.
timeframestringobligatorio donde se aceptaEn 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.
limitinteger100En las rutas /history.
expirystring—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_msinteger—Ventana fechada, aceptada por los historiales de esta familia.

#Resumen

GET/v1/options/summarydata_type · options_summaryReferencia completa
Los 19 campos de esta ruta (según el contrato)
timeISO 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_usdUSDIndex (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_usdUSDTotal open interest, USD.
oi_call_usdUSDCall open interest, USD.
oi_put_usdUSDPut open interest, USD.
volume_total_usdUSDTotal traded volume, USD.
volume_call_usdUSDCall volume, USD.
volume_put_usdUSDPut volume, USD.
put_call_ratioputs / callsPut/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_pctpercent (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_expiryThe next expiry: its instant, the time left, max pain, put/call ratio, ATM IV.
nearest_expiry.expiry_atISO 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_ssecondsTime left before expiry, in seconds.
nearest_expiry.max_pain_strike_usdUSDStrike at which option holders lose the most at expiry (max pain).
nearest_expiry.put_call_ratioputs / callsPut/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_pctpercent (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_ratiofraction (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"
CampoTipoDescripción
asset (envelope)stringBTC o ETH.
underlying_price_usdfloatPrecio 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_usdfloatPosiciones abiertas en dólares: total, calls, puts.
volume_total_usd, volume_call_usd, volume_put_usdfloatVolumen negociado en dólares, mismo desglose.
put_call_ratiofloatRatio de puts sobre calls.
put_call_labelstringUna lectura cualitativa del ratio.
iv_atm_30d_pctfloatVolatilidad implícita at-the-money interpolada a 30 días, en porcentaje (48.2 = 48,2 %).
nearest_expiryobjectEl vencimiento más próximo: fecha, días restantes, max pain y su propio put/call y volatilidad.
coverageobjectoi_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

GET/v1/options/oidata_type · options_oiReferencia completa
Los 8 campos de esta ruta (según el contrato)
timeISO 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_usdUSDTotal open interest, USD.
oi_call_usdUSDCall open interest, USD.
oi_put_usdUSDPut open interest, USD.
oi_callbase asset quantity (BTC for BTCUSDT)Call open interest, in coins (base asset).
oi_putbase 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_ratiofraction (0.585 = 58.5 %)Share of the open interest covered by the contributing venues.
GET/v1/options/oi/historydata_type · options_oi_historyReferencia completa
Los 7 campos de esta ruta (según el contrato)
timeISO 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_usdUSDTotal open interest, USD.
oi_call_usdUSDCall open interest, USD.
oi_put_usdUSDPut open interest, USD.
oi_callbase asset quantity (BTC for BTCUSDT)Call open interest, in coins (base asset).
oi_putbase 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.

GET/v1/options/oi/changedata_type · options_oi_changeReferencia completa
Los 6 campos de esta ruta (según el contrato)
timeISO 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_atISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)Instant of the reference snapshot: the latest one at least `timeframe` before `time`.
window_ssecondsActual distance between the two snapshots, in whole seconds (`timeframe` or a little more: snapshots arrive every minute).
oi_change_call_usdUSDChange of call open interest from `window_start_at` to `time`, USD.
oi_change_put_usdUSDChange of put open interest from `window_start_at` to `time`, USD.
oi_change_total_usdUSDChange of total open interest from `window_start_at` to `time`, USD.
GET/v1/options/oi/change/historydata_type · options_oi_change_historyReferencia completa
Los 5 campos de esta ruta (según el contrato)
timeISO 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_usdUSDChange of call open interest from `window_start_at` to `time`, USD.
oi_change_put_usdUSDChange of put open interest from `window_start_at` to `time`, USD.
oi_change_total_usdUSDChange 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.

GET/v1/options/oi/distributiondata_type · options_oi_distributionReferencia completa
Los 5 campos de esta ruta (según el contrato)
timeISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)Point-in-time value: the instant of the options snapshot (all venues read together).
expiry_atISO 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_usdUSDStrike price.
oi_call_usdUSDCall open interest at this strike, USD. `null` = no call listed.
oi_put_usdUSDPut 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.

GET/v1/options/volumedata_type · options_volumeReferencia completa
Los 6 campos de esta ruta (según el contrato)
timeISO 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_usdUSDTotal traded volume, USD.
volume_call_usdUSDCall volume, USD.
volume_put_usdUSDPut volume, USD.
coverage`oi_coverage_ratio`: share of the open interest covered by the venues that answered (1.0 = all).
coverage.oi_coverage_ratiofraction (0.585 = 58.5 %)Share of the open interest covered by the contributing venues.
GET/v1/options/volume/historydata_type · options_volume_historyReferencia completa
Los 5 campos de esta ruta (según el contrato)
timeISO 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_usdUSDTotal traded volume, USD.
volume_call_usdUSDCall volume, USD.
volume_put_usdUSDPut 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

GET/v1/options/put-call-ratiodata_type · options_put_call_ratioReferencia completa
Los 3 campos de esta ruta (según el contrato)
timeISO 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_ratioputs / callsPut/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).
GET/v1/options/put-call-ratio/historydata_type · options_put_call_ratio_historyReferencia completa
Los 4 campos de esta ruta (según el contrato)
timeISO 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_ratioputs / callsPut/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.

GET/v1/options/max-paindata_type · options_max_painReferencia completa
Los 7 campos de esta ruta (según el contrato)
timeISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)Point-in-time value: the instant of the options snapshot (all venues read together).
expiry_atISO 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_ssecondsTime left before expiry, in seconds.
max_pain_strike_usdUSDStrike at which option holders lose the most at expiry (max pain).
put_call_ratioputs / callsPut/call open interest ratio (a quotient, not a share: 1.2 = 1.2 puts per call). Below 1 = more calls than puts.
oi_call_usdUSDCall open interest, USD.
oi_put_usdUSDPut open interest, USD.
GET/v1/options/max-pain/historydata_type · options_max_pain_historyReferencia completa
Los 4 campos de esta ruta (según el contrato)
timeISO 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_usdUSDStrike at which option holders lose the most at expiry (max pain).
put_call_ratioputs / callsPut/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

GET/v1/options/ivdata_type · options_ivReferencia completa
Los 2 campos de esta ruta (según el contrato)
timeISO 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_pctpercent (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.

GET/v1/options/iv/klinesdata_type · options_iv_klinesReferencia completa
Los 6 campos de esta ruta (según el contrato)
timeISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)Start of the latest CLOSED bucket; the candle summarises its options snapshots.
open_pctpercent (58.5 = 58.5 %)30-day ATM IV at the start of the bucket.
high_pctpercent (58.5 = 58.5 %)Highest 30-day ATM IV.
low_pctpercent (58.5 = 58.5 %)Lowest 30-day ATM IV.
close_pctpercent (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

GET/v1/options/greeksdata_type · options_greeksReferencia completa
Los 7 campos de esta ruta (según el contrato)
timeISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)Point-in-time value: the instant of the options snapshot (all venues read together).
deltadeltaAggregated delta of open options, OI-weighted (per unit of underlying).
gammadelta per USDChange of delta for a 1 USD move of the underlying, OI-weighted.
thetaUSD per dayTime decay per day, OI-weighted.
vegaUSD per volatility pointValue 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_ratiofraction (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.

GET/v1/options/expirydata_type · options_expiryReferencia completa
Los 11 campos de esta ruta (según el contrato)
timeISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)Point-in-time value: the instant of the options snapshot (all venues read together).
expiry_atISO 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_ssecondsTime left before expiry, in seconds.
oi_call_usdUSDCall open interest, USD.
oi_put_usdUSDPut open interest, USD.
put_call_ratioputs / callsPut/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_usdUSDStrike at which option holders lose the most at expiry (max pain).
top_call_strike_usdUSDStrike with the largest call open interest.
top_put_strike_usdUSDStrike with the largest put open interest.
iv_atm_pctpercent (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.