赔率是足球数据里最活跃的一类,赛前它随市场情绪缓慢移动,开赛后它跟着场上每一次射门、每一个进球实时跳动。

很多开发者在接入赔率数据时最头疼的,不是拿不到数字,而是数据结构太散:赛前一套、滚球一套,让分线藏在哪、盘口怎么归类、多语言怎么显示,往往要翻好几份文档才拼得起来。

AnySport 把赔率数据收敛成了两个端点:赛前赔率和滚球赔率。它们共用同一个 match_id、同一套响应信封、同一种十进制赔率格式。

一、两个端点,一个 match_id

AnySport 的赔率数据由两个 REST 端点提供:

端点阶段更新方式
GET /odds/prematch赛前轮询更新(看 updated_at)
GET /odds/live滚球(比赛进行中)秒级实时变化

基址是 https://data.anysport.io/v1/soccer,所有请求带一个请求头认证:

apikey: YOUR_API_KEY

两个端点接受的 match_id 与赛程 GET /matches 完全一致,从赛程发现到比分、事件、赔率,全程一个 ID 走到底,不需要任何映射表。这是 AnySport 数据模型最省心的地方,赔率接口也不例外。

赔率来源目前统一为 bet365(响应里的 bookmaker 字段)。这个字段是为将来接入多家赔率源预留的,现在恒为该值即可。

二、赛前赔率:GET /odds/prematch

赛前赔率返回一场比赛在开赛前的赔率快照,覆盖 60+ 种盘口,胜平负、让球、进球数、角球、黄牌、正确比分等等。你可以用 match_id 查单场,也可以用 league(联赛名)批量查询。

GET /v1/soccer/odds/prematch?match_id=as_37f0da0520bb4e9a9588f80994cefc5b
{
  "success": true,
  "data": [
    {
      "match_id": "as_37f0da0520bb4e9a9588f80994cefc5b",
      "home": "England",
      "away": "Argentina",
      "bookmaker": "bet365",
      "phase": "prematch",
      "main_market": "match_winner",
      "home_odd": 2.62,
      "draw_odd": 3.0,
      "away_odd": 3.0,
      "markets": [
        {
          "market_code": "match_winner",
          "options": [
            { "name": "Home", "odd": 2.62 },
            { "name": "Draw", "odd": 3.0 },
            { "name": "Away", "odd": 3.0 }
          ]
        },
        {
          "market_code": "asian_handicap",
          "options": [
            { "name": "Home -1.25", "odd": 4.8 },
            { "name": "Away +1.25", "odd": 1.18 }
          ]
        }
      ]
    }
  ]
}

几个关键字段:

  • main_market + home_odd / draw_odd / away_odd:主盘口是全场胜平负(match_winner),三个赔率直接平铺在顶层,做主推展示时不用再去 markets 里翻。
  • markets[]:全部盘口列表,每个是 { market_code, options: [{ name, odd }] }。market_code 是 snake_case 的英文枚举(如 match_winner、asian_handicap),会随时间扩充。
  • odd:十进制赔率(decimal odds)。

⚠️ 赛前的让分值嵌在选项名里。赛前赔率没有盘口级别的 handicap 字段,让球/大小球这类盘口把盘口线直接写进 name,例如亚盘 Home -1.25 / Away +1.25(成对出现,两边数值互为相反数),大小球 Over 2.5 / Under 2.5。同一个盘口里可以同时存在多条盘口线。

三、滚球赔率:GET /odds/live

滚球赔率返回进行中比赛的实时赔率。不带 match_id 时,它会返回所有正在进行、有活跃盘口的比赛。这本身就能当作实时比赛查询的一个入口;带 match_id 时,查询单场的全部活跃盘口。

一场比赛在滚球阶段同时可以有 70–80 个活跃盘口实例,覆盖约 11 大类。

GET /v1/soccer/odds/live?match_id=as_3b37c382f39a4235aa93705f053b2da4
{
  "success": true,
  "data": [
    {
      "match_id": "as_3b37c382f39a4235aa93705f053b2da4",
      "home": "Argentina",
      "away": "Switzerland",
      "league": "World Cup 2026",
      "bookmaker": "bet365",
      "phase": "live",
      "main_market": "fulltime_result",
      "home_odd": 13.0,
      "draw_odd": 1.04,
      "away_odd": 51.0,
      "markets": [
        {
          "market_code": "asian_handicap",
          "handicap": -0.5,
          "options": [
            { "name": "1", "odd": 1.90 },
            { "name": "2", "odd": 1.90 }
          ]
        }
      ]
    }
  ]
}

和赛前相比,滚球有两个结构性差异,接入时务必注意:

⚠️ 选项标签不一样:赛前用 Home / Draw / Away,滚球用 1 / X / 2。如果你想让赛前和滚球复用同一套渲染逻辑,必须先做一层标签映射。

⚠️ 让分值的位置不一样:滚球把盘口线放在盘口级别的 handicap 字段里(如亚盘 -0.5 表示主队让半球),而不是像赛前那样写进选项名。没有让分概念的盘口,这个字段会直接省略(不下发,而不是给 null)。

部分滚球盘口一览

下面是滚球盘口按类别的部分示例,帮你快速建立结构直觉(完整目录见文末链接):

类别盘口示例选项是否有 handicap
胜负全场 1X2(主盘)、上半场 1X2、双胜、半全场1 / X / 2 等否
让球亚洲让球盘、欧洲三向让球1 / 2(欧盘含 X)是
大小球进球 / 角球 / 射门 / 黄牌等大小球Over / Under是
正确比分全场正确比分1:0 / 2:1 / 0:0…否
是 / 否双方是否都进球、是否再进球Yes / No视盘口而定
球员进球下一个进球球员、任意时间进球球员球员名字列表视盘口而定

⚠️ 滚球盘口是动态的:比赛临近结束时盘口会收缩,进球后盘口会被撤下再重新挂出,终场后 markets 可能变成空数组 []。客户端要能优雅处理这种收缩,别假设盘口一直存在。

📖 完整滚球盘口目录(约 11 大类、45 种玩法、含每个 market_code)请见:滚球盘口完整文档

四、多语言支持:lang 参数

两个赔率端点都支持 lang 参数(默认 en,当前可选 en / zh-CN,后续会增加)。它的行为很克制、也很安全:

  • 原始 code 字段永远不变:main_market / market_code / 选项 name 始终是英文原值,你的解析逻辑不用跟着语言变。
  • 额外下发 *_label 平行字段:main_market_label / market_code_label / options[].name_label 提供本地化文本(如 zh-CN 下 全场胜平负)用于直接展示。
GET /v1/soccer/odds/prematch?match_id=as_...&lang=zh-CN

⚠️ 不是每个值都有本地化文本(例如 2:1 这种比分字符串就没有),没有时对应的 *_label 字段会直接省略。渲染时优先用 *_label,取不到就回退到原始 name。此外,球队名 / 联赛名(home / away / league)目前还不随 lang 本地化。

五、接入要点速查

#要点说明
1认证请求头 apikey: KEY,仅此一种
2一个 match_id 通用赛程 / 比分 / 事件 / 赔率同一 ID
3赔率格式十进制赔率(decimal odds)
4主盘口平铺home_odd / draw_odd / away_odd 在顶层
5标签差异赛前 Home/Draw/Away,滚球 1/X/2
6让分位置赛前在选项名里,滚球在 markets[].handicap
7无让分时handicap 字段省略,不是 null
8滚球盘口动态会收缩,终场后 markets 可能为 []
9多语言lang 只影响 *_label,原始 code 不变
10未知盘口market_code 是开放枚举,容错未知值

六、开始接入

AnySport 的赔率接口把最繁琐的部分:ID 对齐、赛前/滚球统一模型、多语言标签,都替你收敛好了。你要做的只有三步:

  1. 从 GET /matches 拿到 match_id
  2. 赛前用 GET /odds/prematch 取赔率快照
  3. 开赛后切到 GET /odds/live 获取秒级滚球赔率

赛前赔率包含在 Pro 套餐,滚球赔率与 WebSocket 推送包含在 Premium 套餐。现在就去 anysport.io 注册,免费试用 7 天,用你自己的 Key 把上面的示例跑一遍。