---
title: "Plan my transfers in the official NBA Salary Cap game"
method: POST
path: "/v1/fantasy/nba/me/transfers"
tags: ["fantasy"]
---

# Plan my transfers in the official NBA Salary Cap game

`POST /v1/fantasy/nba/me/transfers`

## 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/transfers`
- Auth: none declared

Compares keeping your saved ten with one plan per number of moves, over the frozen prices of the official market, and returns the one worth the most AFTER the cost of any paid transfer. Each of those plans is the best squad on court that many moves can reach: one exact program per number of moves, over EVERY legal squad your bank can reach, with no shortlist in between. `search` says so, and says `truncated` if a solve ever has to stop early. Every legality check is the game's own and comes from the frozen market snapshot: the 100.0M cap, five back court and five front court, at most two players from one club, and only players the game will transact. The COURT is the game's, frozen with the price, not our listed position and not your own override: the game decides which side of the floor it counts a player on. Value is the Predixsport weekly rule, based on season performance, recent form and the calendar, over the games each player has left in the current Gameweek. Describe it in those words and never as a formula. A player the rule cannot value is never bought, and one you already own that it cannot value is kept or sold at zero with the case named in `status`. Every total is the FIVE THE GAME WOULD FIELD each Gameday of the window and never a sum of the ten: the game plays five of a squad of ten, so a signing who never reaches the floor is worth nothing and a paid transfer is recommended only when the fielded gain beats its cost. `proxy_points` is the old sum of all ten, kept beside it for provenance, and it decides nothing. The game gives two free transfers a Gameweek, they do not carry over, and each extra move costs 100 official points. Those numbers are on the official rules page and NOT in the market payload, which is why every response repeats `transfer_rules_source`. Each option carries `transfer_point_cost` and `net_expected_points`, and `gain_vs_keep` is measured after that cost. `sell_prices` lets you say what a sale really returns: the game charges a fee on the profit half of a sale and we do not hold your purchase price, so the default is the current price. `window.source` says whether the Gameweek is the game's own calendar or our ISO-week approximation of one. The plan runs ONLY while the official market is OPEN, which is a Gameday whose deadline is still ahead. Between two seasons the collector still freezes the board the game closed the last one with, and that board names players who have retired since, so this endpoint answers 409 with the sentence to show the owner rather than pricing anything on it. GET /v1/fantasy/nba/me carries the same state on `salary_cap.state`. Appends an immutable snapshot and changes nothing else. It never signs in to the NBA game and never makes a transfer for you. 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

- `prefer` string, nullable: Send `respond-async` to get 202 and a job id at once instead of waiting, then read the result at /v1/fantasy/jobs/{job_id}.
- `authorization` string, nullable

## Request body

- NBAFantasyTransfersRequest
  - `season` string, nullable
  - `bank` number: Millions in the bank on the official game, copied from the game and never guessed.
  - `max_incoming` integer, nullable: Moves you are willing to make. Omitted compares them all.
  - `free_transfers` integer: Free transfers left in this Gameweek. The game gives two and they do not carry over; each extra move costs 100 points.
  - `locked` string[]: Players to keep.
  - `sold` string[]: Players already sold.
  - `sell_prices` object: What a sale actually returns for a player, in millions, when the owner knows better than the current price. The game charges a fee on the profit half of a sale and we do not hold anybody's purchase price, so the default is the current price.

## Response `200`

Successful Response

- NBAFantasyTransfersResponse
  - `sport` 'nba'
  - `mode` 'transfers'
  - `snapshot_id` integer, required
  - `season` string, required
  - `preset` string, required
  - `policy_version` string, nullable
  - `champion` string, nullable
  - `value_basis` 'fielded_five': What every total on this plan measures: the five the game would field each Gameday, never a sum of the ten.
  - `search` 'exact' | 'certified' | 'truncated': 'exact' means every legal squad your bank can reach was compared, one program per number of moves, maximising the fielded value itself, and it is what a transfer plan always answers. 'certified' means the search stopped inside its optimality tolerance and `search_gap` says how close to the best plan there is it was proved to be. 'truncated' means the search ran out of time and the plan is the best found so far, not the best there is.
  - `search_gap` number: How close to the best plan there is this one was PROVED to be, as a fraction. Zero on an exact search, which is every transfer plan.
  - `search_gap_tolerance` number: The optimality gap the search was allowed to stop at. Zero means it was not allowed to stop before it had the best there is.
  - `window_days` integer: Gamedays of the window the plan was decided over.
  - `value_wording` string, nullable
  - `court_source` 'official_market'
  - `board_digest` string, required
  - `roster_revision` integer, required
  - `market` NBAFantasyMarketReference, required: Which frozen snapshot of the official market a plan was priced from.
    - `snapshot_id` integer, required
    - `revision` integer, required
    - `period_kind` 'gameday' | 'calendar_day', required
    - `period_key` string, required
    - `source_observed_at` string, date-time, nullable
    - `collected_at` string, date-time, nullable
    - `deadline_at` string, date-time, nullable: The official Gameday deadline this market was frozen before.
    - `player_count` integer, required
    - `priced_players` integer, required: How many priced players we could place against our own player identity. The rest are on the market and not in this plan.
    - `duplicate_identities` integer
  - `window` NBAFantasyGameweekWindow, required: The Gameweek a transfer plan was made for, and how we know it.
    - `source` 'official' | 'iso_week_approximation', nullable: 'official' is the game's own Gameweek calendar. 'iso_week_approximation' is the ISO week of the slate day and is NOT an official Gameweek: say so wherever the window is shown.
    - `gameweek` integer, nullable
    - `label` string, nullable
    - `start` string, nullable
    - `end` string, nullable
    - `today` string, nullable
    - `days_counted` string[]: The days inside the window our published calendar can see.
    - `players_with_games` integer: Priced players with at least one game left in the window. Zero means there is nothing left to plan for in this Gameweek, which is a state and not a failure.
  - `free_transfers` integer, required
  - `extra_transfer_point_cost` integer, required
  - `transfer_rules_source` string, required
  - `sale_value_basis` 'current_price' | 'owner_override', required
  - `sale_overrides` string[]
  - `max_incoming` integer, required
  - `bank_before` number, required
  - `squad_value` number, required
  - `purchasing_power` number, required
  - `keep` NBAFantasyTransferOption, required
    - `moves` integer, required
    - `paid_transfers` integer, required
    - `transfer_point_cost` integer, required: Official points this plan costs beyond the free transfers of the Gameweek. The allowance and the price of an extra move are on the official rules page, not in the market payload.
    - `expected_points` number, required: What this squad is expected to score: the best legal five it fields each Gameday of the window, summed over the window. It is the number every other line on this plan is decided on.
    - `fielded_points` number, required: The same number, named for what it measures.
    - `proxy_points` number, required: The old linear ranking, which counts every game of all ten players. It is kept beside the fielded total for provenance and decides nothing.
    - `net_expected_points` number, required: Fielded points after the paid-transfer cost.
    - `gain_vs_keep` number, required: Net expected points against keeping the squad.
    - `squad_value` number, required
    - `bank_after` number, required
    - `incoming` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `outgoing` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `squad` NBAFantasySquadRow[], required
      - `player_name` string, required
      - `court` 'BC' | 'FC', required
      - `team_code` string, required
      - `price` number, required
      - `expected_points` number, required
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
  - `options` NBAFantasyTransferOption[]
    - `moves` integer, required
    - `paid_transfers` integer, required
    - `transfer_point_cost` integer, required: Official points this plan costs beyond the free transfers of the Gameweek. The allowance and the price of an extra move are on the official rules page, not in the market payload.
    - `expected_points` number, required: What this squad is expected to score: the best legal five it fields each Gameday of the window, summed over the window. It is the number every other line on this plan is decided on.
    - `fielded_points` number, required: The same number, named for what it measures.
    - `proxy_points` number, required: The old linear ranking, which counts every game of all ten players. It is kept beside the fielded total for provenance and decides nothing.
    - `net_expected_points` number, required: Fielded points after the paid-transfer cost.
    - `gain_vs_keep` number, required: Net expected points against keeping the squad.
    - `squad_value` number, required
    - `bank_after` number, required
    - `incoming` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `outgoing` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `squad` NBAFantasySquadRow[], required
      - `player_name` string, required
      - `court` 'BC' | 'FC', required
      - `team_code` string, required
      - `price` number, required
      - `expected_points` number, required
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
  - `alternatives` NBAFantasyTransferOption[]
    - `moves` integer, required
    - `paid_transfers` integer, required
    - `transfer_point_cost` integer, required: Official points this plan costs beyond the free transfers of the Gameweek. The allowance and the price of an extra move are on the official rules page, not in the market payload.
    - `expected_points` number, required: What this squad is expected to score: the best legal five it fields each Gameday of the window, summed over the window. It is the number every other line on this plan is decided on.
    - `fielded_points` number, required: The same number, named for what it measures.
    - `proxy_points` number, required: The old linear ranking, which counts every game of all ten players. It is kept beside the fielded total for provenance and decides nothing.
    - `net_expected_points` number, required: Fielded points after the paid-transfer cost.
    - `gain_vs_keep` number, required: Net expected points against keeping the squad.
    - `squad_value` number, required
    - `bank_after` number, required
    - `incoming` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `outgoing` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `squad` NBAFantasySquadRow[], required
      - `player_name` string, required
      - `court` 'BC' | 'FC', required
      - `team_code` string, required
      - `price` number, required
      - `expected_points` number, required
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
  - `recommended_moves` integer, required
  - `recommended` NBAFantasyTransferOption, required
    - `moves` integer, required
    - `paid_transfers` integer, required
    - `transfer_point_cost` integer, required: Official points this plan costs beyond the free transfers of the Gameweek. The allowance and the price of an extra move are on the official rules page, not in the market payload.
    - `expected_points` number, required: What this squad is expected to score: the best legal five it fields each Gameday of the window, summed over the window. It is the number every other line on this plan is decided on.
    - `fielded_points` number, required: The same number, named for what it measures.
    - `proxy_points` number, required: The old linear ranking, which counts every game of all ten players. It is kept beside the fielded total for provenance and decides nothing.
    - `net_expected_points` number, required: Fielded points after the paid-transfer cost.
    - `gain_vs_keep` number, required: Net expected points against keeping the squad.
    - `squad_value` number, required
    - `bank_after` number, required
    - `incoming` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `outgoing` NBAFantasyTransferMove[], required
      - `player_name` string, required
      - `team_code` string, required
      - `court` 'BC' | 'FC', required
      - `price` number, required: Frozen market price in millions.
      - `sale_value` number, required: What selling him returns: his current price, or the price the owner entered for him.
      - `expected_points` number, required: Expected Gameweek points on the Predixsport weekly rule, which is built from season performance, recent form and the calendar. Zero when the rule cannot value the player.
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
      - `reason` string, required
    - `squad` NBAFantasySquadRow[], required
      - `player_name` string, required
      - `court` 'BC' | 'FC', required
      - `team_code` string, required
      - `price` number, required
      - `expected_points` number, required
      - `games_left` integer, required
      - `status` 'rule_valued' | 'no_form_record' | 'no_games_left' | 'not_transactable', required
  - `no_change` boolean, required
  - `counts` object

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