应用与 AI 智能体的使用限制
#各方案的限制
四个方案,四组限制。企业版需协商确定,没有默认值。
| 限制 | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| 每月请求数 | 10,000 | 200,000 | 2,000,000 | 20,000,000 |
| 速率限制(每分钟) | 30 | 60 | 300 | 600 |
| 允许的突发量 | 10 | 20 | 50 | 100 |
| 市场数据族 | 4 / 12 | 7 / 12 | 12 / 12 | 12 / 12 |
| 开放的 REST 端点 | 35 | 85 | 135 | 135 |
| WebSocket 同时连接数 | — | 3 | 10 | 20 |
目录中记录了 138 条路径。其中三条从不计入配额,仅受速率限制约束:/v1/health(唯一无需密钥的接口)、/v1/limits(你的密钥的限制),以及 POST /v1/ws/token(短期 WebSocket 令牌,遵循数据流权限)。/v1/status 按一次价格与成交量请求计数。合约在 x-family 中给出每个接口所属的市场数据族。
#速率限制与月度配额
两个计数器,都按账户计算:既不按地址,也不按密钥。轮换密钥或把流量分散到多个地址,都不会改变其中任何一个。在它们之前,边缘网关还按 IP 地址做防洪:每秒 20 个请求,突发上限 40 个,超出时返回 429 edge_rate_limited 并带 Retry-After: 1。它只拦截洪泛:共享出口地址(NAT、serverless)请据此规划。
- 速率限制按分钟计算,并允许一定突发:一次发出少量请求可以通过,超过后后续请求会被平滑处理,然后被拒绝。拒绝时返回
429rate_limited,其Retry-After给出距下一次允许请求的秒数(与error.details.retry_after_s的值相同)。 - 月度配额按 UTC 自然月统计每一个计入配额的请求,并在每月第一天清零。用尽后,在配额重置或更换方案(即时生效)之前,都会返回
429,其Retry-After给出距离配额重置的秒数。
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
}
}
}X-Deny-Reason 响应头给出任何与方案相关的拒绝原因(rate_limited、quota_exceeded、plan_family、plan_websocket、missing_api_key、invalid_api_key 或 history_depth),正文在 error.code 中指明该原因(rate_limited、quota_exceeded、plan_family、plan_websocket、invalid_api_key、history_depth),并附英文的 error.message。所有使用计量密钥(控制台中创建的每把密钥都是)的响应都带有 IETF 标准响应头,分为两项策略:RateLimit-Policy: "rate";q=…;w=…, "quota";q=…;w=… 与 RateLimit: "rate";r=…;t=…, "quota";r=…;t=…。quota_exceeded 的 r 即月度配额余量。控制台显示同样的状态,达到 80% 时会提醒,首次请求被拒时再次提醒。
#市场数据族
每个端点恰好属于一个配额族,每个方案开放一组市场数据族。方案中缺少的市场数据族在所有通道上都不可用:REST 接口返回 403,快照会移除其字段并在 out_of_plan_fields 中列出,WebSocket 数据流会拒绝该频道。
| 市场数据族 | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| 价格与成交量 price_volume | 是 | 是 | 是 | 是 |
| 衍生品 derivatives | 是 | 是 | 是 | 是 |
| 微观结构 microstructure | — | 是 | 是 | 是 |
| 原始逐笔 trades | — | — | 是 | 是 |
| 期权 options | — | 是 | 是 | 是 |
| 快照 snapshot | — | 是 | 是 | 是 |
| 指标 indicators | 是 | 是 | 是 | 是 |
| 宏观 macro | 是 | 是 | 是 | 是 |
| 链上 onchain | — | — | 是 | 是 |
| 情绪 sentiment | — | — | 是 | 是 |
| ETF etf | — | — | 是 | 是 |
| 代币经济 tokenomics | — | — | 是 | 是 |
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."
}
}目录中十个类别与这十二个市场数据族之间的对应关系见价格页面;每个接口所属的市场数据族见端点目录以及合约(x-family,即 GET /v1/limits 返回的标识符)。
#历史能回溯多远
历史深度取决于方案和周期。它是一个从当前时刻起的滚动窗口,而不是每次请求的上限:在 Free 方案中,无论如何分页,昨天的 1 分钟 K 线都超出方案范围。
| 周期 | Free | Traders | Financial | Startup |
|---|---|---|---|---|
1m | 1 小时 | 24 小时 | 3 天 | 1 周 |
5m | 4 小时 | 3 天 | 1 周 | 30 天 |
15m | 4 小时 | 3 天 | 1 周 | 30 天 |
1h | 24 小时 | 1 周 | 30 天 | 90 天 |
4h | 1 周 | 30 天 | 72 天 | 全部 |
1d | 30 天 | 全部 | 全部 | 全部 |
trades | — | — | 1 小时 | 24 小时 |
30m沿用1h的窗口,1w沿用1d的窗口:因此凡是日线为“全部”的地方,周线也同样为“全部”。- 没有周期参数的接口(
since_ms/until_ms历史)受方案1h窗口的限制:Free:24 小时, Traders:1 周, Financial:30 天, Startup:90 天。日度序列(每天一个点或更慢:Fear & Greed、链上、ETF、宏观)改为遵循1d行——标为“全部”的方案不受限制。 - 资金费率(费率与累计历史,八小时窗口,接受
since_ms/until_ms)遵循方案的4h窗口:Free:1 周, Traders:30 天, Financial:72 天, Startup:全部。 - 逐笔成交路由(
/v1/trades/spot、/v1/trades/futures、/v1/trades/large、/v1/trades-kline/futures/seconds)有自己的窗口,即上方的ticks行,并且只在开放该市场数据族的套餐中可用:Financial:1 小时, Startup:24 小时。快照中对应的字段(trades_spot、trades_futures、trades_kline_futures_seconds)在时间上受同一窗口限制。 - 校验针对实际到达的最早边界:
limit乘以周期时长,或since_ms,或已超出窗口的until_ms。
超出范围会返回明确的 403,绝不会返回截断的响应:error.message 会说明请求了什么、方案允许什么,以及可使用的最大 limit。你自己填写的边界(since_ms、until_ms)享有两分钟的时钟偏差容忍;单独的 limit 则没有。既不带 limit 也不带 since_ms 时不会被拒绝:结果页只是停在窗口边缘,此时 next 为 null。
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"
}
}
}数据本身包含的范围
在方案窗口之外,数据本身的历史深度取决于数据类型;对于K线和资金流数据,还取决于时间粒度。下表为 2026-10-15 在 BTCUSDT(期权和 ETF 为 BTC)上实测的最早数据;较晚上线的交易对从其上线日开始。这是每个序列的起始日期:从该日期至今,历史数据连续。
| 数据 | 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 | |||
- 逐笔成交(
/v1/trades/spot、/v1/trades/futures、/v1/trades/large)和每秒成交(/v1/trades-kline/futures/seconds):72 小时滚动窗口,而非起始日期。 - 日线和周线K线可追溯至 2017 年,2023-10-01 之前无成交量(
null)。宏观:按序列,自 2021-06 起(黄金自 2025-06-09 起);日内序列的日线数据始于 2016 至 2020 年之间(PAXGUSDT2020-08-28)。期权自 5 分钟粒度起;/v1/options/max-pain/history覆盖每个到期日自上线以来的数据。清算事件(/v1/liquidations/events)为最新事件,无日期范围。 * 持仓量与基差:时间为 UTC;1m–30m 列的第一个日期适用于最初的十二个交易对,第二个日期适用于 AVAX、HBAR、LINK、NEAR、TAO、UNI、XMR、ADA、GRAM 和 LTC,它们更早的读数为每小时一次,第三个日期适用于 2026-10-19 新增的 55 个交易对。对这 55 个交易对,K 线和指标与其他交易对一样可追溯,但 2026-10-19 之前没有成交量(null);资金费率可追溯至 2026-09-16;其他所有序列均从 2026-10-19 开始。第四个日期适用于 2026-10-27 新增的 27 个交易对:它们的 K 线和指标同样可追溯(MUSDT:1m K 线自 2026-10-21 起,5m 自 2026-09-23 起,15m 自 2026-07-16 起——其参考市场保留的数据点较少),但 2026-10-27 之前没有成交量(null);资金费率可追溯至各交易所公布的最早时间;其他所有序列均从 2026-10-27 开始。
#数据流连接
WebSocket 数据流从 Traders 方案起开放。密钥在握手时校验:不含数据流的方案收到 403,连接不会建立。同时连接上限按整个账户(所有密钥合计)计算;超出的连接以代码 4003 关闭,原因中给出上限(消费过慢的客户端以 4005 关闭)。握手时的 503 与你的方案无关:表示数据流服务已达容量上限(所有账户合计)。
| 限制 | 超出时 |
|---|---|
| Simultaneous connections per account: 3 on Traders, 10 on Financial, 20 on Startup | 以 4003 关闭,原因中给出上限 |
| 方案不含数据流(Free) | 握手时返回 403,X-Deny-Reason: plan_websocket |
| 数据流服务的总容量(所有账户合计) | 握手时返回 503,稍后重试 |
| 订阅方案外市场数据族的频道 | op: error,订阅不生效 |
| 建立连接:每秒 1 次,突发 10 次 | 握手时返回 429 |
| 发送队列 512 帧 | 丢弃最旧的帧,seq 出现跳跃 |
| 允许溢出 10 次 | 以 4005 关闭,原因为 “client too slow” |
保持订阅的连接比反复轮询划算得多:如果你每秒调用同一个端点,数据流才是正确的选择。见 WebSocket 数据流。
#深度上限
与方案无关,每个接口都会限制其 limit。这些上限是技术性的;方案的窗口叠加其上,以两者中更严格的为准。
| 范围 | 类型 | 说明 |
|---|---|---|
REST endpoints | limit | 所有接口为 1000;单个事件(逐笔、大额成交、清算)为 10 000。每个接口的准确上限见其参数表。 |
Snapshot | one ceiling per field | 每个 @tf 字段最多 1000 根 K 线或分桶(klines、OI、订单簿、买卖比、成交规模、大小额爆仓),成交 K 线 1440,CVD 200,跨交易所价差 50;逐笔成交与爆仓事件 10 000。不带周期的字段(基差、OI 变化、累计爆仓……)只返回最新值:深度 1。超出返回 422;超出方案窗口返回 403。 |
Indicators | results + warm-up ≤ 1000 | 每次调用最多五十个实例。拒绝时会给出在所请求的 limit 下可用的最大周期。 |
#如何应对
遵守公布的延迟,不要重放 403
无论是 429 还是 503,只要有 Retry-After 响应头,它就会给出延迟。与方案相关的 403(X-Deny-Reason 为 plan_family、history_depth 或 plan_websocket)重放也不会改变:请阅读 X-Deny-Reason 和 error.code,然后修正请求或更换方案。
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")合并请求而不是重复请求
快照一次请求最多返回四十八个字段,只计一次。对于仪表盘,这意味着每个周期一次调用而不是十次,配额消耗也减少十倍。
# 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不要重复请求不会变化的数据
恐惧与贪婪指数每天发布一个数据点。ETF 基本面按季度更新。日度宏观序列每天变化一次。按分钟查询它们只会消耗配额而得不到新信息:请按各市场数据族的更新节奏安排请求。