Skip to content

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.

MethodPathPurpose
GET/operator/v1/settingsGet operator settings
PUT/operator/v1/settingsChange operator settings
GET/operator/v1/rake-defaultsGet rake defaults
PUT/operator/v1/rake-defaultsSave rake defaults (optionally apply to all existing tables)
GET/operator/v1/card-designGet live card design defaults
PUT/operator/v1/card-designSave live card design defaults
GET/operator/v1/creditPrepaid 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.

json
{ "error": { "code": "INVALID_REQUEST", "message": "invalid fields", "details": { "fields": ["watch_limit_sec"] } } }

GET /operator/v1/settings ​

Retrieves the operator settings.

Request example ​

http
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 ​

json
{
  "timezone": "Asia/Manila",
  "operator_timezone": "",
  "hq_timezone": "Asia/Manila",
  "currencies": ["PHP", "USD"],
  "multi_table": true,
  "watch_limit_sec": 600,
  "money_adjust": false
}

Response fields ​

FieldTypeDescription
timezonestringTime zone to use in admin screens (IANA name). operator_timezone if set, otherwise hq_timezone
operator_timezonestringTime zone set by the operator. "" means the platform time zone is used
hq_timezonestringPlatform (headquarters) time zone
currenciesstring[]Currencies this operator can use. The first one is the default currency. Set by the platform; cannot be changed through this API
multi_tableboolWhether multi-table play is allowed. If false, a player can join only one table at a time
watch_limit_secintSpectating 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_adjustboolWhether 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 ​

FieldTypeRequiredDescription
timezonestringNoIANA time zone name (e.g. Asia/Manila). "" means the platform time zone is used. Leading and trailing whitespace is trimmed
multi_tableboolNoWhether multi-table play is allowed
watch_limit_secintNo0 (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 ​

bash
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 ​

json
{
  "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 ​

HTTPCodedetails.fieldsSituation
400INVALID_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
400INVALID_REQUEST["watch_limit_sec"]watch_limit_sec is not 0 and is outside 30 to 3600
400INVALID_REQUEST["timezone"]Unknown time zone name
500INTERNAL_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 ​

json
{
  "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 ​

FieldTypeDescription
rake_defaultsobjectSaved defaults. Fields that have not been set are omitted ({} if none are set)
rake_defaults.rake_bpintRake rate (bp, 500 = 5%). Used for every game with rake; Speed Hold'em also uses it for the ante rake
rake_defaults.capsobjectCurrency → 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_dropboolNo rake is taken on hands that end before the flop (Hold'em family — Texas Hold'em, Omaha, Live Hold'em)
rake_defaults.rake_floorboolDiscard any fraction of one currency unit from a round's total rake (e.g. ₱142.50 → ₱142). All games with rake
currenciesstring[]Currencies that can be used in caps (this operator's enabled currencies)
max_rake_bpintUpper 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 ​

FieldTypeRequiredDescription
rake_bpintNo0 to 2000
capsobjectNo{ "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_dropboolNoHold'em family rake rule
rake_floorboolNoDiscard fractions
apply_allboolNoIf 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:

CaseApplied to existing dedicated tables
apply_all: trueAll 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 presentOnly rake_floor, applied to all tables
apply_all absent or false, rake_floor absentNothing applied (new tables only)

On running tables, changes take effect from the next round. Shared tables are not affected.

Request example ​

bash
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 ​

json
{
  "rake_defaults": { "rake_bp": 500, "caps": { "PHP": 30000 }, "no_flop_no_drop": true, "rake_floor": true },
  "floor_tables": 4,
  "applied_tables": 0
}
FieldTypeDescription
rake_defaultsobjectSaved defaults
floor_tablesintNumber of tables actually changed by applying rake_floor (tables that already had the same value are not counted)
applied_tablesintNumber of tables actually changed by apply_all

Errors ​

HTTPCodeSituation
400INVALID_REQUEST (no details, message invalid json)The body is not JSON or a field has the wrong type
400INVALID_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
500INTERNAL_ERRORFailed 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 ​

json
{
  "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 ​

FieldTypeDescription
card_designobjectOperator defaults {face?, back?, back_color?}. Fields left empty are omitted and follow default
defaultobjectPlatform defaults
optionsobjectSelectable values per field
FieldValues
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 ​

FieldTypeRequiredDescription
facestringNotexas, studio or ""
backstringNotexas, rlive or ""
back_colorstringNoblue, red, black or ""

Request example ​

bash
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 ​

json
{ "card_design": { "face": "studio", "back": "rlive", "back_color": "black" } }

Errors ​

HTTPCodeSituation
400INVALID_REQUEST (no details, message invalid json)The body is not JSON
400INVALID_REQUEST (details.fields)A value that cannot be selected → the relevant field among "face", "back" and "back_color"
500INTERNAL_ERRORFailed 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 ​

ParameterTypeRequiredDescription
limitintegerNoNumber of ledger rows. Default 50, maximum 500
offsetintegerNoNumber of rows to skip (default 0)
kindmanualNoWith manual, only manual operations by the platform (charge, withdraw, adjust). Any other value is ignored and all rows are returned

Request example ​

http
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 ​

json
{
  "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 ​

FieldTypeDescription
modestringOperating mode: prepaid (prepaid mode) or independent (independent mode)
balanceint64Current prepaid credit balance (minor units)
warn_belowint64Warning threshold set by the platform. Treat a balance below this as a signal that a top-up is needed (0 = no threshold)
currencystringCurrency of prepaid credit amounts — this operator's default currency (currencies[0] of GET /settings)
entries[]arrayLedger, newest first (id descending)
entries[].idint64Ledger row ID
entries[].kindstringSee the table below
entries[].amountint64Change in balance. Deductions are negative, increases are positive
entries[].balance_afterint64Balance after this row is applied
entries[].tx_idstring | nullRelated wallet transaction ID. null for manual operations by the platform
entries[].memostring | nullMemo for manual operations by the platform
entries[].created_attimestampTime recorded

kind

ValueSignMeaningtx_id
charge+Top-up by the platformnull
withdraw−Withdrawal by the platformnull
adjust±Adjustment by the platformnull
debit−Deduction before a bet or buy-in debitThat debit
debit_failed+The debit was rejected, so the deduction is returnedThe original debit
rollback+The debit was cancelled (rolled back), so the deduction is returnedThe 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 debit row, and its return produces exactly one row, either debit_failed or rollback.
  • A debit rejected for insufficient prepaid credit leaves no ledger row, since no deduction was made (it is recorded as failed in the platform transaction ledger). → GET /transactions
  • Pagination uses offset. If new rows are added while you are paging, pages may overlap, so deduplicate by id.

Errors ​

HTTPCodeSituation
500INTERNAL_ERRORTemporary 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.

Docs v1.0.0 · Operator API v1