Bonuses reference

Issue promotional balances backed by a balanced bonus-liability ledger. Convert automatically when wagering targets are hit.

Supported types

typeWhat it isKey fields
no_depositFlat bonus amount, no deposit requiredamount, wagering_multiple
deposit_matchMatch a deposit by % up to a cap (e.g. "100% up to $500")amount_pct, max_amount, wagering_multiple
free_spinsN free spins on a specified gamefree_spin_count, wagering_multiple
cashbackReturns a % of net lossamount_pct, wagering_multiple
reloadPeriodic deposit-match for retentionamount_pct, max_amount
rakeback% of contributed rake (sportsbook / poker)amount_pct
lossbackNet-loss refund (no wagering)amount_pct
referralGranted on confirmed referralamount
vip_compVIP-tier loyalty grantamount
ticketTournament / raffle entryamount
dropsLootbox / mini-game dropamount
manualOperator-defined, escape hatchany

Grant a bonus

POST /v1/bonuses/grant
{
  "player_id":       "StarlordV7",
  "template":        "WELCOME200",         // promo_code OR template uuid
  "idempotency_key": "grant-2025-05-19-001"
}

# 201
{
  "bonus": {
    "id":                  "…",
    "player_id":           "StarlordV7",
    "type":                "deposit_match",
    "status":              "active",
    "bonus_amount":        500.00,
    "wagering_required":   15000.00,
    "wagering_completed":  0.00
  },
  "deduped": false
}

Wagering & conversion

Each wager event you fire on a bonus-eligible player advances wagering_completed. When it reaches wagering_required, the bonus auto-converts: the locked bonus balance flips to real, balanced as a single ledger entry.

Bonus lifecycle states

pendingAwaiting opt-in / deposit
activeCounting wagering toward the target
completedConverted to real balance
expiredTime-window elapsed; remaining bonus removed
forfeitedOperator-revoked (fraud, abuse)
cancelledPlayer-cancelled before activation