🚀 LINE Monitor V3 - REST & WebSocket API Reference

ยินดีต้อนรับสู่เอกสารคู่มือการใช้งาน API ฉบับสมบูรณ์สำหรับระบบ **LINE Monitor V3 High-Performance Engine** ระบบรองรับการรันพร้อมกันได้สูงสุด 500+ บัญชี พร้อมระบบประมวลผลข้อความเรียลไทม์ และตรวจจับสลิปโอนเงินอัตโนมัติด้วยความเร็ว Sub-15ms

⚡ Base URL Server: https://apiline.xzrn.cloud หรือ http://localhost:3001
📦 Response Format: application/json (UTF-8 Encoding)

🔑 การยืนยันตัวตน (Authentication)

ระบบรองรับการยืนยันตัวตน 2 รูปแบบหลัก:

1. Session Bearer Token (สำหรับผู้ใช้งานใน Dashboard)

ส่งคีย์ Token ที่ได้จาก API POST /api/auth/login ผ่าน HTTP Header:

Authorization: Bearer <YOUR_SESSION_TOKEN>

2. Permanent API Key (สำหรับเรียกใช้ภายนอก / Third-Party Integration)

สร้าง API Key ได้จากระบบเมนู API Keys แล้วส่งผ่าน Header:

Authorization: Bearer <YOUR_API_KEY>

📌 API Endpoint ล็อกอิน: POST /api/auth/login

ใช้ยืนยันตัวตนเพื่อขอรับ Session Token สำหรับเข้าถึงระบบ

Request Body (JSON)

FIELDTYPEREQUIREDDESCRIPTION
usernamestringYESชื่อผู้ใช้งาน (Default: admin)
passwordstringYESรหัสผ่าน (Default: admin123)

Example Code (cURL)

cURL
curl -X POST https://apiline.xzrn.cloud/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "admin123"}'

Response (200 OK)

{ "ok": true, "token": "3a4b9c1d-8e7f-4a5b-9c1d-2e3f4a5b6c7d", "username": "admin", "role": "admin" }

📱 การจัดการบัญชี LINE (Account Management API)

GET /api/accounts

ดึงรายการบัญชี LINE ทั้งหมดในระบบในคำขอเดียว พร้อมสถานะการเชื่อมต่อ, หมวดหมู่ และ Webhook ทั้งหมดของแต่ละบัญชี (ฟิลด์ webhooks) — ไม่ต้องยิงแยกไปที่ /api/accounts/:id/webhooks ทีละบัญชีอีกต่อไป

เส้นทางเดียวกันนี้ยังเรียกผ่าน GET /api/v2/accounts ได้ด้วย (รองรับ API Key auth)

Headers

Authorization: Bearer <YOUR_API_KEY_OR_SESSION_TOKEN>

Response (200 OK)

[ { "id": "8aaac309-7294-4da7-8446-ad76ae1fde42", "mid": "u8cc52e369d2bca4a5ce8c506170c712e", "displayName": "บอทรับโอนกสิกร 01", "status": "connected", "tokenStatus": "valid", "tokenError": null, "allowedChatIds": ["c1234567890abcdef"], "webhookUrl": "https://your-domain.com/webhook-legacy", "webhooks": [ { "id": "wh_7d93215e", "url": "https://your-domain.com/webhook", "name": "Production", "events": ["message", "payment", "disconnect"], "payloadMode": "full", "secret": "", "createdAt": "2026-08-04T12:00:00.000Z" } ], "category": "บอทรับโอน", "createdAt": "2026-08-04T12:00:00.000Z", "lastActive": "2026-08-13T15:18:34.131Z" } ]
หมายเหตุ: webhookUrl คือ Webhook เดี่ยวแบบเก่า (ตั้งค่าตอนสร้าง/แก้ไขบัญชี) ส่วน webhooks[] คือ Webhook หลายตัวต่อบัญชี (Multi-Webhook, ดูหัวข้อ Webhook Specifications) — ทั้งสองแบบจะยิงพร้อมกันเมื่อมี event เกิดขึ้น ระบบจะไม่ยิงซ้ำถ้า URL เดียวกันปรากฏทั้งสองที่

POST /api/accounts/login-qr

สร้างเซสชันสำหรับเพิ่มบัญชี LINE ใหม่ด้วยการสแกน QR Code

Request Body (JSON)

FIELDTYPEREQUIREDDESCRIPTION
categorystringOPTIONALชื่อหมวดหมู่ (Default: ทั่วไป)
allowedChatIdsarrayOPTIONALรายการ Chat ID ที่อนุญาตให้อ่านข้อความ
webhookUrlstringOPTIONALURL สำหรับส่ง Webhook เฉพาะบัญชีนี้

Response (200 OK)

{ "id": "temp_acc_uuid_1234" }

เมื่อสร้างแล้ว ให้ฟัง Socket Event qr เพื่อรับรูปภาพ QR Code สำหรับสแกน

POST /api/accounts/login-token

เชื่อมต่อบัญชี LINE ทันทีด้วย Auth Token โดยไม่ต้องสแกน QR Code (หรือใช้ต่ออายุ/relogin บัญชีเดิมที่โทเคนหมดอายุ)

Request Body (JSON)

FIELDTYPEREQUIREDDESCRIPTION
tokenstringYESLINE Account Primary Auth Token
allowedChatIdsarrayOPTIONALรายการ Chat ID ที่อนุญาตให้อ่านข้อความ
webhookUrlstringOPTIONALURL สำหรับส่ง Webhook เฉพาะบัญชีนี้ (แบบเดี่ยว)
reloginAccountIdstringOPTIONALระบุถ้าต้องการอัปเดตโทเคนของบัญชีเดิม แทนการสร้างบัญชีใหม่

Response (200 OK)

{ "id": "8aaac309-7294-4da7-8446-ad76ae1fde42", "mid": "u8cc52e369d2bca4a5ce8c506170c712e" }

POST /api/accounts/login-password

เชื่อมต่อบัญชี LINE ด้วยอีเมล/รหัสผ่าน ระบบตอบกลับ id ทันที ส่วนการล็อกอินจริงทำงานเบื้องหลัง (ถ้า LINE ต้องการ PIN ยืนยันอุปกรณ์ใหม่ ให้ดูหัวข้อ กรอก PIN Code)

Request Body (JSON)

FIELDTYPEREQUIREDDESCRIPTION
emailstringYESอีเมลบัญชี LINE
passwordstringYESรหัสผ่านบัญชี LINE
allowedChatIdsarrayOPTIONALรายการ Chat ID ที่อนุญาตให้อ่านข้อความ
webhookUrlstringOPTIONALURL สำหรับส่ง Webhook เฉพาะบัญชีนี้

Response (200 OK)

{ "id": "temp_acc_uuid_5678" }

ให้ Poll GET /api/accounts/pending-pins หรือฟัง Socket Event pin เพื่อเช็คว่า LINE ต้องการ PIN ยืนยันอุปกรณ์หรือไม่ และ Socket Event account:update เพื่อดูสถานะล่าสุด

GET /api/accounts/pending-pins

PIN Code ในที่นี้คือรหัสที่ LINE ส่งมาให้ระบบแสดงผล เพื่อให้ผู้ใช้พิมพ์ยืนยันในแอป LINE บนมือถือของตัวเอง (ไม่ใช่ PIN ที่ต้อง POST กลับเข้ามาในระบบนี้) ใช้ endpoint นี้ดึงรายการบัญชีที่กำลังรอ PIN ทั้งหมด

Response (200 OK)

{ "count": 1, "pendingPins": [ { "accountId": "temp_acc_uuid_5678", "pincode": "123456", "displayName": null, "mid": null, "status": "waiting_pin", "createdAt": "2026-08-13T15:10:00.000Z" } ] }

GET /api/accounts/:id/pin

ดึง PIN Code ของบัญชีใดบัญชีหนึ่งโดยเฉพาะ

{ "accountId": "temp_acc_uuid_5678", "required": true, "pincode": "123456", "pin": "123456" }

PATCH /api/accounts/:id

แก้ไข Chat ID ที่อนุญาต, Webhook URL แบบเดี่ยว หรือหมวดหมู่ของบัญชีที่มีอยู่

Request Body (JSON)

FIELDTYPEREQUIREDDESCRIPTION
allowedChatIdsarrayOPTIONALรายการ Chat ID ที่อนุญาตให้อ่านข้อความ
webhookUrlstringOPTIONALURL Webhook แบบเดี่ยว
categorystringOPTIONALหมวดหมู่บัญชี

Response (200 OK)

{ "ok": true }

DEL /api/accounts/:id

ลบบัญชีออกจากระบบถาวร ตัดการเชื่อมต่อ LINE, ลบ Session/E2EE Key ใน MySQL (account_sessions), และลบ Webhook เฉพาะบัญชีนี้ทั้งหมด

Response (200 OK)

{ "ok": true }

💬 ระบบประวัติข้อความและเงินเข้า (Messages & Payments API)

GET /api/history/stats

ดึงสถิติยอดรวมข้อความทั้งหมด ยอดชำระเงินสำเร็จ และการกระจายตามธนาคารแบบเรียลไทม์

Response (200 OK)

{ "ok": true, "totalMessages": 7509, "totalPayments": 1420, "totalAmount": "450000.00", "totalWebhooks": 1420, "byBank": { "KBANK": { "count": 890, "amount": "285000.00" }, "SCB": { "count": 530, "amount": "165000.00" } } }

GET /api/history/messages

ค้นหาและดึงประวัติข้อความ LINE ย้อนหลังจาก MySQL พร้อมฟิลเตอร์

Query Parameters

PARAMTYPEDESCRIPTION
accountIdstringกรองตามรหัสบัญชี LINE
contentTypestringประเภทข้อความ (NONE, FLEX, IMAGE)
typestringRECEIVE_MESSAGE หรือ SEND_MESSAGE
startDate / endDatestringกรองตามช่วงเวลา (ISO 8601)
pagenumberลำดับหน้า (Default: 1)
limitnumberจำนวนรายการต่อหน้า (Default: 50)

Response (200 OK)

{ "data": [ { "id": "625829214980931963", "dbId": 91422, "accountId": "8aaac309-7294-4da7-8446-ad76ae1fde42", "from": "u8cc52e369d2bca4a5ce8c506170c712e", "to": "u376fb1f007e5a4011196957e13300bad", "type": "RECEIVE_MESSAGE", "contentType": "FLEX", "text": "แจ้งเตือนรายการเงินเข้า 500.00 บาท", "flexData": { "type": "flex", "altText": "..." }, "contentMetadata": { "FLEX_JSON": "..." }, "time": "2026-08-04T14:43:04.501Z" } ], "pagination": { "page": 1, "limit": 50, "total": 1250, "totalPages": 25 } }

GET /api/history/payments

ค้นหาและดึงประวัติเงินเข้าที่ระบบตรวจจับได้ ย้อนหลังจาก MySQL พร้อมฟิลเตอร์

Query Parameters

PARAMTYPEDESCRIPTION
accountIdstringกรองตามรหัสบัญชี LINE
bankstringกรองตามธนาคาร เช่น KBANK, SCB
minAmount / maxAmountnumberกรองตามช่วงจำนวนเงิน
startDate / endDatestringกรองตามช่วงเวลา (ISO 8601)
page / limitnumberแบ่งหน้า (Default: 1 / 50)

Response (200 OK)

{ "data": [ { "id": 4821, "accountId": "8aaac309-7294-4da7-8446-ad76ae1fde42", "bank": "KBANK", "amount": "500.00", "accountNumber": "xxx-x-x1234-x", "keyword": "เงินเข้า", "time": "2026-08-04T14:43:04.501Z" } ], "pagination": { "page": 1, "limit": 50, "total": 640, "totalPages": 13 } }

⚡ โครงสร้าง Webhook และการยิงส่งข้อมูล (Webhook Specifications)

เมื่อมีข้อความเข้า, ตรวจพบรายการโอนเงินสำเร็จ, หรือบัญชี LINE หลุดการเชื่อมต่อ ระบบจะยิง HTTP POST Request (Content-Type: application/json) ไปยังทุก Webhook URL ที่ตรงเงื่อนไข event ของบัญชีนั้นแบบขนาน (parallel) โดยอัตโนมัติ

Webhook มี 2 ระดับ ยิงพร้อมกันทั้งคู่:
  • Account Webhook — ผูกกับบัญชี LINE บัญชีเดียว ตั้งได้หลายอันต่อบัญชี ผ่าน /api/accounts/:id/webhooks (และมี Webhook เดี่ยวแบบเก่า ฟิลด์ webhookUrl ตอนสร้าง/แก้ไขบัญชี ยิงด้วยเช่นกัน)
  • Global Webhook — ยิงทุก event จากทุกบัญชีในระบบ ตั้งได้หลายอันผ่าน /api/settings/webhooks
ถ้า URL ซ้ำกันระหว่างสองระดับ ระบบจะยิงแค่ครั้งเดียว ไม่ยิงซ้ำ

📦 Event: message

ยิงทุกครั้งที่มีข้อความเข้า/ออกในบัญชี (ก่อนกรองว่าเป็นรายการเงินเข้าหรือไม่)

{ "event": "message", "accountId": "8aaac309-7294-4da7-8446-ad76ae1fde42", "id": "625829214980931963", "from": "u8cc52e369d2bca4a5ce8c506170c712e", "to": "u376fb1f007e5a4011196957e13300bad", "type": "RECEIVE_MESSAGE", "contentType": "FLEX", "text": "แจ้งเตือนรายการเงินเข้า 500.00 บาท", "flexData": { "type": "flex", "altText": "..." }, "contentMetadata": { "FLEX_JSON": "..." }, "time": "2026-08-04T14:43:04.501Z" }

type เป็น RECEIVE_MESSAGE หรือ SEND_MESSAGE — flexData/contentMetadata เป็น null ถ้าไม่ใช่ Flex Message

💰 Event: payment (Full Mode — Default)

ยิงเมื่อระบบตรวจจับได้ว่าข้อความเป็นรายการแจ้งเตือนเงินเข้า (ยิงก่อน event message ของข้อความเดียวกันเสมอ)

{ "event": "payment", "accountId": "8aaac309-7294-4da7-8446-ad76ae1fde42", "bank": "KBANK", "amount": 500.00, "accountNumber": "xxx-x-x1234-x", "keyword": "เงินเข้า", "from": "u8cc52e369d2bca4a5ce8c506170c712e", "to": "u376fb1f007e5a4011196957e13300bad", "msgId": "625829214980931963", "rawText": "แจ้งเตือนรายการเงินเข้า 500.00 บาท บัญชี KBANK", "time": "2026-08-04T14:43:04.501Z" }

💸 Event: payment (Amount-Only Mode)

ถ้าตั้ง payloadMode: "amount_only" ตอนสร้าง Webhook (เฉพาะ event payment) ระบบจะย่อ payload เหลือแค่ยอดเงิน เหมาะกับระบบเติมเครดิตที่ต้องการแค่จำนวน:

{ "amount": 500 }

🔌 Event: disconnect

ยิงเมื่อบัญชีหลุดการเชื่อมต่อ / โดน LINE บังคับออกจากระบบ (Token หมดอายุ, ล็อกอินซ้อนจากอุปกรณ์อื่น ฯลฯ)

{ "event": "disconnect", "accountId": "8aaac309-7294-4da7-8446-ad76ae1fde42", "displayName": "บอทรับโอนกสิกร 01", "reason": "LOGGED_OUT", "previousStatus": "connected", "time": "2026-08-13T15:20:00.000Z" }

🔢 Event: pincode_request

ยิงเมื่อล็อกอินด้วย Email/Password (POST /api/accounts/login-password) แล้ว LINE ต้องการ PIN ยืนยันอุปกรณ์ใหม่ — ใช้แทน/คู่กับการ Poll GET /api/accounts/pending-pins

{ "event": "pincode_request", "accountId": "temp_acc_uuid_5678", "pincode": "123456", "timestamp": "2026-08-13T15:10:00.000Z" }

🔒 เรื่องความปลอดภัย (Secret Field)

Webhook แต่ละอันมีฟิลด์ secret ให้ตั้งค่าได้ตอนสร้าง/แก้ไข แต่ ณ ตอนนี้ระบบ ยังไม่ได้เซ็น Request ด้วย HMAC หรือแนบ Header ลายเซ็นใด ๆ มาให้ตรวจสอบ — คำขอที่ยิงออกไปมี Header แค่ Content-Type และ Connection เท่านั้น

คำแนะนำ: อย่าเพิ่งพึ่งการตรวจลายเซ็นฝั่งรับ ให้ปฏิบัติกับ Webhook URL ของคุณเหมือนเป็นความลับ (เดายาก/ไม่เผยแพร่) แทน จนกว่าจะมีการเพิ่มการเซ็น Request จริงในเวอร์ชันถัดไป

📌 Webhook รายบัญชี (Account Multi-Webhook API)

ตั้งได้หลาย Webhook ต่อบัญชี LINE หนึ่งบัญชี แต่ละอันเลือก event ที่จะรับได้อิสระ

GET /api/accounts/:id/webhooks

ดึง Webhook ทั้งหมดของบัญชีนั้น

POST /api/accounts/:id/webhooks

FIELDTYPEREQUIREDDESCRIPTION
urlstringYESWebhook URL ปลายทาง
namestringOPTIONALชื่ออ้างอิง (Default: Webhook)
eventsarrayOPTIONALเช่น ["message","payment","disconnect"] (Default: ["all"])
payloadModestringOPTIONALfull หรือ amount_only (มีผลกับ event payment เท่านั้น)
secretstringOPTIONALเก็บไว้อ้างอิง (ยังไม่ใช้เซ็น Request จริง — ดูหัวข้อความปลอดภัยด้านบน)

Response (201 Created)

{ "id": "wh_7d93215e", "url": "https://your-domain.com/webhook", "name": "Production", "events": ["message", "payment", "disconnect"], "payloadMode": "full", "secret": "", "createdAt": "2026-08-13T15:18:34.131Z" }

PATCH /api/accounts/:id/webhooks/:whId

แก้ไขฟิลด์ใดก็ได้จาก POST ด้านบน (ส่งเฉพาะฟิลด์ที่ต้องการแก้)

DEL /api/accounts/:id/webhooks/:whId

ลบ Webhook รายการนั้นออกจากบัญชี

🌐 Global Webhooks (ยิงทุกบัญชี)

โครงสร้างเหมือน Account Webhook ทุกอย่าง ต่างกันแค่ยิงทุก event จาก ทุกบัญชี ในระบบ ไม่ใช่แค่บัญชีเดียว

GET /api/settings/webhooks

ดึง Global Webhook ทั้งหมด

POST /api/settings/webhooks

FIELDTYPEREQUIREDDESCRIPTION
urlstringYESWebhook URL ปลายทาง
namestringOPTIONALชื่ออ้างอิง (Default: Global Webhook)
eventsarrayOPTIONALDefault: ["all"]
payloadModestringOPTIONALfull หรือ amount_only

Example Code (cURL)

cURL
curl -X POST https://apiline.xzrn.cloud/api/settings/webhooks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <YOUR_API_KEY>" \ -d '{"url": "https://your-domain.com/webhook", "name": "Production", "events": ["payment"]}'

Response (201 Created)

{ "id": "gwh_9ad08047", "name": "Production", "url": "https://your-domain.com/webhook", "events": ["payment"], "payloadMode": "full", "secret": "", "createdAt": "2026-08-13T15:18:34.131Z" }

PATCH /api/settings/webhooks/:whId

แก้ไขฟิลด์ใดก็ได้จาก POST ด้านบน

DEL /api/settings/webhooks/:whId

ลบ Global Webhook รายการนั้น

🧪 ทดสอบยิง Webhook

ยิง Payload ตัวอย่าง (สมมติเหตุการณ์ payment 500 บาท) ไปที่ Webhook URL จริงทันที เพื่อทดสอบฝั่งรับโดยไม่ต้องรอเงินเข้าจริง มีให้ทั้งสองระดับ:

POST /api/accounts/:id/webhooks/:whId/test

ทดสอบ Webhook รายบัญชี

POST /api/settings/webhooks/:whId/test

ทดสอบ Global Webhook

Response (200 OK)

{ "ok": true, "delivery": { "success": true, "status": 200, "response": { "received": true }, "url": "https://your-domain.com/webhook" } }

👤 จัดการผู้ใช้ Dashboard (Users API)

ผู้ใช้ Dashboard (แยกจาก API Keys) สำหรับล็อกอินเข้าหน้าเว็บจัดการระบบ ต้องเป็น role: admin เท่านั้นถึงจะจัดการผู้ใช้คนอื่นได้

GET /api/users

รายชื่อผู้ใช้ทั้งหมด (ไม่คืนรหัสผ่าน)

[ { "username": "admin", "role": "admin" } ]

POST /api/users

FIELDTYPEREQUIREDDESCRIPTION
usernamestringYESต้องไม่ซ้ำกับที่มีอยู่
passwordstringYES
rolestringOPTIONALadmin หรือ viewer (Default: viewer)

DEL /api/users/:u

ลบผู้ใช้ (ลบบัญชี admin ไม่ได้)

PATCH /api/users/:u/password

เปลี่ยนรหัสผ่าน — ผู้ใช้ทั่วไปเปลี่ยนได้เฉพาะรหัสผ่านตัวเอง, admin เปลี่ยนของใครก็ได้

FIELDTYPEREQUIRED
passwordstringYES

🔑 จัดการ API Keys (สำหรับเรียกจากภายนอก)

ใช้แทน Session Token เมื่อเรียก API จากระบบภายนอก/เซิร์ฟเวอร์อื่น ไม่หมดอายุอัตโนมัติเว้นแต่ตั้ง expiresIn

GET /api/keys

รายการ API Key ทั้งหมด (Admin only, คืนค่า Key ตัวเต็มเพราะเป็นหน้าจัดการของเจ้าของระบบ)

POST /api/keys

FIELDTYPEREQUIREDDESCRIPTION
namestringOPTIONALDefault: Default Key
permissionsarrayOPTIONALDefault: ["read","write","webhook"]
allowedIpsarrayOPTIONALจำกัด IP ที่ใช้ Key นี้ได้
rateLimitnumberOPTIONALคำขอ/นาที (Default: 100)
expiresInnumberOPTIONALจำนวนวันก่อนหมดอายุ

Response (201 Created)

{ "id": "key_795b20bb", "key": "lm_live_2a4a07f39af4480b939b876207b406c8", "name": "Default Key", "permissions": ["read", "write", "webhook"], "allowedIps": [], "rateLimit": 100, "expiresAt": null, "createdAt": "2026-08-13T15:19:06.278Z" }

ใช้ Key ที่ได้ยิงเป็น Authorization: Bearer lm_live_... ได้ทันทีกับ Endpoint ที่รองรับ API Key auth

PATCH /api/keys/:id

แก้ไข name, permissions, allowedIps, rateLimit, expiresAt (ส่งเฉพาะฟิลด์ที่ต้องการแก้)

DEL /api/keys/:id

เพิกถอน API Key ทันที

🛡️ IP Whitelist & Rate Limit

GET /api/ip-whitelist

{ "globalSettings": { "rateLimitPerMinute": 60, "ipRestrictionEnabled": false }, "rules": [ { "id": "ip_54a68a0c", "ip": "203.0.113.10", "type": "allow", "description": "Office" } ] }

POST /api/ip-whitelist

FIELDTYPEREQUIREDDESCRIPTION
ipstringYES
typestringOPTIONALallow หรือ deny (Default: allow)
descriptionstringOPTIONAL

DEL /api/ip-whitelist/:id

PATCH /api/v2/settings

เปิด/ปิดระบบจำกัด IP และตั้งค่า Rate Limit ส่วนกลาง

FIELDTYPE
rateLimitPerMinutenumber
ipRestrictionEnabledboolean

🏦 ตั้งค่าธนาคาร (Configurable Bank Detection)

กำหนดคำค้น (keywords) และตำแหน่งข้อมูลใน Flex Message ที่ใช้ตรวจจับยอดเงิน/เลขบัญชีของแต่ละธนาคาร ระบบมีค่าเริ่มต้นให้ 9 ธนาคาร/ช่องทางแล้ว (KBANK, SCB, KTB, BBL, BAY, TTB, GSB, PromptPay, TrueWallet)

GET /api/bank-configs

POST /api/bank-configs

FIELDTYPEREQUIREDDESCRIPTION
namestringYES
keywordsarrayYESคำที่ใช้จับคู่ว่าเป็นข้อความจากธนาคารนี้
amountPath / amountKeystringOPTIONALตำแหน่งยอดเงินใน Flex JSON
accountPath / accountKeystringOPTIONALตำแหน่งเลขบัญชีใน Flex JSON
accountId / fromMidstringOPTIONALผูกกฎนี้กับบัญชี LINE / ผู้ส่งที่เจาะจง
minAmount / maxAmountnumberOPTIONALDefault: 0 / 999999
enabledbooleanOPTIONALDefault: true

PATCH / PUT /api/bank-configs/:id

แก้ไขฟิลด์ใดก็ได้จาก POST ด้านบน

DEL /api/bank-configs/:id

🗂️ หมวดหมู่บัญชี (Categories)

GET /api/categories

["ทั่วไป", "กลุ่มหลัก", "บอทรับโอน", "VIP", "สำรอง"]

POST /api/categories

FIELDTYPEREQUIRED
namestringYES

DEL /api/categories/:name

ลบหมวดหมู่ (ลบ ทั่วไป ไม่ได้) — บัญชีที่อยู่ในหมวดที่ถูกลบจะย้ายกลับไป ทั่วไป อัตโนมัติ

⚙️ ตั้งค่าทั่วไป (Global Settings)

GET /api/settings

คืนออบเจกต์ settings ดิบทั้งหมด (รวม webhookUrl เก่าและ globalWebhooks[] — แนะนำให้ใช้ /api/settings/webhooks จัดการ Global Webhook แทนการแก้ตรงนี้)

PATCH /api/settings

Merge (ไม่ใช่ทับทั้งหมด) ข้อมูลที่ส่งเข้าไปกับ settings เดิม — Admin only

📎 API เสริมรายบัญชี

GET /api/accounts/:id/qr

ดึงรูป QR Code ล่าสุดของ session ที่กำลังรอสแกน (ใช้คู่กับ POST login-qr)

{ "url": "https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=..." }

GET /api/accounts/:id/logs

Log เหตุการณ์ของบัญชีนี้ 100 รายการล่าสุด (login, error, webhook, ฯลฯ)

POST /api/accounts/:id/reconnect

บังคับเชื่อมต่อบัญชีใหม่ทันที โดยใช้ Auth Token เดิมที่เก็บไว้ใน MySQL (account_sessions) หรือระบุ Token ใหม่ก็ได้

FIELDTYPEREQUIRED
tokenstringOPTIONAL — ไม่ส่งจะใช้ token เดิม

📊 Logs, Webhook Delivery History & Counts

GET /api/history/logs

ค้นหา Log ทุกประเภทของทุกบัญชี รองรับ accountId, type, page, limit — Response shape เดียวกับ /api/history/messages ({ data, pagination })

GET /api/history/webhooks

ประวัติการยิง Webhook (ดึงจากตาราง Log ที่ประเภทมีคำว่า WEBHOOK/HOOK) รองรับ accountId, page, limit

GET /api/counts

สรุปจำนวนรวมแบบเร็ว (ไม่มี Cache 800ms เหมือน /api/history/stats)

PARAMTYPEDESCRIPTION
accountIdstringOPTIONAL — ไม่ส่งจะนับรวมทุกบัญชี
{ "ok": true, "accountId": null, "messagesCount": 7509, "paymentsCount": 1420, "totalAmount": "450000.00", "logsCount": 9820, "webhooksCount": 1420, "timestamp": "2026-08-13T15:30:00.000Z" }

🔐 ตรวจสอบ / ออกจากระบบ Session

GET /api/auth/me

ตรวจสอบว่า Session Token ที่ถืออยู่ยังใช้ได้หรือไม่ (Dashboard ใช้เช็คตอนโหลดหน้าเว็บ) คืน 401 ถ้า Token หมดอายุ/เซิร์ฟเวอร์เพิ่ง Restart

POST /api/auth/logout

เพิกถอน Session Token ปัจจุบันทันที

🔌 การเชื่อมต่อ WebSocket เรียลไทม์ (Socket.io Protocol)

สำหรับแอปพลิเคชันที่ต้องการแสดงผลแบบ Live Stream ให้เชื่อมต่อ Socket.io บนพอร์ต 3001

ตัวอย่างการเชื่อมต่อใน JavaScript Client

import { io } from "socket.io-client"; const socket = io("https://apiline.xzrn.cloud", { auth: { token: "YOUR_SESSION_TOKEN" }, transports: ["websocket"] }); socket.on("connect", () => console.log("✅ WebSocket Connected!")); // ฟังข้อความ LINE เข้าแบบเรียลไทม์ (Latency < 0.05ms) socket.on("message", (msg) => { console.log("📥 New LINE Message:", msg.text, "From:", msg.from); }); // ฟังรายการโอนเงินสำเร็จเรียลไทม์ socket.on("payment", (pay) => { console.log("💰 Payment Detected! Amount:", pay.amount, "Bank:", pay.bank); });