Reference
Error reference
Errors are returned as {"status":"error","message":"<CODE>"} with the HTTP status shown below. Branch on the code, not on the HTTP status alone. Use the filter to search by code or text. Format rules: Conventions.
| Code | HTTP | Where | Meaning | What to do |
|---|---|---|---|---|
UNAUTHORIZED | 401 | API (any) | The partner id is unknown or the api_key does not match. | Check partner and api_key. If the key was rotated, install the new key. |
INVALID_REQUEST | 400 | API (any) | A required field is missing or has a wrong type or format (for example a bad currency, player_id, client_platform, region or demo_reset), or an unknown field was sent. /playGame.do, round_cancel and the reports accept only the documented fields. | Compare the request with the method description and remove unknown fields. A body that is not valid JSON is answered with REQUEST_FAILED. |
INVALID_IDEMPOTENCY_KEY | 400 | API (any) | The Idempotency-Key header is not 1–128 printable ASCII characters (or was sent twice). | Use a UUID or another short key without spaces. |
IDEMPOTENCY_CONFLICT | 409 / 400 | API (any) | The same Idempotency-Key was already used with a different request body. HTTP 409 on /gameActions.do; on /playGame.do the same code comes with HTTP 400. | Use a new key for a new request; repeat the identical body to get the first answer. |
REQUEST_FAILED | 400 | API (any) | The request failed for a reason that has no public code: the body is not valid JSON, the content type is not JSON or form data, or a time-out or network failure happened (for example while calling your wallet at launch). | Check the body and Content-Type: application/json. If the body is fine, retry once; if it repeats, contact the platform owner with the time of the request. |
FORBIDDEN | 403 | API (any) | The action is not allowed for this caller. | Do not retry; check permissions (admin) or the launch parameters. |
RATE_LIMITED | 429 | API (any) | The per-project quota of the endpoint class (launch, actions, reports) is used up for this minute. The quota is counted before the key is checked, so requests with a wrong key also use it. | Wait for Retry-After seconds and retry; spread bulk work. See Conventions, Rate limits. |
DATABASE_UNAVAILABLE | 503 | API (any) | GET /health could not reach the database. | Retry shortly; if it persists, contact the platform owner. |
UNSUPPORTED_GAME | 404 | /playGame.do | symbol is missing, is not a string, or is not a published game id. | Take ids from GET /games/catalog (game_id). |
UNSUPPORTED_LANGUAGE | 400 | /playGame.do | lang is malformed or not supported by this game. | Use a code from the game's languages list, or omit lang to use the project default. |
REAL_MODE_DISABLED | 400 | /playGame.do | gametype is neither demo (your wallet) nor fun (free-play demo). Real-money mode is not available. | Send "gametype": "demo" or "gametype": "fun". |
INVALID_DEMO_BALANCE | 400 | /playGame.do | demo_balance of a gametype: "fun" launch is outside 1.00–10,000,000.00 or is not a number with at most two decimals. | Send a value in range, e.g. "100000.00", or omit it for the default. |
DEMO_UNAVAILABLE | 503 | /playGame.do | Demo mode is not provisioned on this server. | Contact the platform owner. |
PROMO_UNSUPPORTED | 400 | /playGame.do | The legacy freespins field was sent to the launch method. | Remove it and grant free spins with /gameActions.do (freespins_create). |
ROUND_IN_PROGRESS | 400 | /playGame.do | The player has an unfinished round in this game in another currency. | Launch with the currency of the unfinished round (or let the round finish). |
BALANCE_UNAVAILABLE | 400 | /playGame.do | Your wallet answered the session_info request at launch with {"status":"error",…}, so the session was not created. | Make session_info answer status: "ok" with the balance of a known player; use "Test connection" in the admin panel. |
WALLET_IDENTITY_MISMATCH | 400 | /playGame.do | The wallet settings stored for the project do not match the server configuration, so the platform refuses to call your wallet. | Contact the platform owner; this is not caused by the request. |
IP_NOT_ALLOWED | 403 | /gameActions.do | The caller IP is not on the project allowlist (/gameActions.do, /playerRtp.do; /playGame.do has no IP check). | Ask the platform owner or a project user with the credentials permission to add your server network (CIDR) in the admin panel, section IP Whitelist. |
INVALID_METHOD | 400 | /gameActions.do | method is not one of the supported methods. | Use freespins_* or outcome_* methods listed in this documentation. |
METHOD_RETIRED | 400 | /gameActions.do | A legacy method (freespins_set, freespins_delete, or freespins_get without an id) was called. | Migrate to freespins_create, freespins_get, freespins_list, freespins_cancel. |
GAME_NOT_FOUND | 404 | /gameActions.do | symbol is not a published game. | Take ids from GET /games/health. |
DUPLICATE_EXTERNAL_ID | 409 | /gameActions.do | external_id is already used by another record of this project. | Use a unique external_id, or read the existing record by it. |
PROJECT_BET_LIMIT | 400 | /gameActions.do | The bet is outside the bet limits of the project, the game or the player. Also returned by a game when a stake is outside the limits. | Choose a bet inside the limits (see Bet limits), or change the limits in the admin. |
ROUND_NOT_FOUND | 404 | /gameActions.do | round_id is not a round of this partner. | Take the id from meta.round_id of a wallet callback or from report_rounds. |
ROUND_NOT_CANCELLABLE | 409 | /gameActions.do | The round cannot be cancelled: it is finished, its win is being credited, the result was shown to the player, or it is a free-spin round. | Nothing to do; read the round with report_rounds. |
ROUND_BUSY | 409 | /gameActions.do | A wallet call of this round is in flight at this moment. | Retry after a few seconds. |
ROUND_CANCEL_UNAVAILABLE | 400 | /gameActions.do | Round cancellation is not enabled on the server yet. | Contact the platform owner. |
INVALID_PERIOD | 400 | /gameActions.do | from is not before to, or the report_ggr period is longer than 366 days. | Use ISO dates and a shorter period. |
INVALID_CURSOR | 400 | /gameActions.do | cursor is not a next_cursor returned by the same report. | Pass next_cursor unchanged, with the same filters. |
INVALID_GROUP_BY | 400 | /gameActions.do | group_by contains something other than day, symbol, currency. | Use a subset of those three. |
INVALID_STATE | 400 | /gameActions.do | state of report_rounds is not settled, pending, cancelled or rejected. | Use one of those values. |
INVALID_LIMIT | 400 | /gameActions.do | limit of a report is outside its range (rounds 1–500, reconciliation 1–1000). | Use an integer in the range and page with cursor. |
INVALID_FROM | 400 | /gameActions.do | from is not an ISO 8601 date or date-time with a zone (Z or +hh:mm). | Use 2027-01-15 or 2027-01-15T12:00:00Z. |
INVALID_PLAYER_ID | 400 | /gameActions.do | player_id of a report is not a short printable string. | Pass the id exactly as you use it elsewhere. |
INVALID_TO | 400 | /gameActions.do | to is not an ISO 8601 date or date-time with a zone (Z or +hh:mm). | Use 2027-01-15 or 2027-01-15T12:00:00Z. |
INVALID_SYMBOL | 400 | /gameActions.do | symbol of a report is not a short printable string. | Pass a game id from GET /games/catalog. |
INVALID_ROUND_ID | 400 | /gameActions.do | round_id of a report is not a short printable string. | Take the id from meta.round_id of a wallet callback or from report_rounds. |
INVALID_COUNT | 400 | Free spins | count is not a whole number from 1 to 1000. | Send 1–1000. |
INVALID_FREE_SPIN_BET | 400 | Free spins | bet is not a valid base-mode bet of the game (or not a decimal string). | Use one of the game's own bets as a decimal string, for example "1.00". |
INVALID_EXPIRY | 400 | Free spins | expires_at is not an ISO 8601 date with a time zone, or is outside the allowed range (free spins: +1 hour to +30 days; target outcomes: +1 hour to +90 days). | Send a value like 2026-11-01T12:00:00Z inside the range, or omit it for the default (7 days). |
FREE_SPINS_UNSUPPORTED | 400 | Free spins | Free spins are not available for this game's provider. | Check the free_spins flag in GET /games/health. |
GRANT_NOT_FOUND | 404 | Free spins | No free-spins grant with this grant_id / external_id in the project. | Check the id; list grants with freespins_list. |
FORCED_OUTCOMES_UNSUPPORTED | 400 | Target outcomes | Target outcomes are not available for this game's provider. | Check the target_outcomes flag in GET /games/health. |
GAME_HAS_NO_BONUS | 400 | Target outcomes | kind is bonus but the game has no feature round. | Use kind: "spin". |
INVALID_MULTIPLIER | 400 | Target outcomes | multiplier is not a positive number with at most 2 decimals (up to 7 digits before the point). | Send for example 50 or "12.5". |
MULTIPLIER_ABOVE_MAX_WIN | 400 | Target outcomes | multiplier is above the maximum win of the game (in bets). | Lower the multiplier. |
INVALID_SPIN_NUMBER | 400 | Target outcomes | spin_number is not a whole number from 1 to 100000. | Send 1–100000. |
INVALID_KIND | 400 | Target outcomes | kind is neither spin nor bonus. | Use spin or bonus. |
OUTCOME_NOT_FOUND | 404 | Target outcomes | No target outcome with this outcome_id / external_id in the project. | Check the id; list entries with outcome_list. |
INVALID_ACTION | 400 | /playerRtp.do | action is not get, set, auto or bet-limit. | Use one of the four actions. |
RTP_PROVIDER_UNSUPPORTED | 400 | /playerRtp.do | provider is not endorphina, pragmatic or nolimitcity. | Send a supported provider id. |
RTP_LEVEL_INVALID | 400 | /playerRtp.do | rtp is not a number with at most 2 decimals. | Send for example 94.5. |
RTP_LEVEL_OUT_OF_RANGE | 400 | /playerRtp.do | The RTP is outside 60–100 %. | Send a value from 60 to 100. |
RTP_POLICY_REQUIRED | 400 | /playerRtp.do | The project has no provider RTP yet, so a new player cannot be bound. | Set the provider RTP in the admin, RTP & players. |
INVALID_REASON | 400 | /playerRtp.do | reason is longer than 200 characters or not a string. | Shorten the reason. |
INVALID_CURRENCY | 400 | /playerRtp.do | currency is not a supported ISO 4217 fiat code (/playerRtp.do bet-limit: three uppercase letters; reports: a code outside the supported list). | Send a supported code in upper case, for example EUR (see Currencies). |
INVALID_BET_LIMIT | 400 | /playerRtp.do | min_minor / max_minor are not digit strings, min is below 1, or max is below min. | Send minor units as strings, min ≥ 1, max ≥ min; or both null to remove the limit. |
INVALID_PLAYER | 400 | /playerRtp.do | player_id is missing or invalid. /playerRtp.do accepts only letters, digits and _ . : @ -, 1–128 characters. | Send the player id used at launch (a player id with other characters cannot be managed through this method). |
INSUFFICIENT_FUNDS | 200 | Your wallet | Your answer to a bet when the player balance is too low: {"status":"error","message":"INSUFFICIENT_FUNDS",…}. The round is rejected and nothing is debited. | Return it only when the balance really is too low; any other error makes the platform retry. |
CALLBACK_HTTP_ERROR | 400 | Your wallet | Your wallet answered with a non-2xx HTTP status. At launch (session_info) this code is returned to you with HTTP 400. For a bet, any 4xx except 408 and 429 is a definitive refusal: the round is rejected at once and a refund is queued; 5xx, 408 and 429 are retried. | Return HTTP 200 with the JSON answer (also for INSUFFICIENT_FUNDS). Use 4xx only to refuse a bet for good. |
INVALID_CALLBACK_RESPONSE | 400 | Your wallet | The wallet answer is not usable: not valid JSON, status is not ok/error, currency differs from the callback path, or balance is not a plain non-negative JSON number with at most 2 decimals. Error answers need balance and currency too. At launch this code is returned to you with HTTP 400. | Answer {"status":"ok","balance":<number>,"currency":"<same currency>"}; for a refusal {"status":"error","message":"…","balance":<number>,"currency":"<same currency>"}. |
TRANSACTION_CANCELLED | 200 | Your wallet | Answer your wallet gives to a bet whose transaction id was already cancelled by a refund. | Do not debit; answer {"status":"error","message":"TRANSACTION_CANCELLED",…}. |
GAME_MODE_DISABLED | 400 | In the game | The game mode (for example bonus buy or ante) is switched off for the project. Also returned by freespins_create. | Enable the flag in the admin panel, Projects, Providers. |
PROJECT_GAME_DISABLED | 400 | In the game | The game or its provider is switched off for the project. Also returned by freespins_create. | Enable the provider in the admin panel, Projects, Providers. |
CURRENCY_REQUIRED | 400 | In the game | A currency from the supported list is required. | Send a supported ISO 4217 fiat code (see Currencies). |
FREE_SPINS_ACTIVE | — | In the game | The player has active free spins in this game and tried a paid spin, ante or bonus buy. Shown by the game client, not returned by the operator API. | The player plays the free spins first; they end when used up, expired or cancelled. |
FREE_SPINS_CHANGED | — | In the game | The free-spins grant of the player changed while a round was starting (for example it was cancelled). Shown by the game client, not returned by the operator API. | The player repeats the spin. |
UNKNOWN_PROJECT | 404 | Admin API | The project (partner) does not exist. | Check the project id. |
INVALID_ADMIN_ORIGIN | 403 | Admin API | A change request of the admin API came without the expected Origin / X-Admin-Request headers. | Use the admin panel itself; the admin API is not a public integration API. |
PROJECT_SETTINGS_CONFLICT | 409 | Admin API | Someone else saved the project settings first. | Reload the page and repeat your change. |
UNSUPPORTED_BY_RUNTIME | 400 | Admin API | A setting that this platform cannot honour (legacy RTP policy, alerts, retention strategy). | Leave it off; use personal RTP instead of the legacy policy. |
INVALID_CALLBACK_URL | 400 | Admin API | The callback URL is not acceptable. | Use https://, no trailing slash, no user info, query or fragment, port 443 only, at most 512 characters, a public host name. |
CONFIRMATION_REQUIRED | 400 | Admin API | Key rotation needs the project id typed as confirmation. | Type the project id in the confirmation field. |
CREDENTIALS_CHANGED | 409 | Admin API | The API key was changed by someone else while you were working. | Reload the page and decide again. |
PARTNER_LOCKED | 403 | Admin API | This project is internal (demo or site wallet); its key and callback are read-only. | Nothing to do; use your own project. |
CREDENTIALS_NOT_ENABLED | 503 | Admin API | Changing keys and callback URLs is not enabled on the server yet. | Contact the platform owner. |
INVALID_FRAME_ORIGINS | 400 | Admin API | The list of allowed iframe origins is not valid: more than 16 entries, or an entry is not an https:// origin (no wildcard, path, query, user info; the host needs a dot). | Send up to 16 origins such as https://casino.example. |
AUTH_THROTTLED | 429 | Admin API | Too many failed sign-ins to the admin panel (5 per minute per user and address, 20 per minute per address). | Wait a minute and sign in again with the right password. |
INVALID_PROJECT_SETTINGS | 400 | Admin API | A project settings section has a wrong shape or value (also INVALID_PROVIDER_FLAGS, INVALID_BET_LIMIT, BET_LIMIT_OUT_OF_BOUNDS, UNSUPPORTED_PROVIDER_CAPABILITY, UNKNOWN_GAME). | Check the field the admin panel marks and save again. |
RTP_RULE_INVALID | 400 | Admin API | The adaptive RTP rule has an invalid field (window 50–100000 rounds, step 10–2000 bps, maximum drop 0–4000 bps, upper above lower). | Correct the rule fields in the admin panel, RTP & players. |
INVALID_PROVIDER_FLAGS | 400 | Admin API | The provider switches of a project are malformed. | Send every provider flag as a boolean. |
UNSUPPORTED_PROVIDER_CAPABILITY | 400 | Admin API | A provider flag asks for a capability the provider does not have (for example promo or ante). | Leave that flag off. |
BET_LIMIT_OUT_OF_BOUNDS | 400 | Admin API | A project bet limit lies outside the bounds set by the platform owner for this client. | Choose a range inside the bounds. |
UNKNOWN_GAME | 400 | Admin API | A per-game setting names a game id that is not published. | Take ids from GET /games/catalog. |