---
title: "NBA per-player projections for a single match"
method: GET
path: "/v1/predictions/nba/{match_id}/players"
tags: ["predictions"]
---

# NBA per-player projections for a single match

`GET /v1/predictions/nba/{match_id}/players`

## 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/nba/{match_id}/players`
- Auth: none declared

Returns the same ``players`` array embedded in the NBA match-detail payload, exposed as a standalone endpoint for callers that only need the player layer (e.g. fantasy-app builders).

ROW SET: the projected ROSTER of each team, around 19 names a side, not the expected starting five. Twelve stats are projected for each of them (points, rebounds, assists, three-pointers made, steals, blocks, turnovers, field goals made and attempted, free throws made and attempted, NBA Salary Cap points), each with an expectation and a full discrete distribution. Every field beyond the original four heads is nullable and simply absent for a match predicted before the full-roster rollout.

HOW TO READ THEM: all twelve models beat a naive rolling average on the distribution. Five (points, rebounds, field goals made, field goals attempted, NBA Salary Cap points) also beat it on single-number error and are safe as point estimates. For the other seven, prefer the distribution or a quantile band over the expectation alone.

AVAILABILITY: ``started`` and ``projection_mode`` describe the published lineup of the day and nothing else. There is no probability that a player features and no injury data anywhere in this response, by design.

``preset`` adds a ``fantasy`` object per player with that scoring system's projected score.

## Path parameters

- `match_id` string, required

## Query parameters

- `preset` 'espn_points' | 'yahoo_9cat' | 'sleeper_points' | 'nba_salary_cap'

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- NBAPlayerProjection[]
  - `name` string, required
  - `team` string, required
  - `is_home` boolean, required
  - `position` integer, nullable: Rank slot inside the published starting five, 1 to 5, and 0 for a roster player outside it or for a projection made with no published lineup. It is NOT a listed basketball position: read ``listed_position`` and ``court`` for that.
  - `expected_points` number, nullable
  - `expected_rebounds` number, nullable
  - `expected_assists` number, nullable
  - `expected_three_pointers_made` number, nullable: Expected three-pointers made.
  - `points_distribution` object, nullable
  - `rebounds_distribution` object, nullable
  - `assists_distribution` object, nullable
  - `three_pointers_made_distribution` object, nullable
  - `expected_steals` number, nullable
  - `steals_distribution` object, nullable
  - `expected_blocks` number, nullable
  - `blocks_distribution` object, nullable
  - `expected_turnovers` number, nullable
  - `turnovers_distribution` object, nullable
  - `expected_field_goals_made` number, nullable
  - `field_goals_made_distribution` object, nullable
  - `expected_field_goals_attempted` number, nullable
  - `field_goals_attempted_distribution` object, nullable
  - `expected_free_throws_made` number, nullable
  - `free_throws_made_distribution` object, nullable
  - `expected_free_throws_attempted` number, nullable
  - `free_throws_attempted_distribution` object, nullable
  - `expected_nba_salary_cap_points` number, nullable: Expected NBA Salary Cap fantasy score (points + rebounds + 2 x assists + 3 x blocks + 3 x steals) from a model trained on that total directly, not from summing the component models. It is the only projected total with a distribution of its own.
  - `nba_salary_cap_points_distribution` object, nullable
  - `started` boolean, nullable: True when the player is in the team's published starting five for this game, false when a lineup was published and he is not in it, null when no lineup had been published at projection time. Null is a real state here, not a missing value. This is the published lineup and nothing more: it is not a chance of playing and carries no injury information.
  - `projection_mode` string, nullable: gameday (a lineup was published), gameday_no_lineup (the whole roster projected without one) or calendar (a lineup-free projection for a game later in the week). Null for rows written before the full-roster rollout.
  - `row_source` string, nullable: Where the roster row came from: box_score, roster_union or published_lineup.
  - `low_confidence` boolean, nullable: True when this row rests on a thin recent record, typically a roster player with no recent appearance. The row is published flagged rather than dropped.
  - `listed_position` string, nullable: Listed basketball position, e.g. PG, SG, SF, PF, C, G-F.
  - `court` string, nullable: BC for backcourt or FC for frontcourt, derived from the first token of listed_position. Fantasy formats that require a backcourt and frontcourt split use it.
  - `fantasy` NBAFantasyScore: Projected fantasy score for the requested scoring preset.
    - `preset` string, required
    - `label` string, required
    - `expectation` number, nullable: The projected score for this preset. For nba_salary_cap it is the model trained on that total itself, which is the number every Predixsport surface prints and ranks by. For every other points preset it is the preset's scoring formula applied to the component projections, exact for the average by linearity whatever the dependence between the individual stats. Null when any stat the formula needs is missing for this player: a partial total would understate him with nothing here to say so. Always null for yahoo_9cat, which is a per-category league with no single score.
    - `expectation_source` string: Which of the two readings ``expectation`` holds: ``direct_model`` for a preset scored by a model trained on its own total (nba_salary_cap), ``component_formula`` for the linear combination of the component projections, ``none`` when no score could be formed.
    - `formula_expectation` number, nullable: The preset formula applied to the component projections, published alongside ``expectation`` for nba_salary_cap so the two readings of the same total can be compared. It is a cross-check, not a second score: the served number is ``expectation``. Null for every other preset, where the two would be the same value.
    - `distribution_quantiles` object, nullable: Quantiles p10/p25/p50/p75/p90 of the score. Present for nba_salary_cap only, because it is the one preset with a model trained on the total itself. No composite distribution is claimed for the others: a sum of dependent counts is not the convolution of the marginals.
    - `categories` NBAFantasyCategory[], nullable: Per-category values. Present for yahoo_9cat only.
      - `key` string, required
      - `label` string, required
      - `value` number, nullable
      - `lower_is_better` boolean
      - `ratio_of_means` boolean: True for FG% and FT%, which are the ratio of two projected averages rather than a projected percentage. The distinction matters: the expected ratio is not the ratio of expectations.

## 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)
