# Beexar documentation
Full text of https://docs.beexar.com. The OpenAPI contract is at
https://docs.beexar.com/api/wallet.yaml, https://docs.beexar.com/api/softswiss/gateway.yaml,
https://docs.beexar.com/api/gateway.yaml and https://docs.beexar.com/api/common/schemas.yaml.
---
# API Reference
Source: https://docs.beexar.com/api-reference/
Description: Interactive OpenAPI documentation for Beexar platform APIs.
import { Card, CardGrid, LinkCard } from '@astrojs/starlight/components';
Beexar provides external APIs for operator integration, documented as interactive OpenAPI (Scalar) references where you can explore endpoints, models, and try requests. Game-launch endpoints are **per integration platform** (e.g. SoftSwiss) — an operator uses the launch API for its own `integration_type`.
## Wallet API
The Wallet API defines 4 HTTP endpoints that Beexar calls on **the operator's server** during gameplay:
| Endpoint | Method | Description |
|----------|--------|-------------|
| `/balance` | POST | Get player balance before showing the game UI |
| `/betwin` | POST | Debit the bet and credit the win in a single atomic request |
| `/rollback` | POST | Reverse previously confirmed transactions |
| `/finish` | POST | Round completion signal (only when not closed by `/betwin`) |
All requests are signed with **HMAC-SHA256** using the operator's API secret (`AUTH_TOKEN`).
[Open Wallet API Reference →](/api-reference/wallet/)
## SoftSwiss Launch API
Game launch is **per integration platform**. SoftSwiss-integrated operators call these endpoints to launch games:
| Endpoint | Method | Description |
|----------|--------|-------------|
| `/api/v1/softswiss/launcher/real` | POST | Launch a real-money game session, returns `launch_url` |
| `/api/v1/softswiss/launcher/demo` | POST | Launch a demo session with virtual balance |
All requests are signed with **HMAC-SHA256** using the operator's API secret (`AUTH_TOKEN`); demo sessions from the frontend send 64 zero characters. An operator may only call the endpoints for its own `integration_type` — calling another platform's launcher returns `403 INTEGRATION_TYPE_MISMATCH`.
[Open SoftSwiss Launch API Reference →](/api-reference/softswiss/)
## Gateway API (base)
The base Gateway API is the platform-agnostic public surface:
| Endpoint | Method | Description |
|----------|--------|-------------|
| `/api/v1/operator/games` | GET | List available games for an operator (public, no auth) |
| `/health` | GET | Service health check |
[Open Gateway API Reference →](/api-reference/gateway/)
---
# AI Design Studio
Source: https://docs.beexar.com/backoffice/ai-design/
Description: Restyle the Dice game with an AI chat assistant or a manual design-token editor.
import { Aside, Steps } from '@astrojs/starlight/components';
The **Design** step of the Dice game editor lets you restyle the game in two ways: chat with the **AI Design Studio**, or fine-tune every token by hand in **Manual mode**. A live preview of the game sits next to both.
Switch between the two modes with the **AI mode / Manual mode** toggle in the top-right of the step.
---
## Before You Start
The Design step works on a saved configuration:
1. Select an operator and pick **Dice** as the game type.
2. Fill in Basic Info and **Save Draft**.
3. Open the **Design** step.
Until a draft is saved, the AI panel shows a reminder to save first.
---
## AI mode
AI mode is a chat assistant. You describe how the game should look — palette, theme, mood, or a reference — and the assistant iterates on the design while you watch the preview update.
1. **Type a prompt** in the message box (e.g. "dark neon theme with purple and cyan, rounded buttons") and send it.
2. **Watch the timeline** — the assistant streams progress and applies changes to the preview.
3. **Keep iterating** — send follow-up prompts to refine. You can either tweak the current look or ask for a brand-new one.
4. **Publish** when you're happy, from the final wizard step.
### Sessions & history
- The first message you send automatically starts a **session**.
- Use **+ New session** to start a fresh conversation (the previous one is kept).
- Use **History** to reopen any previous session for this game and review what was generated.
---
## Manual mode
Manual mode is a full design-token editor for operators who want precise control. It exposes every themeable value of the Dice game, grouped into collapsible sections.
| Group | Examples |
|-------|----------|
| **Colors** | Backgrounds, text, accent, slider, button colors |
| **Radii / Shadows / Sizes / Spacing / Opacity / Motion** | Corner rounding, elevation, dimensions, gaps, transitions |
| **Typography** | Font families for common text and the result display |
| **Assets** | Background and logo image slots |
| **Sounds** | Game sound slots |
Tools in Manual mode:
- **Search** — filter tokens by name (e.g. "background", "button").
- **Overrides (N)** — toggle to show only the tokens you've changed; the counter shows how many differ from the default.
- **Reset** — each changed token has a reset-to-default button; **Reset all** reverts every override at once.
- **Fonts** — pick a built-in font, upload your own, or add a Google font from the font library.
---
# Analytics
Source: https://docs.beexar.com/backoffice/analytics/
Description: How to use the analytics dashboard and reports in the Beexar Backoffice.
import { Aside } from '@astrojs/starlight/components';
## Currency of reports
All analytics and reports are shown in your **organization's settlement currency** (one of USD, EUR, USDT, USDC), chosen when your organization is created. Bets and wins made in other currencies are converted using daily exchange rates, so every total, chart, and report is consistent in a single currency. The current currency is shown as a chip on each analytics screen.
---
## Dashboard
The main **Dashboard** provides a real-time overview of your platform performance. An **Auto-refresh** control (toggle + interval + last-updated time) keeps it live.
### Key Metrics
| Widget | Description |
|--------|-------------|
| **Active Players** | Number of players with active sessions right now |
| **New Players** | Players who started their first session in the selected period |
| **Total GGR** | Gross Gaming Revenue = Total Bets − Total Wins, in your org currency |
| **Total Bets** | Sum of all bet amounts in the period, in your org currency |
| **Unique Players** | Number of distinct players who placed at least one bet |
| **Active Operators** | Number of operators with at least one bet in the period |
### Date Filters
| Filter | Description |
|--------|-------------|
| **Today** | Current day only |
| **7 days** | Last 7 days |
| **30 days** | Last 30 days (default) |
| **Custom** | Pick From and To dates |
### Operator Filter
Select a specific operator to see their metrics only, or choose **All** to see platform-wide stats.
### Charts
| Chart | Description |
|-------|-------------|
| **GGR Trend** | Daily GGR breakdown over the selected period |
| **Top Players** | Players ranked by total bet amount |
| **Top Operators** | Operators ranked by GGR |
| **Hourly Activity** | Bet distribution by hour of day |
| **Game Distribution** | Pie chart of bets by game type |
---
## Analytics Reports
Navigate to **Analytics → Reports** for a detailed pivot-style drill-down report. Filters at the top: **From / To** dates, **Game Type** (multi-select), and **Operator** (multi-select); apply with **Apply**, and export the current view with **CSV**.
### Report Dimensions
Reports support hierarchical grouping by:
| Dimension | Description |
|-----------|-------------|
| **Operator** | Group by operator |
| **Game** | Group by individual game |
| **Game Type** | Group by game category (dice, plinko, slots, crash) |
| **Currency** | Group by currency |
You can **drag and drop** dimensions to change the grouping order. For example:
- `Operator → Game → Currency` — see per-game revenue for each operator, broken down by currency
- `Game Type → Operator` — compare operators across game categories
### Drill-Down
Click on any row to expand it and see the next level of detail. For example:
1. Click on an operator → see their games
2. Click on a game → see the currency breakdown
3. Each level shows total bets, total wins, GGR, and round count
### Currency Conversion
All monetary values are shown in your **organization's currency**. Amounts in other currencies are converted using **daily exchange rates** (per day, then re-aggregated), so the figures reflect real day-to-day FX movement rather than a single snapshot rate.
---
## Player Activity
Navigate to **Analytics → Players** for per-player analytics (with the same Auto-refresh control):
| Column | Description |
|--------|-------------|
| **Player ID** | External player identifier from the operator |
| **Operator** | Which operator the player belongs to |
| **Total Bets** | Number of bets placed by the player |
| **Total Wagered** | Sum wagered, in your org currency |
| **Total Payout** | Sum paid out, in your org currency |
| **GGR** | Player-level GGR (wagered − payout) |
| **Favorite Game** | The player's most-played game |
| **Sessions** | Number of game sessions |
| **Last Active** | When the player was last active |
---
# API Keys & Callback URLs
Source: https://docs.beexar.com/backoffice/api-keys/
Description: How to manage API keys and configure wallet callback URLs.
import { Aside, Steps } from '@astrojs/starlight/components';
## Overview
Each operator has **one API key** that is used for:
- **Authentication** — the key identifies the operator in API calls
- **Request signing** — the secret is used to compute HMAC-SHA256 signatures
The API key and callback URLs are configured in the operator detail page.
---
## Managing the API Key
Navigate to **Operators** → select an operator → **API Keys** tab.
### Creating a Key
1. Click **Create API Key**
2. The system generates an **API Secret** — the HMAC signing secret (`AUTH_TOKEN`), **shown only once!**. It is prefixed with `bxr_` (production) or `dev_` (sandbox/local), followed by a random URL-safe token. There is no separate public key; your operator is identified by its `casino_id` (slug).
3. **Copy the secret immediately** — it will not be displayed again
### Regenerating a Key
If you need a new secret (e.g. it was compromised):
1. Click **Regenerate**
2. A new secret is generated — the old one is immediately invalidated
3. Copy the new secret and update your system
### Deleting a Key
Click **Delete** to remove the API key entirely. The operator will not be able to launch games until a new key is created.
---
## Configuring Callback URLs
Navigate to **Operators** → select an operator → **Callback URLs** tab.
Enter the 4 wallet callback URLs that Beexar will call during gameplay:
| Field | Endpoint | Description |
|-------|----------|-------------|
| **Balance URL** | `POST /balance` | Fetch player balance |
| **BetWin URL** | `POST /betwin` | Debit/credit player account (atomic) |
| **Rollback URL** | `POST /rollback` | Reverse previous transactions |
| **Finish URL** | `POST /finish` | Signal round completion |
1. Enter each URL in the corresponding field
2. Click **Save**
3. The URLs take effect immediately for new game sessions
### Example Configuration
```
Balance URL: https://api.casino.com/beexar/balance
BetWin URL: https://api.casino.com/beexar/betwin
Rollback URL: https://api.casino.com/beexar/rollback
Finish URL: https://api.casino.com/beexar/finish
```
### Requirements
| Requirement | Details |
|-------------|---------|
| **Protocol** | HTTPS required |
| **Availability** | Must be publicly accessible from Beexar servers |
| **Response time** | Should respond within 10 seconds |
---
## Using the API Secret
### In Launch Requests
The API secret signs the request body; the resulting HMAC goes in the `X-REQUEST-SIGN` header:
```bash
BODY='{"casino_id":"your-slug","game":"dice","account":{"id":"player_1","currency":"USD"}}'
SECRET="your_api_secret"
SIGNATURE=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
curl -X POST https://gateway.beexar.com/api/v1/softswiss/launcher/real \
-H "Content-Type: application/json" \
-H "X-REQUEST-SIGN: $SIGNATURE" \
-d "$BODY"
```
### In Wallet Callbacks
Beexar signs every wallet request with the same secret. Your server must validate the `X-REQUEST-SIGN` header:
```javascript
const crypto = require('crypto');
function validateSignature(body, signature, secret) {
const expected = crypto.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
```
See [Authentication](/getting-started/authentication/) for code samples in Go, Python, PHP, and more.
---
# Audit Logs
Source: https://docs.beexar.com/backoffice/audit-logs/
Description: Review changes made in the backoffice.
import { Aside } from '@astrojs/starlight/components';
The **Audit Logs** section records changes made in your organization's backoffice, so you can see who changed what and when.
---
## What's Logged
| Area | Example actions |
|------|-----------------|
| **Operators** | create, update, delete |
| **API keys** | create, regenerate, delete |
| **Game configs** | create, update, delete |
| **Organization** | create, update, delete |
| **Team** | invite, remove, role update |
Each entry is color-coded by action (create, update/regenerate, delete) and can be expanded to see details. Entries are paginated.
---
## Filtering
Narrow the log by:
- **Action** — the type of change (create, update, delete, regenerate, invite, …)
- **Resource type** — what was changed (operator, API key, game config, organization, team member)
---
# Billing
Source: https://docs.beexar.com/backoffice/billing/
Description: View and download your monthly invoices.
import { Aside } from '@astrojs/starlight/components';
Operator organizations have a **Billing** section (**Billing → Invoices**) where you can review and download your monthly invoices. All amounts are shown in your organization's settlement currency.
---
## Invoices List
| Column | Description |
|--------|-------------|
| **Invoice** | Invoice number |
| **Period** | Billing period (start → end) |
| **Status** | Invoice status (see below) |
| **Total** | Amount due, in your org currency |
| **Due** | Due date |
| **Actions** | Download the invoice PDF |
Filter by **Period from / Period to** to narrow the list.
### Downloading a PDF
Use the **Download** action to get the invoice PDF. Invoices with a zero total (or no generated document) have the download disabled, with a tooltip explaining why.
---
## What's on an Invoice
A monthly invoice can include:
- **Platform fees** — your GGR-based commission for the period.
- **Subscriptions** — active paid features (e.g. [custom currencies](/backoffice/subscriptions/)), billed per calendar day they were active in the month.
- **Custom charges** — one-off line items Beexar may add for the period.
---
## Questions about an invoice
If a figure looks wrong or you need a copy re-issued, contact your Beexar account manager — invoice generation, cancellation, and custom charges are managed by Beexar.
---
# Custom Currencies
Source: https://docs.beexar.com/backoffice/currencies/
Description: How to add and manage custom currencies and tokens for your operator.
import { Aside, Steps } from '@astrojs/starlight/components';
## Overview
By default, operators can use standard global currencies (e.g. USD, EUR, USDT, USDC) that are available in Beexar. If your platform uses custom tokens or non-standard currencies, you can add them as **custom currencies** in the backoffice.
Custom currencies use the `CUSTOM_*` prefix internally (e.g. `CUSTOM_GOLD`, `CUSTOM_SHITCOIN`), but are displayed to players **without** the prefix.
---
## Adding a Custom Currency
Navigate to **Operators** → select an operator → **Currencies** tab. (The tab requires an active `custom_currencies` subscription.)
1. Click **Add Currency**
2. Fill in the form:
| Field | Required | Description | Example |
|-------|----------|-------------|---------|
| **Code** | Yes | Currency identifier. Will be prefixed with `CUSTOM_` automatically | `GOLD` → stored as `CUSTOM_GOLD` |
| **Name** | Yes | Display name for the currency | `Gold Coins` |
| **Decimals** | Yes | Number of decimal places (0–16) | `2` for cents, `0` for whole tokens, `8` for crypto |
3. Click **Save**
### Currency Code Rules
| Rule | Details |
|------|---------|
| **Format** | Uppercase letters, digits, and underscores |
| **Raw code length** | 1–25 characters (what you enter, e.g. `GOLD`) |
| **Full code length** | 8–32 characters (with `CUSTOM_` prefix, e.g. `CUSTOM_GOLD`) |
| **Full code pattern** | `^[A-Z][A-Z0-9_]{2,31}$` — same regex for all currencies in the system |
| **Prefix** | `CUSTOM_` is added automatically — don't include it in the code field |
| **Uniqueness** | Must be unique per operator |
### Examples
| You Enter | Stored As | Displayed to Player |
|-----------|-----------|-------------------|
| `GOLD` | `CUSTOM_GOLD` | `GOLD` |
| `SHITCOIN` | `CUSTOM_SHITCOIN` | `SHITCOIN` |
| `VIP_TOKEN` | `CUSTOM_VIP_TOKEN` | `VIP_TOKEN` |
---
## Decimals
The **decimals** field controls how monetary amounts are formatted and displayed:
| Decimals | Example Amount | Use Case |
|----------|---------------|----------|
| `0` | `100` | Whole tokens (coins, gems) |
| `2` | `100.50` | Fiat-like currencies (USD, EUR) |
| `8` | `0.00001234` | Cryptocurrency-like tokens |
| `16` | `0.0000000000000001` | Maximum supported precision |
The decimals value you configure is automatically used across the entire platform — from session creation through game logic to the player-facing UI. All monetary amounts are formatted according to the currency's decimal precision.
---
## Deactivating a Currency
To remove a custom currency:
1. Find the currency in the **Currencies** tab
2. Click the **Deactivate** button
3. Confirm the action
---
## Using Custom Currencies in the API
### Launch Request
When launching a game with a custom currency, use the full `CUSTOM_*` name:
```bash
BODY='{"casino_id":"your-slug","game":"dice","account":{"id":"player_1","currency":"CUSTOM_GOLD"}}'
SIGNATURE=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
curl -X POST https://gateway.beexar.com/api/v1/softswiss/launcher/real \
-H "Content-Type: application/json" \
-H "X-REQUEST-SIGN: $SIGNATURE" \
-d "$BODY"
```
### Wallet Callbacks
Beexar sends the full `CUSTOM_*` currency code in wallet callbacks:
```json
{
"account_id": "player_1",
"currency": "CUSTOM_GOLD",
"game_id": "dice",
"round_id": "550e8400-e29b-41d4-a716-446655440000",
"finished": true,
"transactions": [
{ "id_provider": "tx_1", "type": "bet", "amount": "100" },
{ "id_provider": "tx_2", "type": "win", "amount": "195" }
]
}
```
---
## Currency Validation at Launch
When a game session is launched, Beexar validates that the requested currency is available for the operator:
1. **Global currencies** (USD, EUR, USDT, USDC, etc.) are always available to every operator
2. **Custom currencies** (`CUSTOM_*`) must be added to the operator **and** require an active `custom_currencies` subscription
3. If the currency is not configured, the launch returns an error; if it is a custom currency but the subscription is inactive, the launch returns `403 FEATURE_SUBSCRIPTION_REQUIRED`
This ensures players cannot launch games with currencies that the operator hasn't configured or paid for.
---
## Games List and Currencies
The [Games List API](/game-integration/launch/) (`GET /api/v1/operator/games`) returns available currencies for each game. The currencies are determined by the game's **owner operator**:
- **Global games** (available to all operators) — show global currencies
- **Operator-specific games** — show global currencies plus the owner operator's custom currencies
This allows game aggregators to display which currencies each game supports.
---
# Game Preview
Source: https://docs.beexar.com/backoffice/game-preview/
Description: How to preview and test games using the built-in demo launcher.
import { Aside, Steps } from '@astrojs/starlight/components';
## Overview
The **Game Preview** feature lets you launch a demo version of any game directly from the backoffice. This is useful for:
- Testing a game configuration before publishing it to players
- Verifying visual assets (backgrounds, symbols, sounds)
- Checking game behavior across different device sizes
- Demonstrating games to stakeholders
---
## Launching a Preview
1. Navigate to **Games** in the sidebar
2. Find the game you want to preview
3. Click the **Preview** button (play icon) in the actions column
4. The game opens in a **preview modal** with an embedded iframe
---
## Device Simulation
The preview modal includes device simulation controls:
| Mode | Resolution | Description |
|------|-----------|-------------|
| **Desktop** | 1280×720 | Standard desktop browser |
| **Tablet** | 768×1024 | iPad-like tablet |
| **Mobile** | 375×667 | iPhone-like mobile |
You can also:
- **Rotate** — toggle between portrait and landscape orientation
- **Fullscreen** — expand the preview to fill the browser window
- **Proportional scaling** — the game scales to fit the preview area while maintaining aspect ratio
---
## Demo vs Real Sessions
The preview uses a **demo session** with virtual balance:
| Property | Preview Demo | Real Session |
|----------|-------------|--------------|
| Balance | Virtual (10,000 default) | Real operator wallet |
| Wallet callbacks | None | POST /betwin, /balance, etc. |
| Analytics | Not recorded | Fully recorded |
| TTL | 30 minutes | 30 minutes (sliding) |
---
## Testing Workflow
The recommended workflow for game configuration changes:
1. **Edit** the game configuration in the game editor wizard
2. **Save as Draft** (don't publish yet)
3. **Preview** the draft configuration to verify it looks and plays correctly
4. **Publish** the configuration to make it live for players
5. **Preview** again to confirm the published version
---
# Game Management
Source: https://docs.beexar.com/backoffice/games/
Description: How to create, configure, and publish games in the Beexar Backoffice.
import { Aside, Steps } from '@astrojs/starlight/components';
## Overview
The **Games** section lets you create and manage game configurations. A configuration is a per-operator instance of a game (Dice, Plinko, Slots, or Crash) with its own:
- **Basic info** — name, slug, description
- **Game parameters** — bet limits, RTP / house edge, and game-specific mechanics
- **Layout** — the on-screen arrangement of game elements
- **Visual design** — backgrounds, symbols, logo, fonts, colors, sounds (Dice has its own [AI / manual design step](/backoffice/ai-design/))
---
## Games List
Open **Games** in the sidebar. At the top, pick an operator from the **Select Operator** dropdown to see that operator's configurations.
| Column | Description |
|--------|-------------|
| **Game Name** | Display name of the configuration |
| **Operator** | Which operator owns this configuration |
| **Slug** | Game slug used in the launch API |
| **Type** | Game type: Slots, Dice, Plinko, Crash |
| **Status** | `Draft`, `Active`, or `Archived` |
| **Version** | Configuration version (`vN`) |
| **Created** | Creation date |
Use the status tabs (**All / Draft / Active / Archived**) to filter.
### Row Actions
| Action | Description |
|--------|-------------|
| **Edit** | Open the game editor wizard |
| **Preview** | Launch a demo preview in an iframe (see [Game Preview](/backoffice/game-preview/)) |
| **Version history** | View previous versions and roll back |
| **Global / Private** toggle | (Platform admin only) make a game available to all operators or just the owner |
The header **Create Game** button starts a new configuration.
---
## Creating a Game
**Create Game** opens a multi-step wizard. The steps adapt to the game type. The footer always has **Back**, **Save Draft**, and **Next** (or **Publish Game** / **Update Game** on the last step).
1. **Operator** — choose which operator owns this configuration. (Skipped when editing.)
2. **Basic Info** — **Game Name**, **URL Slug** (auto-generated from the name), and an optional **Description**.
3. **Configuration** — first pick the **Game Type** (Slots / Dice / Plinko / Crash). After creation the type is **locked** (shown as a read-only badge) because changing it would invalidate the saved design and history. Then set the game-specific parameters — see [Game Parameters](#game-parameters).
4. **Layout** — choose how game elements are arranged on screen. Crash auto-selects its fixed Aviator-style layout (bets left, game center, chat right).
5. **Visual Editor** *(Slots, Plinko, Crash)* — upload assets and tune colors with a live preview. Dice replaces this with a dedicated **Design** step ([AI Design Studio](/backoffice/ai-design/) + manual token editor).
6. **Preview & Publish** — review everything, then **Publish Game** (or **Update Game** when editing).
---
## Game Parameters
### Dice
Dice is configured around a single **RTP** value (the roll range and bet-window limits are derived from it — see the [Dice game page](/games/dice/)).
| Setting | Description | Default |
|---------|-------------|---------|
| **Game Mode** | **Classic** (single target, over/under) or **Range** (two handles, inside/outside) | Range |
| **RTP** | Return-to-player, slider 80%–99% | 96% |
| **Bet Limits** | Min / Max bet | Configurable |
The configurator shows the **Theoretical RTP**, the derived **House Edge**, and a **Derived limits** panel (max/min multiplier, widest player bet, chance range) computed from `maxWindow = floor(RTP × 10000) − 100`. The backend re-validates this exact formula on every bet.
### Plinko
Plinko currently uses the platform **default configuration** — there are no editable parameters in the configurator. (Rows and risk levels are chosen by the player in-game; see the [Plinko game page](/games/plinko/).)
### Slots
You can start from a **preset** (Preset Selector) and then adjust manually:
| Setting | Description |
|---------|-------------|
| **Grid Size** | Reels (3–7) and Rows (1–5) |
| **Paylines** | Active paylines (1–50) |
| **Bet Limits** | Min / Max bet |
| **Free Spins** | Enable + Trigger Count (2–5), Spins Awarded, Multiplier, optional retrigger + Max Retriggers |
| **Cascade Wins** | Enable + Start / Increment / Max multiplier, Reset on no win |
| **Bonus Game** | Enable + type (**Pick Game** / **Wheel**), Trigger Count, prize values + weights |
| **Symbols** | Per-symbol editor (high1–3, low1–3, wild, scatter): payouts and weights |
An **RTP Calculator** continuously shows the theoretical RTP from your symbol weights, paylines, and features.
### Crash
| Setting | Description | Default |
|---------|-------------|---------|
| **House Edge** | Slider 1%–10% (RTP = 100% − house edge) | 3% |
| **Bet Limits** | Min / Max bet | Configurable |
---
## Visual Editor & Assets
The **Visual Editor** step has a tabbed asset panel on the left and a live preview on the right. Drag an image onto the preview to set it.
### Slots tabs
| Tab | What you set |
|-----|--------------|
| **Background** | Game background (1920×1080 recommended) |
| **Symbols** | high1–3, low1–3, wild, scatter |
| **Buttons** | spin, bet up, bet down, autoplay, menu |
| **Logo** | Game logo (PNG with transparency) |
| **Fonts** | Built-in, uploaded, or Google fonts |
### Crash tabs
| Tab | What you set |
|-----|--------------|
| **Background** | Game background |
| **Game Object** | Rocket / plane sprite (PNG with transparency) |
| **Colors** | Color scheme (Primary / Secondary / Accent / Background / Text), Multiplier Display (font size + glow color), Chat Panel (background / text / border) |
| **Sounds** | Takeoff, crash, cashout, background music |
| **Logo** | Game logo |
| **Fonts** | Built-in, uploaded, or Google fonts |
Uploaded assets are stored per operator and served to players from the Beexar CDN (`cdn.beexar.com`).
---
## Versioning
Each publish creates a new **version**. From the games list you can open **Version history** to review previous versions and **roll back** to one. The editor shows a "Version N → N+1" indicator when you edit a published configuration.
---
## Game Visibility
| Type | Visibility | Set by |
|------|-----------|--------|
| **Global** | Available to all operators | Platform admin |
| **Operator-specific** | Only the owning operator | Organization admin |
Global games appear for every operator; operator-specific games only for their owner.
---
## Games List API
Operators can retrieve their available games via the public Gateway endpoint (no auth):
```
GET {GATEWAY_URL}/api/v1/operator/games?operator={slug}
```
The response lists each game with `title`, `identifier` (slug), `category` (dice/plinko/slots/crash), `payout` (RTP %), `volatility_rating`, `currencies`, `thumbnail`, and `demo_available`.
---
# Managing Operators
Source: https://docs.beexar.com/backoffice/operators/
Description: How to create and manage operators in the Beexar Backoffice.
import { Aside, Steps } from '@astrojs/starlight/components';
## What Is an Operator?
An operator represents a casino or gaming platform that integrates with Beexar. Each operator has:
- A unique **slug** (used in game URLs and API calls as `casino_id`)
- An **API key** for authentication
- **Callback URLs** for wallet integration
- **Custom currencies** (optional)
- **Game configurations** assigned to them
---
## Operators List
Navigate to **Operators** in the sidebar to see all operators in your organization. The table shows:
| Column | Description |
|--------|-------------|
| **Name** | Operator display name |
| **Slug** | Unique identifier (used as `casino_id` in the API) |
| **Project URL** | Operator's website URL |
| **Status** | `Active`, `Pending Review`, or `Suspended` |
| **Created** | Creation date |
---
## Creating an Operator
1. Click **Create New Operator**
2. Fill in the form:
| Field | Required | Description |
|-------|----------|-------------|
| **Operator Name** | Yes | Display name (e.g. "Lucky Casino") |
| **Project URL** | Yes | Operator's website URL (`http(s)://…`) |
3. Click **Create**
The **slug** is generated automatically from the name (you don't enter it). It is permanent once created.
---
## Operator Detail Page
Click on an operator name or the view icon to open the detail page. It has the following tabs:
| Tab | Description | See |
|-----|-------------|-----|
| **Analytics** | Operator-specific analytics *(coming soon)* | [Analytics](/backoffice/analytics/) |
| **API Keys** | Manage the API key and secret | [API Keys](/backoffice/api-keys/) |
| **Callback URLs** | Configure wallet callback endpoints | [API Keys](/backoffice/api-keys/) |
| **Branding** | Operator logo and branding assets *(coming soon)* | — |
| **Currencies** | Manage custom currencies (paid add-on) | [Currencies](/backoffice/currencies/) |
| **Paid Features** | View activated paid features (read-only) | [Paid Features](/backoffice/subscriptions/) |
The header also shows the operator's status, copyable slug, Project URL, and (if set) commission rate. The **Edit** button changes the name and Project URL (the slug stays fixed).
---
## Operator Statuses
| Status | Meaning | Can Launch Games? |
|--------|---------|-------------------|
| **Pending Review** | Newly created, awaiting activation | No |
| **Active** | Fully operational | Yes |
| **Suspended** | Temporarily disabled by platform admin | No |
---
## Operator Slug in the API
The operator slug is used as `casino_id` in all API calls:
```bash
# Launch a game for this operator
curl -X POST https://gateway.beexar.com/api/v1/softswiss/launcher/real \
-H "Content-Type: application/json" \
-H "X-REQUEST-SIGN: ..." \
-d '{"casino_id": "lucky-casino", "game": "dice", "account": {"id": "player_1", "currency": "USD"}}'
```
It also appears in game URLs:
```
https://games.beexar.com/dice/lucky-casino/dice-game?token=...
```
---
# Organization
Source: https://docs.beexar.com/backoffice/organization/
Description: Your organization, its settlement currency, and organization types.
import { Aside } from '@astrojs/starlight/components';
Everything in the backoffice belongs to an **organization** — your account. An organization owns its operators, games, team members, reports, and invoices.
---
## Settlement Currency
Each organization has a single **settlement currency** — one of **USD, EUR, USDT, USDC** — chosen when the organization is created. It is the currency used for **all** money in the backoffice:
- Dashboard and report totals
- Per-player figures
- Invoices and paid-feature charges
Bets and wins placed in other currencies are converted to your settlement currency using exchange rates, so all reporting stays in one consistent currency.
---
## Organization Types
| Type | What they do | Cabinet |
|------|--------------|---------|
| **Operator** (casino brand) | Run games for players, integrate the wallet API | Operators, Games, Analytics, Billing, Team |
| **Partner** (affiliate) | Earn commission on linked operators | [Partner cabinet](/backoffice/partner/) (Dashboard, Attached Operators, Earnings) |
---
## Provisioning
In **production**, organizations and operators are provisioned by Beexar. Your account manager creates your organization (with its settlement currency) and your first operator, then gives you login access. Within your organization, owners can [invite team members](/backoffice/team/) themselves.
---
# Backoffice Overview
Source: https://docs.beexar.com/backoffice/overview/
Description: Introduction to the Beexar Backoffice — the management panel for operators.
import { Aside, Steps } from '@astrojs/starlight/components';
## What Is the Beexar Backoffice?
The Beexar Backoffice is a web-based management panel where operators configure their integration, manage games, set up custom currencies, and monitor analytics. It is available at your organization's backoffice URL (e.g. `https://app.beexar.com`).
---
## Main Sections
| Section | Description | Who Uses It |
|---------|-------------|-------------|
| **Dashboard** | Real-time overview: GGR, total bets, active players, operator stats | All users |
| **Analytics** | Reports with drill-down by operator, game, game type, currency, plus per-player activity | All users |
| **Operators** | Manage operators, API keys, callback URLs, custom currencies, paid features | Organization admins |
| **Games** | Create, configure, and publish game configurations | Organization admins |
| **Team** | Invite members and manage roles | Organization owners |
| **Billing** | View and download your invoices | Operator organizations |
| **Audit Logs** | Track changes: operator updates, API key operations, game config changes, team changes | All users |
Affiliate (partner) organizations get a dedicated **Partner** cabinet (Dashboard, Attached Operators, Earnings) instead of Operators/Games — see [Partners](/backoffice/partner/).
---
## Getting Access
Your Beexar account manager provides:
1. **Backoffice URL** — the web address for your organization's backoffice
2. **Login credentials** — email and password for your account
3. **Role assignment** — your role determines what you can access
### Roles
| Role | Permissions |
|------|------------|
| **Owner** | Full access: manage operators, games, team, billing |
| **Game Manager** | Manage games and game configurations |
| **Billing** | View analytics and financial reports |
| **Viewer** | Read-only access to all sections |
---
## Quick Navigation
- **[Managing Operators](/backoffice/operators/)** — create operators, configure settings
- **[API Keys & Callbacks](/backoffice/api-keys/)** — set up authentication and wallet callback URLs
- **[Custom Currencies](/backoffice/currencies/)** — add custom tokens (paid add-on)
- **[Game Management](/backoffice/games/)** — create, configure, and publish games
- **[AI Design Studio](/backoffice/ai-design/)** — restyle the Dice game with AI or manual tokens
- **[Game Preview](/backoffice/game-preview/)** — test games with the demo preview feature
- **[Analytics](/backoffice/analytics/)** — monitor performance, GGR, player activity
- **[Billing](/backoffice/billing/)** — view and download invoices
- **[Paid Features](/backoffice/subscriptions/)** — see which add-ons are active
- **[Team & Access](/backoffice/team/)** — invite members and manage roles
- **[Audit Logs](/backoffice/audit-logs/)** — review changes made in the backoffice
- **[Organization](/backoffice/organization/)** — your org, settlement currency, partners
---
# Partners
Source: https://docs.beexar.com/backoffice/partner/
Description: The partner (affiliate) cabinet — dashboard, attached operators, and earnings.
import { Aside } from '@astrojs/starlight/components';
A **partner** earns commission on the operators it is linked to. Partner organizations get a dedicated cabinet with three screens. All amounts are shown in your organization's settlement currency.
---
## Dashboard
A date-filtered overview of your performance, with KPI cards:
| Card | Description |
|------|-------------|
| **Total GGR** | Gross gaming revenue across your active operators |
| **Turnover (bets)** | Total amount wagered |
| **Wins paid out** | Total amount paid to players |
| **Partner Earnings** | Your commission across active operators |
A **per-currency breakdown** table shows Bets, Wins, and GGR by currency.
---
## Attached Operators
The operators linked to you, with the link's status and active window:
| Column | Description |
|--------|-------------|
| **Operator Organization** | The linked operator |
| **Slug** | Operator slug |
| **Active** | Whether the link is currently active |
| **Since / Until** | The link's active period |
---
## Earnings
A per-operator breakdown of what you earned:
| Column | Description |
|--------|-------------|
| **Operator** | The operator |
| **Commission Rate** | Your agreed rate |
| **GGR** | Operator GGR in the period, in your org currency |
| **Earnings** | Your commission, in your org currency |
---
# Paid Features
Source: https://docs.beexar.com/backoffice/subscriptions/
Description: Optional paid add-ons activated per operator.
import { Aside } from '@astrojs/starlight/components';
Some Beexar capabilities are **paid features** (add-ons) enabled per operator. You can see which features are active for an operator on the **Paid Features** tab of the operator detail page.
| Feature | What it unlocks |
|---------|-----------------|
| **Custom currencies** | Add operator-specific `CUSTOM_*` currencies — see [Custom Currencies](/backoffice/currencies/) |
---
## Viewing active features
Open **Operators → select an operator → Paid Features**. The table is **read-only** and shows each supported feature, its status, and the agreed amount.
---
## How a paid feature affects gameplay
A feature must be **active** for the capability to work at runtime. For example, with **custom currencies**:
- While active, players can launch games in your custom currencies.
- If it is not active, launching a game with a custom currency returns `403 FEATURE_SUBSCRIPTION_REQUIRED`. Global currencies (USD, EUR, USDT, USDC) are always available regardless of subscriptions.
---
## Billing
Active features are billed on your monthly [invoice](/backoffice/billing/), prorated by the number of calendar days the feature was active during the month. The charge is in your organization's settlement currency.
---
# Team & Access
Source: https://docs.beexar.com/backoffice/team/
Description: Invite team members and manage their roles.
import { Aside, Steps } from '@astrojs/starlight/components';
The **Team** section (**Team Management**) lets you manage who has access to your organization's backoffice and what they can do.
---
## Members List
| Column | Description |
|--------|-------------|
| **Email** | Member's login email |
| **Full Name** | Member's name |
| **Role** | Their role (see below) |
| **Created** | When they were added |
| **Last Login** | Last sign-in time |
| **Actions** | Edit role or remove the member |
Your own row is marked with a **You** chip.
---
## Inviting a Member
1. Click **Invite** (or the add-member action).
2. Enter the member's **Email**, **Full name**, and **Role**.
3. Submit — the member is added to your organization.
You can change a member's **Role** later, or **remove** them entirely.
---
## Roles
| Role | Permissions |
|------|------------|
| **Owner** | Full access: operators, games, team, billing |
| **Game Manager** | Manage games and game configurations |
| **Billing** | View analytics and financial reports |
| **Viewer** | Read-only access |
---
# Frontend Integration
Source: https://docs.beexar.com/game-integration/frontend/
Description: CSP, responsive design, and iframe configuration.
import { Aside } from '@astrojs/starlight/components';
## Iframe Configuration
Beexar games are embedded in your platform using standard HTML iframes. The `launch_url` from the [launch response](/game-integration/launch/) is used as the iframe `src`.
### Recommended Attributes
```html
```
| Attribute | Value | Purpose |
|-----------|-------|---------|
| `src` | `launch_url` from launch | Game URL with session token |
| `allow` | `autoplay` | Enable game audio/animations |
| `sandbox` | `allow-scripts allow-same-origin allow-popups` | Security sandboxing |
| `title` | Game name | Accessibility |
---
## Content Security Policy (CSP)
If your site uses a Content Security Policy, you must allow Beexar game domains in your CSP headers:
```http
Content-Security-Policy:
frame-src https://games.beexar.com;
connect-src https://games.beexar.com https://gateway.beexar.com;
```
| Directive | Domain | Purpose |
|-----------|--------|---------|
| `frame-src` | `https://games.beexar.com` | Allow game iframes |
| `connect-src` | `https://games.beexar.com` | Allow game API requests |
| `connect-src` | `https://gateway.beexar.com` | Allow gateway requests |
---
## Responsive Design
Beexar games are responsive and adapt to the container size. For the best experience:
### Desktop Layout
```css
.game-container {
width: 100%;
max-width: 1280px;
height: 720px;
margin: 0 auto;
}
.game-container iframe {
width: 100%;
height: 100%;
border: none;
}
```
### Full-Screen Layout
```css
.game-container {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
}
.game-container iframe {
width: 100%;
height: 100%;
border: none;
}
```
### Mobile Layout
On mobile, games are best displayed in landscape orientation at full viewport width:
```css
@media (max-width: 768px) {
.game-container {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
}
}
```
---
## Game Dimensions
| Game | Aspect Ratio | Min Width | Recommended |
|------|-------------|-----------|-------------|
| Dice | 16:9 | 320px | 1280x720 |
| Plinko | 16:9 | 320px | 1280x720 |
| Slots | 16:9 | 320px | 1280x720 |
| Crash | 16:9 | 320px | 1280x720 |
All games scale down gracefully to mobile viewport sizes.
---
## Return URL
When the player finishes playing, the game redirects to the `return_url` configured during launch:
1. Player clicks "Back to Lobby" in the game
2. Game redirects to `return_url`
3. Your platform's lobby page loads
If no `return_url` is provided, the game shows a "Session ended" message.
---
## Troubleshooting
| Issue | Cause | Solution |
|-------|-------|---------|
| Game shows blank | CSP blocking iframe | Add `games.beexar.com` to `frame-src` |
| No audio | Missing `allow="autoplay"` | Add `autoplay` to iframe `allow` attribute |
| Game too small on mobile | Container not full-width | Use `100vw` / `100vh` on mobile |
| CORS errors in console | Missing CSP `connect-src` | Add gateway domain to `connect-src` |
| "Session expired" message | Token expired | Create a new session via launch API |
---
# Game Launch
Source: https://docs.beexar.com/game-integration/launch/
Description: How to create a game session and embed the game.
import { Aside, Badge, Steps } from '@astrojs/starlight/components';
Beexar provides two launch endpoints: one for real-money sessions and one for demo sessions with virtual balance.
---
## Real-Money Launch
`POST {GATEWAY_URL}/api/v1/softswiss/launcher/real`
### Headers
| Header | Value |
|--------|-------|
| `Content-Type` | `application/json` |
| `X-REQUEST-SIGN` | HMAC-SHA256 signature of the request body (64 hex chars) |
### Body
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `casino_id` | string | Yes | Operator slug (e.g. `"casinoxyz"`) |
| `game` | string | Yes | Game slug (e.g. `"dice"`, `"slots"`, `"crash"`) |
| `account` | object | Yes | Player account details |
| `account.id` | string | Yes | Player ID on your side (max 255 chars) |
| `account.currency` | string | Yes | Currency code (e.g. `"USD"`, `"EUR"`, or custom `"CUSTOM_TOKEN"`) |
| `account.nickname` | string | No | Player nickname (may be displayed in multiplayer games) |
| `account.country` | string | No | ISO 3166-1 alpha-2 country code |
| `locale` | string | No | UI language (default: `"en"`) |
| `ip` | string | No | Player IP address (IPv4 or IPv6) |
| `client_type` | string | No | `"desktop"` or `"mobile"` |
| `urls.return_url` | string | No | URL to redirect player after game |
| `urls.deposit_url` | string | No | URL for player to make a deposit |
| `jurisdiction` | string | No | Country code for regulatory restrictions (e.g. `"DE"`, `"CA-ON"`) |
| `session_id` | string | No | Your session identifier (UUID) for round tracking |
| `session_payload` | string | No | Opaque string (max 4096 chars) echoed back in every wallet callback |
### Example
```json
{
"casino_id": "casinoxyz",
"game": "dice",
"account": {
"id": "player_123",
"currency": "USD",
"nickname": "LuckyPlayer"
},
"locale": "en",
"client_type": "desktop",
"urls": {
"return_url": "https://casino.example.com/lobby",
"deposit_url": "https://casino.example.com/deposit"
}
}
```
### Response (200 OK)
```json
{
"launch_url": "https://games.beexar.com/dice/casinoxyz/dice-game?token=a1b2c3d4e5f6..."
}
```
| Field | Type | Description |
|-------|------|-------------|
| `launch_url` | string | Full URL to launch the game (embed in iframe or redirect) |
---
## Demo Launch
`POST {GATEWAY_URL}/api/v1/softswiss/launcher/demo`
Demo sessions use a virtual balance stored in Beexar — no wallet callbacks are triggered during demo play.
### Two Modes
| Mode | Authentication | Use Case |
|------|---------------|----------|
| **Operator mode** | `X-REQUEST-SIGN` with real HMAC signature | Casino backend launches demo for a known player |
| **Frontend mode** | `X-REQUEST-SIGN: 0000...0000` (64 zeros) | Game lobby or website launches anonymous demo |
### Body
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `casino_id` | string | Yes | Operator slug |
| `game` | string | Yes | Game slug |
| `currency` | string | No | Currency for virtual balance (default: `"USD"`) |
| `balance` | string | No | Initial virtual balance (default: `"10000"`) |
| `player_id` | string | No | Anonymous player ID (for frontend mode, stored in localStorage) |
| `locale` | string | No | UI language |
### Example (Operator Mode)
```json
{
"casino_id": "casinoxyz",
"game": "slots",
"currency": "USD",
"balance": "5000"
}
```
### Example (Frontend Mode)
```bash
curl -X POST https://gateway.beexar.com/api/v1/softswiss/launcher/demo \
-H "Content-Type: application/json" \
-H "X-REQUEST-SIGN: 0000000000000000000000000000000000000000000000000000000000000000" \
-d '{
"casino_id": "casinoxyz",
"game": "dice",
"player_id": "anon_abc123"
}'
```
### Response (200 OK)
```json
{
"launch_url": "https://games.beexar.com/dice/casinoxyz/dice-game/demo?token=demo_a1b2c3...&balance=10000¤cy=USD"
}
```
---
## Error Responses
Both endpoints answer with the SoftSwiss Twirp envelope. Only **two** values ever
appear in `code` — `invalid_argument` and `internal` — and the specific meaning is
carried by `meta.api_code`. Branch on `meta.api_code`, never on `code`.
| HTTP | `code` | `meta.api_code` | Meaning |
|------|--------|-----------------|---------|
| 403 | `invalid_argument` | `403` | Invalid request signature |
| 400 | `invalid_argument` | `400` | Malformed body or schema validation failure — `meta.api_message` names the offending field |
| 400 | `invalid_argument` | `404` | `casino_id` not found, or it does not match the operator |
| 400 | `invalid_argument` | `405` | Game is not available to your casino |
| 400 | `invalid_argument` | `410` | Casino is disabled |
| 400 | `invalid_argument` | `420` | This endpoint is not available for the operator's integration type |
| 400 | `invalid_argument` | `154` | Currency not allowed — also returned when the currency needs an active feature subscription, or when bet limits are not configured for it. See [Custom Currencies](/backoffice/currencies/) |
| 500 | `internal` | `500` | Internal error, or a temporarily unavailable game-availability check. Retryable |
```json
{
"code": "invalid_argument",
"msg": "invalid request signature",
"meta": {
"api_code": "403",
"api_message": "invalid request signature"
}
}
```
---
## Embedding the Game
### Desktop: iframe
```html
```
### Mobile: Redirect
For mobile browsers, redirect the player directly to the `launch_url`:
```javascript
if (isMobile()) {
window.location.href = launchUrl;
} else {
document.getElementById('game-frame').src = launchUrl;
}
```
| Device | Strategy | Implementation |
|--------|----------|---------------|
| Desktop | iframe | Embed `launch_url` in `