Responsible Gaming
The RGS provides a set of responsible-gaming (RG) controls that operators can configure per market: reality checks, session time limits, bet limits, and self-exclusion enforcement. All RG events are audited and available in reporting.
The RGS is the enforcement point, not the system of record for player limits. You own the player relationship and decide who is excluded and what limits apply per jurisdiction; the RGS enforces those decisions at launch and during play, and records an audit trail.
Reality Checks
Periodic prompts showing session duration and net win/loss that the player must acknowledge.
Session Limits
A maximum continuous play-session length, after which the session is terminated gracefully.
Self-Exclusion
Excluded players are refused at launch based on a flag from your authenticate callback.
Per-Jurisdiction Configuration
Reality-check intervals and session time limits are configured per operator and per jurisdiction. The jurisdiction is the countryCode supplied at launch (ISO 3166-1 alpha-2, or an ISO 3166-2 region such as CA-ON).
Configuration is a map keyed by jurisdiction code, with a * entry as the default for any jurisdiction without an explicit entry:
{
"responsibleGaming": {
"GB": { "realityCheckMinutes": 60, "realityCheckEnforced": true, "sessionLimitMinutes": 180, "maxBetUsd": "50" },
"MT": { "realityCheckMinutes": 60, "realityCheckEnforced": true, "sessionLimitMinutes": 0 },
"*": { "realityCheckMinutes": 30, "sessionLimitMinutes": 0 }
}
}
| Field | Type | Description |
|---|---|---|
realityCheckMinutes |
integer | Reality-check interval in minutes. 0 disables reality checks. |
realityCheckEnforced |
boolean | When true, a due reality check is enforced server-side (a new round is refused until acknowledged). When false (default) the check is advisory and the client enforces it. Ignored when realityCheckMinutes is 0. |
sessionLimitMinutes |
integer | Maximum continuous play-session length in minutes. 0 disables the limit. |
maxBetUsd |
string | Per-jurisdiction cap on a round's worst-case payout, in USD (decimal string). Only ever tightens the operator/session bet limit. 0 (or omitted) disables the per-jurisdiction cap. |
Resolution is: exact jurisdiction match → * default → disabled. A jurisdiction with no entry and no * default has all RG controls disabled.
RG configuration is set during onboarding or via the backoffice operator settings. Contact us to configure it for your markets.
Self-Exclusion
To refuse launches for a self-excluded player, return excluded: true from your /callback/authenticate response. The RGS then rejects POST /operator/launch with HTTP 403 and error code player_self_excluded, and records a self_exclusion_blocked audit event. No session is created.
| Field | Type | Required | Description |
|---|---|---|---|
excluded |
boolean | No | true if the player is self-excluded. The launch is refused. |
excludedUntil |
string | No | Optional exclusion end date (YYYY-MM-DD), recorded for auditing. |
{
"requestId": "unique-request-id",
"status": "OK",
"balance": "100.00",
"excluded": true,
"excludedUntil": "2026-12-31"
}
excluded is distinct from the ERROR_PLAYER_DISABLED status. Use ERROR_PLAYER_DISABLED for a generally locked or disabled account, and excluded specifically for self-exclusion so it is accounted for separately in RG reporting.
Bet Limits
Bet limits cap the worst-case payout (exposure) of a bet. They are enforced on every POST /game/play and come from three sources, applied so each only ever tightens the limit:
- Operator exposure limits — the
maxExposuremap on your operator config sets a per-game (and per-side-bet) cap in USD. Configured via onboarding or backoffice. - Per-session overrides — an optional
betLimitsobject onPOST /operator/launchnarrows the limits for a single session. - Per-jurisdiction cap —
maxBetUsdin the responsible-gaming config caps the worst-case payout for a market. When it is the most restrictive of the three, it is the binding limit and rejections are audited withlimitSource: "jurisdiction".
{
"playerId": "player-1",
"currency": "USD",
"gameCode": "dice-alpha",
"countryCode": "GB",
"betLimits": { "minBet": "1", "maxWin": "200" }
}
| Field | Type | Description |
|---|---|---|
minBet |
string | Minimum bet amount per spin, in USD (decimal string). |
maxWin |
string | Maximum worst-case payout per round, in USD (decimal string). |
Session overrides must satisfy 0 <= minBet <= maxWin <= operator maxExposure for the game, otherwise the launch is rejected with invalid_bet_limits. Limits are stored in USD and converted to the session currency before enforcement. A bet whose worst-case payout exceeds the limit is rejected with bet_limit_exceeded and recorded as a bet_limit_rejected audit event; a bet below the session minimum is rejected with bet_below_min.
On session reuse — when an active session already exists for the same player and game — the original session's betLimits and countryCode are kept, and any newly supplied values are ignored. This means the reused session's original jurisdiction continues to determine which RG config applies.
Reality Checks & Session State
The game client reads the current RG state from POST /game/current, which includes a responsibleGaming block. This lets the client render the reality-check prompt (session duration and net win/loss) and any session-time warning.
{
"balance": "98.50",
"active": false,
"responsibleGaming": {
"realityCheckIntervalMinutes": 60,
"realityCheckDue": true,
"realityCheckEnforced": true,
"sessionLimitMinutes": 180,
"sessionElapsedSeconds": 3720,
"sessionTimeRemainingSeconds": 7080,
"netWager": "120.00",
"netPayout": "95.00",
"netWinLoss": "-25.00"
}
}
| Field | Type | Description |
|---|---|---|
realityCheckIntervalMinutes |
integer | Configured reality-check interval. 0 when disabled. |
realityCheckDue |
boolean | true when a reality check should be shown now. |
realityCheckEnforced |
boolean | true when the check is enforced server-side (play is refused until acknowledged); false when advisory. |
sessionLimitMinutes |
integer | Configured session time limit. 0 when disabled. |
sessionElapsedSeconds |
integer | Seconds of continuous play since the session started. |
sessionTimeRemainingSeconds |
integer | Seconds remaining before the session limit. 0 when disabled or reached. |
netWager |
string | Total wagered this play session, in the session currency. |
netPayout |
string | Total paid out this play session, in the session currency. |
netWinLoss |
string | Net result (netPayout − netWager) this play session, in the session currency. |
The play session is a continuous unit of play. It survives session-token refresh, so reality-check intervals, the session limit, and net win/loss are measured across the whole play session rather than resetting on each token rotation.
Acknowledging a Reality Check
When the player acknowledges the reality-check prompt, the client calls POST /session/acknowledge-reality-check. This resets the interval (the next reality check is measured from the acknowledgement), records a reality_check_acknowledged audit event, and returns a refreshed responsibleGaming snapshot.
Advisory vs enforced. By default a due reality check is advisory: the RGS surfaces realityCheckDue and the client is responsible for showing the prompt and suspending play. When realityCheckEnforced is set for the jurisdiction, the RGS enforces it: starting a new round is refused with HTTP 409 and error code reality_check_required until the player acknowledges (an in-progress round may still finish). The session is not terminated — play resumes immediately after acknowledgement. Choose enforced mode for markets whose regulators require the reality check to suspend play (e.g. MGA).
Session Time Limits
When a play session reaches its configured sessionLimitMinutes, the session is terminated gracefully:
- An in-progress round (e.g. an open Blackjack or Mines round) may still be played to completion so its state is saved.
- Starting a new round is refused with HTTP
409and error codesession_limit_reached, and the session is terminated. Asession_limit_reachedaudit event is recorded.
The player must launch a new session to continue playing.
Audit & Reporting
Every RG action is recorded as an append-only audit event, available via the backoffice reporting endpoint GET /backoffice/operators/{operatorId}/rg-events (filterable by playerId, type, and date range, cursor-paginated).
| Event type | Recorded when |
|---|---|
reality_check_acknowledged |
A player acknowledges a reality-check prompt. |
reality_check_required |
A new round is refused because an enforced reality check is due. |
session_limit_reached |
A session is terminated for exceeding its time limit. |
self_exclusion_blocked |
A launch is refused because the player is self-excluded. |
bet_limit_rejected |
A bet or mid-round action is rejected for exceeding a bet limit. |
Error Codes
| Code | HTTP | Meaning |
|---|---|---|
player_self_excluded |
403 | Launch refused — the authenticate callback reported excluded: true. |
session_limit_reached |
409 | A new round was refused because the session time limit was reached. |
reality_check_required |
409 | A new round was refused because an enforced reality check is due; acknowledge it to continue. |
bet_limit_exceeded |
403 | The bet's worst-case payout exceeds the applicable limit. |
bet_below_min |
403 | The bet is below the session's minimum bet. |
invalid_bet_limits |
400 | The betLimits supplied at launch are invalid. |