Skip to main content
本页解释Odds API中使用的核心概念:ID如何构建、实体之间如何关联、时间戳如何使用,以及如何设计可靠的客户端存储。

语言前缀

所有端点都以语言代码为前缀:
  • /zh/... (中文)
  • /en/... (英文)
  • /de/... (德文)
翻译字段(例如名称)在可用时遵循前缀语言。 标识符(sportIdfixtureId等)与语言无关。

体育、锦标赛、赛季

sportId

  • 整数。
  • 嵌入到多个下游ID中的前两位数字
  • 通过/sports发现。

tournamentId

  • 整数。
  • 属于恰好一项体育运动。
  • 通过/tournaments发现。

seasonId

  • 整数。
  • 属于恰好一个锦标赛。
  • 通过/seasons发现。
完整的运动覆盖表列出了每个 sportId 及其是否以赛事、期货或两者形式提供。

实体层级

API 中的一切都挂在同一棵树上:
锦标赛是周期性存在的事物(“英超联赛”、“美国总统大选”),赛季是它的一届有时间边界的实例(“英超 25/26”、“2028 年美国总统大选”)。赛事和期货都位于某个赛季之内。

赛事如何运作(体育)

**赛事(fixture)**是两个参与者(球队或球员)之间的单场比赛:
  • 赛事对象承载日程与状态:startTime(纪元秒)、statusIdparticipant1Id / participant2IdseasonId、场馆 —— 完整结构见 fixtures 频道和 REST 参考。
  • 比分按赛段存储,以 resultp1p2……为键 —— result 行是权威的最终/当前比分;赛段行用于结算赛段盘口。参见 scores 频道
  • 赔率通过下方的赔率标识符附加到赛事上 —— 每个价格对应一个 {fixtureId}:{bookmaker}:{outcomeId}:{playerId}

期货如何运作(预测市场)

**期货(future)**是针对整个赛季或事件(而非单场比赛)的冠军类盘口 —— “谁将赢得英超?” —— 同一模型也覆盖非体育预测市场(“谁将赢得 2028 年美国大选?”、“比特币会涨到 10 万美元吗?”)。 对于体育项目,期货挂在与其赛事完全相同的赛季之下 —— 只有叶子节点不同:
与上文的赛事示例对比:阿森纳 vs 切尔西是赛季 130281 中的一场比赛;Winner 期货则是针对整个赛季的盘口。同一棵树、同一个 seasonId —— 赛事在 90 分钟内出结果,期货在赛季结束时出结果。 非体育预测市场复用完全相同的模型 —— 周期性主题即锦标赛,每一届即赛季:
  • 一个期货 = 一个赛季内的一个冠军类盘口。futureId 末尾的 marketId 数字表示盘口种类:
  • 期货赔率按参与者报价:{futureId}:{bookmaker}:{participantId} —— 参见期货赔率ID
  • 非体育主题(政治、选举、金融、加密货币、天气……)被建模为 sportId 69+ 的”运动”,且仅以期货形式存在;赛马类(79–81)为赛前(ante-post)期货。确切区间见运动覆盖

盘口和选项

摘要 —— 每个选项都遵循固定层级:marketType → period → handicap → side,全部编码进 outcomeId —— 因此同一个投注始终解析为相同的 marketId / outcomeId,通过坐标定位而非对博彩公司名称做字符串匹配。唯一不在 outcomeId 中的是球员,由 playerId 承载。同一盘口的所有选项共享其 marketId,即该盘口的首个 outcomeId

盘口如何分解(确定性层级)

每一个 outcomeId 都由单一、确定性的分解逻辑生成 —— OddsPapi 将每个盘口拆分为固定层级:
因此”全场总进球大于 2.5”在不同博彩公司和不同赛事中始终落在相同的 marketId / outcomeId 上。
关键规则: 由于每个盘口线都有自己的 marketId,“大于 2.5” 和 “大于 3.5” 是不同的盘口 —— 而非同一盘口的两个选项。在单个 marketId 内,选项仅为该确切盘口线的各个方向(例如 Over 2.5 + Under 2.5)。
真实足球盘口映射的代表性切片。每个 marketId 等于其首个 outcomeId,且每个盘口线都是独立的盘口:读取第一行:marketType=1x2period=fulltimehandicap=0.0outcomeName=1 —— 即全场比赛结果盘口的主队方向。

marketIdoutcomeId之间的关系

盘口和选项在设计上紧密耦合:
  • 盘口代表一个完整的投注市场(例如独赢、1x2、大小球)。
  • 盘口包含多个选项
  • 属于同一盘口的所有选项共享相同的marketId
  • 盘口的第一个outcomeId始终等于marketId
这使得可以无需额外元数据即可确定哪些选项属于哪个盘口。

marketLength

marketLength一个 marketId 下的选项数量 —— 即可供投注的方向数,它们共同构成完整的概率空间(在去除利润率之前,其隐含概率之和约等于 1)。示例:moneyline → 2、1x2 → 3、winningmargin → 所提供的赢球差区间数量。

ID结构

marketIdoutcomeId都是整数,构造如下:
示例:
  • 11xxxx → 篮球盘口或选项
  • 14xxxx → 美式橄榄球盘口或选项
这种设计提供:
  • 每项运动无限的盘口和选项
  • 按运动快速分组
  • 立即可见的盘口关系

为什么marketId很重要(套利和建模)

单个marketId下的所有选项共同代表一个完整的概率空间 这使得marketId特别适用于:
  • 套利检测
  • 超出率/利润率计算
  • 概率归一化
  • 盘口完整性检查
建议: 如果您执行套利或定价逻辑,请始终按marketId对赔率分组。

参与者和球员

participantId

  • 整数。
  • 代表赛事中的球队或参赛者。
  • 通过/participants发现。

playerId

  • 整数。
  • 用于球员投注盘口。
  • playerId = 0通常代表非球员盘口。
  • 通过/players发现。

赛事ID

fixtureId结构

fixtureId是一个编码多条信息的字符串
概念示例:
其中:
  • id → 提供商标识符/简短slug
  • 11 → sportId(2位数字)
  • 000132 → tournamentId(6位数字)
  • 62926199 → 提供商的原生赛事ID
仅从 fixtureId 即可推断出运动、锦标赛和上游提供商 —— 便于日志记录和跨系统关联。

期货ID

futureId结构

futureId遵循与fixtureId相同的原则:
其中:
  • providerSlug → 提供商标识符/简短slug(例如 idpmks
  • sportId → 2位数字
  • tournamentId → 6位数字(零填充)
  • seasonId → 赛季/赛事实例
  • marketId → 该赛季内的冠军盘口(例如 1 = Winner)
这编码了提供商、运动、锦标赛、赛季和盘口 —— 全局唯一且自描述,与 fixtureId 一样。

赔率标识符

摘要 —— 单个价格由 {fixtureId}:{bookmaker}:{outcomeId}:{playerId}(赛事)或 {futureId}:{bookmaker}:{participantId}(期货)唯一标识。请将这些 oddsId 字符串用作存储中的主键,以实现干净的去重、更新与对账。

赛事赔率键

对于赛事,单个价格由以下唯一标识:
示例:
此组合唯一定义一个价格 去掉 bookmaker,剩下的就是选项本身 —— {fixtureId}:{outcomeId}:{playerId} —— 这是与博彩公司无关的评级 / 结算键,因为一个选项在任何博彩公司处的输赢都相同。无需 marketIdoutcomeId 已编码了盘口。

期货赔率ID

对于期货,赔率由以下唯一标识:

时间戳(秒与毫秒)

此API有意同时使用纪元秒和纪元毫秒,具体取决于上下文。该规则在赛事期货中保持一致:

纪元秒(UTC)

所有开始时间均为整数纪元秒:
  • startTime / endTime
  • startTimeFrom
  • startTimeTo

纪元毫秒(UTC)

所有赔率更新时间均为整数纪元毫秒 —— 赛事和期货皆是如此:
  • changedAt / bookmakerChangedAt
  • 赔率 since 过滤器(/fixtures/odds/fixtures/odds/main/futures/odds
  • WebSocket 信封 ts 以及 entryId 的时间戳部分

建议

  • 将时间戳存储为整数。
  • 经验法则:赛程时间为秒,赔率更新时间为毫秒。
  • 仅在需要时进行内部归一化。

运营提示

服务器位置很重要

要实现实时更新的最低延迟:
  • 最快的交付区域是中欧(推荐)和美国东部。
  • 为获得最佳性能,请将后端部署在我们使用的相同数据中心,例如:
  • 如果您正在构建对延迟敏感的预测市场或模型,请考虑:
    • 通过Netcup部署在奥地利(AT),或
    • 使用AWS eu-west-1(爱尔兰)
与我们流媒体基础设施位于同一位置的服务器可以更快地接收更新,跳数更少。

快照 + 实时模式

可靠的集成模式:
1

获取 HTTP 快照

通过 REST 拉取当前状态(赛事、赔率或期货)。
2

订阅 WebSocket

在快照之上流式接收实时更新。
3

按信号重新获取快照

如果 WebSocket 发出 snapshot_required 信号,请重新获取 HTTP 快照并恢复实时流。

高效回填

  • 在可用时使用since参数
  • 除非需要,否则避免完整的历史获取
  • 按赔率标识符存储赔率以进行去重

速率限制

有关请求头、各端点限制以及 429 退避处理,请参阅速率限制

历史赔率与 CLV

实时 WebSocket 的 oddsoddsFutures 频道传输的是最新状态 —— 它们针对低延迟交易进行了优化,在负载下会合并或丢弃中间更新,并非逐笔账本。
使用实时数据流进行交易,使用 REST 历史端点进行衡量 —— CLV 模型、成交审计和回测。
当您需要某个结果的完整价格变动,或其开盘价与收盘价时,请使用 REST 历史端点。它们与实时 odds 频道共享相同的 oddsId 格式({fixtureId}:{bookmaker}:{outcomeId}:{playerId}),因此您可以将实时成交直接关联到其历史记录和收盘价记录。 交易用例:
  • CLV 建模 —— 将您的成交价与收盘价进行比较,以衡量优势。
  • 成交审计 —— 将成交价格与已记录的时间线进行核对,以检测滑点。
  • 回测 —— 重放完整的历史时间线,以根据真实的价格变动测试策略。
完整的请求参数、响应结构以及每个端点的交互式演练,请参阅 API → 参考 部分。

术语表

API 中常用核心术语的快速定义。 标识符与数据模型
  • sportId —— 运动数字标识符;下游 marketIdoutcomeIdfixtureId 的前两位数字。
  • fixtureId —— 单场比赛/事件的字符串键,编码提供商、运动、赛事和提供商赛事 ID。
  • futureId —— 期货 / 冠军盘口的字符串键,编码提供商、运动、锦标赛、赛季和盘口。
  • marketType —— 盘口种类(1x2totalsspreadsbothteamsscore 等)。
  • period —— 盘口适用的赛段(fulltimep1p2)。
  • handicap —— 盘口线 / specifier;每个不同的盘口线都是独立的 marketId
  • marketId —— 将一个盘口所有选项分组的整数;等于盘口的首个 outcomeId
  • marketLength —— 一个 marketId 下的选项数量:即可供投注的各个方向,其概率之和约等于 1。
  • outcomeId —— 标识一个完全分解后的选择的整数:marketType + period + handicap(盘口线)+ 方向。它编码了除球员以外的一切 —— 球员由 playerId 补充。
  • playerId —— 在球员盘口中将选项关联到某个球员;playerId = 0 为非球员盘口。
  • participantId —— 标识赛事中球队或参赛者的整数。
  • oddsId —— 价格复合键。赛事:{fixtureId}:{bookmaker}:{outcomeId}:{playerId}。期货:{futureId}:{bookmaker}:{participantId}
价格与交易
  • OLV —— 开盘线价值:选项的首个记录价格。
  • CLV —— 收盘线价值:选项结算前的最后价格;评估执行质量的基准。
  • staleOdds —— 表示某博彩公司连接降级、其赔率可能并非最新的标志。
  • settlement(结算) —— 赛后端点,返回逐结果的结果(赢 / 输)、最终比分和盈亏幅度。
流式传输与交付
  • serverEpoch + entryId —— 每频道游标;serverEpoch 变化表示客户端必须重新获取快照。
  • resume / replay(恢复 / 重放) —— 在 resumeWindowMs(默认 60000)内重连并重放丢失的消息。
  • snapshot_required —— 表示游标已超出恢复窗口、需重新获取 REST 快照的信号。