Skip to content

Error Codes ​

This page lists all error codes returned by the Operator API, along with the status values the operator returns in wallet callbacks.

Error Response Shape ​

When the Operator API fails, it returns the JSON below together with an HTTP 4xx or 5xx status.

json
{
  "error": {
    "code": "INVALID_REQUEST",
    "message": "invalid fields",
    "details": { "fields": ["player.nickname"] }
  }
}
FieldTypeDescription
error.codestringError code. Branch your program logic on this value
error.messagestringHuman-readable English description. The wording may change, so do not use it for branching
error.detailsobjectPresent only for some errors: fields (list of invalid field names) for field errors, and kind, key, conflicts for audit log revert errors
  • A request to an unregistered path or method returns HTTP 404 or 405 with a plain-text body rather than this JSON. Check for typos in the path or method first.
  • Do not retry errors that will produce the same result if the request is resent unchanged (most 4xx errors). Errors that may be retried are roughly RATE_LIMITED, INTERNAL_ERROR, TABLE_OPEN_FAILED, GAME_MAINTENANCE, and UNAVAILABLE. When retrying, you must sign again with a new X-Timestamp and X-Nonce.

HTTP Status Summary ​

HTTPMeaning
400Invalid request body or parameters
401Signature, timestamp, or nonce verification failed
403Authenticated but not permitted (operator status, IP, permissions)
404The target does not exist or does not belong to this operator
409Conflict with the current state
429Rate limit exceeded
500Platform internal error
503Temporarily unavailable (maintenance, etc.)

Authentication and Common Errors ​

These can occur on any endpoint. They are listed in the order in which they are checked. For detailed rules, see Authentication and Signing.

codeHTTPCauseAction
INVALID_SIGNATURE401X-Operator is not a registered codeCheck the operator code
OPERATOR_DISABLED403The operator is suspendedContact the platform
IP_NOT_ALLOWED403The request IP is not in the registered IP allowlistRegister the operator server's public outbound IP with the platform
INVALID_SIGNATURE401X-Api-Key was sent but the value is wrongCheck the issued api_key (after reissue, the previous key becomes invalid immediately)
INVALID_REQUEST400The request body could not be readCheck the body and Content-Length
TIMESTAMP_OUT_OF_RANGE401X-Timestamp is not an integer or differs from platform time by more than 5 minutesSend Unix milliseconds and synchronize the server clock with NTP
INVALID_SIGNATURE401The signature does not match, or X-Nonce is empty or longer than 128 charactersCheck the string to sign (timestamp, nonce, method, path + query, raw body) and api_secret. A body truncated for exceeding 64 KB also fails here
NONCE_REUSED401The same X-Nonce was reused within 5 minutesGenerate a new nonce for each request, including retries, and sign again
RATE_LIMITED429More than 200 requests per second per operatorRetry after a short wait; reduce call frequency and cache results
INTERNAL_ERROR500Platform internal errorRetry after a short wait; contact the platform if it persists

Endpoint-Specific Errors ​

codeHTTPWhereMeaningAction
INVALID_REQUEST400Every endpoint that accepts a body or parametersThe JSON is malformed or a field value is invalid. For field errors, details.fields lists the field namesFix the fields in details.fields and resend
CURRENCY_NOT_SUPPORTED400POST /launchA currency not allowed for this operatorCheck your contracted currencies (GET /currencies)
CURRENCY_MISMATCH409POST /launchLaunch with a currency different from the existing player's currencyA player's currency is fixed at the first launch and never changes. Use a different external_id per currency
PLAYER_BLOCKED403POST /launchThe player is blocked on the platformTo unblock, call POST /players/{external_id}/logout with block: false
GAME_NOT_FOUND404POST /launch, table creation, per-game settingsThe game code does not exist or the game is not enabled for this operatorCheck enabled games with GET /games
GAME_MAINTENANCE503POST /launchThe game is under maintenanceLaunch again after maintenance ends. Show a maintenance notice in the lobby
TABLE_NOT_FOUND404POST /launch, TablesThe table does not exist, is closed, belongs to another game, or is another operator's dedicated tableCheck current tables with GET /tables
PRIVATE_PASSWORD403POST /launch (table_password)The private table password is wrongAsk the player to enter it again
RATE_LIMITED429POST /launch (table_password)The same player attempted the same table's password more than 5 times in 1 minuteTry again after 1 minute
TABLE_NOT_OWNED403Table changes, closing, per-table settingsAttempted to change a shared table rather than the operator's dedicated tableOnly dedicated tables can be changed
TABLE_CREATE_FORBIDDEN403POST /tablesThe operating mode does not allow creating tables, or table creation is not allowed for that gameAgree on the operating mode and allowed games with the platform
TEMPLATE_NOT_FOUND404POST /tablesThere is no default table to copy for that gameContact the platform
TEMPLATE_NOT_ALLOWED400POST /tablesThe table specified as the copy source cannot be usedSpecify a different source table, or create the table from the game code without a source
INVALID_CONFIG400Table creation, settings, timers, rake, live, currencyA setting value is out of the allowed range or values are inconsistent with each otherCorrect the values using message as a guide
UNSUPPORTED_GAME400PUT /tables/{table_id}/liveA game that does not support dealing or pause controlUse only on Live Hold'em and Speed Hold'em tables
TABLE_BUSY409PUT /tables/{table_id}/currencyThe currency cannot be changed because players are seatedTry again once the table is empty
TABLE_OPEN_FAILED500POST /tables, PUT /tables/{table_id}/currencyThe table could not be openedRetry after a short wait; contact the platform if it persists
UNAVAILABLE503POST /tablesTables cannot be created right nowRetry after a short wait; contact the platform if it persists
BAD_IMAGE400PUT /lobby-bannersBanner image format or size errorUpload again in an allowed format and size
BANNER_NOT_FOUND404PUT /games/{game_code}/lobbyThe specified banner image has not been uploaded yetUpload the image first with PUT /lobby-banners
ROUND_NOT_FOUND404GET /rounds/{round_id}The round does not exist or does not belong to this operator or playerCheck round_id and external_id
SESSION_NOT_FOUND404GET /sessions/{session_id}The table session does not existCheck the tss_… ID
PLAYER_NOT_FOUND404POST /players/{external_id}/logoutA player who has never launched a gameCheck external_id
DEALER_NOT_FOUND404DealersThe dealer does not exist or does not belong to this operatorCheck dealer_id
DUPLICATE409POST /dealersThe dealer login ID is already in use (shared across all operators)Use a different ID
BAD_PHOTO400PUT /dealers/{dealer_id}/photoPhoto format or size errorUpload again in an allowed format and size
CARD_LOG_FORBIDDEN403GET /dealer-card-logThe card input log is not available in this operating modeindependent operating mode only
PRIVATE_FORBIDDEN403Private TablesPrivate tables are not available in this operating modeindependent operating mode only
PRIVATE_OVERLAP409POST /private-tablesThe time overlaps with another reservation on the same tableAdjust the time slot
PRIVATE_ENDED409DELETE /private-tables/{private_id}The reservation has already ended or been cancelledNo need to cancel
NOT_FOUND404DELETE /private-tables/{private_id}, POST /audit/{audit_id}/restoreThe reservation or audit record does not existCheck the ID
NOT_RESTORABLE403POST /audit/{audit_id}/restoreA type of change the operator cannot revertContact the platform
NOT_RESTORABLE409POST /audit/{audit_id}/restoreThere is no value to restore, or the revert feature is turned off—
RESTORE_BLOCKED409POST /audit/{audit_id}/restoreReverting would be inconsistent with the current state. details.kind and details.key identify the blocked targetResolve it first, using message as a guide
RESTORE_CONFLICT409POST /audit/{audit_id}/restoreThe same target was changed again after this change. details.conflicts lists themRevert the later changes first, or overwrite with force: true

Wallet Callback status ​

In wallet callbacks the direction is reversed. The platform calls the operator, and the operator returns HTTP 200 with one of the status values below. The platform's handling of each value is described in the wallet callback overview.

statusMeaningOn debitOn credit / rollback
OKProcessedConfirmedConfirmed
INSUFFICIENT_FUNDSInsufficient balanceRejectedRetried — do not use
PLAYER_NOT_FOUNDPlayer does not existRejectedRetried — do not use
PLAYER_BLOCKEDBlocked or self-excludedRejectedRetried — do not use
LIMIT_EXCEEDEDResponsible gambling limit exceededRejectedRetried — do not use
CURRENCY_MISMATCHCurrency mismatchRejectedRetried
INVALID_SIGNATURESignature verification failedRejectedRetried
TX_ALREADY_ROLLED_BACKA debit whose rollback arrived firstRejectedRetried — do not use
INVALID_REQUESTField errorRejectedRetried
UNKNOWN_ERRORUnknown whether it was processedFailure + platform rolls backRetried

Credits and rollbacks end only with OK. For details on each endpoint, see balance, debit, credit, and rollback.

These are the wallet-related errors players may see on the game screen. Use them as a reference when handling customer inquiries.

CodeWhen
INSUFFICIENT_FUNDSThe operator wallet returned insufficient funds for a debit
LIMIT_EXCEEDEDThe operator wallet returned limit exceeded for a debit
OPERATOR_CREDIT_EXHAUSTEDIn prepaid operating mode, the operator's prepaid credit is insufficient — the wallet is not called
WALLET_UNAVAILABLEThe debit outcome is uncertain (timeout, connection failure, UNKNOWN_ERROR), other wallet rejections, or a failed balance refresh

Docs v1.0.0 · Operator API v1