AGENT EXTERNAL API · ฉบับร่าง

External API สำหรับจัดการ Member และตรวจสอบรายการ

เอกสารอ้างอิงของ route ที่ Gateway ลงทะเบียนไว้ ณ base SHA นี้ ทุก route ใช้ API key ของ Agent ผ่าน header apikey และตัวอย่างใช้ host กับ credential แบบ placeholder เท่านั้น

ขอบเขตเอกสาร ตัวอย่างนี้ไม่ใช่ production guide และไม่มี API key จริง ใช้ https://api.example.invalid และ [REDACTED] เท่านั้น

สรุปภาษาไทย

จัดการสมาชิก · ENDPOINT 01

สร้าง Member ใหม่

POST/v2/external/users

สร้างผู้ใช้ประเภท Member ผ่าน body แบบ JSON โดย controller กำหนด user_type=Member และส่ง status=Normal ไปยัง core เสมอ ค่า auth_name มาจาก API-key principal ของผู้เรียก ไม่ใช่ body field

Request

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
apikeyheaderstringใช่API key ของ Agentต้องผ่าน API-key middleware; ใช้ [REDACTED] ในตัวอย่าง
usernamebodystringใช่ชื่อผู้ใช้ Member ใหม่ต้องไม่เป็นค่าว่าง
passwordbodystringไม่รหัสผ่านไม่มีข้อจำกัดเพิ่มเติมใน controller
confirm_passwordbodystringไม่ค่าตรวจยืนยันรหัสผ่านไม่มีข้อจำกัดเพิ่มเติมใน controller
phone_numberbodystringไม่หมายเลขโทรศัพท์ค่าเริ่มต้นเป็น string ว่าง
first_namebodystringไม่ชื่อค่าเริ่มต้นเป็น string ว่าง
last_namebodystringไม่นามสกุลค่าเริ่มต้นเป็น string ว่าง
statusbodystringไม่สถานะที่ส่งมาcontroller ไม่ใช้ค่าที่ส่ง; ส่ง Normal ไปยัง core
emailbodystringไม่อีเมลรับค่าใน HTTP struct แต่ controller ไม่ส่งต่อใน UserCreateData
linebodystringไม่บัญชี Lineส่งต่อใน social_network.line
twitterbodystringไม่บัญชี Twitterส่งต่อใน social_network.twitter
facebookbodystringไม่บัญชี Facebookส่งต่อใน social_network.facebook
referral_keybodystringไม่Referral keyค่าเริ่มต้นเป็น string ว่าง
member_prefixbodystringไม่Prefix ของ Memberค่าเริ่มต้นเป็น string ว่าง
assistant_group_idbodyinteger (int64)ไม่ID ของ assistant groupค่าเริ่มต้น Go คือ 0; ส่งต่อเป็น optional pointer
shard_idsbodyarray of stringไม่รายการ DB shard IDแต่ละค่า parse เป็น base-10 int64; ค่าเริ่มต้น []

Response

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
statusresponse envelopeobjectใช่สถานะ HTTP/coreมี code และ message
messageresponse envelopeobjectใช่ผลการทำงานมี code และ message
dataresponse envelopeobjectใช่ข้อมูลจาก User gRPCcontroller ส่ง resp.GetData()
data.user_data.usersdataarray of objectไม่รายการผู้ใช้ที่สร้างเป็น repeated protobuf field; ค่าเริ่มต้น array ว่าง
data.user_data.users[].iddatastringไม่ID ผู้ใช้optional protobuf field
data.user_data.users[].usernamedatastringไม่ชื่อผู้ใช้optional protobuf field
data.user_data.users[].user_typedataenumไม่ประเภทผู้ใช้request นี้กำหนดเป็น Member
data.user_data.users[].phone_numberdatastringไม่หมายเลขโทรศัพท์ค่าเริ่มต้น string ว่าง
data.user_data.users[].first_namedatastringไม่ชื่อค่าเริ่มต้น string ว่าง
data.user_data.users[].last_namedatastringไม่นามสกุลค่าเริ่มต้น string ว่าง
data.user_data.users[].social_networkdataobjectไม่ข้อมูล social networkมี facebook, line, twitter, email
data.user_data.users[].statusdataenumไม่สถานะผู้ใช้request นี้ส่ง Normal ไปยัง core
data.user_data.users[].created_atdataobjectไม่เวลา creationoptional protobuf duration
data.user_data.users[].last_login_atdataobjectไม่เวลา login ล่าสุดoptional protobuf duration
data.user_data.users[].clear_token_after_logindatabooleanไม่flag ล้าง token หลัง loginค่าเริ่มต้น false
data.user_data.users[].assistant_group_iddatainteger (int64)ไม่assistant group IDoptional protobuf field
data.user_data.users[].scopedataarray of stringไม่ขอบเขตสิทธิ์repeated field; ค่าเริ่มต้น array ว่าง
data.user_data.users[].member_prefixdatastringไม่Prefix ของ Memberค่าเริ่มต้น string ว่าง

cURL

curl --request POST 'https://api.example.invalid/v2/external/users' \
  --header 'apikey: [REDACTED]' \
  --header 'content-type: application/json' \
  --data '{"username":"member-001","password":"[REDACTED]","confirm_password":"[REDACTED]","first_name":"Audit","last_name":"Member","shard_ids":["1"]}'

ตัวอย่าง Response สำเร็จ

{
  "status": {"code": 200, "message": "OK"},
  "message": {"code": "gwmsg02", "message": "Success"},
  "data": {"user_data": {"users": [{"username": "member-001", "user_type": "Member", "status": "Normal"}]}}
}

ตัวอย่าง Response ผิดพลาด

{
  "status": {"code": 400, "message": "Bad Request"},
  "message": {"code": "gwer1", "message": "invalid request body"}
}

จัดการสมาชิก · ENDPOINT 02

แก้ไขข้อมูล Member

POST/v2/external/users/update

แก้ไขเฉพาะค่าที่ส่งมาใน body ของ Member ที่ระบุด้วย username โดย username เป็น field เดียวที่จำเป็น ส่วนอีก 11 field เป็น optional และค่าที่ไม่ส่งจะไม่ถูกเปลี่ยนแปลง auth_name ถูกสร้างจาก API-key principal ฝั่ง server จึง caller ไม่สามารถส่งเป็น body field ได้

⚠️ เบอร์โทรศัพท์ (phone_number) แก้ไขผ่านเส้นนี้ไม่ได้ เพราะ core request message ไม่มี field นี้

Request

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
usernamebodystringใช่ชื่อผู้ใช้ Member เป้าหมายต้องไม่เป็นค่าว่าง
first_namebodystringไม่ชื่อใหม่ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน
last_namebodystringไม่นามสกุลใหม่ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน
statusbodystringไม่สถานะใหม่ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน
emailbodystringไม่อีเมลใหม่ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน
linebodystringไม่บัญชี Line ใหม่ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน
twitterbodystringไม่บัญชี Twitter ใหม่ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน
facebookbodystringไม่บัญชี Facebook ใหม่ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน
clear_token_after_loginbodybooleanไม่กำหนดให้ล้าง token หลัง loginoptional; ไม่ส่ง = ไม่เปลี่ยน
assistant_group_idbodyinteger (int64)ไม่ID ของ assistant group ใหม่optional; ไม่ส่ง = ไม่เปลี่ยน
new_passwordbodystringไม่รหัสผ่านใหม่optional; ใช้ร่วมกับ confirm_new_password ตาม validation ของ core
confirm_new_passwordbodystringไม่ค่ายืนยันรหัสผ่านใหม่optional; ใช้ร่วมกับ new_password ตาม validation ของ core

Response

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
statusresponse envelopeobjectใช่สถานะ HTTP/coreมี code และ message
messageresponse envelopeobjectใช่ผลการทำงานมี code และ message
dataresponse envelopeobjectใช่ข้อมูล Member หลังแก้ไขcontroller แปลงจาก UserDataResponse
data.user_data.usersdataarray of objectไม่รายการผู้ใช้repeated protobuf field; ค่าเริ่มต้น array ว่าง
data.user_data.users[].usernamedatastringไม่ชื่อผู้ใช้optional protobuf field
data.user_data.users[].first_namedatastringไม่ชื่อที่อัปเดตค่าโดย User service
data.user_data.users[].last_namedatastringไม่นามสกุลที่อัปเดตค่าโดย User service
data.user_data.users[].statusdataenumไม่สถานะผู้ใช้ค่าโดย User service
data.user_data.users[].social_networkdataobjectไม่ข้อมูล social networkมี facebook, line, twitter, email
data.user_data.users[].clear_token_after_logindatabooleanไม่flag ล้าง token หลัง loginprotobuf default false
data.user_data.users[].assistant_group_iddatainteger (int64)ไม่assistant group IDoptional protobuf field

cURL

curl --request POST 'https://api.example.invalid/v2/external/users/update' \
  --header 'apikey: [REDACTED]' \
  --header 'content-type: application/json' \
  --data '{"username":"member-001","first_name":"Updated","clear_token_after_login":true}'

ตัวอย่าง Response สำเร็จ

{
  "status": {"code": 200, "message": "OK"},
  "message": {"code": "gwmsg02", "message": "Success"},
  "data": {"user_data": {"users": [{"username": "member-001", "first_name": "Updated", "clear_token_after_login": true}]}}
}

ตัวอย่าง Response ผิดพลาด

{
  "status": {"code": 400, "message": "Bad Request"},
  "message": {"code": "gwer1", "message": "invalid request body"}
}

ตรวจสอบเกม · ENDPOINT 03

สรุปธุรกรรมชนะ–แพ้ของ Member

GET/v2/external/game/summary_transaction

อ่านสรุปธุรกรรมเกมของผู้ใช้ โดยเลือกกรองด้วย username, game_id, game_list_id, round_id และช่วงเวลา start_date_unix/end_date_unix หากไม่ส่งค่าจำนวนเต็มเวลา controller ใช้ค่า 0; ค่า parse ไม่ได้ตอบ HTTP 500

Request

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
apikeyheaderstringใช่API key ของ Agentต้องผ่าน API-key middleware; ใช้ [REDACTED]
usernamequerystringไม่ชื่อผู้ใช้เป้าหมายไม่ส่ง = empty string; controller ส่งต่อโดยตรง
game_idquerystringไม่ID เกมไม่ส่ง = empty string
game_list_idquerystringไม่ID game listไม่ส่ง = empty string
round_idquerystringไม่ID รอบเกมไม่ส่ง = empty string
start_date_unixqueryinteger (int64)ไม่เวลาเริ่มต้น Unixไม่ส่ง = 0; parse ไม่ได้ = HTTP 500
end_date_unixqueryinteger (int64)ไม่เวลาสิ้นสุด Unixไม่ส่ง = 0; parse ไม่ได้ = HTTP 500

Response

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
statusresponse envelopeobjectใช่สถานะ HTTP/coreมี code และ message
messageresponse envelopeobjectใช่ผลการทำงานมี code และ message
dataresponse envelopearray of objectใช่รายการสรุปผู้ใช้repeated UserSummary; ค่าเริ่มต้น array ว่าง
data[].user_iddatastringไม่ID ผู้ใช้ค่าโดย game service
data[].user_namedatastringไม่ชื่อผู้ใช้ค่าโดย game service
data[].game_type_summarydataarray of objectไม่สรุปแยกตามประเภทเกมrepeated field; ค่าเริ่มต้น array ว่าง
data[].game_type_summary[].game_typedatastringไม่ประเภทเกมค่าโดย game service
data[].game_type_summary[].bet_amountdatanumber (double)ไม่ยอดเดิมพันprotobuf default 0
data[].game_type_summary[].win_amountdatanumber (double)ไม่ยอดชนะprotobuf default 0
data[].game_type_summary[].refund_amountdatanumber (double)ไม่ยอดคืนเงินprotobuf default 0
data[].game_type_summary[].turnover_amountdatanumber (double)ไม่ยอด turnoverprotobuf default 0
data[].game_type_summary[].transaction_countdatainteger (int64)ไม่จำนวนรายการprotobuf default 0
data[].summary_amountdataobjectไม่ยอดรวมoptional protobuf message
data[].summary_amount.bet_amountdatanumber (double)ไม่ยอดเดิมพันรวมprotobuf default 0
data[].summary_amount.win_amountdatanumber (double)ไม่ยอดชนะรวมprotobuf default 0
data[].summary_amount.refund_amountdatanumber (double)ไม่ยอดคืนเงินรวมprotobuf default 0
data[].summary_amount.turnover_amountdatanumber (double)ไม่ยอด turnover รวมprotobuf default 0

cURL

curl --get 'https://api.example.invalid/v2/external/game/summary_transaction' \
  --data-urlencode 'username=member-001' \
  --data-urlencode 'start_date_unix=1787011200' \
  --data-urlencode 'end_date_unix=1787097600' \
  -H 'apikey: [REDACTED]'

ตัวอย่าง Response สำเร็จ

{
  "status": {"code": 200, "message": "OK"},
  "message": {"code": "gwmsg02", "message": "Success"},
  "data": [{"user_id": "user-001", "user_name": "member-001", "game_type_summary": [{"game_type": "slots", "bet_amount": 100, "win_amount": 125.5, "refund_amount": 0, "turnover_amount": 100, "transaction_count": 4}], "summary_amount": {"bet_amount": 100, "win_amount": 125.5, "refund_amount": 0, "turnover_amount": 100}}]
}

ตัวอย่าง Response ผิดพลาด

{
  "status": {"code": 500, "message": "Internal Server Error"},
  "message": {"code": "gwer1", "message": "invalid integer query parameter"}
}

ตรวจสอบ Wallet · ENDPOINT 04

แสดงรายการโอนเงินของ Wallet

GET/v2/external/wallet/transfers

อ่านรายการ transfer ของ Member โดยใช้ offset pagination จาก from และ size เลือกทิศทางด้วย direction ซึ่งรองรับ in, out และ all (ค่าว่างเท่ากับ all) ค่าเวลาเป็น Unix seconds และค่าว่างใช้ 0

Request

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
apikeyheaderstringใช่API key ของ Agentต้องผ่าน API-key middleware; ใช้ [REDACTED]
usernamequerystringไม่ชื่อผู้ใช้เป้าหมายไม่ส่ง = empty string; controller ส่งต่อโดยตรง
directionquerystringไม่ทิศทาง transferin, out, all; ค่าว่าง = all; ค่าอื่น = HTTP 400
start_datequeryinteger (int64)ไม่เวลาเริ่มต้น Unixไม่ส่ง = 0; parse ไม่ได้ = HTTP 400
end_datequeryinteger (int64)ไม่เวลาสิ้นสุด Unixไม่ส่ง = 0; parse ไม่ได้ = HTTP 400
fromqueryinteger (int64)ไม่offset เริ่มต้นแบบ zero-basedไม่ส่ง = 0; controller ส่งต่อเป็น offset
sizequeryinteger (int64)ไม่ขนาดหน้าผลลัพธ์ไม่ส่ง = 0; controller ส่งต่อเป็น page size

Response

FieldLocationTypeRequiredคำอธิบายข้อจำกัด / ค่าเริ่มต้น
statusresponse envelopeobjectใช่สถานะ HTTP/coreมี code และ message
messageresponse envelopeobjectใช่ผลการทำงานมี code และ message
rowsresponse envelopearray of objectใช่รายการ transfercontroller ส่ง resp.GetRows(); ค่าเริ่มต้น array ว่าง
rows[].idrowsstringไม่ID รายการค่าโดย wallet service
rows[].transaction_time_nsrowsinteger (int64)ไม่เวลา transaction หน่วย Unix nanosecondsค่าโดย wallet service
rows[].ref_coderowsstringไม่รหัสอ้างอิงค่าโดย wallet service
rows[].usernamerowsstringไม่ชื่อผู้ใช้ค่าโดย wallet service
rows[].type_namerowsstringไม่ชื่อประเภทธุรกรรมค่าโดย wallet service
rows[].type_sub_namerowsstringไม่ประเภทย่อย เช่น up หรือ downค่าโดย wallet service
rows[].amountrowsnumber (double)ไม่จำนวนเงินprotobuf default 0
rows[].amount_beforerowsnumber (double)ไม่ยอดก่อนรายการprotobuf default 0
rows[].amount_afterrowsnumber (double)ไม่ยอดหลังรายการprotobuf default 0
rows[].asset_namerowsstringไม่ชื่อ assetค่าโดย wallet service
rows[].asset_unitrowsstringไม่หน่วย assetค่าโดย wallet service
rows[].noterowsstringไม่หมายเหตุค่าโดย wallet service

cURL

curl --get 'https://api.example.invalid/v2/external/wallet/transfers' \
  --data-urlencode 'username=member-001' \
  --data-urlencode 'direction=in' \
  --data-urlencode 'start_date=1787011200' \
  --data-urlencode 'end_date=1787097600' \
  --data-urlencode 'from=0' \
  --data-urlencode 'size=100' \
  -H 'apikey: [REDACTED]'

ตัวอย่าง Response สำเร็จ

{
  "status": {"code": 200, "message": "OK"},
  "message": {"code": "gwmsg02", "message": "Success"},
  "rows": [{"id": "transfer-row-1", "transaction_time_ns": 1787097600000000000, "ref_code": "audit-ref-1", "username": "member-001", "type_name": "transfer", "type_sub_name": "up", "amount": 25.5, "amount_before": 100, "amount_after": 125.5, "asset_name": "USD", "asset_unit": "USD", "note": "audit example"}]
}

ตัวอย่าง Response ผิดพลาด

{
  "status": {"code": 400, "message": "Bad Request"},
  "message": {"code": "gwer1", "message": "invalid direction or integer query parameter"}
}