File contract: teams/rosters.json
teams/rosters.json is a research snapshot of real named players. It complements teams/teams.canonical.json, which covers branding and aliases, not players.
Join the two files on slug. Every roster key must already exist in the canonical registry.
Schema
Top-level shape:schemaVersion— currently1.0.0note— human-readable coverage caveatsrosters.<slug>— one club
asOf— season the snapshot represents (for example2025-26)league— display league nameplayers[]—{ name, jersey, position, note? }sources[]— URLs used to compile that club
G, C, LW, RW, D. When a source only publishes a broad Forward grouping, the row defaults to C and sets note.
Coverage
This is starters plus bench, not a full organizational depth chart. Typical size is 15–22 players. Current slugs:hc-sierre,hc-bolzano,hc-milano,hockey-club-lugano,sc-bernbarrie-colts,niagara-icedogswisconsin-badgers,michigan-wolverines,boston-college-eagles,maine-black-bearschicago-steel
Runtime consumption
d-sports-api exposes the live roster through public GET /api/teams/{id}/roster. That route reads Player rows in Postgres (isActive: true) and returns { players: [{ id, name, jersey, position, role, duty, photo?, availability? }] }. availability is omitted when the player is available.
Treat leagues/teams/rosters.json as the editorial source. Treat the API as runtime truth after sync or seed.
Adding a roster
- Confirm the slug exists in
teams/teams.canonical.json. - Research the official club site plus at least one independent source.
- Add
teams/rosters.jsonkeyed by that slug. - Flag position ambiguity with
noteinstead of guessing silently.
