Account Info.

Operator identity, access key, and quick profile summary.

Operator Name
-
Display Name
-
Operator Public ID
-
Access Key
-
Access key is masked by default. Enter your password to reveal it.

Games

Select a game to manage tables.

Game catalog

Pick a game to manage tables.

No games available yet.

How to launch a game

Give your players a seamless handoff from your lobby to the Prime Mac Games client.

  1. Player signs in on your operator site and selects a game.
  2. Your server creates a short-lived launchToken and builds the launch URL with your operatorPublicId.
  3. The browser opens the game client. The client sends launchToken + operatorPublicId to the game server for authorization.
Launch URL template
https://{gameClientBaseUrl}/launch.html?game={gameCode}&token={launchToken}&operatorPublicId={operatorPublicId}
Tip: copy the Operator Public ID from the Account Info tab.
Need a dedicated game client base URL? Contact Prime Mac Games support to enable a branded launcher for your domain.

Home

Operator revenue and GGR metrics derived from stored game history. For Poker cash games, GGR currently equals rake.

Revenue (Rake)
0.00 PHP
Net operator earnings from poker hands.
GGR
0.00 PHP
Current poker model: pot total minus payout total.
Margin
0.00%
Revenue as a share of total pot volume.
Total Pot
0.00 PHP
Summed pot value across completed hands.
Total Payout
0.00 PHP
Summed player payouts after rake.
Hands
0
Completed hands in the selected range.
Matches
0
Distinct matches represented in daily stats.
Players
0
Unique players active in the selected range.

Profit trend

Pot, payout, and revenue movement by day based on completed hand summaries already ingested from the game server.

Total pot Total payout Revenue / Rake

Margin

Revenue efficiency relative to handled pot volume.

0.00%
Selected range margin
Avg revenue / hand
0.00 PHP
Avg pot / hand
0.00 PHP
Unique players across days
0

Top 5 performing games

Highest rake/revenue in the selected range.

Lowest 5 earning games

Games with the lowest rake/revenue in the selected range.

API

Configure your operator endpoints, follow the integration flow, and test your APIs directly from the Prime Mac Games dashboard. Use the tabs below to focus on one part at a time.

Operator API endpoints

These endpoints are called by the Prime Mac Games game server to authorize players, read balances, and process wallet actions for Poker.

Signing Secret
**** **** **** ****
Shared secret used to verify signed requests. Your operator API must validate X-Signature, X-Timestamp, and X-Nonce on every protected request.
OpenAI API Key (AI Bot)
**** **** **** ****
Used by the game server AI bot layer for behavior decisions. Stored encrypted and fetched server-to-server only.
Game server endpoint (OpenAI key)
GET /api/game/operators/public/{operatorPublicId}/openai-api-key
Header: X-Game-Server-Token: {gameServerToken}
Response
{
  "openAiApiKey": "sk-...",
  "openAiApiKeyLast4": "abcd"
}
Signed request format
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}
Notes
- 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.
How to generate X-Signature
1. Read your operator Signing Secret from the Prime Mac Games 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))
Example
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"}
Base domain used when the paths below are relative.
Example: https://wallet.operator.com
Usage
Full endpoint = Base URL + relative path
Example: https://wallet.operator.com/api/balance/get
Validate the launch token and return player profile and balance.
Example: POST /api/player/authorize
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
Request body
{
  "launchToken": "GUID"
 }
Note: only launchToken is required in the request body.
Success response
{
  "playerId": 2,
  "operatorPublicId": "GUID",
  "displayName": "player1",
  "gameId": 1,
  "currencyCode": "PHP",
  "languageCode": "en-PH",
  "countryCode": "PH",
  "balance": 1000.00
}
Error response
{
  "error": "Invalid or expired launch token."
}
Return player balance and currency.
Example: POST /api/balance/get
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
Request body
{
  "playerId": 1
 }
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 1000.00
}
Error response
{
  "error": "Player not found."
}
Debit a bet amount from the player wallet. This is idempotent by transactionId.
Example: POST /api/bet/place
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "R-001",
  "transactionId": "T-001",
  "amount": 10.00,
  "currencyCode": "PHP"
}
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 990.00,
  "transactionId": "T-001"
}
Implementation notes
- amount is the bet/debit amount only and should be positive.
- The response balance is the player's balance AFTER the deduction.
- Example: starting balance 1000.00, bet amount 10.00, response balance 990.00.
- Reject if the wallet does not have enough available balance.
- transactionId must be idempotent: same request returns same result, different payload with same transactionId should be rejected.
Error response
{
  "error": "Insufficient funds."
}
Credit the player's win/payout for the round. This endpoint should not be used to deduct the original bet.
Example: POST /api/bet/settle
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "M-10021",
  "transactionId": "SETTLE-M-10021-P1-0007",
  "amount": 25.00,
  "currencyCode": "PHP",
  "playerActivity": {
    "matchId": "M-10021",
    "totalHands": 12,
    "totalBetsAmount": 5400,
    "totalTipsAmount": 30,
    "totalWinsAmount": 6200,
    "totalLoseAmount": 6000,
    "totalRakeAmount": 145,
    "netAmount": 25
  }
}
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 1015.00,
  "transactionId": "SETTLE-M-10021-P1-0007"
}
Implementation notes
- amount is the win/payout credit only. It should be positive.
- Do not send a negative amount here.
- The original bet deduction should already have happened in POST /api/bet/place.
- The response balance is the player's balance AFTER the credit.
- Example: balance after bet is 990.00, settle amount is 25.00, response balance becomes 1015.00.
- If rake applies, the settle amount should already be net of rake before this request is sent.
- playerActivity is an audit/detail object for the player's completed match activity.
- playerActivity.matchId should be the same value as roundId for poker integration.
- playerActivity.netAmount should normally match the top-level amount sent to settle.
Error response
{
  "error": "Duplicate transaction."
}
Reverse a previous wallet transaction using originalTransactionId. This can be used for both bet and settle rollback.
Example: POST /api/bet/rollback
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "R-001",
  "transactionId": "T-003",
  "originalTransactionId": "T-001",
  "amount": 10.00
}
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 1000.00,
  "transactionId": "T-003"
}
Implementation notes
- amount should be positive.
- Always send originalTransactionId so your backend can look up the original transaction type.
- If the original transaction type is a debit (bet, tip, jackpot contribute), rollback should add the amount back to the wallet.
- If the original transaction type is a credit (settle/win, free bet, jackpot payout), rollback should deduct the amount back from the wallet.
- In simple terms: rollback should reverse the financial effect of the original transaction.
- transactionId for the rollback request itself must also be idempotent.
Error response
{
  "error": "Transaction not found."
}
Deduct a tip amount from the player's wallet.
Example: POST /api/tip/place
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "R-001",
  "transactionId": "T-010",
  "amount": 5.00,
  "currencyCode": "PHP"
}
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 995.00,
  "transactionId": "T-010"
}
Error response
{
  "error": "Insufficient balance."
}
Notify the operator about rake deducted from the pot for audit and revenue reporting.
Example: POST /api/rake/notify
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
Request body
{
  "gameId": 1,
  "matchId": "match-123",
  "handId": "match-123-000001",
  "tableId": "table-01",
  "amount": 12.50,
  "currencyCode": "PHP",
  "payloadJson": "{...}"
}
Success response
{
  "gameRakeEventId": 1001
}
Implementation notes
- Do not deduct this amount from the player's wallet in this endpoint.
- This endpoint is for record keeping, audit, and revenue tracking only.
- The rake should already be accounted for in the game result before settle is sent.
- In practice, the settle amount sent to POST /api/bet/settle should already be net of rake.
Error response
{
  "error": "MatchId is required."
}
Optional endpoints (not required for Poker)
Close a session when the game ends.
Example: POST /api/session/close
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "R-001"
 }
Success response
{
  "status": "Closed"
 }
Error response
{
  "error": "Session not found."
 }
Redeem bonus/free-bet credits.
Example: POST /api/freebet/redeem
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "R-001",
  "transactionId": "T-004",
  "amount": 5.00
 }
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 1005.00,
  "transactionId": "T-004"
 }
Error response
{
  "error": "Bonus is not available."
 }
Add contributions to a jackpot pool.
Example: POST /api/jackpot/contribute
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "R-001",
  "transactionId": "T-005",
  "amount": 1.00
 }
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 999.00,
  "transactionId": "T-005"
 }
Error response
{
  "error": "Jackpot pool is closed."
 }
Payout a jackpot winner and finalize the round.
Example: POST /api/jackpot/payout
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
Request body
{
  "playerId": 1,
  "gameId": 1,
  "roundId": "R-001",
  "transactionId": "T-006",
  "amount": 100.00
 }
Success response
{
  "playerId": 1,
  "currencyCode": "PHP",
  "balance": 1099.00,
  "transactionId": "T-006"
 }
Error response
{
  "error": "Payout failed."
 }