Skip to content

Launch Verification

Launch verification is part of Surface 4. When a browser connects over WebSocket, the game service forwards the launch parameters to the platform to verify them. It is the gateway to all gameplay: success returns the full session, failure rejects the connection.

Query parameters (optional but recommended):

?for=<service_uid> // preferred
?for=<service_slug> // backward compat

?for=<service_uid> makes the platform confirm the resolved game actually belongs to this service. The service_uid is learned from the first desired-state push (never hardcoded). Older services may use ?for=<slug>.

Headers:

Content-Type: application/json
x-internal-verify-launch-secret: <secret>

Request body (the browser’s launch URL parameters, forwarded server-side during the WebSocket handshake):

{
"gameId": 9000,
"demo": false,
"currency": "EUR",
"token": "d315fa12770e65eb4af38c589aed0d",
"customer": "3773",
"organizationId": 1903,
"trader": "cx-12",
"locale": "en"
}

Response (200) — success. The response is a flat object — not nested under a session key:

{
"ok": true,
"gameExternalId": 9000,
"engineType": "wp9dvdgp4wfqmxq4",
"skinKey": "default",
"demo": false,
"currency": "EUR",
"showBalance": true,
"locale": "en",
"requestedLocale": "en",
"organizationId": 1903,
"partnerId": 1,
"partnerConfig": {},
"customer": "3773",
"token": "d315fa12770e65eb4af38c589aed0d",
"operatorId": "cx-12",
"operatorName": "ACME Casino",
"playerId": "P-5A666",
"playerDisplay": "Player3773",
"walletBalance": 1000.00,
"walletCurrency": "EUR",
"saveDemoBets": false,
"betMin": 1,
"betMax": 100,
"maxWin": 10000,
"quickBets": [1, 5, 10, 50]
}
FieldDescription
oktrue — the launch is valid.
gameExternalId, engineType, skinKeyWhich game / engine / skin this launch is for.
demoDemo or real mode.
currencyThe session currency.
showBalanceWhether the UI shows the balance.
locale, requestedLocaleLocalization language.
organizationId, partnerId, operatorId, operatorName, partnerConfigPartner/operator info.
customer, token, playerId, playerDisplayPlayer identity.
walletBalance, walletCurrencyReal-mode current wallet state (fetched from the operator).
saveDemoBetsWhether demo bets are persisted.
betMin, betMax, maxWin, quickBetsBet limits resolved for this launch. Store as a session-level snapshot; do not re-fetch per round (see bet templates for per-round refresh).

Response (400) — failure:

{ "ok": false, "message": "Wallet currency mismatch: launch=EUR, partner=USD" }

Common messages — forward them verbatim to the WebSocket; the player sees them as connect_error in the browser:

MessageMeaning
"Unknown gameId"The gameId is unknown to the platform
"Missing mandatory params: customer, token"A required real-mode field is missing
"Currency not allowed for this partner"Not on the partner allowlist
"Partner suspended" / "Operator suspended"Account suspended
"Partner wallet auth failed: ..."Real-mode authenticate failed
"Betting limits are not configured for this partner"Missing bet template

Response (403):

{ "ok": false, "message": "Forbidden" }

A wrong or missing x-internal-verify-launch-secret.

Storing the session: the resolved fields go into the WebSocket connection’s in-memory state, read for the rest of the session.

verify-launch behaves differently in the two modes.

Demo mode (demo: true):

  • Only gameId is required; the rest is optional.
  • currency, walletBalance, betMin, betMax, maxWin, and quickBets come from the runtime profile (or a hardcoded default).
  • No operator wallet call is made.
  • Bets are still written to the ledger, flagged is_demo: true and filtered out of reporting.

Real mode (demo: false or omitted):

  • gameId, currency, token, customer, organizationId, and trader are all required. A missing field returns 400.
  • The platform calls authenticate on the partner wallet; the wallet currency must match the launch currency.
  • betMin, betMax, … are resolved from bet templates (operator+game override, partner default, …).

The full launch handshake, including the browser side, is in the Gameplay Protocol.