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_holdemReturns 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
| Parameter | Type | Required | Description |
|---|---|---|---|
game_code | string | Only tables of this game. All tables if empty |
Response
200 OK
{
"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
| Field | Type | Description |
|---|---|---|
table_id | string | Table ID (tbl_ + 32 hex digits). Use it as table_id in POST /launch. |
game_code | string | Game code |
name | string | Table name (original) |
names | object | Names by language {ko, en, zh, ja, th, vi}. If there is no name for the display language, use name. |
currency | string | Table operating currency. Only players in this currency can sit. |
limits | object | Table 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). |
seats | object | Seats {max, taken}. Present only for seated games; banked games without seats do not have this field. |
players | integer | Current number of participants (seated count for seated games; connected players at the table for banked games) |
status | string | open / maintenance |
private | object | Present 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_url | string | Present only on live tables with dealer video. See Video snapshot below |
dedicated | boolean | Whether this is this operator's dedicated table |
offered | boolean | Whether this site's players can see and enter the table (game enabled, currency in use, and within the site bet limits) |
clonable | boolean | Whether a dedicated table can be created using this table as the source (from in POST /tables) |
studio | boolean | Whether this is a dealer studio table (video streaming). A clone becomes an auto-dealing table without video. |
sort_order | integer | Lobby sort order within the same game (lower comes first) |
rake_kind | string | Rake 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_bp | integer | Rake rate in the operating currency (bp, 500 = 5%). Games with rake only |
rake_cap | integer | Maximum rake per round in the operating currency (minor units, 0 = no cap). Games with rake only |
timers | array | Editable betting / turn times [{key, ms, default_ms}]. See PUT /tables/{table_id}/timers |
rake_rule | object | Rake 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
| Field | Type | Description |
|---|---|---|
settings | object | Limits 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. |
live | object | Dealing method and pause {dealing: "auto" | "manual", paused}. Live Hold'em and Speed Hold'em only |
card_design | object | Card 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
| Field | Type | Description |
|---|---|---|
can_create | boolean | Whether the operating mode allows creating dedicated tables (true if independent) |
templates | array | One table-creation template per enabled game. See the table below |
rake_defaults | object | This operator's default rake values {rake_bp?, caps?, no_flop_no_drop?, rake_floor?}. Initial rake values for new tables. See Operator settings |
templates[]
| Field | Type | Description |
|---|---|---|
game_code | string | Game code |
allowed | boolean | Whether tables can be created for this game (independent mode + permitted by the platform) |
available | boolean | Whether 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_rule | Template 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.
| HTTP | error.code | Cause |
|---|---|---|
| 404 | TABLE_NOT_FOUND | The table does not exist, is closed, or is another operator's dedicated table |
| 403 | TABLE_NOT_OWNED | A shared table (managed by the platform — cannot be changed) |
| 400 | INVALID_REQUEST | JSON error or field error (details.fields) |
| 400 | INVALID_CONFIG | The 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-Idresponse header.
POST /tables
POST {API_BASE}/operator/v1/tablesCreates 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
| Field | Type | Required | Description |
|---|---|---|---|
from | string | One of the two | ID of the table to clone (tbl_…) |
game_code | string | One of the two | Game code to create from its template (ignored if from is present) |
names | object | Required | Names 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). |
currency | string | Required | Operating currency. One of the operator's currencies |
limits | object | Required | Limits {key: amount}. See Limit rules below |
max_seats | integer | Number of seats. Only for games whose source has seats. INVALID_CONFIG if the game does not accept the value | |
sort_order | integer | Lobby sort order. Source value if empty | |
rake_bp | integer | Rake rate (bp, 0–2000 = 0–20%). Games with rake only | |
rake_cap | integer | Maximum rake per round (0 or more, 0 = no cap). Games with rake only | |
no_flop_no_drop | boolean | No rake is taken from hands that end before the flop. Hold'em family only (Texas Hold'em, Pot-Limit Omaha, Live Hold'em) | |
rake_floor | boolean | Discards 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 is0(e.g. Hold'emante). - 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) andsb ≤ bbmust 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
{
"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
{ "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718" }The created table goes live immediately and appears in GET /tables and the player lobby.
Errors
| HTTP | error.code | Cause |
|---|---|---|
| 403 | TABLE_CREATE_FORBIDDEN | A prepaid operator, or a game for which table creation is not allowed |
| 404 | TABLE_NOT_FOUND | The from table does not exist, is closed, or is another operator's dedicated table |
| 404 | GAME_NOT_FOUND | The game is not enabled for this operator (including when both from and game_code are empty) |
| 404 | TEMPLATE_NOT_FOUND | No template exists for the game (templates[].available: false) |
| 400 | TEMPLATE_NOT_ALLOWED | The source limits have a shape that cannot be cloned |
| 400 | INVALID_REQUEST | details.fields: names.<language> / currency / limits.<key> / max_seats / rake_bp / rake_cap / no_flop_no_drop / rake_floor |
| 400 | INVALID_CONFIG | The game engine does not accept this configuration (number of seats, etc.) |
| 500 | TABLE_OPEN_FAILED | The table could not be started after saving (treated as not created) |
| 503 | UNAVAILABLE | Table 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
| Field | Type | Required | Description |
|---|---|---|---|
names | object | Required | Names by language. Same rules as names in POST /tables. The sent value replaces the whole object. |
sort_order | integer | Lobby sort order. Unchanged if empty |
{ "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}/closeCloses 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}/settingsSaves 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
currencyis 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
| Field | Type | Required | Description |
|---|---|---|---|
currency | string | Required | One of the operator's currencies |
limits | object | Required | Limits. Same keys as the table's current limits — see Limit rules |
rake_bp | integer | Required for games with rake | Rake rate (bp, 0–2000) |
rake_cap | integer | Maximum rake per round (0 or more; empty or 0 = no cap) |
For games without rake, rake_bp and rake_cap are ignored.
{
"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
{
"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 }
}
}| Field | Type | Description |
|---|---|---|
table_id | string | Table ID |
currency | string | The table's operating currency (not the requested currency) |
settings | object | All 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}/currencyChanges 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_BUSYif anyone is seated). - If you send the same value as the current operating currency, nothing is changed and the response is
200.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
currency | string | Required | New operating currency. One of the operator's currencies |
{ "currency": "USD" }Response
200 OK — { "table_id", "currency"(new operating currency), "settings" } (same shape as the PUT …/settings response)
Errors
| HTTP | error.code | Cause |
|---|---|---|
| 409 | TABLE_BUSY | There are seated players |
| 400 | INVALID_REQUEST | details.fields: currency |
| 400 | INVALID_CONFIG | The game engine does not accept that currency's settings |
| 500 | TABLE_OPEN_FAILED | The table could not be restarted |
Plus the dedicated table common errors.
PUT /tables/{table_id}/live
PUT {API_BASE}/operator/v1/tables/{table_id}/liveChanges the dealing method and pause state of a dedicated Live Hold'em or Speed Hold'em table. Only the values you send are changed.
| Field | Type | Required | Description |
|---|---|---|---|
dealing | string | auto (auto dealing — the server deals the cards without video or a dealer) / manual (a dealer scans the cards and streams video) | |
paused | boolean | If 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
manualmakes the table one where the dealer tool streams video and scans cards. For preparing dealers and the dealer tool, see Dealers.
{ "dealing": "auto", "paused": true }Response
200 OK
{ "table_id": "tbl_019a1b2c3d4e7f50a1b2c3d4e5f60718", "dealing": "auto", "paused": true }Errors
| HTTP | error.code | Cause |
|---|---|---|
| 400 | UNSUPPORTED_GAME | The table is not Live Hold'em or Speed Hold'em |
| 400 | INVALID_REQUEST | details.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}/timersChanges a dedicated table's betting and turn times. Only the keys you send are changed.
| Field | Type | Required | Description |
|---|---|---|---|
timers | object | Required | {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)
| Game | Keys |
|---|---|
| Texas Hold'em / Pot-Limit Omaha / Live Hold'em | action_ms (turn time) |
| Speed Hold'em / Baccarat | bet_ms (betting time) |
| Blackjack | bet_ms (betting time), decision_ms (decision time) |
| Matgo / Go-Stop | turn_ms |
| Seotda | turn_ms, select_ms |
| Badugi | turn_ms, draw_ms |
| Tong-its | draw_ms, play_ms, fight_ms |
| Red Dog | bet_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.
{ "timers": { "action_ms": 20000 } }Response
200 OK
{
"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-ruleChanges 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.
| Field | Type | Required | Description |
|---|---|---|---|
no_flop_no_drop | boolean | No rake is taken from hands that end before the flop. Hold'em family only (Texas Hold'em, Pot-Limit Omaha, Live Hold'em) | |
rake_floor | boolean | Discards the part of a round's rake below one amount unit (₱142.50 → ₱142). All games with rake |
{ "rake_floor": true }Response
200 OK
{
"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-designSelects 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.
| Field | Type | Required | Description |
|---|---|---|---|
face | string | Face: texas / studio | |
back | string | Back: texas / rlive | |
back_color | string | Back 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.
{ "back": "rlive", "back_color": "red" }Response
200 OK
{
"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).