市场对象
由 GET /v2/markets 和 GET /v2/pairs/{market_id} 返回的规范市场对象,以及实时数据流的消息封装。
API 在 REST 和数据流上提供的是同一个规范市场对象。GET /v2/markets 返回其列表;GET /v2/pairs/{market_id} 返回附带完整详情数据块的单个对象。现在已经不再有单独的精简版 tick 结构。同一个对象携带身份信息、价格和结算信息,价格数据块和结算数据块只有在请求中明确要求时才会被填充。
GET /v2/markets:目录,每场已匹配比赛对应一行。不加筛选条件时,价格为null。signal=arb会返回同一批行,基于实时快照定价,并筛选为已确认的套利。GET /v2/pairs/{market_id}:按 id 返回单个市场,默认应用include=ids,depth,settlement:平台标识、置信度、按结果划分的订单簿详情,以及结算披露。
市场对象
{
"id": "dino_8f3a1c92-47e8-4c3f-b9d2-f1a8e6c4d5f2",
"slug": null,
"sport": "baseball",
"league": "MLB",
"title": "Nyy vs Bos",
"home": null,
"away": null,
"start_time": "2026-07-01T23:05:00+00:00",
"status": "open",
"match": "high_confidence",
"signal": "arb",
"spread_pts": 2.0,
"potential_arb_pct": 1.83,
"coverage": { "kalshi": true, "polymarket": true },
"outcomes": [
{ "key": "NYY", "name": "NYY", "kalshi": 0.52, "polymarket": 0.54, "cheaper": "kalshi" },
{ "key": "BOS", "name": "BOS", "kalshi": 0.50, "polymarket": 0.46, "cheaper": "polymarket" }
],
"result": null,
"updated_at": "2026-07-01T22:55:00+00:00",
"priced_at": "2026-07-01T22:55:00+00:00",
"links": { "kalshi": "https://kalshi.com/markets/KXMLBGAME-26JUL01NYYBOS", "polymarket": null }
}
对象字段
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 稳定的规范 id,格式为 dino_<uuid>。调用 GET /v2/pairs/{market_id} 时使用这个值。 |
slug | string|null | 一个易读的名称标识符。目前尚未实现,当前始终为 null。 |
sport | string | 运动大类键。 |
league | string|null | 该运动项目下的具体赛事,例如 MLB。当平台的系列赛未命名联赛时为 null。 |
title | string|null | 根据已匹配的球队标识尽力而为拼出的标题。 |
home / away | string|null | 目前尚未实现,当前始终为 null。 |
start_time | string|null | ISO-8601 格式的 UTC 开赛时间。 |
status | string | open、live、closed 或 settled。参见Status。 |
match | string | 匹配置信度标签。目前对外提供的行始终为 high_confidence。 |
signal | string | "arb" 或 "spread"。参见Signal。 |
spread_pts | number|null | 按结果计算的最大跨平台差距,单位为百分点。除非每个结果都已在两个平台上定价,否则为 null。 |
potential_arb_pct | number|null | 以卖价对卖价计算的毛收益率,尚未扣除平台手续费。仅当 signal 为 "arb" 时才会填充。它是在 priced_at 时刻对快照的一次观测。 |
coverage | object | { kalshi, polymarket },仅当该平台上每个结果都有价格时,对应值才为 true。 |
outcomes | array | 按结果划分的定价信息。参见Outcomes。当该行尚未定价时为空。 |
result | object|null | 结算判定结果,仅在 status 为 settled 后才会填充。 |
updated_at | string|null | 匹配引擎最近一次重新分析该配对的身份信息与结算条款的时间。 |
priced_at | string|null | 一个用于判断新鲜度的信号。在 REST 上,它目前与 updated_at 取值相同——因为每一行还没有单独存储的实时价格时间戳,所以请把它理解为"对该配对的最后一次写入",而不是"最后一次价格变动"。在 WebSocket 的 markets:* 数据流上,两种帧类型(market 和 price)携带的都是真实的捕获时刻。只有当该行本身也没有 updated_at 时,该字段才为 null。 |
links | object | { kalshi, polymarket } 平台链接。在稳定的链接形式可用之前,polymarket 为 null。 |
Outcomes
outcomes 中的每一项都是一个市场结果(例如一支球队),附带它在两个平台上的价格:
| 字段 | 类型 | 说明 |
|---|---|---|
key / name | string | 该结果的标签,例如球队名称。 |
kalshi | number|null | Kalshi 上的卖价,取值 0 到 1。不可用时为 null;缺失时不会用 0 表示。 |
polymarket | number|null | Polymarket 上的卖价,取值 0 到 1。不可用时为 null。 |
cheaper | string|null | 该结果卖价更低的平台,"kalshi" 或 "polymarket"。任意一方尚未定价时为 null。 |
添加 include=depth 后,每个结果还会携带 kalshi_book 和 polymarket_book,这两个同级对象包含 ask、depth,以及平台代码或 token id。它们不会替代标量字段 kalshi / polymarket 价格。
Status
| 值 | 说明 |
|---|---|
open | 正在被活跃匹配与追踪(内部同时涵盖 active 和处于待审核区的配对)。 |
live | 为进行中的比赛保留。目前尚未对外提供,当前没有任何行会返回 live。 |
closed | 已撤回,且没有结算判定记录在案。 |
settled | 已撤回,且有结算判定记录在案;result 会被填充。 |
只有 status 为 open 的行才可能携带 spread 以外的 signal。任何非 open 的行,无论携带什么价格,都会被强制将 signal 设为 spread、potential_arb_pct 设为 null。
Signal
signal 标注的是匹配引擎为该市场找到的结算关系,它会在每次请求时基于当前行和价格重新推导,永远不会信任一个被缓存的标签。
| 值 | 说明 |
|---|---|
"arb" | 已获得确认。需同时满足:status 为 open 且有 2 次及以上确认、结算一致性已确认、该配对完整的内部风险集合中不存在 high 或 critical 严重程度的风险,并且每个结果都已在两个平台上定价。此时 potential_arb_pct 会被填充。 |
"spread" | 除已确认套利之外的一切情况。包括一场正确匹配、但披露了结算风险的比赛,一行尚未定价的目录数据,或一个处于待审核区的候选项。在把一个 spread 行当作可交易之前,请先阅读 settlement.risks(通过 include=settlement 或 /v2/pairs/{market_id})。 |
对外提供的 settlement.risks 永远不包含取消类(cancel_*)事件,这些事件已在服务端被过滤,而 signal 的判定关卡仍然会针对完整的内部集合进行评估。一个 arb 行仍然可以携带一条不会破坏正常结算一致性的、非取消类的风险条目,因此 arb 并不意味着 risks[] 为空。行动之前请始终先阅读结算数据块。
这些分数是如何产生的,包括匹配扫描、模糊匹配上限,以及自动晋级门槛,详见匹配与置信度。
在 WebSocket 上
市场对象会通过 markets:* 频道以扁平帧的形式传输:market 帧(状态变化时的完整规范对象)和 price 帧(价格变动时、以结果 key 为键的精简增量)。这两种帧类型都在 WebSocket 流页面有详细说明。
从 REST 初始化
GET /v2/markets 不携带流偏移量字段。v2 中不存在 as_of_offset。如果要从完整的状态起步,然后持续保持实时更新:先读取 /v2/markets?signal=arb 获取当前所有开放的套利,再连接 WebSocket 数据流。你连接之后到达的消息,从那一刻起是没有遗漏的;v2 中不存在快照到偏移量的拼接机制,因此请把 REST 读取和数据流连接当作两个相互独立的视图来对待。WebSocket 流页面介绍了如何连接,以及断线后如何恢复。