---
title: "Calibration data for a deployed model"
method: GET
path: "/v1/calibration/{sport}/{model_id}"
tags: ["calibration"]
---

# Calibration data for a deployed model

`GET /v1/calibration/{sport}/{model_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/calibration/{sport}/{model_id}`
- Auth: none declared

Returns the latest ``_deploy.json`` calibration payload published by the relevant AI pipeline. Use ``GET /v1/models`` to list valid (sport, model_id) pairs. The shape under ``data`` is sport- and task-specific — see the source data on the methodology page.

## Path parameters

- `sport` 'nba' | 'euroleague' | 'football' | 'tennis' | 'wta' | 'champions', required
- `model_id` string, required

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- CalibrationResponse
  - `sport` 'nba' | 'euroleague' | 'football' | 'tennis' | 'wta' | 'champions', required
  - `model_id` string, required
  - `source_file` string, required: Filename the payload was read from. Either the upstream ``*_deploy.json`` (preferred — carries a timestamp in the filename) or, when the upstream copy is missing, the blessed ``<short>.json`` synced to ``web/static/data/calibration``.
  - `generated_at` string, nullable: Sortable ISO timestamp ("YYYY-MM-DD HH:MM:SS") for the source. Parsed from the filename when read upstream; from the ``timestamp`` field in the JSON payload when read from the blessed copy. ``null`` when neither carries one.
  - `data` object, required: Calibration metrics as produced by the AI module's calculate_calibration pipeline. Shape depends on model type: binary classifiers return reliability bins; multiclass models return per_class arrays. READING GUIDE — two independent metric families: • Calibration (does the stated probability match observed frequency?): `ece`, `calibration_mae`, `calibration_max_error`, `coverage_90`. A well-calibrated Poisson regressor has `coverage_90` ~0.90 and small `calibration_mae`; for noisy sport-stat regression `coverage_90` 0.78-0.85 with `calibration_mae` 0.05-0.10 is OPERATIONALLY ACCEPTABLE. • Accuracy (how close is the point estimate to truth?): `correlation`, `mae`, `rmse`, `brier_score`, `accuracy`. Independent of calibration — a low correlation on a Poisson regressor reflects high irreducible variance in the target, NOT miscalibration. There is intentionally NO binary 'pass / fail' verdict in this payload: judging a model from a strict threshold misleads more than it informs on noisy sport-stat domains. Interpret the numeric metrics in context. `summary.source` names the upstream file stem the numbers were measured on. It matters where one model id has been served by successive training heads: the NBA per-player models read `player_points_full_roster` once the full-roster heads are deployed and `player_points` before that, and the metrics describe the population of the stem that is named.

## 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/026afdfa7802?raw)
