155API

Freebets & Rewards

Create promotional freebets and rewards for players


Freebets allow operators to create promotional rewards that give players free bets on 155.io games. When a player uses a freebet, no real money is deducted from their balance, but any winnings are credited as real money.

Free bets reuse the standard wallet callbacks — /bet, /win, /rollback — with two flags (isFree: true and a rewardUuid). The Contract rules section below is the authoritative, code-verified statement of the full grant → bet → win → rollback sequence and exactly what your wallet must return at each step. If you only read one section, read that one.

Enablement

Free bets are enabled by default for all new operators — there is nothing to request, and you can start granting them immediately. (Legacy operators predating this policy may still need the feature toggled; if your grant calls return a 500 whose details reads free bets are not enabled for operator <operatorId>, contact us to switch it on.)

Player Must Exist

The player must have launched at least one game before you can grant them freebets. The grant endpoint does not create players — if the player hasn't opened a game yet, the API returns 404 {"error": "Player not found"}.

Not available on Footfall (crash)

Free bets cannot be used on Footfall, the crash-style game — the 155 bet registry rejects any crash bet carrying a free-bet reward. Grant crash players promotions through your own operator-side mechanics instead. All count-based games accept free bets normally. See Game Rules §11.3.

Contract rules: the flow & what to return

A free bet runs through the same four callbacks as a real-money bet — grant → /bet/win/rollback — but with amount: 0 on the bet leg and an isFree: true flag carried throughout. This section states, for each step, exactly what your wallet must do and return. These rules are verified against the 155 bet registry (direct-integration/bet_registry.go).

StepWhat 155 sendsWhat your wallet must doWhat you return
1. GrantYou call POST /game/free-bets/rewardsRecord the reward against the player; you'll see your clientRewardId echoed back later as rewardUuid201 Created with the reward + free-bet payload
2. /betisFree: true, amount: 0, rewardUuidDo not move the balance. Recognise the rewardUuidSUCCESS if the rewardUuid is known; BONUS_ERROR if it is not
3. /winisFree: true, referenceTransactionId = the bet's transactionIdOn a win, credit the full amount (real money). On a loss, the amount is 0 — credit nothingSUCCESS
4. /rollbackisFree: true (fires only before /win)Reverse the bet leg. There is nothing to refund (the bet debited 0)SUCCESS (or DUPLICATE_TRANSACTION_ERROR for a replay)

Unknown rewardUuid → return BONUS_ERROR (never UNKNOWN_ERROR)

When you receive a free /bet whose rewardUuid you do not recognise, return BONUS_ERROR — not UNKNOWN_ERROR. 155 maps BONUS_ERROR to a bonus failure and cleanly rejects the bet; any other status (including UNKNOWN_ERROR) is treated as a wallet fault and is not what 155 expects here. This is the single most common free-bet integration mistake. See the full enum in Error codes.

Zero debit — a free /bet must not touch the balance

A free /bet arrives with isFree: true and amount: 0. It must not debit (or credit) the player. Returning INSUFFICIENT_BALANCE_ERROR on a free bet is wrong — there is nothing to debit. Just return SUCCESS (or BONUS_ERROR if the rewardUuid is unknown).

Free-bet winnings are REAL money

A free bet is free to place, but what it pays out is real. On a winning /win, credit the full amount to the player's real balance. On a losing /win the amount is 0 — credit nothing. Never invent a phantom credit for a losing free bet, and never withhold a real win because the bet was free.

Rollback of a settled / duplicate free bet → return SUCCESS

A /rollback for a free bet — including one you have already settled or already rolled back — must return SUCCESS (balance unchanged). 155 accepts a rollback response of SUCCESS or DUPLICATE_TRANSACTION_ERROR; any other status is treated as a failure. So a settled/duplicate free-bet rollback is forgiving: silently dedupe and answer SUCCESS. See /rollback for the shared idempotency rule across all bets.

Cross-references: the per-callback request/response shapes live on /bet, /win, and /rollback; the canonical status enum lives in Error codes.

Integration Options

Direct integration operators can grant freebets to players via the 155.io API and receive freebet transactions through their operator API. Free bets are enabled by default — see Enablement above. For the authoritative grant → bet → win → rollback behaviour, see Contract rules.

Granting Freebets

Grant rewards with POST /game/free-bets/rewards — full request/response reference, error contract and prepaid templates on the endpoint page. Two things worth knowing up front:

  • amount is an integer at the currency's wire precision (USD: 500000 = $5.00) — the same scale as the amount on the /bet callback. A free bet only covers a bet whose wire amount is ≤ the granted integer, so an under-scaled grant (e.g. cents) makes every free bet unusable.
  • Each clientRewardId is tied to one player — a 100-player campaign is 100 grant calls. The clientRewardId comes back on bet transactions as rewardUuid, which is how you attribute a bet to a promotion.

Use startTime to schedule a grant for a future date: the reward is created immediately (status scheduled), but the free bets themselves are only generated — and become visible and claimable — at startTime. The reward can be cancelled before then (the cancel returns REWARD_NOT_STARTED; treat it as a successful cancellation).

Each free bet settles independently — not aggregated

A grant is a pool of independent free-bet credits, not a slots-style free-spins session. Each free bet is its own /bet (isFree: true, amount: 0, with rewardUuid) followed by its own per-round /win (paid as real money, or amount: 0 for a loss). So N free bets = N /bet + N /win callbacks — we do not send a single batched win, and the number of wins won't necessarily equal the granted quantity (unused free bets are cancelled/expired, not settled). Group a grant's settlements by the shared rewardUuid.

Cancelling Freebets

Cancel the unused free bets of a reward with POST /game/free-bets/rewards/cancel — rules, statuses and the error contract are on the endpoint page. Only claimable/claimed free bets can be cancelled; once any free bet from the reward has been used, the reward can no longer be cancelled.

Receiving Freebet Transactions

When a player uses a freebet, you'll receive modified bet/win/rollback requests:

Bet Request (Freebet)

{
  "requestId": "8df0475e-5069-483a-8205-f6089997abc9",
  "transactionId": "ea0240f5-483d-434b-a8d4-04dabf61cde3",
  "clientPlayerId": "player-123",
  "roundId": "17cc81fd-df13-4ca4-857d-de0f766dc372",
  "gameId": "f1c0b104-f29d-44a9-ae93-e8afcbe3feb9",
  "amount": 0,
  "currency": "USD",
  "isFree": true,
  "rewardUuid": "promo-winter-2025-001",
  "meta": { ... }
}

Key differences for freebets:

  • amount is 0 (no real money deducted)
  • isFree is true
  • rewardUuid contains your clientRewardId for tracking

Win/Loss Request (Freebet)

{
  "requestId": "...",
  "transactionId": "...",
  "referenceTransactionId": "ea0240f5-483d-434b-a8d4-04dabf61cde3",
  "amount": 1500000,
  "currency": "USD",
  "isFree": true,
  "roundClosed": true
}
  • For wins: amount contains the winnings to credit (this is real money)
  • For losses: amount is 0 (nothing to credit or deduct)
  • isFree is true to indicate this was a freebet result

Rollback Request (Freebet)

{
  "requestId": "...",
  "transactionId": "...",
  "referenceTransactionId": "ea0240f5-483d-434b-a8d4-04dabf61cde3",
  "isFree": true,
  "roundClosed": true
}
  • isFree is true to indicate the original bet was a freebet
  • No amount to refund (freebet had amount: 0)
  • Fires only before the freebet's /win (win or loss) callback. To reverse a granted-but-unused reward, use Cancelling Freebets, not /rollback.

Example Flow

  1. You grant a $5 freebet to player-123 via the API
  2. Player launches a 155.io game — the freebet is claimed automatically and announced with a banner
  3. Player places a bet — the freebet is applied automatically and the stake locks to $5
  4. You receive a bet request with amount: 0, isFree: true
  5. Round completes - player wins $15
  6. You receive a win request with amount: 1500000, isFree: true
  7. You credit $15 to the player's real balance

Hub88 operators use Hub88's native freebet API and receive transactions through Hub88's standard integration.

Step 1: Request Prepaid Templates

Contact us to set up your freebet templates. We'll need:

InformationDescription
Operator IDYour Hub88 operator_id
Bet valueAmount per free bet (e.g., $1, $5, $10)
QuantityNumber of free bets in the reward
CurrencyWhich currencies to support (e.g., USD, EUR)
GamesAll 155.io games or specific games only

For example, a template with bet value: $2 and quantity: 5 gives the player 5 free bets worth $2 each.

Once configured, you'll receive prepaid_uuid(s) that you can use to create rewards.

Step 2: Create Rewards via Hub88

Use Hub88's Operator API to grant freebets to your players:

POST /operator/generic/v2/freebet/rewards/create
{
  "operator_id": "your-operator-id",
  "user": "player-123",
  "prepaid_uuid": "uuid-from-step-1",
  "start_time": "2025-01-01T00:00:00Z",
  "end_time": "2025-12-31T23:59:59Z"
}

See Hub88's Freebets API Documentation for full details.

Set Expiration Dates

Always set start_time and end_time when creating rewards. Otherwise, rewards will automatically expire after a few weeks.

How It Works

  1. You create a reward for a player via the appropriate API
  2. Player launches a 155.io game — the freebets are claimed automatically and announced with a banner
  3. Player places a bet — the oldest unused freebet is applied automatically, no real balance deducted
  4. Winnings are credited as real money to the player's balance

Freebets apply automatically — the player activates nothing

When a player opens a game, any freebets waiting for them are claimed automatically. The next bet they place consumes the oldest unused freebet, and the stake locks to the freebet amount — it overrides the chip value the player had selected, and no further stake can be added to that option.

In the chip-placement games a player can stake several options in one round, and each option takes the next freebet in the queue — so more than one freebet can be in play in the same round. In Coin Flip (the single-bet panel) one freebet is active at a time; when it is consumed, the next one applies. Anything unused stays in the player's account and applies the same way in the next round, until used or expired.

A freebet outside your bet limits can never be played

A freebet is only usable if its value falls within the operator's min/max bet limits and matches the player's currency. With a 1.00 minimum bet, for example, a 0.50 freebet is filtered out for every player. Check the grant value against your configured limits — see Bet Limits & Starting Bet.

Need Help?

Free bets are enabled by default for new operators (see Enablement). Contact us to discuss promotional strategies, or if a legacy operator account still needs the feature toggled on.

On this page