Games, Lobby and Currencies
Retrieve the list of games enabled for this operator and the currency table, and configure per-game site bet limits and the game lobby display (menu, tables and banner).
GET /games
GET {API_BASE}/operator/v1/games?lang=enThe list of games enabled for this operator. Use it to build the game menu on your site. Games are returned in the sort order defined by the platform.
Query
| Parameter | Type | Required | Description |
|---|---|---|---|
lang | string | Language of the game names. ko en zh ja th vi (same rules as lang in POST /launch). Defaults to ko when empty. If no name exists in that language, the platform falls back to English → Korean → the game code, in that order. |
Request example
GET /operator/v1/games?lang=en HTTP/1.1
Host: {API_HOST}
X-Operator: acme
X-Api-Key: ak_5d2c9e0f7a1b3c4d5e6f708192a3b4c5d6e7f809
X-Timestamp: 1792368067512
X-Nonce: 1c7e5a9b3d2f4e6a8b0c1d2e
X-Signature: 7a0c…(64 hex digits)Response
200 OK
{
"games": [
{
"game_code": "holdem_nlh",
"name": "Texas Hold'em",
"category": "poker",
"kind": "table",
"live": false,
"thumbnail": {
"square": "https://{GAME_ORIGIN}/thumbs/holdem_nlh.webp",
"wide": "https://{GAME_ORIGIN}/thumbs/holdem_nlh.webp"
},
"min_bet": 2000,
"max_bet": 100000,
"currency": "PHP",
"status": "open",
"bet_limits": { "PHP": { "min": 1000, "max": 100000 } },
"table_create": false,
"lobby": {}
},
{
"game_code": "live_baccarat",
"name": "Live Baccarat",
"category": "live",
"kind": "round",
"live": true,
"thumbnail": {
"square": "https://{GAME_ORIGIN}/thumbs/live_baccarat.webp",
"wide": "https://{GAME_ORIGIN}/thumbs/live_baccarat.webp"
},
"min_bet": 10000,
"max_bet": 5000000,
"currency": "PHP",
"status": "open",
"bet_limits": {},
"table_create": false,
"lobby": {
"hide_tables": true,
"banner": {
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"title": "Weekend Baccarat Event",
"link_url": "https://www.acme.example/events/baccarat",
"width": 1920,
"height": 480
}
}
}
]
}| Field | Type | Description |
|---|---|---|
game_code | string | Game code. See Game codes |
name | string | Game name in the lang language |
category | string | Category: poker, card, board or live |
kind | string | table (P2P, players against each other) or round (banked, players against the house). See Integration overview |
live | boolean | Whether this is a live game with a dealer video stream |
thumbnail.square / thumbnail.wide | string | Thumbnail URLs (both values are currently identical). See Thumbnails below |
min_bet / max_bet | integer | Bet size range of the tables that players of this site can currently join (default currency, minor units). See Bet size below. Both are 0 if no table is available |
currency | string | Currency of min_bet / max_bet = the operator's default currency (the first of its enabled currencies) |
status | string | open or maintenance (under maintenance — launching returns 503 GAME_MAINTENANCE) |
bet_limits | object | Site bet limits {currency: {min?, max?}}. Currencies without limits have no key, and a side set to 0 (no limit) omits its min / max key. Set with PUT /games/{game_code}/bet-limits. |
table_create | boolean | Whether dedicated tables can be created for this game (independent mode, and a game allowed by the platform). See POST /tables |
lobby | object | Game lobby display. {} when everything is at its default (all visible, no banner). See the table below |
lobby object (keys are omitted when the value is the default)
| Field | Type | Description |
|---|---|---|
hide_menu | boolean | If true, this game is hidden from the game list in the game lobby. |
hide_tables | boolean | If true, this game's tables are hidden from the table list in the game lobby. |
banner | object | Banner shown above this game's table list in the game lobby. sha256, title, link_url, width, height (the values from PUT /games/{game_code}/lobby) |
Bet size
min_bet / max_bet and the site bet limits are compared against a single bet size defined for each table.
| Game type | Table bet size | Table limits key |
|---|---|---|
| Banked (Baccarat, Blackjack, Red Dog, etc.) | Minimum bet to maximum bet range | min_bet ~ max_bet |
| Hold'em, Omaha, Live Hold'em | Big blind | bb |
| Speed Hold'em | Bet amount | bet |
| Tong-its | Stake | stake |
| Matgo, Go-Stop | Amount per point | point_value |
| Seotda, Badugi | Ante | ante |
The keys of a table's limits can be seen in GET /tables.
Thumbnails
thumbnail is the /thumbs/{game_code}.webp URL under the game client origin. It is a public URL that opens without authentication.
To be agreed
How game thumbnail and icon images are provided (size, format, delivery timing) is agreed upon at contract time. Use the agreed images for your site's game menu, and treat this field as reference only.
Errors
Only authentication and common errors apply (Error codes).
GET /currencies
GET {API_BASE}/operator/v1/currenciesThe currency table used by the platform. All amounts are integers in the currency's minor unit (Conventions), so divide by exponent decimal places when displaying them.
- All platform currencies are returned. The currencies this operator can use are the enabled currencies registered during onboarding; check them in
currenciesofGET /settings. - The order is not fixed. Look currencies up by code.
Response
200 OK
{
"currencies": [
{ "code": "KRW", "exponent": 0, "symbol": "₩" },
{ "code": "USD", "exponent": 2, "symbol": "$" },
{ "code": "PHP", "exponent": 2, "symbol": "₱" }
]
}| Field | Type | Description |
|---|---|---|
code | string | Currency code |
exponent | integer | Number of decimal places. The amount 12345 is 123.45 with exponent: 2, and 12345 with 0 |
symbol | string | Display symbol |
One currency unit = 10^exponent minor units (e.g. for PHP, 100 = ₱1). Amounts sent as settings — such as site bet limits, table limits and rake caps — are accepted only as multiples of one unit (fractional amounts such as ₱10.50 are not allowed).
Errors
Only authentication and common errors apply (Error codes).
PUT /games/{game_code}/bet-limits
PUT {API_BASE}/operator/v1/games/{game_code}/bet-limitsSets the site bet limits of a single game, per currency. Intended for admin screens.
Site bet limits are the range that determines which tables are offered to players of this site. Only tables whose bet size falls within the range appear in this site's players' lobby and can be joined. Bet validation within a round uses the table's own limits.
- One currency is changed per request. Limits for other currencies are left unchanged.
- Sending both
minandmaxas0clears the limits for that currency (no limit). - Players already seated continue until they leave their seat. Changes apply only to new entries and the lobby list, and may take up to 30 seconds to take effect.
Path and request fields
| Field | Location | Type | Required | Description |
|---|---|---|---|---|
game_code | path | string | Required | A game code enabled for this operator |
currency | body | string | Required | One of the operator's enabled currencies |
min | body | integer | Lower bound of the bet size (minor units). 0 = no lower bound | |
max | body | integer | Upper bound of the bet size (minor units). 0 = no upper bound |
minandmaxmust be 0 or greater, and if both are greater than 0,min ≤ maxmust hold.- They must be multiples of one currency unit (
10^exponent).
Request example
PUT /operator/v1/games/holdem_nlh/bet-limits HTTP/1.1
Host: {API_HOST}
Content-Type: application/json; charset=utf-8
X-Operator: acme
X-Api-Key: ak_5d2c9e0f7a1b3c4d5e6f708192a3b4c5d6e7f809
X-Timestamp: 1792368067512
X-Nonce: 5e8a1f3c7b9d2e4f6a0b1c2d
X-Signature: 0d9e…(64 hex digits)
{ "currency": "PHP", "min": 1000, "max": 100000 }Response
200 OK — the game's full limits after the change
{
"game_code": "holdem_nlh",
"bet_limits": {
"PHP": { "min": 1000, "max": 100000 },
"USD": { "max": 2000 }
}
}Errors
| HTTP | error.code | Cause |
|---|---|---|
| 400 | INVALID_REQUEST | Malformed JSON, or details.fields: currency (not an enabled currency), min (negative, min > max, or not a multiple of one unit), max (negative, or not a multiple of one unit) |
| 404 | GAME_NOT_FOUND | The game is not enabled for this operator |
PUT /games/{game_code}/lobby
PUT {API_BASE}/operator/v1/games/{game_code}/lobbySets how this game is shown in the game lobby (the lobby inside the game client). Intended for admin screens. Once saved, the change applies immediately from the next lobby request.
- With
menu: false, this game is removed from the game list in the game lobby. - With
tables: false, this game's tables are removed from the table list in the game lobby. - If
banneris present, a banner is shown above that game's table list. Upload the image first withPUT /lobby-bannersand keep the returnedsha256.
Send all three values
The request is a full replacement. Omitting menu or tables stores false (hidden), and omitting banner removes the banner. To keep something visible, send true explicitly.
Path and request fields
| Field | Location | Type | Required | Description |
|---|---|---|---|---|
game_code | path | string | Required | A game code enabled for this operator |
menu | body | boolean | Required | true = shown in the game list |
tables | body | boolean | Required | true = shown in the table list |
banner | body | object | null | Banner. null means no banner | |
banner.sha256 | body | string | Required (when a banner is present) | The value returned by PUT /lobby-banners (64 lowercase hex characters) |
banner.title | body | string | Banner description (alt text). Leading and trailing whitespace is trimmed; 200 characters or fewer | |
banner.link_url | body | string | URL opened when the banner is clicked. An http:// or https:// URL, or empty (no link) | |
banner.width / banner.height | body | integer | Image size (pixels). Pass the values from the PUT /lobby-banners response as is. They are clamped to 0–4096 when stored. |
Request example
{
"menu": true,
"tables": false,
"banner": {
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"title": "Weekend Baccarat Event",
"link_url": "https://www.acme.example/events/baccarat",
"width": 1920,
"height": 480
}
}Response
200 OK — the saved values (same shape as lobby in GET /games)
{
"game_code": "live_baccarat",
"lobby": {
"hide_tables": true,
"banner": {
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"title": "Weekend Baccarat Event",
"link_url": "https://www.acme.example/events/baccarat",
"width": 1920,
"height": 480
}
}
}Errors
| HTTP | error.code | Cause |
|---|---|---|
| 400 | INVALID_REQUEST | Malformed JSON, or details.fields: banner.title (over 200 characters), banner.link_url (not an http(s) URL), banner.sha256 (invalid format) |
| 404 | BANNER_NOT_FOUND | No image exists for that sha256 — upload it first with PUT /lobby-banners |
| 404 | GAME_NOT_FOUND | The game is not enabled for this operator |
PUT /lobby-banners
PUT {API_BASE}/operator/v1/lobby-bannersUploads a game lobby banner image and returns its image ID (sha256). Intended for admin screens. This step only uploads the image; to actually display it, put the returned value in banner of PUT /games/{game_code}/lobby.
- Uploading the same image again returns the same
sha256(it is stored only once). - This endpoint alone has a request body limit of 768KB (other endpoints: 64KB). Because this limit includes the size increase from base64 encoding, prepare original images of 512KB or less.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
image | string | Required | The image as a base64 string, or a data URL (data:image/png;base64,…) |
Image requirements:
- Format: JPEG, PNG, WebP or GIF (detected from the content)
- Size: 512KB or less after decoding
- Width and height: 1–4096 pixels each (recommended: width of 1920 or less)
Request example
{ "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgH…" }Response
200 OK
{
"sha256": "9b2f0c4e6a8d1b3f5e7a9c0b2d4f6e8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d",
"width": 1920,
"height": 480
}| Field | Type | Description |
|---|---|---|
sha256 | string | Image ID (SHA-256 of the image content, 64 lowercase hex characters) |
width / height | integer | Image size (pixels) |
Public URL
The game lobby fetches uploaded images from the following URL. It is a public URL that opens without authentication, and since the sha256 changes whenever the content changes, it is cached for one year.
GET {API_BASE}/play/v1/lobby-banners/{sha256}Upload only images that may be made public
Anyone who knows the sha256 can fetch a banner image, and there is no API to delete an uploaded image. Do not upload images that contain personal information or unreleased content.
Errors
| HTTP | error.code | Cause |
|---|---|---|
| 400 | INVALID_REQUEST | Malformed JSON |
| 400 | BAD_IMAGE | Not base64, unsupported format, over 512KB, or width/height over 4096 |
| 401 | INVALID_SIGNATURE | A body truncated for exceeding 768KB also fails as a signature mismatch |