速率限制
针对订单操作和 API 请求的按钱包速率限制。
概述
速率限制采用固定的 60 秒窗口。钱包限制取决于钱包所属的等级,适用于:
- 下单(
POST /order、PUT /order、WebSocketPlaceOrder以及经 TEE 路由的永续合约订单提交) - 撤单(
DELETE /order、DELETE /order_cloid以及经 TEE 路由的永续合约撤单) - API 请求(钱包范围的读取请求及其他签名写入请求)
撤单、代理授权、MMP 写入和公共风险模拟另有按网络来源计算的独立限制,并设有进程级上限。
计数器由每个 API 进程保存在内存中,不在副本之间共享。因此,请将公布的数值视为单个进程所能接受的最大值,而非整个集群的总额度。
默认限制
| 等级 | 下单/分钟 | 撤单/分钟 | API 请求/分钟 | 最大挂单数 | 最大持仓数 |
|---|---|---|---|---|---|
| 默认 | 60 | 120 | 600 | 100 | 50 |
| 等级 1 | 30 | 60 | 300 | 50 | 20 |
| 等级 2 | 120 | 300 | 1,200 | 500 | 200 |
| 做市商 | 1,200 | 2,400 | 6,000 | 5,000 | 无限制 |
新钱包默认获得默认限制。如需升级等级,请联系支持团队。您当前的 API 请求限制可在任何钱包范围读取请求的 X-RateLimit-Limit 响应头中查看,例如 GET /orders?wallet=...。
速率限制响应
超出速率限制时,API 返回 429 Too Many Requests:
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded for OrderPlacement: 60 per minute, retry after 45 seconds",
"retry_after_secs": 45,
"limit": 60
}
响应头
受钱包限制的端点会返回以下响应头。429 响应包含 X-RateLimit-Limit、X-RateLimit-Remaining: 0 和 Retry-After,但不包含 X-RateLimit-Reset:
| 响应头 | 说明 | 示例 |
|---|---|---|
X-RateLimit-Limit | 每个窗口允许的最大请求数 | 60 |
X-RateLimit-Remaining | 当前窗口剩余的请求数 | 42 |
X-RateLimit-Reset | 窗口重置时的 Unix 时间戳(秒,仅成功响应包含) | 1737312060 |
Retry-After | 距可重试的秒数(仅 429 响应包含) | 45 |
响应头示例
成功请求:
HTTP/1.1 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1737312060
被限流的请求:
HTTP/1.1 429 Too Many Requests
Retry-After: 45
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
速率限制类别
每种操作类型的速率限制分别计算:
下单
按钱包计入所属等级的下单/分钟额度:
POST /order和PUT /order- WebSocket
PlaceOrder POST /v1/tee-perp/orders/submit及其他永续合约订单提交,计入账户管理者钱包
POST /bulk_order 和 PUT /bulk_order 每个请求最多包含 50 个条目。
撤单
按钱包计入所属等级的撤单/分钟额度:
DELETE /order和DELETE /order_cloid- 永续合约撤单,计入签名的 API 钱包
所有撤单路由(包括 DELETE /bulk_order 和 DELETE /bulk_order_cloid)在签名验证之前还受到额外限制:每个网络来源每分钟 6,000 个撤单腿,进程级每分钟 60,000 个撤单腿。批量撤单中每个条目计为一个撤单腿。
API 请求
按钱包计入所属等级的 API 请求/分钟额度:
- 钱包范围的读取请求,以
wallet查询参数为键 - 上文未列出的签名写入请求,例如 MMP 配置和保证金模式
RFQ 提交
POST /rfq/request 和 WebSocket RFQ 提交命令限制为每个钱包每分钟 10 次,与等级无关。
风险模拟
公共投资组合和订单模拟(POST /risk/simulate/portfolio、
POST /risk/simulate/orders 以及永续合约预览 POST /v1/tee-perp/preview)
另有独立限制:每个网络来源每分钟 60 次请求,进程级每分钟 600 次请求。单个 API 进程中最多同时运行四个模拟。超出配额或遇到模拟工作线程已饱和的请求将返回 429 Too Many Requests。
代理授权
POST /approve-agent、DELETE /revoke-agent 和 DELETE /revoke-all-agents 在签名验证之前受到限制:每个网络来源每分钟 120 次请求,进程级每分钟 1,200 次请求。
MMP 写入
MMP 配置写入在签名验证之前受到限制:每个网络来源每分钟 120 次请求,进程级每分钟 1,200 次请求。此限制叠加于钱包的 API 请求限制之上。
持仓与订单限制
除速率限制外,钱包还有最大挂单数和最大持仓数限制:
| 限制类型 | 说明 | 拒绝方式 |
|---|---|---|
| 最大挂单数 | 同时存在的挂单上限 | 钱包达到上限时,新订单将被拒绝 |
| 最大持仓数 | 不同持仓的上限(-1 = 无限制) | 若订单会开立新持仓,则被拒绝 |
这些属于订单拒绝,而非 HTTP 错误。订单响应为 HTTP 200,带有 status: "REJECTED" 和 reason,例如:
max_open_orders_exceeded: current=100, limit=100
max_positions_exceeded: wallet 0x... has 50 positions, limit is 50
最佳实践
处理速率限制
- 监控响应头:主动跟踪
X-RateLimit-Remaining - 遵守 Retry-After:重试前等待指定的时长
- 实现退避:对连续的 429 响应使用指数退避
import time
def place_order_with_retry(order, max_retries=3):
for attempt in range(max_retries):
response = api.place_order(order)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
time.sleep(retry_after)
continue
return response
raise RateLimitError("Max retries exceeded")
优化请求用量
- 使用批量端点:通过
POST /bulk_order在一个请求中提交多个订单 - 批量撤单:使用
DELETE /bulk_order或DELETE /bulk_order_cloid,而非多次发送DELETE /order请求 - 使用 WebSocket 获取更新:订阅订单更新,而非轮询
GET /orders
监控
在客户端跟踪以下指标:
- 各操作类型的请求速率
X-RateLimit-Remaining的变化趋势- 429 响应的频率
Retry-After的平均时长
错误参考
| HTTP 状态码 | 错误代码 | 说明 |
|---|---|---|
| 429 | rate_limit_exceeded | 超出速率限制,请在指定时间后重试 |
完整错误参考请参阅错误。