The current remote gaming service: operator integration, game clients, wallet protocols and the SDK showcase.
3f5afad7d77668ee5b47e72140086514d76b9418Prepared for technical integration assessment. This edition describes the implemented API, including configuration-dependent routes. Showcase balances are synthetic. Examples contain no live credentials.
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,/transactionwith 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/authenticateand/wallet/playlist the session'sfreeRounds, and/wallet/playtakesfreeRoundId(client API). - BetSymphony: a declined wager now cancels its round and answersERR_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_BUSYwithRetry-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/campaignsnow supports boundedlimit/cursorpages 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
/metricsfrom the gameplay listener. Operations use a separate internal memory-only endpoint, default127.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
503with{ "error": "MONEY_PATH_BUSY" }andRetry-After: 1for 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/playretains its Stake HTTP-200ERR_UEenvelope withRound 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.
| 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.
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.
| 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.
Content-Type: application/json.application/vnd.23rgs.wallet-callback+json; their exact bytes are signed. Preserve that media type and the 23rgs signature domain names verbatim.413.200; creation routes may return 201; callback admission and unsettled native rounds may return 202; some close/revoke routes return 204 without a body. Each endpoint defines its own statuses.400 INVALID_REQUEST (since w21 for every one of them). Partner-protocol surfaces stay as tolerant as their protocols need: the browser wallet bodies (/wallet/*, /bet/event) accept and ignore extra fields, and the signed wallet callback reads its four X-Wallet-* headers among the others a request carries. The individual schemas show which is which.Idempotency-Key HTTP header contract. Idempotency lives in named JSON identifiers documented per endpoint.| 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 |
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.
playerId, currency, gameCode and locale.sessionID; subsequent SDK calls reuse that binding./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.
| 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.
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.
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.
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.
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.
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.
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
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>"}.
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.
externalTransactionId and identical operation. Lookup is available under /operator/v1/wallet/transactions/{externalTransactionId}.externalRoundId and wager.id. Reusing an accepted identity with changed content conflicts.commandId and canonical body before sending. Retry/recover the same identity; do not manufacture a new wager after a lost response. Recovery is scoped to the authenticated operator/account/game, including the supported replacement-session path./wallet/play: this current edge generates a new server-side round identity for each request. It does not expose the native v2 caller-command idempotency contract. A network timeout is not permission to blindly resubmit the same SDK wager as a new call.pending/unknown result is not a proved decline.202: inspect the response body. It can mean an accepted callback, a pending round settlement, or an unresolved external balance request; it is not a universal success result.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.
| 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.
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.
Implementation: ed208c392fd33d563ed095cd5ffe95f474abda21 · 21 September 2026 · titles and lobby routes re-checked on 5 November 2026 (w21, 78cf205a)
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.
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.
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_session, HttpOnly, SameSite=Lax, Path=/, with a twelve-hour lifetime. HTTPS sets Secure.303 to /login?next=...; other requests receive 401 {"error":"SIGN_IN_REQUIRED"}./health/live; mismatch returns 403 {"error":"DEMO_LOBBY_ORIGIN_REQUIRED"}.Cache-Control: no-store. Static assets use no-cache, or private, max-age=31536000, immutable for immutable asset paths.502 {"error":"DEMO_LOBBY_UPSTREAM_UNAVAILABLE"}. Other handled client errors return their 4xx status with {"error":"INVALID_REQUEST"}.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.
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.htmland 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.
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.
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.
The base app always registers authentication, balance, session close, and reality-check routes. The OpenAPI fragment marks optional registrations with x-registration-condition:
rounds: browser wallet routes, /v1/play, history/replay/fairness, /v2/play, /v2/recover and /v2/state.interactive: /v2/interactive/* and /v1/interactive/rounds/{id}/replay.campaigns, responsibleGaming, and multiplayerLobby: their respective client routes.The production entrypoint supplies rounds, campaigns, responsible gaming, and multiplayer lobby. Interactive routes are installed only when an interactive runtime registry is available.
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.
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.
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.
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.
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 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.
POST /v2/interactive/start: lowercase UUIDv4 commandId, positive wager, and 1–1024 byte client seed. It debits once and is idempotent only for the exact account/game/wager/seed binding.POST /v2/interactive/action: lowercase UUID roundId, new UUIDv4 command ID, expectedSequence 0–63, and an action matching [A-Za-z0-9][A-Za-z0-9._:-]{0,127}. Repeating the same accepted command is acknowledged with duplicate: true; a conflict is 409 INTERACTIVE_COMMAND_CONFLICT.POST /v2/interactive/recover: start command ID only. It is read-only recovery and returns 404 INTERACTIVE_EXECUTION_NOT_FOUND when unavailable in the caller’s account/game scope.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.
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.
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.
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).
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.
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.
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.
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"}
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.
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.
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"}
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.
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.
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"}.
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"}.
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.
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 /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.
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}
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.
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 /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.
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.
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.
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}.
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}.
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.
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).
two-person-changes on. It is an option, off by default, that the RGS operator sets per operator; no profile forces it, so one person can run an RGS alone (MASTER-PLAN decisions, 2026-10-25).409 {"error":"TWO_PERSON_REQUIRED","action":"<action>"} before reading the body, and change nothing:POST /operator/v1/free-rounds (free-rounds.create) and POST /operator/v1/free-rounds/{campaignId}/remove (free-rounds.remove);POST /operator/v1/engagement/tournaments (tournament.create) and POST /operator/v1/engagement/tournaments/{id}/close (tournament.close);POST /operator/v1/jackpots (jackpot.create);POST /operator/v1/campaigns (campaign.create) and PUT /operator/v1/campaigns/{campaignId}/status (campaign.status);POST /operator/v1/jackpots/{poolId}/memberships (jackpot.membership.offer) and POST /operator/v1/jackpots/{poolId}/memberships/{offerId}/accept (jackpot.membership.accept);POST /operator/v1/wallet/signing-keys (wallet.signing-key), PUT /operator/v1/external-wallet/mode (wallet.mode) and PUT /operator/v1/external-wallet/connector (wallet.connector) (Wallet API);POST /operator/v1/api-keys (api-key.create);PUT /operator/v1/games/{gameCode} with enabled: true (game.entitlement); this one reads the body first, because turning a game off (enabled: false) stays one key;POST /operator/v1/external-wallet/operations with kind debit, credit or cancel (wallet.operation, migration 250); a balance query stays one key.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):
POST /operator/v1/changes: {action, terms, ttlSeconds}. Returns 201 {id, termsSha256, expiresAt}.wallet for wallet.adjust, wallet-admin for the other wallet.* actions, keys for api-key.create, games for game.entitlement, campaigns for the rest.action is one of the fifteen above, market.profile, wallet.adjust, player.erase (scope *, backoffice.md) or round.void (scope reconciliation: the two-person void of a round held in manual review that no other path closes, backoffice.md, "Void a held round"; the approver types the round id back as echo.target). Console user changes (console.user.*) are made in the console only, and this route refuses them (403).wallet.adjust (migration 259) corrects a custodial balance (a goodwill credit, an error correction). It has no one-key route: it always takes two people, with no threshold.terms are {externalPlayerId, currency, amountMinor, reason, reference}. amountMinor is a signed, non-zero whole number of minor units as a string ("-250", "125"), within ±(2^53 − 1). reason (1 to 200 characters) and reference (1 to 64) carry no control or direction characters.400) unless the operator is active and custodial and the player has an account in that currency with it.wallet-adjust:{changeId}, with metadata {source: 'backoffice-adjustment', changeId, reason, reference}. It also writes one backoffice.wallet.adjust audit event. result is {changeId, accountId, ledgerEntryId, currency, amountMinor, balanceBefore, balanceAfter}, with exact strings.409, and the request stays pending, in four cases: the balance would go negative; the operator is no longer custodial or active; the account is stopped; or a money operation holds the account.adjustments, latest 20) and activity (in the window), with the change id and reason.terms for wallet.operation are the operations route's body without balance: {operationId, kind, playerId, currency, amount} for a debit or credit, {operationId, kind: 'cancel', playerId, currency, originalOperationId} for a cancel, on an operationId the operator has not used.terms for game.entitlement are {gameCode, enabled, currencies}; for the memberships, {poolId, operatorId, gameVersionId} and {poolId, offerId}.terms are the same as the one-key route's body, or {campaignId} / {tournamentId} / {campaignId, status}.ttlSeconds is 60 to 86,400 (default 3,600).POST /operator/v1/changes/{changeId}/decision: {decision, confirm, echo}, where decision is approved or rejected and confirm is the request's termsSha256. The key needs the action's scope. Approval runs the change in the same transaction under the approver's key and returns {decision, result}.echo (MASTER-PLAN H2) is what the approving person typed back, read from the change rather than copied by the client. Approving a change that moves money needs {amountMinor, currency}: wallet.adjust its signed amountMinor as a string, wallet.operation a debit's or credit's amount as a string (a cancel needs {currency, target}, the target being originalOperationId). Approving one that cannot be undone needs {target}, the code its subject shows (else its id): free-rounds.remove, tournament.close and campaign.status to ended. Currencies and targets compare in any letter case, amounts exactly. Other changes and rejections need none.api-key.create the terms' label follows the one-key route's rule (at most 128 characters, no NUL; 400 otherwise). The approver issues the key, so they must hold every scope it gets (409 otherwise). result is {keyId, token, expiresAt}: the token is shown only in this answer and never stored with the change.wallet.operation calls the operator's wallet, which no transaction can hold.409 and the request stays pending.result is that route's answer, and delivery follows the operation's own lifecycle (an unknown result goes to a signed lookup, then manual review; never a blind resend).result is {operationId, sent: false, error}. No money moved, and the maker proposes again.GET /operator/v1/changes[?scope=campaigns|wallet|wallet-admin|keys|games] (that scope, default campaigns): pending requests and the latest decisions of that scope's actions, newest first.campaigns actions; the others are made here.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.
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).
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.
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.htmland 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.
| 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.
There are 8 path items / 8 operations in the inbound fragment:
POST /wallet/v1/callbacks/{operatorCode} — signed finalization or balance statement callback.POST /operator/v1/wallet/signing-keys — register an operator Ed25519 public key.DELETE /operator/v1/wallet/signing-keys/{keyId} — revoke an unbound active key.GET /operator/v1/external-wallet/reconciliation/runs/{runId} — retrieve a reconciliation run generated by a balance statement.PUT /operator/v1/external-wallet/mode — select custodial or external settlement.PUT /operator/v1/external-wallet/connector — set the operator endpoint and expected response signing key.POST /operator/v1/external-wallet/operations — submit one durable external-wallet command through RGS.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.
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.
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.
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.
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.
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.
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.
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.
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.
transaction.finalized permits manual_review, while direct operator responses permit only approved or declined.balance.statement compares external rows with latest authoritative terminal-operation evidence, not with the custodial account balance. It produces a completed run and durable cases for balance_mismatch, missing_internal_account, missing_external_balance, or missing_authoritative_evidence.external returns 503 when the runtime or active connector/key is absent.POST /operator/v1/external-wallet/operations returns 201 for a newly persisted operation even when its resulting status is unknown; it uses 200 only for an idempotent duplicate.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.
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 |
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.
Specification: openapi.json · version 2026-11-13+3f5afad.
/health/liveProcess 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" |
/health/readyDependency 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" |
/metricsPrometheus 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 |
/v1/authenticateAuthentication: 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"] |
/v1/balanceAuthentication: 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 |
/v1/session/closeAuthentication: 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"] |
/v1/reality-checkAuthentication: 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"] |
/v1/reality-check/acknowledgeAuthentication: 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"] |
/v1/responsible-gamingAuthentication: 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"] |
/v1/responsible-gaming/self-excludeAuthentication: 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"] |
/v1/campaignsAuthentication: 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"] |
/v1/multiplayer/roomAuthentication: 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"] |
/v1/playAuthentication: 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"] |
/v2/playAuthentication: 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"] |
/v2/recoverAuthentication: 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"] |
/v1/historyAuthentication: 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"] |
/v1/rounds/{roundId}/fairnessAuthentication: 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"] |
/v1/rounds/{roundId}/replayAuthentication: 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"] |
/v2/interactive/startAuthentication: 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 |
/v2/interactive/actionAuthentication: 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 |
/v2/interactive/recoverAuthentication: 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"] |
/wallet/authenticateAuthentication: 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"] |
/wallet/balanceAuthentication: 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"] |
/wallet/playNo 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"] |
/wallet/end-roundAuthentication: 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"] |
/bet/eventAuthentication: 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"] |
/operator/v1/api-keysCreate 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"] |
/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"] |
/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"] |
/operator/v1/responsible-gaming/limitsSet 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"] |
/operator/v1/accountsProvision 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"] |
/operator/v1/wallet/transactionsPost 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"] |
/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"] |
/operator/v1/reconciliationCompare 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"] |
/operator/v1/reconciliation/runsCreate 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"] |
/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"] |
/operator/v1/reconciliation/cases/{caseId}/resolution-requestsRequest 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"] |
/operator/v1/reconciliation/cases/{caseId}/approveApprove 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"] |
/operator/v1/launchIssue 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"] |
/operator/v1/campaignsCreate 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"] |
/operator/v1/campaigns/{campaignId}/grantsGrant 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"] |
/operator/v1/campaigns/{campaignId}/statusTransition 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"] |
/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"] |
/operator/v1/rng/draw-logExport 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 |
/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"] |
/operator/v1/wallet/signing-keysRegister 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"] |
/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"] |
/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"] |
/operator/v1/external-wallet/modeSet 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 |
/operator/v1/external-wallet/connectorConfigure 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"] |
/operator/v1/external-wallet/operationsDurably 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 |
/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"] |
/game-launchBetSymphony: 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"] |
/integrations/betsymphony/launchBetSymphony: 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"] |
/integrations/betsymphony/sessionBetSymphony: 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"] |
/operator/consoleConsole: 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 |
/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 |
/operator/console/api/activityConsole: 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\\|[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"] |
/operator/console/api/activity.csvConsole: 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"] |
/operator/console/api/alertsConsole: 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"] |
/operator/console/api/changesConsole: 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"] |
/operator/console/api/changesConsole: 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|[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"] |
/operator/console/api/changes/{changeId}/decisionConsole: 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"] |
/operator/console/api/fx/ratesConsole: 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"] |
/operator/console/api/gamesConsole: 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"] |
/operator/console/api/games/playConsole: 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"] |
/operator/console/api/liveopsConsole: 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"] |
/operator/console/api/liveops-gamesConsole: 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"] |
/operator/console/api/liveops.csvConsole: 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"] |
/operator/console/api/loginConsole: 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"] |
/operator/console/api/logoutConsole: 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"] |
/operator/console/api/marketsConsole: 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"] |
/operator/console/api/meConsole: 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"] |
/operator/console/api/platform-alertsConsole: 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"] |
/operator/console/api/playersConsole: 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"] |
/operator/console/api/players/activityConsole: 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"] |
/operator/console/api/players/dataConsole: 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"] |
/operator/console/api/players/time-outConsole: 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"] |
/operator/console/api/players/winsConsole: 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"] |
/operator/console/api/reports/cohortsConsole: 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"] |
/operator/console/api/reports/cohorts.csvConsole: 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"] |
/operator/console/api/reports/dailyConsole: 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"] |
/operator/console/api/reports/daily.csvConsole: 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"] |
/operator/console/api/reports/fxConsole: 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"] |
/operator/console/api/reports/liabilityConsole: 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"] |
/operator/console/api/reports/liability.csvConsole: 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"] |
/operator/console/api/reports/taxConsole: monthly tax report
Authentication: ConsoleSession.
Registration: dependencies.console and backoffice.
| Parameter | Location | Required | Type / constraints |
|---|---|---|---|
| month | query | yes | string; pattern: "^(19|20)\\d\\d-(0[1-9]|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"] |
/operator/console/api/reports/tax.csvConsole: monthly tax report as CSV
Authentication: ConsoleSession.
Registration: dependencies.console and backoffice.
| Parameter | Location | Required | Type / constraints |
|---|---|---|---|
| month | query | yes | string; pattern: "^(19|20)\\d\\d-(0[1-9]|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"] |
/operator/console/api/roundsConsole: 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"] |
/operator/console/api/rounds.csvConsole: 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"] |
/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"] |
/operator/console/api/rounds/{roundId}/replayConsole: 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"] |
/operator/console/api/rounds/attentionConsole: 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"] |
/operator/console/api/rounds/attention.csvConsole: 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"] |
/operator/console/api/rounds/lookupConsole: 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"] |
/operator/console/api/setupConsole: 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"] |
/operator/console/api/setup/infoConsole: 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"] |
/operator/console/api/tournaments/{tournamentId}/standingsConsole: 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"] |
/operator/console/api/usersConsole: 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"] |
/operator/console/api/usersConsole: 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"] |
/operator/console/api/users.csvConsole: 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"] |
/operator/console/api/users/{userId}/disableConsole: 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"] |
/operator/console/api/users/{userId}/resetConsole: 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"] |
/operator/console/api/users/{userId}/roleConsole: 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"] |
/operator/console/api/users/{userId}/sign-outConsole: 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"] |
/operator/console/api/wallet-verificationsWallet 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"] |
/operator/console/api/wallet-verificationsWallet 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"] |
/operator/console/api/wallet-verifications/attentionWallet 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"] |
/operator/console/api/winsConsole: 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"] |
/operator/console/assets/console.cssConsole: 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 |
/operator/console/assets/console.jsConsole: 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 |
/operator/console/setupConsole: 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 |
/operator/v1/backoffice/activityBack 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\\|[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"] |
/operator/v1/backoffice/activity.csvBack 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"] |
/operator/v1/backoffice/alertsBack 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"] |
/operator/v1/backoffice/fx/ratesBack 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"] |
/operator/v1/backoffice/liveopsBack 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"] |
/operator/v1/backoffice/liveops.csvBack 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"] |
/operator/v1/backoffice/marketsBack 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"] |
/operator/v1/backoffice/playersBack 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"] |
/operator/v1/backoffice/players/activityBack 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"] |
/operator/v1/backoffice/players/dataBack 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"] |
/operator/v1/backoffice/players/eraseBack 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"] |
/operator/v1/backoffice/players/winsBack 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"] |
/operator/v1/backoffice/reports/cohortsBack 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"] |
/operator/v1/backoffice/reports/cohorts.csvBack 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"] |
/operator/v1/backoffice/reports/dailyBack 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"] |
/operator/v1/backoffice/reports/daily.csvBack 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"] |
/operator/v1/backoffice/reports/fxBack 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"] |
/operator/v1/backoffice/reports/liabilityBack 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"] |
/operator/v1/backoffice/reports/liability.csvBack 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"] |
/operator/v1/backoffice/reports/taxBack office: monthly tax report
Authentication: OperatorBearer.
Operator scope: reports.
Registration: operatorAuth and backofficeService.
| Parameter | Location | Required | Type / constraints |
|---|---|---|---|
| month | query | yes | string; pattern: "^(19|20)\\d\\d-(0[1-9]|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"] |
/operator/v1/backoffice/reports/tax.csvBack 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|20)\\d\\d-(0[1-9]|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"] |
/operator/v1/backoffice/roundsBack 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"] |
/operator/v1/backoffice/rounds.csvBack 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"] |
/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"] |
/operator/v1/backoffice/rounds/{roundId}/replayBack 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"] |
/operator/v1/backoffice/rounds/attentionBack 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"] |
/operator/v1/backoffice/rounds/attention.csvBack 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"] |
/operator/v1/backoffice/rounds/lookupBack 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"] |
/operator/v1/backoffice/tournaments/{tournamentId}/standingsBack 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"] |
/operator/v1/backoffice/wallet-verificationsWallet 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"] |
/operator/v1/backoffice/wallet-verificationsWallet 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"] |
/operator/v1/backoffice/wallet-verifications/attentionWallet 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"] |
/operator/v1/backoffice/winsBack 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"] |
/operator/v1/changesList 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"] |
/operator/v1/changesPropose 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|[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"] |
/operator/v1/changes/{changeId}/decisionApprove 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"] |
/operator/v1/console/usersBootstrap 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"] |
/operator/v1/demo-lobby/admin-activityDemo 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 |
/operator/v1/demo-lobby/admin-changeDemo 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 |
/operator/v1/demo-lobby/admin-snapshotDemo 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 |
/operator/v1/demo-lobby/authenticateDemo 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 |
/operator/v1/demo-lobby/catalogDemo 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 |
/operator/v1/demo-lobby/configurationDemo 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 |
/operator/v1/demo-lobby/launchDemo 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 |
/operator/v1/demo-lobby/refillDemo 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 |
/operator/v1/demo-lobby/sessionDemo 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 |
/operator/v1/demo-lobby/session-gameDemo 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 |
/operator/v1/demo-lobby/wallet-contextDemo 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 |
/operator/v1/engagement/tournamentsCreate 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"] |
/operator/v1/engagement/tournaments/{id}/closeClose 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"] |
/operator/v1/free-roundsCreate 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"] |
/operator/v1/free-rounds/{campaignId}/grantsGrant 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"] |
/operator/v1/free-rounds/{campaignId}/liabilityFree-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"] |
/operator/v1/free-rounds/{campaignId}/removeRemove 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"] |
/operator/v1/free-rounds/available-betsBet 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"] |
/operator/v1/interactive-market/policies/{policyId}/approveApprove 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"] |
/operator/v1/interactive-market/policies/{policyId}/requestsRequest 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"] |
/operator/v1/interactive-market/policies/{policyId}/revokeRevoke 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"] |
/operator/v1/jackpotsCreate 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|[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"] |
/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"] |
/operator/v1/jackpots/{poolId}/membershipsOffer 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"] |
/operator/v1/jackpots/{poolId}/memberships/{offerId}/acceptAccept 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"] |
/operator/v1/jackpots/rtpJackpot 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"] |
/operator/v1/math-families/policies/{policyId}/approveApprove 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"] |
/operator/v1/math-families/policies/{policyId}/requestsRequest 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"] |
/operator/v1/obligation-age/policies/{policyId}/approveApprove 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"] |
/operator/v1/obligation-age/policies/{policyId}/requestsRequest 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"] |
/operator/v1/reconciliation/cases/{caseId}/reopenReopen 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"] |
/operator/v1/reconciliation/operation-statementsSubmit 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"] |
/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"] |
/operator/v1/responsible-gaming/time-outTime-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"] |
/operator/v1/rounds/{roundId}/drawn-reviewPreview 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"] |
/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"] |
/operator/v1/rounds/{roundId}/drawn-review/resolution-requestsRequest 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"] |
/ops/v1/alertsAlertmanager 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"] |
/tequity/launch/realTequity 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"] |
/tequity/launch/realTequity 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"] |
/tequity/wallet/{wallet}/freeBets/addTequity 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"] |
/tequity/wallet/{wallet}/freeBets/availableBetsTequity 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"] |
/tequity/wallet/{wallet}/freeBets/removeTequity 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"] |
/tequity/wallet/{wallet}/launch/realTequity 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"] |
/tequity/wallet/{wallet}/launch/realTequity 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"] |
/v1/engagement/tournaments/{id}/leaderboardTournament 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"] |
/v1/engagement/tournaments/{id}/participationOpt 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"] |
/v1/fair/commitmentProvably 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"] |
/v1/free-roundsThe 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"] |
/v1/interactive/rounds/{id}/replayReplay 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 |
/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"] |
/v1/responsible-gaming/time-outPlayer 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"] |
/v1/rounds/{roundId}/proofProvably 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"] |
/v2/interactive/skipInteractive 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"] |
/v2/stateThe 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"] |
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|[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|[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 |
Specification: operator-wallet.openapi.json · version 2026-09-21+ed208c3.
/wallet/v1/operationsExecute 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. |
/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. |
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 |