API REST

Sistema y metadatos

Cinco rutas que no sirven ninguna métrica de mercado: dicen si el servicio responde, si los datos están frescos, qué activos existen, qué puede servir realmente cada uno y qué puede hacer tu clave.

Un agente de IA hace las mismas preguntas con una sola herramienta MCP: get_system_info devuelve la salud del servicio y tu plan (familias, profundidad de historial, límite de velocidad, cuota restante) sin consumir tu cuota, y bajo demanda los pares servidos y la frescura de los datos. Ver el servidor MCP.

#Salud del servicio

GET/v1/healthsin claveReferencia completa
Los 1 campos de esta ruta (según el contrato)
database`connected` when the service reaches its database. A failing check answers 503 `service_unavailable` with `database` in `error.details`.

La sonda. Dice si el servicio está en marcha y si su base de datos responde. Es la única ruta que responde sin clave y nunca se descuenta de la cuota, lo que la convierte en el punto que un sistema de monitorización puede consultar sin consumir nada.

200
{
  "status": "ok",
  "server_time": "2026-11-08T12:51:13.156Z",
  "data_type": "health",
  "data": {
    "database": "connected"
  }
}

En caso de problema: 503 con el cuerpo de error (error.code: "service_unavailable", y database: "unreachable", service y retry_after_s bajo error.details), y la cabecera Retry-After.

#Frescura de los flujos

GET/v1/statusReferencia completa
Los 15 campos de esta ruta (según el contrato)
computed_atISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z)When the status was measured: the OLDEST of its measurements (each data family is measured on its own, cached up to 5 minutes for market feeds and 30 seconds for the others). Every `age_s` is measured at or after this instant, not at `server_time`.
state`ok`, or `degraded` when at least one feed is stale or failed its check. The envelope's `status` stays `ok` (the request succeeded).
feed_countcountPublic feeds checked.
stale_feed_countcountFeeds older than their threshold.
error_feed_countcountFeeds that could not be checked.
max_age_ssecondsAge of the oldest feed.
feedsOne row per public feed.
feeds.feedPublic feed name. The closed list of this contract version; `routes` gives the routes each one supplies.
feeds.familyData family the feed belongs to, as in `/v1/limits` and the `x-family` of each route: `price_volume`, `derivatives`, `microstructure`, `trades`, `options`, `onchain`, `macro`, `etf`, `tokenomics` or `sentiment`.
feeds.routesThe public routes (contract paths) this feed supplies: watch this feed to know whether they are fresh. A per-timeframe feed (`cvd_1h`) supplies them at that timeframe.
feeds.age_ssecondsAge of the latest row of the feed. For a feed made of several series (one per asset, per macro series, per ETF), the age of its OLDEST series. For the market-hours intraday series (`macro_intraday_<tf>`, not `_continuous`), counted on weekdays only, like their threshold. `null` if the feed is empty or could not be checked.
feeds.expected_interval_ssecondsMaximum legitimate age of the feed.
feeds.threshold_ssecondsAge above which the feed is stale (1.5 × expected_interval_s).
feeds.is_staleWhether the feed is stale: older than `threshold_s`, or (series feed) at least one of its series is. `null` when the feed could not be checked (counted in `error_feed_count`).
feeds.stale_venue_countcountVenues lagging on this feed; `null` when the feed is not split by venue (every non-market feed).

Una línea por flujo de datos, con su nombre público: su antigüedad, el ritmo al que debe publicar y un indicador is_stale calculado en el servidor. La regla es la misma para todos los flujos: un flujo va con retraso cuando no ha entregado nada desde hace 1,5 × su ritmo esperado. Ninguna tabla interna, ningún nombre de mercado, ningún recuento de filas. Es la ruta que hay que consultar antes de construir un análisis: saber que un dato es antiguo es mejor que descubrirlo en un resultado. Cubre todas las familias: precios y volúmenes, derivados, flujo de órdenes, operaciones, y también opciones, on-chain, macro, ETF, tokenomics y sentimiento. Una serie lenta no es una serie con retraso: una serie macro mensual o un informe ETF trimestral alcanza legítimamente una antigüedad de semanas, y su expected_interval_s lo indica.

200
{
  "status": "ok",
  "server_time": "2026-11-08T12:51:14.698Z",
  "data_type": "status",
  "data": {
    "computed_at": "2026-11-08T12:51:13.669Z",
    "state": "ok",
    "feed_count": 82,
    "stale_feed_count": 0,
    "error_feed_count": 0,
    "max_age_s": 7649473.7,
    "feeds": [
      {
        "feed": "klines_futures_1m",
        "family": "price_volume",
        "routes": [
          "/v1/klines",
          "/v1/klines/history"
        ],
        "age_s": 73.7,
        "expected_interval_s": 120,
        "threshold_s": 180,
        "is_stale": false,
        "stale_venue_count": 0
      },
      {
        "feed": "klines_1m",
        "family": "price_volume",
        "routes": [
          "/v1/klines",
          "/v1/klines/history"
        ],
        "age_s": 73.7,
        "expected_interval_s": 180,
        "threshold_s": 270,
        "is_stale": false,
        "stale_venue_count": 0
      },
      {
        "feed": "klines_multi",
        "family": "price_volume",
        "routes": [
          "/v1/klines",
          "/v1/klines/history"
        ],
        "age_s": 373.7,
        "expected_interval_s": 660,
        "threshold_s": 990,
        "is_stale": false,
        "stale_venue_count": null
      }
    ]
  }
}
CampoTipoDescripción
statusstringSiempre ok cuando la petición tuvo éxito; el estado de los flujos es data.state.
server_timestringEl instante en que se produjo la respuesta, en ISO 8601 UTC con milisegundos.
data.computed_atstringEl instante de la medición: la más antigua de sus mediciones (los flujos de mercado se guardan en caché hasta cinco minutos, las demás familias treinta segundos). Cada age_s se mide en ese instante o después, no en server_time.
data.statestringok, o degraded en cuanto un flujo va con retraso o su comprobación ha fallado.
data.feed_countintegerNúmero de flujos comprobados.
data.stale_feed_countintegerNúmero de flujos con retraso.
data.error_feed_countintegerNúmero de flujos cuya comprobación ha fallado.
data.max_age_sfloat | nullLa mayor antigüedad observada entre los flujos.
data.feedsarrayUna entrada por flujo, descrita a continuación.
Campo de cada flujoTipoDescripción
feedstringEl nombre público del flujo: klines_1m, funding_rate, cvd_1h, options_aggregates, btc_mempool, macro_daily_weekly, etf_filings… La lista cerrada está en el contrato (enum de feed).
familystringLa familia de cuota del flujo, como en /v1/limits y el x-family de cada ruta: price_volume, derivatives, microstructure, trades, options, onchain, macro, etf, tokenomics o sentiment.
routesstring[]Las rutas públicas que sirven los datos de este flujo: un flujo con retraso indica qué rutas se ven afectadas.
age_sfloat | nullSegundos transcurridos desde la última entrega. Para un flujo formado por varias series (una por activo, por serie macro, por ETF), la antigüedad de su serie más antigua; para las series macro intradía en horario de mercado (macro_intraday_1m … macro_intraday_1d), contada solo en días laborables, como su umbral. null si el flujo aún no tiene datos o si la comprobación ha fallado.
expected_interval_sintegerEl ritmo esperado: la antigüedad más larga que sigue siendo legítima para este flujo (un día para una serie diaria, por ejemplo).
threshold_sintegerEl umbral aplicado, siempre 1,5 × expected_interval_s.
is_staleboolean | nullVerdadero si el flujo supera su umbral, si uno solo de sus mercados lo supera o (flujo de series) si una sola de sus series lo supera. null si la comprobación ha fallado: entonces se cuenta en error_feed_count.
stale_venue_countinteger | nullEl número de mercados con retraso en este flujo, nunca sus nombres. null cuando el flujo no se desglosa por mercado (todo flujo fuera de las familias de mercado).

#Catálogo de símbolos

GET/v1/symbolsdata_type · symbolsReferencia completa
Los 5 campos de esta ruta (según el contrato)
symbolTrading pair, e.g. `BTCUSDT`.
base_assetBase asset of the pair.
nameHuman-readable name.
quote_assetQuote currency of the pair (`USDT` for BTCUSDT, `USDC` for USDTUSDC): the currency of its prices.
marketsMarkets served for the pair: `spot` and `futures` (USDT-margined perpetual), or `spot` only for the two stablecoin pairs (their `/futures` routes answer `unavailable: not_applicable`).

La lista viva de los activos habilitados. Es la referencia: no codifiques la lista en un cliente, haz que la lea al arrancar.

200
{
  "status": "ok",
  "server_time": "2026-11-08T12:51:15.750Z",
  "data_type": "symbols",
  "data": [
    {
      "symbol": "AAVEUSDT",
      "base_asset": "AAVE",
      "name": "Aave",
      "quote_asset": "USDT",
      "markets": [
        "spot",
        "futures"
      ]
    },
    {
      "symbol": "ADAUSDT",
      "base_asset": "ADA",
      "name": "Cardano",
      "quote_asset": "USDT",
      "markets": [
        "spot",
        "futures"
      ]
    }
  ]
}
CampoTipoDescripción
symbolstringEl identificador que pasar en ?symbol=.
base_assetstringEl activo base (BTC, ETH). Es lo que las rutas de opciones reciben en ?asset=.
namestringEl nombre completo, para mostrar.
quote_assetstringLa moneda de cotización: la moneda de los precios del par (USDT para BTCUSDT, USDC para USDTUSDC).
marketsstring[]Los mercados servidos: spot y futures, o solo spot para los dos pares de stablecoins.

#Informe de capacidades

GET/v1/capabilitiesdata_type · capabilitiesReferencia completa
Los 25 campos de esta ruta (según el contrato)
asset_class`crypto` or `stablecoin` (spot only, no futures metrics).
feeds_active_last_24hPer source feed, under its `/v1/status` name (`trades_spot`, `trades_kline_futures_seconds`, `oi`, `funding_rate`, `klines_1m`...): whether it received data for this symbol in the last 24 h.
feeds_active_last_24h.klines_futures_1m`true` when the `klines_futures_1m` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.trades_spot`true` when the `trades_spot` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.trades_futures`true` when the `trades_futures` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.oibase asset quantity (BTC for BTCUSDT)`true` when the `oi` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.funding_rate`true` when the `funding_rate` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.liquidations_events`true` when the `liquidations_events` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.trades_kline_futures_seconds`true` when the `trades_kline_futures_seconds` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.klines_futures_multi`true` when the `klines_futures_multi` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.klines_1m`true` when the `klines_1m` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.klines_multi`true` when the `klines_multi` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
feeds_active_last_24h.orderbook_1m`true` when the `orderbook_1m` feed delivered data in the last 24 hours; `null` when its probe did not conclude in time.
computed_metrics_availableDerived metrics available for the symbol.
computed_metrics_blockedDerived metrics unavailable, with the missing feeds.
feeds_not_applicableFeeds that do not exist for this symbol (the futures feeds of a spot-only stablecoin), under their `/v1/status` names.
stablecoin_noteSpot-only stablecoin: why its futures feeds and derived metrics do not apply. Absent for any other symbol.
computed_metrics_not_applicableDerived metrics that do not apply (stablecoins have no futures).
computed_metrics_not_applicable.basisWhy `basis` does not apply to this symbol.
computed_metrics_not_applicable.oi_changebase asset quantity (BTC for BTCUSDT)Why `oi_change` does not apply to this symbol.
computed_metrics_not_applicable.liquidations_cumulativeWhy `liquidations_cumulative` does not apply to this symbol.
computed_metrics_not_applicable.liquidations_big_small_ratioWhy `liquidations_big_small_ratio` does not apply to this symbol.
computed_metrics_not_applicable.funding_cumulativeWhy `funding_cumulative` does not apply to this symbol.
computed_metrics_not_applicable.indicatorsWhy `indicators` does not apply to this symbol.
computed_metrics_not_applicable.trades_kline_futuresWhy `trades_kline_futures` does not apply to this symbol.

Lo que este activo puede servir realmente, medido en las últimas veinticuatro horas. Permite anticipar una respuesta vacía en lugar de descubrirla, y distinguir una métrica que no tiene sentido aquí de una métrica bloqueada momentáneamente.

curl -H "X-API-KEY: $BYTNODE_API_KEY"   "https://api.bytnode.com/v1/capabilities?symbol=BTCUSDT"
CampoTipoDescripción
symbolstringEl activo consultado — en el envoltorio, junto a data.
asset_classstringcrypto o stablecoin.
feeds_active_last_24hobjectLos flujos sondeados, cada uno verdadero o falso según haya producido datos en la ventana, o null cuando su sonda no concluyó a tiempo. Capacidad no es frescura: un flujo activo hace veinte horas sigue siendo verdadero. En una stablecoin, solo se sondea el flujo spot.
computed_metrics_availablearrayLas métricas calculables: todos sus flujos de entrada están presentes.
computed_metrics_blockedobjectLas métricas impedidas, con los flujos que faltan y el motivo. undetermined_feeds enumera aquellos cuya sonda superó su plazo: desconocidos, no ausentes.
computed_metrics_not_applicableobjectEn una stablecoin: cada métrica derivada del mercado de futuros, con su motivo. Es intencionado, no un fallo.
feeds_not_applicablearrayEn una stablecoin: los flujos de futuros, que no se sondean en lugar de declararse falsos.
stablecoin_notestringEn una stablecoin: lo que sigue disponible en spot.

Un símbolo desconocido o desactivado devuelve 422 invalid_symbol con la lista de símbolos activos.

#Los límites de tu plan

GET/v1/limitsdata_type · limitsReferencia completa
Los 18 campos de esta ruta (según el contrato)
planYour plan: `free`, `traders`, `financial`, `startup` or `enterprise` (`legacy` for an internal unmetered key: every limit below is then unset).
familiesData families your plan includes (`price_volume`, `derivatives`, `microstructure`, `trades`, `snapshot`, `indicators`, `macro`, `options`, `onchain`, `etf`, `tokenomics`, `sentiment`); `null` = all of them. A route outside them answers 403 `plan_family`.
historyHistory window per timeframe, one object per timeframe the API serves.
history.timeframeThe timeframe the window applies to.
history.window_ssecondsHow far back this timeframe may be read, in seconds, measured from now; `null` = unlimited. Beyond it: 403 `history_depth`.
trades_window_ssecondsHow far back individual trades (`/v1/trades/spot`, `/futures`, `/large`) may be read, in seconds; `0` = not in your plan (family `trades`), `null` = unlimited.
liquidations_events_countcountHow many of the most recent individual liquidations `/v1/liquidations/events` may return, counted from the latest: 100 (Free), 500 (Traders), 1,000 (Financial), 10,000 (Startup); a larger `limit` answers 403 `history_depth`. `null` = no count set (Enterprise, or an unmetered key): up to 10,000 per call, the route's maximum. `0` = not in your plan (family `derivatives`).
rateThe per-minute rate, as a token bucket; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`rate` policy).
rate.requests_per_minutecountRequests per minute of your plan (the bucket refills at this pace).
rate.burst_countcountCapacity of the bucket: requests you can send at once.
rate.refill_ssecondsSeconds to refill the bucket from empty.
rate.remaining_countcountRequests left right now (after this one).
rate.reset_ssecondsSeconds until fully restored.
quotaThe monthly quota; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`quota` policy). It resets on the 1st of the month, 00:00 UTC.
quota.monthly_countcountRequests included per calendar month.
quota.month_length_ssecondsLength of the current calendar month, in seconds.
quota.remaining_countcountRequests left right now (after this one).
quota.reset_ssecondsSeconds until fully restored.

Lo que puede hacer tu clave, leído del plan que sirvió ESTA petición: las familias de datos de mercado incluidas, la ventana de historial de cada temporalidad, la ventana tick a tick, el número de liquidaciones individuales, y la velocidad por minuto y la cuota mensual con lo que queda. Dimensiona limit y since_ms a partir de ella antes de paginar, en lugar de descubrir la ventana con un 403 history_depth. No se descuenta de tu cuota. Con una clave no contabilizada, cada límite vale null.

curl -H "X-API-KEY: $BYTNODE_API_KEY" "https://api.bytnode.com/v1/limits"
CampoTipoDescripción
planstring | nullTu plan: free, traders, financial, startup o enterprise.
familiesstring[] | nullLas familias de datos de mercado incluidas en tu plan; null = todas. Una ruta fuera de ellas responde 403 plan_family.
history[].timeframe / window_sstring / integer | nullUna entrada por timeframe: hasta dónde puede leerse, en segundos (window_s); 0 = fuera de su plan, null = sin límite.
trades_window_sinteger | nullHasta dónde pueden leerse los trades individuales (/v1/trades/*), en segundos; 0 = fuera de su plan (familia trades), null = sin límite.
liquidations_events_countinteger | nullCuántas de las liquidaciones individuales más recientes puede devolver /v1/liquidations/events.
rateobject | nullEl ritmo por minuto como cubo de fichas: requests_per_minute, burst_count (la capacidad de ráfaga), refill_s (segundos para rellenarse desde vacío), remaining_count, reset_s. Los mismos valores que las cabeceras RateLimit.
quotaobject | nullLa cuota mensual: monthly_count, month_length_s, remaining_count, reset_s (hasta el día 1 del mes siguiente, 00:00 UTC).