快速解答
只要一把 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 日查閱