Polymarket API 完整开发指南 (2026, CLOB V2)

2026-04-26

Polymarket 是按未平仓量计当前最大的去中心化预测市场,二元合约在 Polygon 链上结算,由 USDC 抵押。它的 API 拆成三套独立的子系统 —— Gamma(发现)、Data(分析)、CLOB(盘口 + 交易)—— 而且交易这一半刚刚完成了一次 breaking 的 V2 升级。本指南是对 V2 切换之后 API 现状的忠实讲解,基于 docs.polymarket.com 在 CLOB V2 上线后的最新文档校准。如果你参考的博客里出现 noncefeeRateBps、USDC.e 或 @polymarket/clob-client(没有 -v2 后缀),先扫一遍 §0 —— 这些引用在切换那天就停止工作了,旧代码会静默失效。

0. V2 切换改了什么

Polymarket 在 2026-04-28 把 CLOB 切到了 V2 合约(迁移文档说 4/22;4/17 写的 changelog 把实际切换日期定在 4/28 —— 上线前请去 status.polymarket.com 复查)。Order struct 大概一半字段变了,抵押币从 USDC.e 换成了 pUSD,SDK 包名也换了。差异:

主题旧版 (V1, 2026-04-28 退役)当前版 (V2)
Order struct 移除noncefeeRateBpstaker(已移除 —— 不要再传)
Order struct 新增timestamp (ms)、metadata (bytes32)、builder (bytes32)
手续费嵌入到签名订单里撮合时由协议设定,不在订单上
EIP-712 Exchange domainversion: "1",V1 verifyingContractversion: "2",V2 verifyingContract(neg-risk 用不同地址)
Builder 归因单独 SDK + 4 个 POLY_BUILDER_* headers订单里一个 builder 字段 (bytes32)
抵押币USDC.e(桥接)pUSD(1:1 USDC 担保)
TypeScript SDK@polymarket/clob-client@polymarket/clob-client-v2
Python SDKpy-clob-clientpy-clob-client-v2
Constructor位置参数,chainIdoptions 对象,chain

切换没动、但容易踩的三件事:L1 ClobAuthDomain 永远是 version: "1"(这是鉴权 domain,与 Exchange domain 不同);POLY_TIMESTAMP headers 还是 (只有 Order struct 的 timestamp 字段是毫秒);地理封锁没变 —— 美国、英国、欧盟大多数国家仍然完全无法交易。

1. 30 秒:第一个 Polymarket API 响应

Polymarket 最快的一次调用根本不需要鉴权。Gamma API 公开发布所有市场和事件元数据,单个请求就能拉到。从这步出发再决定要不要鉴权 —— 只有交易需要签名;读盘口、价格、历史、持仓、成交都不要。

curl -sS 'https://gamma-api.polymarket.com/markets/keyset?limit=5' \
  | jq '.markets[] | {slug, question, outcomes, last_trade_price}'
npx parlay-mcp@latest

>>> polymarket.list_markets(limit=5)

同一查询:直接 HTTP vs 走 Parlay 的预测市场 MCP。

两个开始之前要知道的事:

  1. 交易在美国、英国、法国、德国和很多其他司法辖区被完全封锁。 新加坡、波兰、泰国、台湾是 close-only(能平仓不能开新仓)。读端点不被封锁。 在被封地区可以做研究、做 dashboard、做聚合,唯独不能下单。
  2. 旧教程引用的 V1 字段已失效。 出现 noncefeeRateBpstaker、USDC.e 或 @polymarket/clob-client(没 -v2)就是 V1,2026-04-28 之后停止工作。本指南整篇基于 V2。

2. 概念入门:market、token、三套 API

Polymarket 的数据模型与多数交易所 API、与 Kalshi 都不一样,前一小时的困惑很多来自跳过模型直接做鉴权。

Event / Market / Token:现实问题("2028 美国总统大选谁赢?")= event;每个候选人一个 market("Trump 会赢吗?"YES/NO 二元);每个 market 的每一边(YES / NO)是一个独立的 ERC-1155 token,各有自己的 asset_id。盘口在 token 层级而非 market 层级 —— 同一 market 的 YES 和 NO 是两个独立的 book。condition_id 是链上 market ID(CTF Exchange 合约用),asset_id 是 token ID(你向 /book/pricePOST /order 传的就是这个)。

三套独立的 API

APIBase URL用途鉴权
Gammagamma-api.polymarket.com发现:markets、events、tags、search、profiles公开
Datadata-api.polymarket.com分析:positions、trades、leaderboard、open interest公开
CLOBclob.polymarket.com实时盘口 + 交易:orderbook、prices、orders读公开;下单需 L1+L2

Negative risk markets:N 选 1 的互斥事件(典型例子:2028 总统大选所有候选人 markets)。读盘口拿到的 neg_risk: true 字段决定 EIP-712 Exchange domain 用哪个 verifyingContract —— 用错的话签名是合法的(但对错误 domain),撮合引擎拒绝为 invalid signature。SDK 自动处理,自己写就要先读 /bookneg_risk

3. 鉴权:L1 (EIP-712) + L2 (HMAC) 分步走

Polymarket 的鉴权分两层。先想清楚分层逻辑再写代码。

L1 (EIP-712, 每个 key 跑一次):钱包级身份。用钱包私钥对固定 message 签 EIP-712(domain ClobAuthDomain、version "1"、chainId 137)。带 5 个 POLY_* header,一次性拿凭证用。

L2 (HMAC-SHA256, 每个请求都跑):请求级身份。L1 给你 apiKey (UUID)、secret (base64)、passphrase (随机串)。每个 CLOB 鉴权请求 HMAC 签 timestamp + method + path + body。5 个 POLY_* header 携带 API key、passphrase、timestamp、address、签名。

三件易踩的事:

  • ClobAuthDomain 永远 version: "1",V2 切换后也不变。只有 Exchange domain(签订单用)升到 version: "2"
  • L1 / L2 timestamp 都是 Unix 秒,不是毫秒。(Polymarket 全平台只有 Order struct 的 timestamp 字段是毫秒,§6。)
  • signerfunder。Magic Link / Gnosis Safe proxy wallet 模式下,签名地址和持仓地址是两个不同的地址。signatureType 设对:0 = 普通 EOA;1 = Magic Link / Google login proxy;2 = Gnosis Safe(公网最常见)。

Step 2 — 完整签名实现

完整 Python / TypeScript / cURL 三语言实现见英文版 polymarket-api.mdx §3 Step 2,照搬 docs.polymarket.com 的官方示例 —— L1 derive 凭证 + L2 签名两段都包含。

Step 3 — 四个真实陷阱

陷阱 A — signerfunder 混用。 Gnosis Safe 模式下 maker 必须是 funder(Safe 地址),不是 signer(你的 EOA)。错了报 the order owner has to be the owner of the API KEY陷阱 B — 两个 EIP-712 domain 混淆。 ClobAuthDomain (L1) 永远 v1;Exchange domain (订单) v2。复制粘贴时容易串。 陷阱 C — 毫秒 vs 秒。 两类 POLY_TIMESTAMP 都是秒;Order struct 的 timestamp 是毫秒。看起来一样的字符串,错了不立即报错。 陷阱 D — 私钥管理。 Polymarket 不托管私钥;丢了无法找回。生产环境用 secrets manager + Gnosis Safe 而非 hot EOA,方便轮换。

Step 5 — 同一调用,三层抽象

# 见英文版 §3 Step 5:完整 L1 derive + Gamma keyset 分页 ≈ 60 行
from py_clob_client_v2 import ClobClient
from py_clob_client_v2.constants import POLYGON

client = ClobClient(host="https://clob.polymarket.com", chain=POLYGON,
                   key="0x...", signature_type=2, funder="0x...")
client.derive_api_key()
markets = list(client.gamma.markets(tag_id="trump-2028"))
from parlay import Parlay
p = Parlay()
markets = p.polymarket.list_markets(tag="trump-2028")
kalshi = p.kalshi.list_markets(series="KXPRES")  # 同一形状跨平台

≈ 60 行 → 10 行 → 3 行;只有第三个能跨平台。

4. 三套 API 的核心端点

完整端点目录见英文版 §4。要点:

  • Gamma(发现,无鉴权):/markets/keyset/events/keyset/markets/{slug}/search/tags/sports。新代码统一用 keyset 端点;旧的 offset 分页将废弃。
  • CLOB 读端点(无鉴权):/book?token_id=...bids 和 asks 都返回,与 Kalshi 相反)、/price/midpoint/spread/prices-history(fidelity 1m–1w)、/ohlc/tick-size/fee-rate。下单前一定要读 /booktick_sizeneg_risk
  • CLOB 交易端点(L2 + EIP-712 订单签名):POST /order(单笔)、POST /orders(最多 15 笔批量)、DELETE /order/{id}DELETE /cancel-allPOST /heartbeat(dead-man's switch)、GET /ordersGET /trades
  • Data(分析,无鉴权):/positions/closed-positions/activity/trades/holders/leaderboard/open-interest

5. 分页与限流:throttle 而非 reject

详见英文版 §5。要点:

  • Keyset / cursor 分页/markets/keyset/events/keysetafter_cursor,最后一页省略 next_cursor给 keyset 端点传 offset 会返回 422 —— 不允许混用。
  • Cloudflare 限流,无 tier:所有用户共享。超限不立即 429,而是 throttle(排队 / 慢响应)。常见 10 秒窗口:Gamma 4,000、/markets 300、Data 1,000、CLOB 9,000、/book 1,500、Trading POST /order burst 3,500/10s + sustained 36,000/10min。
  • 重要陷阱:很多 retry 库把"5 秒没响应"当作失败重试 —— 在 Polymarket 上反而把 throttle 队列加长。把 client timeout 设到 30 秒,只在真 429 / 5xx 上重试。
  • Trading 端点有 burst + sustained 双层:单次冲量没问题,10 分钟均速也得控好。
# 见英文版 §5 Step 2:cursor 持久化 + 30s timeout + throttle-aware 退避
from parlay import Parlay
p = Parlay()
markets = p.polymarket.list_markets(tag="trump-2028", all_pages=True)

60 行生产级 keyset paginator → 一行调用。

6. 下单:V2 order struct + 4 种类型 + EIP-712

整段详见英文版 §6。

4 种 order typeGTC(默认,挂单直到撤)、FOK(必须立刻全成交否则全撤)、GTD(到 expiration 自动撤)、FAK(立刻成交能成的部分剩余撤;2025-05-28 新增 —— 旧教程通常没有)。

V1 → V2 字段差异(每条都是踩过的坑):

字段V1V2
nonce / feeRateBps / taker必填移除
timestamp (ms) / metadata / builder不存在新增
Exchange domain version"1""2"
verifyingContractV1 地址V2 地址(neg-risk 用不同地址)

V1 字段没删干净最常见的报错是 Invalid order payload。先 grep 代码里有没有 noncefeeRateBpstaker

3 个生产陷阱:tick_size 不查死价格违反 → Price breaks minimum tick size rule;neg_risk 用错合约 → invalid signature;Gnosis Safe 时 maker = funder ≠ signer 别搞反。

# 见英文版 §6.5:完整 V2 Order struct(含 timestamp/metadata/builder 不含 nonce/feeRateBps/taker)
# + Exchange domain v2 EIP-712 签名 + L2 headers ≈ 80 行
from parlay import Parlay
p = Parlay()
resp = p.polymarket.place_order(
    token_id="102936...",
    side="BUY", price=0.45, size=100.0, order_type="GTC",
)
# tick_size、neg_risk verifyingContract、V2 字段、签名、L2 都自动处理

≈ 80 行 EIP-712 + struct + 提交 → 一行调用。

7. WebSocket 实时数据

完整代码见英文版 §7。

  • Market channel(公开)wss://ws-subscriptions-clob.polymarket.com/ws/market,订阅 {"assets_ids": [...], "type": "market"}心跳是客户端发起(每 10 秒发 {},与 Kalshi 相反);忘记发 ~30 秒后服务端断你。事件类型 bookprice_changelast_trade_pricetick_size_change
  • User channel(L2 鉴权)/ws/user,鉴权放在 订阅消息的 auth 字段 而不是连接 header。事件 ordertrade
  • 2025 重要变化:100 token 订阅上限已移除;price_change payload 字段名 2025-09-15 改过(changesprice_changes)—— 旧 parser 会静默丢更新。

8. 常见错误及修复

完整 17 条详见英文版 §8。挑几个高频的:

9. 跨平台聚合

如果应用只跟 Polymarket 打交道,官方 clob-client-v2 已经够用,重新写一遍 EIP-712 没价值。

差异化的场景从"跨平台"开始:Polymarket 是 4 个二元事件价格主源之一,另外是 Kalshi(CFTC 监管、美国本土、RSA-PSS)、Manifold(玩具币、REST、API key)、Opinion.trade(英国监管、REST + GraphQL、API key)。每家自己一套鉴权、分页、限流和市场标识符 —— Polymarket 自己就是三套 API,加上其他三家做四方聚合是真实工作量。

具体差距:鉴权 4 套;schema Polymarket asset_id + condition_id、Kalshi 字符串 ticker、Manifold question slug、Opinion.trade GraphQL node ID;限流 Cloudflare throttle / token bucket / 简单 RPS / tiered API 各不相同;价格表达 0–1 字符串 / 定点美元 / 百分比 double / 便士整数。

Parlay 的 MCP server 把这一层做了:四家上 list_marketsget_orderbookplace_order 是同一组调用,标识规范化,鉴权统一。Polymarket 特有的 neg-risk verifyingContract、V2 订单签名、三套 API 拆分仍能下钻访问。单平台用官方 SDK;跨平台才是 Parlay 价值层。配套阅读:Kalshi API 指南Polymarket vs Kalshi 对比

10. 常见问题

11. 下一步

如果你专注 Polymarket,下一步建议看官方 rate-limits 页V2 迁移指南。如果是多平台,看本站的 Kalshi API 指南Polymarket vs Kalshi 平台对比