Skip to main content

Scope

The public games contract is the per-team catalog plus the published play routes and Game Center events. New daily mini-games (Pick’em, Trivia, air hockey, locker-singularity, and later registrations) use the Game Engine. Do not treat /api/v1/engage/games/* as a replacement for this catalog. Locker Singularity progress lives on /api/v1/engage/games/locker-singularity/ledger, not on the session verbs.

Published catalog

  • GET /api/games/catalog?teamId=... or ?teamSlug=... — public, no auth
Response shape: { daily: Game[], weekly: Game[] }. Each game entry carries id, key, title, description, icon, and badge. key is the stable slug the client maps to a playable route (for example daily-spin).

Catalog rules

  • The catalog is admin-managed and team-selected server-side.
  • Clients must render only the games returned and must not assume a fixed set.
  • Responses are cacheable (Cache-Control: public, max-age=60, stale-while-revalidate=300).
  • Unknown teams return 404. A missing teamId/teamSlug returns 400.
  • Native also fetches GET /api/v1/engage/games/catalog and joins the two lists. Engine rows can stay visible when this catalog omits them. See Game Engine client.

Published play routes

  • GET /api/games/daily-spin/config — public wheel layout
  • GET /api/games/daily-spin/state — authenticated progress
  • POST /api/games/daily-spin/spin — server-authoritative spin
  • POST /api/games/guess-player/session/start
  • POST /api/games/guess-player/session/guess
  • GET /api/games/live/active?teamId=...
  • GET /api/games/guess-player/players?q= — authenticated autocomplete
  • POST /api/games/guess-player/session/invalidate
  • GET /api/games/live/by-code/{code}, POST /api/games/live/join
  • GET /api/games/live/{sessionId}/leaderboard, POST /api/games/live/{sessionId}/score
  • POST /api/games/live/start, POST /api/games/live/{sessionId}/end — team manager
  • GET /api/games/pick-em/players — leftover roster helper. Engine Pick’em uses /api/v1/engage/games/daily-pickem/* instead.
Do not call deprecated POST /api/games/daily-spin/reward. New clients use POST /api/games/daily-spin/spin. Render playable games from the catalog first. Overlay the engine catalog for Pick’em and Trivia.

Game Center events

These public and authenticated Game Center routes are in OpenAPI:
  • GET /api/events/schedule?teamId= — repeatable teamId for the locker-room hero strip
  • GET /api/events/realtime — public Broadcast discovery (URL, anon key, channel template events:{gameId}). Polling and ETag remain the hydrate and reconnect path.
  • GET /api/events/{gameId} — event detail, including a realtime pointer (no anon key)
  • GET /api/events/{gameId}/stats, /plays, /lineup
  • GET /api/events/{gameId}/player-stats — per-player box score with server-driven columns
  • GET /api/events/{gameId}/top-performer — home/away statLine (sport-formatted). Each side includes playerKey (Game Center identity) and playerId (linked roster id, or null).
  • GET /api/events/{gameId}/win-probability{ home, away } always sums to 100
  • GET/POST /api/events/{gameId}/chat, authenticated POST/DELETE /chat/mute, PUT /chat/read, and POST /chat/{messageId}/react
  • GET/POST /api/events/{gameId}/presence
  • GET/POST /api/events/{gameId}/ratings — submit may award Club Rep. Do not call /api/v1/engage/rep/earn for this.
  • POST/DELETE /api/events/{gameId}/live-activity — iOS Live Activity registration. Requires UserSettings.liveScoreUpdates consent.
In-app inbox types include GAME_ALERT and RATING on GET /api/notifications.

Deep-dive documentation