Poker Panel Developer API

Read-only JSON API for venues running Poker Panel: real-time table events over WebSocket, player stats and profiles, full hand histories, webhooks. One key per card room — works the same for a single room or a network.

v1 · live
the whole API as one prompt-ready doc · agents.txt · openapi.json

Quickstart

curl https://pokerpanel.app/v1        # public discovery — try it now

curl -H "Authorization: Bearer $POKERPANEL_API_KEY" \
     https://pokerpanel.app/v1/players

Base URL https://pokerpanel.app/v1 · REST auth Authorization: Bearer · WebSocket auth ?key= · CORS on everything · 240 req/min + 5 sockets per key.

Endpoints

EndpointReturns
GET /v1 · /v1/keyDiscovery · which venue this key belongs to
GET /v1/venueVenue, live flag, current game & stakes
GET /v1/live/stateTable now: seats, stacks, board, pot, action
WS /v1/live/events?key=…Real-time events (below)
GET /v1/players · /v1/players/{id}Roster · profile + lifetime VPIP, PFR, 3-bet, AF, WTSD, W$SD, BB/100
GET /v1/leaderboard?period=YYYY-MMMonthly or all-time (omit period)
GET /v1/sessions · /v1/sessions/{uid}Nights of poker
GET /v1/hands?page=N · /v1/hands/{id}Hand summaries · full action-by-action replay
GET/POST /v1/webhooks · DELETE /v1/webhooks/{id}HTTPS callbacks (hand.finished), HMAC-signed

Historical endpoints serve 24/7 — even when the venue's Mac is off. player_id is a permanent UUID (survives renames and merges — safe to cache). v1 only changes additively: ignore unknown fields and event kinds and your integration keeps working.

The event stream

On connect: one state frame, then events. Kinds: start_hand · player_action · deal_street · street_advance · end_hand · payout_applied. Ordered by seq; the next state frame heals any drop.

{"type":"event","seq":4182,"ts":1786500000,"kind":"player_action",
 "payload":{"hand_number":214,"seat_id":3,"action_type":"raise","amount":1200,"street":"turn"}}

Integrity rules

  • No live hole cards, ever — enforced by a server-side whitelist, not a setting.
  • Hand histories carry shown-at-showdown cards only; mucked hands have no hole_cards field.
  • Money display is venue policy: big blinds (default), dollars, or hidden.
  • Venues control the roster — which players appear and under what name.
  • Real hands only; test and simulated deals never enter the API.

Networks of card rooms

The API is per-venue by design: one key per room, identical endpoints at every room. A network app is a loop over its keys — GET /v1/key tells you which room a key belongs to, and each room's operator can issue or revoke your key from their own rig, instantly. Aggregate leaderboards, cross-room player apps, and network dashboards are all client-side joins on player_id + venue.

Get a key

Ask the card room — venues on the Card Room plan issue read-only keys directly from Poker Panel, no middleman. Building something bigger, or want a sandbox venue? Email with what you're building.

[email protected]