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ímite | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| Peticiones al mes | 10.000 | 200.000 | 2.000.000 | 20.000.000 |
| Límite de velocidad, por minuto | 30 | 60 | 300 | 600 |
| Ráfaga permitida | 10 | 20 | 50 | 100 |
| Familias de datos | 4 / 12 | 7 / 12 | 12 / 12 | 12 / 12 |
| Endpoints REST abiertos | 35 | 85 | 135 | 135 |
| Conexiones WebSocket simultáneas | — | 3 | 10 | 20 |
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
429rate_limitedcuyoRetry-Afterda los segundos hasta la siguiente petición permitida (el mismo valor queerror.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
429cuyoRetry-Afterda 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.
| Familia | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| Precio y volumen price_volume | sí | sí | sí | sí |
| Derivados derivatives | sí | sí | sí | sí |
| Microestructura microstructure | — | sí | sí | sí |
| Ticks brutos trades | — | — | sí | sí |
| Opciones options | — | sí | sí | sí |
| Snapshot snapshot | — | sí | sí | sí |
| Indicadores indicators | sí | sí | sí | sí |
| Macro macro | sí | sí | sí | sí |
| On-chain onchain | — | — | sí | sí |
| Sentimiento sentiment | — | — | sí | sí |
| ETF etf | — | — | sí | sí |
| Tokenomics tokenomics | — | — | sí | sí |
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.
| Temporalidad | Free | Traders | Financial | Startup |
|---|---|---|---|---|
1m | 1 h | 24 h | 3 días | 1 semana |
5m | 4 h | 3 días | 1 semana | 30 días |
15m | 4 h | 3 días | 1 semana | 30 días |
1h | 24 h | 1 semana | 30 días | 90 días |
4h | 1 semana | 30 días | 72 días | Completo |
1d | 30 días | Completo | Completo | Completo |
trades | — | — | 1 h | 24 h |
30msigue la ventana de1hy1wla de1d: «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 ventana1hdel 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 fila1d: ilimitadas donde indica «Completo». - El funding (historiales de la tasa y del acumulado, ventanas de ocho horas,
since_ms/until_msadmitidos) sigue la ventana4hdel 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 filaticksde 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:
limitmultiplicado por la duración de la temporalidad, osince_ms, o ununtil_msque 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í.
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.
| Dato | 1m – 30m | 1h | 4h | 1d · 1w |
|---|---|---|---|---|
/v1/klines/history | 2026-05-28 | 2026-04-03 | 2025-09-30 | 2017-08-17 |
/v1/trades-kline/…/history/v1/cvd/…/history/v1/buy-sell-ratio/…/history/v1/trades/avg-size/…/history | 2026-06-05 | 2026-04-03 | 2025-09-30 | 2023-10-01 |
/v1/spread/interexchange/history | 2026-05-28 | 2026-04-03 | 2025-09-30 | 2023-10-01 |
/v1/orderbook/…/history | 1m 2026-09-26 · 5m, 30m 2026-09-18 · 15m 2026-09-02 | 2026-07-04 | 2025-10-07 | 2024-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:00 | 2025-10-07 | 2023-10-04 |
/v1/basis/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:00 | 2025-10-07 | 2023-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/…/history | 2026-06-08 | |||
/v1/macro/history/v1/macro/net-liquidity/history | 2021-06-01 | |||
/v1/macro/intraday/history | 1m 2026-06-23 · 5m, 15m 2026-06-15 | 2024-08-24 | 2024-08-24 | 2016-01-03 |
/v1/btc/mvrv/history | 2022-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/history | 2026-02-04 | |||
/v1/tokenomics/history | 2017-08-17 | |||
/v1/fear-greed/history | 2018-02-01 | |||
/v1/global/history | 2026-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 (PAXGUSDT2020-08-28). Opciones a partir de la granularidad 5 m;/v1/options/max-pain/historycubre 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ímite | Al superarlo |
|---|---|
| Simultaneous connections per account: 3 on Traders, 10 on Financial, 20 on Startup | cierre 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 cuentas | 503 en el handshake, reintentar más tarde |
| Canal de una familia fuera del plan | op: error, la suscripción no se aplica |
| Aperturas: 1 por segundo, ráfaga de 10 | 429 en el handshake |
| Cola de envío de 512 tramas | se descartan las más antiguas, seq salta |
| 10 desbordamientos tolerados | cierre 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.
| Superficie | Tipo | Descripción |
|---|---|---|
REST endpoints | limit | 1000 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. |
Snapshot | one ceiling per field | 1000 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. |
Indicators | results + warm-up ≤ 1000 | Cincuenta 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.
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.
# 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=1No 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.