语言前缀
所有端点都以语言代码为前缀:/zh/...(中文)/en/...(英文)/de/...(德文)
sportId、fixtureId等)与语言无关。
体育、锦标赛、赛季
sportId
- 整数。
- 嵌入到多个下游ID中的前两位数字。
- 通过
/sports发现。
tournamentId
- 整数。
- 属于恰好一项体育运动。
- 通过
/tournaments发现。
seasonId
- 整数。
- 属于恰好一个锦标赛。
- 通过
/seasons发现。
盘口和选项
marketId和outcomeId之间的关系
盘口和选项在设计上紧密耦合:
- 盘口代表一个完整的投注市场(例如独赢、1x2、大小球)。
- 盘口包含多个选项。
- 属于同一盘口的所有选项共享相同的
marketId。 - 盘口的第一个
outcomeId始终等于marketId。
ID结构
marketId和outcomeId都是整数,构造如下:
11xxxx→ 篮球盘口或选项14xxxx→ 美式橄榄球盘口或选项
- 每项运动无限的盘口和选项
- 按运动快速分组
- 立即可见的盘口关系
为什么marketId很重要(套利和建模)
单个marketId下的所有选项共同代表一个完整的概率空间。
这使得marketId特别适用于:
- 套利检测
- 超出率/利润率计算
- 概率归一化
- 盘口完整性检查
marketId对赔率分组。
参与者和球员
participantId
- 整数。
- 代表赛事中的球队或参赛者。
- 通过
/participants发现。
playerId
- 整数。
- 用于球员投注盘口。
playerId = 0通常代表非球员盘口。- 通过
/players发现。
赛事ID
fixtureId结构
fixtureId是一个编码多条信息的字符串:
id→ 提供商标识符/简短slug11→ sportId(2位数字)000132→ tournamentId(6位数字)62926199→ 提供商的原生赛事ID
这为什么重要
仅从fixtureId,您就可以推断:
- 体育运动
- 锦标赛
- 上游提供商
- 全局唯一性
期货ID
futureId结构
futureId遵循类似的原则:
- 提供商
- 体育运动
- 赛季
- 盘口
fixtureId一样,这使期货:
- 全局唯一
- 自描述
- 易于调试和追踪
赔率标识符
赛事赔率键
对于赛事,单个价格由以下唯一标识:期货赔率ID
对于期货,赔率由以下唯一标识:- 期货
- 博彩公司
- 选项
- 参与者(如适用)
- 球员(用于投注)
存储建议(重要)
我们强烈建议使用这些标识符作为存储中的主键: 赛事赔率:- 无重复
- 简单更新
- 高效的时间序列存储
- 跨快照和回填的轻松协调
时间戳(秒与毫秒)
此API有意使用纪元秒和纪元毫秒,具体取决于上下文。纪元秒(UTC)
用于计划或粗粒度时间值:startTimestartTimeFromstartTimeTo
纪元毫秒(UTC)
用于高频价格更新:changedAt- 赛事的赔率
since过滤器 - 期货赔率
createdAt
建议
- 将时间戳存储为整数。
- 不要在文档记录为秒的地方假设毫秒(反之亦然)。
- 仅在需要时进行内部归一化。
实施建议
服务器位置很重要
要实现实时更新的最低延迟:- 最快的交付区域是中欧(推荐)和美国东部。
- 为获得最佳性能,请将后端部署在我们使用的相同数据中心,例如:
- 如果您正在构建对延迟敏感的预测市场或模型,请考虑:
- 通过Netcup部署在奥地利(AT),或
- 使用AWS eu-west-1(爱尔兰)
与我们流媒体基础设施位于同一位置的服务器可以更快地接收更新,跳数更少。
快照 + 实时模式
可靠的集成模式:- 获取HTTP快照(赛事、赔率或期货)
- 订阅WebSocket以获取实时更新
- 如果WebSocket发出
snapshot_required信号:- 重新获取HTTP快照
- 恢复实时流
高效回填
- 在可用时使用
since参数 - 除非需要,否则避免完整的历史获取
- 按赔率标识符存储赔率以进行去重
速率限制处理
- 读取
X-RateLimit-Limit、X-RateLimit-Remaining和X-RateLimit-Reset - 在HTTP 429时,遵守
Retry-After并退避
总结
此API的设计使得:- ID是自描述的
- 关系无需连接即可推导
- 赔率标识符是全局唯一的
- 套利和存储逻辑简单且稳健