AGENT EXTERNAL API · ฉบับร่าง
External API สำหรับจัดการ Member และตรวจสอบรายการ
เอกสารอ้างอิงของ route ที่ Gateway ลงทะเบียนไว้ ณ base SHA นี้
ทุก route ใช้ API key ของ Agent ผ่าน header apikey
และตัวอย่างใช้ host กับ credential แบบ placeholder เท่านั้น
https://api.example.invalid และ [REDACTED] เท่านั้น
สรุปภาษาไทย
- ✅ หน้านี้ครอบคลุม 4 route: สร้าง Member, แก้ไข Member, สรุปธุรกรรมเกม และรายการโอน Wallet
- ✅ ตาราง Request/Response ใช้ชื่อ field และชนิดข้อมูลจาก Gateway controller กับ generated protobuf
- ⚠️ ต้องส่ง
apikeyผ่าน API-key middleware; ห้ามใส่ credential จริงในเอกสารหรือตัวอย่าง - ⚠️ ทุก route เป็นร่างสำหรับ contract ที่ base SHA; ตรวจสอบการเปิดใช้งานจริงก่อนนำไปใช้
จัดการสมาชิก · ENDPOINT 01
สร้าง Member ใหม่
/v2/external/users
สร้างผู้ใช้ประเภท Member ผ่าน body แบบ JSON โดย controller
กำหนด user_type=Member และส่ง status=Normal ไปยัง core
เสมอ ค่า auth_name มาจาก API-key principal ของผู้เรียก ไม่ใช่ body field
Request
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
apikey | header | string | ใช่ | API key ของ Agent | ต้องผ่าน API-key middleware; ใช้ [REDACTED] ในตัวอย่าง |
username | body | string | ใช่ | ชื่อผู้ใช้ Member ใหม่ | ต้องไม่เป็นค่าว่าง |
password | body | string | ไม่ | รหัสผ่าน | ไม่มีข้อจำกัดเพิ่มเติมใน controller |
confirm_password | body | string | ไม่ | ค่าตรวจยืนยันรหัสผ่าน | ไม่มีข้อจำกัดเพิ่มเติมใน controller |
phone_number | body | string | ไม่ | หมายเลขโทรศัพท์ | ค่าเริ่มต้นเป็น string ว่าง |
first_name | body | string | ไม่ | ชื่อ | ค่าเริ่มต้นเป็น string ว่าง |
last_name | body | string | ไม่ | นามสกุล | ค่าเริ่มต้นเป็น string ว่าง |
status | body | string | ไม่ | สถานะที่ส่งมา | controller ไม่ใช้ค่าที่ส่ง; ส่ง Normal ไปยัง core |
email | body | string | ไม่ | อีเมล | รับค่าใน HTTP struct แต่ controller ไม่ส่งต่อใน UserCreateData |
line | body | string | ไม่ | บัญชี Line | ส่งต่อใน social_network.line |
twitter | body | string | ไม่ | บัญชี Twitter | ส่งต่อใน social_network.twitter |
facebook | body | string | ไม่ | บัญชี Facebook | ส่งต่อใน social_network.facebook |
referral_key | body | string | ไม่ | Referral key | ค่าเริ่มต้นเป็น string ว่าง |
member_prefix | body | string | ไม่ | Prefix ของ Member | ค่าเริ่มต้นเป็น string ว่าง |
assistant_group_id | body | integer (int64) | ไม่ | ID ของ assistant group | ค่าเริ่มต้น Go คือ 0; ส่งต่อเป็น optional pointer |
shard_ids | body | array of string | ไม่ | รายการ DB shard ID | แต่ละค่า parse เป็น base-10 int64; ค่าเริ่มต้น [] |
Response
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
status | response envelope | object | ใช่ | สถานะ HTTP/core | มี code และ message |
message | response envelope | object | ใช่ | ผลการทำงาน | มี code และ message |
data | response envelope | object | ใช่ | ข้อมูลจาก User gRPC | controller ส่ง resp.GetData() |
data.user_data.users | data | array of object | ไม่ | รายการผู้ใช้ที่สร้าง | เป็น repeated protobuf field; ค่าเริ่มต้น array ว่าง |
data.user_data.users[].id | data | string | ไม่ | ID ผู้ใช้ | optional protobuf field |
data.user_data.users[].username | data | string | ไม่ | ชื่อผู้ใช้ | optional protobuf field |
data.user_data.users[].user_type | data | enum | ไม่ | ประเภทผู้ใช้ | request นี้กำหนดเป็น Member |
data.user_data.users[].phone_number | data | string | ไม่ | หมายเลขโทรศัพท์ | ค่าเริ่มต้น string ว่าง |
data.user_data.users[].first_name | data | string | ไม่ | ชื่อ | ค่าเริ่มต้น string ว่าง |
data.user_data.users[].last_name | data | string | ไม่ | นามสกุล | ค่าเริ่มต้น string ว่าง |
data.user_data.users[].social_network | data | object | ไม่ | ข้อมูล social network | มี facebook, line, twitter, email |
data.user_data.users[].status | data | enum | ไม่ | สถานะผู้ใช้ | request นี้ส่ง Normal ไปยัง core |
data.user_data.users[].created_at | data | object | ไม่ | เวลา creation | optional protobuf duration |
data.user_data.users[].last_login_at | data | object | ไม่ | เวลา login ล่าสุด | optional protobuf duration |
data.user_data.users[].clear_token_after_login | data | boolean | ไม่ | flag ล้าง token หลัง login | ค่าเริ่มต้น false |
data.user_data.users[].assistant_group_id | data | integer (int64) | ไม่ | assistant group ID | optional protobuf field |
data.user_data.users[].scope | data | array of string | ไม่ | ขอบเขตสิทธิ์ | repeated field; ค่าเริ่มต้น array ว่าง |
data.user_data.users[].member_prefix | data | string | ไม่ | 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
/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
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
username | body | string | ใช่ | ชื่อผู้ใช้ Member เป้าหมาย | ต้องไม่เป็นค่าว่าง |
first_name | body | string | ไม่ | ชื่อใหม่ | ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน |
last_name | body | string | ไม่ | นามสกุลใหม่ | ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน |
status | body | string | ไม่ | สถานะใหม่ | ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน |
email | body | string | ไม่ | อีเมลใหม่ | ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน |
line | body | string | ไม่ | บัญชี Line ใหม่ | ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน |
twitter | body | string | ไม่ | บัญชี Twitter ใหม่ | ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน |
facebook | body | string | ไม่ | บัญชี Facebook ใหม่ | ส่งแล้วจึงเปลี่ยนค่า; ไม่ส่ง = ไม่เปลี่ยน |
clear_token_after_login | body | boolean | ไม่ | กำหนดให้ล้าง token หลัง login | optional; ไม่ส่ง = ไม่เปลี่ยน |
assistant_group_id | body | integer (int64) | ไม่ | ID ของ assistant group ใหม่ | optional; ไม่ส่ง = ไม่เปลี่ยน |
new_password | body | string | ไม่ | รหัสผ่านใหม่ | optional; ใช้ร่วมกับ confirm_new_password ตาม validation ของ core |
confirm_new_password | body | string | ไม่ | ค่ายืนยันรหัสผ่านใหม่ | optional; ใช้ร่วมกับ new_password ตาม validation ของ core |
Response
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
status | response envelope | object | ใช่ | สถานะ HTTP/core | มี code และ message |
message | response envelope | object | ใช่ | ผลการทำงาน | มี code และ message |
data | response envelope | object | ใช่ | ข้อมูล Member หลังแก้ไข | controller แปลงจาก UserDataResponse |
data.user_data.users | data | array of object | ไม่ | รายการผู้ใช้ | repeated protobuf field; ค่าเริ่มต้น array ว่าง |
data.user_data.users[].username | data | string | ไม่ | ชื่อผู้ใช้ | optional protobuf field |
data.user_data.users[].first_name | data | string | ไม่ | ชื่อที่อัปเดต | ค่าโดย User service |
data.user_data.users[].last_name | data | string | ไม่ | นามสกุลที่อัปเดต | ค่าโดย User service |
data.user_data.users[].status | data | enum | ไม่ | สถานะผู้ใช้ | ค่าโดย User service |
data.user_data.users[].social_network | data | object | ไม่ | ข้อมูล social network | มี facebook, line, twitter, email |
data.user_data.users[].clear_token_after_login | data | boolean | ไม่ | flag ล้าง token หลัง login | protobuf default false |
data.user_data.users[].assistant_group_id | data | integer (int64) | ไม่ | assistant group ID | optional 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
/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
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
apikey | header | string | ใช่ | API key ของ Agent | ต้องผ่าน API-key middleware; ใช้ [REDACTED] |
username | query | string | ไม่ | ชื่อผู้ใช้เป้าหมาย | ไม่ส่ง = empty string; controller ส่งต่อโดยตรง |
game_id | query | string | ไม่ | ID เกม | ไม่ส่ง = empty string |
game_list_id | query | string | ไม่ | ID game list | ไม่ส่ง = empty string |
round_id | query | string | ไม่ | ID รอบเกม | ไม่ส่ง = empty string |
start_date_unix | query | integer (int64) | ไม่ | เวลาเริ่มต้น Unix | ไม่ส่ง = 0; parse ไม่ได้ = HTTP 500 |
end_date_unix | query | integer (int64) | ไม่ | เวลาสิ้นสุด Unix | ไม่ส่ง = 0; parse ไม่ได้ = HTTP 500 |
Response
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
status | response envelope | object | ใช่ | สถานะ HTTP/core | มี code และ message |
message | response envelope | object | ใช่ | ผลการทำงาน | มี code และ message |
data | response envelope | array of object | ใช่ | รายการสรุปผู้ใช้ | repeated UserSummary; ค่าเริ่มต้น array ว่าง |
data[].user_id | data | string | ไม่ | ID ผู้ใช้ | ค่าโดย game service |
data[].user_name | data | string | ไม่ | ชื่อผู้ใช้ | ค่าโดย game service |
data[].game_type_summary | data | array of object | ไม่ | สรุปแยกตามประเภทเกม | repeated field; ค่าเริ่มต้น array ว่าง |
data[].game_type_summary[].game_type | data | string | ไม่ | ประเภทเกม | ค่าโดย game service |
data[].game_type_summary[].bet_amount | data | number (double) | ไม่ | ยอดเดิมพัน | protobuf default 0 |
data[].game_type_summary[].win_amount | data | number (double) | ไม่ | ยอดชนะ | protobuf default 0 |
data[].game_type_summary[].refund_amount | data | number (double) | ไม่ | ยอดคืนเงิน | protobuf default 0 |
data[].game_type_summary[].turnover_amount | data | number (double) | ไม่ | ยอด turnover | protobuf default 0 |
data[].game_type_summary[].transaction_count | data | integer (int64) | ไม่ | จำนวนรายการ | protobuf default 0 |
data[].summary_amount | data | object | ไม่ | ยอดรวม | optional protobuf message |
data[].summary_amount.bet_amount | data | number (double) | ไม่ | ยอดเดิมพันรวม | protobuf default 0 |
data[].summary_amount.win_amount | data | number (double) | ไม่ | ยอดชนะรวม | protobuf default 0 |
data[].summary_amount.refund_amount | data | number (double) | ไม่ | ยอดคืนเงินรวม | protobuf default 0 |
data[].summary_amount.turnover_amount | data | number (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
/v2/external/wallet/transfers
อ่านรายการ transfer ของ Member โดยใช้ offset pagination จาก from
และ size เลือกทิศทางด้วย direction ซึ่งรองรับ
in, out และ all (ค่าว่างเท่ากับ
all) ค่าเวลาเป็น Unix seconds และค่าว่างใช้ 0
Request
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
apikey | header | string | ใช่ | API key ของ Agent | ต้องผ่าน API-key middleware; ใช้ [REDACTED] |
username | query | string | ไม่ | ชื่อผู้ใช้เป้าหมาย | ไม่ส่ง = empty string; controller ส่งต่อโดยตรง |
direction | query | string | ไม่ | ทิศทาง transfer | in, out, all; ค่าว่าง = all; ค่าอื่น = HTTP 400 |
start_date | query | integer (int64) | ไม่ | เวลาเริ่มต้น Unix | ไม่ส่ง = 0; parse ไม่ได้ = HTTP 400 |
end_date | query | integer (int64) | ไม่ | เวลาสิ้นสุด Unix | ไม่ส่ง = 0; parse ไม่ได้ = HTTP 400 |
from | query | integer (int64) | ไม่ | offset เริ่มต้นแบบ zero-based | ไม่ส่ง = 0; controller ส่งต่อเป็น offset |
size | query | integer (int64) | ไม่ | ขนาดหน้าผลลัพธ์ | ไม่ส่ง = 0; controller ส่งต่อเป็น page size |
Response
| Field | Location | Type | Required | คำอธิบาย | ข้อจำกัด / ค่าเริ่มต้น |
|---|---|---|---|---|---|
status | response envelope | object | ใช่ | สถานะ HTTP/core | มี code และ message |
message | response envelope | object | ใช่ | ผลการทำงาน | มี code และ message |
rows | response envelope | array of object | ใช่ | รายการ transfer | controller ส่ง resp.GetRows(); ค่าเริ่มต้น array ว่าง |
rows[].id | rows | string | ไม่ | ID รายการ | ค่าโดย wallet service |
rows[].transaction_time_ns | rows | integer (int64) | ไม่ | เวลา transaction หน่วย Unix nanoseconds | ค่าโดย wallet service |
rows[].ref_code | rows | string | ไม่ | รหัสอ้างอิง | ค่าโดย wallet service |
rows[].username | rows | string | ไม่ | ชื่อผู้ใช้ | ค่าโดย wallet service |
rows[].type_name | rows | string | ไม่ | ชื่อประเภทธุรกรรม | ค่าโดย wallet service |
rows[].type_sub_name | rows | string | ไม่ | ประเภทย่อย เช่น up หรือ down | ค่าโดย wallet service |
rows[].amount | rows | number (double) | ไม่ | จำนวนเงิน | protobuf default 0 |
rows[].amount_before | rows | number (double) | ไม่ | ยอดก่อนรายการ | protobuf default 0 |
rows[].amount_after | rows | number (double) | ไม่ | ยอดหลังรายการ | protobuf default 0 |
rows[].asset_name | rows | string | ไม่ | ชื่อ asset | ค่าโดย wallet service |
rows[].asset_unit | rows | string | ไม่ | หน่วย asset | ค่าโดย wallet service |
rows[].note | rows | string | ไม่ | หมายเหตุ | ค่าโดย 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"}
}