快速解答
只要一把 Odds-API.io 密钥和约 40 行 Python,就能列出赛事、取得多家博彩公司的价格、换算成隐含概率并串流实时更新。REST 基础网址为 https://api.odds-api.io/v3,密钥放在 apiKey 查找参数 [1] [2]。
你需要准备
你需要准备: Python 3.9 以上、requests 与 websockets 套件,以及 API 密钥。新的免费密钥已暂停发放;方案从每月 £49 起,含 2 家博彩公司与每小时 5,000 次请求 [1] [3]。
获取密钥: Odds-API.io 合作链接
代码测试状态: 本教学的 Python 代码是以 Odds-API.io 文档中公布的范例回应运行测试(2026 年 11 月 3 日查核),并未使用真实 API 密钥。实际回应可能有更多字段;程序只读取文档中列出的字段。
1. 安装套件并保存密钥
把密钥放在环境变量中,不要写进代码 [1]。
python -m pip install requests websockets
export ODDS_API_KEY="your-api-key" # Windows PowerShell: $env:ODDS_API_KEY="your-api-key"
2. 列出运动与即将开赛的赛事
/sports 不需要密钥。/events 需要运动参数,并可加上 league、status(例如 pending、live)、日期区间与 limit [4]。
import os
import requests
BASE = "https://api.odds-api.io/v3"
API_KEY = os.environ["ODDS_API_KEY"] # never hard-code or commit your key
BOOKMAKERS = "Bet365,Unibet" # use bookmakers selected on your plan
def get(path, **params):
"""GET an Odds-API.io v3 endpoint and return parsed JSON."""
params["apiKey"] = API_KEY
r = requests.get(BASE + path, params=params, timeout=20)
if r.status_code == 429:
raise RuntimeError("Rate limit reached - wait before retrying")
r.raise_for_status()
return r.json()
sports = requests.get(BASE + "/sports", timeout=20).json() # no key needed
print([s["slug"] for s in sports][:10])
events = get("/events", sport="football", league="england-premier-league",
status="pending", limit=10)
for e in events:
print(e["id"], e["date"], e["home"], "v", e["away"])
3. 取得赔率并计算隐含概率
/odds 接受一个 eventId、最多 30 家 bookmakers,以及可选的 markets 筛选;价格为小数字串 [4] [1]。程序把它们换成隐含概率、按比例去除超额概率,并找出每个结果的最佳价格,数学与隐含概率与去抽水计算机相同。
def ml_prices(event_odds):
"""{bookmaker: {"home": 2.1, "draw": 3.4, "away": 3.2}} from one /odds response."""
out = {}
for book, markets in event_odds.get("bookmakers", {}).items():
for m in markets:
if m["name"] == "ML" and m.get("odds"):
row = m["odds"][0]
out[book] = {k: float(row[k]) for k in ("home", "draw", "away") if k in row}
return out
event_id = events[0]["id"]
prices = ml_prices(get("/odds", eventId=event_id, bookmakers=BOOKMAKERS, markets="ML"))
for book, p in prices.items():
booksum = sum(1 / o for o in p.values()) # implied probabilities
fair = {side: (1 / o) / booksum for side, o in p.items()} # proportional no-vig
print(f"{book}: overround {booksum - 1:.2%}",
{side: f"{q:.1%}" for side, q in fair.items()})
best = {}
for book, p in prices.items():
for side, o in p.items():
if o > best.get(side, (0, ""))[0]:
best[side] = (o, book)
print("Best price per outcome:", best)以文档中的范例回应(Bet365 2.10/3.40/3.20)运行,会印出超额概率 8.28%。
4. 一次请求批量查找最多 10 场
/odds/multi 一次回传最多 10 场赛事的赔率,只算一次请求;在每小时 5,000 次的额度下很重要 [4] [3]。
ids = ",".join(str(e["id"]) for e in events[:10]) # up to 10 events
for ev in get("/odds/multi", eventIds=ids, bookmakers=BOOKMAKERS, markets="ML"):
print(ev["home"], "v", ev["away"], ml_prices(ev))
5. 用 WebSocket 串流实时价格
比赛中快速变动的价格请用 WebSocket 推送:wss://api.odds-api.io/v3/ws。markets 筛选为必填,连接必须支持 permessage-deflate(Python websockets 支持,websocket-client 会被拒绝),而且每则 updated 消息都带完整的市场集合,所以要直接取代已存数据而不是合并 [5]。WebSocket 为付费加购 [3]。
import asyncio, json, os
from urllib.parse import urlencode
import websockets # needs permessage-deflate; "websocket-client" is refused
STATE = {} # (event id, bookmaker) -> list of markets
async def stream():
qs = urlencode({"apiKey": os.environ["ODDS_API_KEY"], "markets": "ML",
"sport": "football", "status": "live"})
async with websockets.connect(f"wss://api.odds-api.io/v3/ws?{qs}",
ping_interval=30, ping_timeout=10) as ws:
async for raw in ws:
msg = json.loads(raw)
if msg["type"] in ("created", "updated"):
STATE[(msg["id"], msg["bookie"])] = msg["markets"] # replace, never merge
for m in msg["markets"]:
if m["name"] == "ML" and m.get("odds"):
print(msg["id"], msg["bookie"], m["odds"][0])
elif msg["type"] in ("deleted", "no_markets"):
STATE.pop((msg["id"], msg["bookie"]), None)
asyncio.run(stream())
6. 下一步
把价格丢进套利计算机或期望值(+EV)计算机,或让 API 直接计算:见用 Odds-API.io 找套利与 +EV。要与 Polymarket、Kalshi 比较,请看预测市场价格与博彩赔率比较。
常见问题
需要付费方案吗?
新用户需要:新的免费密钥已暂停,方案从每月 £49 起。既有免费密钥仍可使用,每小时 100 次、每日上限 500 次。
可以查哪些博彩公司?
你方案中选定的博彩公司。查找其他公司不会有数据回传。
REST 还是 WebSocket?
快照与单次查找用 REST;需要持续更新的价格用 WebSocket。官方文档建议实时数据使用 WebSocket。
关于本指南
Pred-Data 发布关于预测市场及相关 AI 工具的独立解说,所有事实陈述都附上一手或可信的二手来源链接,并于上方日期查核。我们不经营交易平台、不接受投注,也不提供个人化建议。
作者:Ken Lin · 更正:如发现错误,我们会审核并标注修正日期。
联盟行销揭露
本站部分链接(标示“合作链接”)可能是联盟行销链接:若你通过这些链接注册,我们可能获得佣金,你无须支付额外费用。合作链接使用 rel="sponsored nofollow",且不会影响我们的评估。比较表中的平台链接均为官方网站的一般链接,并非联盟链接。
数据源
- Quickstart (get a key, first calls, example responses) — Odds-API.io docs, 2026 年 11 月 2 日访问
- AI & Vibe Coding (llms.txt, OpenAPI, copy-paste context, MCP setup) — Odds-API.io docs, 2026 年 11 月 2 日访问
- Odds API Pricing (plans, WebSocket add-on, extra requests, payment) — Odds-API.io, 2026 年 11 月 2 日访问
- OpenAPI specification (all v3 endpoints and parameters) — Odds-API.io docs, 2026 年 11 月 2 日访问
- WebSocket guide (wss://api.odds-api.io/v3/ws, markets filter, reconnects) — Odds-API.io docs, 2026 年 11 月 2 日访问