Skip to content

市场对象

由 GET /v2/markets 和 GET /v2/pairs/{market_id} 返回的规范市场对象,以及实时数据流的消息封装。

API 在 REST 和数据流上提供的是同一个规范市场对象。GET /v2/markets 返回其列表;GET /v2/pairs/{market_id} 返回附带完整详情数据块的单个对象。现在已经不再有单独的精简版 tick 结构。同一个对象携带身份信息、价格和结算信息,价格数据块和结算数据块只有在请求中明确要求时才会被填充。

  • GET /v2/markets:目录,每场已匹配比赛对应一行。不加筛选条件时,价格为 nullsignal=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 }
}

对象字段

字段类型说明
idstring稳定的规范 id,格式为 dino_<uuid>。调用 GET /v2/pairs/{market_id} 时使用这个值。
slugstring|null一个易读的名称标识符。目前尚未实现,当前始终为 null
sportstring运动大类键。
leaguestring|null该运动项目下的具体赛事,例如 MLB。当平台的系列赛未命名联赛时为 null。
titlestring|null根据已匹配的球队标识尽力而为拼出的标题。
home / awaystring|null目前尚未实现,当前始终为 null
start_timestring|nullISO-8601 格式的 UTC 开赛时间。
statusstringopenliveclosedsettled。参见Status
matchstring匹配置信度标签。目前对外提供的行始终为 high_confidence
signalstring"arb""spread"。参见Signal
spread_ptsnumber|null按结果计算的最大跨平台差距,单位为百分点。除非每个结果都已在两个平台上定价,否则为 null。
potential_arb_pctnumber|null以卖价对卖价计算的毛收益率,尚未扣除平台手续费。仅当 signal"arb" 时才会填充。它是在 priced_at 时刻对快照的一次观测。
coverageobject{ kalshi, polymarket },仅当该平台上每个结果都有价格时,对应值才为 true
outcomesarray按结果划分的定价信息。参见Outcomes。当该行尚未定价时为空。
resultobject|null结算判定结果,仅在 statussettled 后才会填充。
updated_atstring|null匹配引擎最近一次重新分析该配对的身份信息与结算条款的时间。
priced_atstring|null一个用于判断新鲜度的信号。在 REST 上,它目前与 updated_at 取值相同——因为每一行还没有单独存储的实时价格时间戳,所以请把它理解为"对该配对的最后一次写入",而不是"最后一次价格变动"。在 WebSocket 的 markets:* 数据流上,两种帧类型(marketprice)携带的都是真实的捕获时刻。只有当该行本身也没有 updated_at 时,该字段才为 null。
linksobject{ kalshi, polymarket } 平台链接。在稳定的链接形式可用之前,polymarketnull

Outcomes

outcomes 中的每一项都是一个市场结果(例如一支球队),附带它在两个平台上的价格:

字段类型说明
key / namestring该结果的标签,例如球队名称。
kalshinumber|nullKalshi 上的卖价,取值 0 到 1。不可用时为 null;缺失时不会用 0 表示。
polymarketnumber|nullPolymarket 上的卖价,取值 0 到 1。不可用时为 null。
cheaperstring|null该结果卖价更低的平台,"kalshi""polymarket"。任意一方尚未定价时为 null。

添加 include=depth 后,每个结果还会携带 kalshi_bookpolymarket_book,这两个同级对象包含 askdepth,以及平台代码或 token id。它们不会替代标量字段 kalshi / polymarket 价格。

Status

说明
open正在被活跃匹配与追踪(内部同时涵盖 active 和处于待审核区的配对)。
live为进行中的比赛保留。目前尚未对外提供,当前没有任何行会返回 live
closed已撤回,且没有结算判定记录在案。
settled已撤回,且有结算判定记录在案;result 会被填充。

只有 statusopen 的行才可能携带 spread 以外的 signal。任何非 open 的行,无论携带什么价格,都会被强制将 signal 设为 spreadpotential_arb_pct 设为 null

Signal

signal 标注的是匹配引擎为该市场找到的结算关系,它会在每次请求时基于当前行和价格重新推导,永远不会信任一个被缓存的标签。

说明
"arb"已获得确认。需同时满足:status 为 open 且有 2 次及以上确认、结算一致性已确认、该配对完整的内部风险集合中不存在 highcritical 严重程度的风险,并且每个结果都已在两个平台上定价。此时 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 流页面介绍了如何连接,以及断线后如何恢复。