Files
jackboxpartypack-gamepicker/docs/api/guides/game-status-by-session.md

5.3 KiB

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 for all available filters (playerCount, drawing, length, familyFriendly, pack).

curl "http://localhost:5000/api/games?enabled=true"

Sample response (200 OK):

[
  {
    "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 for full details on session game fields.

curl "http://localhost:5000/api/sessions/5/games"

Sample response (200 OK):

[
  {
    "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.

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):

{
  "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