Growing Discord community — direct access to the developer, live coverage & picks. Join the Discord Join now →
Leagues Matches Predictions Stats Coverage
Docs / Football API free

Odds & predictions#

Free multi-bookmaker football odds plus model forecasts. All prices are decimal. For odds across other sports with tick history, see the separate Odds API product.

Odds feed#

GET /api/v2/odds/

One row per event × market × outcome × bookmaker, updated continuously.

Param Type Description
event_id int One match
league_id / season_id / team_id int Scope filters
market string 1x2 · over_under_15 · over_under_25 · over_under_35 · btts · double_chance · draw_no_bet · total_corners · total_red_cards
outcome string e.g. home, draw, away, over, under, yes, no
bookmaker_slug string One bookmaker (see /bookmakers/)
is_max_quote bool Only rows that are the current best price for their outcome
movement string up · down — price drift since previous observation
min_decimal_odds / max_decimal_odds float Price band
updated_after datetime Only rows updated since this ISO timestamp
limit / offset int Pagination
{
  "id": 90412331, "event_id": 223510,
  "market": "1x2", "outcome": "home", "outcome_name": "Aldosivi",
  "line": null,
  "bookmaker_slug": "pinnacle", "bookmaker_name": "Pinnacle",
  "decimal_odds": 2.45, "previous_decimal_odds": 2.55,
  "implied_probability": 0.408, "movement": "down",
  "is_max_quote": false, "updated_at": "2026-08-02T14:52:11+00:00"
}

Lined markets (total_corners, total_red_cards) populate line (e.g. 9.5). Single row: GET /api/v2/odds/{id}/.

Best prices#

GET /api/v2/odds/best/
Param Type Description
market string Required in practice — which market to rank
league_id / season_id / team_id int Scope
date_from / date_to date Kickoff window
limit / offset int Pagination (max 200)

Per event, the best available decimal price per outcome with the bookmaker offering it.

Bookmakers#

GET /api/v2/bookmakers/    →  [ { "slug": "pinnacle", "name": "Pinnacle" }, … ]

The same slugs work on the WebSocket bookmaker_slug subscription.

Per-match shortcuts#

On any event: /api/v2/events/{id}/odds/ (consensus), /odds/comparison/ (full grid), /polymarket/ (prediction-market probabilities) — see Events & live scores.

Polymarket#

GET /api/v2/events/{id}/polymarket/

Implied probabilities (0–1 floats, not decimal odds) per market, plus trading-signal fields for matches with an active prediction market.

{
  "event_id": 223510,
  "markets": {
    "1x2": { "home": 0.41, "draw": 0.29, "away": 0.30 },
    "btts": { "yes": 0.52, "no": 0.48 },
    "over_under": { "over_25": 0.55, "under_25": 0.45 }
  },
  "liquidity": {
    "volume_24hr": 18420.5, "volume_1wk": 96210.0,
    "volume_1mo": 210500.0, "volume_1yr": 890100.0,
    "open_interest": 42110.0,
    "liquidity_clob": 8900.0, "liquidity_amm": 1200.0
  },
  "pricing": {
    "best_bid": 0.40, "best_ask": 0.42,
    "change_1d": 0.015, "change_1wk": -0.03, "change_1mo": 0.08
  },
  "goalscorers": { "...": "..." },
  "exact_scores": { "...": "..." },
  "updated_at": "2026-08-02T14:52:11+00:00"
}

liquidity and pricing sub-fields are null when that trading data isn't available. The endpoint itself returns 404 for matches with no active Polymarket market.

Predictions#

GET /api/v2/predictions/
GET /api/v2/predictions/{id}/
GET /api/v2/events/{id}/prediction/     # same shape, by event
Param Type Description
status string Filter by match status
league_id / season_id / team_id int Scope
date_from / date_to date Kickoff window
min_confidence float Minimum model confidence (0–1)
recommended bool Only picks the model flags as value
limit / offset int Pagination
{
  "id": 88123,
  "event": { "id": 223510, "home_team": "Aldosivi", "away_team": "Gimnasia y Esgrima", "...": "..." },
  "markets": {
    "match_result": { "prob_home": 34.1, "prob_draw": 30.2, "prob_away": 35.7, "predicted": "away" },
    "expected_goals": { "home": 1.12, "away": 1.24 },
    "over_under": { "prob_over_15": 71.4, "prob_over_25": 44.8, "prob_over_35": 21.9 },
    "btts": { "prob_yes": 48.5 },
    "score": { "most_likely": "1-1" },
    "draw_no_bet": { "prob_home": 48.9 },
    "corners": { "prob_over_85": 61.0, "prob_over_95": 49.2, "prob_over_105": 37.5 }
  },
  "recommendations": { "favorite": "away", "favorite_prob": 35.7, "over_25": false, "btts": false },
  "model": { "confidence": 0.62, "version": "v1" }
}

Note: market probabilities are 0–100; model.confidence is 0–1. This asymmetry is a frozen legacy contract kept for compatibility.

Predictions are cached ~2 minutes server-side.

View this page as Markdown · Found a mistake? Tell us