Claim a promotion

Live
POST/api/v1/promotions/:id/claim

Member self-serve bonus claim — CASHBACK / FREE_CREDIT / DAILY_LOGIN only. The bonus is credited to the wallet atomically; if the promotion has a wager multiplier, a pending claim is created that locks withdrawals.

A promotion with a wager_multiplier creates a pending claim (visible at active-claim) that locks withdrawals until turnover completes — one without a multiplier closes immediately on grant.

Debounce the button on your UI too — the server already prevents concurrent double-grants (single transaction); a repeat click yields 6004/6006, never a second bonus.

Headers

FieldTypeRequiredDescription
AuthorizationstringYesUsed — send Bearer <member access_token>
X-Api-KeystringYesAgent API key (ak_…) from the bo screen
X-TimestampstringYesSigning time in unix milliseconds (±300s skew allowed)
X-NoncestringYesUnique per-request value (UUIDv4) for replay protection
X-SignaturestringYeshex(HMAC-SHA256(secret, canonical)) — see the Authentication page
X-Player-IPstring—The player's real IP (IPv4/IPv6) — recommended (used in login history)
X-Player-UAstring—The player's User-Agent (optional — recorded in login history)
X-Request-Idstring—Your correlation id — echoed back as request_uuid (recommended)
x-langstring—th (default) or en — the language of message

Path parameters

FieldTypeRequiredDescription
idstringYesPromotion id (uuid) from the all-promotions list — must belong to the member's own agent.

Response

Fields in data

FieldTypeRequiredDescription
claim_idstring—Id of the claim just created
bonus_thbstring—Bonus credited to the wallet (THB)
balancestring—Wallet balance after the credit (THB)
daynumber | null—DAILY_LOGIN only: the streak day just granted (1-7, wraps weekly; a missed day resets to 1) — null for other types.
Response example
{
  "success": true,
  "code": 0,
  "message": "รับโปรโมชั่นสำเร็จ",
  "data": {
    "claim_id": "9d4c1f2a-6b8e-4d05-93a7-c51e0f8b2d46",
    "bonus_thb": "50.00",
    "balance": "175.50",
    "day": null
  },
  "request_uuid": "7f3e9c1b-5d24-48a6-b0e8-1c9f2d7a4e35"
}

Possible error codes

codeNameHTTPMessage
6001PROMOTION_NOT_FOUND404Promotion not foundPromotion not found under the member's agent, or it is not ACTIVE / outside its start-end window
6002PROMOTION_NOT_CLAIMABLE422This promotion is granted automatically on depositThis type is not self-claimable — NEW_REGISTER / FIRST_DEPOSIT / GOLDEN_MINUTE are granted automatically on deposit
6003PROMOTION_NOT_ELIGIBLE422Not eligible for this promotionNot eligible: wallet is not TRANSFER mode · member tier not in eligible_tiers · today's deposits below min_deposit_thb · computed bonus is 0 (e.g. CASHBACK with no deposit today) · promotion budget exhausted
6004PROMOTION_ALREADY_CLAIMED409Promotion already claimedClaim cap reached — lifetime or per-day (CASHBACK and DAILY_LOGIN are always once per Bangkok day)
6006PROMOTION_ACTIVE_CLAIM_EXISTS409You have an active promotion in progressA previous bonus is still pending turnover (see active-claim) — it must clear before claiming again
6007PROMOTION_BALANCE_TOO_HIGH422Balance must be below the threshold to claimCurrent balance ≥ the promotion's require_balance_below_thb gate (offered only when the balance is low)
6008PROMOTION_TURNOVER_NOT_MET400Turnover requirement not met to claim this promotionFREE_CREDIT with a min_turnover_thb gate — bet volume since the previous claim has not reached it
9002SERVICE_UNAVAILABLE503Service unavailableThe bonus system is temporarily unavailable — retry later
1001UNAUTHORIZED401Unauthorized
1007TOKEN_INVALID401Token invalid