# Getting Started A narrative walkthrough of the minimum viable integration path. Use this guide to go from zero to a completed game night session using the Jackbox Game Picker API. **Prerequisites:** API running locally (`http://localhost:5000`), admin key set via `ADMIN_KEY` environment variable. --- ## 1. Health Check Verify the API is running before anything else. The health endpoint requires no authentication. **Why:** Quick sanity check. If this fails, nothing else will work. ```bash curl http://localhost:5000/health ``` **Sample response (200 OK):** ```json { "status": "ok", "message": "Jackbox Game Picker API is running" } ``` --- ## 2. Authenticate Exchange your admin key for a JWT. You'll use this token for all write operations (creating sessions, adding games, closing sessions). **Why:** Creating sessions, adding games to them, and closing sessions require authentication. The picker and game listings are public, but session management is not. See [Auth endpoints](../endpoints/auth.md) for full details. ```bash TOKEN=$(curl -s -X POST http://localhost:5000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"key": "your-admin-key"}' | jq -r '.token') ``` Or capture the full response: ```bash curl -X POST http://localhost:5000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"key": "your-admin-key"}' ``` **Sample response (200 OK):** ```json { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYWRtaW4iLCJ0aW1lc3RhbXAiOjE3MTAwMDAwMDAwLCJpYXQiOjE3MTAwMDAwMDB9.abc123", "message": "Authentication successful", "expiresIn": "24h" } ``` Store `token` in `$TOKEN` for the remaining steps. Tokens expire after 24 hours. --- ## 3. Browse Games List available games. Use query parameters to narrow the catalog—for example, `playerCount` filters to games that support that many players. **Why:** Know what's in the catalog before you pick. Filtering by player count ensures you only see games you can actually play. See [Games endpoints](../endpoints/games.md) for all filters. ```bash curl "http://localhost:5000/api/games?playerCount=6" ``` **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": 0, "popularity_score": 0, "enabled": 1, "favor_bias": 0, "created_at": "2024-01-15T12:00:00.000Z" }, { "id": 2, "pack_name": "Jackbox Party Pack 7", "title": "The Devils and the Details", "min_players": 3, "max_players": 7, "length_minutes": 25, "has_audience": 1, "family_friendly": 0, "game_type": "Strategy", "secondary_type": null, "play_count": 0, "popularity_score": 0, "enabled": 1, "favor_bias": 0, "created_at": "2024-01-15T12:00:00.000Z" } ] ``` --- ## 4. Pick a Game Get a weighted random game based on your filters. The picker considers favor/disfavor bias and can avoid recently played games when a session is provided. **Why:** Instead of manually choosing, let the API pick a game that fits your player count, length, and other preferences. Use the same filters you used to browse. See [Picker endpoint](../endpoints/picker.md) for all options. ```bash curl -X POST http://localhost:5000/api/pick \ -H "Content-Type: application/json" \ -d '{"playerCount": 6}' ``` **Sample response (200 OK):** ```json { "game": { "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": 0, "popularity_score": 0, "enabled": 1, "favor_bias": 0, "created_at": "2024-01-15T12:00:00.000Z" }, "poolSize": 12, "totalEnabled": 17 } ``` Save the `game.id` (e.g. `1`) — you'll use it when adding the game to the session. --- ## 5. Start a Session Create a new gaming session. Only one session can be active at a time. Use notes to label the night (e.g., "Friday game night"). **Why:** Sessions track which games you played, when, and support voting and room monitoring. Starting a session marks the beginning of your game night. See [Sessions endpoints](../endpoints/sessions.md) for full details. ```bash curl -X POST http://localhost:5000/api/sessions \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"notes": "Friday game night"}' ``` **Sample response (201 Created):** ```json { "id": 5, "notes": "Friday game night", "is_active": 1, "created_at": "2026-03-15T19:00:00.000Z", "closed_at": null } ``` Save the `id` (e.g. `5`) — you'll use it to add games and close the session. --- ## 6. Add the Picked Game Add the game you picked (step 4) to the session you created (step 5). You can optionally pass a room code once the game is running. **Why:** Adding a game to the session records that you played it, increments play counts, and enables voting and room monitoring. Use `game_id` from the pick response. ```bash curl -X POST "http://localhost:5000/api/sessions/5/games" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"game_id": 1, "room_code": "ABCD"}' ``` Replace `5` with your session ID and `1` with the `game.id` from the pick response. **Sample response (201 Created):** ```json { "id": 14, "session_id": 5, "game_id": 1, "manually_added": 0, "status": "playing", "room_code": "ABCD", "played_at": "2026-03-15T20:30:00.000Z", "pack_name": "Jackbox Party Pack 7", "title": "Quiplash 3", "game_type": "Writing", "min_players": 3, "max_players": 8 } ``` --- ## 7. Close the Session When the game night is over, close the session. Any games still marked `playing` are automatically marked `played`. **Why:** Closing the session finalizes it, frees the "active session" slot for the next night, and triggers any end-of-session webhooks or WebSocket events. ```bash curl -X POST "http://localhost:5000/api/sessions/5/close" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"notes": "Great session!"}' ``` Replace `5` with your session ID. **Sample response (200 OK):** ```json { "id": 5, "notes": "Great session!", "is_active": 0, "created_at": "2026-03-15T19:00:00.000Z", "closed_at": "2026-03-15T23:30:00.000Z", "games_played": 1 } ``` --- ## Quick Reference | Step | Endpoint | Auth | |------|----------|------| | 1 | `GET /health` | No | | 2 | `POST /api/auth/login` | No | | 3 | `GET /api/games?playerCount=6` | No | | 4 | `POST /api/pick` | No | | 5 | `POST /api/sessions` | Bearer | | 6 | `POST /api/sessions/{id}/games` | Bearer | | 7 | `POST /api/sessions/{id}/close` | Bearer | --- ## Full Copy-Paste Flow ```bash # 1. Health check curl http://localhost:5000/health # 2. Get token (replace with your actual admin key) TOKEN=$(curl -s -X POST http://localhost:5000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"key": "your-admin-key"}' | jq -r '.token') # 3. Browse games for 6 players curl "http://localhost:5000/api/games?playerCount=6" # 4. Pick a game for 6 players PICK=$(curl -s -X POST http://localhost:5000/api/pick \ -H "Content-Type: application/json" \ -d '{"playerCount": 6}') GAME_ID=$(echo $PICK | jq -r '.game.id') # 5. Start session SESSION=$(curl -s -X POST http://localhost:5000/api/sessions \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"notes": "Friday game night"}') SESSION_ID=$(echo $SESSION | jq -r '.id') # 6. Add picked game to session curl -X POST "http://localhost:5000/api/sessions/$SESSION_ID/games" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d "{\"game_id\": $GAME_ID, \"room_code\": \"ABCD\"}" # 7. Close session when done curl -X POST "http://localhost:5000/api/sessions/$SESSION_ID/close" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"notes": "Great session!"}' ``` This assumes `jq` is installed for JSON parsing. Without it, extract IDs manually from the JSON responses.