---
title: "Set tonight's lineup for my season-long NBA league"
method: POST
path: "/v1/fantasy/nba/me/lineup"
tags: ["fantasy"]
---

# Set tonight's lineup for my season-long NBA league

`POST /v1/fantasy/nba/me/lineup`

## 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/fantasy/nba/me/lineup`
- Auth: none declared

Places the players you hold who have a game tonight into the slots your league actually fields, and returns the placement with the highest expected points. The answer is EXACT, not a ranking: your best guard can be worth nothing tonight if the only slots he fits are already taken by better guards, which is the mistake a player-by-player list makes and this endpoint does not. Every seat says where its number came from: tonight is the model's projection for tonight's game, and a player we hold nothing measured for carries a baseline estimate, never a zero. Each seat also carries `eligibility_confirmed`, which is false while the player's platform eligibility is still OUR guess from his listed position: say so wherever you show the placement. `locked` names the players whose game has already tipped off, so their SLOT cannot change: a lock keeps a player in the slot he is ALREADY playing in and the rest is optimised around him. Send `{"player_name": "...", "slot": "UTIL"}` when you know the seat. A bare name is resolved against the lineup last returned for the same day, and refused when there is none, because a guessed seat moves a slot. Season-long squads only. The official NBA Salary Cap game has its own Gameday card on GET /v1/fantasy/nba/me, and a nine-category league is refused because nine columns have no single score to maximise. Appends an immutable snapshot and changes nothing else. It never signs in to ESPN, Yahoo, Sleeper or the NBA game and never submits a lineup anywhere. Owner comes from the bearer token. Requires mcp:read and fantasy:nba:write. The NBA fantasy workspace is a public beta. When the operator narrows it to a private trial, this endpoint answers 403 for an account outside it.

## Headers

- `authorization` string, nullable

## Request body

- NBAFantasyLineupRequest
  - `season` string, nullable: NBA season, e.g. 2027. Omitted = the current season.
  - `locked` union[]: Players whose game has already tipped off. A lock keeps a player in the slot he is ALREADY playing in tonight, so each entry carries that slot: {"player_name": "...", "slot": "UTIL"}. A bare name is still accepted and is resolved against the lineup last returned for the same day; with no such lineup the request is refused rather than guessed at.
    - union
      - string
      - NBAFantasyLock: One player whose game has tipped off, and the seat he is in. The slot is the point of it. A lock that forced presence alone let the optimiser move a guard out of UTIL into PG to free UTIL for a center, which is not a lineup anybody can submit after tip-off.
        - `player_name` string, required
        - `slot` string, nullable: The slot he is ALREADY playing in, one of the league's own. Omitted, it is read from the lineup last returned for the same day.

## Response `200`

Successful Response

- NBAFantasyLineupResponse
  - `sport` 'nba'
  - `mode` 'lineup'
  - `snapshot_id` integer, required
  - `season` string, required
  - `preset` string, required
  - `policy_version` string, nullable
  - `day` string, nullable
  - `board_digest` string, required
  - `roster_revision` integer, required
  - `slots` NBAFantasySlot[]
    - `slot` string, required
    - `count` integer, required
    - `eligible` string[], nullable: Which positions this slot accepts. Omitted for the slots every platform names the same way (PG, SG, SF, PF, C, G, F, UTIL).
  - `assignments` NBAFantasySeat[]
    - `slot` string, required
    - `seat` integer, required
    - `player_name` string, nullable
    - `value` number, nullable
    - `value_source` 'model' | 'weekly_rule' | 'baseline', nullable
    - `locked` boolean
    - `team` string, nullable
    - `opponent` string, nullable
    - `is_home` boolean, nullable
    - `lineup_status` string, nullable
    - `positions` string[]
    - `eligibility_confirmed` boolean: False while this player's platform eligibility is OUR guess from his listed position. Say so wherever the placement is shown.
    - `playing` boolean
  - `bench` NBAFantasyBenchSeat[]
    - `player_name` string, required
    - `value` number, nullable
    - `value_source` 'model' | 'weekly_rule' | 'baseline', nullable
    - `playing` boolean
    - `reason` 'no_game' | 'no_eligible_slot' | 'outranked' | 'baseline_only', required
    - `team` string, nullable
    - `opponent` string, nullable
    - `is_home` boolean, nullable
    - `lineup_status` string, nullable
    - `positions` string[]
    - `eligibility_confirmed` boolean
  - `unfilled` string[]: Slots no player you hold is eligible to fill tonight.
  - `expected_total` number, nullable
  - `close_calls` NBAFantasyCloseCall[]
    - `slot` string, required
    - `seated` string, required
    - `alternative` string, required
    - `gap` number, required
  - `locked_unplaced` string[]
  - `baseline` number, nullable: What a player we hold no projection for was priced at, read off the bottom of this squad. Never zero.

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