---
title: "Full Champions League match payload (1X2, goal rates, key factors)"
method: GET
path: "/v1/predictions/champions/{match_id}"
tags: ["predictions"]
---

# Full Champions League match payload (1X2, goal rates, key factors)

`GET /v1/predictions/champions/{match_id}`

## Request

- Base URL: `https://api.predixsport.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.predixsport.com/v1/predictions/champions/{match_id}`
- Auth: none declared

Full payload for one Champions League match: the 1X2 triple, the model's Poisson goal rates, the pre-match European Elo of both clubs, and the concept-level key factors behind P(home win) in probability points. Once the match is played, `actual` carries the 90-minute result and whether the published pick was right (one match is not evidence about a model — use `/v1/performance/champions` for that). `key_factors` may be `null`: the explanation is advisory data on top of the prediction and never blocks one. Only 1X2 is published; the goals family was measured on this model and held back. Returns **404** if the `match_id` is unknown — including for a qualifying tie, which is deliberately never predicted.

## Path parameters

- `match_id` string, required

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- ChampionsMatchDetail: Full Champions League match payload: 1X2, goal rates, key factors. Scope note: TOURNAMENT matches only (league phase, knockout play-off, R16 onwards). Qualifying rounds are ingested and feed the European Elo ladder, but are outside the model's validated slice and are never published.
  - `match_id` string, required
  - `sport` 'champions'
  - `competition` string
  - `season` string, required
  - `season_label` string, required
  - `match_date` string, date, required
  - `kickoff_utc` string, date-time, nullable
  - `stage` string, nullable
  - `phase` string, nullable
  - `home_team` string, required
  - `away_team` string, required
  - `home_country` string, nullable: UEFA 3-letter association code, e.g. ENG.
  - `away_country` string, nullable
  - `neutral_venue` boolean
  - `probabilities` ChampionsProbabilities, required: 1X2 for a Champions League match. There is no second family here. The model is a bivariate Poisson-goals GLM, so the same grid implies totals, both-teams-score, Asian handicaps and exact score. All four were measured on the model's own frozen protocol and held back — totals and BTTS score worse than the holdout base rate, handicap tails miss calibration by up to 18 points, exact score is marginal. Only 1X2 ships. Audit it with ``GET /v1/calibration/champions/champions_winner``.
    - `home_win` number, nullable
    - `draw` number, nullable
    - `away_win` number, nullable
    - `predicted_result` string, nullable: H, D or A.
  - `expected_goals` ChampionsExpectedGoals: The model's own Poisson rates. Context, NOT a totals market. These are the two numbers the probability triple is built from, published because "how open is this tie" is a fair question the model can answer. Their LEVEL is measured and biased low — predicted mean total 2.83 against an actual 3.18 over the holdout — so they order matches sensibly and do not project goals accurately. Do not derive an over/under from them.
    - `home` number, nullable
    - `away` number, nullable
    - `caveat` string: Always present. Repeat it wherever these numbers are shown.
  - `ratings` ChampionsRatings: Pre-match European Elo, the model's single largest input. A dedicated ladder walked over Champions League AND Europa League matches, qualifying included, with career carryover — it is NOT re-seeded each season the way the domestic football and NBA ratings are, so these values ARE comparable across seasons.
    - `home_euro_elo` number, nullable
    - `away_euro_elo` number, nullable
  - `key_factors` KeyFactors: Concept-level attribution of the winner prediction. Computed with gradient-based attribution on the production neural network and aggregated into human concepts; the factors approximately sum to the gap between the served win probability and an even matchup. For football the factors compare the two sides directly (the draw probability is modelled separately). Absent on rows predicted before the explainability rollout (June 2026).
    - `schema_version` integer: Contract version of this payload.
    - `baseline_probability` number, nullable: Model probability for an average matchup — the reference point the factors move the prediction away from.
    - `factors` KeyFactor[]: Factors sorted by absolute impact (largest first).
      - `key` string, required: Stable identifier of the factor (e.g. 'surface', 'starting_five', 'attack').
      - `label` string, required: Human-readable factor name, as shown on predixsport.com.
      - `prob_points` number, required: How many win-probability percentage points this factor moves the prediction. Positive values favour the first side (player one / home team), negative values the second side.
      - `direction` string, required: What the factor favours: 'player_one'/'player_two' for tennis, 'home'/'away' for NBA and football winner attributions, 'under'/'over' for the football under/over 2.5 attribution.
      - `stable` boolean, required: True when the attribution sign is consistent across independent estimator runs. Treat unstable factors as indicative, not decisive.
      - `display` boolean: False for internal context buckets not shown on predixsport.com.
      - `share` number, nullable: This factor's share of the total absolute attribution (0-1).
      - `synthetic` boolean, nullable: True for fixed baseline terms (home advantage, league scoring environment) that reflect league-wide tendencies rather than this specific matchup.
      - `side` string, nullable: For per-team factors on outcome attributions (football under/over): which team the factor describes ('home'/'away'). Surfaces can substitute the actual team name into the label.
  - `produced_by` string, nullable: Provenance of the fitted artifact behind this number: variant, shrink, draw coupling and training seasons. Named `produced_by` rather than `model_*` because pydantic reserves that prefix.
  - `published_at` string, date-time, nullable: When this prediction was FIRST published (never moves).
  - `updated_at` string, date-time, nullable: When it was last re-scored. Frozen at kick-off.
  - `actual` ChampionsActual: Realised outcome, present once the match has been played and ingested.
    - `result` string, nullable: H, D or A on the 90-minute score.
    - `home_goals` integer, nullable
    - `away_goals` integer, nullable
    - `correct` boolean, nullable: Whether the published argmax matched the outcome. A single match is not evidence about a model — read `GET /v1/performance/champions` for the record.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/predixsport/apis/predixsport-api.md) · [All operations](https://skmtc.dev/predixsport/apis/predixsport-api/llms.txt) · [OpenAPI document](https://skmtc.dev/predixsport/apis/predixsport-api/revisions/02014aee733d?raw)
