Register

Live
POST/api/v1/auth/register

For registering a new member

Headers

FieldTypeRequiredDescription
Authorizationstring—Not used — this endpoint is public; no member token required
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

Request bodyapplication/json

FieldTypeRequiredDescription
phonestringYesMember's Thai mobile number (0XXXXXXXXX, 10 digits) — one account per phone per agent
passwordstringYesPassword, 6-72 characters
full_namestring—Full name (max 100 characters) — should match the bank account name
bankobjectYesBank details
└ bank_codestringYesCanonical bank code, e.g. KBANK, SCB, BBL
└ account_numberstringYesBank account number
└ account_namestringYesFirst and last name
acquisition_channelstring—How the member found the site (dropdown on direct signup). If a referral link with its own channel is used, the link's value wins; omitted = DIRECTYOUTUBE | FACEBOOK | LINE | TIKTOK | GOOGLE | INSTAGRAM | TWITTER | DIRECT | BACKOFFICE | OTHER
referral_codestring—Referral link code (?ref=<code>, max 32 chars). Invalid / inactive / wrong-agent codes are silently ignored — registration still succeeds
Request example
{
  "phone": "0812345678",
  "password": "P@ssw0rd123",
  "full_name": "สมชาย ใจดี",
  "bank": {
    "bank_code": "KBANK",
    "account_number": "1234567890",
    "account_name": "สมชาย ใจดี"
  },
  "acquisition_channel": "FACEBOOK",
  "referral_code": "AB12CD34"
}

Response

Fields in data

FieldTypeRequiredDescription
access_tokenstring—JWT to send as Authorization: Bearer — registering also logs the member in
expires_innumber—Access-token lifetime in seconds (900 = 15 minutes)
refresh_tokenstring—For requesting a new access token; valid 7 days
userobject—Summary of the new member
└ idstring—Member id (uuid)
└ usernamestring—Username (agent prefix + phone, lowercase, ≤20 chars)
└ rolestring—RoleMEMBER
└ statusstring—Account status — new signups are ACTIVE immediately
└ member_tierstring | null—Member tier — starts at NEW
└ full_namestring | null—Full name
└ selected_promotion_idstring | null—Selected deposit bonus (null on a fresh signup)
Response example
{
  "success": true,
  "code": 0,
  "message": "สำเร็จ",
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIs…",
    "expires_in": 900,
    "user": {
      "id": "0f1e2d3c-4b5a-6978-8796-a5b4c3d2e1f0",
      "username": "abc0812345678",
      "role": "MEMBER",
      "status": "ACTIVE",
      "member_tier": "NEW",
      "full_name": "สมชาย ใจดี",
      "selected_promotion_id": null
    }
  },
  "request_uuid": "3c9d2f61-7b04-4e8a-9f27-1a5c8e0d4b72"
}

Possible error codes

codeNameHTTPMessage
1004USER_ALREADY_EXISTS409User already existsThis phone is already registered with this agent (duplicate username)
4001VALIDATION_ERROR400Validation error
4002BAD_REQUEST400Bad requestUnknown agent domain, or prefix+phone exceeds 20 characters
9003TOO_MANY_REQUESTS429Too many requests. Please slow downAuth-group rate limit exceeded (10 req/min/IP)