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
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.
{
"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
Los 15 campos de esta ruta (según el contrato)
computed_at | ISO 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_count | count | Public feeds checked. |
stale_feed_count | count | Feeds older than their threshold. |
error_feed_count | count | Feeds that could not be checked. |
max_age_s | seconds | Age of the oldest feed. |
feeds | One row per public feed. | |
feeds.feed | Public feed name. The closed list of this contract version; `routes` gives the routes each one supplies. | |
feeds.family | Data 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.routes | The 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_s | seconds | Age 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_s | seconds | Maximum legitimate age of the feed. |
feeds.threshold_s | seconds | Age above which the feed is stale (1.5 × expected_interval_s). |
feeds.is_stale | Whether 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_count | count | Venues 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.
{
"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
}
]
}
}| Campo | Tipo | Descripción |
|---|---|---|
status | string | Siempre ok cuando la petición tuvo éxito; el estado de los flujos es data.state. |
server_time | string | El instante en que se produjo la respuesta, en ISO 8601 UTC con milisegundos. |
data.computed_at | string | El 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.state | string | ok, o degraded en cuanto un flujo va con retraso o su comprobación ha fallado. |
data.feed_count | integer | Número de flujos comprobados. |
data.stale_feed_count | integer | Número de flujos con retraso. |
data.error_feed_count | integer | Número de flujos cuya comprobación ha fallado. |
data.max_age_s | float | null | La mayor antigüedad observada entre los flujos. |
data.feeds | array | Una entrada por flujo, descrita a continuación. |
| Campo de cada flujo | Tipo | Descripción |
|---|---|---|
feed | string | El 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). |
family | string | La 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. |
routes | string[] | Las rutas públicas que sirven los datos de este flujo: un flujo con retraso indica qué rutas se ven afectadas. |
age_s | float | null | Segundos 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_s | integer | El 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_s | integer | El umbral aplicado, siempre 1,5 × expected_interval_s. |
is_stale | boolean | null | Verdadero 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_count | integer | null | El 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
Los 5 campos de esta ruta (según el contrato)
symbol | Trading pair, e.g. `BTCUSDT`. | |
base_asset | Base asset of the pair. | |
name | Human-readable name. | |
quote_asset | Quote currency of the pair (`USDT` for BTCUSDT, `USDC` for USDTUSDC): the currency of its prices. | |
markets | Markets 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.
{
"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"
]
}
]
}| Campo | Tipo | Descripción |
|---|---|---|
symbol | string | El identificador que pasar en ?symbol=. |
base_asset | string | El activo base (BTC, ETH). Es lo que las rutas de opciones reciben en ?asset=. |
name | string | El nombre completo, para mostrar. |
quote_asset | string | La moneda de cotización: la moneda de los precios del par (USDT para BTCUSDT, USDC para USDTUSDC). |
markets | string[] | Los mercados servidos: spot y futures, o solo spot para los dos pares de stablecoins. |
#Informe de capacidades
Los 25 campos de esta ruta (según el contrato)
asset_class | `crypto` or `stablecoin` (spot only, no futures metrics). | |
feeds_active_last_24h | Per 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.oi | base 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_available | Derived metrics available for the symbol. | |
computed_metrics_blocked | Derived metrics unavailable, with the missing feeds. | |
feeds_not_applicable | Feeds that do not exist for this symbol (the futures feeds of a spot-only stablecoin), under their `/v1/status` names. | |
stablecoin_note | Spot-only stablecoin: why its futures feeds and derived metrics do not apply. Absent for any other symbol. | |
computed_metrics_not_applicable | Derived metrics that do not apply (stablecoins have no futures). | |
computed_metrics_not_applicable.basis | Why `basis` does not apply to this symbol. | |
computed_metrics_not_applicable.oi_change | base asset quantity (BTC for BTCUSDT) | Why `oi_change` does not apply to this symbol. |
computed_metrics_not_applicable.liquidations_cumulative | Why `liquidations_cumulative` does not apply to this symbol. | |
computed_metrics_not_applicable.liquidations_big_small_ratio | Why `liquidations_big_small_ratio` does not apply to this symbol. | |
computed_metrics_not_applicable.funding_cumulative | Why `funding_cumulative` does not apply to this symbol. | |
computed_metrics_not_applicable.indicators | Why `indicators` does not apply to this symbol. | |
computed_metrics_not_applicable.trades_kline_futures | Why `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"| Campo | Tipo | Descripción |
|---|---|---|
symbol | string | El activo consultado — en el envoltorio, junto a data. |
asset_class | string | crypto o stablecoin. |
feeds_active_last_24h | object | Los 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_available | array | Las métricas calculables: todos sus flujos de entrada están presentes. |
computed_metrics_blocked | object | Las 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_applicable | object | En una stablecoin: cada métrica derivada del mercado de futuros, con su motivo. Es intencionado, no un fallo. |
feeds_not_applicable | array | En una stablecoin: los flujos de futuros, que no se sondean en lugar de declararse falsos. |
stablecoin_note | string | En 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
Los 18 campos de esta ruta (según el contrato)
plan | Your plan: `free`, `traders`, `financial`, `startup` or `enterprise` (`legacy` for an internal unmetered key: every limit below is then unset). | |
families | Data 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`. | |
history | History window per timeframe, one object per timeframe the API serves. | |
history.timeframe | The timeframe the window applies to. | |
history.window_s | seconds | How far back this timeframe may be read, in seconds, measured from now; `null` = unlimited. Beyond it: 403 `history_depth`. |
trades_window_s | seconds | How 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_count | count | How 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`). |
rate | The per-minute rate, as a token bucket; `null` = unlimited or unmetered key. The same values as the `RateLimit` headers (`rate` policy). | |
rate.requests_per_minute | count | Requests per minute of your plan (the bucket refills at this pace). |
rate.burst_count | count | Capacity of the bucket: requests you can send at once. |
rate.refill_s | seconds | Seconds to refill the bucket from empty. |
rate.remaining_count | count | Requests left right now (after this one). |
rate.reset_s | seconds | Seconds until fully restored. |
quota | The 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_count | count | Requests included per calendar month. |
quota.month_length_s | seconds | Length of the current calendar month, in seconds. |
quota.remaining_count | count | Requests left right now (after this one). |
quota.reset_s | seconds | Seconds 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"| Campo | Tipo | Descripción |
|---|---|---|
plan | string | null | Tu plan: free, traders, financial, startup o enterprise. |
families | string[] | null | Las familias de datos de mercado incluidas en tu plan; null = todas. Una ruta fuera de ellas responde 403 plan_family. |
history[].timeframe / window_s | string / integer | null | Una entrada por timeframe: hasta dónde puede leerse, en segundos (window_s); 0 = fuera de su plan, null = sin límite. |
trades_window_s | integer | null | Hasta dónde pueden leerse los trades individuales (/v1/trades/*), en segundos; 0 = fuera de su plan (familia trades), null = sin límite. |
liquidations_events_count | integer | null | Cuántas de las liquidaciones individuales más recientes puede devolver /v1/liquidations/events. |
rate | object | null | El 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. |
quota | object | null | La cuota mensual: monthly_count, month_length_s, remaining_count, reset_s (hasta el día 1 del mes siguiente, 00:00 UTC). |