Technology
Technology & integration
This page is about what happens when things break. On a good day every supplier looks the same.
Get credentials
We issue an API key, a signing secret and a sandbox. Keys rotate on demand with no downtime.
Exchange for a token
When a player opens the game, your backend calls launch once with the player id, currency and game code, and receives a single-use token.
Send the player in
Append the token to the game URL. Pure HTML5, no plugins, one build for desktop and mobile.
We call your wallet
Every bet and every payout hits your wallet API in real time with an idempotency key. The money never leaves your system.
Wallet calls have three outcomes, not two
The most commonly mis-implemented part of any wallet integration is filing “don't know” under “failed.”
okConfirmed success
A 200 response with a matching amount. The round proceeds.
rejectedConfirmed rejection
Insufficient funds, locked player, currency mismatch. The player is told, no round is created, no money moved.
unknownOutcome unknown
Timeout, dropped connection, 5xx, unparseable response. You may already have debited. Treating it as failure and retrying double-debits; treating it as success and dealing gives the money away. The round stops as pending and nothing is dealt.
The only safe evidence that a transaction did not happen is your wallet explicitly answering “not found.” Until then the reconciliation worker keeps asking with the same idempotency key.
The life of a round
Settling must be distinct from open: the two mean opposite things to the reconciliation worker. Open means “finish the remaining free spins.” Settling means “retry the credit with the same idempotency key.” Conflate them and a finished round gets dealt a second time.
Idempotency and retries
- Re-sending the same round id replays the original result. It never debits twice.
- Each free spin carries its own idempotency key, so a reconnect never skips or repeats a spin.
- A failed payout is never retried on the original key — that key already holds a failed transaction, so re-sending merely replays the failure. Retries use an incrementing sequence, and only once your wallet explicitly answers “not found.”
What operators get
Back office
Round search, player history, single-round replay, daily reconciliation reports. An operator account sees only its own data — tenant isolation is enforced at the database layer, not by careful queries.
Daily reconciliation
The daily report ends with three preconditions that must all be zero: pending transactions, escalated transactions, unbalanced entries. If any is non-zero, that report is not fit to reconcile against.
Round replay
Given a round id, support can recompute the round and see every spin exactly as the player saw it.
Sandbox
Ships with a mock wallet so you can test timeouts, rejections and duplicate requests on your own schedule.
Data & retention
5-year retention
Rounds and ledger entries are kept for 5 years. The hot window defaults to 13 months; older partitions are archived to compressed files.
Archives are verified
Detach, export, read back and re-hash — and only then drop. Any failure mid-way re-attaches the partition.
Backups are restored
Backups are restored to a scratch database on a schedule and checked against the accounting invariants. An untested backup is not a backup.
Tenant isolation
Row-level security is enforced by the framework; the application's database role has no bypass privilege.
Deployment
Region
Tokyo — the lowest-latency option available for Taiwan and South-East Asia.
Game client
Pure HTML5, no plugins, one build for desktop and mobile. Player traffic served through a CDN.
Operator API
Its own domain, no CDN in front, server-to-server only.
Back office
Its own domain, cross-origin to the game. Same-origin makes strict cross-site request protection impossible to express.
Full documentation
The complete wallet API spec — endpoints, signing, error codes, retry semantics, sandbox — is a separate document. Ask and we'll send it with sandbox credentials.