Skip to content

Testing

The sandbox is the full platform with play money: the demo-embed tenant, the credentials in the Quick start, and a match simulator instead of a live data feed. Point the tenant’s wallet at your test server (in a local stack: SEAMLESS_WALLET_URL_OVERRIDE=https://your-test-wallet.example/wallet) and add your test site’s origin to embedOrigins.

Limit (demo-embed)
Minimum stake 100 (= $1.00) per line
Maximum stake 500,000 (= $5,000)
Maximum payout per bet 50,000,000
In-play acceptance delay 3 seconds

The simulator schedules football, basketball and tennis around the clock and plays them live: goals, cards, scores and clock, with in-play repricing and bet stops. A football match takes about 17 real minutes. When a match ends, its markets are resulted and settled automatically, so a bet placed on a live match reaches your credit endpoint without anyone touching it.

For a local stack, SIM_SPEED (match minutes per real second, default 0.1) and SIM_LIVE_FOOTBALL (simultaneous live matches, default 10) make it faster or busier.

To test settlement at once, use the back office (/admin/, staff login):

  1. Bets shows each bet with its market.
  2. Manual settlement: pick the market, set each outcome to won, lost, void, half won or half lost (or void the whole market), give a reason, and settle. Your wallet receives the credit calls: the payout, the stake for a void bet, 0 for a lost bet.
  3. Settle the same market again with different results to test a resettlement: you receive resettle: credits or debits for the difference.

The same is available to scripts, with a staff token. Market ids contain /: percent-encode them in the path.

POST /api/v1/admin/markets/ev_c59b551c6c42%2F1x2/settle
Authorization: Bearer <staff token>
Content-Type: application/json
{"results": {"ev_c59b551c6c42/1x2/home": "won", "ev_c59b551c6c42/1x2/draw": "lost", "ev_c59b551c6c42/1x2/away": "lost"}, "void": false, "reason": "sandbox test"}
  • Events & markets in the back office suspends a market: the sportsbook shows it locked at once, and bets on it are refused (market_suspended).
  • Jurisdictions (kill switch), for platform admins, closes betting for a whole jurisdiction: the sportsbook shows a banner, the bet slip is disabled and bets are refused (jurisdiction_closed) before any stake is debited. Settlements of earlier bets still reach your wallet.

Run these in the sandbox with your real integration. Keep the request logs.

Sessions and embedding

  • A logged-in player opens the sportsbook and sees your wallet balance.
  • An anonymous visitor browses; Log in to bet opens your login; after login the slip is still there and the bet goes through (set_launch_token).
  • A launch URL opened twice logs in only once.
  • After 60 idle minutes (or after ending the session) the next action triggers session_expired and your onSessionExpired restores it.
  • Logging out of your site logs out of the sportsbook (logout()).
  • The sportsbook refuses to render on a page that is not in embedOrigins.
  • Phone and desktop: sizing mode, bottom-sheet bet slip, deep links, both locales.

Wallet

  • Signature: a valid request passes; a changed body, a wrong secret and a timestamp older than 300 seconds are refused with 401.
  • A stake larger than the balance is refused with insufficient_funds and the player sees why.
  • The same txId sent twice moves money once and gets the same answer.
  • A won bet, a lost bet (credit of 0), a void bet (stake back) and a cash-out.
  • A resettlement that turns a won bet into a lost one: the correction debit is applied even if the balance goes negative.
  • A rollback for a debit you applied returns the money once; a rollback for a debit you never saw is remembered, and the late debit is refused.
  • Your wallet down for two minutes: stakes are refused meanwhile, and every pending credit arrives once it is back.
  • Your daily totals match the back office Reports.