Convenciones de la API para código y LLM
Las reglas que valen para todas las familias. Explican por qué dos llamadas al mismo endpoint pueden diferir, por qué una cifra no se compara con otra y qué significa la ausencia de un mercado en un agregado.
Estas reglas valen en todos los canales: REST, el flujo WebSocket y el servidor MCP, por el que los agentes de IA leen los mismos datos de mercado, con los mismos nombres y unidades.
#Símbolos
Se siguen 104 activos: 102 perpetuos USDT-M y dos stablecoins, estas últimas solo en spot. La lista viva la sirve /v1/symbols, y esa es la que manda.
| Símbolo | Activo | Mercados recopilados |
|---|---|---|
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 |
ZECUSDT | Zcash | spot + perpetual |
BCHUSDT | Bitcoin Cash | spot + perpetual |
CCUSDT | Canton | spot + perpetual |
QNTUSDT | Quant | spot + perpetual |
ENAUSDT | Ethena | spot + perpetual |
AAVEUSDT | Aave | spot + perpetual |
ONDOUSDT | Ondo | spot + perpetual |
PUMPUSDT | Pump.fun | spot + perpetual |
WLDUSDT | Worldcoin | spot + perpetual |
ASTERUSDT | Aster | spot + perpetual |
DOTUSDT | Polkadot | spot + perpetual |
WLFIUSDT | World Liberty Financial | spot + perpetual |
MORPHOUSDT | Morpho | spot + perpetual |
SKYUSDT | Sky (formerly Maker) | spot + perpetual |
ETCUSDT | Ethereum Classic | spot + perpetual |
ICPUSDT | Internet Computer | spot + perpetual |
ARBUSDT | Arbitrum | spot + perpetual |
VVVUSDT | Venice Token | spot + perpetual |
JSTUSDT | JUST | spot + perpetual |
ALGOUSDT | Algorand | spot + perpetual |
KASUSDT | Kaspa | spot + perpetual |
POLUSDT | Polygon (formerly MATIC) | spot + perpetual |
JUPUSDT | Jupiter | spot + perpetual |
RENDERUSDT | Render | spot + perpetual |
ATOMUSDT | Cosmos | spot + perpetual |
FILUSDT | Filecoin | spot + perpetual |
INJUSDT | Injective | spot + perpetual |
AEROUSDT | Aerodrome Finance | spot + perpetual |
LITUSDT | Lighter | spot + perpetual |
ZROUSDT | LayerZero | spot + perpetual |
APTUSDT | Aptos | spot + perpetual |
CAKEUSDT | PancakeSwap | spot + perpetual |
STXUSDT | Stacks | spot + perpetual |
STABLEUSDT | Stable | spot + perpetual |
AKEUSDT | Akedo | spot + perpetual |
NIGHTUSDT | Midnight | spot + perpetual |
DASHUSDT | Dash | spot + perpetual |
TIAUSDT | Celestia | spot + perpetual |
PYTHUSDT | Pyth Network | spot + perpetual |
VETUSDT | VeChain | spot + perpetual |
CRVUSDT | Curve DAO | spot + perpetual |
TRUMPUSDT | Official Trump | spot + perpetual |
STRKUSDT | Starknet | spot + perpetual |
PENGUUSDT | Pudgy Penguins | spot + perpetual |
FETUSDT | Artificial Superintelligence Alliance | spot + perpetual |
VIRTUALUSDT | Virtuals Protocol | spot + perpetual |
GRASSUSDT | Grass | spot + perpetual |
SEIUSDT | Sei | spot + perpetual |
BSVUSDT | Bitcoin SV | spot + perpetual |
XPLUSDT | Plasma | spot + perpetual |
PENDLEUSDT | Pendle | spot + perpetual |
FFUSDT | Falcon Finance | spot + perpetual |
SPXUSDT | SPX6900 | spot + perpetual |
XTZUSDT | Tezos | spot + perpetual |
LDOUSDT | Lido DAO | spot + perpetual |
SHIBUSDT | Shiba Inu | spot + perpetual |
PEPEUSDT | Pepe | spot + perpetual |
CROUSDT | Cronos | spot + perpetual |
MUSDT | MemeCore | spot + perpetual |
MNTUSDT | Mantle | spot + perpetual |
ETHFIUSDT | Ether.fi | spot + perpetual |
RAYUSDT | Raydium | spot + perpetual |
SUNUSDT | Sun | spot + perpetual |
PIEVERSEUSDT | Pieverse | spot + perpetual |
KITEUSDT | Kite | spot + perpetual |
IMXUSDT | Immutable | spot + perpetual |
MONUSDT | Monad | spot + perpetual |
OPUSDT | Optimism | spot + perpetual |
CFXUSDT | Conflux | spot + perpetual |
LUNCUSDT | Terra Luna Classic | spot + perpetual |
GRTUSDT | The Graph | spot + perpetual |
KMNOUSDT | Kamino | spot + perpetual |
CVXUSDT | Convex Finance | spot + perpetual |
JTOUSDT | Jito | spot + perpetual |
KAIAUSDT | Kaia | spot + perpetual |
ARUSDT | Arweave | spot + perpetual |
BATUSDT | Basic Attention Token | spot + perpetual |
ENSUSDT | Ethereum Name Service | spot + perpetual |
COMPUSDT | Compound | spot + perpetual |
SYRUPUSDT | Maple Finance | spot + perpetual |
JASMYUSDT | JasmyCoin | spot + perpetual |
RUNEUSDT | THORChain | spot + perpetual |
USDCUSDT | USDC | spot |
USDTUSDC | USDT | spot |
symbol es obligatorio
En todas las rutas propias de un activo, en cualquier combinación de mayúsculas y minúsculas (btcusdt funciona; el envoltorio devuelve la forma canónica BTCUSDT, y asset y series siguen la misma regla). Si falta, la petición devuelve 422; si es desconocido o está desactivado, 422 con la lista de valores aceptados. No hay símbolo por defecto ni alternativa: servir Bitcoin a quien no pidió nada produciría una cifra correcta atribuida al activo equivocado.
Los datos de todo el mercado, en cambio, no aceptan ningún símbolo: Fear & Greed, mercado global, macro, ETF, red de Bitcoin, on-chain de BTC y ETH. Las opciones se seleccionan con ?asset=BTC o ?asset=ETH.
#Temporalidades
En la mayoría de las rutas por intervalos, siete valores:
1m5m15m30m1h4h1d
Las velas (/v1/klines) y los indicadores técnicos aceptan un octavo, la semana (que empieza el lunes a las 00:00 UTC), porque se construyen directamente sobre las velas:
1m5m15m30m1h4h1d1w
Las excepciones: las rutas de opciones rechazan 1m (sus instantáneas llegan aproximadamente una vez por minuto), los instrumentos macro intradía rechazan 30m, y el paso opcional de /v1/btc/fees/history y /v1/global/history es 1h, 4h o 1d. El contrato da a cada ruta su lista exacta (un enum), y el catálogo de la familia (/v1/macro/intraday/series) las temporalidades de cada instrumento.
Un valor fuera de la lista devuelve 422 invalid_timeframe con los valores aceptados, nunca una alternativa silenciosa a otra temporalidad. Todo error de validación es un 422, incluidos el cuerpo de POST /v1/indicators y los historiales de opciones. Decide según error.code: indica qué parámetro falla. Como symbol, timeframe y order no distinguen mayúsculas (1H equivale a 1h), salvo 1M: en otros sitios es un mes, aquí se rechaza, ya que 1m es un minuto.
#Agregación multimercado
Ninguna respuesta nombra su mercado. Las métricas multimercado llegan ya fusionadas: es el contrato de la plataforma, y la razón por la que varias integraciones se convierten en una. Tres reglas de fusión, según la naturaleza de la magnitud:
| Naturaleza | Tipo | Descripción |
|---|---|---|
sum | additive | Volúmenes, interés abierto, número de operaciones, liquidaciones, profundidad del libro. Un mercado que falta hace mecánicamente que la cifra sea demasiado baja. |
open-interest-weighted average | rates and prices | Funding y base. El mercado que lleva más posiciones pesa más, y eso es lo que hace representativo al compuesto. |
volume-weighted average | average prices | Precios medios. El peso natural de un precio medio es el volumen que lo produjo. |
Una sola excepción en todo BytNode: /v1/spread/interexchange nombra los mercados, ya que un diferencial no tiene sentido sin ellos. En todos los demás casos el parámetro exchange no existe: pasarlo devuelve 422.
#Velas cerradas y periodo en curso
Toda ruta que sirve datos cortados en ventanas lleva un booleano is_closed en cada fila, lo hayas pedido o no: velas, velas de trades, CVD, ratio compra/venta, tamaño de los trades, liquidaciones grandes/pequeñas, el libro de órdenes, los spreads entre mercados — y cada fila de cada ruta /history (basis, open interest, funding, liquidaciones, macro, on-chain…). Su último valor es el último bucket CERRADO de timeframe (obligatorio). Un último valor calculado sobre una ventana MÓVIL (liquidaciones acumuladas, variación del open interest, funding acumulado, variación del open interest de opciones) siempre es definitivo y no lleva is_closed: time es el final de su ventana, window_start_at y window_s dan su inicio y su duración.
| Valor | Tipo | Descripción |
|---|---|---|
true | boolean | El valor es definitivo: BytNode no lo recalculará, puede almacenarse, sumarse, compararse con un gráfico. Una ventana multimercado se cierra en cuanto todas las fuentes esperadas la han entregado, y como muy tarde max(20 s, 1 % de su duración) después de su final; entonces queda congelada. El CVD espera más: se cierra 90 s después del final de su ventana. El libro de órdenes es una foto tomada al final de cada bucket: toda fila servida ya es definitiva. Una fuente que revisa sus propias cifras (macro, on-chain) aún puede republicar un valor cerrado. |
false | boolean | El valor es provisional. Dos llamadas sucesivas pueden devolver cifras distintas para la misma fila. |
Por defecto solo se sirven las ventanas cerradas. Para ver el periodo en curso, añade ?live=1:
# The latest CLOSED hourly candle: its value will not move again.
curl -H "X-API-KEY: $BYTNODE_API_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_API_KEY" \
"https://api.bytnode.com/v1/cvd?symbol=BTCUSDT&timeframe=1h&live=1"Lo que hay que saber de ?live=1
- Es opcional. Sin ella, la respuesta es exactamente la de antes.
- Solo en las rutas de último valor que lo declaran:
/v1/klines,/v1/cvd,/v1/trades-kline(y sus variantes/spoty/futures),/v1/funding/ratey/v1/spread/interexchange; en cualquier otra es un parámetro desconocido (422). Las rutas/historysolo sirven ventanas cerradas, por definición. - Nunca un
null. Si el periodo en curso aún no ha recibido nada (un mercado tranquilo), se devuelve en su lugar la última ventana cerrada. - El valor no salta al cierre. Provisional y definitivo salen de la misma definición: cuando el periodo se cierra, la fila se congela en la cifra que mostraba.
Frescura alcanzable: unos dos segundos en operaciones, velas, CVD y diferenciales. El libro de órdenes no tiene periodo en curso: cada fila es la foto de un minuto cerrado, por eso live no se acepta allí.
#Unidades y escalas
Una proporción nunca se escribe de dos maneras. El sufijo de un campo indica su escala, y la regla vale en todas las familias, del núcleo de mercado a los satélites:
| Sufijo | Tipo | Descripción |
|---|---|---|
…_pct | percentage | Un porcentaje: 58.5 significa 58,5 %. basis_pct, oi_change_pct, rate_pct, apr_pct. |
…_ratio | quotient | Un cociente sin dimensión. Una parte de un todo es una fracción: 0.585 significa 58,5 % (buy_ratio, staking_ratio). Un cociente de dos magnitudes puede superar 1 o tener signo: put_call_ratio 1.2 = 1,2 puts por call, imbalance_ratio de −1 a 1. |
…_bps | basis points | Puntos básicos: 1 pb equivale a 0,01 %. premium_bps, max_spread_bps. |
#Marcas de tiempo y orden
- Las marcas de tiempo de los datos están en ISO 8601, en UTC, con el sufijo
Zy tres dígitos fijos de milisegundos:2026-08-29T11:38:00.000Z.timeestá SIEMPRE en este formato, series diarias incluidas (un día se fecha a medianoche UTC) y no hay una clavedateaparte; una fecha sola (2026-08-29) solo aparece en las claves que designan un día de negocio, comofiled_dateooldest_input_date.timesigue una de dos reglas, y la referencia de cada ruta dice cuál: en una serie por buckets (velas, CVD, libro por bucket, funding por periodo de 8 h) es el inicio del bucket, nunca su final; en un valor puntual (último valor, ventana móvil, previsión, compuesto) es el instante al que se refiere el valor: el final de una ventana móvil, la liquidación a la que apunta una previsión, la entrada más reciente de un compuesto (que también daoldest_input_date). El valor actual de una ruta en buckets es su último bucket CERRADO, fechado en su inicio como la primera fila de su/history:/v1/klines,/v1/cvd,/v1/buy-sell-ratio,/v1/trades/avg-size,/v1/liquidations/big-small-ratio,/v1/orderbook(todas exigentimeframe). El envoltorio de/v1/options/max-pain/historyrepiteexpirycomo el día de vencimiento (YYYY-MM-DD), sea cual sea la forma enviada. - Los límites de la petición (
since_ms,until_msybefore_ms) están en milisegundos desde la época Unix.since_msyuntil_msson inclusivos (al milisegundo),before_mses exclusivo.since_ms=0significa el inicio de los datos. Un límite negativo, unsince_msmayor queuntil_ms(igual lee ese milisegundo) o mayor o igual quebefore_ms,until_msybefore_msjuntos, un límite en segundos, microsegundos o nanosegundos, o cualquier otro límite anterior al 2009-01-03 (el primer bloque de Bitcoin) devuelve422antes de ejecutar nada. - Los arrays de valores (la serie de un indicador, la serie interna de un CVD) van del más antiguo al más reciente.
- Las listas de historial se devuelven del más reciente al más antiguo por defecto —la fila más fresca va primero—, o del más antiguo al más reciente con
order=asc. - El día empieza a medianoche UTC: es la alineación de las series diarias.