Skip to content

Tables ​

Query table status. Independent-mode operators can also create and configure their own dedicated tables.

  • Shared tables: Operated by the platform; players from multiple operators sit at them together. You can only query them; their settings cannot be changed.
  • Dedicated tables: Tables created by a single operator. Only that operator's players can see them in the lobby and sit at them. They are not visible to other operators. Only independent (independent mode) operators can create them (Operating mode).

All endpoints except GET /tables are intended for admin back-office screens.

GET /tables ​

GET {API_BASE}/operator/v1/tables?game_code=live_holdem

Returns the live tables this operator can see (shared + its own dedicated tables), along with the templates and default rake values used to create dedicated tables.

Showing tables on your site

The list also includes tables of games not enabled for this operator, tables in currencies you do not use, and tables outside your site bet limits. When showing tables to players, use only tables with offered: true. If you send a table with offered: false to POST /launch, entry is rejected on the game screen.

offered does not reflect the game lobby display settings (hide_menu, hide_tables). To hide the same game on your site's screens as well, also check the lobby value from GET /games.

Query ​

ParameterTypeRequiredDescription
game_codestringOnly tables of this game. All tables if empty

Response ​

200 OK

json
{
  "tables": [
    {
      "table_id": "tbl_019a0f3c8e1f7a2b9c4d5e6f7a8b9c0d",
      "game_code": "live_holdem",
      "name": "Live Hold'em 25/50",
      "names": { "ko": "라이브 홀덤 25/50", "en": "Live Hold'em 25/50" },
      "currency": "PHP",
      "limits": { "sb": 2500, "bb": 5000, "ante": 0, "min_buy_in": 200000, "max_buy_in": 1000000 },
      "seats": { "max": 7, "taken": 3 },
      "players": 3,
      "status": "open",
      "snapshot_url": "https://{API_HOST}/dealer/v1/snapshots/tbl_019a0f3c8e1f7a2b9c4d5e6f7a8b9c0d",
      "dedicated": false,
      "offered": true,
      "clonable": true,
      "studio": true,
      "sort_order": 5,
      "rake_kind": "pct_cap",
      "rake_bp": 500,
      "rake_cap": 50000,
      "timers": [ { "key": "action_ms", "ms": 15000, "default_ms": 15000 } ],
      "rake_rule": { "no_flop_no_drop": true, "rake_floor": false }
    },
    {
      "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718",
      "game_code": "live_holdem",
      "name": "ACME VIP 50/100",
      "names": { "ko": "ACME VIP 50/100", "en": "ACME VIP 50/100" },
      "currency": "PHP",
      "limits": { "sb": 5000, "bb": 10000, "ante": 0, "min_buy_in": 400000, "max_buy_in": 2000000 },
      "seats": { "max": 7, "taken": 0 },
      "players": 0,
      "status": "open",
      "private": { "state": "standby", "start": 1792371600000, "end": 1792375200000 },
      "dedicated": true,
      "offered": true,
      "clonable": true,
      "studio": false,
      "sort_order": 0,
      "settings": {
        "PHP": { "limits": { "sb": 5000, "bb": 10000, "ante": 0, "min_buy_in": 400000, "max_buy_in": 2000000 }, "rake_bp": 500, "rake_cap": 50000 },
        "USD": { "limits": { "sb": 100, "bb": 200, "ante": 0, "min_buy_in": 8000, "max_buy_in": 40000 }, "rake_bp": 500, "rake_cap": 1000 },
        "KRW": { "limits": { "sb": 1000, "bb": 2000, "ante": 0, "min_buy_in": 80000, "max_buy_in": 400000 }, "rake_bp": 500, "rake_cap": 10000 }
      },
      "rake_kind": "pct_cap",
      "rake_bp": 500,
      "rake_cap": 50000,
      "live": { "dealing": "auto", "paused": false },
      "timers": [ { "key": "action_ms", "ms": 20000, "default_ms": 15000 } ],
      "rake_rule": { "no_flop_no_drop": true, "rake_floor": true },
      "card_design": { "back": "rlive", "back_color": "red" }
    }
  ],
  "can_create": true,
  "templates": [
    {
      "game_code": "live_holdem",
      "allowed": true,
      "available": true,
      "currency": "PHP",
      "limits": { "sb": 2500, "bb": 5000, "ante": 0, "min_buy_in": 200000, "max_buy_in": 1000000 },
      "seats": { "max": 7, "taken": 0 },
      "studio": true,
      "settings": { "PHP": { "limits": { "sb": 2500, "bb": 5000, "ante": 0, "min_buy_in": 200000, "max_buy_in": 1000000 }, "rake_bp": 500, "rake_cap": 50000 } },
      "rake_kind": "pct_cap",
      "rake_bp": 500,
      "rake_cap": 50000,
      "rake_rule": { "no_flop_no_drop": true, "rake_floor": false }
    },
    { "game_code": "live_baccarat", "allowed": false, "available": true, "currency": "PHP", "limits": { "min_bet": 10000, "max_bet": 5000000, "tie_max": 500000 }, "studio": true }
  ],
  "rake_defaults": { "rake_bp": 500, "caps": { "PHP": 50000 }, "no_flop_no_drop": true, "rake_floor": true }
}

tables[] — fields present on every table ​

FieldTypeDescription
table_idstringTable ID (tbl_ + 32 hex digits). Use it as table_id in POST /launch.
game_codestringGame code
namestringTable name (original)
namesobjectNames by language {ko, en, zh, ja, th, vi}. If there is no name for the display language, use name.
currencystringTable operating currency. Only players in this currency can sit.
limitsobjectTable limits (integers in minor units). Keys vary by game (e.g. Hold'em sb bb ante min_buy_in max_buy_in; Baccarat min_bet max_bet tie_max).
seatsobjectSeats {max, taken}. Present only for seated games; banked games without seats do not have this field.
playersintegerCurrent number of participants (seated count for seated games; connected players at the table for banked games)
statusstringopen / maintenance
privateobjectPresent only on tables with a private reservation. state: standby (from 5 minutes before the reservation starts — entry by password only) / private (in progress); start, end: reservation times (Unix milliseconds). See Private tables
snapshot_urlstringPresent only on live tables with dealer video. See Video snapshot below
dedicatedbooleanWhether this is this operator's dedicated table
offeredbooleanWhether this site's players can see and enter the table (game enabled, currency in use, and within the site bet limits)
clonablebooleanWhether a dedicated table can be created using this table as the source (from in POST /tables)
studiobooleanWhether this is a dealer studio table (video streaming). A clone becomes an auto-dealing table without video.
sort_orderintegerLobby sort order within the same game (lower comes first)
rake_kindstringRake shape. pct_cap (Texas Hold'em, Pot-Limit Omaha, Live Hold'em) / bp (Speed Hold'em, Seotda, Badugi, Matgo, Go-Stop, Tong-its). Games without rake (Baccarat, Blackjack, Red Dog) do not have this field.
rake_bpintegerRake rate in the operating currency (bp, 500 = 5%). Games with rake only
rake_capintegerMaximum rake per round in the operating currency (minor units, 0 = no cap). Games with rake only
timersarrayEditable betting / turn times [{key, ms, default_ms}]. See PUT /tables/{table_id}/timers
rake_ruleobjectRake rules {no_flop_no_drop?, rake_floor}. Games with rake only. no_flop_no_drop exists only for the Hold'em family.

tables[] — fields present only on dedicated tables ​

FieldTypeDescription
settingsobjectLimits and rake per currency {currency: {limits, rake_bp?, rake_cap?}}. Currencies other than the operating currency are pre-filled by converting the operating currency's values. Edit with PUT /tables/{table_id}/settings.
liveobjectDealing method and pause {dealing: "auto" | "manual", paused}. Live Hold'em and Speed Hold'em only
card_designobjectCard design chosen specifically for the table {face?, back?, back_color?}. Empty fields follow the operator default. Live Hold'em and Speed Hold'em only

Top-level fields ​

FieldTypeDescription
can_createbooleanWhether the operating mode allows creating dedicated tables (true if independent)
templatesarrayOne table-creation template per enabled game. See the table below
rake_defaultsobjectThis operator's default rake values {rake_bp?, caps?, no_flop_no_drop?, rake_floor?}. Initial rake values for new tables. See Operator settings

templates[]

FieldTypeDescription
game_codestringGame code
allowedbooleanWhether tables can be created for this game (independent mode + permitted by the platform)
availablebooleanWhether a template exists. If false, the fields below are absent and this game cannot be created via game_code.
currency / limits / seats / studio / settings / rake_kind / rake_bp / rake_cap / rake_ruleTemplate values. Same meaning as in tables[]. The keys of limits are the limit keys to send in POST /tables.

Video snapshot ​

snapshot_url is the latest single capture (JPEG) of a live table's dealer video. You can use it as a preview on the table cards in your site lobby.

GET {API_BASE}/dealer/v1/snapshots/{table_id}
  • It is a public URL that opens without authentication. You can embed it directly with <img> from another origin.
  • While video is streaming, it updates roughly every minute. The same URL is cached for 30 seconds, so on screen, re-fetch it every minute with a changing query such as ?t=<timestamp>.
  • If there is no capture yet, or the last capture is older than 5 minutes (streaming stopped), it returns 404. In that case, use your site's own image instead.
  • Auto-dealing tables without video have no snapshot_url.

Errors ​

Only authentication and common errors (Error codes).

Dedicated table common rules ​

For the endpoints below (except POST /tables), the table_id in the path must be an open dedicated table of this operator.

HTTPerror.codeCause
404TABLE_NOT_FOUNDThe table does not exist, is closed, or is another operator's dedicated table
403TABLE_NOT_OWNEDA shared table (managed by the platform — cannot be changed)
400INVALID_REQUESTJSON error or field error (details.fields)
400INVALID_CONFIGThe game engine does not accept this configuration (reason in message)
  • Changes to limits, rake, timers and rake rules apply from the next round; a round in progress finishes with the old values.
  • All amounts are integers in minor units, and only multiples of one amount unit (10^exponent, GET /currencies) are accepted.
  • Every change is recorded in the audit log and can be reverted using the X-Audit-Id response header.

POST /tables ​

POST {API_BASE}/operator/v1/tables

Creates a dedicated table. Available only in independent mode, and only for games the platform has allowed this operator to create tables for (table_create in GET /games, templates[].allowed in GET /tables).

Choose the source in one of two ways:

  • from: Clone a table you can see (shared or your own dedicated table, clonable: true)
  • game_code: Create from that game's template (templates[], available: true)

The new table inherits the source's detailed settings (timers, etc.); only the name, currency, limits, number of seats, sort order and rake are changed. If you use a dealer studio table (studio: true) as the source, it is created as an auto-dealing table without video.

Request fields ​

FieldTypeRequiredDescription
fromstringOne of the twoID of the table to clone (tbl_…)
game_codestringOne of the twoGame code to create from its template (ignored if from is present)
namesobjectRequiredNames by language {ko, en, zh, ja, th, vi}. At least one of en or ko is required; each up to 60 characters. Empty languages are filled with the English name (or the Korean name if there is no English name).
currencystringRequiredOperating currency. One of the operator's currencies
limitsobjectRequiredLimits {key: amount}. See Limit rules below
max_seatsintegerNumber of seats. Only for games whose source has seats. INVALID_CONFIG if the game does not accept the value
sort_orderintegerLobby sort order. Source value if empty
rake_bpintegerRake rate (bp, 0–2000 = 0–20%). Games with rake only
rake_capintegerMaximum rake per round (0 or more, 0 = no cap). Games with rake only
no_flop_no_dropbooleanNo rake is taken from hands that end before the flop. Hold'em family only (Texas Hold'em, Pot-Limit Omaha, Live Hold'em)
rake_floorbooleanDiscards the part of a round's rake below one unit (₱142.50 → ₱142). Games with rake only
  • If the rake fields are empty, the default rake values (rake_defaults) are used; if those are also absent, the source table's values are used.
  • Sending rake fields for games without rake (Baccarat, Blackjack, Red Dog) makes those fields errors.
  • Limits and rake for currencies other than the operating currency are pre-filled by conversion; edit them after creation with PUT /tables/{table_id}/settings.

Limit rules ​

limits is validated with the same rules in POST /tables and PUT /tables/{table_id}/settings.

  • Send all of the keys, and only the keys, in the source table's (or template's) limits. Do not omit keys whose value is 0 (e.g. Hold'em ante).
  • Values must be 0 or more, and keys whose source value is greater than 0 must be greater than 0.
  • Values must be multiples of one amount unit.
  • min_X ≤ max_X (e.g. min_buy_in ≤ max_buy_in) and sb ≤ bb must hold.
  • The table's bet size must be within the site bet limits for that currency (if it is outside, the table would not be visible to your own players even if created, so it is rejected).

Invalid fields are returned in details.fields as limits.<key>.

Request example ​

json
{
  "from": "tbl_019a0f3c8e1f7a2b9c4d5e6f7a8b9c0d",
  "names": { "en": "ACME VIP 50/100", "ko": "ACME VIP 50/100" },
  "currency": "PHP",
  "limits": { "sb": 5000, "bb": 10000, "ante": 0, "min_buy_in": 400000, "max_buy_in": 2000000 },
  "sort_order": 0,
  "rake_bp": 500,
  "rake_cap": 50000,
  "no_flop_no_drop": true,
  "rake_floor": true
}

Response ​

201 Created

json
{ "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718" }

The created table goes live immediately and appears in GET /tables and the player lobby.

Errors ​

HTTPerror.codeCause
403TABLE_CREATE_FORBIDDENA prepaid operator, or a game for which table creation is not allowed
404TABLE_NOT_FOUNDThe from table does not exist, is closed, or is another operator's dedicated table
404GAME_NOT_FOUNDThe game is not enabled for this operator (including when both from and game_code are empty)
404TEMPLATE_NOT_FOUNDNo template exists for the game (templates[].available: false)
400TEMPLATE_NOT_ALLOWEDThe source limits have a shape that cannot be cloned
400INVALID_REQUESTdetails.fields: names.<language> / currency / limits.<key> / max_seats / rake_bp / rake_cap / no_flop_no_drop / rake_floor
400INVALID_CONFIGThe game engine does not accept this configuration (number of seats, etc.)
500TABLE_OPEN_FAILEDThe table could not be started after saving (treated as not created)
503UNAVAILABLETable creation is not available right now

PATCH /tables/{table_id} ​

PATCH {API_BASE}/operator/v1/tables/{table_id}

Changes a dedicated table's name and sort order. Change limits and rake with PUT …/settings, and the operating currency with PUT …/currency.

Request fields ​

FieldTypeRequiredDescription
namesobjectRequiredNames by language. Same rules as names in POST /tables. The sent value replaces the whole object.
sort_orderintegerLobby sort order. Unchanged if empty
json
{ "names": { "en": "ACME VIP 100/200" }, "sort_order": 1 }

Response ​

204 No Content. The lobby name changes immediately.

Errors ​

Dedicated table common errors. Field errors are names.<language> (over 60 characters, or names.en if both en and ko are empty).

POST /tables/{table_id}/close ​

POST {API_BASE}/operator/v1/tables/{table_id}/close

Closes a dedicated table. No body is required (sign an empty body or {}).

  • Seated players are cashed out after the round in progress ends (in banked games, unsettled rounds are voided and refunded). Money is returned through the wallet callbacks as usual.
  • A closed table disappears from the list and cannot be reopened via the Operator API. To use it again, create a new one.

Response ​

204 No Content

Errors ​

Dedicated table common errors.

PUT /tables/{table_id}/settings ​

PUT {API_BASE}/operator/v1/tables/{table_id}/settings

Saves the limits and rake for one currency of a dedicated table. A table runs in a single operating currency, but settings are stored separately per currency, and that currency's values are used when you change the operating currency.

  • If currency is the operating currency, the live table is notified immediately and the change applies from the next round.
  • Otherwise, the values are only saved.

Request fields ​

FieldTypeRequiredDescription
currencystringRequiredOne of the operator's currencies
limitsobjectRequiredLimits. Same keys as the table's current limits — see Limit rules
rake_bpintegerRequired for games with rakeRake rate (bp, 0–2000)
rake_capintegerMaximum rake per round (0 or more; empty or 0 = no cap)

For games without rake, rake_bp and rake_cap are ignored.

json
{
  "currency": "PHP",
  "limits": { "sb": 5000, "bb": 10000, "ante": 0, "min_buy_in": 400000, "max_buy_in": 2000000 },
  "rake_bp": 450,
  "rake_cap": 40000
}

Response ​

200 OK

json
{
  "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718",
  "currency": "PHP",
  "settings": {
    "PHP": { "limits": { "sb": 5000, "bb": 10000, "ante": 0, "min_buy_in": 400000, "max_buy_in": 2000000 }, "rake_bp": 450, "rake_cap": 40000 },
    "USD": { "limits": { "sb": 100, "bb": 200, "ante": 0, "min_buy_in": 8000, "max_buy_in": 40000 }, "rake_bp": 500, "rake_cap": 1000 },
    "KRW": { "limits": { "sb": 1000, "bb": 2000, "ante": 0, "min_buy_in": 80000, "max_buy_in": 400000 }, "rake_bp": 500, "rake_cap": 10000 }
  }
}
FieldTypeDescription
table_idstringTable ID
currencystringThe table's operating currency (not the requested currency)
settingsobjectAll per-currency settings after saving

Errors ​

Dedicated table common errors. Field errors: currency / limits.<key> (including outside the site bet limits) / rake_bp / rake_cap.

PUT /tables/{table_id}/currency ​

PUT {API_BASE}/operator/v1/tables/{table_id}/currency

Changes a dedicated table's operating currency. That currency's settings values become the limits and rake, and the table is restarted.

  • It can be changed only when nobody is seated (409 TABLE_BUSY if anyone is seated).
  • If you send the same value as the current operating currency, nothing is changed and the response is 200.

Request fields ​

FieldTypeRequiredDescription
currencystringRequiredNew operating currency. One of the operator's currencies
json
{ "currency": "USD" }

Response ​

200 OK — { "table_id", "currency"(new operating currency), "settings" } (same shape as the PUT …/settings response)

Errors ​

HTTPerror.codeCause
409TABLE_BUSYThere are seated players
400INVALID_REQUESTdetails.fields: currency
400INVALID_CONFIGThe game engine does not accept that currency's settings
500TABLE_OPEN_FAILEDThe table could not be restarted

Plus the dedicated table common errors.

PUT /tables/{table_id}/live ​

PUT {API_BASE}/operator/v1/tables/{table_id}/live

Changes the dealing method and pause state of a dedicated Live Hold'em or Speed Hold'em table. Only the values you send are changed.

FieldTypeRequiredDescription
dealingstringauto (auto dealing — the server deals the cards without video or a dealer) / manual (a dealer scans the cards and streams video)
pausedbooleanIf true, no new round is started (a round in progress runs to completion)
  • Pause applies immediately; the dealing method applies after the round in progress ends.
  • Switching to manual makes the table one where the dealer tool streams video and scans cards. For preparing dealers and the dealer tool, see Dealers.
json
{ "dealing": "auto", "paused": true }

Response ​

200 OK

json
{ "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718", "dealing": "auto", "paused": true }

Errors ​

HTTPerror.codeCause
400UNSUPPORTED_GAMEThe table is not Live Hold'em or Speed Hold'em
400INVALID_REQUESTdetails.fields: dealing (not auto or manual)

Plus the dedicated table common errors.

PUT /tables/{table_id}/timers ​

PUT {API_BASE}/operator/v1/tables/{table_id}/timers

Changes a dedicated table's betting and turn times. Only the keys you send are changed.

FieldTypeRequiredDescription
timersobjectRequired{key: milliseconds}. At least one. Values must be 3000–300000 (3–300 seconds), in multiples of 1000

Keys by game (current and default values are in timers of GET /tables)

GameKeys
Texas Hold'em / Pot-Limit Omaha / Live Hold'emaction_ms (turn time)
Speed Hold'em / Baccaratbet_ms (betting time)
Blackjackbet_ms (betting time), decision_ms (decision time)
Matgo / Go-Stopturn_ms
Seotdaturn_ms, select_ms
Badugiturn_ms, draw_ms
Tong-itsdraw_ms, play_ms, fight_ms
Red Dogbet_ms, raise_ms
  • In turn-based games, the new time applies from the next turn or betting window; in round games (Speed Hold'em, Blackjack, Baccarat), it applies between rounds (if a round is in progress, after that round ends). Countdowns already running are not affected.
json
{ "timers": { "action_ms": 20000 } }

Response ​

200 OK

json
{
  "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718",
  "timers": [ { "key": "action_ms", "ms": 20000, "default_ms": 15000 } ]
}

Errors ​

Dedicated table common errors. Field errors: timers (empty) / timers.<key> (a key this game does not have, out of range, or not a multiple of 1000).

PUT /tables/{table_id}/rake-rule ​

PUT {API_BASE}/operator/v1/tables/{table_id}/rake-rule

Changes a dedicated table's rake rules. Only for games with rake. Only the values you send are changed, and you must send at least one.

FieldTypeRequiredDescription
no_flop_no_dropbooleanNo rake is taken from hands that end before the flop. Hold'em family only (Texas Hold'em, Pot-Limit Omaha, Live Hold'em)
rake_floorbooleanDiscards the part of a round's rake below one amount unit (₱142.50 → ₱142). All games with rake
json
{ "rake_floor": true }

Response ​

200 OK

json
{
  "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718",
  "rake_rule": { "no_flop_no_drop": true, "rake_floor": true }
}

Errors ​

Dedicated table common errors. Field errors: rake_rule (a game without rake, or both values empty) / no_flop_no_drop (not the Hold'em family).

PUT /tables/{table_id}/card-design ​

PUT {API_BASE}/operator/v1/tables/{table_id}/card-design

Selects a separate card design for a dedicated Live Hold'em or Speed Hold'em table. This is a display setting and does not affect gameplay; it takes effect the next time a player enters the table.

FieldTypeRequiredDescription
facestringFace: texas / studio
backstringBack: texas / rlive
back_colorstringBack color: blue / red / black (used only for rlive, the back whose color can be chosen)
  • The request is a full replacement. Empty or omitted fields fall back to the operator default (GET /card-design) and then the system default, in that order. If all fields are empty, the table-specific design is removed.
  • For the options and each design, see Operator settings.
json
{ "back": "rlive", "back_color": "red" }

Response ​

200 OK

json
{
  "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718",
  "card_design": { "back": "rlive", "back_color": "red" }
}

Errors ​

Dedicated table common errors. Field errors: card_design (not Live Hold'em or Speed Hold'em) / face / back / back_color (a value not among the options).

Docs v1.0.0 · Operator API v1