Launcher API
The /gamelauncher/* endpoints we expose
These are the endpoints we expose. Aggregators and direct integrators both call the same surface. Authentication is HTTP Basic Auth on all endpoints.
POST /gamelauncher/play
Create a session and return a launch URL.
Request
{
"operator": "casino_abc",
"mode": "REAL",
"gamecode": "live-bingo",
"currency": "EUR",
"language": "en",
"externalsessionid": "sess_xyz_789",
"playerid": "player_42",
"brand": "brand_1",
"channel": "web",
"country": "MT",
"ipaddress": "203.0.113.10",
"testaccount": false
}mode: "DEMO" uses the same shape — currency is still required. Note that
DEMO doesn't change game behaviour today: the wallet is still called (see
Mode).
Field reference
Required
| Field | Description |
|---|---|
operator | Your operator identifier with us |
mode | DEMO or REAL. Stored with the session; see Mode |
gamecode | Which game to launch. We give you the value at onboarding. Slots don't have their own game code; they open inside the bingo game |
currency | A currency code configured for this game, usually ISO 4217 (e.g. USD, EUR) |
language | BCP 47 language tag (the IETF standard for language identifiers, e.g. en, en-GB). Today only en is supported — sending other tags is not guaranteed to work and is not recommended |
externalsessionid | Your session identifier. See Behaviour for repeat calls |
Recommended
| Field | Description |
|---|---|
playerid | Your stable identifier for the player |
brand | Brand within the operator. Set equal to operator if you don't run multiple brands |
channel | Free-form channel marker, stored with the session. The values listed in the allowed-values reference are guidance — we don't validate the field |
country | ISO 3166-1 alpha-2 player country. Stored for audit |
ipaddress | Player's IP address. Stored for audit. Note: the field is named ipaddress, not ip |
testaccount | true marks the session as internal/test. Stored with the session; it doesn't change game behaviour today |
Optional (stored with the player session)
We accept and store these fields. Apart from displayname, the game doesn't
use them yet.
| Field | Description |
|---|---|
displayname | The player's display name. We use it in our reporting |
segmentation | Free-form segment marker (VIP tier, marketing cohort, etc.) |
exiturl | URL to send the player back to on exit. Not used by the game yet |
depositurl | URL where the player can top up their wallet. Not used by the game yet |
historyurl | URL for transaction history. Not used by the game yet |
jurisdiction | The regulatory jurisdiction for this session. Stored only; it doesn't change RTP or replay retention |
Response
{
"sessionid": "<our-session-id>",
"launchurl": "https://bingo.lpmbackstagedevelop.com/?launchCode=<code>"
}Each game has its own host, so the host in launchurl depends on the
gamecode. Always use the URL exactly as we return it.
Behaviour
- Repeat calls: while the last launch code is still valid (10 minutes),
calling again with the same
operator,externalsessionidandcurrencyreturns the samesessionidand the samelaunchurl. After the code expires, the same call creates a new session with a newsessionid. - Reusing an
externalsessionidwith a differentgamecodewhile its launch code is valid is refused (see Errors). launchCodeexpires after 10 minutes. Until then it can be exchanged more than once (the iframe may reload while starting).- The session record has a 24 hour absolute lifetime. It is not refreshed by activity; expiry is fixed at creation. The player token the iframe gets from the launch code lasts 1 hour; after that, a reload, a reconnect, or a slot spin needs a fresh launch URL.
countryandipaddressare persisted on the session for audit. We don't enforce geo-rules from these fields.- The
currencyyou send must be in the configured currency list for that game instance. If it isn't,/gamelauncher/playreturns HTTP 400 witherrorcode: 101and message"Currency does not match instance configuration". We give you the supported list at onboarding.
About /gamelauncher/resolve-launch-code
You may notice an unauthenticated POST /gamelauncher/resolve-launch-code
endpoint in network traffic from the iframe. It is an internal frontend
bootstrap call: the iframe exchanges its short-lived launchCode (which
is itself the credential) for a session token before the game starts.
Casinos do not call this endpoint and don't need to.
POST /gamelauncher/replay
Return a URL that renders a past round for player or regulator review.
Request
Only roundid is required. Other fields (language, timezone) are
accepted but ignored today. Any finished round we sent to your wallet works,
including slot spins (slots:<uuid>). A reversed round or a failed spin
returns errorcode: 206.
{
"roundid": "<round-id-we-issued>"
}Response
{
"launchurl": "https://replay.lpmbackstagedevelop.com/?launchCode=<code>"
}The replay frontend exchanges the embedded launchCode for a session
token internally; integrators do not need to interact with that exchange
directly. From your side, simply embed the URL we return. Replay launch
URLs expire after 10 minutes and must not be cached — request a fresh one
for every viewing. See Replay for the full flow.
Game catalogue
We don't currently expose a programmatic /gamelist endpoint. The list of
games available to your operator (along with stakes, currencies, languages,
and which rooms offer slots) is provided in writing during onboarding and
updated whenever it changes. If you need a programmatic feed for an internal admin panel, ask
your account manager.
Errors
Launcher API errors use integer error codes, matching the standard seamless-wallet integration convention:
{ "errorcode": 101, "errormessage": "bad request" }errorcode | HTTP status | Meaning |
|---|---|---|
101 | 400 | Bad request — missing or malformed field, or the game can't be launched (see messages below) |
101 | 500 | Server-side failure on /gamelauncher/play — distinguish from the 400 case by HTTP status |
201 | 401 | Access denied — bad or missing Basic Auth |
206 | 404 | Round not found, or not finished yet (replay only) |
500 | 500 | Internal server error on /gamelauncher/replay — safe to retry |
errormessage values you may see with errorcode: 101 on
/gamelauncher/play:
errormessage | Meaning |
|---|---|
<field> is required | A required field is missing or empty |
mode must be DEMO or REAL | mode has another value |
Game not available | No game for this operator and gamecode, or the game is switched off right now |
<game> has no web client in this environment | The game isn't offered in this environment |
Game not available for this operator | The game's room is reserved for another operator |
Currency does not match instance configuration | The game doesn't run in this currency |
Session already exists for a different gamecode | The externalsessionid is already in use for another game. Use a new one |
Classify by HTTP status, not just errorcode. The two endpoints handle
internal errors slightly differently: replay returns errorcode: 500 with
HTTP 500; play returns errorcode: 101 with HTTP 500.
Note: this is different from the wallet-side error envelope used in
direct integration,
where the codes you return to us are strings (NOT_SUFFICIENT_FUNDS, etc.).
Two separate surfaces, two separate code conventions.
Rate limits
We don't currently enforce a per-operator throttle on the launcher API. The only effective ceiling is the AWS API Gateway account-level default. Talk to us before sending sustained traffic above ~20 requests per second per operator so we can provision a dedicated usage plan if needed.
Versioning
Versioning today: the launcher API is unversioned and shared across all
integrators. Treat the current shape as v1. We will announce breaking
changes in advance and version per integrator at that point — likely as
/v1/gamelauncher/... or via per-operator subpaths.