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)
  1. Use Launch Pad for wallet, settings, and creating/activating tournaments.
  2. Call the API only for the player play flow (register → bootstrap → iframe).
  3. Add leaderboard / player wallet endpoints only if your product needs them.



Prerequisites

  1. A Slots Launch account (Launch Pad → Tournaments is available to every account).
  2. At least one website registered under Launch Pad → API Token / Manage Websites. The site hostname must match the Origin  you send on API calls (without www. ).
  3. Your site license token (same token used for the games embed API).
  4. 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: Origin  must match the registered site hostname (Site.name , without www. ).

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:


  1. Fund your wallet (Tournaments → Wallet).
  2. Create tournament — pick website, eligible game, dates, spins, prize pool, entry/rebuy settings.
  3. 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.




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 Email
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

  1. Your backend must set external_id  from the logged-in session only.
  2. HMAC binds that id; forging another user’s id requires tournament_api_secret .
  3. Players are scoped to your site + external_id .
  4. 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 amount  is credited.

Crypto (USDC on Base)

  1. Optional: set crypto_sender_address  in Settings for a self-custody wallet.
  2. Create intent → send exactly total_due  USDC on Base → confirm with tx_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_secret  only on your server


  • external_id  always from your auth session


  • Reject signed requests outside the timestamp window


  • Use HTTPS; send a correct Origin  for 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.

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.