开发者文档
预测市场交易所的开放接口。叙事主线是一条下单闭环:钱包登录 → 发现市场 → 看盘口 → 查余额 → 下单 → 读己之写轮询到终态。做市商在此之上有批量、kill switch 与 cancel-on-disconnect;实时流按 topic 订阅。
| 服务 | Base URL | 前缀 | 鉴权 | 用途 |
|---|---|---|---|---|
| Trading API | http://127.0.0.1:8090 | /api/v1 | Bearer 会话 | 撮合引擎网关:登录、市场、盘口、下单、持仓、结算。本文档站的主体。 |
| Market Maker API | http://127.0.0.1:3100 | /v1/px | pxk_ API key | 批量下单/撤单、kill switch、cancel-on-disconnect 心跳。见 Market Maker API。 |
| 实时流 | ws://127.0.0.1:8090 | /api/v1/stream | 公开 / 订阅帧带 token | 行情、轮次事件、账户私有通知。见 实时数据。 |
浏览器内调用 Trading API 走同源代理 /api/pmj/v1/…(网关不开 CORS;代理只转发 REST)。切换环境只换 host,路径与语义零差别。
以下机制决定了接口的语义。
写请求先写入命令日志,再返回 202。撮合引擎只消费日志。重启或重放后结果一致。
单线程 CLOB,价格优先、时间优先,按 maker 价成交。引擎与 API 层无编译期依赖,只通过协议消息通信。
写响应返回 cursor。读接口带 minCursor 时,投影追上该位置后才返回。
价格 E4、数量 E2、金额 E6。全链路整数运算,浮点只用于展示。
clientOrderId 按账户去重,重试不产生第二笔订单。心跳超时后服务端撤掉挂单;部署未开启心跳时返回 501。
结算状态 SETTLING / CONFIRMED 来自结算作业簿。上链模式下,CONFIRMED 表示链上已完成结算。文档由 OpenAPI 生成,端点清单由合约测试与路由绑定。
网关命令日志撮合引擎投影 / 行情清算Sui 链上结算
cursor 配合状态查询端点确认结果。minCursor,不承诺结构、不承诺可比。单位:价格 *E4(1e-4 USD)、数量 *E2(1e-2 份)、金额 *E6(1e-6 USD),定点整数,示例禁浮点。
curl -X POST "http://127.0.0.1:8090/api/v1/auth/nonce" \
-H "Content-Type: application/json" \
-d '{"address":"0x…"}'
# → {nonce, message, expiresAt}
# 把 message 原样交给钱包 signPersonalMessage,然后:
curl -X POST "http://127.0.0.1:8090/api/v1/auth/verify" \
-H "Content-Type: application/json" \
-d '{"address":"0x…","signature":"<sig>","bytes":"<bytes>"}'
# → {token, address, expiresAt}message 由后端生成,原样签名,不要自己拼。token 即后续所有 Bearer 请求的凭据。
curl "http://127.0.0.1:8090/api/v1/markets?status=open&limit=20"跨分区列表,不支持 minCursor。每行含 tickE4、tradeable 与裁决四字段。
curl "http://127.0.0.1:8090/api/v1/markets/mkt-0001/book?depth=10"YES 计价档位;NO 侧是互补价(1−p),盘口坐标没有 outcome 维度。
curl "http://127.0.0.1:8090/api/v1/accounts/0x…" \
-H "Authorization: Bearer $PMJ_TOKEN"owner 必须等于会话地址。fillReservedE6 是链下已成交、链上结算中的卖方收益。
curl -X POST "http://127.0.0.1:8090/api/v1/orders" \
-H "Authorization: Bearer $PMJ_TOKEN" \
-H "Content-Type: application/json" \
-d '{"marketId":"mkt-0001","outcome":"YES","side":"BUY","priceE4":5200,"sizeE2":1000,"postOnly":false,"clientOrderId":"my-idempotency-key-1"}'
# → 202 {orderId, clientOrderId, cursor, commandId}clientOrderId 自选:传了才有重试幂等保护(按 trader+clientOrderId 去重)。cursor 是下一步的续读点。
curl "http://127.0.0.1:8090/api/v1/markets/mkt-0001/orders/<orderId>?minCursor=<cursor>" \
-H "Authorization: Bearer $PMJ_TOKEN"
# → 200 {status: "OPEN"|"PARTIAL"|"FILLED"|"CANCELLED", filledE2, …}
# → 404 = 投影未追上或订单不存在(不可区分)——带同一个 cursor 重试,别把第一个 404 当终态读己之写:投影落后几毫秒是常态。终态判定与撤单语义见各接口页。
| 状态 | 含义 |
|---|---|
202 accepted | 命令已持久化进命令日志,尚未撮合。 |
OPEN | 已挂簿,未成交。 |
PARTIAL | 部分成交,余量仍挂簿。 |
FILLED | 全部成交(终态)。 |
CANCELLED | 已撤或被系统撤(心跳超时、到期)(终态)。 |
SETTLING | 成交已入结算作业簿,链上执行中。卖方收益处于 fillReserved。 |
CONFIRMED | 链上结算已确认;上链模式下恒等于链上真的结算过。 |
订单状态来自 GET /markets/{marketId}/orders/{orderId};结算状态来自 GET /me/settlements。