Polymarket API 速率限制:完整参考
Polymarket 把它的速率限制分散在好几个页面上,分属两套完全不同的系统,而且使用的是几乎没人预料到的 10 秒窗口。这里把它们全部整理成一组表格,并说明超出限制时实际会发生什么。
如果你曾试图回答一个简单的问题,我每秒可以向 Polymarket 发送多少个请求?,你就会发现这个问题没有简单的答案。限制分散在两套独立的系统中,发布在不同的页面上,而且是以 10 秒窗口表示的,而不是大多数 API 使用的每秒或每分钟数字。
如果要查某个具体路由的限制,每个端点在 Polymarket API 参考中也都有自己的页面。
本页把所有有文档记录的限制集中在一处,解释这两套系统,并展示越过限制时实际会发生什么。所有数字都来自 Polymarket 官方文档,截至 2026 年 9 月有效。
简短回答
除以 10。1,500 req / 10s 的限制就是每秒 150 个请求。Polymarket 的全局上限是 15,000 req / 10s(1,500 rps),但每个端点系列下面都有一个低得多的限制,而真正会拦住你的是端点限制。
两套不同的速率限制系统
这是让大多数开发者栽跟头的部分。Polymarket 运行着两个相互独立的限流器,在其中一个之下并不能保护你不被另一个限制。
| Cloudflare IP 限制 | 按签名者令牌桶 | |
|---|---|---|
| 作用范围 | 你的 IP 地址 | 你的签名者地址 |
| 适用于 | 所有 API 和端点 | 仅 CLOB 下单和撤单请求 |
| 机制 | 滑动窗口 | 令牌桶(补充速率 + 突发) |
| 超出限制时 | 请求被限流:延迟并排队 | 请求被拒绝,返回 429 |
| 因何而异 | 端点 | 你的 30 天交易量档位 |
是限流,不是拒绝
这是关于 Cloudflare 层最值得理解的一点。当你超出基于 IP 的限制时,Polymarket 会延迟并排队你的请求,而不是直接拒绝。你不会看到一连串 429,你会看到延迟悄悄上升。一个看起来正常、但响应时间从 40ms 变成了 3 秒的机器人,通常就是超出了速率限制。
Gamma API 速率限制
Base URL 为 https://gamma-api.polymarket.com。Gamma 提供市场和事件元数据,是大多数人探索平台时最先访问的端点。
| 端点 | 限制 | 每秒 |
|---|---|---|
| 通用 | 4,000 req / 10s | 400 rps |
/events | 500 req / 10s | 50 rps |
/markets | 300 req / 10s | 30 rps |
/markets + /events 列表 | 900 req / 10s | 90 rps |
/comments | 200 req / 10s | 20 rps |
/tags | 200 req / 10s | 20 rps |
/public-search | 350 req / 10s | 35 rps |
/markets 是你会遇到的最严格的限制
每 10 秒 300 次请求,/markets 是整个平台上常用端点中限制最严格的,比它上面的 Gamma 通用限制严格 13 倍。如果你在循环中对完整市场列表分页,最先出问题的就是它。
Data API 速率限制
Base URL 为 https://data-api.polymarket.com。持仓、成交历史和投资组合数据。注意这个 API 比 Gamma 或 CLOB 严格得多:通用限制是每 10 秒 1,000 次,只有 Gamma 的四分之一。
| 端点 | 限制 | 每秒 |
|---|---|---|
| 通用 | 1,000 req / 10s | 100 rps |
/trades | 200 req / 10s | 20 rps |
/positions | 150 req / 10s | 15 rps |
/closed-positions | 150 req / 10s | 15 rps |
健康检查(/ok) | 100 req / 10s | 10 rps |
Data API v2
Data API v2 于 2026 年 9 月 4 日在 https://data-api.polymarket.com/v2 上线,有自己的限制。v1 仍在提供服务,但已冻结:新的端点和字段只会出现在 v2 上。
| 端点 | 限制 | 每秒 |
|---|---|---|
通用(所有 /v2 端点) | 800 req / 10s | 80 rps |
/v2/trades | 300 req / 10s | 30 rps |
/v2/positions、/v2/positions/combos | 200 req / 10s | 20 rps |
/v2/activity、/v2/activity/combos | 200 req / 10s | 20 rps |
/v2/prices-history | 200 req / 10s | 20 rps |
/v2/status | 100 req / 10s | 10 rps |
价格历史换了主机,限制收紧了 5 倍
data 主机上的 GET /v2/prices-history 取代了托管在 CLOB 上的路由。CLOB 版本允许每 10 秒 1,000 次请求;v2 路由只允许 200 次。只迁移调用而不迁移请求节奏,你撞上上限的速度会快五倍。v2 还用 429 加 Retry-After 表示负载过高,并使用不透明游标分页:没有 offset。
CLOB API 速率限制
Base URL 为 https://clob.polymarket.com。订单簿本身。CLOB 的通用额度是所有 Polymarket API 中最高的(每 10 秒 9,000 次),但它分为四个限制差异很大的组。
通用
| 端点 | 限制 | 每秒 |
|---|---|---|
| 通用 | 9,000 req / 10s | 900 rps |
GET 余额授权额度 | 200 req / 10s | 20 rps |
UPDATE 余额授权额度 | 50 req / 10s | 5 rps |
市场数据
这里要注意的规律是:单数端点为每 10 秒 1,500 次,复数批量端点为每 10 秒 500 次。在你想起一次批量调用就能覆盖许多代币之前,这看起来像是降级。批量请求每次的成本是单数的 3 倍,但每次调用完成的工作要多得多:永远优先用 /books,而不是循环调用 /book。
| 端点 | 限制 | 每秒 |
|---|---|---|
/book | 1,500 req / 10s | 150 rps |
/books | 500 req / 10s | 50 rps |
/price | 1,500 req / 10s | 150 rps |
/prices | 500 req / 10s | 50 rps |
/midpoint | 1,500 req / 10s | 150 rps |
/midpoints | 500 req / 10s | 50 rps |
/prices-history | 1,000 req / 10s | 100 rps |
| 市场 tick size | 200 req / 10s | 20 rps |
账本
| 端点 | 限制 | 每秒 |
|---|---|---|
/trades、/orders、/notifications、/order | 900 req / 10s | 90 rps |
/data/orders | 500 req / 10s | 50 rps |
/data/trades | 500 req / 10s | 50 rps |
/notifications | 125 req / 10s | 12.5 rps |
认证
| 端点 | 限制 | 每秒 |
|---|---|---|
| API 密钥端点 | 100 req / 10s | 10 rps |
交易:突发与持续
交易端点是唯一有两个 Cloudflare 限制的端点:一个针对短时尖峰的突发限制,以及一个按 10 分钟计算的持续限制。你必须同时保持在两者之下。
| 端点 | 突发 | 持续 |
|---|---|---|
POST /order | 5,000 req / 10s | 120,000 req / 10 min |
DELETE /order | 5,000 req / 10s | 120,000 req / 10 min |
POST /orders | 2,000 req / 10s | 21,000 req / 10 min |
DELETE /orders | 2,000 req / 10s | 15,000 req / 10 min |
DELETE /cancel-all | 250 req / 10s | 6,000 req / 10 min |
DELETE /cancel-market-orders | 1,500 req / 10s | 21,000 req / 10 min |
每 10 秒 250 次的 DELETE /cancel-all 值得特别指出。每个重新报价周期都调用 cancel-all 的做市商会很快耗尽这个额度,而每 10 分钟 6,000 次的持续限制,平均下来每秒只有 10 次 cancel-all 调用。
Bridge、Relayer 及其他
| 端点 | 限制 |
|---|---|
| 通用速率限制(全局上限) | 15,000 req / 10s |
健康检查(/ok) | 100 req / 10s |
Bridge API(https://bridge.polymarket.com) | 50 req / 10s |
Relayer /submit | 25 req / 1 min |
| 用户盈亏 API | 200 req / 10s |
Relayer 的限制与众不同
Relayer /submit 是唯一一个按每分钟而不是每 10 秒计算的有文档限制,每分钟 25 次,是平台上最严格的数字。如果你通过 relayer 提交交易,大约每 2.4 秒只能提交一次。
按签名者令牌桶(CLOB 交易)
在 Cloudflare 之外,Polymarket 还会用按签名者令牌桶评估 CLOB 的下单和撤单请求。每个签名者地址有一个下单桶和一个撤单桶;消耗其中一个不会影响另一个。与 Cloudflare 层不同,超出这些限制会返回真正的 429。
请求消耗的是令牌,而不是每个请求计为一个单位:
| 桶 | 请求 | 令牌消耗 |
|---|---|---|
| 下单 | POST /order | 1 |
| 下单 | POST /orders | 批量中的订单数 |
| 撤单 | DELETE /order | 1 |
| 撤单 | DELETE /orders | 提交的订单 ID 数 |
| 撤单 | DELETE /cancel-all | 1 + 实际被取消的订单数 |
| 撤单 | DELETE /cancel-market-orders | 1 + 被取消的匹配订单数 |
批量请求要么全部通过,要么全部拒绝
只有当桶中的令牌足够覆盖每一项时,批量请求才会被接受。否则整个请求都会被拒绝,什么都不会处理。令牌消耗超过你档位突发容量的批量请求,无论等多久都永远不会被接受:它必须被拆分。
交易量档位
你的桶大小取决于 maker 钱包在滚动 30 天窗口内的累计交易量。档位分配每三小时刷新一次。
| 档位 | 30 天交易量 | 下单速率/秒 | 下单突发 | 撤单速率/秒 | 撤单突发 |
|---|---|---|---|---|---|
| Standard | — | 40 | 60 | 80 | 120 |
| Copper | $30,000+ | 60 | 90 | 120 | 180 |
| Bronze | $50,000+ | 80 | 120 | 160 | 240 |
| Silver | $100,000+ | 200 | 300 | 400 | 600 |
| Gold | $500,000+ | 400 | 600 | 800 | 1,200 |
| Platinum | $2.5M+ | 450 | 675 | 900 | 1,350 |
| Diamond | $5M+ | 525 | 787 | 1,050 | 1,575 |
| Elite | $10M+ | 600 | 900 | 1,200 | 1,800 |
用 burst_seconds = burst / rate_per_sec 计算一次完整突发能持续多久。对于 Standard 签名者是 60 / 40,即 1.5 秒的全速下单,之后就会被限制在每秒 40 个的补充速率。
读取速率限制响应头
按签名者限流器会在每个被评估的请求上返回响应头。这是监控额度最省成本的方式,不需要额外的 API 调用。
| 响应头 | 含义 |
|---|---|
Poly-RateLimit-Remaining | 本次请求后适用桶中的令牌余额 |
Poly-RateLimit-Reset | 当前等待期结束时的 Unix 时间戳 |
Poly-RateLimit-Tier | 所适用的档位 |
Retry-After | 重试延迟秒数,仅在 429 响应中出现 |
Poly-RateLimit-Warning | 当实时执行本会拒绝该请求时为 true |
Poly-RateLimit-Reset 不是桶补满的时间
在 429 时,它告诉你的是你刚才尝试的那个请求何时会有足够的令牌,而不是桶何时补满。你通常不需要等你以为的那么久。此外,在允许撤单余额为负的档位上,cancel-all 之后 Poly-RateLimit-Remaining 可能变为负数。
正确处理 429
正确的重试策略取决于你撞上的是哪个限流器,弄错了只会让情况更糟。有 Retry-After 时遵守它;没有时回退到带随机抖动的指数退避。随机抖动很重要:没有它,你的每个 worker 都会在同一时刻重试,立刻再次触发限制。
const MAX_RETRIES = 5;
async function polyFetch(url: string, init?: RequestInit): Promise<Response> {
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
const res = await fetch(url, init);
// Watch the budget even on success — this is your early warning.
const remaining = res.headers.get("Poly-RateLimit-Remaining");
if (remaining !== null && Number(remaining) < 10) {
console.warn(`Low token budget: ${remaining} (tier ${res.headers.get("Poly-RateLimit-Tier")})`);
}
// Warning mode: not rejected yet, but it would have been.
if (res.headers.get("Poly-RateLimit-Warning") === "true") {
console.warn("Request would be rejected under live enforcement — slow down.");
}
if (res.status !== 429) return res;
if (attempt === MAX_RETRIES) return res;
// Prefer the server's own answer, else exponential backoff.
const retryAfter = res.headers.get("Retry-After");
const baseMs = retryAfter
? Number(retryAfter) * 1000
: Math.min(2 ** attempt * 250, 8000);
// Full jitter — spreads a fleet of workers out instead of resynchronising them.
await new Promise((r) => setTimeout(r, Math.random() * baseMs));
}
throw new Error("unreachable");
}不要原样重试过大的批量请求
如果一个批量请求消耗的令牌超过你档位的突发容量,重试是徒劳的:它永远不可能作为单个请求被接受。把它拆分。这是退避会无限循环的唯一一种情况。
从设计上保持在限制之下
- 用批量代替循环。一次
/books调用代替五十次/book调用,在每 10 秒 500 次的额度中只消耗一次请求,而不是在每 10 秒 1,500 次的额度中消耗五十次,余量提升 17 倍。 - 缓存元数据。
/markets返回的市场元数据在一个市场的生命周期内几乎不变,但/markets是 Gamma 中最严格的限制,每 10 秒 300 次。获取一次,缓存起来,别再在热循环中反复请求。 - 用 WebSocket 获取实时状态。用定时器轮询
/book是耗尽请求额度最常见的方式。改为订阅数据流,让服务器推送变化。 - 给定时任务加入随机抖动。如果每个 worker 都在整分钟准时唤醒,你就会制造一个远高于平均速率的同步尖峰。随机化启动偏移。
- 关注延迟,而不只是错误率。由于 Cloudflare 是限流而不是拒绝,p99 延迟上升是你超出 IP 限制的第一个信号,远早于任何东西以错误的形式出现。
- 跟踪响应头。读取
Poly-RateLimit-Remaining不花任何成本,它能准确告诉你还剩多少额度。
速率限制不等于数据访问
最后一点值得明确说明,因为这是我们见到的最常见的误解:没有任何速率限制档位能给你历史订单簿深度。Polymarket 的 API 提供的是订单簿的当前状态。它不提供上周二 14:03:17 订单簿是什么样子的历史存档,而市场一旦结算,它的订单簿就返回 404。
这是一个结构性缺口,而不是限流问题,再多的退避逻辑也解决不了。如果你想回测一个策略,你需要有人当时记录下来的时点快照,而这正是 PolyTest 存在的意义:240M+ 条 Polymarket 加密货币 Up/Down 市场的历史快照,带完整订单簿深度、亚秒级精度,没有缺口。
常见问题
- Polymarket API 每秒的速率限制是多少?
- Polymarket 按 10 秒窗口公布限制,所以要除以 10。全局上限是每 10 秒 15,000 次(1,500 rps),但每个端点的限制要低得多,它们才是真正的约束:CLOB 的 /book 和 /price 允许每 10 秒 1,500 次(150 rps),Gamma 的 /markets 端点只允许每 10 秒 300 次(30 rps),Data API 的 /positions 端点允许每 10 秒 150 次(15 rps)。
- 超出速率限制时 Polymarket 会返回 429 吗?
- 取决于你撞上的是哪个限流器。基于 IP 的 Cloudflare 限制会对请求限流,即延迟并排队而不是拒绝,所以你看到的是延迟上升而不是错误。CLOB 下单和撤单端点上独立的按签名者令牌桶则会返回 429 Too Many Requests,并附带一个 Retry-After 响应头,告诉你重试前的最短延迟。
- Polymarket CLOB API 的速率限制是多少?
- CLOB 通用限制是每 10 秒 9,000 次。市场数据端点 /book、/price 和 /midpoint 各允许每 10 秒 1,500 次,而它们的批量版本 /books、/prices 和 /midpoints 允许每 10 秒 500 次。账本端点允许每 10 秒 900 次。交易端点同时有突发和持续限制:POST /order 允许每 10 秒 5,000 次突发和每 10 分钟 120,000 次持续。
- Polymarket Gamma API 的速率限制是多少?
- Gamma API 通用限制是每 10 秒 4,000 次。单个端点更严格:/events 为每 10 秒 500 次,/markets 为每 10 秒 300 次,/markets + /events 合并列表为每 10 秒 900 次,/public-search 为每 10 秒 350 次,/comments 和 /tags 各为每 10 秒 200 次。/markets 的限制是平台上常用端点中最严格的。
- Polymarket 的速率限制是按 IP 地址还是按 API 密钥计算的?
- 主要的 Cloudflare 限制是按 IP 地址而不是按 API 密钥计算的,所以同一个 IP 后面的多个密钥共享同一份额度。CLOB 下单和撤单端点上独立的令牌桶限制则以你的签名者地址为范围,大小由你 maker 钱包的 30 天交易量档位决定。
- 能通过 API 获取 Polymarket 历史订单簿数据吗?
- 不能。Polymarket 的 API 只提供当前的市场状态。没有历史订单簿深度存档,已结算市场的订单簿返回 404。回测需要在市场运行期间记录的时点快照。PolyTest 为 Polymarket 加密货币 Up/Down 市场提供 240M+ 条这样的快照,带完整的 8 档订单簿深度和亚秒级精度。
获取 Polymarket 不保留的历史数据
PolyTest 在 Polymarket 加密货币 Up/Down 市场运行期间实时记录:240M+ 条快照,包含 8 档订单簿深度、亚秒级时间戳,并保留已结算的市场。从 3 天免费试用开始。
继续阅读
Polymarket WebSocket:不掉线的实时数据
轮询订单簿是白白耗尽速率限制额度最常见的方式。下面介绍四个数据流、没人写进文档的订阅选项,以及那种让你的机器人收到一片沉默、却以为市场很平静的失效模式。
Polymarket API 错误:每个错误码逐一解读
Polymarket 的错误消息很简略,而凌晨 3 点让你的机器人崩溃的,通常恰恰是文档里根本没写的那些。这是一份完整参考:有文档的错误、没文档的错误,以及每一个实际该怎么处理。
如何构建 Polymarket 交易机器人
大多数 Polymarket 机器人教程都基于已经不存在的 SDK。这是一条最新的端到端路径:2026 年该安装什么、认证实际如何运作、数据缺口在哪里,以及在第一周就让机器人挂掉的失效模式。