232rgs / Engineering reference

API Documentation

The current remote gaming service: operator integration, game clients, wallet protocols and the SDK showcase.

13 November 2026
Documented source: 3f5afad7d77668ee5b47e72140086514d76b9418
Current-source reference · 204 RGS HTTP operations · SDK and native client contracts

Prepared for technical integration assessment. This edition describes the implemented API, including configuration-dependent routes. Showcase balances are synthetic. Examples contain no live credentials.

232rgs — API documentation

Regeneration (2 November 2026, latest 5 November 2026): the OpenAPI document, the endpoint index, the field reference, the HTML and the PDF now describe the source commit named on the cover and in source-identity.json (196 operations on 5 November): every route the RGS serves with every optional module configured, read from the code. Request schemas are the handlers' own validators. Where a delta below says the generated reference still describes the September source, this regeneration replaces that. The client, operator, wallet and showcase chapters were re-checked against the routes on 5 November 2026 (w21); the deltas below are kept as history.

October 24 delta (Claude lane, not yet integrated): - Tequity wallets: the Tequity free bets API lets them add and remove free bets and list free-bet amounts. - Tequity wallets (connector): a wallet that speaks Tequity's protocol can launch its players and take their wagers and wins (Tequity wallet): /authenticate, /balance, /transaction with resends, and /cancel, per-session bet limits, and free rounds named by the wallet's campaign. Jackpot games on these sessions come later. - Free rounds in the browser wallet API: /wallet/authenticate and /wallet/play list the session's freeRounds, and /wallet/play takes freeRoundId (client API). - BetSymphony: a declined wager now cancels its round and answers ERR_IPB. Before, the player got an internal error and the round stayed pending. - Time-outs: the operator time-out is in Operator API, the player time-out in Client API. Self-exclusions and time-outs now block every account of the player, and responses carry the new limit fields (timeOutUntil, playBlockedUntil, pending). - Back office: the back-office routes are also explained in backoffice.md.

M0 implementation delta: History cursors, private interactive replay, live multiplayer entitlements, safe RG limits and request-time wallet destination policy supersede the affected behavior below. The generated September OpenAPI/HTML/PDF remain historical and are not republished by this module.

October 5 audited-owner delta: Current account provisioning and entitlement ownership documents bounded post-authentication SQL and HTTP 503 CONTROL_PLANE_BUSY with Retry-After: 1. Provisioning duplicates remain action no-ops; repeated successful entitlement PUTs still write and audit. Mutation/audit rollback and response normalization are preserved. The source-pinned September OpenAPI/HTML/PDF and portal remain historical, unchanged and not republished or certified by this local slice.

October 5 campaign delta: Current campaign ownership, retries and pagination supersedes this historical edition's campaign behavior. /v1/campaigns now supports bounded limit/cursor pages and explicit HTTP 409 when a legacy unpaged history exceeds 100 grants; exact grant retries return the original ledger balance, including ended campaigns. Read/create/status and grant unavailability use their documented HTTP 503 envelopes. The September generated OpenAPI/HTML/PDF and documentation portal remain pinned and have not been regenerated, republished or certified by this local implementation slice.

October 1 platform delta: the reference and generated OpenAPI/HTML/PDF below remain pinned to their September source, not the latest platform tree. The Phase 0 successor removes /metrics from the gameplay listener. Operations use a separate internal memory-only endpoint, default 127.0.0.1:9464/metrics; it returns 503 before first collection or once the snapshot expires. See metrics operations and limits. This runtime task does not republish or certify the separate documentation portal.

Current service reference · 21 September 2026

October 1 one-shot transaction delta: the local successor also returns native HTTP 503 with { "error": "MONEY_PATH_BUSY" } and Retry-After: 1 for bounded money-transaction unavailability. Recover/resend only with the original command identity and canonical body; a lost COMMIT acknowledgement is not proof of rejection. /wallet/play retains its Stake HTTP-200 ERR_UE envelope with Round status unavailable; reconcile before retrying, not automatic fresh-wager retry. See one-shot budgets and exclusions. The generated September reference/portal has not been republished by this runtime slice.

Generated reference source: the commit named on the cover and in source-identity.json (5 November 2026)
Prose chapters written against: ed208c392fd33d563ed095cd5ffe95f474abda21
Last source change at the prose chapters' commit: bubblebeam11 — “lobby: resolve African tiles from mounted game assets”

232rgs is a remote gaming service with persistent player sessions, game-version-pinned execution, wager settlement, wallet accounting, round history and replay. This reference describes the API implemented at the source revision above. It is intended for BetSymphony's engineering team and other integrators reviewing the current service.

This is a description of the current API, not a proposed replacement contract or a future-work document. Examples use synthetic identifiers and balances. The showcase uses synthetic credit; its login is separate from the operator API credentials described below.

Reading order and files

File Contents
Overview and quick start Service boundaries, authentication, units, launch flow and shared HTTP behavior
Client API SDK/Stake wallet edge, native sessions/play/recovery, interactive commands, history/fairness and multiplayer WebSocket protocol
Operator API Launch, account funding, game entitlements, API keys, responsible gaming, campaigns, reconciliation and dispute evidence
Signed wallet API External-wallet configuration, operator-hosted requests, signature framing, callbacks and recovery
Showcase and title catalog Current SDK title identifiers, modes, host separation and showcase lobby routes
RGS OpenAPI OpenAPI 3.1 description of RGS-hosted HTTP operations; import into an OpenAPI-compatible client
Operator-wallet OpenAPI Separate OpenAPI 3.1 contract for requests sent by the RGS to an operator-hosted wallet
Endpoint index Complete method/path inventory with authentication scopes
Complete field reference Every operation's parameters, required/optional fields, constraints, response codes and reusable models

The repository-root openapi.json is a supplied BetSymphony Platform API document. It is not the 232rgs API. The 232rgs specification is this directory's openapi.json.

1. Service boundaries

Operator / platform backend
  ├── Bearer operator API key ──> 232rgs /operator/v1/*
  │                               accounts, launch, entitlements, wallet administration
  └── delivers the game URL + launch token to the player's browser

Player's game client
  ├── SDK titles ──> 232rgs /wallet/* and /bet/event
  │                  sessionID in JSON; six-decimal integer amounts
  └── Native client ──> /v1/authenticate, then Bearer session token
                        /v1/* and /v2/*; currency-minor-unit integer amounts

External-wallet mode (separate from the showcase's custodial mode)
  232rgs ── signed HTTP requests ──> operator-hosted wallet
  operator-hosted wallet ── signed callbacks ──> /wallet/v1/callbacks/{operatorCode}

The two /wallet surfaces are different protocols: /wallet/authenticate is the browser-facing SDK adapter; /wallet/v1/callbacks/{operatorCode} is an Ed25519-signed server-to-server callback. They do not share authentication or money units.

Addresses

Surface Address / convention
Current showcase lobby https://232rgs-lobby.fly.dev — sign-in and game assets
Current showcase RGS https://232rgs.fly.dev — RGS API, synthetic-credit showcase
Reference examples https://rgs.example.invalid — intentionally non-routable placeholder, not another deployed environment
Operator-hosted wallet Operator connector endpoint; not the RGS host. See the signed-wallet chapter.
Multiplayer socket Same RGS authority, wss://<rgs-host>/v1/multiplayer

Use the exact API host rather than the lobby URL for RGS calls. The service does not return a complete frontend launch URL from /operator/v1/launch; it returns a token. Frontend hosting assembles the game URL.

HTTP conventions

2. Authentication

Credential Where it is used Transport
Operator API key /operator/v1/* Authorization: Bearer <operator-key>
Launch token Starts a native or SDK game session JSON launchToken for native authentication; JSON sessionID for SDK authentication
Native session token /v1/*, /v2/* after native authentication Authorization: Bearer <session-token>; WebSocket authentication frame for multiplayer
SDK session ID Browser /wallet/*, /bet/event JSON sessionID; no operator key in the browser
Wallet signing key External wallet responses and callbacks Ed25519 signature plus x-wallet-* headers; not a bearer token
Showcase login Separate lobby and game asset host Lobby lobby_session cookie, not a native RGS bearer

Operator keys and scopes

An operator key has the opaque form <key-uuid>.<secret>. Keys are operator-scoped. An expired, revoked, malformed, wrong-scope or suspended-operator key fails authorization. The HTTP API returns 401 OPERATOR_AUTHENTICATION_FAILED for these operator authorization failures, rather than a separate OAuth scope response.

The authorization header must start with the exact case-sensitive prefix Bearer. A missing header or wrong prefix returns 401 AUTHENTICATION_FAILED before the operator-specific key check.

Supported HTTP-issued scopes are keys, launch, wallet, campaigns, responsible-gaming, reconciliation, games and disputes. The OpenAPI operation extension x-operator-scope identifies the required scope. Keys are created by an already-authorized operator using /operator/v1/api-keys; this is not a public operator-registration API. Keep keys server-side. The key-management endpoint returns the new token once in its response.

Launch and session lifecycle

  1. The operator account/currency and game entitlement exist.
  2. The platform backend requests a launch token for its playerId, currency, gameCode and locale.
  3. The token expires after 300 seconds. A native first authentication consumes it once and creates a session pinned to the selected game version.
  4. Native authentication returns a distinct session bearer. SDK authentication binds the launch token as its browser sessionID; subsequent SDK calls reuse that binding.
  5. Sessions have an eight-hour upper bound, shortened by configured responsible-gaming session limits. Authorization also checks revocation, operator state, self-exclusion and pinned game-version availability.
  6. Native /v1/session/close revokes that native session. SDK /wallet/end-round acknowledges already settled presentation; it is not session logout.

Do not exchange the same launch token through both native and SDK authentication flows. Choose the flow used by that client.

3. Money and modes

Surface Representation of currency amounts
Native /v1/*, /v2/* Integer currency minor units
Operator account, transaction, campaign, reconciliation and external-wallet APIs Integer currency minor units, except fields explicitly returned as decimal strings by a reporting response
Browser /wallet/* Integers at six decimal places: one currency unit is 1_000_000
Game book event data Game-defined values; SDK book payout fields are not wallet balances

For EUR, a displayed 1.00 is native/operator 100, but SDK 1000000. Conversion is exact; do not pass a native 100 to the SDK edge expecting one euro. Currency syntax is three uppercase ASCII letters, but syntactic acceptance is not automatic game or currency support. The SDK conversion helper contains EUR, USD, GBP, CAD, AUD and CHF at two decimal places, and JPY/KRW at zero. The current SDK title configurations are constructed for two-decimal currencies; the showcase uses EUR.

Where an integer is a JSON number, it must remain within JavaScript's safe integer range, at most 9007199254740991. Positive amount requirements and additional game/account limits still apply. Do not silently round decimals into valid requests.

SDK base amount versus charged stake

POST /wallet/play receives the base amount, a mode, and the currency. The RGS applies the configured mode costMultiplier to calculate the debit. Payout is derived from the selected authored book using the base amount. The authoritative wallet amount in the response is balance.amount; the monetary payout is round.payout.

Example for a 1.25 ante mode: base amount 2000000 means EUR 2.00, while the charged stake is EUR 2.50 (native 250). The product must be representable in whole currency minor units. Unknown modes, currency/game mismatches and nonrepresentable charges are rejected. Read config.betLevels and config.betModes returned by authentication rather than inventing a universal bet menu.

SDK round.state contains the selected game's authored event sequence. Render it; do not use it to calculate or submit settlement. A payoutMultiplier or event amount is not interchangeable with six-decimal currency amounts. The current SDK one-shot edge settles during /wallet/play; /wallet/end-round does not issue another winning credit. A custodial round answers round.active: false. For a provider session (an external operator served through an adapter, such as BetSymphony) a win answers round.active: true although it is paid, and the next /wallet/play answers ERR_BE until the client calls /wallet/end-round (client-api.md). A stopped or refused wager on the browser routes is ERR_GE with HTTP 200, not the native API's 403 WAGER_NOT_ALLOWED.

Native play uses the pinned game's action contract. A native wager.amount is the charged wager amount, not a generic SDK base-amount alias. For book-backed slot games, the action encodes the mode and base minor amount (for example ante:200), while the wager contains the exact mode-adjusted charge. Do not mix the browser and native request schemas.

4. Server-to-server quick start

These are illustrative requests for a configured operator. They are not commands automatically executed against the showcase. RGS_API and OPERATOR_KEY below stand for the supplied API address and your server-side key; placeholders must be replaced with issued credentials through your normal secret management.

4.1 Create or retrieve the currency account

POST /operator/v1/accounts
Authorization: Bearer <operator-key>
Content-Type: application/json

{"playerId":"player-demo-001","currency":"EUR"}

The account is scoped by authenticated operator, external playerId and currency. Provisioning an account does not itself deposit funds. The route returns 201 on creation or 200 when returning an existing account.

4.2 Enable a game for the operator

PUT /operator/v1/games/fish_4_fish
Authorization: Bearer <operator-key>
Content-Type: application/json

{"enabled":true,"currencies":["EUR"]}

This updates the operator's entitlement to an already registered game. It does not upload or register game code. The static title identifiers are listed in the showcase chapter.

4.3 Fund a custodial account

POST /operator/v1/wallet/transactions
Authorization: Bearer <operator-key>
Content-Type: application/json

{"playerId":"player-demo-001","externalTransactionId":"demo-funding-001","kind":"deposit","amount":10000,"currency":"EUR"}

Use this only for the custodial account flow. externalTransactionId identifies the funding operation and must be retained for safe retry. Reusing it for a different operation conflicts. An external-wallet operator instead uses the separate signed-wallet protocol; the SDK showcase client operates in custodial mode.

4.4 Issue a launch token

POST /operator/v1/launch
Authorization: Bearer <operator-key>
Content-Type: application/json

{"playerId":"player-demo-001","currency":"EUR","gameCode":"fish_4_fish","locale":"en"}

Successful response shape (illustrative token placeholder):

{"launchToken":"<issued-launch-token>","expiresInSeconds":300}

Locale is implemented as two lowercase letters with an optional uppercase region, such as en or en-GB. Build a frontend URL using the returned token. SDK clients expect sessionID and rgs_url; the showcase additionally includes lang and lobby_url.

https://<frontend-host>/games/fish_4_fish/?sessionID=<url-encoded-launch-token>&rgs_url=<url-encoded-rgs-origin>&lang=en

4.5 SDK client authentication and play

POST /wallet/authenticate
Content-Type: application/json

{"sessionID":"<issued-launch-token>","language":"en","gameId":"fish_4_fish"}

Retain sessionID. Read the returned balance, configuration and any round data. The SDK then submits a permitted base amount:

POST /wallet/play
Content-Type: application/json

{"sessionID":"<issued-launch-token>","amount":2000000,"currency":"EUR","mode":"BASE","gameId":"fish_4_fish"}

Check both HTTP status and status.statusCode. Stake-compatible domain failures can be HTTP 200 with a non-SUCCESS status. A 200 alone is not successful play. After presenting the returned result, /wallet/end-round uses {"sessionID":"<issued-launch-token>"}.

Native alternative

A native client exchanges its own launch token at /v1/authenticate, then sends the resulting bearer to native endpoints. /v2/play uses a lowercase UUID-v4 commandId, action, wager and client seed. /v2/recover takes the same canonical body and ID and never creates absent work. See the client chapter for complete request and recovery rules.

5. Retry and settlement semantics

6. Shared errors, rate limiting and browser behavior

Most native/operator failures use {"error":"CODE"}. Validation failures can add details containing Zod issues. Some settlement and external-balance errors also carry a round or operation identifier. Exact endpoint responses are in the reference and OpenAPI.

HTTP General interpretation
400 Invalid body/parameters, conflicting field formats, invalid cursor or unrepresentable data
401 Missing/invalid session, operator authorization or signed callback authentication
402 Native external-wallet round was declined
403 New wager admission not allowed
404 Missing or out-of-scope resource; also a route not registered in that runtime configuration
409 Idempotency, identity, reconciliation or evidence conflict; replay mismatch has its own response envelope
413 Body larger than the RGS request limit
415 Unsupported request content type
422 Insufficient custodial funds or unavailable campaign
423 Responsible-gaming restriction or required reality-check acknowledgement
429 Rate limit; JSON error RATE_LIMITED, with retry/rate headers supplied by the limiter
500 Unhandled internal error (INTERNAL_ERROR)
502 External balance unavailable
503 Readiness or configured runtime/service unavailable

Requests are limited by client address until their credential verifies, then by the credential: 120 requests a minute per effective client IP for requests without a verified credential (none, or one that failed or was forged), shared across replicas; then a verified session counts 120 a minute per player, a verified operator key (a console user's key too) 1,200 a minute per key, and all verified requests from one address together at most 6,000 a minute. Browser wallet and native-game routes through the lobby relay keep the relayed budget (10,000 a minute per relay address, plus their per-session limits). A refusal is 429 RATE_LIMITED with retry-after; a shared limiter that cannot answer gives 503 RATE_LIMIT_UNAVAILABLE. Liveness and readiness are exempt, and metrics are on their own listener. Forwarded addresses are trusted only for configured trusted proxies. These are server limits, not a promised throughput SLA.

Wildcard browser CORS is installed only for the exact paths /wallet/authenticate, /wallet/balance, /wallet/play, /wallet/end-round and /bet/event. Those paths advertise GET,POST,OPTIONS and Content-Type, X-Api-Key, Authorization; preflight responds 204. The business operations themselves are POST, not GET. Native/operator routes and signed callbacks do not receive this wildcard CORS policy. Listing X-Api-Key in allowed CORS headers does not turn it into operator authentication: operator routes use a bearer.

7. Health and metrics

Method and path Authentication Response
GET /health/live None 200 {"status":"ok"}
GET /health/ready None 200 {"status":"ready"} or 503 {"status":"not_ready"}
GET /metrics No application credential Prometheus text (text/plain; version=0.0.4; charset=utf-8), when metrics are registered

Readiness checks PostgreSQL and the entrypoint's configured dependencies (including Redis and runtime/key coverage); the default readiness deadline is two seconds. Health does not identify an exact deployed source commit. /metrics is an operational surface, not a gameplay endpoint; its access boundary can be enforced by deployment networking.

8. Runtime availability and versioning

The normal service registers operator, custodial, campaign, responsible-gaming, one-shot client and multiplayer features. External connector configuration/execution routes are registered only when the external signing runtime is configured; interactive routes are registered only when the pinned interactive runtime is loaded. The OpenAPI includes these implemented conditional routes and describes their registration conditions. An absent conditional route returns the framework's 404, not a fabricated future API response.

SDK games are pinned to release catalog versions and math-library identities. A static title listing does not override operator entitlements or the authentication response. Sessions and accepted work retain their pinned game version. Public wire identifiers inherited from 23rgs are intentional compatibility identifiers.

This document's version is its source revision. Later code revisions can change the reference; the revision above remains the authority for this edition. Internal deployment tooling, database administration and the separate game-authority service are not additional operator-facing RGS HTTP endpoints.

Showcase service and SDK title catalog

Implementation: ed208c392fd33d563ed095cd5ffe95f474abda21 · 21 September 2026 · titles and lobby routes re-checked on 5 November 2026 (w21, 78cf205a)

Showcase hosts

The lobby is a separate authenticated web application, not the operator API. It uses a synthetic-credit account for each signed-in user. It provisions that account, applies its configured limits, credits it once using an idempotent funding identity, and requests ordinary RGS launch tokens server-side. Operator API keys are not sent to the browser.

The game frontend receives the RGS launch token in sessionID, the API origin in rgs_url, and presentation parameters lang and lobby_url. The game calls the SDK API documented in Client API. These are real persistent RGS rounds using synthetic balances, not calls to a BetSymphony wallet.

Current title identifiers

The list below is the static registry in games/sdk-slot/src/index.ts, not a claim that every game is entitled to every operator. Seven entries have version 1.0.2, Propagandalf 1.0.1. Use the exact catalog code for gameCode in operator launch requests and gameId in SDK play requests. Display titles, catalog codes and math package names are not interchangeable.

Display title Catalog code Math package ID SDK modes and base-cost multipliers
Cherry Dream cherry_dream cherry_dream BASE 1; GOLDEN_BOOST 3; WILD_VOLTAGE 200; GOLDEN_WILD_VOLTAGE 400
Malaga Midnight malaga_midnight malaga_midnight BASE 1
Coin Island magma-coin-rush magma_coin_rush BASE 1; BONUS_BUY 30; ULTRA_BONUS_BUY 75
Wild 4 Fish fish_4_fish fish_4_fish BASE 1; BONUS_1 10; BONUS_2 30; BONUS_3 50; BONUS_4 100; BONUS_RANDOM 50; ANTE 1.25
Meowbach Wilds meowbach_wilds meowbach_wilds BASE 1; BONUS 100; ANTE 1.25
Cherry Charge cherry_strike cherry_strike BASE 1; HOLD_AND_WIN 50; ENHANCED_BONUS 400
Money Bricks mega-clusters megaclusters BASE 1; ANTE 1.2; BONUS 100; BONUS_GRID 200
Propagandalf propagandalf propagandalf BASE 1

SDK mode lookup uppercases the incoming name; responses use the canonical upper-case mode. Library configuration must match the registered modes and costs. The game server selects the outcome; a client does not submit an outcome, payout or replacement math package through these APIs.

These SDK title configurations use two-decimal currencies. The normal display bet levels are 0.10, 0.20, 0.50, 1, 2, 5, 10, 20, 50, 100. For Wild 4 Fish and Meowbach Wilds, 0.10 and 0.50 are omitted because the 1.25× mode cannot charge those bases in whole minor units. This is reflected in each authentication response's six-decimal config.betLevels.

Always use the returned configuration and permitted amounts for the launched game. A title's catalog maximum payout is a book-unit policy, not a currency amount or a client settlement instruction. round.payout and balance.amount remain authoritative monetary outputs.

Lobby HTTP interface (separate host)

These routes belong to the showcase frontend service, not the RGS OpenAPI. No additional game-list or JSON launch API is implied.

Method and path Authentication Current response and behavior
GET /health/live None 200 JSON { "status": "ok", "lobby": true, "titles": <integer> }
GET /login None HTML sign-in form. An already signed-in visitor receives 303 to /. Optional next must be a local path beginning with /, not //; otherwise / is used. error=1 displays the sign-in failure notice.
POST /login Login form application/x-www-form-urlencoded fields username, password, optional next. Success sets the session cookie and returns 303 to next; invalid credentials return 303 to /login?error=1&next=.... JSON bodies are also parsed by Fastify, but the served form uses form encoding.
POST /logout No valid session required Clears lobby_session; 303 to /login.
GET / Lobby cookie HTML title-selection page.
GET /launch/{code} Lobby cookie Ensures the user's synthetic account, obtains a token through /operator/v1/launch, then 303 to the game URL. Unknown/unoffered code: 404 {"error":"NOT_FOUND"}. This GET has launch/account side effects; it is not a read-only catalog request.
GET /games/{code} Lobby cookie 301 to /games/{code}/.
GET /games/{code}/{assetPath} Lobby cookie Serves the game's index/assets, with content type selected from the extension. Empty asset path serves index.html; missing/disallowed paths return 404 {"error":"NOT_FOUND"}.

The lobby also serves GET /admin, POST /admin/{action}, GET /play/{code}, GET /bet/replay/{game}/{version}/{mode}/{event} and its own files under /lobby-assets/ (tools/demo-lobby.mjs); they are not documented here yet.

Lobby authentication and transport details

Operational observation for this edition

On 21 September 2026, a read-only request to https://232rgs.fly.dev/health/ready returned HTTP 200 with {"status":"ready"}. An unauthenticated non-HTML lobby request returned HTTP 401. These observations confirm those HTTP responses at the time checked; they do not bind the running image to the source revision. No login, launch, wager or wallet operation was performed against the public showcase while preparing this documentation.

Source: tools/demo-lobby.mjs, games/sdk-slot/src/index.ts, apps/rgs/src/main.ts, packages/core/src/stake-wallet-edge.ts.

232rgs client API

M0 implementation delta: History cursors, private interactive replay, live multiplayer entitlements, safe RG limits and request-time wallet destination policy supersede the affected behavior below. The generated reference (openapi.json, index.html and the PDF) is regenerated from the code (MAINTAINING.md).

Documented source: ed208c392fd33d563ed095cd5ffe95f474abda21 — bubblebeam11 (21 September 2026); re-checked against the routes on 5 November 2026 (w21, 78cf205a).

This chapter documents the client-facing routes registered by apps/rgs/src/app.ts and the WebSocket upgrade installed by apps/rgs/src/main.ts. The RGS serves 31 client HTTP operations: 26 native /v1 or /v2 operations and five browser wallet operations. The hand-written September fragment documents 23 of them; the other eight are GET /v2/state, GET /v1/free-rounds (free rounds), POST /v1/responsible-gaming/time-out (below), POST /v2/interactive/skip, GET /v1/interactive/rounds/{id}/replay, GET /v1/jackpots/{poolId}, GET /v1/engagement/tournaments/{id}/leaderboard and POST /v1/engagement/tournaments/{id}/participation, all in the endpoint index. The WebSocket is intentionally documented here as a protocol, not as a synthetic HTTP operation.

All JSON bodies are limited to 64 KiB. Invalid JSON or a failed request schema returns 400 {"error":"INVALID_REQUEST"}; oversized bodies return 413, unsupported media types return 415, and the limiter can return 429 {"error":"RATE_LIMITED"} with retry-after: 120 requests a minute per player once the session verifies, 120 a minute per client address before (README §6). Every native /v1 and /v2 request schema (body, query and path parameters) is strict: an unknown field is rejected with 400 INVALID_REQUEST. Since w21 that includes /v1/authenticate, legacy /v1/play and its wager, and the /v1/history query, which used to strip unknown fields; a route that takes no query parameters does not read the query. Browser wallet bodies explicitly pass unknown fields through, although only documented fields are used. Integer money must be a non-negative/positive JavaScript safe integer as required by the individual operation; do not send decimal JSON numbers.

Credentials, units, and registration

Session bearer

Native client routes that require a session use Authorization: Bearer <sessionToken>. Tokens issued by authentication are opaque base64url values. A valid session is active, unexpired, tied to an active/draining game version, belongs to an active operator, is not self-excluded, and is within the maximum-session limit. Rejection is 401 AUTHENTICATION_FAILED.

POST /v1/authenticate consumes a one-time launch token and returns the session token. Launch tokens are opaque, 43–128 characters at the HTTP boundary, and cannot be reused. Session tokens pass the same 43–128 character boundary check. Do not put either token in URLs or logs.

Money

Native /v1 and /v2 monetary fields (balance, wager.amount, payout, campaign grant amounts) are integer currency minor units. The game/account currency is a three-uppercase-letter code. The caller must use the session currency for a wager; game-specific configured limits decide which actions and values are accepted.

Browser wallet amounts use a separate integer six-decimal Stake scale. The adapter supports EUR, USD, GBP, CAD, AUD, CHF (two decimals) and JPY, KRW (zero decimals). Internal minor units × 10^(6 − currency decimals) = browser amount. Thus EUR 100 internal cents is 1,000,000; a EUR amount must be divisible by 10,000. Inputs that cannot be represented exactly return the browser protocol error ERR_GE, in an HTTP 200 response.

Conditional routes

The base app always registers authentication, balance, session close, and reality-check routes. The OpenAPI fragment marks optional registrations with x-registration-condition:

The production entrypoint supplies rounds, campaigns, responsible gaming, and multiplayer lobby. Interactive routes are installed only when an interactive runtime registry is available.

Native HTTP API

Establish and close a session

POST /v1/authenticate has no bearer authentication. Submit:

{"launchToken":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}

A successful custodial response is:

{
  "sessionToken":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
  "balance":2500,
  "currency":"EUR",
  "gameId":"8e94d65b-1205-48fe-b992-4d6bdce3764c",
  "walletMode":"custodial"
}

For an external-wallet operator, balance is null; currency and game ID remain present. A launch token is consumed atomically, so retrying after a lost success response cannot issue another session and returns 401.

GET /v1/balance returns { "balance": 2500, "currency": "EUR" } for a custodial session. With an external wallet, an approved provider lookup returns the same shape; an unknown or pending lookup returns 202 {"status":"unknown"|"pending","operationId":"uuid"} and an unavailable/declined lookup returns 502 {"error":"EXTERNAL_BALANCE_UNAVAILABLE","operationId":"uuid"}. POST /v1/session/close revokes the caller’s current active session and returns 204; repeating a close with that token is 401.

Reality checks and responsible gaming

GET /v1/reality-check returns due, nullable nextAt, and a non-negative integer elapsedSeconds. Acknowledgement is only valid when the check is due: POST /v1/reality-check/acknowledge returns { "nextAt": "2026-09-21T12:30:00.000Z" }; otherwise it is 401.

New wagers and room allocation are rejected with 423 {"error":"REALITY_CHECK_REQUIRED"} when a check is due. GET /v1/responsible-gaming returns every limit, using null for unset values. POST /v1/responsible-gaming/self-exclude accepts a date-time until between one day and five years from processing. It returns the resulting ISO timestamp and revokes all active sessions for the account; use the returned timestamp as the effective boundary, because a request may not shorten an existing exclusion.

Time-out: POST /v1/responsible-gaming/time-out takes the exact body {"period":"24h"|"7d"|"30d"|"42d"}. - Effect: it blocks every account of the player for that period and ends their sessions; it never shortens a longer block. - Response: the limits object, including selfExcludedUntil, timeOutUntil, playBlockedUntil (when play is allowed again) and pending (raised or removed limits waiting for their 24 hours, else null). - Self-exclusion also blocks every account of the player, including accounts opened later.

One-shot play and recovery

POST /v1/play is the legacy external-round-id interface. Its externalRoundId and nested wager.id are caller-controlled, 1–128 characters. The same external round ID under the same session must have an exactly identical canonical request (action, wager ID/amount/currency, client seed); an identical retry returns the durable result, while different content returns 409 ROUND_CONFLICT. It is session-bound, so use /v2 for recovery through a replacement session.

POST /v2/play is the client-command interface. Its required commandId is a lowercase UUIDv4. The command is account-scoped and game-scoped, and its payload is canonically hashed. Identical retries, including with a replacement session for the same account and game, return the original result without a second wager. A reused command ID with a changed action, wager, currency, or seed returns 409 ROUND_CONFLICT. Different command IDs are distinct wagers even if all other payload fields match.

POST /v2/recover never admits a new wager. It uses the same body as /v2/play, returns the accepted result when available, and returns 404 ROUND_NOT_FOUND if that account/game has no accepted command. It can recover accepted work after the accepting session expires or the operator stops accepting new work, provided the caller holds a suitable account/game session.

All successful one-shot plays return:

{
  "roundId":"6fb10568-605b-4662-8ebd-b85f24408a12",
  "payout":200,
  "balance":10100,
  "state":{"gameOwned":true},
  "fairness":{
    "commitment":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
    "serverSeed":"abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789",
    "algorithm":"hmac-sha256-v1"
  }
}

state is game-owned JSON and has no common fixed shape. A game can reject invalid action/wager configuration as 400; insufficient custodial funds are 422 INSUFFICIENT_FUNDS; admission policy, including a safety stop of any scope (global, operator, market and the rest) or a violated outcome-monitor model, is 403 WAGER_NOT_ALLOWED; a responsible-gaming monetary limit is 423 RESPONSIBLE_GAMING_LIMIT.

For external-wallet sessions, an accepted round may not yet be financially final: 202 ROUND_SETTLEMENT_PENDING includes roundId and an internal settlement status. A declined debit yields 402 EXTERNAL_WALLET_DECLINED. Retry the same accepted /v1 request or use /v2/recover; do not replace the identifier with a new wager. A credit rejection moves the accepted outcome to manual review rather than voiding it.

Round history, replay, and fairness

GET /v1/history?limit=20 returns most-recent-first account history. limit defaults to 20 and must be 1–100. The answer is {rounds, nextCursor, hasMore}: send nextCursor back as cursor (opaque, 1–512 characters) for the next page; it is null on the last one. settledAt is null until settlement. The current serializer emits a numeric payout in every history item, including an unsettled row.

GET /v1/rounds/{roundId}/fairness returns the persisted algorithm, draw ID, commitment, client seed, nonce (string), and revealed server seed for an owned round. A non-owned round or a round without an available revealed proof returns 404 ROUND_NOT_FOUND.

GET /v1/rounds/{roundId}/replay returns stored history plus verification. Verification is matched, mismatch, or unavailable. A mismatch is deliberately returned as HTTP 409 with the full replay body; unavailable verification is HTTP 200 and names REPLAY_INPUTS_UNAVAILABLE or REPLAY_RUNTIME_UNAVAILABLE. history.state, event payloads, stored result state, and recomputed state are game-owned JSON. Available verification includes compared, with boolean checks requestHash, transcript, result, payout, state, and commitment; missing-runtime verification can include its lookup key as gameVersion.

Campaign visibility and multiplayer room selection

GET /v1/campaigns returns grants already associated with the session account, newest first, as {grants, nextCursor}. Without limit or cursor it answers up to 100 grants, and 409 CAMPAIGN_PAGINATION_REQUIRED when the account has more; with limit (1–100, default 50) or cursor it pages, and nextCursor names the next page (an invalid cursor is 400 INVALID_CAMPAIGN_CURSOR). Each grant has grantId, campaignId, campaign code, integer amount, currency, and grantedAt.

POST /v1/multiplayer/room takes an empty object (or no body) and returns a waiting/running room for the session’s active multiplayer game version, such as {"roomId":"uuid","status":"waiting"}. A single-player or unavailable game is 404 MULTIPLAYER_GAME_UNAVAILABLE. It also requires a non-due reality check.

Interactive games

Interactive routes use native integer minor units and session bearer authentication. They expose a projection, never internal game state, seed, account ID, session ID, runtime configuration, or receipt records.

A projection contains fixed fields format: "interactive-player-v1", commandId, roundId, game, wager, sequence, complete, nextActions, cumulativePayout, settlementStatus, and nullable payout. settlementStatus is active, credit-owed, or settled: a complete round may be credit-owed until internal liability completion occurs. Runtime absence/identity mismatch is 503 INTERACTIVE_RUNTIME_UNAVAILABLE.

Browser wallet API

The five browser endpoints accept a body sessionID, rather than a bearer token. Browser-facing CORS permits all origins, GET, POST, OPTIONS, and Content-Type, X-Api-Key, Authorization; preflight receives 204. Unknown request properties are accepted at this boundary, but documented fields are the only ones used.

POST /wallet/authenticate either binds a fresh launch token as sessionID, or resumes an existing browser binding. language (2–16 characters) is remembered for an existing binding; gameId (1–128 characters) is accepted but does not select or validate a different game in the current implementation. It serves custodial operators, and external-wallet operators only through an adapter whose provider takes the session's money (docs/design/operator-adapters.md); any other external operator gets ERR_GE (external operator is not enabled). A successful response contains a six-decimal balance, config, and, if the persisted progress is active, a round.

{
  "sessionID":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "language":"en",
  "gameId":"coin-flip"
}
{
  "status":{"statusCode":"SUCCESS","statusMessage":"Success"},
  "balance":{"amount":25000000,"currency":"EUR"},
  "config":{
    "gameID":"coin-flip","minBet":100000,"maxBet":100000000,"stepBet":100000,
    "defaultBetLevel":1000000,"betLevels":[100000,200000,500000,1000000],
    "betModes":{"BASE":{"mode":"BASE","costMultiplier":1,"feature":false}},
    "jurisdiction":{"socialCasino":false,"disabledFullscreen":false,"disabledTurbo":false,"disabledSuperTurbo":false,"disabledAutoplay":false,"disabledSlamstop":false,"disabledSpacebar":false,"disabledBuyFeature":false,"displayNetPosition":false,"displayRTP":false,"displaySessionTimer":false,"minimumRoundDuration":0}
  }
}

POST /wallet/balance returns the currently bound session balance. POST /wallet/play requires a non-negative six-decimal amount, uppercase currency, non-empty mode, and optional game ID. Amount must become a positive aligned internal amount; a configured mode can apply an exact cost multiplier. The response uses the charged base amount in round.amount, the computed payout in round.payout, and all balance/payout fields use six decimals.

Free rounds (2026-10-24): POST /wallet/authenticate and a successful POST /wallet/play list the session's free rounds for this game and currency under freeRounds, soonest-ending first, up to 20. Each entry is {id, remaining, amount, mode, endsAt}, with amount in six decimals and mode BASE. The field is absent when there are none. - Playing one: send freeRoundId with /wallet/play, in that mode, at that amount. Nothing is charged, and the win is paid as the campaign's payout category. - Refusals (ERR_GE): a free round sent at another amount or mode is ERR_GE (free round unavailable for this play). An ended or used-up grant is ERR_GE with the engine's reason. - Operator set-up: an operator with an external wallet needs the free-rounds and free-rounds-external modules. Free rounds through a Tequity wallet are listed in tequity-wallet.md.

Current browser play generates its own round and client seed. It has no caller-provided command ID or client idempotency key. A client that loses a /wallet/play response cannot use that endpoint to prove which generated command was accepted; it must not blindly issue another play. One-shot browser play settles during /wallet/play; state is an event array when supplied by the game, otherwise an adapter-generated reveal/total/final-win array. - Custodial operators: every round answers round.active: false. - Provider sessions (an external operator served through an adapter, such as BetSymphony): a losing round answers round.active: false, but a win answers round.active: true although it is already paid. The next /wallet/play answers ERR_BE (player already has an active bet) until the client calls POST /wallet/end-round, which pays nothing more. The Stake web-sdk calls end-round after a win; a client of its own must do the same. - A play the edge never finished (a provider session whose wallet call is still pending, or whose answer was lost) is resumed by the next /wallet/authenticate: the same round and wallet calls, never a new wager. A play refused with an error status has ended and is never resumed.

POST /bet/event stores an opaque event cursor string (default "0") for existing progress and returns it. It does not submit an economic wager. POST /wallet/end-round returns a durable already-settled custodial result even after the normal session is unavailable, if the browser binding and matching settled round remain available; otherwise it authorizes the binding normally. It cannot authorize new play.

Browser protocol failures from the edge are deliberately HTTP 200, with both status and error:

{
  "status":{"statusCode":"ERR_GE","statusMessage":"invalid stake amount"},
  "error":{"code":"ERR_GE","message":"invalid stake amount"}
}

Codes are ERR_IS invalid session, ERR_IPB insufficient balance, ERR_GLE gambling/reality limit, ERR_BE active-bet or round conflict, ERR_BNF no tracked bet, ERR_GE invalid/game/wager problem (including a refused wager: a safety stop of any scope, a violated outcome-monitor model or RNG quarantine is ERR_GE wager is not allowed, where the native API answers 403 WAGER_NOT_ALLOWED), and ERR_UE when the round's or session's status cannot be known yet (a provider transaction still pending, the money path or control plane busy, or the provider session unavailable): reload or reconcile before retrying, never send a new wager. Browser routes can still return ordinary HTTP 400 for malformed transport input, 429 for rate limiting, or 500 for unhandled errors.

Multiplayer WebSocket protocol

Upgrade GET /v1/multiplayer to WebSocket; it is not an OpenAPI HTTP operation. In the production entrypoint, origin checking is required in production and compares the Origin exactly against configured allowed origins. A missing required or disallowed origin receives an HTTP 403 before upgrade. Non-production configurations may permit an absent origin, but a supplied origin must still belong to the allowed set.

The client must send one text JSON authentication message within 5 seconds (default):

{"type":"authenticate","sessionToken":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","roomId":"a3182b82-5d64-4d5e-aebc-4f9ef591b221","afterSequence":0}

afterSequence defaults to 0, must be an integer from 0 through Number.MAX_SAFE_INTEGER, and is used for both public and private recovery cursors. Binary frames are unsupported. Authentication failures send {"type":"error","error":"AUTHENTICATION_FAILED"} then close with code 4401; an unmet reality check similarly sends REALITY_CHECK_REQUIRED and closes because authentication did not complete. Authentication timeout also closes 4401.

On success, one or more snapshots are sent. A normal snapshot is:

{"type":"snapshot","roomId":"a3182b82-5d64-4d5e-aebc-4f9ef591b221","status":"waiting","state":{"phase":"ANTE"},"sequence":0,"events":[],"privateEvents":[]}

events contain {sequence,type,payload} where payload is game-owned public JSON; privateEvents contain {sequence,payload} and are only for the authenticated account. Recovery pages at most 1,000 public events. If more remain, the snapshot additionally includes currentSequence and hasMore: true; the transport continues pages internally until caught up. Catch-up is bounded: a cursor more than 1,000 events behind the room (the transport's maximumCatchUpEvents, default 1,000) is not replayed. The server sends one snapshot with the room's current state, its latest page of events (public and private) and historySkippedThrough, the last sequence that was not replayed. The client renders from state; a hidden-information client asks for its private view again (the tables client's look). Normal reconnects, up to the bound, replay every missed event.

After authentication, send command frames:

{"type":"command","clientCommandId":"join-1","command":{"roundId":"round-7","action":"main","wager":{"id":"wager-7","amount":1000,"currency":"EUR"},"params":{"clientSeed":"example-seed"}}}

Command frames are strict: no extra fields at the frame, command or wager level. clientCommandId, command.roundId and wager.id are 1–128 characters; command.action is 1–64. wager is optional; when present it requires id, positive safe-integer minor-unit amount, and three-uppercase-letter currency. Optional params is an arbitrary string-keyed JSON map. Currency must equal the session currency. The server responds {"type":"ack","clientCommandId":"join-1","sequence":42,"duplicate":false,"status":"accepted"}. Reusing the same ID with an identical payload returns the same sequence with duplicate:true; changing the payload returns COMMAND_CONFLICT. Command status is accepted, applied, rejected, expired, or cancelled. A wager is reserved/debited only when accepted before the room deadline; later commands may be acknowledged as expired.

A command the server refuses is answered {"type":"error","error":"<code>"} instead of an ack, and the socket stays open (only AUTHENTICATION_FAILED closes it, with 4401). The codes: INVALID_MESSAGE (a malformed frame, or a wager outside the game version's pinned limits), COMMAND_CONFLICT, ROOM_ACCESS_DENIED, REALITY_CHECK_REQUIRED, WAGER_NOT_ALLOWED (a safety stop of any scope, a violated outcome-monitor model, the operator's wager limits or a disabled game, or RNG quarantine: what the HTTP API answers as 403 WAGER_NOT_ALLOWED), RESPONSIBLE_GAMING_LIMIT, INSUFFICIENT_FUNDS (custodial wallet), EXTERNAL_WALLET_DECLINED (the operator's wallet declined the stake), EXTERNAL_WALLET_PENDING (the stake's debit is not resolved yet; resend the same clientCommandId, never a new one), EXTERNAL_WALLET_UNAVAILABLE (the operator's wallet connector is not usable; nothing was reserved), MONEY_PATH_BUSY and CONTROL_PLANE_BUSY (busy; resend the same command), and INTERNAL_ERROR for a fault only.

A session that stops passing authentication while connected (revoked, expired, self-excluded, its operator suspended or its game version retired) receives {"type":"error","error":"AUTHENTICATION_FAILED"} and is closed with 4401 within one session check: the transport re-checks the sessions of all its authenticated sockets in one batched query every RGS_MULTIPLAYER_SESSION_CHECK_MS milliseconds (the deployment setting; default 5,000, allowed 250 to 60,000, and the RGS refuses to start outside that range). Room events published inside that interval may still arrive. Every command also re-checks its session.

The same check re-checks room access. A socket whose room no longer admits its player receives {"type":"error","error":"ROOM_ACCESS_DENIED"} and is closed with 4401 within one check. That happens when the player's operator and the room's operator stopped sharing rooms and the player has no stake in flight there: a player with an accepted stake that is not yet settled keeps the room until it settles, and may send wagerless commands such as a cash-out, but no new stake (ROOM_ACCESS_DENIED). See docs/design/multiplayer-room-tenancy.md.

Live public delivery is {"type":"event","roomId":"uuid","sequence":43,"status":"running","broadcast":{...}}; private delivery is {"type":"private","roomId":"uuid","sequence":43,"payload":...}. These payloads are game-owned JSON. The server pings every 30 seconds by default and terminates a client that does not answer a subsequent ping. Defaults also limit frames to 64 KiB, 120 messages per 10 seconds, and 1 MiB buffered output. Limits are configurable at transport construction: rate excess closes 1008, delivery backpressure or live backlog closes 1013, and live-delivery failure closes 1011.

Current title registry

The pinned weighted SDK slot registry currently names eight titles: cherry_dream (Cherry Dream), malaga_midnight (Malaga Midnight), magma-coin-rush (Coin Island), fish_4_fish (Wild 4 Fish), meowbach_wilds (Meowbach Wilds), cherry_strike (Cherry Charge), mega-clusters (Money Bricks) and propagandalf (Propagandalf). Availability is still determined by the active pinned game version and runtime/library agreement, not this list alone. Browser configuration exposes only the version’s registered game code, configured bet levels, and modes.

Source identity: ed208c392fd33d563ed095cd5ffe95f474abda21 (September), re-checked against the routes on 5 November 2026 (w21, 78cf205a).

Operator management and custodial API

Source identity: ed208c392fd33d563ed095cd5ffe95f474abda21 (bubblebeam11, 2026-09-21). This chapter describes the routes registered by apps/rgs/src/app.ts and the return values of the current core services. It is not derived from the supplied BetSymphony Platform API specification.

Conventions

All operations use Authorization: Bearer <operator-api-key-token> and the parent document's OperatorBearer HTTP bearer security scheme. A token is keyId.secret; it is accepted only while its owning operator is active, the key is unrevoked and unexpired, and the key has the required scope (or *). A bad/missing bearer value, inactive operator, revoked/expired key, or missing scope produces 401 {"error":"OPERATOR_AUTHENTICATION_FAILED"}. Never log the returned key token or launch token.

Requests are JSON, and every operator request schema is strict: an unknown property is rejected (launch, campaign creation and campaign grants stripped it until w21). Invalid input, including a route constraint violation, is 400 {"error":"INVALID_REQUEST"}, with no details. The application body limit is 64 KiB (413 when exceeded); unsupported media types return 415. Rate limiting can return 429 {"error":"RATE_LIMITED"} with retry-after: each API key may make 1,200 requests a minute, and one client address 6,000 a minute across all its verified keys; a request whose key does not verify counts against the 120 a minute of its address instead (README §6). Unexpected failures are 500 {"error":"INTERNAL_ERROR"}.

Money values are JSON integer minor units, never decimal strings or floating-point major units, and are constrained to positive safe integers (1 through 9007199254740991) where an amount is accepted. Returned money is a JSON number (the runtime converts PostgreSQL numerics to Number); values are safe integers for the routes that enforce that bound. Currency is exactly three uppercase ASCII letters (^[A-Z]{3}$). UUIDs are canonical UUID strings unless noted. Timestamps are ISO-8601 strings emitted by Date#toISOString().

x-registration-condition in the fragment identifies the buildApp dependency condition that registers the route. The production entrypoint constructs operatorAuth, wallet, campaigns, and responsibleGaming; an embedding that omits an indicated dependency does not register that route.

Scopes and key lifecycle

The shared bearer parser requires the exact case-sensitive prefix Bearer. A missing header or wrong prefix returns 401 AUTHENTICATION_FAILED before operator-key validation. The operator-specific failure code above applies after that header parsing step.

The available route scopes are keys, launch, wallet, wallet-admin, campaigns, responsible-gaming, reconciliation, games, disputes, reports and verifier. The * scope authorizes every scope but is not accepted by the API-key creation route: that route accepts only the eleven named scopes (and not demo-lobby, the demo lobby routes' scope). Duplicate requested scopes are accepted and normalized to sorted, unique scopes in the persisted key; the returned create response intentionally does not echo scopes.

Create an API key — POST /operator/v1/api-keys (keys)

Body: label (required, non-empty string, at most 128 characters, no NUL), scopes (required array of 1–16 values from the scope list), and ttlSeconds (optional integer, 300–7,776,000; default 7,776,000 / 90 days). Success is 201 with {keyId, token, expiresAt}. token is returned only by this response. Creation against a non-active operator is 401 OPERATOR_AUTHENTICATION_FAILED. Where two people are required this route refuses with 409 TWO_PERSON_REQUIRED and the key is issued through api-key.create (Two-person changes below).

{"label":"operations-wallet","scopes":["wallet","reconciliation"],"ttlSeconds":3600}
{"keyId":"11111111-1111-4111-8111-111111111111","token":"<redacted-once-only-token>","expiresAt":"2026-09-21T12:00:00.000Z"}

Revoke an API key — DELETE /operator/v1/api-keys/{keyId} (keys)

keyId is required UUID path input. Success is 204 with no body. A key cannot revoke itself; a missing, already-revoked, inactive, expired, foreign, or self key is deliberately reported as 401 OPERATOR_AUTHENTICATION_FAILED, not as a resource-discovery response.

Game entitlement and launch

Set entitlement — PUT /operator/v1/games/{gameCode} (games)

gameCode matches ^[a-z0-9][a-z0-9_-]{1,63}$. Body is exactly {enabled, currencies}; enabled is required boolean, and currencies is a required array of 1–32 currency codes. Duplicate currencies are accepted and normalized to sorted unique values. Success 200 returns {gameCode, enabled, currencies}. Only an active game can be entitled; otherwise 404 {"error":"GAME_NOT_FOUND"}. Where two people are required, offering a game (enabled: true) refuses with 409 TWO_PERSON_REQUIRED and goes through game.entitlement (Two-person changes below); turning one off stays one key.

Create launch — POST /operator/v1/launch (launch)

Body requires playerId (1–256 characters, no NUL), currency, gameCode (same pattern as entitlement), and locale (^[a-z]{2}(?:-[A-Z]{2})?$, such as en or en-GB). Optional: brandId and marketId, both or neither (lowercase identifiers, 1–64 characters); countryCode (two uppercase letters); betLimitsOverride (below); and, for an operator an adapter serves, the casino's player token as playerToken or token (1–8,192 characters, no NUL; both at once is 400). Unknown properties are 400 INVALID_REQUEST. The account must belong to the operator and currency, the game must be active with an active version, and an enabled entitlement must include the currency. Otherwise return 404 {"error":"ACCOUNT_OR_GAME_NOT_FOUND"}. An unavailable selected version, or a game this server cannot serve, returns 409 {"error":"GAME_VERSION_UNAVAILABLE"}; a game over the operator's payout limit returns 409 {"error":"GAME_OVER_OPERATOR_PAYOUT_LIMIT"}. Success is 201 with a one-time {launchToken, expiresInSeconds:300}; each success creates a new launch token, so this operation is not idempotent.

On staging and real-money deployments, an operator in external wallet mode launches only after its wallet passed the verifier since its connector last changed (Back office, wallet verifier); otherwise 409 {"error":"WALLET_NOT_VERIFIED"}.

{"playerId":"player-042","currency":"EUR","gameCode":"heist-v2","locale":"en-GB"}

Opt-in session bet limits (C1 development contract)

POST /operator/v1/launch also accepts betLimitsOverride for explicitly pinned currency-bet-limits-v3 one-shot versions when the operator's session-bet-limits flag is enabled. The flag defaults OFF. The object is strict: optional minimum, maximum, default, maximumBonusBet (positive safe-integer minor units), maximumExposure (nonnegative safe integer), and bonusBuy (boolean). An empty object explicitly selects the version's unchanged bounds. Selected bounds must be consistent and can only tighten the immutable currency profile; the default must remain inside them, and exposure cannot fall below the version's maximum payout. No currency, payout, mode or math override is accepted.

The existing launch scope is required. launch.create audits the exact captured override, pinned immutably through the resulting session and each accepted round. Malformed, unsupported, widening or disabled-policy requests are refused; a v3 launch cannot become a playable session without this custody. BetSymphony's provider-specific launch currently rejects the field. This is per-launch tightening, not maker-checker authority to widen version policy or enable a module. Disabling the flag blocks new rounds but does not invalidate accepted retries or their replay. Legacy/v1/v2 launches omit the field and keep their existing policy. This contract is focused-tested C1 work, not a production activation or deployment.

Currency and market policy successors (C1 development contract)

V4 and V5 retain the same default-OFF session-bet-limits flag and launch custody. V4 requires a version-owned currency-policy-v1 registry (integer precision 0–8) and exact versioned rational FX snapshot. FX is reporting/display only; no wager, balance or settlement conversion occurs. Legacy currency precision cannot change. Native RGS authentication/replay exposes this pinned policy. The Stake edge refuses a currency it cannot represent exactly in its fixed six-decimal wire units.

V5 additionally requires betLimitsOverride.market with operatorId (the authenticated operator UUID), brandId, marketId (lowercase identifiers, 1–64 characters) and country (two uppercase letters). The selected version must have an exact operator/brand/market/currency profile; blocked countries and conflicting math-family scope refuse. This country is supplied by the authenticated launcher, not inferred from the browser or an IP-geolocation service. Other override fields still only tighten limits. Legacy/V1–V4 reject a market scope.

The profile pins features.autoplay, features.turbo and features.minimumSpinMilliseconds. Native V1/V2 and Stake play accept optional playOptions: { autoplay: boolean, turbo: boolean } (both required when present, no extra properties). Enabled options require V5 authority and become part of canonical retry identity; omitted options mean manual/normal play. This is declared-mode enforcement, not detection of undeclared client automation. Minimum-spin admission is database-clock-based across sessions for one account and game. Denial precedes RNG/provider dispatch. Stake configuration displays the pinned feature restrictions; native authentication/replay exposes market policy. Disabling the module refuses fresh play while accepted retries and cold recovery retain original currency/FX, limits, market and canonical-request pins.

Responsible-gaming limits

Set account limits — PUT /operator/v1/responsible-gaming/limits (responsible-gaming)

Body is exact and requires every field: playerId (1–256), currency, realityCheckIntervalSeconds (integer 60–86,400 or null), maxSingleWager, dailyNetLossLimit, and dailyDepositLimit (each positive safe integer or null), and maxSessionSeconds (integer 60–86,400 or null). null clears that limit. The response has the five values in force, plus these fields: - selfExcludedUntil and timeOutUntil (ISO timestamps or null); - playBlockedUntil: the later of the two, when play is allowed again on every account of the player; - pending: null, or {"limits": {…}, "effectiveAt": "<ISO>"}.

Raising or removing a limit takes effect 24 hours later, and until then it shows in pending. Lowering a limit applies at once and cancels a pending raise of the same limit. Setting limits never clears or shortens a block. A missing account is 404 {"error":"RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND"}.

Time out a player — POST /operator/v1/responsible-gaming/time-out (responsible-gaming)

The body is exact: playerId (1–256) and period, one of 24h, 7d, 30d or 42d; any other period is 400 {"error":"INVALID_REQUEST"}. - Effect: the time-out blocks every account of the player, including accounts opened later, and ends their sessions. It never shortens a longer block or a self-exclusion. - Audit: it is recorded in the operator audit log under the calling key. - Response: the limits object above. - Unknown player: 404 {"error":"RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND"}.

Custodial accounts and transactions

These endpoints are registered only with the custodial wallet dependency. Create an account before posting a transaction. Custodial transaction externalTransactionId is the idempotency identity within the operator, not an HTTP header.

Provision account — POST /operator/v1/accounts (wallet)

Exact body: playerId (1–256) and currency. Success is 201 for a new account and 200 when the same operator/player/currency account already exists. Both return {id, created, balance, currency}. Provisioning is idempotent for that tuple.

Post transaction — POST /operator/v1/wallet/transactions (wallet)

Exact body: playerId (1–256), externalTransactionId (1–256), kind (deposit or withdrawal), positive safe-integer amount, and currency. The account must exist or the response is 404 WALLET_RESOURCE_NOT_FOUND. A completed retry with the same operator, transaction ID, account, kind, amount, and currency returns the original 200 result. Reusing the ID with any different identity, retrying a non-pending/non-completed record, self-excluded deposit, or deposit exceeding a configured daily deposit limit returns 409 WALLET_TRANSACTION_CONFLICT. Insufficient withdrawal funds is 422 INSUFFICIENT_FUNDS. Success is always 200, {id, externalTransactionId, kind, amount, currency, status, balance}; status is normally completed, and balance may be null only if a stored transaction has no balance-after value.

Look up transaction — GET /operator/v1/wallet/transactions/{externalTransactionId} (wallet)

The required path value is 1–256 characters and is tenant scoped. It returns the same transaction shape on 200; missing/foreign IDs return 404 WALLET_RESOURCE_NOT_FOUND.

{"playerId":"player-042","externalTransactionId":"dep-20260921-00042","kind":"deposit","amount":2500,"currency":"EUR"}
{"id":"22222222-2222-4222-8222-222222222222","externalTransactionId":"dep-20260921-00042","kind":"deposit","amount":2500,"currency":"EUR","status":"completed","balance":2500}

Custodial reconciliation

Current scan — GET /operator/v1/reconciliation (reconciliation)

Returns {clean, accounts, mismatches}. accounts is the number of the operator’s accounts. mismatches is an array of runtime query objects with accountId, playerId, currency, storedBalance, and ledgerBalance; the PostgreSQL query returns storedBalance and ledgerBalance as strings, despite other custodial money responses using numbers. This is the current external shape and must not be normalized by clients.

Create run — POST /operator/v1/reconciliation/runs (reconciliation)

Accepts only an empty body (or no body). Success 201 returns a full reconciliation run. A successful run is completed; it snapshots every stored-vs-ledger mismatch into cases. The service may persist a failed run internally when an execution failure occurs, but the HTTP call propagates the failure rather than returning that failed record.

Get run — GET /operator/v1/reconciliation/runs/{runId} (reconciliation)

runId is required UUID. Returns the same full run on 200; missing/foreign runs return 404 WALLET_RESOURCE_NOT_FOUND.

A run is {id,status,accountsChecked,mismatchCount,createdAt,completedAt,cases}. Each case is {id,accountId,playerId,currency,storedBalance,ledgerBalance,delta,status,reasonCode,resolutionNote,ledgerEntryId}. completedAt, reasonCode, resolutionNote, and ledgerEntryId are nullable. Current persisted run statuses are running, completed, failed; normal completed-run case statuses are open, pending_resolution, or resolved.

Request a resolution — POST /operator/v1/reconciliation/cases/{caseId}/resolution-requests (reconciliation)

caseId is UUID. Exact body requires reasonCode (legacy_opening_balance, operator_wallet_confirmed, or data_repair) and note (10–2,048 characters, no NUL; the same rule holds for the reopen and drawn-review notes). Returns the updated case on 200. The first call transitions an open case to pending_resolution; an exact retry by the same requesting key with the same reason and note returns that pending case. Missing/foreign cases return 404 WALLET_RESOURCE_NOT_FOUND; a different retry or unsuitable state is 409 RECONCILIATION_CONFLICT.

Approve a resolution — POST /operator/v1/reconciliation/cases/{caseId}/approve (reconciliation)

caseId is UUID; body must be empty/omitted. Returns the resolved case on 200, creating a reconciliation ledger entry. The approver must be a different API key from the requesting key; the stored/ledger snapshot must still match. A repeat by the same key that already resolved it returns the case. Missing/foreign cases are 404 WALLET_RESOURCE_NOT_FOUND; self approval, stale snapshot, an already-balanced case, or another invalid state is 409 RECONCILIATION_CONFLICT.

Campaigns and grants

Create campaign — POST /operator/v1/campaigns (campaigns)

Requires code and gameCode matching ^[a-z0-9][a-z0-9_-]{1,63}$, currency, positive safe-integer budget, and ISO startsAt/endsAt timestamps. Unknown body properties are 400 INVALID_REQUEST. The game must be active or the response is 422 CAMPAIGN_UNAVAILABLE. The API does not impose an ordering check between startsAt and endsAt beyond database constraints. Success 201 returns only {id}.

Grant campaign funds — POST /operator/v1/campaigns/{campaignId}/grants (campaigns)

campaignId is UUID. Requires playerId (1–256, no NUL), positive safe-integer amount, and idempotencyKey (1–256, no NUL); unknown properties are 400 INVALID_REQUEST. A grant is accepted only for an active, currently in-window campaign, within remaining budget, to an existing account in the campaign currency. Any of those failures, including a same key with a different amount, is 422 CAMPAIGN_UNAVAILABLE. A new grant is 201; an equivalent idempotent retry is 200. Both return {created, balance, grantId}.

Set campaign status — PUT /operator/v1/campaigns/{campaignId}/status (campaigns)

campaignId is UUID. Exact body {status} where status is active, paused, or ended. Valid transitions are active→paused, paused→active while endsAt is still future, and active/paused→ended. Success 200 returns {id,status}. A missing/foreign campaign, no-op, expired resume, or invalid transition is 422 CAMPAIGN_UNAVAILABLE.

Two-person changes

Free-round campaigns, budget campaigns, tournaments, jackpot pools and memberships, the operator's wallet configuration, new API keys and game offers can need two people (MASTER-PLAN H2).

The same change goes through a request and a second person's decision. These routes work whether or not two people are required, and they are the console's LiveOps requests and decisions (Back office, Two-person changes):

Who can propose and approve. A key bound to an enrolled person. The platform owner binds keys to people (migration 113); the running RGS cannot. - The maker and the approver must be different people, and the maker must still be enrolled when the decision is made. - Refusals are CHANGE_REFUSED with a message: - 403: the key is not bound to an enrolled person, lacks the action's scope, or the approver made the change; - 404: unknown change; - 409: already decided, expired, wrong confirm, the maker no longer enrolled, or the module refuses the change now; - 400: invalid terms, or an approval whose echo is missing or does not match the change (nothing is recorded, and the request stays pending).

Every route's class (one key, two people, maker-checker step, or still one person) is listed in test/unit/route-classification.test.ts, which fails when a route is added without one.

Dispute evidence for external wallet operations

GET /operator/v1/disputes/wallet-operations/{operationId} (disputes) is tenant-scoped evidence lookup for an external-wallet operation record. It is included here because it is an operator route; configuration and execution of external-wallet operations are documented separately. operationId is UUID and is canonicalized to lowercase before lookup. Missing and foreign IDs intentionally both return 404 {"error":"NOT_FOUND"}.

Optional query parameters are strict: collection is one of callbacks, conflicts, reconciliation, audit, actionAudit; limit is an integer 1–100 (default 50); cursor is a canonical base64url cursor and requires collection. Invalid query/cursor is 400 INVALID_DISPUTE_CURSOR. A coherent response is 200 with {operation,terminalEvidence,roundLink,counts,integrity:{status:"coherent"},collection}. collection is null unless requested. Its page has {name,items,nextCursor,truncatedByBytes}. Pages are capped at 8 MiB; each item is capped at 3 MiB; the core is capped at 4 MiB. Oversize core/item returns respectively 409 DISPUTE_EVIDENCE_TOO_LARGE or 409 DISPUTE_EVIDENCE_ITEM_TOO_LARGE. Any ownership, linkage, or audit-snapshot inconsistency returns 409 DISPUTE_EVIDENCE_INTEGRITY_MISMATCH without leaking foreign identifiers.

The persisted operation.request, terminal response, callback payload, conflict response, audit actor/snapshots, and action-audit metadata are arbitrary JSON objects from their stored records and remain intentionally unconstrained. rawBodyBase64 is standard base64 text. The fragment fully types the stable envelope and each known collection item shape.

Source identity: ed208c392fd33d563ed095cd5ffe95f474abda21 (bubblebeam11, 2026-09-21). This chapter covers 17 paths / 17 operations: every /operator/v1/* route current at that source except /operator/v1/wallet/signing-keys* and /operator/v1/external-wallet*. The RGS now serves 97 /operator/v1/* operations; the endpoint index lists every one. Re-checked against the routes on 5 November 2026 (w21, 78cf205a).

Signed RNG draw-log export (R10)

GET /operator/v1/rng/draw-log?from=<ISO timestamp>&to=<ISO timestamp> requires a reports-scope operator key. The key determines ownership; callers cannot supply an operator ID. The half-open window uses draw creation time, with up to six fractional digits. The streaming NDJSON contains every financially attributed draw visible in the request's snapshot, including explicit unsigned and invalid records. It never exports a server seed.

Save the entire response and verify it offline with node --import tsx tools/verify-rng-draw-log.ts draws.ndjson trusted-roots.json. Provision the public root map independently. The final signature authenticates the header, every ordered record and the count; HTTP 200 without a valid footer is incomplete. Exit 0 means all draws verify, 2 means unsigned history only, and 1 means an invalid file or draw. A valid empty window is signed too. Split windows that exceed the ten-minute export deadline; one export per process is admitted.

See the file format and trust boundary, the operation contract, and the complete endpoint index. This addition is separate from the older chapter source identity above.

Wallet mode approvals require echo.target to match the mode. Connector approvals require the exact case-sensitive endpoint URL in echo.target. See the wallet chapter for direct PUT bodies and scope migration.

Signed external-wallet API (current transport)

M0 implementation delta: History cursors, private interactive replay, live multiplayer entitlements, safe RG limits and request-time wallet destination policy supersede the affected behavior below. The generated reference (openapi.json, index.html and the PDF) is regenerated from the code (MAINTAINING.md).

This document describes the custom signed-wallet transport wired in 232rgs at source commit ed208c392fd33d563ed095cd5ffe95f474abda21, re-checked against the routes on 5 November 2026 (w21, 78cf205a). The BetSymphony transport module is dormant, not an active 232rgs API. packages/adapters/betsymphony/src/betsymphony-transport.ts is therefore not used by this connector; do not use the repository's root openapi.json or BetSymphony routes for this connector.

Boundary and route ownership

Surface Owner Routes covered here
RGS-hosted signed callback and operator control API 232rgs POST /wallet/v1/callbacks/{operatorCode}, POST|DELETE /operator/v1/wallet/signing-keys*, and all operator/v1/external-wallet* routes listed below
Operator-hosted external wallet Operator POST /wallet/v1/operations and GET /wallet/v1/operations/{operationId}; the configured connector endpoint is the base operation URL
Browser-facing Stake adapter 232rgs, different protocol /wallet/authenticate, /wallet/balance, /wallet/play, /wallet/end-round, /bet/event; these are not signed-wallet routes and are not specified here

The callback has no wildcard CORS. The RGS operator routes require an Authorization: Bearer <operator token> possessing the wallet-admin scope. The callback instead uses the registered Ed25519 public key. The outbound RGS signing private key is separately configured by RGS_WALLET_SIGNING_KEY_ID and RGS_WALLET_SIGNING_PRIVATE_KEY_FILE; if either is absent, the outbound connector routes are not registered.

RGS-hosted paths

There are 8 path items / 8 operations in the inbound fragment:

  1. POST /wallet/v1/callbacks/{operatorCode} — signed finalization or balance statement callback.
  2. POST /operator/v1/wallet/signing-keys — register an operator Ed25519 public key.
  3. DELETE /operator/v1/wallet/signing-keys/{keyId} — revoke an unbound active key.
  4. GET /operator/v1/external-wallet/reconciliation/runs/{runId} — retrieve a reconciliation run generated by a balance statement.
  5. PUT /operator/v1/external-wallet/mode — select custodial or external settlement.
  6. PUT /operator/v1/external-wallet/connector — set the operator endpoint and expected response signing key.
  7. POST /operator/v1/external-wallet/operations — submit one durable external-wallet command through RGS.
  8. GET /operator/v1/external-wallet/operations/{operationId} — retrieve a stored external-wallet command result.

openapi.json includes their formal schemas, assembled from fragments/wallet.json. This chapter does not cover the unrelated RGS /operator/v1/wallet/transactions or browser /wallet/* APIs.

Two people (MASTER-PLAN H2, migration 247). Registering a signing key (2), the mode (5) and the connector (6) change where the operator's money calls go and which answers are trusted. Where two people are required (module two-person-changes, an option the RGS operator sets per operator), those three routes refuse with 409 {"error":"TWO_PERSON_REQUIRED","action":"wallet.signing-key" | "wallet.mode" | "wallet.connector"}. - The same changes then go through POST /operator/v1/changes with the configuration fields (without echo) as terms, and a decision by a different enrolled person (Operator API, Two-person changes). - Both keys need the wallet-admin scope and must be bound to enrolled people. - Approval applies the terms then, under the approver's key, with the same checks as the route. If they cannot apply now (no such active response key, no active connector for external, a validity window that has passed), the approval is refused with 409 CHANGE_REFUSED and the request stays pending. - Revoking a key (3) stays one key, so a leaked key can be revoked at once.

Callback wire protocol

Request

POST /wallet/v1/callbacks/{operatorCode} accepts only Content-Type: application/vnd.23rgs.wallet-callback+json. The Fastify parser preserves the received UTF-8 bytes as a buffer before JSON parsing. The body limit is 64 KiB. The path parameter matches ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$.

Required headers:

Header Exact value
X-Wallet-Key-Id Registered key ID matching ^[A-Za-z0-9._-]{1,128}$
X-Wallet-Timestamp Exactly 10 decimal ASCII digits: Unix seconds
X-Wallet-Message-Id UUID
X-Wallet-Signature Base64url, unpadded Ed25519 signature: exactly 86 characters in [A-Za-z0-9_-]

The exact signed byte sequence is:

ASCII(X-Wallet-Timestamp) || 0x2e || ASCII(X-Wallet-Message-Id) || 0x2e || exact received request-body bytes

There is no JSON canonicalization, whitespace normalization, newline addition, URL decoding, or reserialization. A callback must sign the bytes sent on the wire. The RGS verifies Ed25519.verify(null, signedBytes, registeredSpkiPublicKey, decodedSignature).

The timestamp must be a safe integer and within ±30 seconds of RGS wall-clock time. The selected active key is additionally checked at the callback timestamp: notBefore <= timestamp < expiresAt; suspended operators and revoked keys fail authentication.

The body is a strict tagged union. These are synthetic valid shape examples; callback timestamps must be fresh when actually sent:

{
  "type": "transaction.finalized",
  "operationId": "11111111-1111-4111-8111-111111111111",
  "externalTransactionId": "synthetic-wallet-transaction-001",
  "status": "approved",
  "amount": 125,
  "currency": "EUR",
  "balance": 9875
}

or

{
  "type": "balance.statement",
  "statementId": "synthetic-statement-001",
  "asOf": "2026-09-21T12:00:00.000Z",
  "balances": [
    { "playerId": "synthetic-player-42", "currency": "EUR", "balance": 9875 }
  ]
}

A statement has 1–10,000 balance rows, no extra fields, no duplicate (playerId, currency) tuple, and asOf must be no more than 300 seconds old and no more than 30 seconds in the future. statementId, externalTransactionId and playerId are 1–256 characters with no NUL (400 INVALID_REQUEST otherwise, since batch fin). Amount is a positive safe integer; balance is non-negative. Transaction status is approved, declined, reversed or manual_review; reversed is persisted as operation status cancelled and is valid only for a cancel operation.

Callback response

A first accepted callback returns 202 and a byte-identical replay (same operator, message ID, signing-key record, and SHA-256 of raw body) returns 200. The response is:

{
  "id": "22222222-2222-4222-8222-222222222222",
  "messageId": "33333333-3333-4333-8333-333333333333",
  "status": "processed",
  "duplicate": false
}

A newly processed callback has status: "processed"; a replay of a callback whose signed evidence was already retained as a conflict can return status: "manual_review" with duplicate: true. reconciliationRunId is omitted rather than null for a transaction callback; it is preserved on an exact statement replay. A reused message ID with another signing key or different raw-body hash returns 409 WALLET_CALLBACK_CONFLICT.

For a finalization, RGS requires the operation and currency to match, then validates the exact amount. debit, credit, and cancel are eligible; a cancel derives its expected amount from the original approved debit. A callback with a matching existing terminal tuple (mapped status, externalTransactionId, balance, currency) is accepted as separate signed evidence. A different terminal tuple is retained as conflict evidence, changes the operation and callback to manual_review, and returns 409. A remote transaction ID is unique per operator: a second operation claiming it is retained as signed conflict evidence, the losing operation becomes manual_review, and the callback returns 409. The same remote ID may be used by another operator.

Authentication failures (bad media/body framing, inactive key/operator, stale timestamp, invalid signature) return 401 WALLET_CALLBACK_AUTHENTICATION_FAILED; syntactic parse/validation failures return 400 INVALID_REQUEST; unhandled failures return 500 INTERNAL_ERROR.

Outbound operator-hosted wallet protocol

operator-wallet.openapi.json is a standalone OpenAPI 3.1 document with 2 paths / 2 operations. Its server is the required non-routable placeholder https://operator-wallet.example.invalid; replace it operationally by configuring PUT /operator/v1/external-wallet/connector, not by treating the placeholder as a live service.

The connector endpoint must be HTTPS and must not contain username/password. HTTP is accepted only for loopback 127.0.0.1, localhost, or ::1 forms used by local tests. RGS POSTs to the configured endpoint. For recovery it strips query/hash and appends /{operationId} to the configured endpoint path.

Outbound request

For POST /wallet/v1/operations, the strict JSON request is:

{
  "version": 1,
  "operationId": "11111111-1111-4111-8111-111111111111",
  "kind": "debit",
  "playerId": "synthetic-player-42",
  "currency": "EUR",
  "amount": 125
}

amount is required and positive only for debit/credit; it is absent for cancel/balance. originalOperationId is required only for cancel, and absent otherwise. A cancel must reference an approved matching non-round debit; game outcomes cannot be cancelled by this route. The body has no extra keys.

Required request headers are Content-Type: application/vnd.23rgs.wallet-operation+json, X-Rgs-Key-Id, X-Rgs-Timestamp, X-Rgs-Operation-Id, and X-Rgs-Signature. The operation ID in the header equals the body field; the timestamp appears only in the header/signature prefix. RGS signs:

ASCII(X-Rgs-Timestamp) || 0x2e || ASCII(X-Rgs-Operation-Id) || 0x2e || exact outbound JSON bytes

For GET /wallet/v1/operations/{operationId}, RGS sends Accept: application/vnd.23rgs.wallet-operation+json and the same four X-Rgs-* signature headers, but signs only ASCII(timestamp) || '.' || ASCII(operationId) || '.'; there is no request body.

Signed operator response

Both operator endpoints must return HTTP 200 with a content type starting with application/vnd.23rgs.wallet-operation+json, strict JSON body, and:

Header Exact requirement
X-Wallet-Key-Id The configured active responseKeyId
X-Wallet-Timestamp 10 decimal Unix-second digits, within ±30 seconds of RGS time
X-Wallet-Operation-Id Exact requested operation UUID
X-Wallet-Signature Exactly 86 base64url characters; decoded length 64 bytes

RGS verifies the response with the public key registered under responseKeyId over:

ASCII(X-Wallet-Timestamp) || 0x2e || ASCII(X-Wallet-Operation-Id) || 0x2e || exact response-body bytes

The strict response body is:

{
  "operationId": "11111111-1111-4111-8111-111111111111",
  "status": "approved",
  "remoteTransactionId": "synthetic-wallet-transaction-001",
  "currency": "EUR",
  "balance": 9875
}

Response status is approved or declined; remoteTransactionId is 1–256 characters. Currency and operation ID must match the request; balance is a non-negative safe integer. No response fields may be added. The response limit is 256 KiB by default.

Durability, duplicate, unknown, and manual review

RGS stores the outgoing request before its first network attempt. Repeating the same operationId with byte-identical derived request returns the stored result with duplicate: true and does not retransmit; a different request using that ID returns 409 EXTERNAL_WALLET_CONFLICT.

A valid direct response makes the stored status approved or declined. A timeout, transport failure, non-200 response, invalid content type, invalid signature/timestamp/identity/body, or oversized response produces a stored unknown result rather than a blind financial retry. By default the RGS runtime outbound deadline is 2,000 ms and the worker recovery client's 5,000 ms; RGS_WALLET_TIMEOUT_MS sets either, from 50 ms up to (not including) the 30,000 ms recovery lease. The service accepts configured deadlines only from 50 through 30,000 ms. A pending operation becomes eligible for lookup recovery after max(60,000 ms, 2 × request timeout); unknown operations are recovered by signed GET, never by re-sending the POST.

Recovery has a 30-second lease by default, up to 10 attempts by default, exponential retry scheduling capped at 300 seconds, and a failed operation becomes manual_review after the configured maximum (permitted range 1–100). A signed terminal response that disagrees with preserved terminal evidence, or a duplicate remote transaction ID within the operator, is retained as evidence and results in manual_review; RGS fails the current caller with 409. manual_review is not a successful approval and has no automatic replacement request. pending is the internal claimed-before-transport state; API callers see the result after the method completes, normally approved, declined, unknown, or conflict.

Signing and verification example

The following Node.js example creates fresh keys at runtime; it has synthetic public identifiers and no fixed private secret. It signs actual bytes and verifies those same bytes.

import { generateKeyPairSync, sign, verify } from 'node:crypto';

const { privateKey, publicKey } = generateKeyPairSync('ed25519');
const timestamp = '1767225600';       // synthetic 10-digit Unix-second test value
const operationId = '11111111-1111-4111-8111-111111111111';
const payload = {
  version: 1,
  operationId,
  kind: 'debit',
  playerId: 'synthetic-player-42',
  currency: 'EUR',
  amount: 125
};
const raw = Buffer.from(JSON.stringify(payload), 'utf8');
const signingBytes = Buffer.concat([
  Buffer.from(`${timestamp}.${operationId}.`, 'ascii'),
  raw
]);
const signature = sign(null, signingBytes, privateKey).toString('base64url');

const headers = {
  'content-type': 'application/vnd.23rgs.wallet-operation+json',
  'x-rgs-key-id': 'synthetic-rgs-key-2026',
  'x-rgs-timestamp': timestamp,
  'x-rgs-operation-id': operationId,
  'x-rgs-signature': signature
};

if (!verify(null, signingBytes, publicKey, Buffer.from(headers['x-rgs-signature'], 'base64url'))) {
  throw new Error('signature did not verify');
}

For a callback, substitute timestamp.messageId. as the ASCII prefix and concatenate the received callback body buffer; for a signed wallet response, substitute responseTimestamp.operationId. and concatenate the exact response buffer.

Key lifecycle

POST /operator/v1/wallet/signing-keys accepts only Ed25519 SPKI PEM public keys. If omitted, notBefore defaults to now minus 30 seconds and expiresAt defaults to 90 days after notBefore. Explicit activation must be between five minutes in the past and seven days in the future. Expiry must be at least five minutes after max(now, notBefore) and no later than 90 days after notBefore. The create response omits notBefore and expiresAt when both were omitted, although the server stores the defaults.

Posting the same active key ID with the same normalized public key and compatible supplied validity is idempotent (200); a different key, status, or supplied validity conflict is 409. Delete marks an active key revoked (204); it is 404 if absent/already revoked and 409 if it is the active response key bound to an active connector. Rotate by register/configure a new active response key first, then remove the old unbound key. The connector update atomically validates that the selected response key is active at configuration time.

Source quirks retained deliberately

Cashier/admin separation and typed configuration

The routes in this chapter require wallet-admin; wallet remains cashier-only (accounts, custodial transactions and wallet.adjust). Migration 276 grants existing wallet keys both halves once; newly issued keys receive only their requested scopes. Existing expiry/revocation remains effective.

Direct PUT /operator/v1/external-wallet/mode takes {"mode":"external","echo":{"target":"external"}}. Direct PUT /operator/v1/external-wallet/connector takes {"endpoint":"https://wallet.example/operations","responseKeyId":"wallet-1","echo":{"target":"https://wallet.example/operations"}}. The connector echo is case-sensitive. Missing/wrong echoes return 400. These direct routes still refuse with TWO_PERSON_REQUIRED where enabled; proposal terms omit echo, and the approver supplies it with decision and confirm.

Complete RGS HTTP endpoint index

Source: 3f5afad7d77668ee5b47e72140086514d76b9418. 204 method/path operations: every route the RGS serves with every optional module configured, read from the code (tools/routes.ts) and matched exactly against OpenAPI. /metrics is on the separate metrics listener. Routes that need a module or dependency carry x-registration-condition in the OpenAPI document. PSEI (module P) is proprietary and not listed. Automatic HEAD handling and the five SDK CORS preflights are protocol behavior, not extra business operations. The multiplayer socket and separate showcase routes are described in their chapters.

Method RGS-hosted path Authentication / scope Purpose
POST /bet/event Stake session id (sessionID) in the body client_betEvent
GET /game-launch The provider's launch token in the query BetSymphony: provider launch (alias path); 303 redirect to the game
GET /health/live None Process liveness
GET /health/ready None Dependency readiness
GET /integrations/betsymphony/launch The provider's launch token in the query BetSymphony: provider launch; 303 redirect to the game
POST /integrations/betsymphony/session BetSymphony launch token and player token in the body BetSymphony: complete a launch with the player token; answers the game URL
GET /metrics None Prometheus metrics
GET /operator/console None Console: redirect to /operator/console/
GET /operator/console/ None Console: the single-page application
GET /operator/console/api/activity Console / activity Console: action log ('keys' scope)
GET /operator/console/api/activity.csv Console / activity Console: action log as CSV ('keys' scope)
GET /operator/console/api/alerts Console / reports Console: alerts
GET /operator/console/api/changes Console / users Console: LiveOps change requests (and console user changes, for admins)
POST /operator/console/api/changes Console / liveops Console: propose a LiveOps or console user change
POST /operator/console/api/changes/{changeId}/decision Console / liveops Console: approve or reject a change; approving needs a fresh authenticator code
GET /operator/console/api/fx/rates Console / reports Console: FX source freshness, active observations and quarantined candidates
GET /operator/console/api/games Console / reports Console: enabled operator games and development test-play availability
POST /operator/console/api/games/play Console / users Console: launch a fresh funded development test session
GET /operator/console/api/liveops Console / liveops Console: LiveOps report
GET /operator/console/api/liveops-games Console / liveops Console: games LiveOps changes can name
GET /operator/console/api/liveops.csv Console / liveops Console: LiveOps report as CSV
POST /operator/console/api/login Console username, password and code in the body Console: sign in; sets the rgs_console session cookie
POST /operator/console/api/logout Console / any signed-in console user Console: sign out; clears the session cookie
GET /operator/console/api/markets Console / finance Console: market profiles
GET /operator/console/api/me Console / any signed-in console user Console: the signed-in user and the database identity
GET /operator/console/api/platform-alerts Console / any signed-in console user Console: platform alerts, for users the platform owner granted
GET /operator/console/api/players Console / players Console: look up a player by external id
GET /operator/console/api/players/activity Console / players Console: a player's activity
GET /operator/console/api/players/data Console / players Console: a player's data (data protection access)
POST /operator/console/api/players/time-out Console / players Console: time-out on the player's request, on every account of the player
GET /operator/console/api/players/wins Console / players Console: a player's wins
GET /operator/console/api/reports/cohorts Console / reports Console: cohort report
GET /operator/console/api/reports/cohorts.csv Console / finance Console: cohort report as CSV
GET /operator/console/api/reports/daily Console / reports Console: daily report
GET /operator/console/api/reports/daily.csv Console / finance Console: daily report as CSV
GET /operator/console/api/reports/fx Console / reports Console: historical EUR reporting using each round's pinned reference rate
GET /operator/console/api/reports/liability Console / finance Console: liability report
GET /operator/console/api/reports/liability.csv Console / finance Console: liability report as CSV
GET /operator/console/api/reports/tax Console / finance Console: monthly tax report
GET /operator/console/api/reports/tax.csv Console / finance Console: monthly tax report as CSV
GET /operator/console/api/rounds Console / players Console: search rounds
GET /operator/console/api/rounds.csv Console / players Console: rounds as CSV
GET /operator/console/api/rounds/{roundId} Console / players Console: one round
GET /operator/console/api/rounds/{roundId}/replay Console / players Console: replay and verify a round
GET /operator/console/api/rounds/attention Console / reports Console: rounds needing attention and player outliers
GET /operator/console/api/rounds/attention.csv Console / players Console: rounds needing attention as CSV
GET /operator/console/api/rounds/lookup Console / players Console: find rounds by external round id or wallet transaction id
POST /operator/console/api/setup A setup token in the body Console: complete a user's setup from a setup link
POST /operator/console/api/setup/info A setup token in the body Console: what a setup link is for
GET /operator/console/api/tournaments/{tournamentId}/standings Console / liveops Console: tournament standings (player ids masked without the players permission)
GET /operator/console/api/users Console / users Console: list console users
POST /operator/console/api/users Console / users Console: create a console user (two people where required)
GET /operator/console/api/users.csv Console / users Console: console users as CSV
POST /operator/console/api/users/{userId}/disable Console / users Console: disable a user
POST /operator/console/api/users/{userId}/reset Console / users Console: reset a user; issues a new setup link (two people where required)
POST /operator/console/api/users/{userId}/role Console / users Console: change a user's role (two people where required)
POST /operator/console/api/users/{userId}/sign-out Console / users Console: sign a user out everywhere
GET /operator/console/api/wallet-verifications Console / verifier Wallet verifier: recent runs
POST /operator/console/api/wallet-verifications Console / verifier Wallet verifier: run a small, net-zero check through the real wallet path
GET /operator/console/api/wallet-verifications/attention Console / verifier Wallet verifier: runs needing attention
GET /operator/console/api/wins Console / reports Console: large wins (player ids masked without the players permission)
GET /operator/console/assets/console.css None Console: style sheet
GET /operator/console/assets/console.js None Console: application script
GET /operator/console/setup None Console: the setup page (same application)
POST /operator/v1/accounts Operator key / wallet Provision or find a custodial account
POST /operator/v1/api-keys Operator key / keys Create an operator API key
DELETE /operator/v1/api-keys/{keyId} Operator key / keys Revoke another operator API key
GET /operator/v1/backoffice/activity Operator key / keys Back office: action log ('keys' scope)
GET /operator/v1/backoffice/activity.csv Operator key / keys Back office: action log as CSV ('keys' scope)
GET /operator/v1/backoffice/alerts Operator key / reports Back office: alerts
GET /operator/v1/backoffice/fx/rates Operator key / reports Back office: FX source freshness, active observations and quarantined candidates
GET /operator/v1/backoffice/liveops Operator key / reports Back office: LiveOps report
GET /operator/v1/backoffice/liveops.csv Operator key / reports Back office: LiveOps report as CSV
GET /operator/v1/backoffice/markets Operator key / reports Back office: market profiles
GET /operator/v1/backoffice/players Operator key / reports Back office: look up a player by external id
GET /operator/v1/backoffice/players/activity Operator key / reports Back office: a player's activity
GET /operator/v1/backoffice/players/data Operator key / reports Back office: a player's data (data protection access)
POST /operator/v1/backoffice/players/erase Operator key / * Back office: erase a player by pseudonymisation (GDPR art. 17)
GET /operator/v1/backoffice/players/wins Operator key / reports Back office: a player's wins
GET /operator/v1/backoffice/reports/cohorts Operator key / reports Back office: cohort report
GET /operator/v1/backoffice/reports/cohorts.csv Operator key / reports Back office: cohort report as CSV
GET /operator/v1/backoffice/reports/daily Operator key / reports Back office: daily report
GET /operator/v1/backoffice/reports/daily.csv Operator key / reports Back office: daily report as CSV
GET /operator/v1/backoffice/reports/fx Operator key / reports Back office: historical EUR reporting using each round's pinned reference rate
GET /operator/v1/backoffice/reports/liability Operator key / reports Back office: liability report
GET /operator/v1/backoffice/reports/liability.csv Operator key / reports Back office: liability report as CSV
GET /operator/v1/backoffice/reports/tax Operator key / reports Back office: monthly tax report
GET /operator/v1/backoffice/reports/tax.csv Operator key / reports Back office: monthly tax report as CSV
GET /operator/v1/backoffice/rounds Operator key / reports Back office: search rounds
GET /operator/v1/backoffice/rounds.csv Operator key / reports Back office: rounds as CSV
GET /operator/v1/backoffice/rounds/{roundId} Operator key / reports Back office: one round
GET /operator/v1/backoffice/rounds/{roundId}/replay Operator key / reports Back office: replay and verify a round
GET /operator/v1/backoffice/rounds/attention Operator key / reports Back office: rounds needing attention and player outliers
GET /operator/v1/backoffice/rounds/attention.csv Operator key / reports Back office: rounds needing attention as CSV
GET /operator/v1/backoffice/rounds/lookup Operator key / reports Back office: find rounds by external round id or wallet transaction id
GET /operator/v1/backoffice/tournaments/{tournamentId}/standings Operator key / reports Back office: tournament standings
GET /operator/v1/backoffice/wallet-verifications Operator key / verifier Wallet verifier: recent runs
POST /operator/v1/backoffice/wallet-verifications Operator key / verifier Wallet verifier: run a small, net-zero check through the real wallet path
GET /operator/v1/backoffice/wallet-verifications/attention Operator key / verifier Wallet verifier: runs needing attention
GET /operator/v1/backoffice/wins Operator key / reports Back office: large wins
POST /operator/v1/campaigns Operator key / campaigns Create a campaign
POST /operator/v1/campaigns/{campaignId}/grants Operator key / campaigns Grant campaign funds idempotently
PUT /operator/v1/campaigns/{campaignId}/status Operator key / campaigns Transition campaign status
GET /operator/v1/changes Operator key / campaigns List two-person change requests in one scope (console user changes are not listed here)
POST /operator/v1/changes Operator key / * Propose a two-person change; a different enrolled person approves it
POST /operator/v1/changes/{changeId}/decision Operator key / * Approve or reject a change request
POST /operator/v1/console/users Operator key / keys Bootstrap a console user with a 'keys' operator key
POST /operator/v1/demo-lobby/admin-activity Operator key / demo-lobby Demo lobby admin: activity search
POST /operator/v1/demo-lobby/admin-change Operator key / demo-lobby Demo lobby admin: create or update users, reset passwords, set games and grants
POST /operator/v1/demo-lobby/admin-snapshot Operator key / demo-lobby Demo lobby admin: snapshot
POST /operator/v1/demo-lobby/authenticate Operator key / demo-lobby Demo lobby: sign a lobby user in with username and password
POST /operator/v1/demo-lobby/catalog Operator key / demo-lobby Demo lobby: game catalogue for a lobby session
POST /operator/v1/demo-lobby/configuration Operator key / demo-lobby Demo lobby: lobby configuration
POST /operator/v1/demo-lobby/launch Operator key / demo-lobby Demo lobby: launch a game for a lobby session (native or Stake front)
POST /operator/v1/demo-lobby/refill Operator key / demo-lobby Demo lobby: refill a lobby session's synthetic credit
POST /operator/v1/demo-lobby/session Operator key / demo-lobby Demo lobby: resolve a lobby session
POST /operator/v1/demo-lobby/session-game Operator key / demo-lobby Demo lobby: resolve a game token within a lobby session
POST /operator/v1/demo-lobby/wallet-context Operator key / demo-lobby Demo lobby: wallet context for a Stake session id
GET /operator/v1/disputes/wallet-operations/{operationId} Operator key / disputes Get tenant-scoped external-wallet operation evidence
POST /operator/v1/engagement/tournaments Operator key / campaigns Create a tournament (201 created, 200 for the same terms again)
POST /operator/v1/engagement/tournaments/{id}/close Operator key / campaigns Close a tournament (200 when settled, 202 while settling)
PUT /operator/v1/external-wallet/connector Operator key / wallet-admin Configure the operator-hosted signed-wallet endpoint
PUT /operator/v1/external-wallet/mode Operator key / wallet-admin Set custodial or signed external settlement mode
POST /operator/v1/external-wallet/operations Operator key / wallet-admin Durably submit an external-wallet operation
GET /operator/v1/external-wallet/operations/{operationId} Operator key / wallet-admin Get a durable external-wallet operation result
GET /operator/v1/external-wallet/reconciliation/runs/{runId} Operator key / wallet-admin Get a reconciliation run created from a signed balance statement
POST /operator/v1/free-rounds Operator key / campaigns Create a free-round campaign (201 created, 200 for the same terms again)
POST /operator/v1/free-rounds/{campaignId}/grants Operator key / campaigns Grant free rounds to a player (201 created, 200 for a repeated grant)
GET /operator/v1/free-rounds/{campaignId}/liability Operator key / campaigns Free-round campaign liability
POST /operator/v1/free-rounds/{campaignId}/remove Operator key / campaigns Remove a free-round campaign
POST /operator/v1/free-rounds/available-bets Operator key / campaigns Bet amounts free rounds can use for a game version and currency
PUT /operator/v1/games/{gameCode} Operator key / games Set operator game entitlement
POST /operator/v1/interactive-market/policies/{policyId}/approve Operator key / markets Approve an interactive market policy request (checker)
POST /operator/v1/interactive-market/policies/{policyId}/requests Operator key / markets Request an interactive market policy (maker)
POST /operator/v1/interactive-market/policies/{policyId}/revoke Operator key / markets Revoke an interactive market policy
POST /operator/v1/jackpots Operator key / campaigns Create a jackpot pool (201 created, 200 for the same terms again)
GET /operator/v1/jackpots/{poolId} Operator key / campaigns Jackpot pool as its operator sees it
POST /operator/v1/jackpots/{poolId}/memberships Operator key / campaigns Offer another operator a jackpot pool membership
POST /operator/v1/jackpots/{poolId}/memberships/{offerId}/accept Operator key / campaigns Accept a jackpot pool membership offer
GET /operator/v1/jackpots/rtp Operator key / reports Jackpot RTP for a game version and currency
POST /operator/v1/launch Operator key / launch Issue one-time game launch token
POST /operator/v1/math-families/policies/{policyId}/approve Operator key / markets Approve a math family policy request (checker)
POST /operator/v1/math-families/policies/{policyId}/requests Operator key / markets Request a math family policy (maker)
POST /operator/v1/obligation-age/policies/{policyId}/approve Operator key / reconciliation Approve an obligation-age policy request (checker)
POST /operator/v1/obligation-age/policies/{policyId}/requests Operator key / reconciliation Request an obligation-age policy (maker)
GET /operator/v1/reconciliation Operator key / reconciliation Compare stored and ledger balances
POST /operator/v1/reconciliation/cases/{caseId}/approve Operator key / reconciliation Approve reconciliation-case resolution
POST /operator/v1/reconciliation/cases/{caseId}/reopen Operator key / reconciliation Reopen a reconciliation case's resolution intent
POST /operator/v1/reconciliation/cases/{caseId}/resolution-requests Operator key / reconciliation Request reconciliation-case resolution
POST /operator/v1/reconciliation/operation-statements Operator key / reconciliation Submit an operation statement (201 ingested, 200 duplicate)
GET /operator/v1/reconciliation/operation-statements/{id} Operator key / reconciliation Operation statement ingestion result
POST /operator/v1/reconciliation/runs Operator key / reconciliation Create a custodial reconciliation run
GET /operator/v1/reconciliation/runs/{runId} Operator key / reconciliation Get a custodial reconciliation run
PUT /operator/v1/responsible-gaming/limits Operator key / responsible-gaming Set all responsible-gaming limits for an account
POST /operator/v1/responsible-gaming/time-out Operator key / responsible-gaming Time-out on the player's request, on every account of the player
GET /operator/v1/rng/draw-log Operator key / reports Export a signed, ordered RNG draw log
GET /operator/v1/rounds/{roundId}/drawn-review Operator key / reconciliation Preview a drawn round's review
POST /operator/v1/rounds/{roundId}/drawn-review/resolution-approvals/{intentId} Operator key / reconciliation Approve a drawn round's resolution (checker)
POST /operator/v1/rounds/{roundId}/drawn-review/resolution-requests Operator key / reconciliation Request a drawn round's resolution (maker)
POST /operator/v1/wallet/signing-keys Operator key / wallet-admin Register an operator Ed25519 callback/response key
DELETE /operator/v1/wallet/signing-keys/{keyId} Operator key / wallet-admin Revoke an unbound active signing key
POST /operator/v1/wallet/transactions Operator key / wallet Post an idempotent custodial deposit or withdrawal
GET /operator/v1/wallet/transactions/{externalTransactionId} Operator key / wallet Look up a custodial transaction
POST /ops/v1/alerts AlertIntakeBearer Alertmanager webhook intake (version 4) for the console's platform alerts
GET /tequity/launch/real None here; the wallet authenticates the one-time key Tequity launcher: 303 redirect to the game
POST /tequity/launch/real None here; the wallet authenticates the one-time key Tequity launcher (fields in the body or the query): 303 redirect to the game
POST /tequity/wallet/{wallet}/freeBets/add TequitySignature Tequity free bets: add a campaign for players
POST /tequity/wallet/{wallet}/freeBets/availableBets TequitySignature Tequity free bets: available bet amounts per game and currency
POST /tequity/wallet/{wallet}/freeBets/remove TequitySignature Tequity free bets: remove a campaign
GET /tequity/wallet/{wallet}/launch/real None here; the wallet authenticates the one-time key Tequity launcher for one wallet: answers the game URL
POST /tequity/wallet/{wallet}/launch/real None here; the wallet authenticates the one-time key Tequity launcher for one wallet (fields in the body or the query): answers the game URL
POST /v1/authenticate Launch token in the body client_authenticate
GET /v1/balance SessionBearer client_getBalance
GET /v1/campaigns SessionBearer client_listCampaigns
GET /v1/engagement/tournaments/{id}/leaderboard None Tournament leaderboard for the session's player
POST /v1/engagement/tournaments/{id}/participation None Opt in to, or acknowledge, a tournament
POST /v1/fair/commitment SessionBearer Provably fair: the player's open commitment for the next one-shot round
GET /v1/free-rounds None The session player's free-round inventory, paged
GET /v1/history SessionBearer client_listHistory
GET /v1/interactive/rounds/{id}/replay SessionBearer Replay and verify an interactive round
GET /v1/jackpots/{poolId} None Public jackpot display (no credential)
POST /v1/multiplayer/room SessionBearer client_assignMultiplayerRoom
POST /v1/play SessionBearer client_playV1
GET /v1/reality-check SessionBearer client_getRealityCheck
POST /v1/reality-check/acknowledge SessionBearer client_acknowledgeRealityCheck
GET /v1/responsible-gaming SessionBearer client_getResponsibleGaming
POST /v1/responsible-gaming/self-exclude SessionBearer client_selfExclude
POST /v1/responsible-gaming/time-out SessionBearer Player time-out for a fixed period on every account of the player; it ends this session
GET /v1/rounds/{roundId}/fairness SessionBearer client_getRoundFairness
GET /v1/rounds/{roundId}/proof SessionBearer Provably fair proof of the caller's own settled round
GET /v1/rounds/{roundId}/replay SessionBearer client_replayRound
POST /v1/session/close SessionBearer client_closeSession
POST /v2/interactive/action SessionBearer client_interactiveAction
POST /v2/interactive/recover SessionBearer client_interactiveRecover
POST /v2/interactive/skip SessionBearer Interactive game: skip command (InteractiveCommandService.skip)
POST /v2/interactive/start SessionBearer client_interactiveStart
POST /v2/play SessionBearer client_playV2
POST /v2/recover SessionBearer client_recoverV2
GET /v2/state SessionBearer The session player's current game state
POST /wallet/authenticate Stake session id (sessionID) in the body client_walletAuthenticate
POST /wallet/balance Stake session id (sessionID) in the body client_walletBalance
POST /wallet/end-round Stake session id (sessionID) in the body client_walletEndRound
POST /wallet/play Stake session id (sessionID) in the body client_walletPlay
POST /wallet/v1/callbacks/{operatorCode} W_WalletKeyId + W_WalletTimestamp + W_WalletMessageId + W_WalletSignature Accept a signed operator wallet callback

Complete operation and field reference

This appendix is generated from the two checked OpenAPI 3.1 documents. The preceding chapters explain flows and retry semantics; this appendix lists every operation, parameter, request model, response model and reusable data field. Model names are local to the indicated specification. Required means required within its containing object. A conditional or optional parent does not make that object itself required. Unknown/game-owned JSON is explicitly unconstrained.

Array items use []; union alternatives use oneOf (exactly one), anyOf (one or more) and allOf (all). if / then / else express conditional constraints. A referenced model is defined in the model section for the same specification. Full machine-readable schemas remain authoritative for composition.

RGS-hosted API

Specification: openapi.json · version 2026-11-13+3f5afad.

GET /health/live

Process liveness

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

HTTP Response / media / model
200 Process responds — application/json: object; extra fields forbidden — Fields: status string; exact value: "ok"

GET /health/ready

Dependency readiness

Default 2-second deadline. Normal entrypoint checks PostgreSQL, Redis, key/runtime coverage and configured authority readiness.

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

HTTP Response / media / model
200 Ready — application/json: object; extra fields forbidden — Fields: status string; exact value: "ready"
503 Dependency readiness failed — application/json: object; extra fields forbidden — Fields: status string; exact value: "not_ready"

GET /metrics

Prometheus metrics

Served by the separate metrics listener (main.ts: config.metrics host and port), not the API listener.

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: the metrics listener (main.ts).

HTTP Response / media / model
200 Prometheus text exposition — text/plain: string
503 The operational snapshot answers unavailable (MetricsSnapshot.response) — text/plain: string
default Status set by the handler at run time. — text/plain: string

POST /v1/authenticate

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
launchToken yes string; minimum length: 43; maximum length: 128

Illustrative request:

{
  "launchToken": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
HTTP Response / media / model
200 Session created — application/json: Model C_AuthenticateResponse
400 Invalid request. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid, expired, revoked, or consumed launch token. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /v1/balance

Authentication: SessionBearer.

HTTP Response / media / model
200 Custodial or approved external balance — application/json: Model C_Balance
202 External lookup pending or unknown — application/json: Model C_ExternalBalancePending
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
502 External balance unavailable — application/json: Model C_ExternalBalanceUnavailable
503 External-wallet runtime unavailable. The handler can also answer: CONTROL_PLANE_BUSY, EXTERNAL_WALLET_UNAVAILABLE, MONEY_PATH_BUSY. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed

POST /v1/session/close

Authentication: SessionBearer.

HTTP Response / media / model
204 Session revoked
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /v1/reality-check

Authentication: SessionBearer.

HTTP Response / media / model
200 Reality-check state — application/json: Model C_RealityStatus
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY"]

POST /v1/reality-check/acknowledge

Authentication: SessionBearer.

HTTP Response / media / model
200 Next scheduled check — application/json: Model C_RealityAcknowledged
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Check not due or session invalid. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /v1/responsible-gaming

Authentication: SessionBearer.

Registration: responsibleGaming dependency is supplied.

HTTP Response / media / model
200 Limits; null is unset — application/json: Model C_ResponsibleGaming
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /v1/responsible-gaming/self-exclude

Authentication: SessionBearer.

Registration: responsibleGaming dependency is supplied.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
until yes Any JSON value
HTTP Response / media / model
200 Effective exclusion timestamp; all active account sessions revoked — application/json: Model C_SelfExcludeResponse
400 Invalid date or outside allowed window. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
404 Account absent. The handler can also answer: RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /v1/campaigns

Authentication: SessionBearer.

Registration: campaigns dependency is supplied.

Parameter Location Required Type / constraints
limit query no integer; minimum: 1; maximum: 100
cursor query no string; minimum length: 1; maximum length: 512
HTTP Response / media / model
200 Newest-first account grants; no pagination — application/json: Model C_CampaignList
400 Invalid request. Error codes: INVALID_CAMPAIGN_CURSOR, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_CAMPAIGN_CURSOR","INVALID_REQUEST"]
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
409 Conflict. Error codes: CAMPAIGN_PAGINATION_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CAMPAIGN_PAGINATION_REQUIRED"]
422 Not processable. Error codes: CAMPAIGN_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CAMPAIGN_UNAVAILABLE"]
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /v1/multiplayer/room

Authentication: SessionBearer.

Registration: multiplayerLobby dependency is supplied.

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden

Illustrative request:

{}
HTTP Response / media / model
200 Room assignment — application/json: Model C_RoomAssignment
400 Non-empty request body. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
404 No active multiplayer game. The handler can also answer: MULTIPLAYER_GAME_UNAVAILABLE. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
423 Reality check required. The handler can also answer: REALITY_CHECK_REQUIRED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /v1/play

Authentication: SessionBearer.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playOptions no object; extra fields forbidden
playOptions.autoplay yes boolean
playOptions.turbo yes boolean
externalRoundId yes string; minimum length: 1; maximum length: 128
action yes string; minimum length: 1; maximum length: 64
wager yes object; extra fields forbidden
wager.id yes string; minimum length: 1; maximum length: 128
wager.amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
wager.currency yes string; pattern: "^[A-Z]{3}$"
clientSeed yes string; minimum length: 1; maximum length: 1024
freeRoundId no string; format: "uuid"
fairCommitment no string; pattern: "^[0-9a-f]{64}$"

Illustrative request:

{
  "externalRoundId": "round-123",
  "action": "base",
  "wager": {
    "id": "wager-123",
    "amount": 100,
    "currency": "EUR"
  },
  "clientSeed": "example-client-seed"
}
HTTP Response / media / model
200 Settled result or exact legacy retry — application/json: Model C_RoundResult
202 External settlement pending — application/json: Model C_RoundPending
400 Invalid request/action/wager. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
402 External debit declined — application/json: Model C_RoundDeclined
403 Wager not allowed. The handler can also answer: WAGER_NOT_ALLOWED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
404 Not found. Error codes: ROUND_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ROUND_NOT_FOUND"]
409 Round ID payload conflict. The handler can also answer: FAIR_COMMITMENT_STALE, FREE_ROUNDS_UNAVAILABLE, JACKPOT_UNAVAILABLE, ROUND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Insufficient funds. The handler can also answer: INSUFFICIENT_FUNDS. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
423 Reality check or responsible-gaming limit. The handler can also answer: REALITY_CHECK_REQUIRED, RESPONSIBLE_GAMING_LIMIT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, PROVABLY_FAIR_STOPPED, RNG_NOT_READY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","PROVABLY_FAIR_STOPPED","RNG_NOT_READY"]

POST /v2/play

Authentication: SessionBearer.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playOptions no object; extra fields forbidden
playOptions.autoplay yes boolean
playOptions.turbo yes boolean
commandId yes string; minimum length: 36; maximum length: 36; pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
action yes string; minimum length: 1; maximum length: 64
wager yes object; extra fields forbidden
wager.amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
wager.currency yes string; minimum length: 3; maximum length: 3; pattern: "^[A-Z]{3}$"
clientSeed yes string; minimum length: 1; maximum length: 1024
freeRoundId no string; format: "uuid"
fairCommitment no string; pattern: "^[0-9a-f]{64}$"

Illustrative request:

{
  "commandId": "31c8a45d-6294-4bbd-99a2-7a2a4a01c9f1",
  "action": "base",
  "wager": {
    "amount": 100,
    "currency": "EUR"
  },
  "clientSeed": "example-client-seed"
}
HTTP Response / media / model
200 Settled result or idempotent recovery — application/json: Model C_RoundResult
202 External settlement pending — application/json: Model C_RoundPending
400 Invalid request/action/wager. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
402 External debit declined — application/json: Model C_RoundDeclined
403 Wager not allowed. The handler can also answer: WAGER_NOT_ALLOWED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
404 Not found. Error codes: ROUND_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ROUND_NOT_FOUND"]
409 Command payload/scope conflict. The handler can also answer: FAIR_COMMITMENT_STALE, FREE_ROUNDS_UNAVAILABLE, JACKPOT_UNAVAILABLE, ROUND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Insufficient funds. The handler can also answer: INSUFFICIENT_FUNDS. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
423 Responsible-gaming limit. The handler can also answer: REALITY_CHECK_REQUIRED, RESPONSIBLE_GAMING_LIMIT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, PROVABLY_FAIR_STOPPED, RNG_NOT_READY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","PROVABLY_FAIR_STOPPED","RNG_NOT_READY"]

POST /v2/recover

Authentication: SessionBearer.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playOptions no object; extra fields forbidden
playOptions.autoplay yes boolean
playOptions.turbo yes boolean
commandId yes string; minimum length: 36; maximum length: 36; pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
action yes string; minimum length: 1; maximum length: 64
wager yes object; extra fields forbidden
wager.amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
wager.currency yes string; minimum length: 3; maximum length: 3; pattern: "^[A-Z]{3}$"
clientSeed yes string; minimum length: 1; maximum length: 1024
freeRoundId no string; format: "uuid"
fairCommitment no string; pattern: "^[0-9a-f]{64}$"
HTTP Response / media / model
200 Recovered settled result — application/json: Model C_RoundResult
202 Accepted external settlement pending — application/json: Model C_RoundPending
400 Invalid request. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
402 External debit declined — application/json: Model C_RoundDeclined
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
404 No accepted command in account/game scope. The handler can also answer: ROUND_NOT_FOUND. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
409 Command payload conflict. The handler can also answer: FAIR_COMMITMENT_STALE, FREE_ROUNDS_UNAVAILABLE, JACKPOT_UNAVAILABLE, ROUND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: REALITY_CHECK_REQUIRED, RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["REALITY_CHECK_REQUIRED","RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, PROVABLY_FAIR_STOPPED, RNG_NOT_READY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","PROVABLY_FAIR_STOPPED","RNG_NOT_READY"]

GET /v1/history

Authentication: SessionBearer.

Registration: rounds dependency is supplied.

Parameter Location Required Type / constraints
limit query no integer; minimum: 1; maximum: 100; default: 20
cursor query no string; minimum length: 1; maximum length: 512
HTTP Response / media / model
200 Most-recent-first history, no cursor pagination — application/json: Model C_History
400 Invalid limit. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /v1/rounds/{roundId}/fairness

Authentication: SessionBearer.

Registration: rounds dependency is supplied.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 Revealed fairness proof — application/json: Model C_FairnessProof
400 Invalid round ID. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
404 Not owned or proof unavailable. The handler can also answer: ROUND_NOT_FOUND. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /v1/rounds/{roundId}/replay

Authentication: SessionBearer.

Registration: rounds dependency is supplied.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 Matched or unavailable replay verification — application/json: Model C_Replay
400 Invalid round ID. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
404 Round not owned. The handler can also answer: ROUND_NOT_FOUND. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
409 Replay mismatch. The handler can also answer: JACKPOT_UNAVAILABLE. — application/json: See nested fields / alternatives — anyOf: Model C_Replay, object; extra fields allowed
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /v2/interactive/start

Authentication: SessionBearer.

Registration: interactive runtime dependency is supplied.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
commandId yes string; pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
wager yes object; extra fields forbidden
wager.amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
wager.currency yes string; pattern: "^[A-Z]{3}$"
clientSeed yes string; minimum length: 1; maximum length: 1024
HTTP Response / media / model
200 Player-safe execution projection — application/json: Model C_InteractiveProjection
400 Invalid request. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
403 Wager not allowed. The handler can also answer: WAGER_NOT_ALLOWED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
404 Not found. Error codes: INTERACTIVE_EXECUTION_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_EXECUTION_NOT_FOUND"]
409 Interactive command conflict. The handler can also answer: INTERACTIVE_COMMAND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Insufficient funds. The handler can also answer: INSUFFICIENT_FUNDS. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
423 Responsible-gaming limit. The handler can also answer: RESPONSIBLE_GAMING_LIMIT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Internal error — application/json: Model C_Error
503 Interactive runtime unavailable. The handler can also answer: INTERACTIVE_RUNTIME_UNAVAILABLE, MONEY_PATH_BUSY. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed

POST /v2/interactive/action

Authentication: SessionBearer.

Registration: interactive runtime dependency is supplied.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
roundId yes string; format: "uuid"
commandId yes string; pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
expectedSequence yes integer; minimum: 0; maximum: 63
action yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
value no integer; minimum: 0; maximum: 9007199254740991
sideBet no integer; maximum: 9007199254740991; exclusive minimum: 0
HTTP Response / media / model
200 Projection and action acknowledgement — application/json: Model C_InteractiveActionResponse
400 Invalid request. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
403 Continuation not allowed. The handler can also answer: WAGER_NOT_ALLOWED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
404 Execution unavailable. The handler can also answer: INTERACTIVE_EXECUTION_NOT_FOUND. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
409 Interactive command conflict. The handler can also answer: INTERACTIVE_COMMAND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Responsible-gaming limit. The handler can also answer: RESPONSIBLE_GAMING_LIMIT. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Internal error — application/json: Model C_Error
503 Interactive runtime unavailable. The handler can also answer: INTERACTIVE_RUNTIME_UNAVAILABLE, MONEY_PATH_BUSY. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed

POST /v2/interactive/recover

Authentication: SessionBearer.

Registration: interactive runtime dependency is supplied.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
commandId yes string; pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
HTTP Response / media / model
200 Player-safe projection — application/json: Model C_InteractiveProjection
400 Invalid request. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Invalid session. The handler can also answer: AUTHENTICATION_FAILED. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
404 Execution unavailable. The handler can also answer: INTERACTIVE_EXECUTION_NOT_FOUND. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
409 Conflict. Error codes: INTERACTIVE_COMMAND_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_COMMAND_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Internal error — application/json: Model C_Error
503 Unavailable; retry later. Error codes: INTERACTIVE_RUNTIME_UNAVAILABLE, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_RUNTIME_UNAVAILABLE","MONEY_PATH_BUSY"]

POST /wallet/authenticate

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra field values: Any JSON value

Field Required Type / constraints
$ yes object; extra field values: Any JSON value
sessionID yes string; minimum length: 8; maximum length: 256
language no string; minimum length: 2; maximum length: 16
gameId no string; minimum length: 1; maximum length: 128
HTTP Response / media / model
200 Stake success or protocol error — application/json: Model C_StakeAuthenticationResponse
202 Accepted; not final yet. Error codes: ROUND_SETTLEMENT_PENDING. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ROUND_SETTLEMENT_PENDING"]
400 Malformed input. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
402 Declined by the external wallet. Error codes: EXTERNAL_WALLET_DECLINED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["EXTERNAL_WALLET_DECLINED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
404 Not found. Error codes: ROUND_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ROUND_NOT_FOUND"]
409 Conflict. Error codes: FAIR_COMMITMENT_STALE, FREE_ROUNDS_UNAVAILABLE, JACKPOT_UNAVAILABLE, ROUND_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FAIR_COMMITMENT_STALE","FREE_ROUNDS_UNAVAILABLE","JACKPOT_UNAVAILABLE","ROUND_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, PROVABLY_FAIR_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","PROVABLY_FAIR_STOPPED"]

POST /wallet/balance

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra field values: Any JSON value

Field Required Type / constraints
$ yes object; extra field values: Any JSON value
sessionID yes string; minimum length: 8; maximum length: 256
HTTP Response / media / model
200 Stake success or protocol error — application/json: Model C_StakeBalanceResponse
400 Malformed input. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY"]

POST /wallet/play

No caller idempotency or command identifier is accepted; this route creates the round identity.

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra field values: Any JSON value

Field Required Type / constraints
$ yes object; extra field values: Any JSON value
sessionID yes string; minimum length: 8; maximum length: 256
playOptions no object; extra fields forbidden
playOptions.autoplay yes boolean
playOptions.turbo yes boolean
amount yes integer; minimum: 0; maximum: 9007199254740991
currency yes string; pattern: "^[A-Z]{3}$"
mode yes string; minimum length: 1; maximum length: 64
gameId no string; minimum length: 1; maximum length: 128
freeRoundId no string; format: "uuid"

Illustrative request:

{
  "sessionID": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "amount": 1000000,
  "currency": "EUR",
  "mode": "BASE",
  "gameId": "coin-flip"
}
HTTP Response / media / model
200 Stake success or protocol error — application/json: Model C_StakePlayResponse
202 Accepted; not final yet. Error codes: ROUND_SETTLEMENT_PENDING. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ROUND_SETTLEMENT_PENDING"]
400 Malformed input. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
402 Declined by the external wallet. Error codes: EXTERNAL_WALLET_DECLINED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["EXTERNAL_WALLET_DECLINED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
404 Not found. Error codes: ROUND_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ROUND_NOT_FOUND"]
409 Conflict. Error codes: FAIR_COMMITMENT_STALE, FREE_ROUNDS_UNAVAILABLE, JACKPOT_UNAVAILABLE, ROUND_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FAIR_COMMITMENT_STALE","FREE_ROUNDS_UNAVAILABLE","JACKPOT_UNAVAILABLE","ROUND_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: REALITY_CHECK_REQUIRED, RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["REALITY_CHECK_REQUIRED","RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, PROVABLY_FAIR_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","PROVABLY_FAIR_STOPPED"]

POST /wallet/end-round

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra field values: Any JSON value

Field Required Type / constraints
$ yes object; extra field values: Any JSON value
sessionID yes string; minimum length: 8; maximum length: 256
HTTP Response / media / model
200 Stake success or protocol error — application/json: Model C_StakeBalanceResponse
400 Malformed input. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /bet/event

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: rounds dependency is supplied.

Request body: required.

Content type: application/json. object; extra field values: Any JSON value

Field Required Type / constraints
$ yes object; extra field values: Any JSON value
sessionID yes string; minimum length: 8; maximum length: 256
event no string; minimum length: 1; maximum length: 128
HTTP Response / media / model
200 Stake success or protocol error — application/json: Model C_StakeEventResponse
400 Malformed input. The handler can also answer: INVALID_REQUEST. — application/json: See nested fields / alternatives — anyOf: Model C_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited — application/json: Model C_Error
500 Internal error — application/json: Model C_Error
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/v1/api-keys

Create an operator API key

Authentication: OperatorBearer.

Operator scope: keys.

Registration: operatorAuth.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
label yes string; minimum length: 1; maximum length: 128
scopes yes array; minimum items: 1; maximum items: 16
scopes[] each item string; allowed values: ["keys","launch","wallet","wallet-admin","campaigns","responsible-gaming","reconciliation","games","disputes","reports","verifier"]
ttlSeconds no integer; minimum: 300; maximum: 7776000; default: 7776000

Illustrative request:

{
  "label": "synthetic-ops",
  "scopes": [
    "wallet"
  ],
  "ttlSeconds": 3600
}
HTTP Response / media / model
201 Key created. — application/json: Model O_ApiKeyCreateResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

DELETE /operator/v1/api-keys/{keyId}

Revoke another operator API key

Authentication: OperatorBearer.

Operator scope: keys.

Registration: operatorAuth.

Parameter Location Required Type / constraints
keyId path yes string; format: "uuid"
HTTP Response / media / model
204 Key revoked.
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

PUT /operator/v1/games/{gameCode}

Set operator game entitlement

Authentication: OperatorBearer.

Operator scope: games.

Registration: operatorAuth.

Parameter Location Required Type / constraints
gameCode path yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
enabled yes boolean
currencies yes array
currencies[] each item string

Illustrative request:

{
  "enabled": true,
  "currencies": [
    "EUR"
  ]
}
HTTP Response / media / model
200 Entitlement saved. — application/json: Model O_GameEntitlementResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 No active game with this code. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["GAME_NOT_FOUND"]
409 Conflict. Error codes: TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

PUT /operator/v1/responsible-gaming/limits

Set all responsible-gaming limits for an account

Authentication: OperatorBearer.

Operator scope: responsible-gaming.

Registration: operatorAuth && responsibleGaming.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"
realityCheckIntervalSeconds yes See nested fields / alternatives
realityCheckIntervalSeconds [anyOf 1] anyOf integer; minimum: 60; maximum: 86400
realityCheckIntervalSeconds [anyOf 2] anyOf null
maxSingleWager yes See nested fields / alternatives
maxSingleWager [anyOf 1] anyOf integer; maximum: 9007199254740991; exclusive minimum: 0
maxSingleWager [anyOf 2] anyOf null
dailyNetLossLimit yes See nested fields / alternatives
dailyNetLossLimit [anyOf 1] anyOf integer; maximum: 9007199254740991; exclusive minimum: 0
dailyNetLossLimit [anyOf 2] anyOf null
dailyDepositLimit yes See nested fields / alternatives
dailyDepositLimit [anyOf 1] anyOf integer; maximum: 9007199254740991; exclusive minimum: 0
dailyDepositLimit [anyOf 2] anyOf null
maxSessionSeconds yes See nested fields / alternatives
maxSessionSeconds [anyOf 1] anyOf integer; minimum: 60; maximum: 86400
maxSessionSeconds [anyOf 2] anyOf null

Illustrative request:

{
  "playerId": "synthetic-player",
  "currency": "EUR",
  "realityCheckIntervalSeconds": 600,
  "maxSingleWager": 500,
  "dailyNetLossLimit": null,
  "dailyDepositLimit": 1000,
  "maxSessionSeconds": null
}
HTTP Response / media / model
200 Limits saved. — application/json: Model O_RgLimitsResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The operator account does not exist. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/accounts

Provision or find a custodial account

Authentication: OperatorBearer.

Operator scope: wallet.

Registration: operatorAuth && wallet.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"

Illustrative request:

{
  "playerId": "synthetic-player",
  "currency": "EUR"
}
HTTP Response / media / model
200 Existing account. — application/json: Model O_AccountResponse
201 Account created. — application/json: Model O_AccountResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Not found. Error codes: WALLET_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/wallet/transactions

Post an idempotent custodial deposit or withdrawal

Authentication: OperatorBearer.

Operator scope: wallet.

Registration: operatorAuth && wallet.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
externalTransactionId yes string; minimum length: 1; maximum length: 256
kind yes string; allowed values: ["deposit","withdrawal"]
amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
currency yes string; pattern: "^[A-Z]{3}$"

Illustrative request:

{
  "playerId": "synthetic-player",
  "externalTransactionId": "synthetic-deposit-1",
  "kind": "deposit",
  "amount": 2500,
  "currency": "EUR"
}
HTTP Response / media / model
200 Completed or idempotent transaction. — application/json: Model O_WalletTransactionResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The operator account does not exist. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
409 Transaction identity conflicts, transaction is non-retryable, or a deposit is blocked by responsible-gaming state. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["WALLET_TRANSACTION_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Withdrawal cannot be funded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/wallet/transactions/{externalTransactionId}

Look up a custodial transaction

Authentication: OperatorBearer.

Operator scope: wallet.

Registration: operatorAuth && wallet.

Parameter Location Required Type / constraints
externalTransactionId path yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 Transaction. — application/json: Model O_WalletTransactionResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The custodial transaction is absent or belongs to another operator. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/reconciliation

Compare stored and ledger balances

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth && wallet.

HTTP Response / media / model
200 Reconciliation scan. — application/json: Model O_ReconciliationScan
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/reconciliation/runs

Create a custodial reconciliation run

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth && wallet.

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden

Illustrative request:

{}
HTTP Response / media / model
201 Run created. — application/json: Model O_ReconciliationRun
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Not found. Error codes: WALLET_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/reconciliation/runs/{runId}

Get a custodial reconciliation run

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth && wallet.

Parameter Location Required Type / constraints
runId path yes string; format: "uuid"
HTTP Response / media / model
200 Run. — application/json: Model O_ReconciliationRun
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The reconciliation run is absent or belongs to another operator. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/reconciliation/cases/{caseId}/resolution-requests

Request reconciliation-case resolution

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth && wallet.

Parameter Location Required Type / constraints
caseId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
reasonCode yes string; allowed values: ["legacy_opening_balance","operator_wallet_confirmed","data_repair"]
note yes string; minimum length: 10; maximum length: 2048
confirm no object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.amount yes integer; minimum: 1; maximum: 9007199254740991
confirm.direction yes string; allowed values: ["credit","debit"]
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"
expiresInSeconds no integer; minimum: 1; maximum: 900

Illustrative request:

{
  "reasonCode": "data_repair",
  "note": "Synthetic verification reconciled this opening balance."
}
HTTP Response / media / model
200 Case pending resolution. — application/json: Model O_ReconciliationCase
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The reconciliation case is absent or belongs to another operator. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
409 Case state or existing resolution request conflicts. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RECONCILIATION_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/reconciliation/cases/{caseId}/approve

Approve reconciliation-case resolution

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth && wallet.

Parameter Location Required Type / constraints
caseId path yes string; format: "uuid"

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm no object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.amount yes integer; minimum: 1; maximum: 9007199254740991
confirm.direction yes string; allowed values: ["credit","debit"]
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"

Illustrative request:

{}
HTTP Response / media / model
200 Resolved case. — application/json: Model O_ReconciliationCase
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The reconciliation case is absent or belongs to another operator. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
409 Approver is not distinct, snapshot is stale, or case state conflicts. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RECONCILIATION_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/launch

Issue one-time game launch token

Authentication: OperatorBearer.

Operator scope: launch.

Registration: operatorAuth.

Request body: required. brandId and marketId are sent together or not at all, and playerToken and token are never both sent; either rule broken answers 400 INVALID_REQUEST (app.ts launch: the refine and the handler's own check).

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"
gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
locale yes string; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"
brandId no string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
marketId no string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
countryCode no string; minimum length: 2; maximum length: 2; pattern: "^[A-Z]{2}$"
playerToken no string; minimum length: 1; maximum length: 8192
betLimitsOverride no object; extra fields forbidden
betLimitsOverride.minimum no integer; minimum: 1; maximum: 9007199254740991
betLimitsOverride.maximum no integer; minimum: 1; maximum: 9007199254740991
betLimitsOverride.market no object; extra fields forbidden
betLimitsOverride.market.operatorId yes string; format: "uuid"
betLimitsOverride.market.brandId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
betLimitsOverride.market.marketId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
betLimitsOverride.market.country yes string; pattern: "^[A-Z]{2}$"
betLimitsOverride.default no integer; minimum: 1; maximum: 9007199254740991
betLimitsOverride.maximumBonusBet no integer; minimum: 1; maximum: 9007199254740991
betLimitsOverride.maximumExposure no integer; minimum: 0; maximum: 9007199254740991
betLimitsOverride.bonusBuy no boolean
token no string; minimum length: 1; maximum length: 8192
$ [not] not See nested fields / alternatives

Illustrative request:

{
  "playerId": "synthetic-player",
  "currency": "EUR",
  "gameCode": "heist-v2",
  "locale": "en-GB"
}
HTTP Response / media / model
201 Launch token issued. — application/json: Model O_LaunchResponse
400 Malformed JSON or route validation failed. brandId and marketId are sent together or not at all, and playerToken and token are never both sent; either rule broken answers 400 INVALID_REQUEST (app.ts launch: the refine and the handler's own check). — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The account, active game/version, or enabled matching-currency entitlement is absent. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["ACCOUNT_OR_GAME_NOT_FOUND"]
409 The active game version cannot issue a launch token. The handler can also answer: GAME_OVER_OPERATOR_PAYOUT_LIMIT, WALLET_NOT_VERIFIED. — application/json: See nested fields / alternatives — anyOf: object; extra fields forbidden, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/campaigns

Create a campaign

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth && campaigns.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
code yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
currency yes string; pattern: "^[A-Z]{3}$"
budget yes integer; maximum: 9007199254740991; exclusive minimum: 0
startsAt yes string; format: "date-time"
endsAt yes string; format: "date-time"

Illustrative request:

{
  "code": "synthetic-bonus",
  "gameCode": "heist-v2",
  "currency": "EUR",
  "budget": 10000,
  "startsAt": "2026-09-21T00:00:00.000Z",
  "endsAt": "2026-09-22T00:00:00.000Z"
}
HTTP Response / media / model
201 Campaign created. — application/json: Model O_CampaignId
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Referenced game is not active. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["CAMPAIGN_UNAVAILABLE"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/campaigns/{campaignId}/grants

Grant campaign funds idempotently

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth && campaigns.

Parameter Location Required Type / constraints
campaignId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
idempotencyKey yes string; minimum length: 1; maximum length: 256

Illustrative request:

{
  "playerId": "synthetic-player",
  "amount": 500,
  "idempotencyKey": "synthetic-grant-1"
}
HTTP Response / media / model
200 Idempotent existing grant. — application/json: Model O_CampaignGrantResponse
201 Grant created. — application/json: Model O_CampaignGrantResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Campaign is unavailable, out of window/budget, account is absent, or idempotency key conflicts. The handler can also answer: INSUFFICIENT_FUNDS. — application/json: See nested fields / alternatives — anyOf: object; extra fields forbidden, object; extra fields allowed
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

PUT /operator/v1/campaigns/{campaignId}/status

Transition campaign status

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth && campaigns.

Parameter Location Required Type / constraints
campaignId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
status yes string; allowed values: ["active","paused","ended"]

Illustrative request:

{
  "status": "paused"
}
HTTP Response / media / model
200 Campaign transitioned. — application/json: Model O_CampaignStatusResponse
400 Malformed JSON or route validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Campaign is absent or the requested transition is not allowed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["CAMPAIGN_UNAVAILABLE"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/disputes/wallet-operations/{operationId}

Get tenant-scoped external-wallet operation evidence

Authentication: OperatorBearer.

Operator scope: disputes.

Registration: operatorAuth.

Parameter Location Required Type / constraints
operationId path yes string; format: "uuid"
collection query no string; allowed values: ["callbacks","conflicts","reconciliation","audit","actionAudit"]
cursor query no string; minimum length: 1
limit query no integer; minimum: 1; maximum: 100
HTTP Response / media / model
200 Coherent dispute evidence. — application/json: Model O_DisputeResponse
400 Query validation or canonical cursor validation failed. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INVALID_REQUEST","INVALID_DISPUTE_CURSOR"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 The external-wallet operation is absent or belongs to another operator. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["NOT_FOUND"]
409 Evidence graph is inconsistent or response/item byte guard was exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["DISPUTE_EVIDENCE_INTEGRITY_MISMATCH","DISPUTE_EVIDENCE_TOO_LARGE","DISPUTE_EVIDENCE_ITEM_TOO_LARGE"]
429 Rate limit exceeded. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unexpected server error. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["INTERNAL_ERROR"]
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, DISPUTE_EVIDENCE_UNAVAILABLE, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","DISPUTE_EVIDENCE_UNAVAILABLE","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/rng/draw-log

Export a signed, ordered RNG draw log

Reports-scope operator export of all financially attributed draws visible in one read-only snapshot, in the half-open created_at window [from,to). The key determines the operator. UTC ordering preserves PostgreSQL microseconds. NDJSON contains one header, indexed public draw records with verified/unsigned/invalid status, and a root-certified signed footer authenticating every preceding byte and the count. No server seed is exported. Save the complete stream and verify offline with tools/verify-rng-draw-log.ts and independently provisioned trusted public roots. HTTP 200 alone does not prove completion: dependency or disconnect failures can truncate the stream. Maximum one export per operator and two per process, 128 rows per page, 15-second idle and 10-minute overall deadlines. Window length is at most 24 hours; to must be at least 30 seconds before the snapshot. Platform draws are not exported. Shared-room receipts may name both consenting operators but contain no player or money details. See docs/design/rng-draw-log.md for the format and trust boundary.

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth; export also requires a configured RNG signer and trusted roots.

Parameter Location Required Type / constraints
from query yes string; format: "date-time"
to query yes string; format: "date-time"
HTTP Response / media / model
200 NDJSON attachment. Only a valid signed final footer proves a complete file. Unsigned and invalid draws remain listed. — application/x-ndjson: string
400 Invalid window, window longer than 24 hours, precision greater than six fractional digits, from >= to, or unknown query fields. The handler can also answer: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 RNG_EXPORT_WINDOW_NOT_READY: to is too recent. eligibleTo gives the latest settled timestamp for this snapshot. The handler can also answer: RNG_EXPORT_WINDOW_NOT_READY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RNG_EXPORT_WINDOW_NOT_READY"]
429 RNG_EXPORT_BUSY: this operator already owns an export or the process has two active exports. The handler can also answer: RNG_EXPORT_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RNG_EXPORT_BUSY"] — Header Retry-After: string; exact value: "15" Seconds until a fresh request may be attempted.
500 Unhandled internal error. — application/json: Model ServiceError
503 Signing or export dependency unavailable before streaming. The handler can also answer: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RNG_NOT_READY. — application/json: See nested fields / alternatives — anyOf: object; extra fields forbidden, object; extra fields allowed

POST /wallet/v1/callbacks/{operatorCode}

Accept a signed operator wallet callback

Authentication: W_WalletKeyId + W_WalletTimestamp + W_WalletMessageId + W_WalletSignature.

Parameter Location Required Type / constraints
operatorCode path yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
X-Wallet-Key-Id header yes Model W_KeyId
X-Wallet-Timestamp header yes string; pattern: "^\\d{10}$"
X-Wallet-Message-Id header yes Model W_Uuid
X-Wallet-Signature header yes string; pattern: "^[A-Za-z0-9_-]{86}$"
x-wallet-key-id header yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
x-wallet-timestamp header yes string; pattern: "^\\d{10}$"
x-wallet-message-id header yes string; format: "uuid"
x-wallet-signature header yes string; pattern: "^[A-Za-z0-9_-]{86}$"

Request body: required.

Content type: application/vnd.23rgs.wallet-callback+json. Model W_CallbackPayload

HTTP Response / media / model
200 Exact duplicate callback replay — application/json: Model W_CallbackAcceptance
202 New callback accepted — application/json: Model W_CallbackAcceptance
400 Invalid headers, JSON, media type, or payload — application/json: Model W_Error
401 Inactive/unknown key or operator, stale timestamp, or invalid signature — application/json: Model W_Error
409 Message, operation, terminal tuple, statement, or remote transaction identity conflict — application/json: Model W_Error
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Internal failure — application/json: Model W_Error
503 Unavailable; retry later. Error codes: MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["MONEY_PATH_BUSY"]

POST /operator/v1/wallet/signing-keys

Register an operator Ed25519 callback/response key

Authentication: OperatorBearer.

Operator scope: wallet-admin.

Registration: operatorAuth and dependencies.wallet.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
keyId yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
publicKeyPem yes string; minimum length: 64; maximum length: 4096
notBefore no string; format: "date-time"
expiresAt no string; format: "date-time"
HTTP Response / media / model
200 Idempotent active-key registration — application/json: Model W_SigningKeyResult
201 Key created — application/json: Model W_SigningKeyResult
400 Invalid request, PEM, algorithm, or validity interval — application/json: Model W_Error
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Key ID conflicts with an existing key. The handler can also answer: TWO_PERSON_REQUIRED. — application/json: See nested fields / alternatives — anyOf: Model W_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

DELETE /operator/v1/wallet/signing-keys/{keyId}

Revoke an unbound active signing key

Authentication: OperatorBearer.

Operator scope: wallet-admin.

Registration: operatorAuth and dependencies.wallet.

Parameter Location Required Type / constraints
keyId path yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
HTTP Response / media / model
204 Key revoked
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 No active key with this key ID — application/json: Model W_Error
409 Active connector still binds this response signing key — application/json: Model W_Error
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/external-wallet/reconciliation/runs/{runId}

Get a reconciliation run created from a signed balance statement

Authentication: OperatorBearer.

Operator scope: wallet-admin.

Registration: operatorAuth and dependencies.wallet.

Parameter Location Required Type / constraints
runId path yes string; format: "uuid"
HTTP Response / media / model
200 Reconciliation run — application/json: Model W_ReconciliationRun
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Run does not belong to this operator — application/json: Model W_Error
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

PUT /operator/v1/external-wallet/mode

Set custodial or signed external settlement mode

Requires wallet-admin and echo.target matching mode.

Authentication: OperatorBearer.

Operator scope: wallet-admin.

Registration: operatorAuth and dependencies.wallet.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
mode yes string; allowed values: ["custodial","external"]
echo yes object; extra fields forbidden
echo.amountMinor no string; maximum length: 32
echo.currency no string; maximum length: 16
echo.target no string; maximum length: 2048
HTTP Response / media / model
200 Mode stored — application/json: Model W_WalletModeResult
400 Invalid request. The handler can also answer: CHANGE_REFUSED. — application/json: See nested fields / alternatives — anyOf: Model W_Error, object; extra fields allowed
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 External wallet runtime or active connector/key unavailable. The handler can also answer: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: See nested fields / alternatives — anyOf: Model W_Error, object; extra fields allowed

PUT /operator/v1/external-wallet/connector

Configure the operator-hosted signed-wallet endpoint

Requires wallet-admin and echo.target matching endpoint exactly, including URL case.

Authentication: OperatorBearer.

Operator scope: wallet-admin.

Registration: operatorAuth and dependencies.wallet and dependencies.externalWallet.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
endpoint yes string; format: "uri"; maximum length: 2048
responseKeyId yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
echo yes object; extra fields forbidden
echo.amountMinor no string; maximum length: 32
echo.currency no string; maximum length: 16
echo.target no string; maximum length: 2048
HTTP Response / media / model
200 Active connector stored — application/json: Model W_ConnectorResult
400 Invalid URL, credentials in URL, insecure non-loopback endpoint, or invalid request. The handler can also answer: CHANGE_REFUSED. — application/json: See nested fields / alternatives — anyOf: Model W_Error, object; extra fields allowed
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Active response signing key is absent or outside validity — application/json: Model W_Error
409 Conflict. Error codes: TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/external-wallet/operations

Durably submit an external-wallet operation

Authentication: OperatorBearer.

Operator scope: wallet-admin.

Registration: operatorAuth and dependencies.wallet and dependencies.externalWallet.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
operationId yes string; format: "uuid"
kind yes string; allowed values: ["debit","credit","cancel","balance"]
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"
amount no integer; maximum: 9007199254740991; exclusive minimum: 0
originalOperationId no string; format: "uuid"
HTTP Response / media / model
200 Idempotent duplicate operation — application/json: Model W_ExternalOperationResult
201 New operation; status may be approved, declined, or unknown — application/json: Model W_ExternalOperationResult
400 Invalid request — application/json: Model W_Error
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Operation request, cancellation, remote identity, or terminal evidence conflict. The handler can also answer: TWO_PERSON_REQUIRED. — application/json: See nested fields / alternatives — anyOf: Model W_Error, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Active connector/key unavailable. The handler can also answer: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: See nested fields / alternatives — anyOf: Model W_Error, object; extra fields allowed

GET /operator/v1/external-wallet/operations/{operationId}

Get a durable external-wallet operation result

Authentication: OperatorBearer.

Operator scope: wallet-admin.

Registration: operatorAuth and dependencies.wallet and dependencies.externalWallet.

Parameter Location Required Type / constraints
operationId path yes string; format: "uuid"
HTTP Response / media / model
200 Stored operation result; duplicate is always true for lookup — application/json: Model W_ExternalOperationResult
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Operation does not exist for this operator — application/json: Model W_Error
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /game-launch

BetSymphony: provider launch (alias path); 303 redirect to the game

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: a BetSymphony adapter.

Parameter Location Required Type / constraints
gameId query yes string; allowed values: ["cherry-dream","fruit-oasis"]
token query no string; minimum length: 1; maximum length: 8192
playerToken query no string; minimum length: 1; maximum length: 8192
language query no string; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"
HTTP Response / media / model
303 Redirect (See Other). — Header Location: string Where the client goes next
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /integrations/betsymphony/launch

BetSymphony: provider launch; 303 redirect to the game

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: a BetSymphony adapter.

Parameter Location Required Type / constraints
gameId query yes string; allowed values: ["cherry-dream","fruit-oasis"]
token query no string; minimum length: 1; maximum length: 8192
playerToken query no string; minimum length: 1; maximum length: 8192
language query no string; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"
HTTP Response / media / model
303 Redirect (See Other). — Header Location: string Where the client goes next
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /integrations/betsymphony/session

BetSymphony: complete a launch with the player token; answers the game URL

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: a BetSymphony adapter.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
launchToken yes string; pattern: "^[A-Za-z0-9_-]{43}$"
playerToken yes string; minimum length: 1; maximum length: 8192
HTTP Response / media / model
200 OK. — application/json: object — Fields: url string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
502 Upstream failure. — application/json: object; extra fields allowed — Fields: error string
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console

Console: redirect to /operator/console/

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

HTTP Response / media / model
302 Redirect. — Header Location: string Where the client goes next
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError

GET /operator/console/

Console: the single-page application

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — text/html: string
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError

GET /operator/console/api/activity

Console: action log ('keys' scope)

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
kind query no string; allowed values: ["changes","all"]; default: "changes"
actor query no string; minimum length: 1; maximum length: 128
action query no string; pattern: "^[a-z][a-z_.]{0,63}$"
before query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z\\&#124;[1-9][0-9]{0,18}$"
limit query no integer; minimum: 1; maximum: 100; default: 100
HTTP Response / media / model
200 OK. — application/json: Model D_ActivityLog
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/activity.csv

Console: action log as CSV ('keys' scope)

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
kind query no string; allowed values: ["changes","all"]; default: "changes"
actor query no string; minimum length: 1; maximum length: 128
action query no string; pattern: "^[a-z][a-z_.]{0,63}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
422 Not processable. Error codes: BACKOFFICE_EXPORT_TOO_LARGE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_EXPORT_TOO_LARGE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/alerts

Console: alerts

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
stuckAfterMinutes query no integer; minimum: 0; maximum: 1440
largeWinMultiplier query no integer; minimum: 100; maximum: 1000000
HTTP Response / media / model
200 OK. — application/json: Model D_BackofficeAlerts
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/changes

Console: LiveOps change requests (and console user changes, for admins)

Authentication: ConsoleSession.

Registration: dependencies.console and changes.

HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/changes

Console: propose a LiveOps or console user change

These actions pass validation but are always refused here with 403 CHANGE_REFUSED (round.void: 'round voids are made on the operator API: two enrolled people with reconciliation keys propose and approve them'; api-key.create: 'API keys are issued on the operator API: two enrolled people with keys-scope keys propose and approve them'; game.entitlement: 'game entitlement changes are made on the operator API: two enrolled people with games-scope keys propose and approve them'; player.erase: 'player erasures are made on the operator API: two enrolled people with owner keys propose and approve them'; wallet changes: 'wallet changes are made on the operator API'): api-key.create, game.entitlement, player.erase, round.void, wallet.adjust, wallet.connector, wallet.mode, wallet.operation, wallet.signing-key. console.user.create, console.user.reset, console.user.role also need the users permission.

Authentication: ConsoleSession.

Registration: dependencies.console and changes.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. See nested fields / alternatives

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].action yes string; exact value: "free-rounds.create"
$ [oneOf 1].terms yes object; extra fields forbidden
$ [oneOf 1].terms.code yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
$ [oneOf 1].terms.gameVersionId yes string; format: "uuid"
$ [oneOf 1].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 1].terms.amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
$ [oneOf 1].terms.payoutCategory yes string; allowed values: ["promo","normal"]
$ [oneOf 1].terms.budgetMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 1].terms.startsAt yes string; format: "date-time"
$ [oneOf 1].terms.endsAt yes string; format: "date-time"
$ [oneOf 1].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 2] oneOf object; extra fields forbidden
$ [oneOf 2].action yes string; exact value: "free-rounds.remove"
$ [oneOf 2].terms yes object; extra fields forbidden
$ [oneOf 2].terms.campaignId yes string; format: "uuid"
$ [oneOf 2].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 3] oneOf object; extra fields forbidden
$ [oneOf 3].action yes string; exact value: "tournament.create"
$ [oneOf 3].terms yes object; extra fields forbidden
$ [oneOf 3].terms.code yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
$ [oneOf 3].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 3].terms.gameVersionIds yes array; minimum items: 1; maximum items: 64
$ [oneOf 3].terms.gameVersionIds[] each item string; format: "uuid"
$ [oneOf 3].terms.minimumWagerMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 3].terms.scoring yes string; allowed values: ["total-win","wager-volume"]
$ [oneOf 3].terms.startsAt yes string; format: "date-time"
$ [oneOf 3].terms.endsAt yes string; format: "date-time"
$ [oneOf 3].terms.prizesMinor yes array; minimum items: 1; maximum items: 100
$ [oneOf 3].terms.prizesMinor[] each item string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 3].terms.budgetMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 3].terms.fundingSources yes array; minimum items: 1; maximum items: 2
$ [oneOf 3].terms.fundingSources[] each item string; allowed values: ["cash","promo"]
$ [oneOf 3].terms.tieBreak yes string; exact value: "first-achieved"
$ [oneOf 3].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 4] oneOf object; extra fields forbidden
$ [oneOf 4].action yes string; exact value: "tournament.close"
$ [oneOf 4].terms yes object; extra fields forbidden
$ [oneOf 4].terms.tournamentId yes string; format: "uuid"
$ [oneOf 4].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 5] oneOf object; extra fields forbidden
$ [oneOf 5].action yes string; exact value: "jackpot.create"
$ [oneOf 5].terms yes object; extra fields forbidden
$ [oneOf 5].terms.gameVersionId yes string; format: "uuid"
$ [oneOf 5].terms.poolKey yes string; minimum length: 1; maximum length: 64
$ [oneOf 5].terms.reserveByTier yes object; extra field values: string; pattern: "^(0&#124;[1-9][0-9]{0,15})$"
$ [oneOf 5].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 6] oneOf object; extra fields forbidden
$ [oneOf 6].action yes string; exact value: "campaign.create"
$ [oneOf 6].terms yes object; extra fields forbidden
$ [oneOf 6].terms.code yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
$ [oneOf 6].terms.gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
$ [oneOf 6].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 6].terms.budget yes integer; maximum: 9007199254740991; exclusive minimum: 0
$ [oneOf 6].terms.startsAt yes string; format: "date-time"
$ [oneOf 6].terms.endsAt yes string; format: "date-time"
$ [oneOf 6].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 7] oneOf object; extra fields forbidden
$ [oneOf 7].action yes string; exact value: "campaign.status"
$ [oneOf 7].terms yes object; extra fields forbidden
$ [oneOf 7].terms.campaignId yes string; format: "uuid"
$ [oneOf 7].terms.status yes string; allowed values: ["active","paused","ended"]
$ [oneOf 7].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 8] oneOf object; extra fields forbidden
$ [oneOf 8].action yes string; exact value: "market.profile"
$ [oneOf 8].terms yes object; extra fields forbidden
$ [oneOf 8].terms.market yes string; pattern: "^[A-Z]{2}(-[A-Z0-9]{1,3})?$"
$ [oneOf 8].terms.taxBasis yes string; allowed values: ["ggr","ngr","turnover"]
$ [oneOf 8].terms.rateBps yes integer; minimum: 0; maximum: 10000
$ [oneOf 8].terms.freeRoundExempt yes boolean
$ [oneOf 8].terms.validFrom yes string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
$ [oneOf 8].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 9] oneOf object; extra fields forbidden
$ [oneOf 9].action yes string; exact value: "wallet.mode"
$ [oneOf 9].terms yes object; extra fields forbidden
$ [oneOf 9].terms.mode yes string; allowed values: ["custodial","external"]
$ [oneOf 9].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 10] oneOf object; extra fields forbidden
$ [oneOf 10].action yes string; exact value: "wallet.connector"
$ [oneOf 10].terms yes object; extra fields forbidden
$ [oneOf 10].terms.endpoint yes string; format: "uri"; maximum length: 2048
$ [oneOf 10].terms.responseKeyId yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
$ [oneOf 10].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 11] oneOf object; extra fields forbidden
$ [oneOf 11].action yes string; exact value: "wallet.signing-key"
$ [oneOf 11].terms yes object; extra fields forbidden
$ [oneOf 11].terms.keyId yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
$ [oneOf 11].terms.publicKeyPem yes string; minimum length: 64; maximum length: 4096
$ [oneOf 11].terms.notBefore no string; format: "date-time"
$ [oneOf 11].terms.expiresAt no string; format: "date-time"
$ [oneOf 11].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 12] oneOf object; extra fields forbidden
$ [oneOf 12].action yes string; exact value: "api-key.create"
$ [oneOf 12].terms yes object; extra fields forbidden
$ [oneOf 12].terms.label yes string; minimum length: 1; maximum length: 128
$ [oneOf 12].terms.scopes yes array; minimum items: 1; maximum items: 16
$ [oneOf 12].terms.scopes[] each item string; allowed values: ["keys","launch","wallet","wallet-admin","campaigns","responsible-gaming","reconciliation","games","disputes","reports","verifier"]
$ [oneOf 12].terms.ttlSeconds no integer; minimum: 300; maximum: 7776000; default: 7776000
$ [oneOf 12].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 13] oneOf object; extra fields forbidden
$ [oneOf 13].action yes string; exact value: "game.entitlement"
$ [oneOf 13].terms yes object; extra fields forbidden
$ [oneOf 13].terms.gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
$ [oneOf 13].terms.enabled yes boolean
$ [oneOf 13].terms.currencies yes array; minimum items: 1; maximum items: 32
$ [oneOf 13].terms.currencies[] each item string; pattern: "^[A-Z]{3}$"
$ [oneOf 13].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 14] oneOf object; extra fields forbidden
$ [oneOf 14].action yes string; exact value: "jackpot.membership.offer"
$ [oneOf 14].terms yes object; extra fields forbidden
$ [oneOf 14].terms.poolId yes string; format: "uuid"
$ [oneOf 14].terms.operatorId yes string; format: "uuid"
$ [oneOf 14].terms.gameVersionId yes string; format: "uuid"
$ [oneOf 14].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 15] oneOf object; extra fields forbidden
$ [oneOf 15].action yes string; exact value: "jackpot.membership.accept"
$ [oneOf 15].terms yes object; extra fields forbidden
$ [oneOf 15].terms.poolId yes string; format: "uuid"
$ [oneOf 15].terms.offerId yes string; format: "uuid"
$ [oneOf 15].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 16] oneOf object; extra fields forbidden
$ [oneOf 16].action yes string; exact value: "wallet.operation"
$ [oneOf 16].terms yes object; extra fields forbidden
$ [oneOf 16].terms.operationId yes string; format: "uuid"
$ [oneOf 16].terms.kind yes string; allowed values: ["debit","credit","cancel"]
$ [oneOf 16].terms.playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 16].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 16].terms.amount no integer; maximum: 9007199254740991; exclusive minimum: 0
$ [oneOf 16].terms.originalOperationId no string; format: "uuid"
$ [oneOf 16].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 17] oneOf object; extra fields forbidden
$ [oneOf 17].action yes string; exact value: "wallet.adjust"
$ [oneOf 17].terms yes object; extra fields forbidden
$ [oneOf 17].terms.externalPlayerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 17].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 17].terms.amountMinor yes string
$ [oneOf 17].terms.reason yes string; minimum length: 1; maximum length: 200
$ [oneOf 17].terms.reference yes string; minimum length: 1; maximum length: 64
$ [oneOf 17].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 18] oneOf object; extra fields forbidden
$ [oneOf 18].action yes string; exact value: "player.erase"
$ [oneOf 18].terms yes object; extra fields forbidden
$ [oneOf 18].terms.accountId yes string; format: "uuid"
$ [oneOf 18].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 19] oneOf object; extra fields forbidden
$ [oneOf 19].action yes string; exact value: "round.void"
$ [oneOf 19].terms yes object; extra fields forbidden
$ [oneOf 19].terms.roundId yes string; format: "uuid"
$ [oneOf 19].terms.reason yes string; minimum length: 1; maximum length: 200
$ [oneOf 19].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 20] oneOf object; extra fields forbidden
$ [oneOf 20].action yes string; exact value: "console.user.create"
$ [oneOf 20].terms yes object; extra fields forbidden
$ [oneOf 20].terms.username yes string; pattern: "^[a-z0-9][a-z0-9._@-]{2,127}$"
$ [oneOf 20].terms.role yes string; allowed values: ["viewer","support","finance","admin"]
$ [oneOf 20].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 21] oneOf object; extra fields forbidden
$ [oneOf 21].action yes string; exact value: "console.user.role"
$ [oneOf 21].terms yes object; extra fields forbidden
$ [oneOf 21].terms.userId yes string; format: "uuid"
$ [oneOf 21].terms.role yes string; allowed values: ["viewer","support","finance","admin"]
$ [oneOf 21].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 22] oneOf object; extra fields forbidden
$ [oneOf 22].action yes string; exact value: "console.user.reset"
$ [oneOf 22].terms yes object; extra fields forbidden
$ [oneOf 22].terms.userId yes string; format: "uuid"
$ [oneOf 22].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
HTTP Response / media / model
201 Created. — application/json: object — Fields: id string, termsSha256 string, expiresAt string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CHANGE_REFUSED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
409 Conflict. Error codes: CHANGE_REFUSED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/changes/{changeId}/decision

Console: approve or reject a change; approving needs a fresh authenticator code

Authentication: ConsoleSession.

Registration: dependencies.console and changes.

Parameter Location Required Type / constraints
changeId path yes string; format: "uuid"
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
decision yes string; allowed values: ["approved","rejected"]
confirm yes string; pattern: "^[0-9a-f]{64}$"
code no string; pattern: "^\\d{6}$"
echo no object; extra fields forbidden
echo.amountMinor no string; maximum length: 32
echo.currency no string; maximum length: 16
echo.target no string; maximum length: 2048
HTTP Response / media / model
200 OK. — application/json: object — Fields: decision string, result Any JSON value
400 Invalid request. Error codes: CHANGE_REFUSED, CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED","CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_STEP_UP_FAILED, CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_STEP_UP_FAILED","CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CHANGE_REFUSED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN, DATA_PROTECTION_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CHANGE_REFUSED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN","DATA_PROTECTION_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
409 Conflict. Error codes: CHANGE_REFUSED, CONSOLE_USER_EXISTS, PLAYER_ERASURE_REFUSED, WALLET_TRANSACTION_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED","CONSOLE_USER_EXISTS","PLAYER_ERASURE_REFUSED","WALLET_TRANSACTION_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONSOLE_UNAVAILABLE, CONTROL_PLANE_BUSY, EXTERNAL_WALLET_UNAVAILABLE, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONSOLE_UNAVAILABLE","CONTROL_PLANE_BUSY","EXTERNAL_WALLET_UNAVAILABLE","MONEY_PATH_BUSY"]

GET /operator/console/api/fx/rates

Console: FX source freshness, active observations and quarantined candidates

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

HTTP Response / media / model
200 OK. — application/json: object — Fields: baseCurrency string, purpose string, rates array
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/games

Console: enabled operator games and development test-play availability

Authentication: ConsoleSession.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — application/json: object — Fields: testBets number, games array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/games/play

Console: launch a fresh funded development test session

Admin console session and CSRF header required. Disabled unless a private test key is explicitly configured and the database birth is staging with the configured environment ID. Restricted to that key's custodial operator, enabled game entitlements and installed clients. Credits a new synthetic player with enough native-currency test units for 10,000 default bets from the pinned currency profile through the standard wallet API; retries with the same requestId and currency reuse the deposit. Returns a relative game launch URL, valid for initial authentication for five minutes. Six requests per minute per console user. No production credits or external casino wallet calls.

Authentication: ConsoleSession.

Registration: dependencies.console.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
currency yes string; pattern: "^[A-Z]{3}$"
requestId yes string; format: "uuid"
HTTP Response / media / model
201 Created. — application/json: object — Fields: url string, expiresInSeconds number
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. Error codes: CONSOLE_GAME_REFUSED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_GAME_REFUSED"]

GET /operator/console/api/liveops

Console: LiveOps report

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_LiveOpsReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/liveops-games

Console: games LiveOps changes can name

Authentication: ConsoleSession.

Registration: dependencies.console and changes.

HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/liveops.csv

Console: LiveOps report as CSV

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/login

Console: sign in; sets the rgs_console session cookie

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
operator yes string; minimum length: 1; maximum length: 128
username yes string; pattern: "^[a-z0-9][a-z0-9._@-]{2,127}$"
password yes string; minimum length: 1; maximum length: 1024
code yes string; pattern: "^\\d{6}$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: user object, database object, expiresAt string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_LOGIN_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_LOGIN_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONSOLE_UNAVAILABLE, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAVAILABLE","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/logout

Console: sign out; clears the session cookie

Authentication: ConsoleSession.

Registration: dependencies.console.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"
HTTP Response / media / model
204 No content.
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/markets

Console: market profiles

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

HTTP Response / media / model
200 OK. — application/json: object — Fields: profiles array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/me

Console: the signed-in user and the database identity

Authentication: ConsoleSession.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — application/json: object — Fields: user object, database object
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/platform-alerts

Console: platform alerts, for users the platform owner granted

Authentication: ConsoleSession.

Registration: dependencies.console and options.platformAlerts.

HTTP Response / media / model
200 OK. — application/json: object — Fields: active array, resolved array
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/players

Console: look up a player by external id

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
currency query no string; pattern: "^[A-Z]{3}$"
externalPlayerId query yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 OK. — application/json: Model D_BackofficePlayer
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/players/activity

Console: a player's activity

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
HTTP Response / media / model
200 OK. — application/json: Model D_PlayerActivity
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/players/data

Console: a player's data (data protection access)

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 OK. — application/json: Model D_PlayerDataExport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN, DATA_PROTECTION_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN","DATA_PROTECTION_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/players/time-out

Console: time-out on the player's request, on every account of the player

Authentication: ConsoleSession.

Registration: dependencies.console and responsibleGaming.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
period yes string; allowed values: ["24h","7d","30d","42d"]
HTTP Response / media / model
200 OK. — application/json: Model D_ResponsibleGamingLimits
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/players/wins

Console: a player's wins

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
HTTP Response / media / model
200 OK. — application/json: Model D_PlayerWins
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/cohorts

Console: cohort report

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_CohortReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_COHORTS_DISABLED, BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_COHORTS_DISABLED","BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/cohorts.csv

Console: cohort report as CSV

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_COHORTS_DISABLED, BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_COHORTS_DISABLED","BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/daily

Console: daily report

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
groupBy query no string; allowed values: ["day","game","market"]
HTTP Response / media / model
200 OK. — application/json: Model D_DailyReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/daily.csv

Console: daily report as CSV

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
groupBy query no string; allowed values: ["day","game","market"]
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/fx

Console: historical EUR reporting using each round's pinned reference rate

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: baseCurrency string, precision number, complete boolean, unconvertedRounds string, wagerEurMicros string, payoutEurMicros string, promoPayoutEurMicros string, ggrEurMicros string, ngrEurMicros string, rows array, from string, to string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/liability

Console: liability report

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_LiabilityReport
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/liability.csv

Console: liability report as CSV

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/tax

Console: monthly tax report

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
month query yes string; pattern: "^(19&#124;20)\\d\\d-(0[1-9]&#124;1[0-2])$"
market query no string; pattern: "^[A-Z]{2}(-[A-Z0-9]{1,3})?$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_TaxReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/reports/tax.csv

Console: monthly tax report as CSV

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
month query yes string; pattern: "^(19&#124;20)\\d\\d-(0[1-9]&#124;1[0-2])$"
market query no string; pattern: "^[A-Z]{2}(-[A-Z0-9]{1,3})?$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/rounds

Console: search rounds

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
status query no string; minimum length: 1; maximum length: 256
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
limit query no integer; minimum: 1; maximum: 200
cursor query no string; minimum length: 1; maximum length: 512
HTTP Response / media / model
200 OK. — application/json: object — Fields: rounds array, nextCursor See nested fields / alternatives
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/rounds.csv

Console: rounds as CSV

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
status query no string; minimum length: 1; maximum length: 256
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
422 Not processable. Error codes: BACKOFFICE_EXPORT_TOO_LARGE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_EXPORT_TOO_LARGE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/rounds/{roundId}

Console: one round

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_BackofficeRoundDetail
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/rounds/{roundId}/replay

Console: replay and verify a round

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice and replayRound.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_Record_string_unknown
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/rounds/attention

Console: rounds needing attention and player outliers

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
olderThanMinutes query no integer; minimum: 0; maximum: 1440
status query no string; allowed values: ["created","debit_pending","credit_pending","cancel_pending","manual_review"]
outlierWindowMinutes query no integer; minimum: 1; maximum: 1440
velocityRounds query no integer; minimum: 1; maximum: 1000000
winRateMinimumRounds query no integer; minimum: 1; maximum: 1000000
winRatePercentOfRtp query no integer; minimum: 101; maximum: 100000
HTTP Response / media / model
200 OK. — application/json: Model D_RoundAttention
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/rounds/attention.csv

Console: rounds needing attention as CSV

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
olderThanMinutes query no integer; minimum: 0; maximum: 1440
status query no string; allowed values: ["created","debit_pending","credit_pending","cancel_pending","manual_review"]
outlierWindowMinutes query no integer; minimum: 1; maximum: 1440
velocityRounds query no integer; minimum: 1; maximum: 1000000
winRateMinimumRounds query no integer; minimum: 1; maximum: 1000000
winRatePercentOfRtp query no integer; minimum: 101; maximum: 100000
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
422 Not processable. Error codes: BACKOFFICE_EXPORT_TOO_LARGE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_EXPORT_TOO_LARGE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/rounds/lookup

Console: find rounds by external round id or wallet transaction id

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
reference query yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 OK. — application/json: Model D_RoundLookup
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/setup

Console: complete a user's setup from a setup link

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
token yes string; pattern: "^[A-Za-z0-9_-]{43}$"
password yes string; minimum length: 12; maximum length: 1024
code yes string; pattern: "^\\d{6}$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: operatorCode string, username string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONSOLE_UNAVAILABLE, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAVAILABLE","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/setup/info

Console: what a setup link is for

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
token yes string; pattern: "^[A-Za-z0-9_-]{43}$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: operatorCode string, username string, role string; allowed values: ["finance","viewer","support","admin"], totpSecret string, otpauthUri string, qr object
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONSOLE_UNAVAILABLE, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAVAILABLE","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/tournaments/{tournamentId}/standings

Console: tournament standings (player ids masked without the players permission)

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
tournamentId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_TournamentStandings
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/users

Console: list console users

Authentication: ConsoleSession.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/users

Console: create a console user (two people where required)

Authentication: ConsoleSession.

Registration: dependencies.console.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
username yes string; pattern: "^[a-z0-9][a-z0-9._@-]{2,127}$"
role yes string; allowed values: ["viewer","support","finance","admin"]
HTTP Response / media / model
201 Created. — application/json: object — Fields: userId string, username string, role string; allowed values: ["finance","viewer","support","admin"], setupToken string, setupExpiresAt string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
409 Conflict. Error codes: CONSOLE_USER_EXISTS, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_USER_EXISTS","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/users.csv

Console: console users as CSV

Authentication: ConsoleSession.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/users/{userId}/disable

Console: disable a user

Authentication: ConsoleSession.

Registration: dependencies.console.

Parameter Location Required Type / constraints
userId path yes string; format: "uuid"
x-console-csrf header yes string; exact value: "1"

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
HTTP Response / media / model
200 OK. — application/json: object — Fields: user Model D_ConsoleUserView, setupToken string, setupExpiresAt string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
409 Conflict. Error codes: CONSOLE_USER_EXISTS, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_USER_EXISTS","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/users/{userId}/reset

Console: reset a user; issues a new setup link (two people where required)

Authentication: ConsoleSession.

Registration: dependencies.console.

Parameter Location Required Type / constraints
userId path yes string; format: "uuid"
x-console-csrf header yes string; exact value: "1"

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
HTTP Response / media / model
200 OK. — application/json: object — Fields: user Model D_ConsoleUserView, setupToken string, setupExpiresAt string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
409 Conflict. Error codes: CONSOLE_USER_EXISTS, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_USER_EXISTS","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/users/{userId}/role

Console: change a user's role (two people where required)

Authentication: ConsoleSession.

Registration: dependencies.console.

Parameter Location Required Type / constraints
userId path yes string
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
role yes string; allowed values: ["viewer","support","finance","admin"]
HTTP Response / media / model
200 OK. — application/json: object — Fields: user Model D_ConsoleUserView, setupToken string, setupExpiresAt string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
409 Conflict. Error codes: CONSOLE_USER_EXISTS, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_USER_EXISTS","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/console/api/users/{userId}/sign-out

Console: sign a user out everywhere

Authentication: ConsoleSession.

Registration: dependencies.console.

Parameter Location Required Type / constraints
userId path yes string; format: "uuid"
x-console-csrf header yes string; exact value: "1"

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
HTTP Response / media / model
200 OK. — application/json: object — Fields: user Model D_ConsoleUserView, setupToken string, setupExpiresAt string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED, OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
409 Conflict. Error codes: CONSOLE_USER_EXISTS, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_USER_EXISTS","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/api/wallet-verifications

Wallet verifier: recent runs

Authentication: ConsoleSession.

Registration: dependencies.console and walletVerifier.

HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN, WALLET_VERIFIER_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN","WALLET_VERIFIER_DISABLED"]
409 Conflict. Error codes: WALLET_VERIFIER_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_UNAVAILABLE"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, WALLET_VERIFIER_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","WALLET_VERIFIER_STOPPED"]

POST /operator/console/api/wallet-verifications

Wallet verifier: run a small, net-zero check through the real wallet path

Authentication: ConsoleSession.

Registration: dependencies.console and walletVerifier.

Parameter Location Required Type / constraints
x-console-csrf header yes string; exact value: "1"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"
amount no integer; minimum: 1; maximum: 1000; default: 1
confirm yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
201 Created. — application/json: Model D_WalletVerificationRun
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN, WALLET_VERIFIER_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN","WALLET_VERIFIER_DISABLED"]
409 Conflict. Error codes: WALLET_VERIFIER_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, WALLET_VERIFIER_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","WALLET_VERIFIER_STOPPED"]

GET /operator/console/api/wallet-verifications/attention

Wallet verifier: runs needing attention

Authentication: ConsoleSession.

Registration: dependencies.console and walletVerifier.

HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: CONSOLE_DISABLED, CONSOLE_FORBIDDEN, WALLET_VERIFIER_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED","CONSOLE_FORBIDDEN","WALLET_VERIFIER_DISABLED"]
409 Conflict. Error codes: WALLET_VERIFIER_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_UNAVAILABLE"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, WALLET_VERIFIER_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","WALLET_VERIFIER_STOPPED"]

GET /operator/console/api/wins

Console: large wins (player ids masked without the players permission)

Authentication: ConsoleSession.

Registration: dependencies.console and backoffice.

Parameter Location Required Type / constraints
from query no string; format: "date-time"
to query no string; format: "date-time"
currency query no string; pattern: "^[A-Z]{3}$"
minMultiplier query no integer; minimum: 100; maximum: 1000000
HTTP Response / media / model
200 OK. — application/json: Model D_LargeWins
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: CONSOLE_UNAUTHENTICATED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_UNAUTHENTICATED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CONSOLE_DISABLED, CONSOLE_FORBIDDEN. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CONSOLE_DISABLED","CONSOLE_FORBIDDEN"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /operator/console/assets/console.css

Console: style sheet

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — text/css: string
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError

GET /operator/console/assets/console.js

Console: application script

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — text/javascript: string
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError

GET /operator/console/setup

Console: the setup page (same application)

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: dependencies.console.

HTTP Response / media / model
200 OK. — text/html: string
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError

GET /operator/v1/backoffice/activity

Back office: action log ('keys' scope)

Authentication: OperatorBearer.

Operator scope: keys.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
kind query no string; allowed values: ["changes","all"]; default: "changes"
actor query no string; minimum length: 1; maximum length: 128
action query no string; pattern: "^[a-z][a-z_.]{0,63}$"
before query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{6}Z\\&#124;[1-9][0-9]{0,18}$"
limit query no integer; minimum: 1; maximum: 100; default: 100
HTTP Response / media / model
200 OK. — application/json: Model D_ActivityLog
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/activity.csv

Back office: action log as CSV ('keys' scope)

Authentication: OperatorBearer.

Operator scope: keys.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
kind query no string; allowed values: ["changes","all"]; default: "changes"
actor query no string; minimum length: 1; maximum length: 128
action query no string; pattern: "^[a-z][a-z_.]{0,63}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
422 Not processable. Error codes: BACKOFFICE_EXPORT_TOO_LARGE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_EXPORT_TOO_LARGE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/alerts

Back office: alerts

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
stuckAfterMinutes query no integer; minimum: 0; maximum: 1440
largeWinMultiplier query no integer; minimum: 100; maximum: 1000000
HTTP Response / media / model
200 OK. — application/json: Model D_BackofficeAlerts
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/fx/rates

Back office: FX source freshness, active observations and quarantined candidates

Read-only source status. Rates are reference values for reporting; they do not convert a wallet balance or execute an exchange. Approving a quarantined observation requires the environment-guarded owner command and a recorded reason.

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

HTTP Response / media / model
200 OK. — application/json: object — Fields: baseCurrency string, purpose string, rates array
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/liveops

Back office: LiveOps report

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_LiveOpsReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/liveops.csv

Back office: LiveOps report as CSV

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/markets

Back office: market profiles

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

HTTP Response / media / model
200 OK. — application/json: object — Fields: profiles array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/players

Back office: look up a player by external id

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
currency query no string; pattern: "^[A-Z]{3}$"
externalPlayerId query yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 OK. — application/json: Model D_BackofficePlayer
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/players/activity

Back office: a player's activity

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
HTTP Response / media / model
200 OK. — application/json: Model D_PlayerActivity
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/players/data

Back office: a player's data (data protection access)

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 OK. — application/json: Model D_PlayerDataExport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, DATA_PROTECTION_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","DATA_PROTECTION_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/backoffice/players/erase

Back office: erase a player by pseudonymisation (GDPR art. 17)

One owner key, or a player.erase change where two people are required. Money records are kept.

Authentication: OperatorBearer.

Operator scope: *.

Registration: operatorAuth and backofficeService.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
accountId yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_PlayerErasure
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, DATA_PROTECTION_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","DATA_PROTECTION_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
409 Conflict. Error codes: PLAYER_ERASURE_REFUSED, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["PLAYER_ERASURE_REFUSED","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/players/wins

Back office: a player's wins

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
HTTP Response / media / model
200 OK. — application/json: Model D_PlayerWins
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/cohorts

Back office: cohort report

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_CohortReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_COHORTS_DISABLED, BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_COHORTS_DISABLED","BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/cohorts.csv

Back office: cohort report as CSV

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_COHORTS_DISABLED, BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_COHORTS_DISABLED","BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/daily

Back office: daily report

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
groupBy query no string; allowed values: ["day","game","market"]
HTTP Response / media / model
200 OK. — application/json: Model D_DailyReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/daily.csv

Back office: daily report as CSV

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
groupBy query no string; allowed values: ["day","game","market"]
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/fx

Back office: historical EUR reporting using each round's pinned reference rate

Native wager, payout and promotional payout totals grouped by currency and immutable rate observation. EUR values are integer strings scaled by 1,000,000, rounded half-even per group. Missing legacy pins are reported as incomplete, never converted at today's rate. Date window is at most 92 days; cancelled rounds are excluded.

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
to query no string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
currency query no string; pattern: "^[A-Z]{3}$"
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: baseCurrency string, precision number, complete boolean, unconvertedRounds string, wagerEurMicros string, payoutEurMicros string, promoPayoutEurMicros string, ggrEurMicros string, ngrEurMicros string, rows array, from string, to string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/liability

Back office: liability report

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_LiabilityReport
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/liability.csv

Back office: liability report as CSV

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/tax

Back office: monthly tax report

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
month query yes string; pattern: "^(19&#124;20)\\d\\d-(0[1-9]&#124;1[0-2])$"
market query no string; pattern: "^[A-Z]{2}(-[A-Z0-9]{1,3})?$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: Model D_TaxReport
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/reports/tax.csv

Back office: monthly tax report as CSV

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
month query yes string; pattern: "^(19&#124;20)\\d\\d-(0[1-9]&#124;1[0-2])$"
market query no string; pattern: "^[A-Z]{2}(-[A-Z0-9]{1,3})?$"
currency query no string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/rounds

Back office: search rounds

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
status query no string; minimum length: 1; maximum length: 256
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
limit query no integer; minimum: 1; maximum: 200
cursor query no string; minimum length: 1; maximum length: 512
HTTP Response / media / model
200 OK. — application/json: object — Fields: rounds array, nextCursor See nested fields / alternatives
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/rounds.csv

Back office: rounds as CSV

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
externalPlayerId query yes string; minimum length: 1; maximum length: 256
currency query no string; pattern: "^[A-Z]{3}$"
from query no string; format: "date-time"
to query no string; format: "date-time"
status query no string; minimum length: 1; maximum length: 256
gameCode query no string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
422 Not processable. Error codes: BACKOFFICE_EXPORT_TOO_LARGE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_EXPORT_TOO_LARGE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/rounds/{roundId}

Back office: one round

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_BackofficeRoundDetail
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/rounds/{roundId}/replay

Back office: replay and verify a round

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService and dependencies.rounds.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_Record_string_unknown
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","WAGER_NOT_ALLOWED"]
404 Not found. Error codes: ROUND_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ROUND_NOT_FOUND"]
409 Conflict. Error codes: JACKPOT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["JACKPOT_UNAVAILABLE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/rounds/attention

Back office: rounds needing attention and player outliers

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
olderThanMinutes query no integer; minimum: 0; maximum: 1440
status query no string; allowed values: ["created","debit_pending","credit_pending","cancel_pending","manual_review"]
outlierWindowMinutes query no integer; minimum: 1; maximum: 1440
velocityRounds query no integer; minimum: 1; maximum: 1000000
winRateMinimumRounds query no integer; minimum: 1; maximum: 1000000
winRatePercentOfRtp query no integer; minimum: 101; maximum: 100000
HTTP Response / media / model
200 OK. — application/json: Model D_RoundAttention
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/rounds/attention.csv

Back office: rounds needing attention as CSV

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
olderThanMinutes query no integer; minimum: 0; maximum: 1440
status query no string; allowed values: ["created","debit_pending","credit_pending","cancel_pending","manual_review"]
outlierWindowMinutes query no integer; minimum: 1; maximum: 1440
velocityRounds query no integer; minimum: 1; maximum: 1000000
winRateMinimumRounds query no integer; minimum: 1; maximum: 1000000
winRatePercentOfRtp query no integer; minimum: 101; maximum: 100000
HTTP Response / media / model
200 OK. — text/csv: string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
422 Not processable. Error codes: BACKOFFICE_EXPORT_TOO_LARGE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_EXPORT_TOO_LARGE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/rounds/lookup

Back office: find rounds by external round id or wallet transaction id

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
reference query yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 OK. — application/json: Model D_RoundLookup
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/tournaments/{tournamentId}/standings

Back office: tournament standings

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
tournamentId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_TournamentStandings
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/backoffice/wallet-verifications

Wallet verifier: recent runs

Authentication: OperatorBearer.

Operator scope: verifier.

Registration: operatorAuth and dependencies.walletVerifier.

HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: WALLET_VERIFIER_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_DISABLED"]
409 Conflict. Error codes: WALLET_VERIFIER_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_UNAVAILABLE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE, WALLET_VERIFIER_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE","WALLET_VERIFIER_STOPPED"]

POST /operator/v1/backoffice/wallet-verifications

Wallet verifier: run a small, net-zero check through the real wallet path

Authentication: OperatorBearer.

Operator scope: verifier.

Registration: operatorAuth and dependencies.walletVerifier.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"
amount no integer; minimum: 1; maximum: 1000; default: 1
confirm yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
201 Created. — application/json: Model D_WalletVerificationRun
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: WALLET_VERIFIER_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_DISABLED"]
409 Conflict. Error codes: WALLET_VERIFIER_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE, WALLET_VERIFIER_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE","WALLET_VERIFIER_STOPPED"]

GET /operator/v1/backoffice/wallet-verifications/attention

Wallet verifier: runs needing attention

Authentication: OperatorBearer.

Operator scope: verifier.

Registration: operatorAuth and dependencies.walletVerifier.

HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: WALLET_VERIFIER_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_DISABLED"]
409 Conflict. Error codes: WALLET_VERIFIER_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_VERIFIER_UNAVAILABLE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE, WALLET_VERIFIER_STOPPED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE","WALLET_VERIFIER_STOPPED"]

GET /operator/v1/backoffice/wins

Back office: large wins

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth and backofficeService.

Parameter Location Required Type / constraints
from query no string; format: "date-time"
to query no string; format: "date-time"
currency query no string; pattern: "^[A-Z]{3}$"
minMultiplier query no integer; minimum: 100; maximum: 1000000
HTTP Response / media / model
200 OK. — application/json: Model D_LargeWins
400 Invalid request. Error codes: INVALID_BACKOFFICE_QUERY, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_BACKOFFICE_QUERY","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/changes

List two-person change requests in one scope (console user changes are not listed here)

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
scope query no string; allowed values: ["campaigns","wallet","wallet-admin","keys","games","players","reconciliation"]; default: "campaigns"
HTTP Response / media / model
200 OK. — application/json: array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/changes

Propose a two-person change; a different enrolled person approves it

The key needs the action's change scope (operator-changes.ts changeScope): campaigns, wallet (custodial adjustment), wallet-admin (wallet configuration and external operations), keys or games; player.erase needs an owner key. These actions pass validation but are always refused here with 403 CHANGE_REFUSED (console user changes are made in the console): console.user.create, console.user.reset, console.user.role.

Authentication: OperatorBearer.

Operator scope: *.

Registration: operatorAuth.

Request body: required.

Content type: application/json. See nested fields / alternatives

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].action yes string; exact value: "free-rounds.create"
$ [oneOf 1].terms yes object; extra fields forbidden
$ [oneOf 1].terms.code yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
$ [oneOf 1].terms.gameVersionId yes string; format: "uuid"
$ [oneOf 1].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 1].terms.amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
$ [oneOf 1].terms.payoutCategory yes string; allowed values: ["promo","normal"]
$ [oneOf 1].terms.budgetMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 1].terms.startsAt yes string; format: "date-time"
$ [oneOf 1].terms.endsAt yes string; format: "date-time"
$ [oneOf 1].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 2] oneOf object; extra fields forbidden
$ [oneOf 2].action yes string; exact value: "free-rounds.remove"
$ [oneOf 2].terms yes object; extra fields forbidden
$ [oneOf 2].terms.campaignId yes string; format: "uuid"
$ [oneOf 2].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 3] oneOf object; extra fields forbidden
$ [oneOf 3].action yes string; exact value: "tournament.create"
$ [oneOf 3].terms yes object; extra fields forbidden
$ [oneOf 3].terms.code yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
$ [oneOf 3].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 3].terms.gameVersionIds yes array; minimum items: 1; maximum items: 64
$ [oneOf 3].terms.gameVersionIds[] each item string; format: "uuid"
$ [oneOf 3].terms.minimumWagerMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 3].terms.scoring yes string; allowed values: ["total-win","wager-volume"]
$ [oneOf 3].terms.startsAt yes string; format: "date-time"
$ [oneOf 3].terms.endsAt yes string; format: "date-time"
$ [oneOf 3].terms.prizesMinor yes array; minimum items: 1; maximum items: 100
$ [oneOf 3].terms.prizesMinor[] each item string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 3].terms.budgetMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
$ [oneOf 3].terms.fundingSources yes array; minimum items: 1; maximum items: 2
$ [oneOf 3].terms.fundingSources[] each item string; allowed values: ["cash","promo"]
$ [oneOf 3].terms.tieBreak yes string; exact value: "first-achieved"
$ [oneOf 3].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 4] oneOf object; extra fields forbidden
$ [oneOf 4].action yes string; exact value: "tournament.close"
$ [oneOf 4].terms yes object; extra fields forbidden
$ [oneOf 4].terms.tournamentId yes string; format: "uuid"
$ [oneOf 4].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 5] oneOf object; extra fields forbidden
$ [oneOf 5].action yes string; exact value: "jackpot.create"
$ [oneOf 5].terms yes object; extra fields forbidden
$ [oneOf 5].terms.gameVersionId yes string; format: "uuid"
$ [oneOf 5].terms.poolKey yes string; minimum length: 1; maximum length: 64
$ [oneOf 5].terms.reserveByTier yes object; extra field values: string; pattern: "^(0&#124;[1-9][0-9]{0,15})$"
$ [oneOf 5].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 6] oneOf object; extra fields forbidden
$ [oneOf 6].action yes string; exact value: "campaign.create"
$ [oneOf 6].terms yes object; extra fields forbidden
$ [oneOf 6].terms.code yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
$ [oneOf 6].terms.gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
$ [oneOf 6].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 6].terms.budget yes integer; maximum: 9007199254740991; exclusive minimum: 0
$ [oneOf 6].terms.startsAt yes string; format: "date-time"
$ [oneOf 6].terms.endsAt yes string; format: "date-time"
$ [oneOf 6].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 7] oneOf object; extra fields forbidden
$ [oneOf 7].action yes string; exact value: "campaign.status"
$ [oneOf 7].terms yes object; extra fields forbidden
$ [oneOf 7].terms.campaignId yes string; format: "uuid"
$ [oneOf 7].terms.status yes string; allowed values: ["active","paused","ended"]
$ [oneOf 7].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 8] oneOf object; extra fields forbidden
$ [oneOf 8].action yes string; exact value: "market.profile"
$ [oneOf 8].terms yes object; extra fields forbidden
$ [oneOf 8].terms.market yes string; pattern: "^[A-Z]{2}(-[A-Z0-9]{1,3})?$"
$ [oneOf 8].terms.taxBasis yes string; allowed values: ["ggr","ngr","turnover"]
$ [oneOf 8].terms.rateBps yes integer; minimum: 0; maximum: 10000
$ [oneOf 8].terms.freeRoundExempt yes boolean
$ [oneOf 8].terms.validFrom yes string; pattern: "^\\d{4}-\\d{2}-\\d{2}$"
$ [oneOf 8].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 9] oneOf object; extra fields forbidden
$ [oneOf 9].action yes string; exact value: "wallet.mode"
$ [oneOf 9].terms yes object; extra fields forbidden
$ [oneOf 9].terms.mode yes string; allowed values: ["custodial","external"]
$ [oneOf 9].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 10] oneOf object; extra fields forbidden
$ [oneOf 10].action yes string; exact value: "wallet.connector"
$ [oneOf 10].terms yes object; extra fields forbidden
$ [oneOf 10].terms.endpoint yes string; format: "uri"; maximum length: 2048
$ [oneOf 10].terms.responseKeyId yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
$ [oneOf 10].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 11] oneOf object; extra fields forbidden
$ [oneOf 11].action yes string; exact value: "wallet.signing-key"
$ [oneOf 11].terms yes object; extra fields forbidden
$ [oneOf 11].terms.keyId yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"
$ [oneOf 11].terms.publicKeyPem yes string; minimum length: 64; maximum length: 4096
$ [oneOf 11].terms.notBefore no string; format: "date-time"
$ [oneOf 11].terms.expiresAt no string; format: "date-time"
$ [oneOf 11].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 12] oneOf object; extra fields forbidden
$ [oneOf 12].action yes string; exact value: "api-key.create"
$ [oneOf 12].terms yes object; extra fields forbidden
$ [oneOf 12].terms.label yes string; minimum length: 1; maximum length: 128
$ [oneOf 12].terms.scopes yes array; minimum items: 1; maximum items: 16
$ [oneOf 12].terms.scopes[] each item string; allowed values: ["keys","launch","wallet","wallet-admin","campaigns","responsible-gaming","reconciliation","games","disputes","reports","verifier"]
$ [oneOf 12].terms.ttlSeconds no integer; minimum: 300; maximum: 7776000; default: 7776000
$ [oneOf 12].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 13] oneOf object; extra fields forbidden
$ [oneOf 13].action yes string; exact value: "game.entitlement"
$ [oneOf 13].terms yes object; extra fields forbidden
$ [oneOf 13].terms.gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
$ [oneOf 13].terms.enabled yes boolean
$ [oneOf 13].terms.currencies yes array; minimum items: 1; maximum items: 32
$ [oneOf 13].terms.currencies[] each item string; pattern: "^[A-Z]{3}$"
$ [oneOf 13].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 14] oneOf object; extra fields forbidden
$ [oneOf 14].action yes string; exact value: "jackpot.membership.offer"
$ [oneOf 14].terms yes object; extra fields forbidden
$ [oneOf 14].terms.poolId yes string; format: "uuid"
$ [oneOf 14].terms.operatorId yes string; format: "uuid"
$ [oneOf 14].terms.gameVersionId yes string; format: "uuid"
$ [oneOf 14].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 15] oneOf object; extra fields forbidden
$ [oneOf 15].action yes string; exact value: "jackpot.membership.accept"
$ [oneOf 15].terms yes object; extra fields forbidden
$ [oneOf 15].terms.poolId yes string; format: "uuid"
$ [oneOf 15].terms.offerId yes string; format: "uuid"
$ [oneOf 15].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 16] oneOf object; extra fields forbidden
$ [oneOf 16].action yes string; exact value: "wallet.operation"
$ [oneOf 16].terms yes object; extra fields forbidden
$ [oneOf 16].terms.operationId yes string; format: "uuid"
$ [oneOf 16].terms.kind yes string; allowed values: ["debit","credit","cancel"]
$ [oneOf 16].terms.playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 16].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 16].terms.amount no integer; maximum: 9007199254740991; exclusive minimum: 0
$ [oneOf 16].terms.originalOperationId no string; format: "uuid"
$ [oneOf 16].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 17] oneOf object; extra fields forbidden
$ [oneOf 17].action yes string; exact value: "wallet.adjust"
$ [oneOf 17].terms yes object; extra fields forbidden
$ [oneOf 17].terms.externalPlayerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 17].terms.currency yes string; pattern: "^[A-Z]{3}$"
$ [oneOf 17].terms.amountMinor yes string
$ [oneOf 17].terms.reason yes string; minimum length: 1; maximum length: 200
$ [oneOf 17].terms.reference yes string; minimum length: 1; maximum length: 64
$ [oneOf 17].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 18] oneOf object; extra fields forbidden
$ [oneOf 18].action yes string; exact value: "player.erase"
$ [oneOf 18].terms yes object; extra fields forbidden
$ [oneOf 18].terms.accountId yes string; format: "uuid"
$ [oneOf 18].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 19] oneOf object; extra fields forbidden
$ [oneOf 19].action yes string; exact value: "round.void"
$ [oneOf 19].terms yes object; extra fields forbidden
$ [oneOf 19].terms.roundId yes string; format: "uuid"
$ [oneOf 19].terms.reason yes string; minimum length: 1; maximum length: 200
$ [oneOf 19].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 20] oneOf object; extra fields forbidden
$ [oneOf 20].action yes string; exact value: "console.user.create"
$ [oneOf 20].terms yes object; extra fields forbidden
$ [oneOf 20].terms.username yes string; pattern: "^[a-z0-9][a-z0-9._@-]{2,127}$"
$ [oneOf 20].terms.role yes string; allowed values: ["viewer","support","finance","admin"]
$ [oneOf 20].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 21] oneOf object; extra fields forbidden
$ [oneOf 21].action yes string; exact value: "console.user.role"
$ [oneOf 21].terms yes object; extra fields forbidden
$ [oneOf 21].terms.userId yes string; format: "uuid"
$ [oneOf 21].terms.role yes string; allowed values: ["viewer","support","finance","admin"]
$ [oneOf 21].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
$ [oneOf 22] oneOf object; extra fields forbidden
$ [oneOf 22].action yes string; exact value: "console.user.reset"
$ [oneOf 22].terms yes object; extra fields forbidden
$ [oneOf 22].terms.userId yes string; format: "uuid"
$ [oneOf 22].ttlSeconds no integer; minimum: 60; maximum: 86400; default: 3600
HTTP Response / media / model
201 Created. — application/json: object — Fields: id string, termsSha256 string, expiresAt string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CHANGE_REFUSED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED"]
409 Conflict. Error codes: CHANGE_REFUSED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/changes/{changeId}/decision

Approve or reject a change request

confirm is the request's termsSha256; echo is the typed confirmation where the change moves money or cannot be undone. An approved change runs under the approver's key.

Authentication: OperatorBearer.

Operator scope: *.

Registration: operatorAuth.

Parameter Location Required Type / constraints
changeId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
decision yes string; allowed values: ["approved","rejected"]
confirm yes string; pattern: "^[0-9a-f]{64}$"
echo no object; extra fields forbidden
echo.amountMinor no string; maximum length: 32
echo.currency no string; maximum length: 16
echo.target no string; maximum length: 2048
HTTP Response / media / model
200 OK. — application/json: object — Fields: decision string, result Any JSON value
400 Invalid request. Error codes: CHANGE_REFUSED, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: BACKOFFICE_DISABLED, CHANGE_REFUSED, DATA_PROTECTION_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_DISABLED","CHANGE_REFUSED","DATA_PROTECTION_DISABLED"]
404 Not found. Error codes: BACKOFFICE_RESOURCE_NOT_FOUND, CHANGE_REFUSED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_RESOURCE_NOT_FOUND","CHANGE_REFUSED"]
409 Conflict. Error codes: CHANGE_REFUSED, PLAYER_ERASURE_REFUSED, WALLET_TRANSACTION_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CHANGE_REFUSED","PLAYER_ERASURE_REFUSED","WALLET_TRANSACTION_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: BACKOFFICE_STOPPED, CONTROL_PLANE_BUSY, EXTERNAL_WALLET_UNAVAILABLE, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["BACKOFFICE_STOPPED","CONTROL_PLANE_BUSY","EXTERNAL_WALLET_UNAVAILABLE","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/console/users

Bootstrap a console user with a 'keys' operator key

Where two people are required the console's changes add users instead (409 TWO_PERSON_REQUIRED).

Authentication: OperatorBearer.

Operator scope: keys.

Registration: dependencies.console.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
username yes string; pattern: "^[a-z0-9][a-z0-9._@-]{2,127}$"
role yes string; allowed values: ["viewer","support","finance","admin"]
HTTP Response / media / model
201 Created. — application/json: object — Fields: userId string, username string, role string; allowed values: ["finance","viewer","support","admin"], setupToken string, setupExpiresAt string
400 Invalid request. Error codes: CONSOLE_SETUP_INVALID, INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_SETUP_INVALID","INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: CONSOLE_DISABLED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_DISABLED"]
409 Conflict. Error codes: CONSOLE_USER_EXISTS, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONSOLE_USER_EXISTS","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /operator/v1/demo-lobby/admin-activity

Demo lobby admin: activity search

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
query yes object; extra fields forbidden
query.q no string; maximum length: 32
query.player no string; maximum length: 32
query.game no string; maximum length: 100
query.page no See nested fields / alternatives
query.page [anyOf 1] anyOf string; maximum length: 10
query.page [anyOf 2] anyOf integer; maximum: 9007199254740991; exclusive minimum: 0
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/admin-change

Demo lobby admin: create or update users, reset passwords, set games and grants

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
action yes string; allowed values: ["create-user","update-user","reset-password","set-game","set-grant","grant-all"]
body yes object; extra fields forbidden
body.username no string; maximum length: 32
body.password no string; maximum length: 256
body.role no string; maximum length: 16
body.disabled no string; maximum length: 5
body.gameCode no string; maximum length: 100
body.visibility no string; maximum length: 16
body.access no string; maximum length: 16
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/admin-snapshot

Demo lobby admin: snapshot

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/authenticate

Demo lobby: sign a lobby user in with username and password

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
username yes string; minimum length: 1; maximum length: 32
password yes string; minimum length: 1; maximum length: 256
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/catalog

Demo lobby: game catalogue for a lobby session

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/configuration

Demo lobby: lobby configuration

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/launch

Demo lobby: launch a game for a lobby session (native or Stake front)

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
gameCode yes string; minimum length: 1; maximum length: 100
native yes boolean
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/refill

Demo lobby: refill a lobby session's synthetic credit

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/session

Demo lobby: resolve a lobby session

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/session-game

Demo lobby: resolve a game token within a lobby session

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
gameToken yes string; minimum length: 43; maximum length: 128
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/demo-lobby/wallet-context

Demo lobby: wallet context for a Stake session id

Authentication: OperatorBearer.

Operator scope: demo-lobby.

Registration: dependencies.demoLobby.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 1; maximum length: 1100
sessionID yes string; minimum length: 8; maximum length: 256
allowLaunch yes boolean
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object, object, object, Model D_LobbySnapshot, See nested fields / alternatives, object, See nested fields / alternatives, See nested fields / alternatives, object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]
default Status set by the handler at run time. — application/json: object — Fields: error string; exact value: "LOBBY_REQUEST_REJECTED", message string

POST /operator/v1/engagement/tournaments

Create a tournament (201 created, 200 for the same terms again)

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
code yes string; minimum length: 1; maximum length: 64
currency yes string; pattern: "^[A-Z]{3}$"
gameVersionIds yes array; minimum items: 1; maximum items: 64
gameVersionIds[] each item string; format: "uuid"
minimumWagerMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
scoring yes string; allowed values: ["total-win","wager-volume"]
startsAt yes string; format: "date-time"
endsAt yes string; format: "date-time"
prizesMinor yes array; minimum items: 1; maximum items: 100
prizesMinor[] each item string; pattern: "^[1-9][0-9]{0,15}$"
budgetMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
fundingSources yes array; minimum items: 1; maximum items: 2
fundingSources[] each item string; allowed values: ["cash","promo"]
tieBreak yes string; exact value: "first-achieved"
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string
201 Created. — application/json: object — Fields: id string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: ENGAGEMENT_UNAVAILABLE, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ENGAGEMENT_UNAVAILABLE","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/engagement/tournaments/{id}/close

Close a tournament (200 when settled, 202 while settling)

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
id path yes string; format: "uuid"

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string, sourceBoundary string, ready boolean
202 Accepted; not final yet. — application/json: object — Fields: id string, sourceBoundary string, ready boolean
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: ENGAGEMENT_UNAVAILABLE, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ENGAGEMENT_UNAVAILABLE","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/free-rounds

Create a free-round campaign (201 created, 200 for the same terms again)

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
code yes string; minimum length: 1; maximum length: 64
gameVersionId yes string; format: "uuid"
currency yes string; pattern: "^[A-Z]{3}$"
amount yes integer; maximum: 9007199254740991; exclusive minimum: 0
payoutCategory yes string; allowed values: ["promo","normal"]
budgetMinor yes string; pattern: "^[1-9][0-9]{0,15}$"
startsAt yes string; format: "date-time"
endsAt yes string; format: "date-time"
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string
201 Created. — application/json: object — Fields: id string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/free-rounds/{campaignId}/grants

Grant free rounds to a player (201 created, 200 for a repeated grant)

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
campaignId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
count yes integer; maximum: 2147483647; exclusive minimum: 0
idempotencyKey yes string; minimum length: 1; maximum length: 128
HTTP Response / media / model
200 OK. — application/json: object — Fields: grantId string
201 Created. — application/json: object — Fields: grantId string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/free-rounds/{campaignId}/liability

Free-round campaign liability

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
campaignId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: object — Fields: availableMinor string, unpaidMinor string, paidMinor string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/free-rounds/{campaignId}/remove

Remove a free-round campaign

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
campaignId path yes string; format: "uuid"

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
idempotencyKey no string; minimum length: 1; maximum length: 128
HTTP Response / media / model
200 OK. — application/json: object — Fields: removed boolean
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/free-rounds/available-bets

Bet amounts free rounds can use for a game version and currency

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
gameVersionId yes string; format: "uuid"
currency yes string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: gameVersionId string, currency string, action string, amounts array, payoutCategory Any JSON value, maximumPayoutMinor string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/interactive-market/policies/{policyId}/approve

Approve an interactive market policy request (checker)

Authentication: OperatorBearer.

Operator scope: markets.

Registration: operatorAuth.

Parameter Location Required Type / constraints
policyId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.operatorId yes string; format: "uuid"
confirm.previousPolicyId yes See nested fields / alternatives
confirm.previousPolicyId [anyOf 1] anyOf string; format: "uuid"
confirm.previousPolicyId [anyOf 2] anyOf null
confirm.gameVersionId yes string; format: "uuid"
confirm.brandId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
confirm.marketId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.unit yes string; exact value: "milliseconds"
confirm.timeoutMilliseconds yes integer; minimum: 1; maximum: 2147483647
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"
confirm.reason yes string; minimum length: 10; maximum length: 1024
HTTP Response / media / model
200 OK. — application/json: Model D_InteractiveMarketPolicyResult
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: INTERACTIVE_MARKET_POLICY_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_MARKET_POLICY_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/interactive-market/policies/{policyId}/requests

Request an interactive market policy (maker)

Authentication: OperatorBearer.

Operator scope: markets.

Registration: operatorAuth.

Parameter Location Required Type / constraints
policyId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.operatorId yes string; format: "uuid"
confirm.previousPolicyId yes See nested fields / alternatives
confirm.previousPolicyId [anyOf 1] anyOf string; format: "uuid"
confirm.previousPolicyId [anyOf 2] anyOf null
confirm.gameVersionId yes string; format: "uuid"
confirm.brandId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
confirm.marketId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.unit yes string; exact value: "milliseconds"
confirm.timeoutMilliseconds yes integer; minimum: 1; maximum: 2147483647
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"
confirm.reason yes string; minimum length: 10; maximum length: 1024
expiresInSeconds yes integer; minimum: 1; maximum: 900
HTTP Response / media / model
201 Created. — application/json: Model D_InteractiveMarketPolicyResult
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: INTERACTIVE_MARKET_POLICY_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_MARKET_POLICY_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/interactive-market/policies/{policyId}/revoke

Revoke an interactive market policy

Authentication: OperatorBearer.

Operator scope: markets.

Registration: operatorAuth.

Parameter Location Required Type / constraints
policyId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.operatorId yes string; format: "uuid"
confirm.previousPolicyId yes See nested fields / alternatives
confirm.previousPolicyId [anyOf 1] anyOf string; format: "uuid"
confirm.previousPolicyId [anyOf 2] anyOf null
confirm.gameVersionId yes string; format: "uuid"
confirm.brandId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
confirm.marketId yes string; pattern: "^[a-z0-9][a-z0-9._-]{0,63}$"
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.unit yes string; exact value: "milliseconds"
confirm.timeoutMilliseconds yes integer; minimum: 1; maximum: 2147483647
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"
confirm.reason yes string; minimum length: 10; maximum length: 1024
reason yes string; minimum length: 10; maximum length: 1024
HTTP Response / media / model
200 OK. — application/json: Model D_InteractiveMarketPolicyRevocation
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: INTERACTIVE_MARKET_POLICY_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_MARKET_POLICY_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/jackpots

Create a jackpot pool (201 created, 200 for the same terms again)

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
gameVersionId yes string; format: "uuid"
poolKey yes string; minimum length: 1; maximum length: 64
reserveByTier yes object; extra field values: string; pattern: "^(0&#124;[1-9][0-9]{0,15})$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string
201 Created. — application/json: object — Fields: id string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: JACKPOT_UNAVAILABLE, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["JACKPOT_UNAVAILABLE","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/jackpots/{poolId}

Jackpot pool as its operator sees it

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
poolId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string, currency string, tiers array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: JACKPOT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["JACKPOT_UNAVAILABLE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/jackpots/{poolId}/memberships

Offer another operator a jackpot pool membership

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
poolId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
operatorId yes string; format: "uuid"
gameVersionId yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string
201 Created. — application/json: object — Fields: id string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: JACKPOT_UNAVAILABLE, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["JACKPOT_UNAVAILABLE","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/jackpots/{poolId}/memberships/{offerId}/accept

Accept a jackpot pool membership offer

Authentication: OperatorBearer.

Operator scope: campaigns.

Registration: operatorAuth.

Parameter Location Required Type / constraints
poolId path yes string; format: "uuid"
offerId path yes string; format: "uuid"

Request body: optional.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string
201 Created. — application/json: object — Fields: id string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: JACKPOT_UNAVAILABLE, TWO_PERSON_REQUIRED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["JACKPOT_UNAVAILABLE","TWO_PERSON_REQUIRED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/jackpots/rtp

Jackpot RTP for a game version and currency

Authentication: OperatorBearer.

Operator scope: reports.

Registration: operatorAuth.

Parameter Location Required Type / constraints
gameVersionId query yes string; format: "uuid"
currency query yes string; pattern: "^[A-Z]{3}$"
HTTP Response / media / model
200 OK. — application/json: object — Fields: rounds string, wagerMinor string, basePayoutMinor string, jackpotPayoutMinor string, contributionMinor string, format string, gameVersionId string, currency string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/math-families/policies/{policyId}/approve

Approve a math family policy request (checker)

Authentication: OperatorBearer.

Operator scope: markets.

Registration: operatorAuth and dependencies.mathFamilies.

Parameter Location Required Type / constraints
policyId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.operatorId yes string; format: "uuid"
confirm.previousPolicyId yes See nested fields / alternatives
confirm.previousPolicyId [anyOf 1] anyOf string; format: "uuid"
confirm.previousPolicyId [anyOf 2] anyOf null
confirm.gameVersionId yes string; format: "uuid"
confirm.brandId yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$"
confirm.marketId yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$"
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.selectionSha256 yes string; pattern: "^[a-f0-9]{64}$"
confirm.available yes boolean
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$"
confirm.reason yes string; minimum length: 10; maximum length: 1024
HTTP Response / media / model
200 OK. — application/json: Model D_MathFamilyPolicyResult
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: MATH_FAMILY_POLICY_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["MATH_FAMILY_POLICY_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/math-families/policies/{policyId}/requests

Request a math family policy (maker)

Authentication: OperatorBearer.

Operator scope: markets.

Registration: operatorAuth and dependencies.mathFamilies.

Parameter Location Required Type / constraints
policyId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.operatorId yes string; format: "uuid"
confirm.previousPolicyId yes See nested fields / alternatives
confirm.previousPolicyId [anyOf 1] anyOf string; format: "uuid"
confirm.previousPolicyId [anyOf 2] anyOf null
confirm.gameVersionId yes string; format: "uuid"
confirm.brandId yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$"
confirm.marketId yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$"
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.selectionSha256 yes string; pattern: "^[a-f0-9]{64}$"
confirm.available yes boolean
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$"
confirm.reason yes string; minimum length: 10; maximum length: 1024
expiresInSeconds yes integer; minimum: 1; maximum: 900
HTTP Response / media / model
201 Created. — application/json: Model D_MathFamilyPolicyResult
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: MATH_FAMILY_POLICY_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["MATH_FAMILY_POLICY_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/obligation-age/policies/{policyId}/approve

Approve an obligation-age policy request (checker)

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth.

Parameter Location Required Type / constraints
policyId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.operatorId yes string; format: "uuid"
confirm.previousPolicyId yes See nested fields / alternatives
confirm.previousPolicyId [anyOf 1] anyOf string; format: "uuid"
confirm.previousPolicyId [anyOf 2] anyOf null
confirm.unit yes string; exact value: "milliseconds"
confirm.pendingDebitMs yes integer; minimum: 90000; maximum: 2147483647
confirm.owedCreditMs yes integer; minimum: 90000; maximum: 2147483647
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"
confirm.reason yes string; minimum length: 10; maximum length: 1024
HTTP Response / media / model
200 OK. — application/json: Model D_ObligationAgePolicyResult
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: OBLIGATION_AGE_POLICY_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["OBLIGATION_AGE_POLICY_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/obligation-age/policies/{policyId}/requests

Request an obligation-age policy (maker)

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth.

Parameter Location Required Type / constraints
policyId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.operatorId yes string; format: "uuid"
confirm.previousPolicyId yes See nested fields / alternatives
confirm.previousPolicyId [anyOf 1] anyOf string; format: "uuid"
confirm.previousPolicyId [anyOf 2] anyOf null
confirm.unit yes string; exact value: "milliseconds"
confirm.pendingDebitMs yes integer; minimum: 90000; maximum: 2147483647
confirm.owedCreditMs yes integer; minimum: 90000; maximum: 2147483647
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"
confirm.reason yes string; minimum length: 10; maximum length: 1024
expiresInSeconds yes integer; minimum: 1; maximum: 900
HTTP Response / media / model
201 Created. — application/json: Model D_ObligationAgePolicyResult
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: OBLIGATION_AGE_POLICY_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["OBLIGATION_AGE_POLICY_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/reconciliation/cases/{caseId}/reopen

Reopen a reconciliation case's resolution intent

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth and dependencies.wallet.

Parameter Location Required Type / constraints
caseId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes object; extra fields forbidden
confirm.target yes string; format: "uuid"
confirm.amount yes integer; minimum: 1; maximum: 9007199254740991
confirm.direction yes string; allowed values: ["credit","debit"]
confirm.currency yes string; pattern: "^[A-Z]{3}$"
confirm.profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm.environmentId yes string; pattern: "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$"
note yes string; minimum length: 10; maximum length: 2048
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string, accountId string, playerId string, currency string, storedBalance number, ledgerBalance number, delta number, status string, reasonCode See nested fields / alternatives, resolutionNote See nested fields / alternatives, ledgerEntryId See nested fields / alternatives
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Not found. Error codes: WALLET_RESOURCE_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WALLET_RESOURCE_NOT_FOUND"]
409 Conflict. Error codes: RECONCILIATION_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RECONCILIATION_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/reconciliation/operation-statements

Submit an operation statement (201 ingested, 200 duplicate)

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth and dependencies.wallet.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
keyId yes string; minimum length: 1; maximum length: 128
expectedOperationIds yes array; minimum items: 1; maximum items: 256
expectedOperationIds[] each item string; format: "uuid"
signature yes string; pattern: "^[A-Za-z0-9_-]{86}$"
bodyBase64 yes string; minimum length: 1; maximum length: 349528
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string, duplicate boolean, report Model D_OperationStatementReport
201 Created. — application/json: object — Fields: id string, duplicate boolean, report Model D_OperationStatementReport
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: OPERATION_STATEMENT_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["OPERATION_STATEMENT_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/reconciliation/operation-statements/{id}

Operation statement ingestion result

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth and dependencies.wallet.

Parameter Location Required Type / constraints
id path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string, report Model D_OperationStatementReport
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Not found. — application/json: object — Fields: error string; exact value: "NOT_FOUND"
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/responsible-gaming/time-out

Time-out on the player's request, on every account of the player

Authentication: OperatorBearer.

Operator scope: responsible-gaming.

Registration: operatorAuth and dependencies.responsibleGaming.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
period yes string; allowed values: ["24h","7d","30d","42d"]
HTTP Response / media / model
200 OK. — application/json: Model D_ResponsibleGamingLimits
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
404 Not found. Error codes: RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /operator/v1/rounds/{roundId}/drawn-review

Preview a drawn round's review

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth and dependencies.rounds.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: object — Fields: confirm See nested fields / alternatives
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
409 Conflict. Error codes: ROUND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: object, object; extra fields allowed
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/rounds/{roundId}/drawn-review/resolution-approvals/{intentId}

Approve a drawn round's resolution (checker)

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth and dependencies.rounds.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
intentId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes See nested fields / alternatives
confirm [anyOf 1] anyOf object; extra fields forbidden
confirm [anyOf 1].roundId yes string; format: "uuid"
confirm [anyOf 1].payout yes integer; minimum: 0; maximum: 9007199254740991
confirm [anyOf 1].currency yes string; pattern: "^[A-Z]{3}$"
confirm [anyOf 1].evidenceSha256 yes string; pattern: "^[a-f0-9]{64}$"
confirm [anyOf 1].profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm [anyOf 1].environmentId yes string; minimum length: 1; maximum length: 128
confirm [anyOf 2] anyOf object; extra fields forbidden
confirm [anyOf 2].roundId yes string; format: "uuid"
confirm [anyOf 2].payout yes null
confirm [anyOf 2].currency yes string; pattern: "^[A-Z]{3}$"
confirm [anyOf 2].evidenceSha256 yes string; pattern: "^[a-f0-9]{64}$"
confirm [anyOf 2].profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm [anyOf 2].environmentId yes string; minimum length: 1; maximum length: 128
confirm [anyOf 2].kind yes string; exact value: "void-uncaptured"
confirm [anyOf 2].refund yes integer; minimum: 0; maximum: 9007199254740991
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: Model D_RoundResult, Model D_VoidedRound
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
409 Conflict. Error codes: JACKPOT_UNAVAILABLE, ROUND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: object, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /operator/v1/rounds/{roundId}/drawn-review/resolution-requests

Request a drawn round's resolution (maker)

Authentication: OperatorBearer.

Operator scope: reconciliation.

Registration: operatorAuth and dependencies.rounds.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
confirm yes See nested fields / alternatives
confirm [anyOf 1] anyOf object; extra fields forbidden
confirm [anyOf 1].roundId yes string; format: "uuid"
confirm [anyOf 1].payout yes integer; minimum: 0; maximum: 9007199254740991
confirm [anyOf 1].currency yes string; pattern: "^[A-Z]{3}$"
confirm [anyOf 1].evidenceSha256 yes string; pattern: "^[a-f0-9]{64}$"
confirm [anyOf 1].profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm [anyOf 1].environmentId yes string; minimum length: 1; maximum length: 128
confirm [anyOf 2] anyOf object; extra fields forbidden
confirm [anyOf 2].roundId yes string; format: "uuid"
confirm [anyOf 2].payout yes null
confirm [anyOf 2].currency yes string; pattern: "^[A-Z]{3}$"
confirm [anyOf 2].evidenceSha256 yes string; pattern: "^[a-f0-9]{64}$"
confirm [anyOf 2].profile yes string; allowed values: ["dev","demo","staging","real-money"]
confirm [anyOf 2].environmentId yes string; minimum length: 1; maximum length: 128
confirm [anyOf 2].kind yes string; exact value: "void-uncaptured"
confirm [anyOf 2].refund yes integer; minimum: 0; maximum: 9007199254740991
note yes string; minimum length: 10; maximum length: 2048
expiresInSeconds yes integer; minimum: 1; maximum: 900
HTTP Response / media / model
201 Created. — application/json: object — Fields: intentId string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or non-exact Bearer prefix: AUTHENTICATION_FAILED. Rejected operator token, operator state or scope: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields forbidden — Fields: error string; allowed values: ["AUTHENTICATION_FAILED","OPERATOR_AUTHENTICATION_FAILED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
409 Conflict. Error codes: ROUND_CONFLICT. — application/json: See nested fields / alternatives — anyOf: object, object; extra fields allowed
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /ops/v1/alerts

Alertmanager webhook intake (version 4) for the console's platform alerts

The bearer secret is checked before the body is read; the proxy does not forward /ops/.

Authentication: AlertIntakeBearer.

Registration: operatorAuth and dependencies.platformAlerts && dependencies.alertIntakeTokenSha256.

Request body: required.

Content type: application/json. object; extra fields allowed; Alertmanager webhook version 4 within PLATFORM_ALERT_LIMITS (packages/core/src/platform-alerts.ts); read by parseAlertmanagerWebhook (apps/rgs/src/alertmanager-webhook.ts).

Field Required Type / constraints
$ yes object; extra fields allowed; Alertmanager webhook version 4 within PLATFORM_ALERT_LIMITS (packages/core/src/platform-alerts.ts); read by parseAlertmanagerWebhook (apps/rgs/src/alertmanager-webhook.ts).
version yes string; exact value: "4"
alerts yes array
alerts[] each item object; extra fields allowed
alerts[].fingerprint yes string; pattern: "^[0-9a-f]{16}$"
alerts[].status yes string; allowed values: ["firing","resolved"]
alerts[].labels yes object; extra field values: string
alerts[].annotations no object; extra field values: string
alerts[].startsAt yes string; RFC 3339 time
alerts[].endsAt no string; RFC 3339 time
HTTP Response / media / model
200 OK. — application/json: object — Fields: received number, stored number
400 Invalid request. — application/json: object — Fields: error string; exact value: "INVALID_ALERT_PAYLOAD", message string
401 Missing or rejected credential. — application/json: object — Fields: error string; exact value: "ALERT_INTAKE_UNAUTHORIZED"
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /tequity/launch/real

Tequity launcher: 303 redirect to the game

No authorisation here: the wallet authenticates its one-time key. Tequity's own errors are answered by the adapter (TEQUITY_* codes).

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: a Tequity adapter.

Parameter Location Required Type / constraints
wallet query yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
operator query yes string; minimum length: 1; maximum length: 128
game query yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
key query yes string; minimum length: 1; maximum length: 512
currency query no string; pattern: "^[a-z]{3}$"
language query no string; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"
depositUrl query no string; maximum length: 2048
refreshUrl query no string; maximum length: 2048
lobbyUrl query no string; maximum length: 2048
exitTarget query no string; allowed values: ["self","parent"]
theme query no string; maximum length: 64
HTTP Response / media / model
303 Redirect (See Other). — Header Location: string Where the client goes next
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /tequity/launch/real

Tequity launcher (fields in the body or the query): 303 redirect to the game

No authorisation here: the wallet authenticates its one-time key. Tequity's own errors are answered by the adapter (TEQUITY_* codes).

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: a Tequity adapter.

Request body: required. The same fields may come in the query string; body fields win.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
wallet yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
operator yes string; minimum length: 1; maximum length: 128
game yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
key yes string; minimum length: 1; maximum length: 512
currency no string; pattern: "^[a-z]{3}$"
language no string; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"
depositUrl no string; maximum length: 2048
refreshUrl no string; maximum length: 2048
lobbyUrl no string; maximum length: 2048
exitTarget no string; allowed values: ["self","parent"]
theme no string; maximum length: 64
HTTP Response / media / model
303 Redirect (See Other). — Header Location: string Where the client goes next
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /tequity/wallet/{wallet}/freeBets/add

Tequity free bets: add a campaign for players

x-server-authorization signs the raw body with the wallet's secret; the wallet's operator key needs the campaigns scope.

Authentication: TequitySignature.

Registration: a Tequity adapter.

Parameter Location Required Type / constraints
wallet path yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
walletCampaignId yes string; minimum length: 1; maximum length: 128
games yes array; minimum items: 1; maximum items: 64
games[] each item string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
nativeIds yes array; minimum items: 1; maximum items: 1000
nativeIds[] each item string; minimum length: 1; maximum length: 256
start no integer; exclusive minimum: 0
end no integer; exclusive minimum: 0
bets yes integer; maximum: 10000; exclusive minimum: 0
amount yes number; exclusive minimum: 0
currency yes string; pattern: "^[a-z]{3}$"
operator yes string; minimum length: 1; maximum length: 128
brand yes string; minimum length: 1; maximum length: 128
HTTP Response / media / model
200 OK. — application/json: object — Fields: success boolean
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /tequity/wallet/{wallet}/freeBets/availableBets

Tequity free bets: available bet amounts per game and currency

x-server-authorization signs the raw body with the wallet's secret; the wallet's operator key needs the campaigns scope.

Authentication: TequitySignature.

Registration: a Tequity adapter.

Parameter Location Required Type / constraints
wallet path yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
games yes array; minimum items: 1; maximum items: 64
games[] each item string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
currencies yes array; minimum items: 1; maximum items: 16
currencies[] each item string; pattern: "^[a-z]{3}$"
operator yes string; minimum length: 1; maximum length: 128
brand yes string; minimum length: 1; maximum length: 128
HTTP Response / media / model
200 OK. — application/json: Model D_Record_string_Record_string_number
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /tequity/wallet/{wallet}/freeBets/remove

Tequity free bets: remove a campaign

x-server-authorization signs the raw body with the wallet's secret; the wallet's operator key needs the campaigns scope.

Authentication: TequitySignature.

Registration: a Tequity adapter.

Parameter Location Required Type / constraints
wallet path yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
walletCampaignId yes string; minimum length: 1; maximum length: 128
games yes array; minimum items: 1; maximum items: 64
games[] each item string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
operator yes string; minimum length: 1; maximum length: 128
brand yes string; minimum length: 1; maximum length: 128
HTTP Response / media / model
200 OK. — application/json: object — Fields: success boolean
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: OPERATOR_AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["OPERATOR_AUTHENTICATION_FAILED"]
409 Conflict. Error codes: FREE_ROUNDS_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FREE_ROUNDS_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /tequity/wallet/{wallet}/launch/real

Tequity launcher for one wallet: answers the game URL

No authorisation here: the wallet authenticates its one-time key. Tequity's own errors are answered by the adapter (TEQUITY_* codes).

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: a Tequity adapter.

Parameter Location Required Type / constraints
operator query yes string; minimum length: 1; maximum length: 128
game query yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
key query yes string; minimum length: 1; maximum length: 512
currency query no string; pattern: "^[a-z]{3}$"
language query no string; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"
depositUrl query no string; maximum length: 2048
refreshUrl query no string; maximum length: 2048
lobbyUrl query no string; maximum length: 2048
exitTarget query no string; allowed values: ["self","parent"]
theme query no string; maximum length: 64
wallet path yes string
HTTP Response / media / model
200 OK. — application/json: object — Fields: url string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /tequity/wallet/{wallet}/launch/real

Tequity launcher for one wallet (fields in the body or the query): answers the game URL

No authorisation here: the wallet authenticates its one-time key. Tequity's own errors are answered by the adapter (TEQUITY_* codes).

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Registration: a Tequity adapter.

Parameter Location Required Type / constraints
wallet path yes string

Request body: required. The same fields may come in the query string; body fields win.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
operator yes string; minimum length: 1; maximum length: 128
game yes string; pattern: "^[a-z0-9][a-z0-9_-]{0,63}$"
key yes string; minimum length: 1; maximum length: 512
currency no string; pattern: "^[a-z]{3}$"
language no string; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"
depositUrl no string; maximum length: 2048
refreshUrl no string; maximum length: 2048
lobbyUrl no string; maximum length: 2048
exitTarget no string; allowed values: ["self","parent"]
theme no string; maximum length: 64
HTTP Response / media / model
200 OK. — application/json: object — Fields: url string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /v1/engagement/tournaments/{id}/leaderboard

Tournament leaderboard for the session's player

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Parameter Location Required Type / constraints
id path yes string; format: "uuid"
limit query no integer; minimum: 1; maximum: 100; default: 20
HTTP Response / media / model
200 OK. — application/json: object — Fields: entries array
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
409 Conflict. Error codes: ENGAGEMENT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ENGAGEMENT_UNAVAILABLE"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /v1/engagement/tournaments/{id}/participation

Opt in to, or acknowledge, a tournament

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Parameter Location Required Type / constraints
id path yes string; format: "uuid"

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
action yes string; allowed values: ["opt-in","acknowledge"]
HTTP Response / media / model
200 OK. — application/json: object — Fields: id string, action string
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
409 Conflict. Error codes: ENGAGEMENT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["ENGAGEMENT_UNAVAILABLE"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

POST /v1/fair/commitment

Provably fair: the player's open commitment for the next one-shot round

The SHA-256 of a sealed server seed with its drawId and nonce (protocol 23rgs-fair-v1), only where the operator enabled the default-off provably-fair module. Keep this answer and the client seed you send with the play (fairCommitment): tools/fair-verify.ts checks the round's proof against them. The same commitment is answered until a round claims it, and every fair play answer carries the next one (nextFairCommitment). 409 PROVABLY_FAIR_UNSUPPORTED while signed issuance is required or rng-v2 is enabled; the commitment stays open.

Authentication: SessionBearer.

Registration: rounds.

HTTP Response / media / model
200 OK. — application/json: Model D_FairCommitment
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, PROVABLY_FAIR_STOPPED, RNG_NOT_READY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","PROVABLY_FAIR_STOPPED","RNG_NOT_READY"]

GET /v1/free-rounds

The session player's free-round inventory, paged

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Parameter Location Required Type / constraints
limit query no integer; minimum: 1; maximum: 100; default: 20
cursor query no string; minimum length: 1; maximum length: 512
HTTP Response / media / model
200 OK. — application/json: object — Fields: grants array, nextCursor See nested fields / alternatives
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
429 Rate limited. Error codes: RATE_LIMITED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RATE_LIMITED"]
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY, RATE_LIMIT_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY","RATE_LIMIT_UNAVAILABLE"]

GET /v1/interactive/rounds/{id}/replay

Replay and verify an interactive round

409 carries the replay when verification finds a mismatch; 503 carries it when verification is unavailable for a reason other than no-actions.

Authentication: SessionBearer.

Registration: dependencies.interactive.

Parameter Location Required Type / constraints
id path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: object — Fields: roundId string, verification object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
404 Not found. Error codes: INTERACTIVE_EXECUTION_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_EXECUTION_NOT_FOUND"]
409 Conflict. — application/json: object — Fields: roundId string, verification object
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: INTERACTIVE_RUNTIME_UNAVAILABLE. — application/json: See nested fields / alternatives — anyOf: object, object; extra fields allowed

GET /v1/jackpots/{poolId}

Public jackpot display (no credential)

Authentication: No header security scheme; use the operation’s body/signature rules where specified.

Parameter Location Required Type / constraints
poolId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_Record_string_unknown
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
404 Not found. — application/json: object — Fields: error string; exact value: "JACKPOT_NOT_FOUND"
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /v1/responsible-gaming/time-out

Player time-out for a fixed period on every account of the player; it ends this session

Authentication: SessionBearer.

Registration: dependencies.responsibleGaming.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
period yes string; allowed values: ["24h","7d","30d","42d"]
HTTP Response / media / model
200 OK. — application/json: Model D_ResponsibleGamingLimits
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
404 Not found. Error codes: RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

GET /v1/rounds/{roundId}/proof

Provably fair proof of the caller's own settled round

The revealed server seed, the client seed, the nonce and the draws of a v1 round, and whether it was pre-committed (preCommitted). Check it with tools/fair-verify.ts against the commitment and client seed kept from before the bet: it says VERIFIED only for a pre-committed round whose values match.

Authentication: SessionBearer.

Registration: rounds.

Parameter Location Required Type / constraints
roundId path yes string; format: "uuid"
HTTP Response / media / model
200 OK. — application/json: Model D_Record_string_unknown
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
404 Not found. Error codes: FAIR_PROOF_UNAVAILABLE. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["FAIR_PROOF_UNAVAILABLE"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

POST /v2/interactive/skip

Interactive game: skip command (InteractiveCommandService.skip)

Authentication: SessionBearer.

Registration: dependencies.interactive.

Request body: required.

Content type: application/json. object; extra fields forbidden

Field Required Type / constraints
$ yes object; extra fields forbidden
commandId yes string; pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
HTTP Response / media / model
200 OK. — application/json: See nested fields / alternatives — anyOf: object, object
400 Invalid request. Error codes: INVALID_REQUEST. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INVALID_REQUEST"]
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
404 Not found. Error codes: INTERACTIVE_EXECUTION_NOT_FOUND. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_EXECUTION_NOT_FOUND"]
409 Conflict. Error codes: INTERACTIVE_COMMAND_CONFLICT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_COMMAND_CONFLICT"]
413 Request body exceeds 65536 bytes. — application/json: Model ServiceError
415 Unsupported request content type. — application/json: Model ServiceError
422 Not processable. Error codes: INSUFFICIENT_FUNDS. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INSUFFICIENT_FUNDS"]
423 Locked by responsible gaming. Error codes: RESPONSIBLE_GAMING_LIMIT. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["RESPONSIBLE_GAMING_LIMIT"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: INTERACTIVE_RUNTIME_UNAVAILABLE, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["INTERACTIVE_RUNTIME_UNAVAILABLE","MONEY_PATH_BUSY"]

GET /v2/state

The session player's current game state

Authentication: SessionBearer.

Registration: rounds.

HTTP Response / media / model
200 OK. — application/json: Model D_Record_string_unknown
400 Invalid request; endpoint validation and exact representation rules apply. — application/json: Model ServiceError
401 Missing or rejected credential. Error codes: AUTHENTICATION_FAILED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["AUTHENTICATION_FAILED"]
403 Refused. Error codes: WAGER_NOT_ALLOWED. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["WAGER_NOT_ALLOWED"]
429 Rate limited: per client address until a credential verifies, then per player or operator key. — application/json: Model ServiceError
500 Unhandled internal error. — application/json: Model ServiceError
503 Unavailable; retry later. Error codes: CONTROL_PLANE_BUSY, MONEY_PATH_BUSY. — application/json: object; extra fields allowed — Fields: error string; allowed values: ["CONTROL_PLANE_BUSY","MONEY_PATH_BUSY"]

RGS-hosted API — reusable models

ServiceError

Field Required Type / constraints
$ yes object; extra fields allowed
error yes string
details no array
details[] each item object

C_Error

Field Required Type / constraints
$ yes object; extra fields forbidden
error yes string
details no array
details[] each item object; extra fields allowed

C_AuthenticateRequest

Field Required Type / constraints
$ yes object; extra fields allowed
launchToken yes string; minimum length: 43; maximum length: 128

C_AuthenticateResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
sessionToken yes string; minimum length: 43; maximum length: 128
balance yes integer / null; minimum: 0
currency yes string; pattern: "^[A-Z]{3}$"
gameId yes string; format: "uuid"
walletMode yes allowed values: ["custodial","external"]

C_Balance

Field Required Type / constraints
$ yes object; extra fields forbidden
balance yes integer; minimum: 0
currency yes string; pattern: "^[A-Z]{3}$"

C_ExternalBalancePending

Field Required Type / constraints
$ yes object; extra fields forbidden
status yes allowed values: ["unknown","pending"]
operationId yes string; format: "uuid"

C_ExternalBalanceUnavailable

Field Required Type / constraints
$ yes object; extra fields forbidden
error yes exact value: "EXTERNAL_BALANCE_UNAVAILABLE"
operationId yes string; format: "uuid"

C_RealityStatus

Field Required Type / constraints
$ yes object; extra fields forbidden
due yes boolean
nextAt yes string / null; format: "date-time"
elapsedSeconds yes integer; minimum: 0

C_RealityAcknowledged

Field Required Type / constraints
$ yes object; extra fields forbidden
nextAt yes string; format: "date-time"

C_ResponsibleGaming

Field Required Type / constraints
$ yes object; extra fields forbidden
realityCheckIntervalSeconds yes integer / null; minimum: 60; maximum: 86400
maxSingleWager yes integer / null; minimum: 1
dailyNetLossLimit yes integer / null; minimum: 1
dailyDepositLimit yes integer / null; minimum: 1
maxSessionSeconds yes integer / null; minimum: 60; maximum: 86400
selfExcludedUntil yes string / null; format: "date-time"

C_SelfExcludeRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
until yes string; format: "date-time"

C_SelfExcludeResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
selfExcludedUntil yes string; format: "date-time"

C_CampaignList

Field Required Type / constraints
$ yes object; extra fields forbidden
grants yes array
grants[] each item object; extra fields forbidden
grants[].grantId yes string; format: "uuid"
grants[].campaignId yes string; format: "uuid"
grants[].code yes string
grants[].amount yes integer; minimum: 1
grants[].currency yes string; pattern: "^[A-Z]{3}$"
grants[].grantedAt yes string; format: "date-time"

C_RoomAssignment

Field Required Type / constraints
$ yes object; extra fields forbidden
roomId yes string; format: "uuid"
status yes string

C_PlayV1Request

Field Required Type / constraints
$ yes object; extra fields allowed
externalRoundId yes string; minimum length: 1; maximum length: 128
action yes string; minimum length: 1; maximum length: 64
wager yes Model C_Wager
clientSeed yes string; minimum length: 1; maximum length: 1024

C_PlayV2Request

Field Required Type / constraints
$ yes object; extra fields forbidden
commandId yes Model C_UUIDv4
action yes string; minimum length: 1; maximum length: 64
wager yes object; extra fields forbidden
wager.amount yes Model C_PositiveMoney
wager.currency yes string; pattern: "^[A-Z]{3}$"
clientSeed yes string; minimum length: 1; maximum length: 1024

C_Wager

Field Required Type / constraints
$ yes object; extra fields allowed
id yes string; minimum length: 1; maximum length: 128
amount yes Model C_PositiveMoney
currency yes string; pattern: "^[A-Z]{3}$"

C_PositiveMoney

Field Required Type / constraints
$ yes integer; minimum: 1; maximum: 9007199254740991

C_UUIDv4

Field Required Type / constraints
$ yes string; pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"

C_RoundResult

Field Required Type / constraints
$ yes object; extra fields forbidden
roundId yes string; format: "uuid"
payout yes integer; minimum: 0
balance yes integer; minimum: 0
state yes Any JSON value
fairness yes object; extra fields forbidden
fairness.commitment yes string; pattern: "^[0-9a-f]{64}$"
fairness.serverSeed yes string; pattern: "^[0-9a-f]+$"
fairness.algorithm yes string

C_RoundPending

Field Required Type / constraints
$ yes object; extra fields forbidden
error yes exact value: "ROUND_SETTLEMENT_PENDING"
roundId yes string; format: "uuid"
status yes string

C_RoundDeclined

Field Required Type / constraints
$ yes object; extra fields forbidden
error yes exact value: "EXTERNAL_WALLET_DECLINED"
roundId yes string; format: "uuid"

C_History

Field Required Type / constraints
$ yes object; extra fields forbidden
rounds yes array
rounds[] each item object; extra fields forbidden
rounds[].roundId yes string; format: "uuid"
rounds[].externalRoundId yes string
rounds[].status yes string
rounds[].wager yes integer; minimum: 0
rounds[].payout yes integer; minimum: 0
rounds[].currency yes string; pattern: "^[A-Z]{3}$"
rounds[].createdAt yes string; format: "date-time"
rounds[].settledAt yes string / null; format: "date-time"

C_FairnessProof

Field Required Type / constraints
$ yes object; extra fields forbidden
algorithm yes string
drawId yes string; format: "uuid"
commitment yes string; pattern: "^[0-9a-f]{64}$"
clientSeed yes string
nonce yes string
serverSeed yes string; pattern: "^[0-9a-f]+$"

C_Replay

Field Required Type / constraints
$ yes object; extra fields forbidden
roundId yes string; format: "uuid"
history yes object; extra fields forbidden
history.roundId yes string; format: "uuid"
history.state yes Any JSON value
history.result yes See nested fields / alternatives
history.result [oneOf 1] oneOf Model C_RoundResult
history.result [oneOf 2] oneOf null
history.events yes array
history.events[] each item object; extra fields forbidden
history.events[].sequence yes integer; minimum: 0
history.events[].type yes string
history.events[].payload yes Any JSON value
history.events[].createdAt yes string; format: "date-time"
verification yes object; extra fields forbidden
verification.status yes allowed values: ["matched","mismatch","unavailable"]
verification.reason no allowed values: ["REPLAY_MISMATCH","REPLAY_INPUTS_UNAVAILABLE","REPLAY_RUNTIME_UNAVAILABLE"]
verification.gameVersion no string; Pinned runtime lookup key returned when the runtime is unavailable.
verification.game no object; extra fields forbidden
verification.game.code yes string
verification.game.version yes string
verification.game.gameVersionId yes string; format: "uuid"
verification.request no Any JSON value
verification.fairness no Model C_FairnessProof
verification.recomputed no See nested fields / alternatives
verification.recomputed [oneOf 1] oneOf null
verification.recomputed [oneOf 2] oneOf object; extra fields forbidden
verification.recomputed [oneOf 2].payout yes integer; minimum: 0
verification.recomputed [oneOf 2].state yes Any JSON value
verification.compared no object; extra fields forbidden
verification.compared.requestHash yes boolean
verification.compared.transcript yes boolean
verification.compared.result yes boolean
verification.compared.payout yes boolean
verification.compared.state yes boolean
verification.compared.commitment yes boolean

C_InteractiveStartRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
commandId yes Model C_UUIDv4
wager yes object; extra fields forbidden
wager.amount yes Model C_PositiveMoney
wager.currency yes string; pattern: "^[A-Z]{3}$"
clientSeed yes string; minimum length: 1; maximum length: 1024

C_InteractiveActionRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
roundId yes string; format: "uuid"; pattern: "^[0-9a-f-]+$"
commandId yes Model C_UUIDv4
expectedSequence yes integer; minimum: 0; maximum: 63
action yes string; pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"

C_InteractiveRecoverRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
commandId yes Model C_UUIDv4

C_InteractiveProjection

Field Required Type / constraints
$ yes object; extra fields forbidden
format yes exact value: "interactive-player-v1"
commandId yes Model C_UUIDv4
roundId yes string; format: "uuid"
game yes object; extra fields forbidden
game.code yes string
game.version yes string
wager yes object; extra fields forbidden
wager.amount yes Model C_PositiveMoney
wager.currency yes string; pattern: "^[A-Z]{3}$"
sequence yes integer; minimum: 0
complete yes boolean
nextActions yes array
nextActions[] each item string
cumulativePayout yes integer; minimum: 0
settlementStatus yes allowed values: ["active","credit-owed","settled"]
payout yes integer / null; minimum: 0
acknowledged no object; extra fields forbidden
acknowledged.commandId yes Model C_UUIDv4
acknowledged.sequence yes integer; minimum: 0; maximum: 63
acknowledged.duplicate yes boolean

C_InteractiveActionResponse

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [allOf 1] allOf Model C_InteractiveProjection
$ [allOf 2] allOf object
$ [allOf 2].acknowledged yes object; extra fields forbidden
$ [allOf 2].acknowledged.commandId yes Model C_UUIDv4
$ [allOf 2].acknowledged.sequence yes integer; minimum: 0; maximum: 63
$ [allOf 2].acknowledged.duplicate yes boolean

C_StakeSessionRequest

Field Required Type / constraints
$ yes object; extra fields allowed
sessionID yes string; minimum length: 8; maximum length: 256

C_StakeAuthenticateRequest

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [allOf 1] allOf Model C_StakeSessionRequest
$ [allOf 2] allOf object
$ [allOf 2].language no string; minimum length: 2; maximum length: 16
$ [allOf 2].gameId no string; minimum length: 1; maximum length: 128

C_StakePlayRequest

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [allOf 1] allOf Model C_StakeSessionRequest
$ [allOf 2] allOf object
$ [allOf 2].amount yes integer; minimum: 0; maximum: 9007199254740991
$ [allOf 2].currency yes string; pattern: "^[A-Z]{3}$"
$ [allOf 2].mode yes string; minimum length: 1; maximum length: 64
$ [allOf 2].gameId no string; minimum length: 1; maximum length: 128

C_StakeEventRequest

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [allOf 1] allOf Model C_StakeSessionRequest
$ [allOf 2] allOf object
$ [allOf 2].event no string; minimum length: 1; maximum length: 128

C_StakeStatus

Field Required Type / constraints
$ yes object; extra fields forbidden
statusCode yes string
statusMessage yes string

C_StakeError

Field Required Type / constraints
$ yes object; extra fields forbidden
status yes Model C_StakeStatus
error yes object; extra fields forbidden
error.code yes allowed values: ["ERR_IS","ERR_IPB","ERR_GLE","ERR_BE","ERR_BNF","ERR_GE","ERR_UE","SUCCESS"]
error.message yes string

C_StakeBalance

Field Required Type / constraints
$ yes object; extra fields forbidden
amount yes integer; minimum: 0
currency yes string; pattern: "^[A-Z]{3}$"

C_StakeRound

Field Required Type / constraints
$ yes object; extra fields forbidden
roundID yes string
amount yes integer; minimum: 0
payout yes integer; minimum: 0
payoutMultiplier yes number; minimum: 0
active yes boolean
mode yes string
event yes string
state yes array
state[] each item Any JSON value

C_StakeConfig

Field Required Type / constraints
$ yes object; extra fields forbidden
gameID yes string
minBet yes integer; minimum: 0
maxBet yes integer; minimum: 0
stepBet yes integer; minimum: 0
defaultBetLevel yes integer; minimum: 0
betLevels yes array
betLevels[] each item integer; minimum: 0
betModes yes object; extra field values: object; extra fields allowed
jurisdiction yes object; extra field values: boolean / integer

C_StakeAuthenticationResponse

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].status yes Model C_StakeStatus
$ [oneOf 1].balance yes Model C_StakeBalance
$ [oneOf 1].config yes Model C_StakeConfig
$ [oneOf 1].round no Model C_StakeRound
$ [oneOf 2] oneOf Model C_StakeError

C_StakeBalanceResponse

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].status yes Model C_StakeStatus
$ [oneOf 1].balance yes Model C_StakeBalance
$ [oneOf 2] oneOf Model C_StakeError

C_StakePlayResponse

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].status yes Model C_StakeStatus
$ [oneOf 1].balance yes Model C_StakeBalance
$ [oneOf 1].round yes Model C_StakeRound
$ [oneOf 2] oneOf Model C_StakeError

C_StakeEventResponse

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].status yes Model C_StakeStatus
$ [oneOf 1].event yes string
$ [oneOf 2] oneOf Model C_StakeError

O_Error

Field Required Type / constraints
$ yes object; extra fields forbidden
error yes string; allowed values: ["OPERATOR_AUTHENTICATION_FAILED","INVALID_REQUEST","RATE_LIMITED","INTERNAL_ERROR","GAME_NOT_FOUND","ACCOUNT_OR_GAME_NOT_FOUND","GAME_VERSION_UNAVAILABLE","RESPONSIBLE_GAMING_ACCOUNT_NOT_FOUND","WALLET_RESOURCE_NOT_FOUND","WALLET_TRANSACTION_CONFLICT","INSUFFICIENT_FUNDS","RECONCILIATION_CONFLICT","CAMPAIGN_UNAVAILABLE","NOT_FOUND","INVALID_DISPUTE_CURSOR","DISPUTE_EVIDENCE_INTEGRITY_MISMATCH","DISPUTE_EVIDENCE_TOO_LARGE","DISPUTE_EVIDENCE_ITEM_TOO_LARGE"]

O_InvalidRequestError

Field Required Type / constraints
$ yes object; extra fields forbidden
error yes exact value: "INVALID_REQUEST"
details no array; Zod issue objects; runtime-defined diagnostic values.
details[] each item Any JSON value

O_ApiKeyCreateRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
label yes string; minimum length: 1; maximum length: 128
scopes yes array; minimum items: 1; maximum items: 16
scopes[] each item string; allowed values: ["keys","launch","wallet","campaigns","responsible-gaming","reconciliation","games","disputes"]
ttlSeconds no integer; minimum: 300; maximum: 7776000; default: 7776000

O_ApiKeyCreateResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
keyId yes string; format: "uuid"
token yes string; One-time secret-bearing operator API key token. Do not persist in logs.
expiresAt yes string; format: "date-time"

O_GameEntitlementRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
enabled yes boolean
currencies yes array; minimum items: 1; maximum items: 32
currencies[] each item string; pattern: "^[A-Z]{3}$"

O_GameEntitlementResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
enabled yes boolean
currencies yes array
currencies[] each item string; pattern: "^[A-Z]{3}$"

O_LaunchRequest

Field Required Type / constraints
$ yes object; extra fields allowed
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"
gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
locale yes string; minimum length: 2; maximum length: 16; pattern: "^[a-z]{2}(?:-[A-Z]{2})?$"; HTTP accepts length 2–16; SessionService additionally enforces this locale pattern.

O_LaunchResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
launchToken yes string; One-time launch credential.
expiresInSeconds yes exact value: 300

O_RgLimitsRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"
realityCheckIntervalSeconds yes See nested fields / alternatives
realityCheckIntervalSeconds [oneOf 1] oneOf integer; minimum: 60; maximum: 86400
realityCheckIntervalSeconds [oneOf 2] oneOf null
maxSingleWager yes See nested fields / alternatives
maxSingleWager [oneOf 1] oneOf integer; minimum: 1; maximum: 9007199254740991
maxSingleWager [oneOf 2] oneOf null
dailyNetLossLimit yes See nested fields / alternatives
dailyNetLossLimit [oneOf 1] oneOf integer; minimum: 1; maximum: 9007199254740991
dailyNetLossLimit [oneOf 2] oneOf null
dailyDepositLimit yes See nested fields / alternatives
dailyDepositLimit [oneOf 1] oneOf integer; minimum: 1; maximum: 9007199254740991
dailyDepositLimit [oneOf 2] oneOf null
maxSessionSeconds yes See nested fields / alternatives
maxSessionSeconds [oneOf 1] oneOf integer; minimum: 60; maximum: 86400
maxSessionSeconds [oneOf 2] oneOf null

O_RgLimitsResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
realityCheckIntervalSeconds yes See nested fields / alternatives
realityCheckIntervalSeconds [oneOf 1] oneOf integer; minimum: 60; maximum: 86400
realityCheckIntervalSeconds [oneOf 2] oneOf null
maxSingleWager yes See nested fields / alternatives
maxSingleWager [oneOf 1] oneOf integer; minimum: 1; maximum: 9007199254740991
maxSingleWager [oneOf 2] oneOf null
dailyNetLossLimit yes See nested fields / alternatives
dailyNetLossLimit [oneOf 1] oneOf integer; minimum: 1; maximum: 9007199254740991
dailyNetLossLimit [oneOf 2] oneOf null
dailyDepositLimit yes See nested fields / alternatives
dailyDepositLimit [oneOf 1] oneOf integer; minimum: 1; maximum: 9007199254740991
dailyDepositLimit [oneOf 2] oneOf null
maxSessionSeconds yes See nested fields / alternatives
maxSessionSeconds [oneOf 1] oneOf integer; minimum: 60; maximum: 86400
maxSessionSeconds [oneOf 2] oneOf null
selfExcludedUntil yes See nested fields / alternatives
selfExcludedUntil [oneOf 1] oneOf string; format: "date-time"
selfExcludedUntil [oneOf 2] oneOf null

O_AccountRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes string; pattern: "^[A-Z]{3}$"

O_AccountResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes string; format: "uuid"
created yes boolean
balance yes integer
currency yes string; pattern: "^[A-Z]{3}$"

O_WalletTransactionRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
externalTransactionId yes string; minimum length: 1; maximum length: 256
kind yes string; allowed values: ["deposit","withdrawal"]
amount yes integer; minimum: 1; maximum: 9007199254740991; Currency minor units; safe integer.
currency yes string; pattern: "^[A-Z]{3}$"

O_WalletTransactionResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes string; format: "uuid"
externalTransactionId yes string
kind yes string; allowed values: ["deposit","withdrawal"]
amount yes integer
currency yes string; pattern: "^[A-Z]{3}$"
status yes string; allowed values: ["pending","completed","failed","manual_review"]
balance yes See nested fields / alternatives
balance [oneOf 1] oneOf integer
balance [oneOf 2] oneOf null

O_ReconciliationScan

Field Required Type / constraints
$ yes object; extra fields forbidden
clean yes boolean
accounts yes integer; minimum: 0
mismatches yes array
mismatches[] each item object; extra fields forbidden
mismatches[].accountId yes string; format: "uuid"
mismatches[].playerId yes string
mismatches[].currency yes string; pattern: "^[A-Z]{3}$"
mismatches[].storedBalance yes string; Current runtime returns SQL numeric text.
mismatches[].ledgerBalance yes string; Current runtime returns SQL numeric text.

O_ReconciliationCase

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes string; format: "uuid"
accountId yes string; format: "uuid"
playerId yes string
currency yes string; pattern: "^[A-Z]{3}$"
storedBalance yes integer
ledgerBalance yes integer
delta yes integer
status yes string; allowed values: ["open","pending_resolution","resolved"]
reasonCode yes See nested fields / alternatives
reasonCode [oneOf 1] oneOf string; allowed values: ["legacy_opening_balance","operator_wallet_confirmed","data_repair"]
reasonCode [oneOf 2] oneOf null
resolutionNote yes See nested fields / alternatives
resolutionNote [oneOf 1] oneOf string
resolutionNote [oneOf 2] oneOf null
ledgerEntryId yes See nested fields / alternatives
ledgerEntryId [oneOf 1] oneOf string; format: "uuid"
ledgerEntryId [oneOf 2] oneOf null

O_ReconciliationRun

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes string; format: "uuid"
status yes string; allowed values: ["running","completed","failed"]
accountsChecked yes integer; minimum: 0
mismatchCount yes integer; minimum: 0
createdAt yes string; format: "date-time"
completedAt yes See nested fields / alternatives
completedAt [oneOf 1] oneOf string; format: "date-time"
completedAt [oneOf 2] oneOf null
cases yes array
cases[] each item Model O_ReconciliationCase

O_ResolutionRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
reasonCode yes string; allowed values: ["legacy_opening_balance","operator_wallet_confirmed","data_repair"]
note yes string; minimum length: 10; maximum length: 2048

O_EmptyRequest

Field Required Type / constraints
$ yes object; extra fields forbidden

O_CampaignCreateRequest

Field Required Type / constraints
$ yes object; extra fields allowed
code yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
gameCode yes string; pattern: "^[a-z0-9][a-z0-9_-]{1,63}$"
currency yes string; pattern: "^[A-Z]{3}$"
budget yes integer; minimum: 1; maximum: 9007199254740991; Currency minor units; safe integer.
startsAt yes string; format: "date-time"
endsAt yes string; format: "date-time"

O_CampaignId

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes string; format: "uuid"

O_CampaignGrantRequest

Field Required Type / constraints
$ yes object; extra fields allowed
playerId yes string; minimum length: 1; maximum length: 256
amount yes integer; minimum: 1; maximum: 9007199254740991; Currency minor units; safe integer.
idempotencyKey yes string; minimum length: 1; maximum length: 256

O_CampaignGrantResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
created yes boolean
balance yes integer
grantId yes string; format: "uuid"

O_CampaignStatusRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
status yes string; allowed values: ["active","paused","ended"]

O_CampaignStatusResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes string; format: "uuid"
status yes string; allowed values: ["active","paused","ended"]

O_DisputeCollection

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf Model O_DisputeCallbacksCollection
$ [oneOf 2] oneOf Model O_DisputeConflictsCollection
$ [oneOf 3] oneOf Model O_DisputeReconciliationCollection
$ [oneOf 4] oneOf Model O_DisputeAuditCollection
$ [oneOf 5] oneOf Model O_DisputeActionAuditCollection

O_DisputeResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
operation yes object; extra fields forbidden
operation.operationId yes string; format: "uuid"
operation.originalOperationId yes See nested fields / alternatives
operation.originalOperationId [oneOf 1] oneOf string; format: "uuid"
operation.originalOperationId [oneOf 2] oneOf null
operation.kind yes string; allowed values: ["debit","credit","cancel","balance"]
operation.requestHash yes string
operation.request yes object; extra fields allowed; Persisted external-wallet request JSON.
operation.status yes string; allowed values: ["pending","approved","declined","unknown","manual_review","cancelled"]
operation.remoteTransactionId yes See nested fields / alternatives
operation.remoteTransactionId [oneOf 1] oneOf string
operation.remoteTransactionId [oneOf 2] oneOf null
operation.attemptCount yes integer; minimum: 0
operation.lastAttemptAt yes See nested fields / alternatives
operation.lastAttemptAt [oneOf 1] oneOf string; format: "date-time"
operation.lastAttemptAt [oneOf 2] oneOf null
operation.lastError yes See nested fields / alternatives
operation.lastError [oneOf 1] oneOf string
operation.lastError [oneOf 2] oneOf null
operation.recoveryAttemptCount yes integer; minimum: 0
operation.lastRecoveryAt yes See nested fields / alternatives
operation.lastRecoveryAt [oneOf 1] oneOf string; format: "date-time"
operation.lastRecoveryAt [oneOf 2] oneOf null
operation.nextRecoveryAt yes See nested fields / alternatives
operation.nextRecoveryAt [oneOf 1] oneOf string; format: "date-time"
operation.nextRecoveryAt [oneOf 2] oneOf null
operation.completedAt yes See nested fields / alternatives
operation.completedAt [oneOf 1] oneOf string; format: "date-time"
operation.completedAt [oneOf 2] oneOf null
operation.createdAt yes string; format: "date-time"
operation.updatedAt yes string; format: "date-time"
terminalEvidence yes See nested fields / alternatives
terminalEvidence [oneOf 1] oneOf object; extra fields forbidden
terminalEvidence [oneOf 1].responseHash yes string
terminalEvidence [oneOf 1].response yes object; extra fields allowed
terminalEvidence [oneOf 1].authoritativeBalanceObservedAt yes See nested fields / alternatives
terminalEvidence [oneOf 1].authoritativeBalanceObservedAt [oneOf 1] oneOf string; format: "date-time"
terminalEvidence [oneOf 1].authoritativeBalanceObservedAt [oneOf 2] oneOf null
terminalEvidence [oneOf 1].provenance yes See nested fields / alternatives
terminalEvidence [oneOf 1].provenance [oneOf 1] oneOf object; extra fields forbidden
terminalEvidence [oneOf 1].provenance [oneOf 1].source yes string; allowed values: ["direct_response","recovery_response","callback"]
terminalEvidence [oneOf 1].provenance [oneOf 1].signingKeyId yes string
terminalEvidence [oneOf 1].provenance [oneOf 1].signedTimestamp yes string
terminalEvidence [oneOf 1].provenance [oneOf 1].signature yes string
terminalEvidence [oneOf 1].provenance [oneOf 1].rawBodyBase64 yes string
terminalEvidence [oneOf 1].provenance [oneOf 2] oneOf null
terminalEvidence [oneOf 2] oneOf null
roundLink yes See nested fields / alternatives
roundLink [oneOf 1] oneOf object; extra fields forbidden
roundLink [oneOf 1].roundId yes string; format: "uuid"
roundLink [oneOf 1].role yes string; allowed values: ["debit","credit","cancel"]
roundLink [oneOf 1].externalRoundId yes string
roundLink [oneOf 1].gameCode yes string
roundLink [oneOf 1].gameVersion yes string
roundLink [oneOf 1].status yes string
roundLink [oneOf 1].wager yes integer
roundLink [oneOf 1].payout yes See nested fields / alternatives
roundLink [oneOf 1].payout [oneOf 1] oneOf integer
roundLink [oneOf 1].payout [oneOf 2] oneOf null
roundLink [oneOf 1].currency yes string; pattern: "^[A-Z]{3}$"
roundLink [oneOf 2] oneOf null
counts yes object; extra fields forbidden
counts.callbacks yes integer; minimum: 0
counts.conflicts yes integer; minimum: 0
counts.reconciliation yes integer; minimum: 0
counts.audit yes integer; minimum: 0
counts.actionAudit yes integer; minimum: 0
integrity yes object; extra fields forbidden
integrity.status yes exact value: "coherent"
collection yes See nested fields / alternatives
collection [oneOf 1] oneOf Model O_DisputeCollection
collection [oneOf 2] oneOf null

O_DisputeCallbackItem

Field Required Type / constraints
$ yes object; extra fields forbidden
messageId yes string; format: "uuid"
signingKeyId yes string
kind yes string; allowed values: ["transaction.finalized","balance.statement"]
payloadHash yes string
payload yes object; extra fields allowed
status yes string; allowed values: ["received","processed","rejected","manual_review"]
receivedAt yes string; format: "date-time"
processedAt yes See nested fields / alternatives
processedAt [oneOf 1] oneOf string; format: "date-time"
processedAt [oneOf 2] oneOf null
failureCode yes See nested fields / alternatives
failureCode [oneOf 1] oneOf string
failureCode [oneOf 2] oneOf null

O_DisputeConflictItem

Field Required Type / constraints
$ yes object; extra fields forbidden
conflictId yes string; format: "uuid"
conflictingOperationId yes See nested fields / alternatives
conflictingOperationId [oneOf 1] oneOf string; format: "uuid"
conflictingOperationId [oneOf 2] oneOf null
callbackMessageId yes See nested fields / alternatives
callbackMessageId [oneOf 1] oneOf string; format: "uuid"
callbackMessageId [oneOf 2] oneOf null
source yes string; allowed values: ["direct_response","recovery_response","callback"]
responseHash yes string
response yes object; extra fields allowed
signingKeyId yes string
signedTimestamp yes string
signature yes string
rawBodyBase64 yes string
reasonCode yes string
createdAt yes string; format: "date-time"

O_DisputeReconciliationItem

Field Required Type / constraints
$ yes object; extra fields forbidden
caseId yes string; format: "uuid"
runId yes string; format: "uuid"
statementId yes string
statementAsOf yes string; format: "date-time"
comparisonBasis yes string
playerId yes string
currency yes string; pattern: "^[A-Z]{3}$"
externalBalance yes See nested fields / alternatives
externalBalance [oneOf 1] oneOf integer; minimum: -9007199254740991; maximum: 9007199254740991
externalBalance [oneOf 2] oneOf null
internalBalance yes See nested fields / alternatives
internalBalance [oneOf 1] oneOf integer; minimum: -9007199254740991; maximum: 9007199254740991
internalBalance [oneOf 2] oneOf null
comparisonBalance yes See nested fields / alternatives
comparisonBalance [oneOf 1] oneOf integer; minimum: -9007199254740991; maximum: 9007199254740991
comparisonBalance [oneOf 2] oneOf null
delta yes See nested fields / alternatives
delta [oneOf 1] oneOf integer; minimum: -9007199254740991; maximum: 9007199254740991
delta [oneOf 2] oneOf null
reasonCode yes string
status yes string
resolutionNote yes See nested fields / alternatives
resolutionNote [oneOf 1] oneOf string
resolutionNote [oneOf 2] oneOf null
resolvedAt yes See nested fields / alternatives
resolvedAt [oneOf 1] oneOf string; format: "date-time"
resolvedAt [oneOf 2] oneOf null
createdAt yes string; format: "date-time"

O_DisputeAuditItem

Field Required Type / constraints
$ yes object; extra fields forbidden
auditId yes string; pattern: "^(?:0&#124;[1-9]\\d*)$"
occurredAt yes string; format: "date-time"
tableName yes string
action yes string
recordId yes See nested fields / alternatives
recordId [oneOf 1] oneOf string
recordId [oneOf 2] oneOf null
actor yes object; extra fields allowed
oldValue yes See nested fields / alternatives
oldValue [oneOf 1] oneOf object; extra fields allowed
oldValue [oneOf 2] oneOf null
newValue yes See nested fields / alternatives
newValue [oneOf 1] oneOf object; extra fields allowed
newValue [oneOf 2] oneOf null

O_DisputeActionAuditItem

Field Required Type / constraints
$ yes object; extra fields forbidden
auditId yes string; pattern: "^(?:0&#124;[1-9]\\d*)$"
occurredAt yes string; format: "date-time"
apiKeyId yes string; format: "uuid"
requestId yes string
action yes exact value: "external_wallet_operation.create"
targetType yes exact value: "external_wallet_operation"
targetId yes string; format: "uuid"
metadata yes object; extra fields allowed

O_DisputeCallbacksCollection

Field Required Type / constraints
$ yes object; extra fields forbidden
name yes exact value: "callbacks"
items yes array
items[] each item Model O_DisputeCallbackItem
nextCursor yes See nested fields / alternatives
nextCursor [oneOf 1] oneOf string; pattern: "^[A-Za-z0-9_-]+$"
nextCursor [oneOf 2] oneOf null
truncatedByBytes yes boolean

O_DisputeConflictsCollection

Field Required Type / constraints
$ yes object; extra fields forbidden
name yes exact value: "conflicts"
items yes array
items[] each item Model O_DisputeConflictItem
nextCursor yes See nested fields / alternatives
nextCursor [oneOf 1] oneOf string; pattern: "^[A-Za-z0-9_-]+$"
nextCursor [oneOf 2] oneOf null
truncatedByBytes yes boolean

O_DisputeReconciliationCollection

Field Required Type / constraints
$ yes object; extra fields forbidden
name yes exact value: "reconciliation"
items yes array
items[] each item Model O_DisputeReconciliationItem
nextCursor yes See nested fields / alternatives
nextCursor [oneOf 1] oneOf string; pattern: "^[A-Za-z0-9_-]+$"
nextCursor [oneOf 2] oneOf null
truncatedByBytes yes boolean

O_DisputeAuditCollection

Field Required Type / constraints
$ yes object; extra fields forbidden
name yes exact value: "audit"
items yes array
items[] each item Model O_DisputeAuditItem
nextCursor yes See nested fields / alternatives
nextCursor [oneOf 1] oneOf string; pattern: "^[A-Za-z0-9_-]+$"
nextCursor [oneOf 2] oneOf null
truncatedByBytes yes boolean

O_DisputeActionAuditCollection

Field Required Type / constraints
$ yes object; extra fields forbidden
name yes exact value: "actionAudit"
items yes array
items[] each item Model O_DisputeActionAuditItem
nextCursor yes See nested fields / alternatives
nextCursor [oneOf 1] oneOf string; pattern: "^[A-Za-z0-9_-]+$"
nextCursor [oneOf 2] oneOf null
truncatedByBytes yes boolean

W_Uuid

Field Required Type / constraints
$ yes string; format: "uuid"; pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"

W_MoneyPositive

Field Required Type / constraints
$ yes integer; minimum: 1; maximum: 9007199254740991

W_MoneyNonnegative

Field Required Type / constraints
$ yes integer; minimum: 0; maximum: 9007199254740991

W_Currency

Field Required Type / constraints
$ yes string; pattern: "^[A-Z]{3}$"

W_KeyId

Field Required Type / constraints
$ yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"

W_Error

Field Required Type / constraints
$ yes object; extra fields forbidden
error yes string; allowed values: ["INVALID_REQUEST","WALLET_CALLBACK_AUTHENTICATION_FAILED","WALLET_CALLBACK_CONFLICT","OPERATOR_AUTHENTICATION_FAILED","WALLET_SIGNING_KEY_NOT_FOUND","WALLET_SIGNING_KEY_IN_USE","WALLET_CALLBACK_RESOURCE_NOT_FOUND","EXTERNAL_WALLET_CONFLICT","EXTERNAL_WALLET_UNAVAILABLE","EXTERNAL_WALLET_OPERATION_NOT_FOUND","WALLET_RESPONSE_SIGNING_KEY_NOT_FOUND","INTERNAL_ERROR","WALLET_TRANSACTION_CONFLICT"]
details no array
details[] each item object; extra fields allowed
details[].code yes string
details[].path yes array
details[].path[] each item See nested fields / alternatives
details[].path[] [oneOf 1] oneOf string
details[].path[] [oneOf 2] oneOf integer
details[].message yes string

W_FinalizedCallback

Field Required Type / constraints
$ yes object; extra fields forbidden
type yes exact value: "transaction.finalized"
operationId yes Model W_Uuid
externalTransactionId yes string; minimum length: 1; maximum length: 256
status yes string; allowed values: ["approved","declined","reversed","manual_review"]
amount yes Model W_MoneyPositive
currency yes Model W_Currency
balance yes Model W_MoneyNonnegative

W_StatementBalance

Field Required Type / constraints
$ yes object; extra fields forbidden
playerId yes string; minimum length: 1; maximum length: 256
currency yes Model W_Currency
balance yes Model W_MoneyNonnegative

W_BalanceStatementCallback

Field Required Type / constraints
$ yes object; extra fields forbidden
type yes exact value: "balance.statement"
statementId yes string; minimum length: 1; maximum length: 256
asOf yes string; format: "date-time"
balances yes array; minimum items: 1; maximum items: 10000
balances[] each item Model W_StatementBalance

W_CallbackPayload

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf Model W_FinalizedCallback
$ [oneOf 2] oneOf Model W_BalanceStatementCallback

W_CallbackAcceptance

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes Model W_Uuid
messageId yes Model W_Uuid
status yes string; allowed values: ["processed","manual_review"]
duplicate yes boolean
reconciliationRunId no Model W_Uuid

W_SigningKeyCreate

Field Required Type / constraints
$ yes object; extra fields forbidden
keyId yes Model W_KeyId
publicKeyPem yes string; minimum length: 64; maximum length: 4096
notBefore no string; format: "date-time"
expiresAt no string; format: "date-time"

W_SigningKeyResult

Field Required Type / constraints
$ yes object; extra fields forbidden
keyId yes Model W_KeyId
algorithm yes exact value: "Ed25519"
status yes exact value: "active"
notBefore no string; format: "date-time"
expiresAt no string; format: "date-time"

W_WalletModeRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
mode yes string; allowed values: ["custodial","external"]
echo yes object; extra fields forbidden
echo.target yes string; minimum length: 1; maximum length: 2048

W_WalletModeResult

Field Required Type / constraints
$ yes object; extra fields forbidden
mode yes string; allowed values: ["custodial","external"]

W_ConnectorRequest

Field Required Type / constraints
$ yes object; extra fields forbidden
endpoint yes string; format: "uri"; maximum length: 2048
responseKeyId yes Model W_KeyId
echo yes object; extra fields forbidden
echo.target yes string; minimum length: 1; maximum length: 2048

W_ConnectorResult

Field Required Type / constraints
$ yes object; extra fields forbidden
endpoint yes string; format: "uri"
responseKeyId yes Model W_KeyId
status yes exact value: "active"

W_ExternalOperationCommand

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].operationId yes Model W_Uuid
$ [oneOf 1].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 1].currency yes Model W_Currency
$ [oneOf 1].kind yes exact value: "debit"
$ [oneOf 1].amount yes Model W_MoneyPositive
$ [oneOf 2] oneOf object; extra fields forbidden
$ [oneOf 2].operationId yes Model W_Uuid
$ [oneOf 2].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 2].currency yes Model W_Currency
$ [oneOf 2].kind yes exact value: "credit"
$ [oneOf 2].amount yes Model W_MoneyPositive
$ [oneOf 3] oneOf object; extra fields forbidden
$ [oneOf 3].operationId yes Model W_Uuid
$ [oneOf 3].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 3].currency yes Model W_Currency
$ [oneOf 3].kind yes exact value: "cancel"
$ [oneOf 3].originalOperationId yes Model W_Uuid
$ [oneOf 4] oneOf object; extra fields forbidden
$ [oneOf 4].operationId yes Model W_Uuid
$ [oneOf 4].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 4].currency yes Model W_Currency
$ [oneOf 4].kind yes exact value: "balance"

W_ExternalOperationResult

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes Model W_Uuid
operationId yes Model W_Uuid
status yes string; allowed values: ["pending","approved","declined","unknown","manual_review","cancelled"]
duplicate yes boolean
remoteTransactionId yes string / null; minimum length: 1; maximum length: 256
balance yes See nested fields / alternatives
balance [oneOf 1] oneOf Model W_MoneyNonnegative
balance [oneOf 2] oneOf null
currency yes Model W_Currency

W_ReconciliationCase

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes Model W_Uuid
accountId yes See nested fields / alternatives
accountId [oneOf 1] oneOf Model W_Uuid
accountId [oneOf 2] oneOf null
playerId yes string
currency yes Model W_Currency
externalBalance yes See nested fields / alternatives
externalBalance [oneOf 1] oneOf Model W_MoneyNonnegative
externalBalance [oneOf 2] oneOf null
comparisonBalance yes See nested fields / alternatives
comparisonBalance [oneOf 1] oneOf Model W_MoneyNonnegative
comparisonBalance [oneOf 2] oneOf null
evidenceOperationRecordId yes See nested fields / alternatives
evidenceOperationRecordId [oneOf 1] oneOf Model W_Uuid
evidenceOperationRecordId [oneOf 2] oneOf null
evidenceOperationId yes See nested fields / alternatives
evidenceOperationId [oneOf 1] oneOf Model W_Uuid
evidenceOperationId [oneOf 2] oneOf null
delta yes See nested fields / alternatives
delta [oneOf 1] oneOf integer; minimum: -9007199254740991; maximum: 9007199254740991
delta [oneOf 2] oneOf null
reasonCode yes string; allowed values: ["balance_mismatch","missing_internal_account","missing_external_balance","missing_authoritative_evidence"]
status yes string; allowed values: ["open","resolved"]
resolutionNote yes string / null
createdAt yes string; format: "date-time"

W_ReconciliationRun

Field Required Type / constraints
$ yes object; extra fields forbidden
id yes Model W_Uuid
statementId yes string
statementAsOf yes string; format: "date-time"
evidenceCutoffAt yes string; format: "date-time"
status yes string; allowed values: ["running","completed","failed"]
balancesChecked yes integer; minimum: 0
mismatchCount yes integer; minimum: 0
comparisonBasis yes string; allowed values: ["custodial_shadow_legacy","authoritative_operation_evidence"]
createdAt yes string; format: "date-time"
completedAt yes See nested fields / alternatives
completedAt [oneOf 1] oneOf string; format: "date-time"
completedAt [oneOf 2] oneOf null
cases yes array
cases[] each item Model W_ReconciliationCase

D_Record_string_unknown

Field Required Type / constraints
$ yes object; extra field values: Any JSON value

D_ActivityLog

Field Required Type / constraints
$ yes object
from yes string
to yes string
kind yes string; allowed values: ["changes","all"]
events yes array
events[] each item Model D_ActivityEvent
nextCursor yes See nested fields / alternatives
nextCursor [anyOf 1] anyOf null
nextCursor [anyOf 2] anyOf string

D_ActivityEvent

Field Required Type / constraints
$ yes object
id yes string
occurredAt yes string
actor yes string
viaConsole yes boolean
action yes string
targetType yes string
targetId yes See nested fields / alternatives
targetId [anyOf 1] anyOf null
targetId [anyOf 2] anyOf string
requestId yes string
metadata yes Model D_Record_string_unknown

D_BackofficeAlerts

Field Required Type / constraints
$ yes object
checkedAt yes string
stuckAfterMinutes yes number
alerts yes array
alerts[] each item Model D_BackofficeAlert

D_BackofficeAlert

Field Required Type / constraints
$ yes object
code yes string; allowed values: ["rounds-stuck","wallet-verifier","statement-missing","projection-stalled","projection-behind","changes-waiting","large-wins"]
severity yes string; allowed values: ["info","warning","critical"]
count yes number
detail yes string
page yes string

D_OperatorChangeView

Field Required Type / constraints
$ yes object
id yes string
action yes string; allowed values: ["free-rounds.create","free-rounds.remove","tournament.create","tournament.close","jackpot.create","campaign.create","campaign.status","market.profile","jackpot.membership.offer","jackpot.membership.accept","wallet.mode","wallet.connector","wallet.signing-key","api-key.create","game.entitlement","console.user.create","console.user.role","console.user.reset","wallet.operation","wallet.adjust","player.erase","round.void"]
subject yes See nested fields / alternatives
subject [anyOf 1] anyOf null
subject [anyOf 2] anyOf string
terms yes Model D_Record_string_unknown
termsSha256 yes string
maker yes string
createdAt yes string
expiresAt yes string
status yes string; allowed values: ["rejected","pending","expired","approved"]
checker yes See nested fields / alternatives
checker [anyOf 1] anyOf null
checker [anyOf 2] anyOf string
decidedAt yes See nested fields / alternatives
decidedAt [anyOf 1] anyOf null
decidedAt [anyOf 2] anyOf string
result yes Any JSON value

D_Record_string_number

Field Required Type / constraints
$ yes object; extra field values: number

D_LiveOpsReport

Field Required Type / constraints
$ yes object
asOf yes string
from yes string
to yes string
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
items yes object
items.rows yes array
items.rows[] each item Model D_LiveOpsItem
items.truncated yes boolean
jackpots yes object
jackpots.rows yes array
jackpots.rows[] each item Model D_LiveOpsPool
jackpots.truncated yes boolean

D_LiveOpsItem

Field Required Type / constraints
$ yes object
kind yes string; allowed values: ["free-rounds","campaign","tournament"]
id yes string
code yes string
games yes array
games[] each item string
currency yes string
status yes string
startsAt yes string
endsAt yes string
budget yes string
spent yes string
reserved yes See nested fields / alternatives
reserved [anyOf 1] anyOf null
reserved [anyOf 2] anyOf string
owed yes See nested fields / alternatives
owed [anyOf 1] anyOf null
owed [anyOf 2] anyOf string

D_LiveOpsPool

Field Required Type / constraints
$ yes object
poolKey yes string
game yes string
currency yes string
scope yes See nested fields / alternatives
scope [anyOf 1] anyOf null
scope [anyOf 2] anyOf string
tiers yes number
pot yes string
contributed yes string
owed yes string
tierDetails yes array
tierDetails[] each item object
tierDetails[].tier yes string
tierDetails[].cycle yes string
tierDetails[].pot yes string
tierDetails[].reserve yes string
tierDetails[].owed yes string
tierDetails[].paid yes string
tierDetails[].contributed yes string

D_LiveOpsGame

Field Required Type / constraints
$ yes object
gameVersionId yes string
game yes string
version yes string
currencies yes array
currencies[] each item string
freeRounds yes See nested fields / alternatives
freeRounds [anyOf 1] anyOf null
freeRounds [anyOf 2] anyOf object
freeRounds [anyOf 2].currency yes string
freeRounds [anyOf 2].payoutCategory yes string
freeRounds [anyOf 2].betAmounts yes array
freeRounds [anyOf 2].betAmounts[] each item number
jackpots yes See nested fields / alternatives
jackpots [anyOf 1] anyOf null
jackpots [anyOf 2] anyOf object
jackpots [anyOf 2].currency yes string
jackpots [anyOf 2].pools yes array
jackpots [anyOf 2].pools[] each item object
jackpots [anyOf 2].pools[].key yes string
jackpots [anyOf 2].pools[].tiers yes array
jackpots [anyOf 2].pools[].tiers[] each item string

D_MarketProfile

Field Required Type / constraints
$ yes object
id yes string
market yes string
taxBasis yes string; allowed values: ["ggr","ngr","turnover"]
rateBps yes number
freeRoundExempt yes boolean
validFrom yes string
validTo yes See nested fields / alternatives
validTo [anyOf 1] anyOf null
validTo [anyOf 2] anyOf string
state yes string; allowed values: ["scheduled","current","past"]
changeRequestId yes string
createdAt yes string

D_PlatformAlertView

Field Required Type / constraints
$ yes object
fingerprint yes string
status yes string; allowed values: ["firing","resolved"]
alertname yes string
severity yes See nested fields / alternatives
severity [anyOf 1] anyOf null
severity [anyOf 2] anyOf string
operator yes See nested fields / alternatives
operator [anyOf 1] anyOf null
operator [anyOf 2] anyOf string
summary yes See nested fields / alternatives
summary [anyOf 1] anyOf null
summary [anyOf 2] anyOf string
runbook yes See nested fields / alternatives
runbook [anyOf 1] anyOf null
runbook [anyOf 2] anyOf string
labels yes Model D_Record_string_string
annotations yes Model D_Record_string_string
startsAt yes string
endsAt yes See nested fields / alternatives
endsAt [anyOf 1] anyOf null
endsAt [anyOf 2] anyOf string
lastReceivedAt yes string

D_Record_string_string

Field Required Type / constraints
$ yes object; extra field values: string

D_BackofficePlayer

Field Required Type / constraints
$ yes object
externalPlayerId yes string
walletMode yes string
accounts yes array
accounts[] each item Model D_BackofficeAccount
freeRounds yes array
freeRounds[] each item Model D_BackofficePlayerFreeRounds
tournaments yes array
tournaments[] each item Model D_BackofficePlayerTournament
adjustments yes array
adjustments[] each item Model D_BackofficeAdjustment

D_BackofficeAccount

Field Required Type / constraints
$ yes object
accountId yes string
currency yes string
balance yes See nested fields / alternatives
balance [anyOf 1] anyOf null
balance [anyOf 2] anyOf number
createdAt yes string
stopped yes boolean
lastRoundAt yes See nested fields / alternatives
lastRoundAt [anyOf 1] anyOf null
lastRoundAt [anyOf 2] anyOf string
responsibleGaming yes See nested fields / alternatives
responsibleGaming [anyOf 1] anyOf null
responsibleGaming [anyOf 2] anyOf object
responsibleGaming [anyOf 2].realityCheckIntervalSeconds yes number
responsibleGaming [anyOf 2].maxSingleWager yes See nested fields / alternatives
responsibleGaming [anyOf 2].maxSingleWager [anyOf 1] anyOf null
responsibleGaming [anyOf 2].maxSingleWager [anyOf 2] anyOf number
responsibleGaming [anyOf 2].dailyNetLossLimit yes See nested fields / alternatives
responsibleGaming [anyOf 2].dailyNetLossLimit [anyOf 1] anyOf null
responsibleGaming [anyOf 2].dailyNetLossLimit [anyOf 2] anyOf number
responsibleGaming [anyOf 2].setBy yes string
responsibleGaming [anyOf 2].updatedAt yes string
block yes See nested fields / alternatives
block [anyOf 1] anyOf null
block [anyOf 2] anyOf object
block [anyOf 2].until yes string
block [anyOf 2].timeOutUntil yes See nested fields / alternatives
block [anyOf 2].timeOutUntil [anyOf 1] anyOf null
block [anyOf 2].timeOutUntil [anyOf 2] anyOf string
block [anyOf 2].selfExcludedUntil yes See nested fields / alternatives
block [anyOf 2].selfExcludedUntil [anyOf 1] anyOf null
block [anyOf 2].selfExcludedUntil [anyOf 2] anyOf string
pendingLimits yes See nested fields / alternatives
pendingLimits [anyOf 1] anyOf null
pendingLimits [anyOf 2] anyOf object
pendingLimits [anyOf 2].limits yes Model D_Record_string_number_null
pendingLimits [anyOf 2].effectiveAt yes string

D_Record_string_number_null

Field Required Type / constraints
$ yes object; extra field values: See nested fields / alternatives

D_BackofficePlayerFreeRounds

Field Required Type / constraints
$ yes object
grantId yes string
campaign yes string
game yes string
currency yes string
granted yes number
remaining yes number
grantedAt yes string
endsAt yes string
campaignStatus yes string

D_BackofficePlayerTournament

Field Required Type / constraints
$ yes object
tournamentId yes string
code yes string
currency yes string
joinedAt yes string
endsAt yes string
rank yes See nested fields / alternatives
rank [anyOf 1] anyOf null
rank [anyOf 2] anyOf number
rounds yes See nested fields / alternatives
rounds [anyOf 1] anyOf null
rounds [anyOf 2] anyOf string
payoutMinor yes See nested fields / alternatives
payoutMinor [anyOf 1] anyOf null
payoutMinor [anyOf 2] anyOf string
wagerMinor yes See nested fields / alternatives
wagerMinor [anyOf 1] anyOf null
wagerMinor [anyOf 2] anyOf string

D_BackofficeAdjustment

Field Required Type / constraints
$ yes object
changeId yes string
ledgerEntryId yes string
currency yes string
amountMinor yes string
balanceAfter yes string
reason yes string
reference yes string
createdAt yes string

D_PlayerActivity

Field Required Type / constraints
$ yes object
externalPlayerId yes string
from yes string
to yes string
days yes array
days[] each item Model D_PlayerActivityDay
velocity yes array
velocity[] each item Model D_PlayerVelocity
adjustments yes array
adjustments[] each item Model D_BackofficeAdjustment

D_PlayerActivityDay

Field Required Type / constraints
$ yes object
day yes string
currency yes string
rounds yes number
wager yes string
payout yes string
net yes string

D_PlayerVelocity

Field Required Type / constraints
$ yes object
currency yes string
day yes string
wager yes string
medianWager yes string
times yes See nested fields / alternatives
times [anyOf 1] anyOf null
times [anyOf 2] anyOf string

D_PlayerDataExport

Field Required Type / constraints
$ yes object
format yes string; exact value: "rgs-player-data-v1"
exportedAt yes string
externalPlayerId yes string
player yes Model D_BackofficePlayer
play yes array
play[] each item object
play[].currency yes string
play[].rounds yes number
play[].firstRoundAt yes See nested fields / alternatives
play[].firstRoundAt [anyOf 1] anyOf null
play[].firstRoundAt [anyOf 2] anyOf string
play[].lastRoundAt yes See nested fields / alternatives
play[].lastRoundAt [anyOf 1] anyOf null
play[].lastRoundAt [anyOf 2] anyOf string
play[].wager yes string
play[].payout yes string
notes yes array
notes[] each item string

D_ResponsibleGamingLimits

Field Required Type / constraints
$ yes object
selfExcludedUntil yes See nested fields / alternatives
selfExcludedUntil [anyOf 1] anyOf null
selfExcludedUntil [anyOf 2] anyOf string
timeOutUntil yes See nested fields / alternatives
timeOutUntil [anyOf 1] anyOf null
timeOutUntil [anyOf 2] anyOf string
playBlockedUntil yes See nested fields / alternatives
playBlockedUntil [anyOf 1] anyOf null
playBlockedUntil [anyOf 2] anyOf string
pending yes See nested fields / alternatives
pending [anyOf 1] anyOf null
pending [anyOf 2] anyOf object
pending [anyOf 2].limits yes Model D_Partial_ResponsibleGamingLimitValues
pending [anyOf 2].effectiveAt yes string
realityCheckIntervalSeconds yes See nested fields / alternatives
realityCheckIntervalSeconds [anyOf 1] anyOf null
realityCheckIntervalSeconds [anyOf 2] anyOf number
maxSingleWager yes See nested fields / alternatives
maxSingleWager [anyOf 1] anyOf null
maxSingleWager [anyOf 2] anyOf number
dailyNetLossLimit yes See nested fields / alternatives
dailyNetLossLimit [anyOf 1] anyOf null
dailyNetLossLimit [anyOf 2] anyOf number
dailyDepositLimit yes See nested fields / alternatives
dailyDepositLimit [anyOf 1] anyOf null
dailyDepositLimit [anyOf 2] anyOf number
maxSessionSeconds yes See nested fields / alternatives
maxSessionSeconds [anyOf 1] anyOf null
maxSessionSeconds [anyOf 2] anyOf number

D_Partial_ResponsibleGamingLimitValues

Field Required Type / constraints
$ yes object
realityCheckIntervalSeconds no See nested fields / alternatives
realityCheckIntervalSeconds [anyOf 1] anyOf null
realityCheckIntervalSeconds [anyOf 2] anyOf number
maxSingleWager no See nested fields / alternatives
maxSingleWager [anyOf 1] anyOf null
maxSingleWager [anyOf 2] anyOf number
dailyNetLossLimit no See nested fields / alternatives
dailyNetLossLimit [anyOf 1] anyOf null
dailyNetLossLimit [anyOf 2] anyOf number
dailyDepositLimit no See nested fields / alternatives
dailyDepositLimit [anyOf 1] anyOf null
dailyDepositLimit [anyOf 2] anyOf number
maxSessionSeconds no See nested fields / alternatives
maxSessionSeconds [anyOf 1] anyOf null
maxSessionSeconds [anyOf 2] anyOf number

D_PlayerWins

Field Required Type / constraints
$ yes object
externalPlayerId yes string
from yes string
to yes string
wins yes array
wins[] each item Model D_PlayerWin

D_PlayerWin

Field Required Type / constraints
$ yes object
multiplier yes See nested fields / alternatives
multiplier [anyOf 1] anyOf null
multiplier [anyOf 2] anyOf string
roundId yes string
accountId yes string
externalRoundId yes string
gameCode yes string
gameVersion yes string
status yes string; allowed values: ["created","debit_pending","open","credit_pending","settled","cancel_pending","cancelled","manual_review"]
currency yes string
wager yes number
payout yes See nested fields / alternatives
payout [anyOf 1] anyOf null
payout [anyOf 2] anyOf number
settlementMode yes string
fundingSource yes See nested fields / alternatives
fundingSource [anyOf 1] anyOf null
fundingSource [anyOf 2] anyOf string
freeRoundGrantId yes See nested fields / alternatives
freeRoundGrantId [anyOf 1] anyOf null
freeRoundGrantId [anyOf 2] anyOf string
roomId yes See nested fields / alternatives
roomId [anyOf 1] anyOf null
roomId [anyOf 2] anyOf string
createdAt yes string
settledAt yes See nested fields / alternatives
settledAt [anyOf 1] anyOf null
settledAt [anyOf 2] anyOf string

D_CohortReport

Field Required Type / constraints
$ yes object
from yes string
to yes string
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
cohortsSince yes See nested fields / alternatives
cohortsSince [anyOf 1] anyOf null
cohortsSince [anyOf 2] anyOf string
measuredThrough yes See nested fields / alternatives
measuredThrough [anyOf 1] anyOf null
measuredThrough [anyOf 2] anyOf string
rows yes array
rows[] each item Model D_CohortRow

D_CohortRow

Field Required Type / constraints
$ yes object
cohortDay yes string
currency yes string
accounts yes string
baseline yes boolean
returnedD1 yes string
returnedD7 yes string
returnedD30 yes string
d1Rate yes See nested fields / alternatives
d1Rate [anyOf 1] anyOf null
d1Rate [anyOf 2] anyOf string
d7Rate yes See nested fields / alternatives
d7Rate [anyOf 1] anyOf null
d7Rate [anyOf 2] anyOf string
d30Rate yes See nested fields / alternatives
d30Rate [anyOf 1] anyOf null
d30Rate [anyOf 2] anyOf string

D_DailyReport

Field Required Type / constraints
$ yes object
from yes string
to yes string
groupBy yes string; allowed values: ["market","day","game"]
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
gameCode yes See nested fields / alternatives
gameCode [anyOf 1] anyOf null
gameCode [anyOf 2] anyOf string
projection yes object
projection.projectedThrough yes string
projection.latestFact yes string
projection.pendingFacts yes string
projection.stalledReason yes See nested fields / alternatives
projection.stalledReason [anyOf 1] anyOf null
projection.stalledReason [anyOf 2] anyOf string
rows yes array
rows[] each item See nested fields / alternatives
rows[] [anyOf 1] anyOf Model D_DailyReportDayRow
rows[] [anyOf 2] anyOf Model D_DailyReportGameRow
rows[] [anyOf 3] anyOf Model D_DailyReportMarketRow

D_DailyReportDayRow

Field Required Type / constraints
$ yes object
day yes string
currency yes string
activeAccounts yes See nested fields / alternatives
activeAccounts [anyOf 1] anyOf null
activeAccounts [anyOf 2] anyOf string
averagePlaySeconds yes See nested fields / alternatives
averagePlaySeconds [anyOf 1] anyOf null
averagePlaySeconds [anyOf 2] anyOf string
cashRounds yes string
cashWager yes string
cashPayout yes string
ggr yes string
promoRounds yes string
promoPayout yes string
ngr yes string
observedRtp yes See nested fields / alternatives
observedRtp [anyOf 1] anyOf null
observedRtp [anyOf 2] anyOf string
margin yes See nested fields / alternatives
margin [anyOf 1] anyOf null
margin [anyOf 2] anyOf string
hitRate yes See nested fields / alternatives
hitRate [anyOf 1] anyOf null
hitRate [anyOf 2] anyOf string

D_DailyReportGameRow

Field Required Type / constraints
$ yes object
gameCode yes string
gameVersion yes string
mathVariant yes See nested fields / alternatives
mathVariant [anyOf 1] anyOf null
mathVariant [anyOf 2] anyOf string
currency yes string
theoreticalRtp yes See nested fields / alternatives
theoreticalRtp [anyOf 1] anyOf null
theoreticalRtp [anyOf 2] anyOf string
cashRounds yes string
cashWager yes string
cashPayout yes string
ggr yes string
promoRounds yes string
promoPayout yes string
ngr yes string
observedRtp yes See nested fields / alternatives
observedRtp [anyOf 1] anyOf null
observedRtp [anyOf 2] anyOf string
margin yes See nested fields / alternatives
margin [anyOf 1] anyOf null
margin [anyOf 2] anyOf string
hitRate yes See nested fields / alternatives
hitRate [anyOf 1] anyOf null
hitRate [anyOf 2] anyOf string

D_DailyReportMarketRow

Field Required Type / constraints
$ yes object
market yes See nested fields / alternatives
market [anyOf 1] anyOf null
market [anyOf 2] anyOf string
currency yes string
cashRounds yes string
cashWager yes string
cashPayout yes string
ggr yes string
promoRounds yes string
promoPayout yes string
ngr yes string
observedRtp yes See nested fields / alternatives
observedRtp [anyOf 1] anyOf null
observedRtp [anyOf 2] anyOf string
margin yes See nested fields / alternatives
margin [anyOf 1] anyOf null
margin [anyOf 2] anyOf string
hitRate yes See nested fields / alternatives
hitRate [anyOf 1] anyOf null
hitRate [anyOf 2] anyOf string

D_LiabilityReport

Field Required Type / constraints
$ yes object
asOf yes string
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
totals yes array
totals[] each item Model D_LiabilityTotals
campaigns yes object
campaigns.rows yes array
campaigns.rows[] each item Model D_LiabilityCampaign
campaigns.truncated yes boolean
jackpots yes object
jackpots.rows yes array
jackpots.rows[] each item Model D_LiabilityJackpotTier
jackpots.truncated yes boolean

D_LiabilityTotals

Field Required Type / constraints
$ yes object
currency yes string
campaignReservedMaximum yes string
campaignOwed yes string
jackpotPot yes string
jackpotReserve yes string
jackpotOwed yes string
total yes string

D_LiabilityCampaign

Field Required Type / constraints
$ yes object
code yes string
gameCode yes string
gameVersion yes string
currency yes string
status yes string
payoutCategory yes string
startsAt yes string
endsAt yes string
budget yes string
reservedMaximum yes string
owed yes string
paid yes string

D_LiabilityJackpotTier

Field Required Type / constraints
$ yes object
poolKey yes string
gameCode yes string
gameVersion yes string
scope yes See nested fields / alternatives
scope [anyOf 1] anyOf null
scope [anyOf 2] anyOf string
currency yes string
tierId yes string
cycle yes string
pot yes string
reserve yes string
owed yes string
paid yes string
contributed yes string
initial yes string

D_TaxReport

Field Required Type / constraints
$ yes object
month yes string
market yes See nested fields / alternatives
market [anyOf 1] anyOf null
market [anyOf 2] anyOf string
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
complete yes boolean
projection yes object
projection.projectedThrough yes string
projection.latestFact yes string
projection.pendingFacts yes string
projection.stalledReason yes See nested fields / alternatives
projection.stalledReason [anyOf 1] anyOf null
projection.stalledReason [anyOf 2] anyOf string
lines yes array
lines[] each item Model D_TaxReportLine

D_TaxReportLine

Field Required Type / constraints
$ yes object
market yes See nested fields / alternatives
market [anyOf 1] anyOf null
market [anyOf 2] anyOf string
currency yes string
firstDay yes string
lastDay yes string
profile yes See nested fields / alternatives
profile [anyOf 1] anyOf null
profile [anyOf 2] anyOf Model D_TaxProfileTerms
taxBase yes See nested fields / alternatives
taxBase [anyOf 1] anyOf null
taxBase [anyOf 2] anyOf string
taxDue yes See nested fields / alternatives
taxDue [anyOf 1] anyOf null
taxDue [anyOf 2] anyOf string
games yes array
games[] each item object
games[].cashRounds yes string
games[].cashWager yes string
games[].cashPayout yes string
games[].ggr yes string
games[].promoRounds yes string
games[].promoWager yes string
games[].promoPayout yes string
games[].ngr yes string
games[].gameCode yes string
games[].gameVersion yes string
cashRounds yes string
cashWager yes string
cashPayout yes string
ggr yes string
promoRounds yes string
promoWager yes string
promoPayout yes string
ngr yes string

D_TaxProfileTerms

Field Required Type / constraints
$ yes object
taxBasis yes string; allowed values: ["ggr","ngr","turnover"]
rateBps yes number
freeRoundExempt yes boolean
validFrom yes string
id yes string
validTo yes See nested fields / alternatives
validTo [anyOf 1] anyOf null
validTo [anyOf 2] anyOf string

D_BackofficeRoundListItem

Field Required Type / constraints
$ yes object
wallet yes Model D_Record_string_string
roundId yes string
accountId yes string
externalRoundId yes string
gameCode yes string
gameVersion yes string
status yes string; allowed values: ["created","debit_pending","open","credit_pending","settled","cancel_pending","cancelled","manual_review"]
currency yes string
wager yes number
payout yes See nested fields / alternatives
payout [anyOf 1] anyOf null
payout [anyOf 2] anyOf number
settlementMode yes string
fundingSource yes See nested fields / alternatives
fundingSource [anyOf 1] anyOf null
fundingSource [anyOf 2] anyOf string
freeRoundGrantId yes See nested fields / alternatives
freeRoundGrantId [anyOf 1] anyOf null
freeRoundGrantId [anyOf 2] anyOf string
roomId yes See nested fields / alternatives
roomId [anyOf 1] anyOf null
roomId [anyOf 2] anyOf string
createdAt yes string
settledAt yes See nested fields / alternatives
settledAt [anyOf 1] anyOf null
settledAt [anyOf 2] anyOf string

D_BackofficeRoundDetail

Field Required Type / constraints
$ yes object
externalPlayerId yes string
playAction yes See nested fields / alternatives
playAction [anyOf 1] anyOf null
playAction [anyOf 2] anyOf string
ledger yes array
ledger[] each item object
ledger[].type yes string
ledger[].amount yes number
ledger[].currency yes string
ledger[].balanceAfter yes number
ledger[].createdAt yes string
walletOperations yes array
walletOperations[] each item Model D_BackofficeWalletOperation
roundId yes string
accountId yes string
externalRoundId yes string
gameCode yes string
gameVersion yes string
status yes string; allowed values: ["created","debit_pending","open","credit_pending","settled","cancel_pending","cancelled","manual_review"]
currency yes string
wager yes number
payout yes See nested fields / alternatives
payout [anyOf 1] anyOf null
payout [anyOf 2] anyOf number
settlementMode yes string
fundingSource yes See nested fields / alternatives
fundingSource [anyOf 1] anyOf null
fundingSource [anyOf 2] anyOf string
freeRoundGrantId yes See nested fields / alternatives
freeRoundGrantId [anyOf 1] anyOf null
freeRoundGrantId [anyOf 2] anyOf string
roomId yes See nested fields / alternatives
roomId [anyOf 1] anyOf null
roomId [anyOf 2] anyOf string
createdAt yes string
settledAt yes See nested fields / alternatives
settledAt [anyOf 1] anyOf null
settledAt [anyOf 2] anyOf string

D_BackofficeWalletOperation

Field Required Type / constraints
$ yes object
provider yes string
providerName yes string
role yes string
kind yes string
status yes string
amount yes See nested fields / alternatives
amount [anyOf 1] anyOf null
amount [anyOf 2] anyOf number
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
operationId yes string
remoteTransactionId yes See nested fields / alternatives
remoteTransactionId [anyOf 1] anyOf null
remoteTransactionId [anyOf 2] anyOf string
attempts yes See nested fields / alternatives
attempts [anyOf 1] anyOf null
attempts [anyOf 2] anyOf number
lastAttemptAt yes See nested fields / alternatives
lastAttemptAt [anyOf 1] anyOf null
lastAttemptAt [anyOf 2] anyOf string
lastError yes See nested fields / alternatives
lastError [anyOf 1] anyOf null
lastError [anyOf 2] anyOf string
responseSource yes See nested fields / alternatives
responseSource [anyOf 1] anyOf null
responseSource [anyOf 2] anyOf string
createdAt yes string
completedAt yes See nested fields / alternatives
completedAt [anyOf 1] anyOf null
completedAt [anyOf 2] anyOf string

D_RoundAttention

Field Required Type / constraints
$ yes object
olderThanMinutes yes number
rounds yes array
rounds[] each item Model D_AttentionRound
more yes boolean
outlierThresholds yes Model D_OutlierThresholds
outliers yes array
outliers[] each item Model D_AccountOutlier
moreOutliers yes boolean

D_AttentionRound

Field Required Type / constraints
$ yes object
externalPlayerId yes string
updatedAt yes string
wallet yes Model D_Record_string_string
roundId yes string
accountId yes string
externalRoundId yes string
gameCode yes string
gameVersion yes string
status yes string; allowed values: ["created","debit_pending","open","credit_pending","settled","cancel_pending","cancelled","manual_review"]
currency yes string
wager yes number
payout yes See nested fields / alternatives
payout [anyOf 1] anyOf null
payout [anyOf 2] anyOf number
settlementMode yes string
fundingSource yes See nested fields / alternatives
fundingSource [anyOf 1] anyOf null
fundingSource [anyOf 2] anyOf string
freeRoundGrantId yes See nested fields / alternatives
freeRoundGrantId [anyOf 1] anyOf null
freeRoundGrantId [anyOf 2] anyOf string
roomId yes See nested fields / alternatives
roomId [anyOf 1] anyOf null
roomId [anyOf 2] anyOf string
createdAt yes string
settledAt yes See nested fields / alternatives
settledAt [anyOf 1] anyOf null
settledAt [anyOf 2] anyOf string

D_OutlierThresholds

Field Required Type / constraints
$ yes object
outlierWindowMinutes yes number
velocityRounds yes number
winRateMinimumRounds yes number
winRatePercentOfRtp yes number

D_AccountOutlier

Field Required Type / constraints
$ yes object
signal yes string; allowed values: ["velocity","win-rate"]
reason yes string
externalPlayerId yes string
currency yes string
gameCode yes See nested fields / alternatives
gameCode [anyOf 1] anyOf null
gameCode [anyOf 2] anyOf string
gameVersion yes See nested fields / alternatives
gameVersion [anyOf 1] anyOf null
gameVersion [anyOf 2] anyOf string
rounds yes number
cashRounds yes number
wager yes string
payout yes string
rtp yes See nested fields / alternatives
rtp [anyOf 1] anyOf null
rtp [anyOf 2] anyOf object
rtp [anyOf 2].payout yes string
rtp [anyOf 2].wager yes string
returnBps yes See nested fields / alternatives
returnBps [anyOf 1] anyOf null
returnBps [anyOf 2] anyOf string
rtpBps yes See nested fields / alternatives
rtpBps [anyOf 1] anyOf null
rtpBps [anyOf 2] anyOf string
boundBps yes See nested fields / alternatives
boundBps [anyOf 1] anyOf null
boundBps [anyOf 2] anyOf string

D_RoundLookup

Field Required Type / constraints
$ yes object
reference yes string
matches yes array
matches[] each item Model D_RoundLookupMatch

D_RoundLookupMatch

Field Required Type / constraints
$ yes object
externalPlayerId yes string
matchedOn yes string; allowed values: ["round-id","wallet-operation-id","provider-transaction-id","external-round-id"]
matchedOnAll yes array
matchedOnAll[] each item string; allowed values: ["round-id","wallet-operation-id","provider-transaction-id","external-round-id"]
wallet yes Model D_Record_string_string
roundId yes string
accountId yes string
externalRoundId yes string
gameCode yes string
gameVersion yes string
status yes string; allowed values: ["created","debit_pending","open","credit_pending","settled","cancel_pending","cancelled","manual_review"]
currency yes string
wager yes number
payout yes See nested fields / alternatives
payout [anyOf 1] anyOf null
payout [anyOf 2] anyOf number
settlementMode yes string
fundingSource yes See nested fields / alternatives
fundingSource [anyOf 1] anyOf null
fundingSource [anyOf 2] anyOf string
freeRoundGrantId yes See nested fields / alternatives
freeRoundGrantId [anyOf 1] anyOf null
freeRoundGrantId [anyOf 2] anyOf string
roomId yes See nested fields / alternatives
roomId [anyOf 1] anyOf null
roomId [anyOf 2] anyOf string
createdAt yes string
settledAt yes See nested fields / alternatives
settledAt [anyOf 1] anyOf null
settledAt [anyOf 2] anyOf string

D_TournamentStandings

Field Required Type / constraints
$ yes object
tournamentId yes string
code yes string
currency yes string
scoring yes string
startsAt yes string
endsAt yes string
entries yes array
entries[] each item object
entries[].rank yes number
entries[].externalPlayerId yes string
entries[].rounds yes string
entries[].wagerMinor yes string
entries[].payoutMinor yes string
entries[].bestPayoutMinor yes string
entries[].prizeMinor yes See nested fields / alternatives
entries[].prizeMinor [anyOf 1] anyOf null
entries[].prizeMinor [anyOf 2] anyOf string

D_ConsoleUserView

Field Required Type / constraints
$ yes object
userId yes string
username yes string
role yes string; allowed values: ["finance","viewer","support","admin"]
status yes string; allowed values: ["disabled","active","pending"]
createdAt yes string
lockedUntil yes See nested fields / alternatives
lockedUntil [anyOf 1] anyOf null
lockedUntil [anyOf 2] anyOf string
approver yes boolean
lastSignInAt yes See nested fields / alternatives
lastSignInAt [anyOf 1] anyOf null
lastSignInAt [anyOf 2] anyOf string
openSessions yes number

D_WalletVerificationRun

Field Required Type / constraints
$ yes object
runId yes string
playerId yes string
currency yes string
amount yes number
startedAt yes string
finishedAt yes string
passed yes boolean
checks yes array
checks[] each item Model D_WalletCheck

D_WalletCheck

Field Required Type / constraints
$ yes object
check yes string
status yes string; allowed values: ["failed","passed","skipped"]
operationId yes See nested fields / alternatives
operationId [anyOf 1] anyOf null
operationId [anyOf 2] anyOf string
expected yes string
observed yes string

D_WalletVerificationAttempt

Field Required Type / constraints
$ yes object
runId yes string
requestId yes string
playerId yes string
currency yes string
amount yes number
startedAt yes string
state yes string; allowed values: ["running","recovering","needs-review"]
closedAt yes See nested fields / alternatives
closedAt [anyOf 1] anyOf null
closedAt [anyOf 2] anyOf string

D_LargeWins

Field Required Type / constraints
$ yes object
from yes string
to yes string
minMultiplier yes number
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
wins yes array
wins[] each item Model D_LargeWin
more yes boolean

D_LargeWin

Field Required Type / constraints
$ yes object
externalPlayerId yes string
multiplier yes See nested fields / alternatives
multiplier [anyOf 1] anyOf null
multiplier [anyOf 2] anyOf string
roundId yes string
accountId yes string
externalRoundId yes string
gameCode yes string
gameVersion yes string
status yes string; allowed values: ["created","debit_pending","open","credit_pending","settled","cancel_pending","cancelled","manual_review"]
currency yes string
wager yes number
payout yes See nested fields / alternatives
payout [anyOf 1] anyOf null
payout [anyOf 2] anyOf number
settlementMode yes string
fundingSource yes See nested fields / alternatives
fundingSource [anyOf 1] anyOf null
fundingSource [anyOf 2] anyOf string
freeRoundGrantId yes See nested fields / alternatives
freeRoundGrantId [anyOf 1] anyOf null
freeRoundGrantId [anyOf 2] anyOf string
roomId yes See nested fields / alternatives
roomId [anyOf 1] anyOf null
roomId [anyOf 2] anyOf string
createdAt yes string
settledAt yes See nested fields / alternatives
settledAt [anyOf 1] anyOf null
settledAt [anyOf 2] anyOf string

D_PlayerErasure

Field Required Type / constraints
$ yes object
accountId yes string
accounts yes array
accounts[] each item string
pseudonym yes string
sessionsRevoked yes number
changeId yes See nested fields / alternatives
changeId [anyOf 1] anyOf null
changeId [anyOf 2] anyOf string
alreadyErased yes boolean

D_PublicLobbyUser

Field Required Type / constraints
$ yes object
username yes string
player_id yes string
role yes string; allowed values: ["admin","member","guest"]
disabled yes boolean
session_version yes number
created_at yes string; format: "date-time"

D_LobbySnapshot

Field Required Type / constraints
$ yes object
users yes array
users[] each item Model D_Pick_LobbyUser_disabled_username_role_created_at
games yes array
games[] each item Model D_LobbyGamePolicy
grants yes array
grants[] each item object
grants[].username yes string
grants[].game_code yes string
events yes array
events[] each item object
events[].actor yes string
events[].action yes string
events[].target yes string
events[].created_at yes string; format: "date-time"

D_Pick_LobbyUser_disabled_username_role_created_at

Field Required Type / constraints
$ yes object
disabled yes boolean
username yes string
role yes string; allowed values: ["admin","member","guest"]
created_at yes string; format: "date-time"

D_LobbyGamePolicy

Field Required Type / constraints
$ yes object
game_code yes string
visibility yes string; allowed values: ["disabled","public","restricted"]

D_LobbyActivityOverview

Field Required Type / constraints
$ yes object
q yes string
page yes number
pageSize yes number
total yes number
players yes array
players[] each item Model D_LobbyActivityPlayer
currency yes string

D_LobbyActivityPlayer

Field Required Type / constraints
$ yes object
username yes string
disabled yes boolean
account_id yes See nested fields / alternatives
account_id [anyOf 1] anyOf null
account_id [anyOf 2] anyOf string
balance yes See nested fields / alternatives
balance [anyOf 1] anyOf null
balance [anyOf 2] anyOf string
currency yes See nested fields / alternatives
currency [anyOf 1] anyOf null
currency [anyOf 2] anyOf string
rounds yes See nested fields / alternatives
rounds [anyOf 1] anyOf null
rounds [anyOf 2] anyOf string
games_played yes See nested fields / alternatives
games_played [anyOf 1] anyOf null
games_played [anyOf 2] anyOf string
last_played yes See nested fields / alternatives
last_played [anyOf 1] anyOf null
last_played [anyOf 2] anyOf string; format: "date-time"
total_bet yes See nested fields / alternatives
total_bet [anyOf 1] anyOf null
total_bet [anyOf 2] anyOf string
total_won yes See nested fields / alternatives
total_won [anyOf 1] anyOf null
total_won [anyOf 2] anyOf string

D_LobbyActivityDetail

Field Required Type / constraints
$ yes object
player yes Model D_LobbyActivityPlayer
games yes array
games[] each item Model D_LobbyActivityGame
history yes array
history[] each item Model D_LobbyActivityRound
game yes string
currency yes string
page yes number
pageSize yes number
total yes number

D_LobbyActivityGame

Field Required Type / constraints
$ yes object
game_code yes string
rounds yes string
last_played yes See nested fields / alternatives
last_played [anyOf 1] anyOf null
last_played [anyOf 2] anyOf string; format: "date-time"
total_bet yes string
total_won yes string

D_LobbyActivityRound

Field Required Type / constraints
$ yes object
id yes string
game_code yes string
created_at yes string; format: "date-time"
settled_at yes See nested fields / alternatives
settled_at [anyOf 1] anyOf null
settled_at [anyOf 2] anyOf string; format: "date-time"
status yes string
wager yes string
payout yes string
currency yes string

D_Readonly_balance_number_currency_string_refilled_boolean

Field Required Type / constraints
$ yes object
balance yes number
currency yes string
refilled yes boolean

D_Readonly_account_id_string_game_code_string

Field Required Type / constraints
$ yes object
account_id yes string
game_code yes string

D_ExternalWalletResult

Field Required Type / constraints
$ yes object
id yes string
operationId yes string
status yes string; allowed values: ["unknown","cancelled","manual_review","pending","approved","declined"]
duplicate yes boolean
remoteTransactionId yes See nested fields / alternatives
remoteTransactionId [anyOf 1] anyOf null
remoteTransactionId [anyOf 2] anyOf string
balance yes See nested fields / alternatives
balance [anyOf 1] anyOf null
balance [anyOf 2] anyOf number
currency yes string

D_InteractiveMarketPolicyResult

Field Required Type / constraints
$ yes object
id yes string
status yes string; allowed values: ["approved","prepared"]
confirm yes Model D_Readonly_target_string_operatorId_string_previousPolicyId_st
expiresAt yes string

D_Readonly_target_string_operatorId_string_previousPolicyId_st

Field Required Type / constraints
$ yes object
target yes string
operatorId yes string
previousPolicyId yes See nested fields / alternatives
previousPolicyId [anyOf 1] anyOf null
previousPolicyId [anyOf 2] anyOf string
gameVersionId yes string
brandId yes string
marketId yes string
currency yes string
unit yes string; exact value: "milliseconds"
timeoutMilliseconds yes number
profile yes string; allowed values: ["dev","demo","staging","real-money"]
environmentId yes string
reason yes string

D_InteractiveMarketPolicyRevocation

Field Required Type / constraints
$ yes object
id yes string
status yes string; exact value: "revoked"
confirm yes Model D_Readonly_target_string_operatorId_string_previousPolicyId_st
reason yes string
revokedAt yes string

D_MathFamilyPolicyResult

Field Required Type / constraints
$ yes object
id yes string
status yes string; allowed values: ["approved","prepared"]
confirm yes Model D_Readonly_target_string_operatorId_string_previousPolicyId_st_2
expiresAt yes string

D_Readonly_target_string_operatorId_string_previousPolicyId_st_2

Field Required Type / constraints
$ yes object
target yes string
operatorId yes string
previousPolicyId yes See nested fields / alternatives
previousPolicyId [anyOf 1] anyOf null
previousPolicyId [anyOf 2] anyOf string
gameVersionId yes string
brandId yes string
marketId yes string
currency yes string
selectionSha256 yes string
available yes boolean
profile yes string; allowed values: ["dev","demo","staging","real-money"]
environmentId yes string
reason yes string

D_ObligationAgePolicyResult

Field Required Type / constraints
$ yes object
id yes string
status yes string; allowed values: ["approved","prepared"]
confirm yes Model D_Readonly_target_string_operatorId_string_previousPolicyId_st_3
expiresAt yes string

D_Readonly_target_string_operatorId_string_previousPolicyId_st_3

Field Required Type / constraints
$ yes object
target yes string
operatorId yes string
previousPolicyId yes See nested fields / alternatives
previousPolicyId [anyOf 1] anyOf null
previousPolicyId [anyOf 2] anyOf string
unit yes string; exact value: "milliseconds"
pendingDebitMs yes number
owedCreditMs yes number
profile yes string; allowed values: ["dev","demo","staging","real-money"]
environmentId yes string
reason yes string

D_OperationStatementReport

Field Required Type / constraints
$ yes object
format yes string; exact value: "external-operation-comparison-v1"
comparisonBasis yes string; exact value: "independent_statement_vs_operation_journal"
coverage yes string; exact value: "explicit-operation-ids-only"
operatorId yes string
statementId yes string
statementAsOf yes string
signingKeyRecordId yes string
payloadSha256 yes string
scopeSha256 yes string
observedAt yes string
expectedOperations yes number
statementOperations yes number
localOperations yes number
matchedOperations yes number
matches yes boolean
issues yes array
issues[] each item Model D_OperationStatementIssue
localEvidence yes array
localEvidence[] each item object
localEvidence[].operationId yes string
localEvidence[].recordId yes string
localEvidence[].requestSha256 yes string

D_OperationStatementIssue

Field Required Type / constraints
$ yes object
operationId yes string
reason yes string
disposition yes string; allowed values: ["unresolved","mismatch"]

D_ReconciliationRun

Field Required Type / constraints
$ yes object
id yes string
status yes string
accountsChecked yes number
mismatchCount yes number
createdAt yes string
completedAt yes See nested fields / alternatives
completedAt [anyOf 1] anyOf null
completedAt [anyOf 2] anyOf string
cases yes array
cases[] each item object
cases[].id yes string
cases[].accountId yes string
cases[].playerId yes string
cases[].currency yes string
cases[].storedBalance yes number
cases[].ledgerBalance yes number
cases[].delta yes number
cases[].status yes string
cases[].reasonCode yes See nested fields / alternatives
cases[].reasonCode [anyOf 1] anyOf null
cases[].reasonCode [anyOf 2] anyOf string
cases[].resolutionNote yes See nested fields / alternatives
cases[].resolutionNote [anyOf 1] anyOf null
cases[].resolutionNote [anyOf 2] anyOf string
cases[].ledgerEntryId yes See nested fields / alternatives
cases[].ledgerEntryId [anyOf 1] anyOf null
cases[].ledgerEntryId [anyOf 2] anyOf string

D_Readable

Field Required Type / constraints
$ yes object
readableAborted yes boolean
readable yes boolean
readableDidRead yes boolean
readableEncoding yes See nested fields / alternatives
readableEncoding [anyOf 1] anyOf null
readableEncoding [anyOf 2] anyOf string; allowed values: ["ascii","utf8","utf-8","utf16le","utf-16le","ucs2","ucs-2","base64","base64url","latin1","binary","hex"]
readableEnded yes boolean
readableFlowing yes See nested fields / alternatives
readableFlowing [anyOf 1] anyOf null
readableFlowing [anyOf 2] anyOf boolean
readableHighWaterMark yes number
readableLength yes number
readableObjectMode yes boolean
destroyed yes boolean
closed yes boolean
errored yes See nested fields / alternatives
errored [anyOf 1] anyOf null
errored [anyOf 2] anyOf Model D_Error

D_Error

Field Required Type / constraints
$ yes object
name yes string
message yes string
stack no string
cause no Any JSON value

D_RoundResult

Field Required Type / constraints
$ yes object
roundId yes string
payout yes number
balance yes number
state yes Any JSON value
fairness yes object
fairness.commitment yes string
fairness.serverSeed yes string
fairness.algorithm yes string; allowed values: ["rng-v2-hmac-drbg-sha256-per-draw","23rgs-hmac-sha256-v1"]

D_VoidedRound

Field Required Type / constraints
$ yes object
roundId yes string
status yes string; exact value: "cancelled"
refund yes number
currency yes string

D_WalletTransactionResult

Field Required Type / constraints
$ yes object
id yes string
externalTransactionId yes string
kind yes string; allowed values: ["deposit","withdrawal"]
amount yes number
currency yes string
status yes string
balance yes See nested fields / alternatives
balance [anyOf 1] anyOf null
balance [anyOf 2] anyOf number

D_Record_string_Record_string_number

Field Required Type / constraints
$ yes object; extra field values: Model D_Record_string_number_2

D_Record_string_number_2

Field Required Type / constraints
$ yes object; extra field values: array

D_PinnedBetLimits

Field Required Type / constraints
$ yes object
minimum yes number
maximum yes number
maximumWin yes number
default no number
currencyPolicy no Model D_Readonly_format_currency_policy_v1_registry_readonly_Readonl
marketPolicy no Model D_Readonly_country_string_operatorId_string_brandId_string_mar
wagerPolicy no Model D_Readonly_maximumBonusBet_number_maximumExposure_number_bonus

D_Readonly_format_currency_policy_v1_registry_readonly_Readonl

Field Required Type / constraints
$ yes object
format yes string; exact value: "currency-policy-v1"
registry yes array
registry[] each item Model D_Readonly_currency_string_decimals_number
fx yes Model D_Readonly_version_string_baseCurrency_string_rates_readonly_R

D_Readonly_currency_string_decimals_number

Field Required Type / constraints
$ yes object
currency yes string
decimals yes number

D_Readonly_version_string_baseCurrency_string_rates_readonly_R

Field Required Type / constraints
$ yes object
version yes string
baseCurrency yes string
rates yes array
rates[] each item Model D_Readonly_currency_string_numerator_string_denominator_string

D_Readonly_currency_string_numerator_string_denominator_string

Field Required Type / constraints
$ yes object
currency yes string
numerator yes string
denominator yes string

D_Readonly_country_string_operatorId_string_brandId_string_mar

Field Required Type / constraints
$ yes object
country yes string
operatorId yes string
brandId yes string
marketId yes string
currency yes string
features yes Model D_Readonly_autoplay_boolean_turbo_boolean_minimumSpinMilliseco
blockedCountries yes array
blockedCountries[] each item string

D_Readonly_autoplay_boolean_turbo_boolean_minimumSpinMilliseco

Field Required Type / constraints
$ yes object
autoplay yes boolean
turbo yes boolean
minimumSpinMilliseconds yes number

D_Readonly_maximumBonusBet_number_maximumExposure_number_bonus

Field Required Type / constraints
$ yes object
maximumBonusBet yes number
maximumExposure yes number
bonusBuy yes boolean
modes yes array
modes[] each item Model D_Readonly_action_string_kind_main_bonus

D_Readonly_action_string_kind_main_bonus

Field Required Type / constraints
$ yes object
action yes string
kind yes string; allowed values: ["main","bonus"]

D_QueryResultRow

Field Required Type / constraints
$ yes object; extra field values: Any JSON value

D_FairCommitment

Field Required Type / constraints
$ yes object
protocol yes string; exact value: "23rgs-fair-v1"
algorithm yes string; exact value: "23rgs-hmac-sha256-v1"
commitment yes string
drawId yes string
nonce yes string; exact value: "0"

D_WalletCallbackAcceptance

Field Required Type / constraints
$ yes object
id yes string
messageId yes string
status yes string
duplicate yes boolean
reconciliationRunId no string

Operator-hosted wallet API

Specification: operator-wallet.openapi.json · version 2026-09-21+ed208c3.

POST /wallet/v1/operations

Execute one RGS-signed wallet operation

RGS sends this request to the configured connector endpoint. The body is signed as exact bytes. The endpoint must return a signed 200 response; any other HTTP status is recorded by RGS as unknown transport evidence, not accepted as a wallet result.

Authentication: W_RgsKeyId + W_RgsTimestamp + W_RgsOperationId + W_RgsSignature.

Parameter Location Required Type / constraints
X-Rgs-Key-Id header yes Model W_KeyId
X-Rgs-Timestamp header yes string; pattern: "^\\d{10}$"
X-Rgs-Operation-Id header yes Model W_Uuid
X-Rgs-Signature header yes string; pattern: "^[A-Za-z0-9_-]{86}$"

Request body: required.

Content type: application/vnd.23rgs.wallet-operation+json. Model W_OperationRequest

HTTP Response / media / model
200 Signed final wallet result. RGS accepts only HTTP 200 and a content type beginning application/vnd.23rgs.wallet-operation+json. Verify ASCII(X-Wallet-Timestamp) + "." + ASCII(X-Wallet-Operation-Id) + "." + exact response body bytes. — application/vnd.23rgs.wallet-operation+json: Model W_OperationResponse — Header X-Wallet-Key-Id: Model W_KeyId Must equal the active connector responseKeyId. — Header X-Wallet-Timestamp: string; pattern: "^\\d{10}$" Must be within ±30 seconds of RGS time. — Header X-Wallet-Operation-Id: Model W_Uuid Must exactly equal the requested operation ID. — Header X-Wallet-Signature: string; pattern: "^[A-Za-z0-9_-]{86}$" Ed25519 signature of exact framed response bytes.
default RGS rejects non-200 responses as transport failure; no error response body is part of this protocol.

GET /wallet/v1/operations/{operationId}

Lookup one previously submitted operation

RGS appends the operation ID to the configured connector endpoint after removing its query and fragment. There is no request body. RGS signs the prefix ending in the final period only.

Authentication: W_RgsKeyId + W_RgsTimestamp + W_RgsOperationId + W_RgsSignature.

Parameter Location Required Type / constraints
operationId path yes Model W_Uuid
X-Rgs-Key-Id header yes Model W_KeyId
X-Rgs-Timestamp header yes string; pattern: "^\\d{10}$"
X-Rgs-Operation-Id header yes Model W_Uuid
X-Rgs-Signature header yes string; pattern: "^[A-Za-z0-9_-]{86}$"
HTTP Response / media / model
200 Signed final wallet result. RGS accepts only HTTP 200 and a content type beginning application/vnd.23rgs.wallet-operation+json. Verify ASCII(X-Wallet-Timestamp) + "." + ASCII(X-Wallet-Operation-Id) + "." + exact response body bytes. — application/vnd.23rgs.wallet-operation+json: Model W_OperationResponse — Header X-Wallet-Key-Id: Model W_KeyId Must equal the active connector responseKeyId. — Header X-Wallet-Timestamp: string; pattern: "^\\d{10}$" Must be within ±30 seconds of RGS time. — Header X-Wallet-Operation-Id: Model W_Uuid Must exactly equal the requested operation ID. — Header X-Wallet-Signature: string; pattern: "^[A-Za-z0-9_-]{86}$" Ed25519 signature of exact framed response bytes.
default RGS rejects non-200 responses as a recovery failure; no error response body is part of this protocol.

Operator-hosted wallet API — reusable models

W_Uuid

Field Required Type / constraints
$ yes string; format: "uuid"; pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"

W_KeyId

Field Required Type / constraints
$ yes string; pattern: "^[A-Za-z0-9._-]{1,128}$"

W_Currency

Field Required Type / constraints
$ yes string; pattern: "^[A-Z]{3}$"

W_MoneyPositive

Field Required Type / constraints
$ yes integer; minimum: 1; maximum: 9007199254740991

W_MoneyNonnegative

Field Required Type / constraints
$ yes integer; minimum: 0; maximum: 9007199254740991

W_OperationRequest

Field Required Type / constraints
$ yes See nested fields / alternatives
$ [oneOf 1] oneOf object; extra fields forbidden
$ [oneOf 1].version yes exact value: 1
$ [oneOf 1].operationId yes Model W_Uuid
$ [oneOf 1].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 1].currency yes Model W_Currency
$ [oneOf 1].kind yes exact value: "debit"
$ [oneOf 1].amount yes Model W_MoneyPositive
$ [oneOf 2] oneOf object; extra fields forbidden
$ [oneOf 2].version yes exact value: 1
$ [oneOf 2].operationId yes Model W_Uuid
$ [oneOf 2].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 2].currency yes Model W_Currency
$ [oneOf 2].kind yes exact value: "credit"
$ [oneOf 2].amount yes Model W_MoneyPositive
$ [oneOf 3] oneOf object; extra fields forbidden
$ [oneOf 3].version yes exact value: 1
$ [oneOf 3].operationId yes Model W_Uuid
$ [oneOf 3].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 3].currency yes Model W_Currency
$ [oneOf 3].kind yes exact value: "cancel"
$ [oneOf 3].originalOperationId yes Model W_Uuid
$ [oneOf 4] oneOf object; extra fields forbidden
$ [oneOf 4].version yes exact value: 1
$ [oneOf 4].operationId yes Model W_Uuid
$ [oneOf 4].playerId yes string; minimum length: 1; maximum length: 256
$ [oneOf 4].currency yes Model W_Currency
$ [oneOf 4].kind yes exact value: "balance"

W_OperationResponse

Field Required Type / constraints
$ yes object; extra fields forbidden
operationId yes Model W_Uuid
status yes string; allowed values: ["approved","declined"]
remoteTransactionId yes string; minimum length: 1; maximum length: 256
currency yes Model W_Currency
balance yes Model W_MoneyNonnegative