unibet_validate_coupon
Validate a betting coupon before placing it to verify the bet is accepted and avoid rejection, returning a clear go/no-go status.
Instructions
VALIDATE AND RE-PRICE a bet slip before placing it — the pre-placement go/no-go. Send the exact Kambi coupon you intend to place; it returns the current price and rejects an impossible or clashing combination, the same check Unibet's betslip fires. Anonymous (no login). Call IMMEDIATELY before unibet_place_bet and only place if this comes back clean.
Returns: VERIFIED live 2026-08-27: {status: "SUCCESS", validSession: , rewardInfo:{validRewards, validGroupRewards, implicitGroupRewards}}.
THE ANSWER IS status, and on a good coupon it is the STRING "SUCCESS" — not a number, not an absence. A rejection uses the same envelope with a different status and a message.
IT DOES NOT ECHO A PRICE. There are no couponRows in the reply, so this call CANNOT be used to re-price a bet — an earlier version of the betting plane tried to read couponRows[].odds back from here and would have refused every placement. Use unibet_sgm_price (anonymous, returns selectedOdds.decimal in thousandths) to check drift, and use THIS call for the go/no-go.
validSession reports whether the bearer is still good — the cheapest way to tell a dead token from a bad coupon.
rewardInfo.validGroupRewards[] lists promotions that would apply, e.g. a PROFIT_BOOST with boostPercentage/maxStake/maxExtraWinnings. Ignore it for pricing: the boost changes the payout, not the odds struck.
Rate limits are published in headers: x-ratelimit-remaining and x-ratelimit-reset (seconds).
Auth: works without a key; UNIBET_ACCESS_TOKEN unlocks more if set.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The Kambi coupon. VERIFIED live 2026-08-27: {"couponRows":[{"index":0,"odds":3300,"group":{"operation":"AND","groups":[{"operation":"AND","outcomeIds":[4306981997]},{"operation":"AND","outcomeIds":[4309036845]}]},"type":"BET_BUILDER"}],"bets":[{"couponRowIndexes":[0],"eachWay":false}],"isUserLoggedIn":true}. NOTE what validate does NOT carry: no `stake` on the bet, and none of allowOddsChange/requestId/channel — those belong to the placement only. `odds` is thousandths (3300 = 3.30). | |
| lang | No | Locale. Leave as the default. | en_AU |
| market | No | Market. Leave as AU. | AU |
| channel_id | No | Kambi channel. Leave as 1 (web). |