Developer API

Programmatic access to Model90's WC 2026 predictions, Elo ratings, odds, and analytics. Free for personal and research use.

Base URLhttps://api-production-7d26a.up.railway.app

Authentication

Pass your API key in the X-API-Key request header. Public read endpoints work without a key; write operations (generating keys) require Supabase auth.

curl -H "X-API-Key: YOUR_KEY" \
  https://api-production-7d26a.up.railway.app/api/fixtures?league_id=1

Get an API Key

Sign in to generate keys — manage up to 5 active keys per account.

Endpoints

GET
/api/fixtures?league_id=1&date=2026-06-30

List upcoming fixtures with prediction probabilities.

GET
/api/fixtures/{id}

Full fixture detail: stats, lineups, events, odds, predictions.

GET
/api/predictions/{id}

Latest ML prediction for a fixture (home_win, draw, away_win probabilities + xG).

GET
/api/predictions/{id}/explain

Directional feature attribution for a prediction (Elo edge, xG advantage, H2H, etc.).

GET
/api/advanced-analytics/{id}

Advanced analytics: PPDA, progressive pass %, xG/shot, xG overperformance.

GET
/api/elo

Elo ratings for all tracked teams, sortable.

GET
/api/odds

Current 1X2 bookmaker odds + model-implied value edges.

GET
/api/confidence-map

Elo-based confidence scores for all WC 2026 nations.

GET
/api/leaderboard?phase=group

Community Beat-the-Model leaderboard with Brier scores, streaks, and badges.

GET
/api/reports/daily

Daily Intelligence Report: top confidence pick, value bets, goal fests, biggest miss.

GET
/api/model/evolution

Model version history: log-loss, Brier, accuracy, and RPS per training run.

POST
/api/keys

Generate a new API key (max 5 per user).

Auth
GET
/api/keys

List your active API keys.

Auth
DELETE
/api/keys/{id}

Revoke an API key.

Auth

Examples

Python
import requests

BASE = "https://api-production-7d26a.up.railway.app"
HEADERS = {"X-API-Key": "YOUR_KEY"}

# Get today's fixtures
r = requests.get(f"{BASE}/api/fixtures", headers=HEADERS)
fixtures = r.json()

# Get prediction for a specific match
pred = requests.get(f"{BASE}/api/predictions/12345", headers=HEADERS).json()
print(pred["home_win_prob"], pred["draw_prob"], pred["away_win_prob"])

Rate Limits & Terms

  • 60 requests/min for authenticated users
  • 10 requests/min for unauthenticated requests
  • • Data is for personal, research, and non-commercial use only
  • • Prediction data has a 24–48h FBref lag; live odds update every 5 minutes

Questions? Open an issue on GitHub