全部文章
API 参考Polymarket APICLOBGamma API

Polymarket API 全景图:Gamma、CLOB 与 Data API

新手总会因为同一个问题浪费一天:Polymarket 没有一个 API,而是有四个,你想要的端点很少在你第一个尝试的那个上。这是一份完整的地图。

阅读约 10 分钟

关于 Polymarket API,首先要明白的是:并不存在一个单一的 Polymarket API。它有四个 REST API 和四个 WebSocket 数据流,各自负责集成中的不同部分,各自有独立的主机名、速率限制和认证要求。

几乎每一个“Polymarket API 没有 X”的问题,最后都会变成“X 在另一个主机上”。下面把全部接口集中在一处。

四个 REST API

APIBase URL用途认证
Gammagamma-api.polymarket.com发现事件和市场;元数据无
CLOBclob.polymarket.com价格、订单簿、下单和管理订单读取无需认证,交易需要 L1/L2
Datadata-api.polymarket.com持仓、活动、市场参与情况无
Relayerrelayer-v2.polymarket.com无需持有 POL 支付 gas 即可提交钱包交易签名

30 秒路由规则

有哪些市场?→ Gamma。价格是多少 / 我要交易 → CLOB。这个钱包持有什么?→ Data API。我需要在没有 gas 的情况下转移资金 → Relayer。如果你在 CLOB 里找事件端点,或在 Gamma 里找订单簿,那就找错了。

Gamma API:发现与元数据

Gamma 是起点。它回答有什么:事件、事件中的市场、标签、搜索,以及处理其他一切所需的元数据,其中最关键的是每个 CLOB 端点都需要的代币 ID。

  • /events:列出事件,支持键集分页
  • /markets:列出市场;还支持 by id、by slug、by token
  • /public-search:跨事件和市场搜索
  • /tags、/comments:分类和讨论
  • 未平仓量、实时成交量、主要持有人

/markets 的限制是全平台最严格的

每 10 秒 300 次请求,比 Gamma 自己每 10 秒 4,000 次的通用限制严格 13 倍。如果你在循环中对完整市场列表分页,最先出问题的就是它。缓存市场元数据;在一个市场的生命周期内它几乎不变。完整数字见速率限制参考。

CLOB API:价格、订单簿与订单

订单簿本身,也是唯一可以交易的地方。读取是公开的;交易需要凭证。

分组端点认证
订单簿/book、/books、/midpoint、/midpoints、/spread、/spreads公开
定价/price、/prices、/prices-history、最新成交价、/tick-size、费率公开
订单POST /order、POST /orders、DELETE /order、/orders、/cancel-all、/cancel-market-ordersL2 + 钱包签名
账本/trades、/data/orders、/data/trades、/notificationsL2
认证/auth/api-key、/auth/api-keys、/auth/derive-api-keyL1
账户余额授权额度(查询 / 更新)L2

单数与复数是实实在在的区别

几乎每个 CLOB 市场数据端点都有一个批量版本:/book 和 /books,/price 和 /prices。单数端点的限制是每 10 秒 1,500 次,复数端点是每 10 秒 500 次,但一次复数调用可以覆盖许多代币,所以批量请求在每单位速率限制额度下能拿到多得多的数据。基本上永远优先用 /books,而不是循环调用 /book。

Data API:持仓与活动

面向投资组合的问题:/positions、/closed-positions、/trades,以及用户盈亏 API。注意,它是三个主要 API 中限制最严格的:通用限制为每 10 秒 1,000 次,/positions 和 /closed-positions 各自只有每 10 秒 150 次。它是为仪表盘设计的,而不是为轮询循环。

四个 WebSocket 数据流

如果你正在用定时器轮询 /book,停下来:数据流正是为此而生的。轮询是白白耗尽速率限制额度最常见的方式。

数据流URL内容
CLOB Marketwss://ws-subscriptions-clob.polymarket.com/ws/market公开的订单簿、价格和市场生命周期更新
CLOB Userwss://ws-subscriptions-clob.polymarket.com/ws/user你账户的已认证订单和成交更新
RTDSwss://ws-live-data.polymarket.com公开的参考价格、评论、交易动态
Sportswss://sports-api.polymarket.com/ws实时比赛状态和比分

User 频道是大家最容易忽略的。如果你的机器人轮询 /data/orders 来确认订单是否成交,你就是在为 User 频道会在第一时间推送给你的信息支付速率限制额度,而且延迟还更高。

认证:L1 与 L2

公开市场数据完全不需要凭证:你可以用一个裸的 curl 直接访问 Gamma、CLOB 读取端点和 Data API。交易需要两层认证,弄清楚哪层是哪层,就能解决大多数认证错误。

层级工作方式用途
L1钱包对一条 EIP-712 消息签名证明对钱包的控制权;创建或派生 API 凭证
L2使用 API 凭证以 HMAC-SHA256 对请求签名认证私有 CLOB 请求

下单同时使用两者:L2 认证请求,钱包签名授权订单。L1 类型化数据是一个位于 chainId: 137(Polygon)上的 ClobAuth 载荷,包含你的签名者地址、以秒为单位的 Unix 时间戳、一个 nonce(除非你在管理多套凭证,否则用 0),以及固定的消息字符串。

获取 API 密钥

  1. 用你的 Polygon 私钥对 ClobAuth EIP-712 载荷签名。
  2. 带上 L1 请求头调用 POST /auth/api-key 来创建凭证。你会拿到一个 key、一个 secret 和一个 passphrase,L2 三者缺一不可。
  3. 之后运行时,调用 GET /auth/derive-api-key 来获取已有的凭证,而不是创建新的。

占据大多数支持问题的两种认证失败

凭证不完整:L2 需要 key、secret 以及 passphrase;只有其中两样,会产生一个格式正确但签名无法验证的请求。时钟漂移:签名中嵌入了时间戳,所以时钟偏差几秒的容器产生的签名会被服务器判定为无效。两者都表现为 Unauthorized/Invalid api key,这也是这条消息被如此广泛搜索的原因。见错误参考。

SDK

Polymarket 维护着统一的 TypeScript 和 Python SDK,用类型化接口封装了上述全部内容,并处理分页、错误格式和钱包设置。如果你用其中任一语言从头开始,就用它们:手写 EIP-712 签名和 HMAC 请求签名,是一种非常容易出错的打发周末的方式。

当你的运行时不在 SDK 覆盖范围内、当你需要精确控制签名、请求头、重试或传输方式,或者当你需要一个 SDK 尚未暴露的端点时,就直接使用 REST。注意这些是统一 SDK:如果你在用旧客户端,有文档化的迁移路径,而大量凭证过时的 bug 正是来自旧客户端。

Polymarket API 要花多少钱?

不花钱。没有付费档,没有 API 价格页,也没有订阅:Polymarket 的 API 免费使用,访问受速率限制而不是计费约束。公开市场数据甚至不需要密钥。

唯一与钱挂钩的是按签名者计算的交易限制,它按你的 maker 钱包 30 天成交量分档,从 Standard 的每秒 40 个订单令牌到 Elite 的 600 个,但那是吞吐量分配,而不是费用。

这些 API 都给不了你的一样东西

梳理完全部接口之后,值得知道的是什么不在其中:历史订单簿深度。

上面的每个端点提供的都是当前状态。/book 返回的是现在的订单簿。/prices-history 给你价格,但没有深度,所以它无法告诉你当时的成交会是什么样。而当市场结算后,/book 返回 404。剩下的只是一条稀疏的价格序列,大约每分钟一个点,需要显式传入开始和结束时间才能获取。任何套餐或速率限制档位都改变不了这一点。

问题能通过 Polymarket API 回答吗?
现在的订单簿是什么样?能:/book
昨天的价格是多少?能,大约每分钟一个点,通过带开始和结束时间的 /prices-history
昨天 14:03:17 的深度是多少?不能
我那笔 500 份的订单当时会以什么价格成交?不能
给我看一个上周结算的市场它的记录和结果可以(closed=true)。它的订单簿不行。

这个缺口正是为什么回测 Polymarket 策略需要一个在市场运行期间记录了订单簿的独立数据源。PolyTest 为加密货币 Up/Down 市场做的正是这件事:240M+ 条时点快照,每边 8 档深度,亚秒级时间戳,已结算的市场会被保留而不是丢弃。一个请求头,干净的 JSON,还有 3 天免费试用:

curl -H "X-API-Key: $POLYTEST_KEY" \
  "https://api.polytest.io/api/v1/markets?coin=btc&market_type=5m&limit=20"

完整端点参考见 PolyTest 文档,或开始免费试用。

常见问题

Polymarket API 有哪些端点?
Polymarket 运行着四个 REST API:Gamma(gamma-api.polymarket.com)用于事件、市场和元数据;CLOB(clob.polymarket.com)用于价格、订单簿和交易;Data API(data-api.polymarket.com)用于持仓和活动;Relayer(relayer-v2.polymarket.com)用于免 gas 交易。另外还有四个 WebSocket 数据流,覆盖公开的 market 频道、需要认证的 user 频道、实时数据和体育。
Polymarket API 免费吗?
免费。没有付费档、订阅或 API 价格页:访问受速率限制而不是计费约束,公开市场数据完全不需要 API 密钥。唯一会变化的是按签名者计算的交易吞吐量档位,它基于你钱包 30 天的交易量,而不是付费。
如何获取 Polymarket API 密钥?
用你的 Polygon 私钥对 ClobAuth EIP-712 类型化数据载荷签名,然后带上 L1 请求头调用 POST /auth/api-key 创建凭证。你会收到 key、secret 和 passphrase,L2 请求签名三者都需要。之后运行时使用 GET /auth/derive-api-key 获取已有凭证,而不是创建新的。公开市场数据不需要密钥。
Gamma API 和 CLOB API 有什么区别?
Gamma 用于发现:有哪些事件和市场、它们的元数据,以及其他端点需要的代币 ID。CLOB 用于订单簿:当前价格、订单簿深度,以及下单或撤单。如果你需要找到一个市场,用 Gamma;如果你需要给它定价或交易它,用 CLOB。
Polymarket 有 Python SDK 吗?
有。Polymarket 维护着统一的 TypeScript 和 Python SDK,用类型化接口覆盖全部四个 REST API,并处理分页、错误格式和钱包设置。从旧客户端迁移有文档化的路径。当你的运行时不受支持、需要精确控制签名和重试,或者需要 SDK 尚未暴露的端点时,直接使用 REST 才有意义。
能从 Polymarket API 获取历史订单簿深度吗?
不能。Polymarket 的每个端点提供的都是当前状态。/prices-history 端点返回一条大约每分钟一个点的价格序列,没有背后的深度,所以它无法告诉你某个订单规模当时会以什么价格成交;已结算市场的订单簿返回 404。回测需要在市场运行期间记录的时点快照,比如 PolyTest 存档中 240M+ 条加密货币 Up/Down 市场快照。

获取 Polymarket 不保留的历史数据

PolyTest 在 Polymarket 加密货币 Up/Down 市场运行期间实时记录:240M+ 条快照,包含 8 档订单簿深度、亚秒级时间戳,并保留已结算的市场。从 3 天免费试用开始。

继续阅读