# Game Status by Session How to build a complete view of all enabled games—with popularity data and whether each game has been played in the current session. No single endpoint returns all three pieces today; this guide shows how to combine two public endpoints and join the results client-side. --- ## 1. Fetch Enabled Games `GET /api/games?enabled=true` returns every enabled game in the catalog. Each row includes `popularity_score`, `upvotes`, `downvotes`, `play_count`, and `favor_bias`. **Why:** This gives you the full list of games that are available for play, along with their cumulative popularity data across all sessions. See [Games endpoints](../endpoints/games.md) for all available filters (`playerCount`, `drawing`, `length`, `familyFriendly`, `pack`). ```bash curl "http://localhost:5000/api/games?enabled=true" ``` **Sample response (200 OK):** ```json [ { "id": 1, "pack_name": "Jackbox Party Pack 7", "title": "Quiplash 3", "min_players": 3, "max_players": 8, "length_minutes": 15, "has_audience": 1, "family_friendly": 0, "game_type": "Writing", "secondary_type": null, "play_count": 4, "popularity_score": 7, "upvotes": 10, "downvotes": 3, "enabled": 1, "favor_bias": 0, "created_at": "2024-01-15T12:00:00.000Z" }, { "id": 5, "pack_name": "Jackbox Party Pack 9", "title": "Fibbage 4", "min_players": 2, "max_players": 8, "length_minutes": 15, "has_audience": 1, "family_friendly": 1, "game_type": "Trivia", "secondary_type": null, "play_count": 2, "popularity_score": 3, "upvotes": 5, "downvotes": 2, "enabled": 1, "favor_bias": 1, "created_at": "2024-01-15T12:00:00.000Z" } ] ``` --- ## 2. Fetch Session Games `GET /api/sessions/{id}/games` returns games that have been added to a specific session. Each row includes `status` (`playing`, `played`, or `skipped`), `played_at`, and joined popularity fields from the game catalog. **Why:** This tells you which games have already been played (or are currently playing) in the session, so you can mark them in the catalog. See [Sessions endpoints](../endpoints/sessions.md) for full details on session game fields. ```bash curl "http://localhost:5000/api/sessions/5/games" ``` **Sample response (200 OK):** ```json [ { "id": 14, "session_id": 5, "game_id": 1, "played_at": "2026-03-15T20:30:00.000Z", "manually_added": 0, "status": "played", "room_code": "LSBN", "player_count": 6, "player_count_check_status": "completed", "pack_name": "Jackbox Party Pack 7", "title": "Quiplash 3", "game_type": "Writing", "min_players": 3, "max_players": 8, "popularity_score": 7, "upvotes": 10, "downvotes": 3 } ] ``` Key fields for the join: | Field | Purpose | |-------|---------| | `game_id` | Matches `id` in the games catalog | | `status` | `playing`, `played`, or `skipped` | | `played_at` | When the game was added to the session | --- ## 3. Combine Client-Side Join the two responses by matching `game_id` (from session games) to `id` (from the catalog). This produces a single list of enabled games annotated with their session play status. ```javascript const gamesRes = await fetch('/api/games?enabled=true'); const games = await gamesRes.json(); const sessionGamesRes = await fetch('/api/sessions/5/games'); const sessionGames = await sessionGamesRes.json(); const sessionGameMap = new Map( sessionGames.map(sg => [sg.game_id, sg]) ); const combined = games.map(game => { const sessionEntry = sessionGameMap.get(game.id); return { ...game, playedInSession: !!sessionEntry, sessionStatus: sessionEntry?.status ?? null, sessionPlayedAt: sessionEntry?.played_at ?? null, }; }); ``` **Sample merged output (one entry):** ```json { "id": 1, "pack_name": "Jackbox Party Pack 7", "title": "Quiplash 3", "min_players": 3, "max_players": 8, "length_minutes": 15, "has_audience": 1, "family_friendly": 0, "game_type": "Writing", "play_count": 4, "popularity_score": 7, "upvotes": 10, "downvotes": 3, "enabled": 1, "favor_bias": 0, "playedInSession": true, "sessionStatus": "played", "sessionPlayedAt": "2026-03-15T20:30:00.000Z" } ``` Games that have not been played in the session will have `playedInSession: false`, `sessionStatus: null`, and `sessionPlayedAt: null`. --- ## Quick Reference | Data point | `GET /api/games` | `GET /api/sessions/{id}/games` | |------------|------------------|-------------------------------| | Enabled status | `enabled` field + `?enabled=true` filter | Not included | | Popularity score | `popularity_score`, `upvotes`, `downvotes` | `popularity_score`, `upvotes`, `downvotes` (joined) | | All-time play count | `play_count` | Not included | | Played in session | Not included | `status` field (`playing`/`played`/`skipped`) | | Auth required | No | No | --- ## Related Documentation - [Games endpoints](../endpoints/games.md) — full catalog CRUD, filters, favor bias - [Sessions endpoints](../endpoints/sessions.md) — session games, status updates, room codes - [Picker endpoint](../endpoints/picker.md) — weighted random selection with session exclusion - [Stats endpoint](../endpoints/stats.md) — `mostPlayedGames`, `topRatedGames` - [Voting & Popularity guide](voting-and-popularity.md) — how votes and popularity scores work