LobbyScanner API (1.0.0)

Download OpenAPI specification:

API for accessing poker providers, clubs, and tables data

Account

Request Auth0 password-change ticket URL

Returns a one-time URL to change password; user is redirected back to appUrl/#/settings

Authorizations:
bearerAuth
Request Body schema: application/json
required
appUrl
required
string

App origin (no trailing slash), e.g. https://app.lobbyscanner.com

Responses

Request samples

Content type
application/json
{
  • "appUrl": "string"
}

Response samples

Content type
application/json
{
  • "url": "string"
}

Account-deletion eligibility + current status

Returns whether the account can be deleted (agent blockers, dependent counts, paid grace) and any scheduled deletion.

Authorizations:
bearerAuth

Responses

Delete the authenticated user's account

Paid users: subscription is canceled at period end and the account is scheduled for deletion then. Free users: deleted immediately. Agents must resolve blockers first and choose dependentHandling (cancel_subs | delete_accounts) for their managed players / team members.

Authorizations:
bearerAuth
Request Body schema: application/json
dependentHandling
string
Enum: "cancel_subs" "delete_accounts"

Responses

Request samples

Content type
application/json
{
  • "dependentHandling": "cancel_subs"
}

Undo a scheduled account deletion

Cancels a scheduled (grace-period) deletion and re-enables the canceled subscription.

Authorizations:
bearerAuth

Responses

Admin Affiliates

List every agent with affiliate stats (admin)

Authorizations:
bearerAuth

Responses

Detail view for one agent (admin)

Authorizations:
bearerAuth
path Parameters
agentId
required
integer

Responses

Book an affiliate commission (admin). Level-1 bookings auto-cascade a Level-2 share to the recipient's upline; Level-2 bookings are stored as-is for manual corrections.

Authorizations:
bearerAuth
Request Body schema: application/json
required
level
required
integer
Enum: 1 2

1 = direct commission (will auto-cascade L2 to the upline). 2 = raw L2 entry, no cascade.

period
required
string
amountCents
required
integer
sourceAgentId
integer or null
referredUserId
string or null
sourceAmountCents
integer or null
note
string or null
cascadeL2
boolean
Default: true

When booking L1, set false to suppress the automatic Level-2 cascade.

Responses

Request samples

Content type
application/json
{
  • "level": 1,
  • "period": "2026-05",
  • "amountCents": 0,
  • "sourceAgentId": 0,
  • "referredUserId": "string",
  • "sourceAmountCents": 0,
  • "note": "string",
  • "cascadeL2": true
}

Delete an open (unpaid) affiliate earning (admin)

Authorizations:
bearerAuth
path Parameters
agentId
required
integer
earningId
required
integer

Responses

Mark all open earnings as paid and snapshot a payout (admin)

Authorizations:
bearerAuth
path Parameters
agentId
required
integer
Request Body schema: application/json
optional
note
string or null

Responses

Request samples

Content type
application/json
{
  • "note": "string"
}

List payout requests (admin)

query Parameters
status
string
Enum: "pending" "approved" "rejected" "cancelled"
reveal
integer

Payout request id to return with FULL (unmasked) bank/tax details. The list itself is always masked; revealing is a deliberate, per-request, logged action for the operator executing the transfer.

Responses

Approve a pending payout request — settles available earnings (admin)

Responses

Reject a pending payout request with a reason (admin)

Request Body schema: application/json
required
reason
required
string
adminNote
string or null

Responses

Request samples

Content type
application/json
{
  • "reason": "string",
  • "adminNote": "string"
}

Assign the MGC source admin's default club list to a target agent (MGC owner only)

Copies the MGC source admin's DEFAULT club list onto the target agent as a linked clone, then promotes that clone to the target agent's default. Future mutations on the source list are hard-mirrored to every clone (the target agent cannot edit the clone). Idempotent – calling again refreshes items without creating a duplicate.

Restricted to the caller whose email matches MGC_SOURCE_AGENT_EMAIL (defaults to nmmediationltd@gmail.com).

Authorizations:
bearerAuth
path Parameters
agentId
required
integer

Responses

Admin Bots

List bot providers and their capabilities (admin)

Authorizations:
bearerAuth

Responses

Proxy bandwidth accounting across the bot fleet (admin)

Per-provider residential-proxy byte usage, read from the .netmeter.json snapshots the bots write when their meter is enabled. Evomi bills one shared account for every bot, so this is the only per-provider breakdown that exists. complete is false whenever a provider has no usable or no recent snapshot, in which case the totals are a floor rather than a sum.

Authorizations:
bearerAuth

Responses

List all PM2 bot instances with status (admin)

Authorizations:
bearerAuth

Responses

Start a PM2 instance (admin)

Authorizations:
bearerAuth
path Parameters
name
required
string

Responses

Stop a PM2 instance (admin)

Restart a PM2 instance (admin)

Tail merged stdout/stderr logs for a PM2 instance (admin)

path Parameters
name
required
string
query Parameters
lines
integer
Default: 200

Read raw .env content for an instance (admin)

Overwrite an instance's .env (admin); optional restart afterwards

Read provider .env.example as a template (admin)

Create a new instance for a multi-instance provider (admin)

Delete an instance (PM2 delete + archive directory) (admin)

Start an interactive (VNC-streamed) browser login for an instance (admin)

Launches a headful browser on the bot host for the provider's sign-in flow (e.g. ClubGG/GGPass reCAPTCHA + e-mail 2FA) and returns a WebSocket URL the admin browser connects to (RFB-over-WS) plus the session id.

Poll the status of an interactive login session (admin)

Cancel + tear down an interactive login session (admin)

ClubGG join queue — counts, per-login room, rows (admin)

Authorizations:
bearerAuth

Responses

Run the join-queue pass now (admin)

Authorizations:
bearerAuth

Responses

Admin Broadcasts

List broadcast notifications with delivery status (admin)

Authorizations:
bearerAuth

Responses

Queue a broadcast notification (admin). `test:true` sends only to the review accounts (TEST_RECIPIENT_EMAILS + caller).

Authorizations:
bearerAuth

Responses

Admin System Notifications

List all system notifications (admin)

Authorizations:
bearerAuth

Responses

Create a system notification (admin)

Authorizations:
bearerAuth

Responses

Update a system notification (admin)

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Delete a system notification (admin)

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

System Notifications

Get active notifications the current user has not yet dismissed

Authorizations:
bearerAuth

Responses

Mark a system notification as read/dismissed

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Admin Security

Paginated security audit log (admin)

Authorizations:
bearerAuth
query Parameters
page
integer >= 1
limit
integer [ 1 .. 100 ]
eventType
string
userId
string

Responses

Per-user geo/IP violation statistics with country-jump analysis (admin)

Authorizations:
bearerAuth
query Parameters
days
integer [ 1 .. 365 ]

Responses

Users with active account_blocked state (admin)

Authorizations:
bearerAuth

Responses

Unblock Auth0 user and devices (admin)

Authorizations:
bearerAuth
path Parameters
userId
required
string

Responses

Active IP blacklist entries (admin)

Authorizations:
bearerAuth

Responses

Remove IP blacklist row (admin)

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Devices marked blocked (admin)

Authorizations:
bearerAuth

Responses

Unblock a device row (admin)

Authorizations:
bearerAuth
path Parameters
deviceId
required
integer

Responses

Admin

Unions we scan (clusters), warnings, and stats (admin)

query Parameters
summary
string

1 = counters only

Responses

Do we already scan this club or its union? (admin)

Responses

Every club row of our Club List, the BBPC sheet and the partner sheet, with a duplicate verdict (admin)

Responses

dismiss / undismiss / setUnion / merge / refreshNow (admin)

Responses

Agents

Get agent profile (Agent Pro)

Authorizations:
bearerAuth

Responses

Update agent display name / email

Authorizations:
bearerAuth
Request Body schema: application/json
displayName
string
email
string

Responses

Request samples

Content type
application/json
{
  • "displayName": "string",
  • "email": "string"
}

List agent club visibility config

Authorizations:
bearerAuth

Responses

Update single club config for agent

Authorizations:
bearerAuth
path Parameters
providerId
required
string
clubId
required
string
Request Body schema: application/json
customDisplayName
string
isVisible
boolean
sortOrder
integer

Responses

Request samples

Content type
application/json
{
  • "customDisplayName": "string",
  • "isVisible": true,
  • "sortOrder": 0
}

Bulk update club configs

Authorizations:
bearerAuth
Request Body schema: application/json
required
configs
required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "configs": [
    ]
}

List players linked to this agent (with resolved emails)

Authorizations:
bearerAuth

Responses

Create Auth0 player account under this agent (optional plan / payment)

Authorizations:
bearerAuth
Request Body schema: application/json
required
email
required
string
password
required
string
name
string
plan
string
Enum: "grinder" "high-stakes" "agent-pro"
paymentMethod
string
Enum: "balance" "card" "free"
compTerm
string
Enum: "1m" "3m" "6m" "unlimited"

How long a free (comped) subscription lasts, measured from now. Only valid with paymentMethod "free"; omitted means unlimited, the historic behaviour.

appUrl
string

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "password": "string",
  • "name": "string",
  • "plan": "grinder",
  • "paymentMethod": "balance",
  • "compTerm": "1m",
  • "appUrl": "string"
}

Agent dashboard stats

Authorizations:
bearerAuth

Responses

Validate an agent bonus code (public)

Request Body schema: application/json
required
code
required
string

Responses

Request samples

Content type
application/json
{
  • "code": "string"
}

Join an agent using a bonus code

Authorizations:
bearerAuth
Request Body schema: application/json
required
code
required
string

Responses

Request samples

Content type
application/json
{
  • "code": "string"
}

Agents the current user is linked to

Authorizations:
bearerAuth

Responses

Agent balance ledger

Authorizations:
bearerAuth
query Parameters
limit
integer
Default: 50
offset
integer
Default: 0

Responses

Referral earnings history and summary

Authorizations:
bearerAuth
query Parameters
period
string

Optional filter period key

Responses

Direct (L1) referrals plus aggregated L2 stats for the current agent

Authorizations:
bearerAuth

Responses

Payout history for the current agent

Authorizations:
bearerAuth

Responses

Remove agent-created player from agent roster

Always best-effort cancels any active Stripe subscription for the player first, then deletes the membership. If the Stripe cancel partially fails (orphaned customer/network), the player is still removed and a stripeWarning is returned so the agent can verify in the Stripe Dashboard.

Authorizations:
bearerAuth
path Parameters
playerUserId
required
string

URL-encoded Auth0 user id

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "stripeWarning": "string"
}

Cancel active subscription for an agent-created player without removing them

Cancels any active Stripe subscription for the player immediately. The player keeps their account and roster membership; only billing is ended. If the Stripe cancel partially fails (orphaned customer/network), a warning is returned so the agent can verify in Stripe.

Authorizations:
bearerAuth
path Parameters
playerUserId
required
string

URL-encoded Auth0 user id

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "warning": "string"
}

Set how long an existing free (comped) account keeps its plan

Changes the end date of an admin-granted free subscription to 1, 3 or 6 months from NOW, or to unlimited. Only free accounts have a comp term — a player paying through Stripe or Apple is rejected. Requires the same authorization as granting a free subscription in the first place.

The term is always measured from today, so re-picking one extends it; it never shortens retroactively. Shortening takes effect immediately.

Authorizations:
bearerAuth
path Parameters
playerUserId
required
string

URL-encoded Auth0 user id

Request Body schema: application/json
required
compTerm
required
string
Enum: "1m" "3m" "6m" "unlimited"

Responses

Request samples

Content type
application/json
{
  • "compTerm": "1m"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "compTerm": "string",
  • "compEndsAt": "string"
}

Manual balance credit for an agent (restricted admin emails)

Authorizations:
bearerAuth
path Parameters
id
required
integer

Agent numeric id

Request Body schema: application/json
required
amountCents
required
integer
description
string

Responses

Request samples

Content type
application/json
{
  • "amountCents": 0,
  • "description": "string"
}

Agent Deals

List agent deals (enriched)

Authorizations:
bearerAuth

Responses

Create a deal (club, list, or club pair)

Authorizations:
bearerAuth
Request Body schema: application/json
required
name
string
providerId
string
clubId
string
listId
integer
rakeStructure
string
dealPct
number

Rakeback as a fraction (0.5 = 50%)

rebatePct
number

Rebate as a fraction

clubName
string
isPublished
boolean
assignToAll
boolean
userIds
Array of strings

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "providerId": "string",
  • "clubId": "string",
  • "listId": 0,
  • "rakeStructure": "string",
  • "dealPct": 0,
  • "rebatePct": 0,
  • "clubName": "string",
  • "isPublished": true,
  • "assignToAll": true,
  • "userIds": [
    ]
}

Update deal by id

Authorizations:
bearerAuth
path Parameters
dealId
required
integer
Request Body schema: application/json
object

Responses

Request samples

Content type
application/json
{ }

Delete deal by numeric id

Authorizations:
bearerAuth
path Parameters
dealId
required
integer

Responses

Upsert deal for a club

Authorizations:
bearerAuth
path Parameters
providerId
required
string
clubId
required
string
Request Body schema: application/json
object

Responses

Request samples

Content type
application/json
{ }

Delete deal by provider and club id

Authorizations:
bearerAuth
path Parameters
providerId
required
string
clubId
required
string

Responses

Replace user assignments on a deal

Authorizations:
bearerAuth
path Parameters
dealId
required
integer
Request Body schema: application/json
required
userIds
required
Array of strings

Responses

Request samples

Content type
application/json
{
  • "userIds": [
    ]
}

Published deal for a club (player-facing)

path Parameters
agentId
required
integer
query Parameters
providerId
required
string
clubId
required
string
userId
string

Responses

Deals available to the current user

Authorizations:
bearerAuth

Responses

Agent Club Lists

All clubs available for agent list building

Authorizations:
bearerAuth

Responses

List agent club lists

Authorizations:
bearerAuth

Responses

Create a club list

Authorizations:
bearerAuth
Request Body schema: application/json
required
name
required
string
description
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string"
}

Update list metadata

Authorizations:
bearerAuth
path Parameters
listId
required
integer
Request Body schema: application/json
name
string
description
string
autoAddNewClubs
boolean

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "autoAddNewClubs": true
}

Delete a club list

Authorizations:
bearerAuth
path Parameters
listId
required
integer

Responses

Get (minting one if needed) this list's public share handle

Idempotent. Returns the list's existing publicSlug, or mints a unique one from the agent's display name so the Share button in the Club List works without a trip to Agent Tools.

Authorizations:
bearerAuth
path Parameters
listId
required
integer

Responses

Set list as agent default

Authorizations:
bearerAuth
path Parameters
listId
required
integer

Responses

Add clubs to a list

Authorizations:
bearerAuth
path Parameters
listId
required
integer
Request Body schema: application/json
required
clubs
required
Array of objects

Responses

Request samples

Content type
application/json
{
  • "clubs": [
    ]
}

Remove a club from a list

Authorizations:
bearerAuth
path Parameters
listId
required
integer
providerId
required
string
clubId
required
string

Responses

Update overrides for a club row in a list

Authorizations:
bearerAuth
path Parameters
listId
required
integer
providerId
required
string
clubId
required
string
Request Body schema: application/json
customDisplayName
string
customPlayerClubId
string
listVisible
boolean
publicVisible
boolean
sortOrder
integer
isPrivate
boolean

Manual (agent-added) items only. True keeps the club out of the public lobby once we scan it — visible only to this agent and their players. Turning it on is refused with 409 if we already track the club publicly.

Responses

Request samples

Content type
application/json
{
  • "customDisplayName": "string",
  • "customPlayerClubId": "string",
  • "listVisible": true,
  • "publicVisible": true,
  • "sortOrder": 0,
  • "isPrivate": true
}

Apply list changes or full sync to all assigned users

Authorizations:
bearerAuth
path Parameters
listId
required
integer
Request Body schema: application/json
required
mode
required
string
Enum: "changes" "sync"
added
Array of arrays
removed
Array of arrays

Responses

Request samples

Content type
application/json
{
  • "mode": "changes",
  • "added": [ ],
  • "removed": [ ]
}

Assign list to a player user

Authorizations:
bearerAuth
path Parameters
listId
required
integer
Request Body schema: application/json
required
userId
required
string

Responses

Request samples

Content type
application/json
{
  • "userId": "string"
}

Users assigned to this list

Authorizations:
bearerAuth
path Parameters
listId
required
integer

Responses

Get all user-to-list assignments for this agent

Authorizations:
bearerAuth

Responses

Club lists visible to the current user

Authorizations:
bearerAuth

Responses

Remove list assignment from a user

Authorizations:
bearerAuth
path Parameters
listId
required
integer
userId
required
string

Responses

Submit a new club / union / platform request (persisted + forwarded to admin via Telegram)

Authorizations:
bearerAuth
Request Body schema: application/json
required
listId
integer

Optional source club list

app
required
string

Platform / provider (may be one we don't scan yet)

clubName
required
string
unionName
string
clubId
required
string
playerClubId
string

The club id the agent hands to players

refId
string
region
string
currency
string
games
Array of strings
dealPct
number
rebatePct
number
stakesUrl
string
rakeStructure
string
rules
string
note
string

Responses

Request samples

Content type
application/json
{
  • "listId": 0,
  • "app": "string",
  • "clubName": "string",
  • "unionName": "string",
  • "clubId": "string",
  • "playerClubId": "string",
  • "refId": "string",
  • "region": "string",
  • "currency": "string",
  • "games": [
    ],
  • "dealPct": 0,
  • "rebatePct": 0,
  • "stakesUrl": "string",
  • "rakeStructure": "string",
  • "rules": "string",
  • "note": "string"
}

Club List

Enriched clubs for one of the viewer's followed lists

Authorizations:
bearerAuth
path Parameters
listId
required
integer

Responses

All clubs across the viewer's followed agents, deduped, with per-agent offers

Authorizations:
bearerAuth

Responses

Every agent this viewer follows who offers this club, with their own terms.

Powers the lobby's club-info panel. A player following two agents can be offered the same club by both on different rakeback, so this returns one entry per agent rather than resolving a winner — picking one for them is the Directory's job, not the lobby's.

Clubs

Get list of clubs

Retrieves a paginated list of all poker clubs with optional sorting and filtering

query Parameters
sortBy
string
Enum: "clubId" "clubName" "providerId"

Column name to sort by

sortOrder
string
Default: "asc"
Enum: "asc" "desc"

Sort order (ascending or descending)

q
string

Keyword to search for in club names or IDs

providerId
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Filter clubs by provider ID

page
integer >= 1
Default: 1

Page number (1-based)

limit
integer [ 1 .. 5000 ]
Default: 50

Number of items per page (max 5000)

debug
string

When set (e.g. 1, true, or empty), each club includes originalRecord (large). Omit or use false/0/off to exclude it and reduce payload size.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Upload or replace a club

Uploads or replaces a club in the database using INSERT ... ON DUPLICATE KEY UPDATE. Updates the provider's lastParsed timestamp.

Request Body schema: application/json
required
clubId
required
string

Unique identifier for the club (scoped to provider)

clubName
required
string

Name of the club

providerId
required
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Provider this club belongs to

originalRecord
object or null

Original JSON payload from the provider

Responses

Request samples

Content type
application/json
{
  • "clubId": "string",
  • "clubName": "string",
  • "providerId": "PokerBros",
  • "originalRecord": { }
}

Response samples

Content type
application/json
{
  • "clubId": "string",
  • "clubName": "string",
  • "providerId": "PokerBros",
  • "originalRecord": { }
}

Get clubs in sheet but not in system

Returns clubs that appear in the Google Sheet but are not in the app (sheet_clubs_missing). Same data as in the missing-clubs email.

Responses

Get clubs in system but not in Google Sheet

Returns clubs that exist in the database but do not appear in the Google Sheet (clubs_not_in_sheet). Reverse of /v1/clubs/missing.

Responses

List every union name in use

Distinct union names from club_display_name_override, for the Club Coverage union picker (admin).

Responses

Set or clear a club's union by hand (admin)

Writes a manual union override for the club. Manual overrides are never touched by the Google Sheet sync, so this is the way to fix a club the sheet doesn't list yet. An empty or null unionName removes the override, returning the club to Privat and to sheet control.

path Parameters
clubId
required
string
query Parameters
providerId
required
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"
Request Body schema: application/json
required
unionName
string or null

Responses

Request samples

Content type
application/json
{
  • "unionName": "string"
}

Delete a club

Deletes a club by ID and provider ID

path Parameters
clubId
required
string

Club ID to delete

query Parameters
providerId
required
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Provider ID of the club

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

Partner club coverage report (admin)

A partner's submitted club list, each row marked with whether we hold the club yet. Backs the admin Club Coverage → Partner Report panel so the operator can send the partner a "still missing" list. Reads the partner sheet's public CSV export.

Responses

Health

Check provider health status

Checks if the provider's lastParsed timestamp is within the stale window (30 minutes, or 90 for PokerBros)

path Parameters
providerId
required
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Provider ID to check

Responses

Response samples

Content type
application/json
{
  • "healthy": true
}

List provider servers with health status

Returns tracked bot servers (hostnames) with lastParsed and healthy flag. A server is healthy if lastParsed is within 30 minutes (90 for PokerBros). Optional query serverName filters to one host (exact match). When both providerId and serverName are set, the response also includes root-level healthy and lastParsed for that target (easy for monitors).

query Parameters
providerId
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Filter by provider (optional)

serverName
string

Exact hostname filter (optional). Combine with providerId to query one machine.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "healthy": true,
  • "lastParsed": "2019-08-24T14:15:22Z"
}

List provider accounts with health status

Returns tracked bot accounts with lastParsed and healthy flag. Same stale window as servers. When both providerId and accountName are set, the response also includes root-level healthy and lastParsed.

query Parameters
providerId
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Filter by provider (optional)

accountName
string

Exact account name filter (optional). Combine with providerId to query one account.

Responses

Notification Inbox

List the current user's in-app notifications (newest first, paginated)

Authorizations:
bearerAuth
query Parameters
limit
integer
before
integer

Keyset cursor — return rows with id < before

Responses

Count the current user's unread in-app notifications

Authorizations:
bearerAuth

Responses

Mark one in-app notification as read

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Mark all of the current user's in-app notifications as read

Authorizations:
bearerAuth

Responses

Notification Settings

Get global notification timing settings

Authorizations:
None

Responses

Update global notification timing settings

Authorizations:
None
Request Body schema: application/json
required
notifyStartMinutes
integer
notifyRegCloseMinutes
integer

Responses

Request samples

Content type
application/json
{
  • "notifyStartMinutes": 0,
  • "notifyRegCloseMinutes": 0
}

Update how notification email is paced (mode, window, quiet hours, cap)

Authorizations:
None
Request Body schema: application/json
required
emailMode
string
Enum: "instant" "smart" "digest"
digestWindowMinutes
integer
dailyEmailCap
integer
quietHoursStart
integer or null
quietHoursEnd
integer or null
timezone
string or null

Responses

Request samples

Content type
application/json
{
  • "emailMode": "instant",
  • "digestWindowMinutes": 0,
  • "dailyEmailCap": 0,
  • "quietHoursStart": 0,
  • "quietHoursEnd": 0,
  • "timezone": "string"
}

Get all per-table notification overrides

Authorizations:
None

Responses

Set per-table notification override

Authorizations:
None
path Parameters
clubId
required
string
tableId
required
string
Request Body schema: application/json
required
notifyStartMinutes
integer
notifyRegCloseMinutes
integer

Responses

Request samples

Content type
application/json
{
  • "notifyStartMinutes": 0,
  • "notifyRegCloseMinutes": 0
}

Delete a per-table notification override

Authorizations:
None
path Parameters
clubId
required
string
tableId
required
string

Responses

Providers

Get list of providers

Retrieves a list of all poker providers with optional sorting and filtering

query Parameters
sortBy
string
Enum: "providerId" "lastParsed"

Column name to sort by

sortOrder
string
Default: "asc"
Enum: "asc" "desc"

Sort order (ascending or descending)

q
string

Keyword to search for in provider names

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Public

Public (no-auth) club list — agent list by vanity slug or agent code, or the default catalog by reserved handle ('clubs')

path Parameters
handle
required
string

Responses

Saved Items

Save a search

Creates a new saved search for the authenticated user

Authorizations:
None
Request Body schema: application/json
required
name
required
string

Name for the saved search

filters
required
object

Filter criteria

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "filters": { }
}

Update a saved search

Updates the name and filters of an existing saved search for the authenticated user

Authorizations:
None
path Parameters
id
required
integer
Request Body schema: application/json
required
name
required
string
filters
required
object
purpose
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "filters": { },
  • "purpose": "string"
}

Delete a saved search

Deletes a saved search for the authenticated user

Authorizations:
None
path Parameters
id
required
integer

Responses

Save a table

Saves a table for the authenticated user

Authorizations:
None
Request Body schema: application/json
required
clubId
required
string
tableId
required
string

Responses

Request samples

Content type
application/json
{
  • "clubId": "string",
  • "tableId": "string"
}

Delete a saved table

Deletes a saved table for the authenticated user

Authorizations:
None
path Parameters
id
required
integer

Responses

Delete a saved table by identifiers

Deletes a saved table by clubId and tableId for the authenticated user

Authorizations:
None
path Parameters
clubId
required
string
tableId
required
string

Responses

Get all saved items

Returns all saved searches and tables for the authenticated user

Authorizations:
None

Responses

Response samples

Content type
application/json
{
  • "searches": [
    ],
  • "tables": [
    ]
}

Get tables matching a saved search

Returns all current tables that match the filters of a saved search

Authorizations:
None
path Parameters
id
required
integer

Responses

Security

Create device-bound session after Auth0 login

Registers or validates device fingerprint; returns X-Session-Token value for API calls.

Authorizations:
bearerAuth
Request Body schema: application/json
required
fingerprint
required
string
deviceUuid
required
string
deviceName
string

Responses

Request samples

Content type
application/json
{
  • "fingerprint": "string",
  • "deviceUuid": "string",
  • "deviceName": "string"
}

Validate current session token

Authorizations:
bearerAuth
header Parameters
X-Session-Token
required
string

Responses

Revoke server-side session

Authorizations:
bearerAuth

Responses

List registered devices for the user

Authorizations:
bearerAuth
header Parameters
X-Device-Fingerprint
string

Marks matching device as current in the response

Responses

Remove a registered device

Authorizations:
bearerAuth
path Parameters
deviceId
required
integer

Responses

Remove a device slot and register this device with a new session

Authorizations:
bearerAuth
Request Body schema: application/json
required
removeDeviceId
required
integer
fingerprint
required
string
deviceUuid
required
string
deviceName
string

Responses

Request samples

Content type
application/json
{
  • "removeDeviceId": 0,
  • "fingerprint": "string",
  • "deviceUuid": "string",
  • "deviceName": "string"
}

Stripe

Create Stripe Checkout session for subscription

Authorizations:
bearerAuth
Request Body schema: application/json
required
priceId
required
string

Stripe price ID (monthly or yearly, must match server-configured STRIPE_PRICE_* / *_YEARLY)

appUrl
string

Optional app base URL for success/cancel redirects

Responses

Request samples

Content type
application/json
{
  • "priceId": "string",
  • "appUrl": "string"
}

Response samples

Content type
application/json
{
  • "url": "string"
}

Verify Stripe Checkout session and persist subscription

Called after redirect from Checkout; loads session from Stripe and updates DB.

Authorizations:
bearerAuth
Request Body schema: application/json
required
sessionId
required
string

Responses

Request samples

Content type
application/json
{
  • "sessionId": "string"
}

Create Stripe Customer Portal session

Authorizations:
bearerAuth
Request Body schema: application/json
appUrl
string

Return URL base (default app.lobbyscanner.com)

Responses

Request samples

Content type
application/json
{
  • "appUrl": "string"
}

Response samples

Content type
application/json
{
  • "url": "string"
}

Change subscription plan or billing interval (upgrade/downgrade)

Upgrade (more expensive annualized, or switch to yearly billing): immediate switch with proration. Downgrade or switching from yearly back to monthly: scheduled for end of current billing period.

Authorizations:
bearerAuth
Request Body schema: application/json
required
priceId
required
string

Responses

Request samples

Content type
application/json
{
  • "priceId": "string"
}

Cancel subscription at period end

Sets cancel_at_period_end; releases pending subscription schedules when present.

Authorizations:
bearerAuth

Responses

Get current subscription (syncs from Stripe when linked)

Authorizations:
bearerAuth

Responses

Stripe webhook receiver (auto-books affiliate commissions)

Public endpoint hit by Stripe. Verifies the Stripe-Signature header against STRIPE_WEBHOOK_SECRET and books affiliate commissions on paid invoices. Idempotent across retries via a UNIQUE index on agent_referral_earnings.stripeEventId.

Responses

Subscription

Update user language

Updates the language preference for all user devices

Authorizations:
bearerAuth
Request Body schema: application/json
required
language
required
string
Enum: "en" "de"

Responses

Request samples

Content type
application/json
{
  • "language": "en"
}

Subscribe to push notifications

Registers a push token and email for the authenticated user

Authorizations:
bearerAuth
Request Body schema: application/json
required
pushToken
required
string
language
string
Default: "en"
Enum: "en" "de"
type
string
Default: "Web"
Enum: "Web" "Android" "iOS" "Desktop"

Responses

Request samples

Content type
application/json
{
  • "pushToken": "string",
  • "language": "en",
  • "type": "Web"
}

Unsubscribe from push notifications

Removes a push token for the authenticated user

Authorizations:
bearerAuth
Request Body schema: application/json
required
pushToken
required
string

Responses

Request samples

Content type
application/json
{
  • "pushToken": "string"
}

Get notification status

Returns the current push and email notification status for the user

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "pushEnabled": true,
  • "emailEnabled": true,
  • "email": "string"
}

Register email for notifications

Register or update email address for email notifications

Authorizations:
bearerAuth
Request Body schema: application/json
required
email
required
string
language
string
Default: "en"
Enum: "en" "de"

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "language": "en"
}

Disable email notifications

Disable email notifications for the user

Authorizations:
bearerAuth

Responses

Disable push notifications only

Disable push notifications while keeping email notifications active

Authorizations:
bearerAuth

Responses

Support

Submit a support request

Sends the in-app support contact form to the LobbyScanner support inbox.

Authorizations:
None
Request Body schema: application/json
required
category
string
subject
required
string
message
required
string
email
string

Responses

Request samples

Content type
application/json
{
  • "category": "string",
  • "subject": "string",
  • "message": "string",
  • "email": "string"
}

Tables

Get list of tables

Retrieves a paginated list of all poker tables with optional sorting and filtering

query Parameters
sortBy
string
Enum: "id" "clubId" "tableName" "gameVariant" "gameMode" "blinds" "blindsNum" "buyIn" "prize" "jackpot" "playersSeated" "playersRemaining" "playersRegistered" "tableMaxSeats" "waitingListCount" "startTime" "registrationClosesAt" "status"

Column name to sort by

sortOrder
string
Default: "asc"
Enum: "asc" "desc"

Sort order (ascending or descending)

q
string

Keyword to search for in table names, game variants, or game modes

clubId
string

Filter tables by club ID

providerId
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Filter tables by provider ID

gameMode
string
Enum: "CG" "MTT" "SNG" "TrueSpinGo"

Filter tables by game mode

gameVariant
string
Enum: "NLH" "PLO4" "PLO5" "PLO6" "OFC" "AoF" "Flash" "Mixed" "HiLo" "Joker" "StandUp" "ShortDeck" "NLH31"

Filter tables by game variant

status
string

Filter tables by status (comma-separated). Valid values: Announced, Late Registration, Late Registration Closed

page
integer >= 1
Default: 1

Page number (1-based)

limit
integer [ 1 .. 100 ]
Default: 50

Number of items per page (max 100)

debug
string

When set (e.g. 1, true, or empty), each table and nested club include originalRecord (large). Omit or use false/0/off to exclude them and reduce payload size.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Upload or replace a table

Uploads or replaces a table in the database using REPLACE INTO. Updates the provider's lastParsed timestamp.

Request Body schema: application/json
required
id
required
string

Unique identifier for the table

clubId
required
string

ID of the club this table belongs to

providerId
required
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Provider this table belongs to

tableName
required
string

Name of the table

gameVariant
required
string
Enum: "NLH" "PLO4" "PLO5" "PLO6" "OFC" "AoF" "Flash" "Mixed" "HiLo" "Joker" "StandUp" "ShortDeck" "NLH31"

Variant of poker being played

gameMode
required
string
Enum: "CG" "MTT" "SNG" "TrueSpinGo"

Game mode/type

blinds
string or null

Blind structure (e.g., "1/2")

blindsNum
integer or null

Numeric blind value for sorting purposes

buyIn
number or null

Buy-in amount

prize
number or null

Prize pool

jackpot
number or null

Jackpot amount

playersSeated
integer
Default: 0

Number of players currently seated

playersRemaining
integer
Default: 0

Number of players remaining

playersRegistered
integer
Default: 0

Number of players registered

tableMaxSeats
integer
Default: 0

Maximum number of seats at the table

waitingListCount
integer
Default: 0

Number of players on the waiting list

tableTags
Array of strings or null

Array of table tags/features

startTime
string or null <date-time>

Table start time

registrationClosesAt
string or null <date-time>

Registration closing time

blindLevelDuration
integer or null

Duration of blind levels in seconds

status
required
string
Enum: "Announced" "Late Registration" "Late Registration Closed"

Current status of the table

originalRecord
object or null

Original JSON payload from the provider

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "clubId": "string",
  • "providerId": "PokerBros",
  • "tableName": "string",
  • "gameVariant": "NLH",
  • "gameMode": "CG",
  • "blinds": "string",
  • "blindsNum": 0,
  • "buyIn": 0,
  • "prize": 0,
  • "jackpot": 0,
  • "playersSeated": 0,
  • "playersRemaining": 0,
  • "playersRegistered": 0,
  • "tableMaxSeats": 0,
  • "waitingListCount": 0,
  • "tableTags": [
    ],
  • "startTime": "2019-08-24T14:15:22Z",
  • "registrationClosesAt": "2019-08-24T14:15:22Z",
  • "blindLevelDuration": 0,
  • "status": "Announced",
  • "originalRecord": { }
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "clubId": "string",
  • "providerId": "PokerBros",
  • "tableName": "string",
  • "gameVariant": "string",
  • "gameMode": "string",
  • "status": "string"
}

Get a single table

Retrieves a specific table by its Club ID and Table ID

path Parameters
clubId
required
string

The ID of the club

tableId
required
string

The unique identifier of the table

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "clubId": "string",
  • "providerId": "PokerBros",
  • "tableName": "string",
  • "gameVariant": "NLH",
  • "gameMode": "CG",
  • "blinds": "string",
  • "blindsNum": 0,
  • "buyIn": 0,
  • "prize": 0,
  • "jackpot": 0,
  • "playersSeated": 0,
  • "playersRemaining": 0,
  • "playersRegistered": 0,
  • "tableMaxSeats": 0,
  • "waitingListCount": 0,
  • "tableTags": [
    ],
  • "startTime": "2019-08-24T14:15:22Z",
  • "registrationClosesAt": "2019-08-24T14:15:22Z",
  • "blindLevelDuration": 0,
  • "status": "Announced",
  • "originalRecord": { },
  • "club": {
    }
}

Bulk upload or replace tables

Uploads or replaces multiple tables in the database using REPLACE INTO in a batch operation. Updates the provider's lastParsed timestamp.

Request Body schema: application/json
required
Array
id
required
string

Unique identifier for the table

clubId
required
string

ID of the club this table belongs to

providerId
required
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Provider this table belongs to

tableName
required
string

Name of the table

gameVariant
required
string
Enum: "NLH" "PLO4" "PLO5" "PLO6" "OFC" "AoF" "Flash" "Mixed" "HiLo" "Joker" "StandUp" "ShortDeck" "NLH31"

Variant of poker being played

gameMode
required
string
Enum: "CG" "MTT" "SNG" "TrueSpinGo"

Game mode/type

blinds
string or null

Blind structure (e.g., "1/2")

blindsNum
integer or null

Numeric blind value for sorting purposes

buyIn
number or null

Buy-in amount

prize
number or null

Prize pool

jackpot
number or null

Jackpot amount

playersSeated
integer
Default: 0
playersRemaining
integer
Default: 0
playersRegistered
integer
Default: 0
tableMaxSeats
integer
Default: 0
waitingListCount
integer
Default: 0
tableTags
Array of strings or null
startTime
string or null <date-time>
registrationClosesAt
string or null <date-time>
blindLevelDuration
integer or null
status
required
string
Enum: "Announced" "Late Registration" "Late Registration Closed"
originalRecord
object or null

Responses

Request samples

Content type
application/json
[
  • {
    }
]

Response samples

Content type
application/json
{
  • "count": 0,
  • "message": "string"
}

Delete a table

Soft-deletes a table (isDeleted); the row is kept and excluded from list/detail API responses. Updates the club's lastActivity.

path Parameters
clubId
required
string

Club ID the table belongs to

id
required
string

Table ID to delete

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

Cleanup old tables

Soft-deletes tables (isDeleted) for a provider with updatedAt older than the cutoff. Optionally filter by clubId. Affected clubs get lastActivity updated.

query Parameters
providerId
required
string
Enum: "PokerBros" "ClubGG" "PPPoker" "XPoker" "SupremaPoker" "QQPK" "PokerBoss" "Revolution" "WPTGlobal" "Pokerrrr2" "KingsHomeGames"

Provider to cleanup tables for

timestamp
required
string <date-time>

Cutoff timestamp (ISO 8601). Tables with updatedAt older than this will be soft-deleted.

clubId
string

Optional club ID to filter cleanup to a specific club

Responses

Response samples

Content type
application/json
{
  • "count": 0,
  • "message": "string"
}