Operator platform

Everything around the game,
not just the game.

Anyone can return a random number. What takes the time is everything that has to be true around it — that a bet settles once, that a report run twice gives the same answer, and that a timeout does not cost a player their balance. That is the part we built.

One integration, every game

One REST API

The whole catalogue behind a single integration. Adding a game is a toggle in your dashboard — no new endpoints, no release on your side.

Signed sessions

Launch tokens are short-lived and scoped to one operator, one player and one game. They carry no credential of yours.

Multi-tenant isolation

The tenant is taken from your signed token, never from a request field. There is nothing to get wrong, and nothing to spoof.

Versioned mathematics

Every game release is versioned and each round records the version it ran on. A payout table change is a new release, never an edit.

Decimal strings, always

Amounts cross the wire as strings, never JSON numbers. A rounding difference between your ledger and ours is the one bug that is expensive to unpick later.

Free sandbox

Play money, the same engine, the same idempotency contract. A result you get in test is the result you would have got live.

Settlement that survives a bad afternoon

Every money endpoint is idempotent on an identifier you supply, enforced by a unique database index rather than by application code — so the guarantee holds under concurrency, across processes and across restarts.
js
// The same id every time. That is what makes the retry safe.
for (let attempt = 0; attempt < 5; attempt++) {
  try {
    return await api.post("/v1/transactions/bet", {
      transaction_id: bet.id,        // yours, persisted with the bet
      round_id: bet.roundId,
      player_id: bet.playerId,
      amount: bet.amount,            // "10.00", never 10.0
      currency: bet.currency,
    });
  } catch (err) {
    if (!err.retryable) throw err;   // the API tells you which it is
    await sleep(2 ** attempt * 250);
  }
}
Idempotent on your id
enforced in the database
Send the same transaction_id twice and the money moves once. A replay returns the original result.
Timeouts are recoverable
504, marked retryable
If your wallet does not answer we leave the transaction pending and tell you to retry with the same id — rather than guessing.
Append-only ledger
enforced by a trigger
Entries are never updated or deleted. A correction is a new entry pointing at the old one, so a report run twice returns the same answer.
Resumable cash-out
ACTIVE → SETTLING → WON
A crash cash-out that times out mid-settlement resumes at the same multiplier. A player is never shown a win we then fail to pay.

Provably fair, and checkable

Not a claim on a marketing page — a hash a player can recompute.

The server seed is committed as a SHA-256 hash before any round is played, and revealed when it is rotated. With the revealed seed, a player can recompute every round played under it and confirm we did not choose an outcome after seeing their bet. Revealed seeds are stored append-only.

Server seeds come from the operating system's CSPRNG. Nothing in the engine calls a seeded or time-based generator, and the engine has no access to a balance or a stake when it computes an outcome — the mathematics and the money are separate layers by design.

js
const hash = sha256(`${serverSeed}|${clientSeed}|${nonce}`);

// 13 hex digits = 52 bits, exactly a double's mantissa,
// so this division loses nothing.
const value = parseInt(hash.slice(0, 13), 16) / 2 ** 52;

Operations you can actually run

Signed webhooks

HMAC-SHA256 over the raw body, retried with exponential backoff over roughly 24 hours, idempotent on a stable event id. Failed deliveries are replayable from the dashboard.

Request logs

Every call you made — endpoint, status, timing and request id — searchable in the dashboard. The first stop when production behaves differently from your machine.

Audit log

Who changed what, and when. Credentials, game toggles, limits and account changes are all recorded.

Reporting

Headline figures, per-game performance and daily series, scoped by environment so sandbox never pollutes live numbers.

IP allowlisting

Pin live credentials to a set of source addresses. Requests from anywhere else are refused before the secret is even checked.

Credential rotation

Rotate with an overlap window so you can deploy without downtime, or revoke instantly if something leaks.

The sandbox is the honest demo

It is not a simulator. Rounds are computed by the same versioned engine, with the same fairness commitments, settled through the same idempotent state machine. Sign up and you have credentials before you finish reading this page.