Tournaments
Partner tournaments integration guide
Tournaments run on Slots Launch. You fund prize pools, create events, register your logged-in players, and embed play in an iframe. Players never leave your UX for the game UI; scoring and payouts are handled by Slots Launch with a 5% fee, or handled on your end with a monthly fee.
A Neptune or higher plan is required
Base URL: https://slotslaunch.com/api
Money units: All partner API amounts are USD dollars (e.g. 100 = $100.00 , up to 2 decimals).
Two ways to work
You do not need to implement every API endpoint. Launch Pad already covers funding, branding, tournament CRUD, and day-to-day ops.
| Concern | Launch Pad (no code) | Partner API |
|---|---|---|
| Fund prize pools (USDC / bank) | Tournaments → Wallet | Optional |
| Prize label, embed color, crypto sender wallet | Tournaments → Settings | Optional |
| Tournament API secret (HMAC) | Tournaments → Settings (also on Manage Websites) | — |
| Overview / list of your tournaments | Tournaments | Optional (GET ) |
| Create / edit / activate / delete tournaments | Tournaments (Create / Edit / Activate) | Optional |
| Register players, launch play, rebuy | — | Required |
| Public leaderboard on your site | — | Recommended |
| Player wallet, history, withdrawals | — | Optional (if you expose a player wallet UI) |
Recommended split for most customers
- Use Launch Pad for wallet, settings, and creating/activating tournaments.
- Call the API only for the player play flow (register → bootstrap → iframe).
- Add leaderboard / player wallet endpoints only if your product needs them.
Prerequisites
- A Slots Launch account (Launch Pad → Tournaments is available to every account).
- At least one website registered under Launch Pad → API Token / Manage Websites. The site hostname must match the
Originyou send on API calls (withoutwww.). - Your site license token (same token used for the games embed API).
- Your site tournament API secret (Launch Pad → Tournaments → Settings). Keep it server-side only.
Launch Pad screens
| Path | Purpose |
|---|---|
/launch-pad/tournaments |
Stats, list, activate / delete |
/launch-pad/tournaments/create |
Create a draft tournament |
/launch-pad/tournaments/{id}/edit |
Edit a draft |
/launch-pad/tournaments/wallet |
Balance, USDC / bank deposits, ledger |
/launch-pad/tournaments/settings |
Prize label, crypto sender wallet, embed color, tournament secret |
Authentication
Every partner request needs:
- Query parameter:
token= your site license token. - Header:
Originmust match the registered site hostname (Site.name, withoutwww.).
Player actions that mutate state (register, rebuy, bootstrap, wallet, withdrawals) also require an HMAC-SHA256 signature using your API secret (Launch Pad → API / Tournaments → Settings; column tournament_api_secret ). The same secret signs iframe URLs and X-SL-* API headers. Signatures expire in about ±5 minutes.
Never put the tournament secret in frontend JavaScript. Always sign on your backend using the currently logged-in user’s stable id as external_id .
Minimal integration (what you must build)
1. Create and activate tournaments (Launch Pad preferred)
In Launch Pad → Tournaments:
- Fund your wallet (Tournaments → Wallet).
- Create tournament — pick website, eligible game, dates, spins, prize pool, entry/rebuy settings.
- Save as draft, then Activate (locks the prize pool from your balance).
Only games already used in a Slots Launch platform tournament are eligible (same list as the API).
You can still manage tournaments via API if you prefer automation:
1b. Create and activate via API (optional)
Only games already used in a Slots Launch platform tournament are eligible.
GET /api/partner/tournaments/eligible-games?token=YOUR_TOKEN&per_page=50&q=&provider_id=
Then:
POST /api/partner/tournaments?token=YOUR_TOKEN Content-Type: application/json Origin: https://your-site.com
{
"name": "Weekly Sweet Bonanza",
"description": "Optional",
"game_id": 12345,
"provider_id": 67,
"start_date": "2026-04-14T00:00:00Z",
"end_date": "2026-04-21T00:00:00Z",
"duration_type": "weekly",
"bet_level_type": "fixed",
"bet_level": 1,
"total_spins": 50,
"total_prize": 1000,
"entry_fee": 0,
"rebuy_type": "unlimited",
"rebuy_cost": 0
}
Tournaments are created as draft . Fund the prize pool in Launch Pad → Wallet (balance must cover total_prize ), then:
POST /api/partner/tournaments/{id}/activate?token=YOUR_TOKEN
Activation locks the prize by debiting your partner balance.
| Method | Path | Notes |
|---|---|---|
| GET | /partner/tournaments |
List (optional status , per_page ) |
| GET | /partner/tournaments/{id} |
Detail |
| PATCH | /partner/tournaments/{id} |
Draft only — send a full payload |
| DELETE | /partner/tournaments/{id} |
Only if not started yet |
| POST | /partner/tournaments/{id}/activate |
Go live |
Create / update fields
| Field | Required | Notes |
|---|---|---|
name |
yes | Max 255 |
description |
no |
|
game_id |
yes | Must be in eligible games |
provider_id |
yes | Same provider_id as the chosen eligible game |
start_date , end_date |
yes | end_date after start_date |
duration_type |
no | daily , weekly , monthly (default weekly ) |
bet_level_type |
yes | fixed , free , or max |
bet_level |
conditional | Required > 0 when fixed or max |
total_spins |
yes | Integer ≥ 1 |
total_prize |
yes | USD ≥ 0.01 |
entry_fee |
no | USD ≥ 0 ; default 0 |
rebuy_type |
yes | unlimited , once_per_day , or manual |
max_rebuys |
conditional | When rebuy_type is manual |
rebuy_cost |
no | USD ≥ 0 ; default 0 |
Prize display labels are site-wide (Launch Pad → Settings), not per tournament.
2. Register a player (server-side)
When your logged-in user joins:
POST /api/partner/tournaments/{id}/register-player?token=YOUR_TOKEN
{
"external_id": "user-42",
"display_name": "LuckyLuna",
"timestamp": 1710000000,
"signature": "…",
"country": "US"
}
external_id— stable id of your user (string). Never take this from an untrusted browser field; use the session user.country— optional ISO 3166-1 alpha-2 (recommended for geo checks).timestamp— Unix seconds.
Canonical string (register / rebuy):
{external_id}\n{timestamp}\n{tournament_id}
Signature: HMAC-SHA256 of that string with tournament_api_secret , lowercase hex.
Examples
PHP
$canonical = "{$externalId}\n{$timestamp}\n{$tournamentId}";
$signature = hash_hmac('sha256', $canonical, $tournamentApiSecret);
Node.js
import crypto from 'crypto';
const canonical = `${externalId}\n${timestamp}\n${tournamentId}`;
const signature = crypto
.createHmac('sha256', tournamentApiSecret)
.update(canonical)
.digest('hex');
Python
import hmac, hashlib
canonical = f"{external_id}\n{timestamp}\n{tournament_id}"
signature = hmac.new(
tournament_api_secret.encode(),
canonical.encode(),
hashlib.sha256,
).hexdigest()
3. Bootstrap play and embed the iframe
POST /api/partner/tournaments/player-bootstrap?token=YOUR_TOKEN
{
"tournament_id": 123,
"external_id": "user-42",
"display_name": "LuckyLuna",
"timestamp": 1710000000,
"signature": "…"
}
Canonical string:
{external_id}\n{display_name}\n{timestamp}\n{tournament_id}
Use an empty string for display_name if unknown (still include the newline).
Response:
{
"launch_token": "...",
"launch_url": "https://slotslaunch.com/embed/tournaments/123/play?lt=..."
}
Embed launch_url in an iframe on your site. The launch token is one-time and short-lived. The player must already be registered.
Keep the iframe. Do not open launch_url as a top-level page for Safari/iOS. Scoring inside the embed does not need third-party cookies, so Safari, iOS, Brave, and Chrome Incognito record points. You do not send any extra headers or tokens.
If the player rebuys inside the embed, the iframe reloads play with a new launch token — no extra API call from you. If your backend calls rebuy-player , call player-bootstrap again and replace the iframe src with the new launch_url .
4. Rebuy (when your product offers it)
POST /api/partner/tournaments/{id}/rebuy-player?token=YOUR_TOKEN
Same signed fields as register (display_name optional). Same canonical string as register/rebuy.
Recommended: leaderboard on your site
No HMAC — license token + Origin only.
GET /api/partner/tournaments/{id}/leaderboard?token=YOUR_TOKEN&limit=100
{
"tournament": {
"id": 123,
"name": "Weekly Sweet Bonanza",
"status": "active",
"start_date": "2026-04-14T00:00:00+00:00",
"end_date": "2026-04-21T00:00:00+00:00",
"total_spins": 50,
"total_prize": "1000.00"
},
"total_registrations": 842,
"limit": 100,
"entries": [
{
"position": 1,
"external_id": "user-42",
"display_name": "LuckyLuna",
"best_total_points": 18420.75,
"current_attempt_points": 12030.5,
"spins_used": 48,
"rebuy_count": 1,
"registered_at": "2026-04-14T10:12:03+00:00",
"last_played_at": "2026-04-19T21:45:11+00:00"
}
]
}
Safe to poll every 15–30s for live pages; cache when you can. Match external_id to highlight the current user.
Player wallet & withdrawals
Use these if you want a “My tournament wallet / cash out” UI on your site. All are HMAC-signed and must be called from your backend.
| Method | Path | Signature action |
|---|---|---|
| POST | /partner/players/wallet |
{external_id}\n{timestamp}\nwallet |
| POST | /partner/players/tournaments |
{external_id}\n{timestamp}\ntournaments |
| POST | /partner/players/transactions |
{external_id}\n{timestamp}\ntransactions |
| POST | /partner/players/redemptions |
{external_id}\n{timestamp}\nredemption\n{amount} |
Wallet
{
"external_id": "user-42",
"timestamp": 1710000000,
"signature": "…"
}
Response includes balance and enabled redemption_methods (recipient_type : email or wallet_address ).
Withdrawal
{
"external_id": "user-42",
"timestamp": 1710000000,
"signature": "…",
"amount": 50,
"method": "gifq_gift_card",
"recipient": "[email protected]",
"notes": "optional"
}
| Method | recipient |
|---|---|
gifq_gift_card |
|
coinbase_cdp_usdc_base |
Base wallet 0x… |
In the redemption signature, amount must be the normalized USD string with 2 decimals (50 → 50.00 ). Minimum is typically $20.00. Withdrawals are processed automatically (USDC on Base); on failure the API returns success: false and the balance is refunded.
Why players cannot withdraw someone else’s balance
- Your backend must set
external_idfrom the logged-in session only. - HMAC binds that id; forging another user’s id requires
tournament_api_secret. - Players are scoped to your site +
external_id. - Timestamps limit replay (~5 minutes).
Optional: settings & deposits via API
Skip these if you use Launch Pad.
| Method | Path | Notes |
|---|---|---|
| GET / PATCH | /partner/sites/tournament-settings |
Prize label, crypto sender |
| PATCH | /partner/sites/embed-branding |
{ "embed_primary_color": "#4a00e0" } |
| GET | /partner/sites/balance |
Balance, ledger, deposit instructions |
| POST | /partner/sites/deposits/crypto |
{ "amount": 100 } |
| POST | /partner/sites/deposits/crypto/confirm |
{ "deposit_id": 123, "tx_hash": "0x…" } |
| POST | /partner/sites/deposits/bank |
{ "amount": 100, "notes": "…" } |
Deposit fee
All deposits include a 5% fee:
- Declare
amount= credit you want (USD). - Pay
total_due= amount + fee (e.g. credit$100→ send$105.00). - Only the net
amountis credited.
Crypto (USDC on Base)
- Optional: set
crypto_sender_addressin Settings for a self-custody wallet. - Create intent → send exactly
total_dueUSDC on Base → confirm withtx_hash(or wait for auto-match every ~5 minutes by unique amount).
Bank
Register a pending deposit, wire exactly total_due , then Slots Launch credits after funds clear.
End-to-end flow
Launch Pad: fund wallet + settings + create/activate tournament
│
▼
Logged-in user joins → register-player (signed)
│
▼
User clicks Play → player-bootstrap (signed) → iframe launch_url
│
▼
(optional) Poll leaderboard · show wallet · request withdrawal
UK age verification
Partner embeds use the same UK age gate as demo games. Visitors from GB / GI must verify before play loads. If the browser blocks third-party cookies they may see the gate on every launch — that is expected and does not block scoring. The return from the gate uses age_verified=1 on the play URL, not the cookie.
If you have the AgeChecked addon, enable it per website in Manage Websites (enable_av ). No extra tournament API fields — verification runs on Slots Launch when the player opens launch_url .
Security checklist
-
tournament_api_secretonly on your server -
external_idalways from your auth session -
Reject signed requests outside the timestamp window
-
Use HTTPS; send a correct
Originfor the licensed site -
Partner tournaments are not on the public Slots Launch tournament index — only via your embed / API
Endpoint cheat sheet
Always needed for a custom site (player play)
| Method | Path |
|---|---|
| POST | /partner/tournaments/{id}/register-player |
| POST | /partner/tournaments/player-bootstrap |
Usually useful
| Method | Path |
|---|---|
| POST | /partner/tournaments/{id}/rebuy-player |
| GET | /partner/tournaments/{id}/leaderboard |
Launch Pad can replace these
| Method | Path | Launch Pad |
|---|---|---|
| GET | /partner/tournaments/eligible-games |
Create tournament form |
| POST / PATCH / DELETE / activate | /partner/tournaments… |
Overview / Create / Edit |
| GET/PATCH | /partner/sites/tournament-settings |
Tournaments → Settings |
| PATCH | /partner/sites/embed-branding |
Tournaments → Settings |
| GET | /partner/sites/balance |
Tournaments → Wallet |
| POST | /partner/sites/deposits/* |
Tournaments → Wallet |
Optional player account UI
| Method | Path |
|---|---|
| POST | /partner/players/wallet |
| POST | /partner/players/tournaments |
| POST | /partner/players/transactions |
| POST | /partner/players/redemptions |
Support
Partner tournaments must be enabled on your account. For access, deposit issues, or eligible-game questions, contact your Slots Launch representative.