Appearance
Custom rosters
You do not have to start a league from the built-in teams. You can start from a roster file. A roster file sets your own teams, divisions, colors and players, so you can run a specific group of players, rebuild a past season, or build a fictional universe of your own. This page shows how to load a file someone made, and how to build your own.
Load a roster file
If someone has shared a roster file with you, you are about 30 seconds from tip-off.
- Open My leagues. Select Start a league, or + New league if you already have one.
- Give your league a name in League name.
- Paste the public
https://link to the JSON file into Community roster URL (optional). - Click anywhere outside the box. The game checks the file at once. A green message shows the team count and the name of the file, for example "30 teams · My Universe 2026". A red list shows what is wrong.
- Pick your pace under Who moves the league, then select Create league.
Things to know:
- The file is locked at creation. You cannot swap the roster file after the league exists. Check that you have the right one first.
- A
ftba-rosters-v1file carries no skill numbers. The game builds every player's ratings from who the player is, so the league plays on the same scale as a normal one. Aftba-rosters-v2file can carry aratingsblock for each player, and the game uses those numbers exactly as written. - The Community roster URL (optional) box is on the create screen of every league.
- A
ftba-rosters-v2file can also carry a salary cap and contracts. Its league opens on the file's cap, tax line and minimum, with each player's salary and years left from the file. A file built on the 2026-27 NBA numbers uses a $164,961,000 cap, a $200,428,000 tax line and a $2,474,000 minimum. A player's salary stops at his own max for his years of service. Players with no listed salary are priced by the game, up to the mid-level exception (9% of the cap). Payrolls are not trimmed, so some clubs open over the tax line and owe tax from the first season. - A file with its own cap cannot be combined with the hard cap. The game refuses to create that league.
Build your own file
A roster file is plain JSON. The game accepts two formats, ftba-rosters-v1 and ftba-rosters-v2. The examples below use v1, and the v2 differences have their own section after them. There is no spreadsheet uploader. You, or a script, write the JSON and host it at a public link. A full league has 30 teams, so most people use a script.
Each team sets its own name, abbreviation, conference, division and colors. The basic shape is below.
json
{
"format": "ftba-rosters-v1",
"season_label": "My Universe 2026",
"teams": [
{
"name": "Harbor Gulls",
"abbrev": "HBG",
"conference": "East",
"division": "Atlantic",
"colors": { "primary": "#1c3f94", "secondary": "#c8102e" },
"active": [ /* exactly 15 players */ ],
"two_way": [ /* exactly 3 players */ ]
}
/* ...one block per team, all 30... */
],
"free_agents": [ /* optional list of players */ ]
}The rules the checker enforces
formatmust be exactly"ftba-rosters-v1"or"ftba-rosters-v2".- The file needs exactly 30 teams.
- The
conferenceanddivisionlabels must form exactly 2 conferences, each with 3 divisions, and each division must hold exactly 5 teams. The conference labels are"East"and"West". The East divisions areAtlantic,CentralandSoutheast. The West divisions areNorthwest,PacificandSouthwest. The schedule and the standings need this shape. - Every team needs a unique
abbrevof 4 characters or fewer, and anameof 64 characters or fewer. - Every team needs exactly 15
activeplayers and exactly 3two_wayplayers. - Each active roster needs at least 1 center (
C) and at least 1 point guard (PG). This is a hard rule, because the game engine cannot run a rotation without them. colorsis optional:{ "primary": "#rrggbb", "secondary": "#rrggbb" }. Use 6-digit hex. The secondary color is optional. If you skipcolors, the game makes a color from the team name.free_agentsis optional and holds at most 200 players. If you skip it, free agency starts thin.
Team names are yours. Pick whatever fits your universe.
Define a player
There are two ways to put a player on a roster.
Point to a player in the game's history. Give the player's NBA player id, and optionally an age. The game reads the player's real career to set his ratings.
json
{ "bbref_id": "2544", "age": 41 }The key is bbref_id, but the value is the NBA player id: the number at the end of the player's nba.com/stats link. LeBron James is at nba.com/stats/player/2544, so his id is "2544". A Basketball-Reference slug such as jamesle01 matches nobody. If you leave off age, the game uses his real age.
The game takes the position of a referenced player from its own data. A position key in your file is ignored. If a referenced player shows up at the wrong position, report it with Send feedback. To force a position, define the player inline.
Or define the player inline. Use this for rookies, prospects and players you invent.
json
{
"name": "Marcus Delaney",
"position": "PG",
"birth_year": 2001,
"debut_year": 2024
}An inline player needs name, position, birth_year and debut_year. position is one of PG, SG, SF, PF or C. age is optional in v1. If you leave it off, the game uses the season year minus birth_year. In v2, age is required.
How player ability works
A v1 file holds no skill numbers. For a referenced player, the game derives ratings from his real career. For an inline player, the game draws ratings from the templates it uses for its own fictional draft class. You shape a player by who he is: position, age and career. A v2 file can carry the numbers instead.
What two-way means in a file
The two_way list holds 3 players per team. When the league is created, the game signs each of those players to a two-way deal with the club the file lists him under. This holds on every new league, because new leagues use two-way contracts. The 15 active players are the roster. The 3 two-way players fill that club's two-way slots.
Format v2
Use ftba-rosters-v2 when you want to set exact ratings. Everything above still holds, with these changes:
- The key is
player_idinstead ofbbref_id. The value is the same NBA player id. A file that still saysbbref_idis refused. ageis required on every player.ratingsis optional. When a player has it, the game seeds him with exactly those numbers, and he is the same player in every league. A player without it is rated as in v1. The checker names the player and the field if a number is missing or out of range.draftis optional, for example{ "year": 2026, "round": 1, "pick": 2 }.- The same
player_idcannot appear twice in one file.
A minimal v2 player:
json
{ "player_id": "2544", "age": 41 }Host and test your file
- The file must sit at a public
https://link. Plain HTTP is refused. The link needs no login. - Keep the file under 5 MB. The host must answer within 10 seconds.
- Redirects are refused, so point the link straight at the file. A raw GitHub Gist link, or any static JSON host, works.
- The checker reports all your errors at once. Paste your draft link, read the red errors, fix the file, host it again, and click out of the box again until the green message shows.
If you want help with a file, the Community roster URL (optional) box has an Ask on r/ftgsports link.