Key corrections based on testing with fresh room SCWX: - connections count includes ALL ever-joined players, not just active ones (slots persist for reconnection, count never decreases) - here field also includes disconnected players (slot reservation model) - client/connected and client/disconnected confirmed as NOT delivered to player connections after extensive testing - Jackbox has no concept of "leaving" — player disconnect is invisible to the API - Added reconnection URL format (secret + id query params) - Added error code 2027 (REST/WebSocket state divergence) - Added ws-lifecycle-test.js for systematic protocol testing Made-with: Cursor
Jackbox Player Count Fetcher
Tools to retrieve the actual player count from a Jackbox game room in real-time.
Available Implementations
1. Go + chromedp (Recommended) 🚀
The most reliable method - automates joining through jackbox.tv to capture WebSocket data.
2. Browser HTML Interface 🌐
Quick visual tool for manual testing - no installation required.
3. Node.js Script (Limited)
Attempts direct WebSocket connection - may not work due to authentication requirements.
Features
- 🔍 Automatically joins jackbox.tv to capture WebSocket data
- 📊 Returns actual player count (not just max capacity)
- 👥 Lists all current players and their roles (host/player)
- 🎮 Shows game state, lobby state, and audience count
- 🎨 Pretty-printed output with colors
Installation
Go Version (Recommended)
cd scripts
go mod download
Prerequisites: Go 1.21+ and Chrome/Chromium browser installed
Browser Version (No Installation Required!)
Just open get-player-count.html in any web browser - no installation needed!
Node.js Version
cd scripts
npm install
Note: The Node.js version may not work reliably due to Jackbox WebSocket authentication requirements.
Usage
Go Version (Best) 🚀
# Navigate to scripts directory
cd scripts
# Run the script
go run get-player-count.go JYET
# Or build and run
go build -o get-player-count get-player-count.go
./get-player-count JYET
How it works:
- Opens jackbox.tv in headless Chrome
- Automatically enters room code and joins as "Observer"
- Captures WebSocket messages from the browser
- Extracts player count from
client/welcomemessage - Enriches with data from REST API
Browser Version 🌐
# Just open in browser
open get-player-count.html
- Open
get-player-count.htmlin your web browser - Enter a room code (e.g., "JYET")
- Click "Get Player Count"
- View results instantly
This version runs entirely in the browser and doesn't require any backend!
Node.js Version (Limited)
node get-jackbox-player-count.js JYET
Warning: May fail due to WebSocket authentication requirements. Use the Go version for reliable results.
JSON Output (for scripting)
JSON_OUTPUT=true node get-jackbox-player-count.js JYET
As a Module
const { getRoomInfo, getPlayerCount } = require('./get-jackbox-player-count');
async function example() {
const roomCode = 'JYET';
// Get room info
const roomInfo = await getRoomInfo(roomCode);
console.log('Game:', roomInfo.appTag);
// Get player count
const result = await getPlayerCount(roomCode, roomInfo);
console.log('Players:', result.playerCount);
console.log('Player list:', result.players);
}
example();
Output Example
Jackbox Player Count Fetcher
Room Code: JYET
Fetching room information...
✓ Room found: triviadeath
Max Players: 8
Connecting to WebSocket...
URL: wss://i-007fc4f534bce7898.play.jackboxgames.com/api/v2/rooms/JYET
✓ WebSocket connected
═══════════════════════════════════════════
Jackbox Room Status
═══════════════════════════════════════════
Room Code: JYET
Game: triviadeath
Game State: Lobby
Lobby State: CanStart
Locked: No
Full: No
Players: 3 / 8
Audience: 0
Current Players:
1. Host (host)
2. E (player)
3. F (player)
═══════════════════════════════════════════
How It Works
- REST API Call: First queries
https://ecast.jackboxgames.com/api/v2/rooms/{ROOM_CODE}to get room metadata - WebSocket Connection: Establishes a WebSocket connection to the game server
- Join as Observer: Sends a
client/connectmessage to join as an audience member - Parse Response: Listens for the
client/welcomemessage containing the full lobby state - Extract Player Count: Counts the players in the
hereobject
API Response Structure
The script returns an object with the following structure:
{
roomCode: "JYET",
appTag: "triviadeath",
playerCount: 3, // Actual player count
audienceCount: 0, // Number of audience members
maxPlayers: 8, // Maximum capacity
gameState: "Lobby", // Current game state
lobbyState: "CanStart", // Whether game can start
locked: false, // Whether lobby is locked
full: false, // Whether lobby is full
players: [ // List of all players
{ id: "1", role: "host", name: "Host" },
{ id: "2", role: "player", name: "E" },
{ id: "3", role: "player", name: "F" }
]
}
Integration with Your App
You can integrate this into your Jackbox game picker application:
// In your backend API
const { getRoomInfo, getPlayerCount } = require('./scripts/get-jackbox-player-count');
app.get('/api/room-status/:roomCode', async (req, res) => {
try {
const roomCode = req.params.roomCode.toUpperCase();
const roomInfo = await getRoomInfo(roomCode);
const playerData = await getPlayerCount(roomCode, roomInfo);
res.json(playerData);
} catch (error) {
res.status(404).json({ error: 'Room not found' });
}
});
Troubleshooting
"Room not found or invalid"
- Double-check the room code is correct
- Make sure the game is currently running (room codes expire after games end)
"Connection timeout"
- The game server might be unavailable
- Check your internet connection
- The room might have closed
WebSocket connection fails
- Ensure you have the
wspackage installed:npm install - Some networks/firewalls might block WebSocket connections
Dependencies
ws(^8.14.0) - WebSocket client for Node.js
License
MIT