# Players Implemented State ## Surface - `/admin/players` renders inside Ballbox. - `/api/players` now reads Ballbox Postgres instead of returning hardcoded stub data. - `/admin/players` now exposes Ballbox-local CRUD for players plus add/remove membership operations. ## Model - Ballbox persists `Player` and `Membership` in Prisma/Postgres. - Memberships belong to both `Player` and `Club`. - Cross-club memberships are supported through multiple membership rows per player. ## API - Players route handlers and `/admin/players` page now call `lib/players-backend.ts` directly (plus `lib/network-backend-clubs.ts` for club list hydration) instead of importing player access via `lib/ballbox-store.ts`. - `/api/players` - `/api/admin/players` - `/api/admin/players/[playerId]` - `/api/admin/players/[playerId]/memberships` - `/api/admin/players/memberships/[membershipId]` - Players API contract is defined from `Zod` schemas in `lib/contracts/players.ts`. - Current response is read-only and returns player identity plus membership rollups. - Admin player routes now support CRUD for `Player` plus add/remove membership operations. ## Current Gaps - No player activity history or sports participation contracts yet.