Bet

ใช้งานได้
POST{base}/api/bet

เมื่อผู้เล่นเล่นหรือวางเดิมพันบนหน้าเกม ระบบจะส่งคำขอมาที่ Callback URL ของระบบคุณ (ที่ตั้งค่าไว้ใน Backoffice) — คุณต้องตรวจสอบยอดเงินคงเหลือของผู้เล่น หากมีเพียงพอ ให้หักยอดของสมาชิกแล้วส่งการตอบกลับสำเร็จมาที่ระบบของเรา เพื่อดำเนินการเล่นเกมต่อ

ประมวล txns[] ทั้งชุดใน DB transaction เดียว (atomic) — ถ้าตัวใดพัง ให้ roll back ทั้งชุด แล้วตอบ error โดย balance_before == balance_after

ถ้าได้รับ txn_id เดิมซ้ำ ห้าม apply ซ้ำ ให้ตอบ balance ปัจจุบันพร้อม code 0 หรือตอบ 20002 · ข้อยกเว้นเดียวคือรายการที่ตามหลัง /rollback ของรอบนั้น ซึ่งเป็นผลที่ถูกแก้แล้วและต้อง apply (ดูหัวข้อ re-settle หลัง rollback ในหน้า Contract)

amount = 0 เกิดขึ้นจริง (feature spin, feature buy, tip หรือ stake ที่ค่ายระบุไม่ได้) ห้าม reject ให้ประมวลเป็นรายการยอด 0 แล้วตอบ code 0 โดยไม่ขยับ balance

ตอบ HTTP 200 เสมอแม้เป็น business error

Headers

ฟิลด์ชนิดจำเป็นคำอธิบาย
X-Api-Keystringใช่API key ที่ best-system ออกให้ (ตรวจว่าตรงกับของคุณ)
X-Signaturestringใช่hex(HMAC-SHA256(secret, raw body)) — verify จาก raw bytes ห้าม re-serialize · ไม่ตรง → ตอบ code 30002

Request bodyapplication/json

ฟิลด์ชนิดจำเป็นคำอธิบาย
request_idstringใช่id ของ request นี้
player_usernamestringใช่username ผู้เล่นในระบบของคุณ
currencystringใช่สกุลเงินของผู้เล่น ตาม ISO 4217 เช่น THB
product_codestring—รหัสค่ายเกม (เช่น PGSOFT)
timestampnumberใช่เวลาที่ส่ง (unix ms)
txnsobject[]ใช่รายการเดิมพันที่ต้องหักเงิน — amount ของแต่ละ txn คือยอด stake ที่ต้อง debit
└ txn_idstringใช่Transaction ID · หากยิงซ้ำห้าม apply ซ้ำ (ตอบ balance ปัจจุบันด้วย code 0) · กีฬา: บิลที่ยืนยันแล้ว (OPEN) ถูก relay ซ้ำด้วย txn_id เดิม พร้อม status="OPEN" + skip_balance_update=true — ตอบ code 0 + balance ปัจจุบัน ห้ามหักซ้ำ (ดูหัวข้อ sportsbook ในหน้า Contract)
└ round_idstringใช่รหัสรอบเกม
└ amountnumberใช่จำนวนเงินเดิมพัน
└ game_codestring—รหัสเกม
└ is_featureboolean—free/feature spin (default false) อาจมากับ amount=0 (ประมวลเป็น bet ยอด 0: ตอบ code 0 ไม่หักเงิน)
└ statusstring—สถานะบิลจากค่ายเกม เป็น OPEN ปกติ · WAITING เฉพาะบิลกีฬาก่อนค่ายยืนยัน แล้วส่งซ้ำด้วย txn_id เดิมเป็น OPEN พร้อม skip_balance_updateOPEN | WAITING | SETTLED | REFUND | REJECT | ROLLBACK | VOID | TIPS
└ play_infostring—ข้อมูลของเกมที่เดิมพัน — เช่น LIVE_CASINO จะมี player/banker, SLOT จะเป็นชื่อเกม
└ bet_amountnumber—ยอดเดิมพันตามที่ค่ายส่งมา ค่าเดียวกับ amount ของ callback นี้
└ skip_balance_updateboolean—หากมีค่าเป็น true ให้ข้ามการหักเงินจากสมาชิก — โดยปกติเกิดในเกมประเภท SPORT ตอนผู้ให้บริการพิจารณาการวางเดิมพันของผู้เล่น (default: false)
└ is_feature_buyboolean—ค่าที่บอกว่าสมาชิกได้ซื้อ feature spin หรือไม่ (default: false)
ตัวอย่าง request
// สล็อตปกติ — status "OPEN" (ไม่มี WAITING / ไม่มี skip)
{
  "request_id": "2f6d9c81-4b3e-4a5d-9c0e-7a1b2c3d4e5f",
  "player_username": "foobar",
  "currency": "THB",
  "product_code": "PGSOFT",
  "timestamp": 1783236600000,
  "txns": [
    {
      "txn_id": "T-001",
      "round_id": "R-1",
      "amount": 200,
      "game_code": "10300",
      "is_feature": false,
      "status": "OPEN",
      "play_info": "Rise of Dragon"
    }
  ]
}

// กีฬา (1/2) — วางบิล status "WAITING" (หัก stake ตามปกติ)
{
  "request_id": "3f7a1c92-8b2e-4d5a-9e0f-1a2b3c4d5e6f",
  "player_username": "foobar",
  "currency": "THB",
  "product_code": "SABA",
  "timestamp": 1783236600100,
  "txns": [
    {
      "txn_id": "S-88001",
      "round_id": "SB-1",
      "amount": 100,
      "game_code": "SBO-FOOTBALL",
      "status": "WAITING",
      "play_info": "Man Utd vs Chelsea"
    }
  ]
}

// กีฬา (2/2) — ค่ายยืนยันบิล: relay /bet ซ้ำด้วย txn_id เดิม + status "OPEN" + skip_balance_update
// ห้ามหักซ้ำ → dedupe ต่อ txn_id แล้วตอบ code 0 + balance ปัจจุบัน
{
  "request_id": "4a8b2d03-9c3f-4e6b-8f10-2b3c4d5e6f70",
  "player_username": "foobar",
  "currency": "THB",
  "product_code": "SABA",
  "timestamp": 1783236600600,
  "txns": [
    {
      "txn_id": "S-88001",
      "round_id": "SB-1",
      "amount": 100,
      "game_code": "SBO-FOOTBALL",
      "status": "OPEN",
      "skip_balance_update": true
    }
  ]
}

Expected Response

ฟิลด์ใน data

ฟิลด์ชนิดจำเป็นคำอธิบาย
codenumberใช่0 = สำเร็จ · อื่นๆ ดูหน้า Seamless codes
request_idstringใช่echo จาก request
usernamestringใช่echo player_username (กันสลับคน)
currencystringใช่echo จาก request
balance_beforenumberใช่ยอดก่อนประมวล txns[] ทั้งชุด
balance_afternumberใช่ยอดหลังประมวลทั้งชุด
timestampnumberใช่เวลาที่คุณประมวลผล (unix ms)
ตัวอย่าง response
{
  "code": 0,
  "request_id": "2f6d9c81-4b3e-4a5d-9c0e-7a1b2c3d4e5f",
  "username": "foobar",
  "currency": "THB",
  "balance_before": 1000,
  "balance_after": 800,
  "timestamp": 1783236600090
}

Error codes ที่พบได้

codeชื่อHTTPข้อความ
10001SEAMLESS_USER_NOT_FOUND200ไม่พบผู้เล่นในระบบของ agent
10002SEAMLESS_INSUFFICIENT_BALANCE200ยอดเงินไม่พอสำหรับรายการหักเงิน (debit)
20002SEAMLESS_DUPLICATE_TXN200รายการซ้ำ (txn_id เคยประมวลแล้ว)
30002SEAMLESS_INVALID_SIGNATURE401X-Signature ไม่ถูกต้อง
40003SEAMLESS_FORBIDDEN200ปฏิเสธการเข้าถึง (api-key/IP)
50001SEAMLESS_INTERNAL_ERROR200ข้อผิดพลาดภายในระบบของ agent