Account Info.
Operator identity, access key, and quick profile summary.
Games
Select a game to manage tables.
Game catalog
Pick a game to manage tables.
How to launch a game
Give your players a seamless handoff from your lobby to the GoLetsPlay game client.
- Player signs in on your operator site and selects a game.
- Your server creates a short-lived launchToken and builds the launch URL with your operatorPublicId.
- The browser opens the game client. The client sends launchToken + operatorPublicId to the game server for authorization.
https://{gameClientBaseUrl}/launch.html?game={gameCode}&token={launchToken}&operatorPublicId={operatorPublicId}
API
Configure your operator endpoints, follow the integration flow, and test your APIs directly from the GoLetsPlay dashboard. Use the tabs below to focus on one part at a time.
Operator API endpoints
These endpoints are called by the GoLetsPlay game server to authorize players, read balances, and process wallet actions for Poker.
GET /api/game/operators/public/{operatorPublicId}/openai-api-key
Header: X-Game-Server-Token: {gameServerToken}
{
"openAiApiKey": "sk-...",
"openAiApiKeyLast4": "abcd"
}
Required headers:
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
Signing message:
{timestamp}.{nonce}.{method}.{pathAndQuery}.{rawBody}
- Validate signature, timestamp window, and nonce replay on every request. - Keep the signing secret server-to-server only. - Always use HTTPS between the game server and your operator endpoints. - Treat X-Signing-Secret as legacy only if you still allow migration fallback.
1. Read your operator Signing Secret from the GoLetsPlay API page.
2. Build the signing message exactly:
{timestamp}.{nonce}.{method}.{pathAndQuery}.{rawBody}
3. Compute HMAC-SHA256 using:
key = Signing Secret
message = signing message
4. Convert the HMAC output to Base64.
5. Send that Base64 string in the X-Signature header.
Formula:
X-Signature = Base64(HMACSHA256(SigningSecret, signingMessage))
timestamp = 1774453268283
nonce = ed0bcd52fc034671b3f40e8e71ec7080
method = POST
pathAndQuery = /api/player/authorize
rawBody = {"launchToken":"4737c68b-d74c-4677-9165-cea1c8449af9"}
signingMessage =
1774453268283.ed0bcd52fc034671b3f40e8e71ec7080.POST./api/player/authorize.{"launchToken":"4737c68b-d74c-4677-9165-cea1c8449af9"}
Full endpoint = Base URL + relative path Example: https://wallet.operator.com/api/balance/get
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"launchToken": "GUID"
}
{
"playerId": 2,
"operatorPublicId": "GUID",
"displayName": "player1",
"gameId": 1,
"currencyCode": "PHP",
"languageCode": "en-PH",
"countryCode": "PH",
"balance": 1000.00
}
{
"error": "Invalid or expired launch token."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 1000.00
}
{
"error": "Player not found."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001",
"transactionId": "T-001",
"amount": 10.00,
"currencyCode": "PHP"
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 990.00,
"transactionId": "T-001"
}
{
"error": "Insufficient funds."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001",
"transactionId": "T-002",
"amount": 25.00,
"currencyCode": "PHP"
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 1015.00,
"transactionId": "T-002"
}
{
"error": "Duplicate transaction."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001",
"transactionId": "T-003",
"originalTransactionId": "T-001",
"amount": 10.00
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 1000.00,
"transactionId": "T-003"
}
{
"error": "Transaction not found."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001",
"transactionId": "T-010",
"amount": 5.00,
"currencyCode": "PHP"
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 995.00,
"transactionId": "T-010"
}
{
"error": "Insufficient balance."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"gameId": 1,
"matchId": "match-123",
"handId": "match-123-000001",
"tableId": "table-01",
"amount": 12.50,
"currencyCode": "PHP",
"payloadJson": "{...}"
}
{
"gameRakeEventId": 1001
}
{
"error": "MatchId is required."
}
Optional endpoints (not required for Poker)
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001"
}
{
"status": "Closed"
}
{
"error": "Session not found."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001",
"transactionId": "T-004",
"amount": 5.00
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 1005.00,
"transactionId": "T-004"
}
{
"error": "Bonus is not available."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001",
"transactionId": "T-005",
"amount": 1.00
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 999.00,
"transactionId": "T-005"
}
{
"error": "Jackpot pool is closed."
}
Content-Type: application/json
X-Signature: {base64_hmac_sha256}
X-Timestamp: {unix_time_ms_utc}
X-Nonce: {unique_random_value}
X-Provider-Code: GoLetsPlay
{
"playerId": 1,
"gameId": 1,
"roundId": "R-001",
"transactionId": "T-006",
"amount": 100.00
}
{
"playerId": 1,
"currencyCode": "PHP",
"balance": 1099.00,
"transactionId": "T-006"
}
{
"error": "Payout failed."
}
How GoLetsPlay connects to your operator system
Use this step-by-step flow when implementing your operator APIs for GoLetsPlay Poker.
- Save your required operator endpoints above: authorize, balance, bet, settle, rollback, tip, and rake.
- Generate your operator Signing Secret and store it securely on your server only.
- Your player logs in on your operator system and your server issues a short-lived launchToken.
- The game client opens with launchToken and operatorPublicId.
- The GoLetsPlay game server resolves your saved endpoint URLs using operatorPublicId.
- The game server calls your APIs with signed headers: X-Signature, X-Timestamp, X-Nonce, and X-Provider-Code.
- Your operator API validates the request signature and returns JSON responses in the expected format.
POST /api/player/authorize
{
"launchToken": "GUID"
}
playerId operatorPublicId displayName gameId currencyCode languageCode countryCode balance
POST /api/balance/get POST /api/bet/place POST /api/bet/settle POST /api/bet/rollback POST /api/tip/place POST /api/rake/notify
{
"playerId": 2,
"operatorPublicId": "GUID",
"displayName": "player1",
"gameId": 1,
"currencyCode": "PHP",
"languageCode": "en-PH",
"countryCode": "PH",
"balance": 1000.00
}
{
"error": "Invalid or expired launch token."
}
{
"error": "Player not found."
}
Test operator API endpoints
Send signed sample requests from this dashboard to your operator API. If the browser blocks the request, allow CORS from the GoLetsPlay dashboard origin on your operator server.
Select an endpoint to preview the resolved URL.
No test request sent yet.
Game history API (audit)
These GoLetsPlay endpoints let operators fetch Poker match history for audit, player support, and reconciliation.
- Copy your Operator Public ID from the Account Info tab.
- Use game id 1 for Poker.
- Call the list endpoint to fetch match summaries.
- Use matchId from the list response to fetch one match detail.
- Use handId from the match detail response to fetch hand events.
- Optionally use playerId to filter history for a single player.
GET /api/portal/operators/{operatorPublicId}/games/1/history?limit=100
Optional filters:
- playerId=PLAYER_ID
- sinceUtc=2026-02-14T00:00:00Z
Paging (cursor):
- beforeUtc=2026-02-14T05:00:00Z&beforeGameMatchId=12345
GET /api/portal/operators/{operatorPublicId}/games/1/history/{matchId}
GET /api/portal/operators/{operatorPublicId}/games/1/history/{matchId}/hands/{handId}?limit=200
Optional:
- sinceUtc=2026-02-14T05:00:00Z
{
"items": [ ... ],
"next": {
"beforeUtc": "2026-02-14T05:00:00Z",
"beforeGameMatchId": 12345
}
}
Test Poker history API
Run the GoLetsPlay Poker history endpoints directly from this dashboard and inspect the JSON response.
No history request sent yet.