要点まとめ
Odds-API.io の API キーと 40 行ほどの Python で、試合の一覧を取得し、複数社の価格を集めてインプライド確率に換算し、更新を受信できます。REST のベース URL は https://api.odds-api.io/v3 で、キーは apiKey クエリパラメータで渡します [1] [2]。
日本の方へ: 本チュートリアルはデータ取得と分析の解説であり、利用を勧めるものではありません。日本国内から海外のブックメーカーや予測市場で金銭を賭けることは、刑法の賭博罪に当たるおそれがあります(警察庁)。日本語版では賭けや取引ができるサイトへのリンクを掲載していません。
必要なもの
必要なもの: Python 3.9 以上、requests と websockets パッケージ、API キー。新規の無料キーは停止中で、プランは月 £49(2 社、1 時間 5,000 リクエスト)からです [1] [3]。
API キーの入手: 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 1 件、最大 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 試合を 1 リクエストで取得する
/odds/multi は最大 10 試合のオッズを返し、1 リクエストとして数えられます。1 時間 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. 次のステップ
価格差の分析は価格差(裁定)と期待値のデータ分析、Polymarket・Kalshi との比較は予測市場の価格とブックメーカーのオッズ比較を参照してください。
よくある質問
有料プランは必要ですか?
新規利用では必要です。新規の無料キーは停止中で、プランは月 £49 からです。既存の無料キーは 1 時間 100 リクエスト(1 日 500 まで)で引き続き使えます。
どのブックメーカーのデータが取れますか?
プランで選択したブックメーカーです。それ以外を指定してもデータは返りません。
REST と WebSocket のどちらを使うべき?
スナップショットや単発の照会は REST、継続的に更新される価格は WebSocket です。ドキュメントはリアルタイムのデータに WebSocket を勧めています。
このガイドについて
Pred-Data は、予測市場とその周辺で使われる AI ツールについて、出典付きで解説する独立系サイトです。本ページの事実に関する記述は、上記の日付に確認した一次情報または信頼できる二次情報に基づいています。取引所の運営、賭けの受付、個別の助言は一切行っていません。
著者:Ken Lin · 訂正:誤りを見つけた場合は確認のうえ、修正日を明記して訂正します。
アフィリエイト(広告)表記
本サイトの一部のリンク(「提携リンク」と表示)はアフィリエイトリンクです。リンク経由で申し込むと、当サイトが報酬を受け取る場合がありますが、利用者の負担が増えることはありません。提携リンクには rel="sponsored nofollow" を付けており、評価内容には影響しません。提携先はオッズ等のデータ API 事業者のみで、賭博サービスとは提携していません。
出典
- 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日閲覧