Operator Settings and Prepaid Credit
Covers operator-level settings (time zone, multi-table play, spectating limit), rake defaults for new dedicated tables, live card design, and the prepaid credit balance and ledger. Mainly used from the operator's admin screens.
| Method | Path | Purpose |
|---|---|---|
| GET | /operator/v1/settings | Get operator settings |
| PUT | /operator/v1/settings | Change operator settings |
| GET | /operator/v1/rake-defaults | Get rake defaults |
| PUT | /operator/v1/rake-defaults | Save rake defaults (optionally apply to all existing tables) |
| GET | /operator/v1/card-design | Get live card design defaults |
| PUT | /operator/v1/card-design | Save live card design defaults |
| GET | /operator/v1/credit | Prepaid credit balance and ledger |
Responses to write requests (PUT) carry the audit record ID in the X-Audit-Id header. You can use this ID later to revert the change. → Audit log
All field validation errors have the following shape. details.fields contains the names of the invalid fields.
{ "error": { "code": "INVALID_REQUEST", "message": "invalid fields", "details": { "fields": ["watch_limit_sec"] } } }GET /operator/v1/settings
Retrieves the operator settings.
Request example
GET /operator/v1/settings HTTP/1.1
Host: {API_HOST}
X-Operator: acme
X-Api-Key: ak_live_…
X-Timestamp: 1760839200123
X-Nonce: 4a6c8e0b2d4f6a8c0e2b4d6f
X-Signature: 1f9b…Response example
{
"timezone": "Asia/Manila",
"operator_timezone": "",
"hq_timezone": "Asia/Manila",
"currencies": ["PHP", "USD"],
"multi_table": true,
"watch_limit_sec": 600,
"money_adjust": false
}Response fields
| Field | Type | Description |
|---|---|---|
timezone | string | Time zone to use in admin screens (IANA name). operator_timezone if set, otherwise hq_timezone |
operator_timezone | string | Time zone set by the operator. "" means the platform time zone is used |
hq_timezone | string | Platform (headquarters) time zone |
currencies | string[] | Currencies this operator can use. The first one is the default currency. Set by the platform; cannot be changed through this API |
multi_table | bool | Whether multi-table play is allowed. If false, a player can join only one table at a time |
watch_limit_sec | int | Spectating time limit for live games (seconds). A player who only watches for this long without betting or taking a seat is sent back to the lobby. 0 = no limit |
money_adjust | bool | Whether the platform has granted this operator the "manual member balance credit/debit" feature. Read-only and has no effect on platform behavior (used to decide whether to show that feature in the operator's admin screens) |
timezone is a display setting for admin screens. It does not affect timestamps in Operator API responses or the date boundaries of GGR.
PUT /operator/v1/settings
Changes only the fields that are sent. At least one of the three must be sent.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
timezone | string | No | IANA time zone name (e.g. Asia/Manila). "" means the platform time zone is used. Leading and trailing whitespace is trimmed |
multi_table | bool | No | Whether multi-table play is allowed |
watch_limit_sec | int | No | 0 (no limit) or 30 to 3600 |
Changes to multi_table and watch_limit_sec take effect for new entries as soon as they are saved.
Request example
curl -X PUT {API_BASE}/operator/v1/settings \
-H 'Content-Type: application/json; charset=utf-8' \
-H 'X-Operator: acme' -H 'X-Api-Key: ak_live_…' \
-H 'X-Timestamp: 1760839200123' -H 'X-Nonce: 0b2d4f6a8c0e2b4d6f8a0c2e' -H 'X-Signature: 6e3d…' \
-d '{"multi_table":false,"watch_limit_sec":300}'Response example
{
"timezone": "Asia/Manila",
"operator_timezone": "",
"hq_timezone": "Asia/Manila",
"multi_table": false,
"watch_limit_sec": 300
}The response fields are the same as for GET, except that currencies and money_adjust are not included.
Errors
| HTTP | Code | details.fields | Situation |
|---|---|---|---|
| 400 | INVALID_REQUEST | ["timezone", "multi_table", "watch_limit_sec"] | The body is not JSON, a field has the wrong type (e.g. "multi_table": "yes"), or all three fields are missing |
| 400 | INVALID_REQUEST | ["watch_limit_sec"] | watch_limit_sec is not 0 and is outside 30 to 3600 |
| 400 | INVALID_REQUEST | ["timezone"] | Unknown time zone name |
| 500 | INTERNAL_ERROR | — | Failed to save |
Validation runs in the order watch_limit_sec → timezone and stops at the first error. If validation fails, nothing is saved.
GET /operator/v1/rake-defaults
Retrieves the rake defaults. The defaults are the initial values for newly created dedicated tables. The rake of existing tables is changed per table through table settings.
Response example
{
"rake_defaults": {
"rake_bp": 500,
"caps": { "PHP": 30000 },
"no_flop_no_drop": true,
"rake_floor": true
},
"currencies": ["PHP", "USD"],
"max_rake_bp": 2000
}Response fields
| Field | Type | Description |
|---|---|---|
rake_defaults | object | Saved defaults. Fields that have not been set are omitted ({} if none are set) |
rake_defaults.rake_bp | int | Rake rate (bp, 500 = 5%). Used for every game with rake; Speed Hold'em also uses it for the ante rake |
rake_defaults.caps | object | Currency → maximum rake per round (in that currency's minor units, 0 = no cap). Meaningful only when rake_bp is set |
rake_defaults.no_flop_no_drop | bool | No rake is taken on hands that end before the flop (Hold'em family — Texas Hold'em, Omaha, Live Hold'em) |
rake_defaults.rake_floor | bool | Discard any fraction of one currency unit from a round's total rake (e.g. ₱142.50 → ₱142). All games with rake |
currencies | string[] | Currencies that can be used in caps (this operator's enabled currencies) |
max_rake_bp | int | Upper bound of rake_bp (2000 = 20%) |
PUT /operator/v1/rake-defaults
Saves the rake defaults as a whole. Fields that are not sent are removed from the defaults (new tables then take that field from the source table they are cloned from). To change only some fields, merge your changes into the values obtained from GET and send the result.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
rake_bp | int | No | 0 to 2000 |
caps | object | No | { "currency": amount }. Only this operator's enabled currencies; amounts must be 0 or greater and a multiple of one currency unit (10^exponent) |
no_flop_no_drop | bool | No | Hold'em family rake rule |
rake_floor | bool | No | Discard fractions |
apply_all | bool | No | If true, all saved defaults (rate, rake cap, no flop no drop, fraction discard) are also applied to all existing dedicated tables of this operator. Defaults to false |
What is applied to existing tables:
| Case | Applied to existing dedicated tables |
|---|---|
apply_all: true | All defaults (tables of games with rake. Only the tables whose engine does not accept a value are skipped) |
apply_all absent or false, rake_floor present | Only rake_floor, applied to all tables |
apply_all absent or false, rake_floor absent | Nothing applied (new tables only) |
On running tables, changes take effect from the next round. Shared tables are not affected.
Request example
curl -X PUT {API_BASE}/operator/v1/rake-defaults \
-H 'Content-Type: application/json; charset=utf-8' \
-H 'X-Operator: acme' -H 'X-Api-Key: ak_live_…' \
-H 'X-Timestamp: 1760839200123' -H 'X-Nonce: 8c0e2b4d6f8a0c2e4b6d8f0a' -H 'X-Signature: 2a7f…' \
-d '{"rake_bp":500,"caps":{"PHP":30000},"no_flop_no_drop":true,"rake_floor":true,"apply_all":false}'Response example
{
"rake_defaults": { "rake_bp": 500, "caps": { "PHP": 30000 }, "no_flop_no_drop": true, "rake_floor": true },
"floor_tables": 4,
"applied_tables": 0
}| Field | Type | Description |
|---|---|---|
rake_defaults | object | Saved defaults |
floor_tables | int | Number of tables actually changed by applying rake_floor (tables that already had the same value are not counted) |
applied_tables | int | Number of tables actually changed by apply_all |
Errors
| HTTP | Code | Situation |
|---|---|---|
| 400 | INVALID_REQUEST (no details, message invalid json) | The body is not JSON or a field has the wrong type |
| 400 | INVALID_REQUEST (details.fields) | rake_bp outside 0 to 2000 → "rake_bp"; a cap for a currency not in use, negative, or not a multiple of one unit → "caps.<currency>" (e.g. "caps.USD"). If there are several, all are included |
| 500 | INTERNAL_ERROR | Failed to save |
GET /operator/v1/card-design
Retrieves the defaults for the card face, card back and back color of Live Hold'em and Speed Hold'em (the live_holdem and live_speed_holdem families). These defaults apply to the cards seen by this operator's players, including on shared tables (the same shared table may look different for each operator). Dedicated tables can be configured individually. → Tables
Response example
{
"card_design": { "back": "rlive", "back_color": "red" },
"default": { "face": "texas", "back": "texas", "back_color": "blue" },
"options": {
"face": ["texas", "studio"],
"back": ["texas", "rlive"],
"back_color": ["blue", "red", "black"]
}
}Response fields
| Field | Type | Description |
|---|---|---|
card_design | object | Operator defaults {face?, back?, back_color?}. Fields left empty are omitted and follow default |
default | object | Platform defaults |
options | object | Selectable values per field |
| Field | Values |
|---|---|
face (card face) | texas — Design 1 (Texas Hold'em card artwork), studio — Design 2 (large index + suit) |
back (card back) | texas — Design 1, rlive — Design 2 (lattice pattern, color selectable) |
back_color (back color) | blue, red, black — used only when the back is rlive |
The card design is resolved in the order table value → operator default → platform default. Changes become visible the next time a player joins a table.
PUT /operator/v1/card-design
Saves the defaults as a whole. Fields that are omitted or sent as "" follow the platform defaults.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
face | string | No | texas, studio or "" |
back | string | No | texas, rlive or "" |
back_color | string | No | blue, red, black or "" |
Request example
curl -X PUT {API_BASE}/operator/v1/card-design \
-H 'Content-Type: application/json; charset=utf-8' \
-H 'X-Operator: acme' -H 'X-Api-Key: ak_live_…' \
-H 'X-Timestamp: 1760839200123' -H 'X-Nonce: 6f8a0c2e4b6d8f0a2c4e6b8d' -H 'X-Signature: 9d0c…' \
-d '{"face":"studio","back":"rlive","back_color":"black"}'Response example
{ "card_design": { "face": "studio", "back": "rlive", "back_color": "black" } }Errors
| HTTP | Code | Situation |
|---|---|---|
| 400 | INVALID_REQUEST (no details, message invalid json) | The body is not JSON |
| 400 | INVALID_REQUEST (details.fields) | A value that cannot be selected → the relevant field among "face", "back" and "back_color" |
| 500 | INTERNAL_ERROR | Failed to save |
GET /operator/v1/credit
Retrieves the prepaid credit balance and ledger. Also used to check the operating mode (mode) (call it lightly with limit=1).
For operators in prepaid mode (prepaid), the bet amount is deducted from prepaid credit before the bet debit is sent to the wallet; if prepaid credit is insufficient, the wallet is not called and the bet or seat is rejected. Independent mode (independent) does not use prepaid credit. → Operating mode
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Number of ledger rows. Default 50, maximum 500 |
offset | integer | No | Number of rows to skip (default 0) |
kind | manual | No | With manual, only manual operations by the platform (charge, withdraw, adjust). Any other value is ignored and all rows are returned |
Request example
GET /operator/v1/credit?limit=50&offset=0 HTTP/1.1
Host: {API_HOST}
X-Operator: acme
X-Api-Key: ak_live_…
X-Timestamp: 1760839200123
X-Nonce: 3e5b7d9f1a3c5e7b9d1f3a5c
X-Signature: 7b2e…Response example
{
"mode": "prepaid",
"balance": 99998701,
"warn_below": 10000000,
"currency": "PHP",
"entries": [
{ "id": 812, "kind": "credit", "amount": 15896, "balance_after": 99998701, "tx_id": "tx_5c0e9a7d3b1f5e2a8c4d6b0f9e1a3c5d", "memo": null, "created_at": "2026-10-18T14:20:41.07Z" },
{ "id": 811, "kind": "debit", "amount": -6000, "balance_after": 99982805, "tx_id": "tx_0199f3b0ab3c7d118e2f3a4b5c6d7e8f", "memo": null, "created_at": "2026-10-18T14:20:11.4Z" },
{ "id": 790, "kind": "charge", "amount": 50000000, "balance_after": 99988805, "tx_id": null, "memo": "October top-up", "created_at": "2026-10-18T09:00:00Z" }
]
}Response fields
| Field | Type | Description |
|---|---|---|
mode | string | Operating mode: prepaid (prepaid mode) or independent (independent mode) |
balance | int64 | Current prepaid credit balance (minor units) |
warn_below | int64 | Warning threshold set by the platform. Treat a balance below this as a signal that a top-up is needed (0 = no threshold) |
currency | string | Currency of prepaid credit amounts — this operator's default currency (currencies[0] of GET /settings) |
entries[] | array | Ledger, newest first (id descending) |
entries[].id | int64 | Ledger row ID |
entries[].kind | string | See the table below |
entries[].amount | int64 | Change in balance. Deductions are negative, increases are positive |
entries[].balance_after | int64 | Balance after this row is applied |
entries[].tx_id | string | null | Related wallet transaction ID. null for manual operations by the platform |
entries[].memo | string | null | Memo for manual operations by the platform |
entries[].created_at | timestamp | Time recorded |
kind
| Value | Sign | Meaning | tx_id |
|---|---|---|---|
charge | + | Top-up by the platform | null |
withdraw | − | Withdrawal by the platform | null |
adjust | ± | Adjustment by the platform | null |
debit | − | Deduction before a bet or buy-in debit | That debit |
debit_failed | + | The debit was rejected, so the deduction is returned | The original debit |
rollback | + | The debit was cancelled (rolled back), so the deduction is returned | The original debit (not the ID of the rollback transaction) |
credit | + | A win or cash-out credit succeeded, so that amount is added (credits with amount 0 are not recorded) | That credit |
- The same wallet transaction is never applied twice with the same kind. One debit produces one
debitrow, and its return produces exactly one row, eitherdebit_failedorrollback. - A debit rejected for insufficient prepaid credit leaves no ledger row, since no deduction was made (it is recorded as
failedin the platform transaction ledger). → GET /transactions - Pagination uses
offset. If new rows are added while you are paging, pages may overlap, so deduplicate byid.
Errors
| HTTP | Code | Situation |
|---|---|---|
| 500 | INTERNAL_ERROR | Temporary server error |
To be agreed
How prepaid credit is topped up and withdrawn, and the warning threshold (warn_below), are agreed upon at contract time. This API is read-only.