Primeros pasos

Límites de uso de apps y agentes de IA

Los límites dependen de tu plan y se cuentan por cuenta, sumando todas las claves. Se anuncian de antemano, cada rechazo indica su motivo y nunca se trunca nada en silencio. Los valores de esta página son los del catálogo de precios.

Tus agentes de IA comparten estos límites: cada petición que el servidor MCP hace por ellos cuenta como una petición REST de la misma clave, contra el mismo límite de velocidad y la misma cuota mensual, y un rechazo llega al agente de IA como Error (HTTP 429). La llamada a /mcp en sí no se cuenta.

#Los límites por plan

Cuatro planes, cuatro conjuntos de límites. El plan Empresa se negocia; no tiene valor por defecto.

LímiteFreeTradersFinancialStartup
Peticiones al mes10.000200.0002.000.00020.000.000
Límite de velocidad, por minuto3060300600
Ráfaga permitida102050100
Familias de datos4 / 127 / 1212 / 1212 / 12
Endpoints REST abiertos3585135135
Conexiones WebSocket simultáneas—31020

El catálogo documenta 138 rutas. Tres nunca se descuentan de la cuota, solo se aplica el límite de velocidad: /v1/health, la única que responde sin clave, /v1/limits, los límites de tu clave, y POST /v1/ws/token, el token WebSocket de corta duración (sigue el derecho al flujo). /v1/status cuenta como una petición de precio y volumen. El contrato nombra la familia de cada ruta en x-family.

#Límite de velocidad y cuota mensual

Dos contadores, ambos por cuenta: no por dirección, no por clave. Rotar una clave, o repartir el tráfico entre varias direcciones, no cambia ni uno ni otro. Delante de ellos, el borde aplica un anti-flood por dirección IP: 20 peticiones por segundo, ráfagas de 40, rechazadas con 429 edge_rate_limited y Retry-After: 1. Solo frena las avalanchas: dimensiona en consecuencia una dirección de salida compartida (NAT, serverless).

  • El límite de velocidad se mide por minuto, con una ráfaga tolerada: unas cuantas peticiones de golpe pasan; más allá, las siguientes se suavizan y después se rechazan. El rechazo es un 429 rate_limited cuyo Retry-After da los segundos hasta la siguiente petición permitida (el mismo valor que error.details.retry_after_s).
  • La cuota mensual cuenta cada petición sujeta a cuota durante el mes natural en UTC, y se reinicia a cero el primer día del mes. Una vez agotada, devuelve un 429 cuyo Retry-After da los segundos que faltan para que se renueve, o hasta un cambio de plan, que es inmediato.
HTTP/1.1 429 Too Many Requests
Retry-After: 2
X-Deny-Reason: rate_limited

{
  "status": "error",
  "server_time": "2026-09-30T16:07:27.808Z",
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded: your plan allows a limited number of requests per minute. Retry after the Retry-After delay.",
    "details": {
      "retry_after_s": 2
    }
  }
}

La cabecera X-Deny-Reason lleva el motivo de cualquier rechazo ligado al plan (rate_limited, quota_exceeded, plan_family, plan_websocket, missing_api_key, invalid_api_key o history_depth), y el cuerpo lo nombra en error.code (rate_limited, quota_exceeded, plan_family, plan_websocket, invalid_api_key, history_depth) con un error.message en inglés. Toda respuesta hecha con una clave contabilizada (cualquier clave creada en la consola) lleva las cabeceras estándar del IETF, en dos políticas: RateLimit-Policy: "rate";q=…;w=…, "quota";q=…;w=… y RateLimit: "rate";r=…;t=…, "quota";r=…;t=…. El r de quota_exceeded es la cuota mensual restante. La consola muestra el mismo estado, y avisa al 80 % y después en la primera petición rechazada.

#Las familias de datos de mercado

Cada endpoint pertenece exactamente a una familia de cuota, y cada plan abre un conjunto de familias. Una familia que falta en tu plan falta en todos los canales: la ruta REST devuelve un 403, el snapshot retira sus campos y los enumera en out_of_plan_fields, el flujo WebSocket rechaza el canal.

FamiliaFreeTradersFinancialStartup
Precio y volumen price_volumesísísísí
Derivados derivativessísísísí
Microestructura microstructure—sísísí
Ticks brutos trades——sísí
Opciones options—sísísí
Snapshot snapshot—sísísí
Indicadores indicatorssísísísí
Macro macrosísísísí
On-chain onchain——sísí
Sentimiento sentiment——sísí
ETF etf——sísí
Tokenomics tokenomics——sísí
403 · plan_family
HTTP/1.1 403 Forbidden
X-Deny-Reason: plan_family

{
  "status": "error",
  "server_time": "2026-09-30T16:07:27.808Z",
  "error": {
    "code": "plan_family",
    "message": "The 'options' data family is not included in your plan. GET /v1/limits lists the families of your key; https://bytnode.com/pricing lists the plans that open it."
  }
}

La correspondencia entre las diez categorías del catálogo y estas doce familias de datos de mercado está en la página de precios; la familia de cada ruta está en el catálogo de endpoints y en el contrato (x-family, los identificadores que devuelve GET /v1/limits).

#Hasta dónde llega el historial

La profundidad del historial depende del plan y de la temporalidad. Es una ventana móvil desde ahora, no un límite por petición: ayer está fuera del plan en velas de 1 min en Free, sea cual sea la paginación.

TemporalidadFreeTradersFinancialStartup
1m1 h24 h3 días1 semana
5m4 h3 días1 semana30 días
15m4 h3 días1 semana30 días
1h24 h1 semana30 días90 días
4h1 semana30 días72 díasCompleto
1d30 díasCompletoCompletoCompleto
trades——1 h24 h
  • 30m sigue la ventana de 1h y 1w la de 1d: «Completo» vale por tanto también para la semana allí donde vale para el día.
  • Las rutas sin temporalidad (historiales since_ms / until_ms) están limitadas por la ventana 1h del plan: 24 h en Free, 1 semana en Traders, 30 días en Financial, 90 días en Startup. Las series diarias (un punto al día o menos: Fear & Greed, on-chain, ETF, macro) siguen la fila 1d: ilimitadas donde indica «Completo».
  • El funding (historiales de la tasa y del acumulado, ventanas de ocho horas, since_ms / until_ms admitidos) sigue la ventana 4h del plan: 1 semana en Free, 30 días en Traders, 72 días en Financial, completo en Startup.
  • Las rutas operación por operación (/v1/trades/spot, /v1/trades/futures, /v1/trades/large, /v1/trades-kline/futures/seconds) tienen su propia ventana, la fila ticks de arriba, y solo están abiertas donde lo está la familia: 1 h en Financial, 24 h en Startup. Los campos correspondientes del snapshot (trades_spot, trades_futures, trades_kline_futures_seconds) están limitados en el tiempo por la misma ventana.
  • La comprobación se hace sobre el límite más antiguo realmente alcanzado: limit multiplicado por la duración de la temporalidad, o since_ms, o un until_ms que ya va más allá de la ventana.

Superarlo devuelve un 403 explícito, nunca una respuesta truncada: el error.message dice qué se pidió, qué permite el plan y el limit máximo utilizable. Los límites que escribes tú mismo (since_ms, until_ms) tienen una tolerancia de dos minutos para el desfase de reloj; un limit solo, no. Sin limit ni since_ms, no se rechaza nada: la página simplemente se detiene en el borde de la ventana, y next vale null ahí.

403 · history_depth
HTTP/1.1 403 Forbidden
X-Deny-Reason: history_depth

{
  "status": "error",
  "server_time": "2026-09-30T16:07:27.808Z",
  "error": {
    "code": "history_depth",
    "message": "History depth beyond your plan: 30 day(s) requested on 1h, your plan allows 1 day(s) (i.e. at most limit=24 on this timeframe, and no since_ms/until_ms bound beyond that window).",
    "param": "limit",
    "details": {
      "window_s": 86400,
      "earliest_ms": 1791763200000,
      "max_limit": 24,
      "timeframe": "1h"
    }
  }
}

Lo que contiene el propio dato

Más allá de la ventana de su plan, la profundidad del propio dato depende del dato y, para las velas y los flujos, de la granularidad. Dato más antiguo servido, medido el 2026-10-15 en BTCUSDT (BTC para opciones y ETF); un símbolo listado más tarde empieza en su propia cotización. Es la fecha de inicio de cada serie: desde ahí hasta hoy, el histórico es continuo.

Dato1m – 30m1h4h1d · 1w
/v1/klines/history2026-05-282026-04-032025-09-302017-08-17
/v1/trades-kline/…/history
/v1/cvd/…/history

/v1/buy-sell-ratio/…/history

/v1/trades/avg-size/…/history
2026-06-052026-04-032025-09-302023-10-01
/v1/spread/interexchange/history2026-05-282026-04-032025-09-302023-10-01
/v1/orderbook/…/history1m 2026-09-26 · 5m, 30m 2026-09-18 · 15m 2026-09-022026-07-042025-10-072024-09-06
/v1/oi/history
/v1/oi/change/history
2026-05-28 19:10 · 2026-09-12 14:40 · 2026-10-19 09:31 · 2026-10-27 18:03 *2026-04-04 17:002025-10-072023-10-04
/v1/basis/history2026-05-28 19:10 · 2026-09-12 14:40 · 2026-10-19 09:31 · 2026-10-27 18:03 *2026-04-04 17:002025-10-072023-10-03
/v1/funding/rate/history
/v1/funding/cumulative/history
2025-09-30
/v1/liquidations/cumulative/history
/v1/liquidations/big-small-ratio/history
2026-05-28
/v1/options/…/history2026-06-08
/v1/macro/history
/v1/macro/net-liquidity/history
2021-06-01
/v1/macro/intraday/history1m 2026-06-23 · 5m, 15m 2026-06-152024-08-242024-08-242016-01-03
/v1/btc/mvrv/history2022-06-08
/v1/btc/nvt/history
/v1/btc/active-addresses/history

/v1/btc/revenue-per-difficulty/history
2024-06-08
/v1/btc/{fees,mempool,mining,network}/history
/v1/eth/…/history
2026-06-08
/v1/etf/fundamentals/history2026-02-04
/v1/tokenomics/history2017-08-17
/v1/fear-greed/history2018-02-01
/v1/global/history2026-06-06
  • Trades individuales (/v1/trades/spot, /v1/trades/futures, /v1/trades/large) y trades por segundo (/v1/trades-kline/futures/seconds): una ventana móvil de 72 horas, no una fecha de inicio.
  • Las velas diarias y semanales llegan hasta 2017, sin volumen antes del 2023-10-01 (null). Macro: por serie, desde 2021-06 (el oro desde el 2025-06-09); las series intradía diarias empiezan entre 2016 y 2020 (PAXGUSDT 2020-08-28). Opciones a partir de la granularidad 5 m; /v1/options/max-pain/history cubre cada vencimiento desde su cotización. Los eventos de liquidación (/v1/liquidations/events) son los más recientes, sin límites de fecha. * Open interest y basis: horas en UTC; la primera fecha de la columna 1m–30m es la de los doce pares originales, la segunda la de AVAX, HBAR, LINK, NEAR, TAO, UNI, XMR, ADA, GRAM y LTC, cuyas lecturas anteriores son horarias, la tercera la de los 55 pares añadidos el 2026-10-19. Para esos 55 pares, las velas y los indicadores se remontan como los demás, sin volúmenes (null) antes del 2026-10-19; el funding se remonta al 2026-09-16; todas las demás series empiezan el 2026-10-19. La cuarta fecha es la de los 27 pares añadidos el 2026-10-27: sus velas e indicadores también se remontan (MUSDT: velas 1m desde el 2026-10-21, 5m desde el 2026-09-23, 15m desde el 2026-07-16 — su mercado de referencia conserva menos puntos), sin volúmenes (null) antes del 2026-10-27; su funding se remonta hasta donde cada plataforma lo publica; todas las demás series empiezan el 2026-10-27.

#Conexiones al flujo

El flujo WebSocket está abierto a partir de Traders. La clave se comprueba en el handshake: un plan sin el flujo recibe un 403 y la conexión no se establece. El límite de conexiones simultáneas vale para toda la cuenta, todas las claves juntas; la conexión de más se cierra con el código 4003 y el límite en el motivo (un cliente demasiado lento se cierra con 4005). Un 503 en el handshake no está ligado a tu plan: dice que el servicio de flujo ha alcanzado su capacidad, para todas las cuentas.

LímiteAl superarlo
Simultaneous connections per account: 3 on Traders, 10 on Financial, 20 on Startupcierre 4003, el límite en el motivo
Flujo ausente del plan (Free)403 en el handshake, X-Deny-Reason: plan_websocket
Capacidad del servicio de flujo, sumando todas las cuentas503 en el handshake, reintentar más tarde
Canal de una familia fuera del planop: error, la suscripción no se aplica
Aperturas: 1 por segundo, ráfaga de 10429 en el handshake
Cola de envío de 512 tramasse descartan las más antiguas, seq salta
10 desbordamientos toleradoscierre 4005, motivo «client too slow»

Una conexión que permanece suscrita cuesta mucho menos que consultas repetidas: si llamas al mismo endpoint cada segundo, el flujo es la respuesta adecuada. Ver Flujo WebSocket.

#Límites de profundidad

Con independencia del plan, cada ruta limita su limit. Estos límites son técnicos; la ventana del plan se aplica encima, y cuenta la más estricta de las dos.

SuperficieTipoDescripción
REST endpointslimit1000 en todas las rutas; 10 000 en los eventos individuales (ticks, operaciones grandes, liquidaciones). El máximo exacto figura en la tabla de parámetros de cada ruta.
Snapshotone ceiling per field1000 velas o buckets por campo @tf (klines, OI, libro de órdenes, ratio compra/venta, tamaño de los trades, liquidaciones grandes/pequeñas), 1440 para las velas de trades, 200 para el CVD, 50 para los spreads entre mercados; 10 000 trades individuales y eventos de liquidación. Un campo sin marco temporal (basis, variación de OI, liquidaciones acumuladas…) solo sirve su último valor: profundidad 1. Por encima, 422; más allá de la ventana del plan, 403.
Indicatorsresults + warm-up ≤ 1000Cincuenta instancias por llamada como máximo. El rechazo indica el periodo máximo utilizable para el limit pedido.

#Qué hacer

Respeta el plazo anunciado y no repitas un 403

En un 429, igual que en un 503, la cabecera Retry-After da el plazo cuando está presente. Un 403 ligado al plan (X-Deny-Reason plan_family, history_depth o plan_websocket) no cambiará por repetirlo: lee X-Deny-Reason y error.code, y corrige la petición o cambia de plan.

Python
import time
import httpx  # pip install httpx


def get(client: httpx.Client, path: str, **params):
    """Retry on the delay the server announces, never on a 403."""
    for attempt in range(4):
        response = client.get(path, params=params)

        if response.status_code == 429 and response.headers.get("X-Deny-Reason") == "quota_exceeded":
            # The monthly quota is spent: Retry-After counts the seconds until the 1st
            # of the month. Do not sleep for days: stop, or change plan.
            raise RuntimeError(response.json()["error"]["message"])

        if response.status_code in (429, 503):
            # The server knows when it will be ready: do not invent a delay.
            wait = float(response.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait)
            continue

        body = response.json()
        if body["status"] == "error":
            # 401 / 403 / 422: the request itself is refused (key, plan, value).
            # Replaying it as is produces exactly the same response: keep the
            # stable code, it says what to change.
            raise RuntimeError(f'{body["error"]["code"]}: {body["error"]["message"]}')
        return body

    raise RuntimeError("the service is still unavailable after 4 attempts")

Agrupa en lugar de repetir

El snapshot trae hasta cuarenta y ocho campos en una petición, contada una sola vez. Para un panel, es una llamada por ciclo en lugar de diez, y diez veces menos cuota.

Comparación
# Three calls where one is enough.
GET /v1/funding/rate?symbol=BTCUSDT
GET /v1/basis?symbol=BTCUSDT
GET /v1/oi/change?symbol=BTCUSDT

# The same result, in one request (from Traders upwards).
GET /v1/snapshot?symbol=BTCUSDT&funding_rate=1&basis=1&oi_change=1

No vuelvas a pedir lo que no cambia

Fear & Greed publica un punto al día. Los fundamentales de los ETF son trimestrales. Las series macro diarias cambian una vez al día. Consultarlas cada minuto consume cuota sin aprender nada: ajusta cada familia al ritmo de sus datos.