Casino Api Pro

Integrate

Game catalogue

Listing the games enabled for your account, and what each field means.

The catalogue is what your account can launch — not everything we host. Enabling a game is a toggle in your dashboard; there is no new endpoint and no release on your side.

List games

GET/v1/gamesoperator-api

Query

limit
integeroptional
Page size, 1–200. Defaults to 50.
cursor
stringoptional
The next_cursor from the previous page.
category
stringoptional
Filter by category, e.g. INSTANT or CRASH. Case-insensitive.
provider
stringoptional
Filter by provider name. Case-insensitive, exact match.
q
stringoptional
Substring match on name or slug.
enabled_only
true | falseoptional
Defaults to true: only games enabled for you, and active on the platform. Pass false to see the rest of your catalogue with enabled: false.
bash
curl https://api.casinoapipro.com/v1/games \
  -H "Authorization: Bearer $ACCESS_TOKEN"
json
{
  "data": [
    {
      "id": "0f7c2a1e-5b3d-4c8a-9e11-6d2f8b40c7aa",
      "slug": "mines",
      "name": "Mines",
      "provider": "Casino Api Pro",
      "category": "INSTANT",
      "thumbnail_url": "https://assets.casinoapipro.com/games/mines.80b81d64.svg",
      "rtp": "97.000",
      "volatility": "variable",
      "min_bet": "0.10",
      "max_bet": "50000.00",
      "max_win": "500000.00",
      "currencies": ["GHS"],
      "enabled": true,
      "status": "ACTIVE",
      "is_multiplayer": false
    }
  ],
  "next_cursor": null,
  "has_more": false
}

·There is no count field

The response is a cursor page, not a total. Paginate by following next_cursor while has_more is true; both are always present, and next_cursor is null on the last page. At the catalogue's current size one request is the whole of it, but do not build on that.

Fields worth knowing

id
uuid
Our identifier. This is what arrives as gameId in wallet calls, so store it if you key on it there.
slug
string
Stable human-readable identifier. Use it as game_id when creating a session — that endpoint accepts either.
rtp
decimal string
Theoretical return as a percentage, three decimals, without a percent sign — "97.000" means 97%. Derived from the release’s mathematics, never typed by hand. Null only if unset.
min_bet / max_bet / max_win
decimal string
Your account limits, already applied — not the platform-wide ones. These are the numbers your bets are actually validated against.
enabled
boolean
Whether you may launch it. Always true unless you asked for enabled_only=false.
status
string
The game’s platform-wide state, e.g. ACTIVE. A game can be enabled for you and still be down for maintenance.
volatility
string
Free text, not an enum, and lower case: today the values are low, medium, high, variable and player-chosen. Display it; do not switch on it.
is_multiplayer
boolean
True when one round settles many players at once, as in goal-jet. Shared among your players: each operator flies their own. Affects how rounds appear in reporting.
thumbnail_url
string
Content-hashed and safe to cache forever. The URL changes when the art does. Your own uploaded artwork wins over ours here.

Currencies

Every game accepts every currency your account holds. There is no per-game currency list to be added to, and nothing to ask us for: add a currency under Settings → Business, or PATCH /v1/business, and every game accepts it on the next session.

The currencies field above is therefore your account’s list, not a property of the game — it answers “what can I open a session in”, which is what anyone reading it is asking. Codes are ISO 4217 and validated when you set them, so a typo is refused at that point rather than surfacing later as sessions failing in a currency that does not exist. GET /v1/public/currencies lists every code we accept, with its minor units.

iStake limits follow the currency

A release carries one set of limits. They are restated in the session’s currency and rounded, so a minimum of 0.50 is about 140 rupees or 12,500 dong rather than half a paisa — roughly the same economic bet in every currency. Set your own per-currency limits and yours are used instead; they may narrow the platform’s figures, never widen them.

Fetch one game

GET/v1/games/{gameId}operator-api

Accepts either the slug or the id, and returns exactly the object above — the same fields, no more. For the mathematics of a specific release, see provably fair.

bash
curl https://api.casinoapipro.com/v1/games/mines \
  -H "Authorization: Bearer $ACCESS_TOKEN"

A slug that exists on the platform but is not in your catalogue returns 404 GAME_NOT_FOUND, the same as one that does not exist at all.

The public catalogue

There is also an unauthenticated version, used by our own marketing site. It shows games that are live on the platform, without account-specific limits, and is rate limited by IP.

bash
curl https://api.casinoapipro.com/v1/public/games
json
{
  "count": 5,
  "categories": ["CRASH", "INSTANT"],
  "data": [
    {
      "slug": "goal-jet",
      "name": "Goal Jet",
      "provider": "Casino Api Pro",
      "category": "CRASH",
      "description": "A shared flight every player watches at once…",
      "thumbnail_url": "https://assets.casinoapipro.com/games/goal-jet.613da995.svg",
      "rtp": "97.00%",
      "volatility": "high",
      "min_bet": "0.50",
      "max_bet": "50000.00",
      "currencies": ["GHS", "NGN", "KES", "USD", "EUR"],
      "is_multiplayer": true,
      "tags": ["crash", "multiplayer", "popular"],
      "version": "1.1.0"
    }
  ]
}

!It is a different shape, and not the one to integrate against

The public response is a whole list with a count, not a cursor page. Its rtp carries a percent sign ("97.00%") where the authenticated one does not ("97.000"). It adds description, tags and version, and omits id, max_win, enabled and status. Its limits are the platform defaults, not yours. Build against /v1/games.