Lucky wheel overview
LiveGET
/api/v1/wheelThe member's wheel state — enabled flag, spins available, all prize segments, and recent results. One call renders the whole wheel page.
The wheel must be enabled at the agent level — a non-qualifying account/site gets enabled = false, spins_available = 0, and empty segments/recent (the image/config fields may be omitted in that case).
Spins are earned from cumulative deposits: every deposit_per_spin_thb deposited successfully = 1 spin.
Headers
| Field | Type | Required | Description |
|---|---|---|---|
| Authorization | string | Yes | Used — send Bearer <member access_token> |
| X-Api-Key | string | Yes | Agent API key (ak_…) from the bo screen |
| X-Timestamp | string | Yes | Signing time in unix milliseconds (±300s skew allowed) |
| X-Nonce | string | Yes | Unique per-request value (UUIDv4) for replay protection |
| X-Signature | string | Yes | hex(HMAC-SHA256(secret, canonical)) — see the Authentication page |
| X-Player-IP | string | — | The player's real IP (IPv4/IPv6) — recommended (used in login history) |
| X-Player-UA | string | — | The player's User-Agent (optional — recorded in login history) |
| X-Request-Id | string | — | Your correlation id — echoed back as request_uuid (recommended) |
| x-lang | string | — | th (default) or en — the language of message |
Response
Fields in data
| Field | Type | Required | Description |
|---|---|---|---|
| enabled | boolean | — | Whether the wheel is on — hide the wheel page when false (the wheel must be enabled at the agent level and the account must qualify). |
| wheel_image_url | string | null | — | The agent's wheel face image (displayable URL) |
| pointer_image_url | string | null | — | The wheel pointer image |
| spins_available | number | — | Spins the member has left |
| deposit_per_spin_thb | string | — | Cumulative deposit amount that earns 1 spin (THB) — show it as the earn rule. |
| wager_multiplier | string | — | Turnover multiplier applied to prizes (turnover = prize × multiplier) |
| segments | object[] | — | Prize segments ordered by slot_index — per-slot probabilities are never exposed. |
| └ slot_index | number | — | Slot position on the wheel (0-based, clockwise) |
| └ label | string | — | Segment label, e.g. "20 บาท" |
| └ prize_amount_thb | string | — | Prize value of the slot (THB, string) — "0" is a no-win slot |
| recent | object[] | — | The member's recent spins (up to 10, newest first) |
| └ slot_index | number | — | Winning slot |
| └ label | string | — | The slot's label at the time (snapshot) |
| └ prize_amount_thb | string | — | Prize won (THB, string) |
| └ spun_at | string (ISO 8601) | — | When the spin happened |
Response example
{
"success": true,
"code": 0,
"message": "Wheel fetched successfully",
"data": {
"enabled": true,
"wheel_image_url": "https://cdn.bestsystem.example/wheel/luckybet888-wheel.png",
"pointer_image_url": "https://cdn.bestsystem.example/wheel/luckybet888-pointer.png",
"spins_available": 2,
"deposit_per_spin_thb": "500",
"wager_multiplier": "1",
"segments": [
{ "slot_index": 0, "label": "5 บาท", "prize_amount_thb": "5" },
{ "slot_index": 1, "label": "เสียใจด้วย", "prize_amount_thb": "0" },
{ "slot_index": 2, "label": "10 บาท", "prize_amount_thb": "10" },
{ "slot_index": 3, "label": "20 บาท", "prize_amount_thb": "20" },
{ "slot_index": 4, "label": "เสียใจด้วย", "prize_amount_thb": "0" },
{ "slot_index": 5, "label": "50 บาท", "prize_amount_thb": "50" },
{ "slot_index": 6, "label": "100 บาท", "prize_amount_thb": "100" },
{ "slot_index": 7, "label": "500 บาท", "prize_amount_thb": "500" }
],
"recent": [
{ "slot_index": 2, "label": "10 บาท", "prize_amount_thb": "10", "spun_at": "2026-07-04T13:22:10.000Z" }
]
},
"request_uuid": "3b7e0d9c-4f61-4a28-b5e3-8d2c6f1a9e07"
}Possible error codes
| code | Name | HTTP | Message |
|---|---|---|---|
| 6201 | WHEEL_NOT_ENABLED | 400 | The lucky wheel is not enabledToday a disabled wheel answers success with enabled = false instead — still handle this code, as spin uses it |
| 6203 | WHEEL_NOT_ELIGIBLE | 400 | The lucky wheel is not available for this accountToday an ineligible account gets enabled = false with empty lists instead |
| 1001 | UNAUTHORIZED | 401 | Unauthorized |
| 1007 | TOKEN_INVALID | 401 | Token invalid |