🚀 LINE Monitor V3 - REST & WebSocket API Reference
ยินดีต้อนรับสู่เอกสารคู่มือการใช้งาน API ฉบับสมบูรณ์สำหรับระบบ **LINE Monitor V3 High-Performance Engine** ระบบรองรับการรันพร้อมกันได้สูงสุด 500+ บัญชี พร้อมระบบประมวลผลข้อความเรียลไทม์ และตรวจจับสลิปโอนเงินอัตโนมัติด้วยความเร็ว Sub-15ms
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:
2. Permanent API Key (สำหรับเรียกใช้ภายนอก / Third-Party Integration)
สร้าง API Key ได้จากระบบเมนู API Keys แล้วส่งผ่าน Header:
📌 API Endpoint ล็อกอิน: POST /api/auth/login
ใช้ยืนยันตัวตนเพื่อขอรับ Session Token สำหรับเข้าถึงระบบ
Request Body (JSON)
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
username | string | YES | ชื่อผู้ใช้งาน (Default: admin) |
password | string | YES | รหัสผ่าน (Default: admin123) |
Example Code (cURL)
Response (200 OK)
📱 การจัดการบัญชี LINE (Account Management API)
GET /api/accounts
ดึงรายการบัญชี LINE ทั้งหมดในระบบในคำขอเดียว พร้อมสถานะการเชื่อมต่อ, หมวดหมู่ และ Webhook ทั้งหมดของแต่ละบัญชี (ฟิลด์ webhooks) — ไม่ต้องยิงแยกไปที่ /api/accounts/:id/webhooks ทีละบัญชีอีกต่อไป
เส้นทางเดียวกันนี้ยังเรียกผ่าน GET /api/v2/accounts ได้ด้วย (รองรับ API Key auth)
Headers
Response (200 OK)
webhookUrl คือ Webhook เดี่ยวแบบเก่า (ตั้งค่าตอนสร้าง/แก้ไขบัญชี) ส่วน webhooks[] คือ Webhook หลายตัวต่อบัญชี (Multi-Webhook, ดูหัวข้อ Webhook Specifications) — ทั้งสองแบบจะยิงพร้อมกันเมื่อมี event เกิดขึ้น ระบบจะไม่ยิงซ้ำถ้า URL เดียวกันปรากฏทั้งสองที่
POST /api/accounts/login-qr
สร้างเซสชันสำหรับเพิ่มบัญชี LINE ใหม่ด้วยการสแกน QR Code
Request Body (JSON)
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
category | string | OPTIONAL | ชื่อหมวดหมู่ (Default: ทั่วไป) |
allowedChatIds | array | OPTIONAL | รายการ Chat ID ที่อนุญาตให้อ่านข้อความ |
webhookUrl | string | OPTIONAL | URL สำหรับส่ง Webhook เฉพาะบัญชีนี้ |
Response (200 OK)
เมื่อสร้างแล้ว ให้ฟัง Socket Event qr เพื่อรับรูปภาพ QR Code สำหรับสแกน
POST /api/accounts/login-token
เชื่อมต่อบัญชี LINE ทันทีด้วย Auth Token โดยไม่ต้องสแกน QR Code (หรือใช้ต่ออายุ/relogin บัญชีเดิมที่โทเคนหมดอายุ)
Request Body (JSON)
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
token | string | YES | LINE Account Primary Auth Token |
allowedChatIds | array | OPTIONAL | รายการ Chat ID ที่อนุญาตให้อ่านข้อความ |
webhookUrl | string | OPTIONAL | URL สำหรับส่ง Webhook เฉพาะบัญชีนี้ (แบบเดี่ยว) |
reloginAccountId | string | OPTIONAL | ระบุถ้าต้องการอัปเดตโทเคนของบัญชีเดิม แทนการสร้างบัญชีใหม่ |
Response (200 OK)
POST /api/accounts/login-password
เชื่อมต่อบัญชี LINE ด้วยอีเมล/รหัสผ่าน ระบบตอบกลับ id ทันที ส่วนการล็อกอินจริงทำงานเบื้องหลัง (ถ้า LINE ต้องการ PIN ยืนยันอุปกรณ์ใหม่ ให้ดูหัวข้อ กรอก PIN Code)
Request Body (JSON)
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
email | string | YES | อีเมลบัญชี LINE |
password | string | YES | รหัสผ่านบัญชี LINE |
allowedChatIds | array | OPTIONAL | รายการ Chat ID ที่อนุญาตให้อ่านข้อความ |
webhookUrl | string | OPTIONAL | URL สำหรับส่ง Webhook เฉพาะบัญชีนี้ |
Response (200 OK)
ให้ 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)
GET /api/accounts/:id/pin
ดึง PIN Code ของบัญชีใดบัญชีหนึ่งโดยเฉพาะ
PATCH /api/accounts/:id
แก้ไข Chat ID ที่อนุญาต, Webhook URL แบบเดี่ยว หรือหมวดหมู่ของบัญชีที่มีอยู่
Request Body (JSON)
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
allowedChatIds | array | OPTIONAL | รายการ Chat ID ที่อนุญาตให้อ่านข้อความ |
webhookUrl | string | OPTIONAL | URL Webhook แบบเดี่ยว |
category | string | OPTIONAL | หมวดหมู่บัญชี |
Response (200 OK)
DEL /api/accounts/:id
ลบบัญชีออกจากระบบถาวร ตัดการเชื่อมต่อ LINE, ลบ Session/E2EE Key ใน MySQL (account_sessions), และลบ Webhook เฉพาะบัญชีนี้ทั้งหมด
Response (200 OK)
💬 ระบบประวัติข้อความและเงินเข้า (Messages & Payments API)
GET /api/history/stats
ดึงสถิติยอดรวมข้อความทั้งหมด ยอดชำระเงินสำเร็จ และการกระจายตามธนาคารแบบเรียลไทม์
Response (200 OK)
GET /api/history/messages
ค้นหาและดึงประวัติข้อความ LINE ย้อนหลังจาก MySQL พร้อมฟิลเตอร์
Query Parameters
| PARAM | TYPE | DESCRIPTION |
|---|---|---|
accountId | string | กรองตามรหัสบัญชี LINE |
contentType | string | ประเภทข้อความ (NONE, FLEX, IMAGE) |
type | string | RECEIVE_MESSAGE หรือ SEND_MESSAGE |
startDate / endDate | string | กรองตามช่วงเวลา (ISO 8601) |
page | number | ลำดับหน้า (Default: 1) |
limit | number | จำนวนรายการต่อหน้า (Default: 50) |
Response (200 OK)
GET /api/history/payments
ค้นหาและดึงประวัติเงินเข้าที่ระบบตรวจจับได้ ย้อนหลังจาก MySQL พร้อมฟิลเตอร์
Query Parameters
| PARAM | TYPE | DESCRIPTION |
|---|---|---|
accountId | string | กรองตามรหัสบัญชี LINE |
bank | string | กรองตามธนาคาร เช่น KBANK, SCB |
minAmount / maxAmount | number | กรองตามช่วงจำนวนเงิน |
startDate / endDate | string | กรองตามช่วงเวลา (ISO 8601) |
page / limit | number | แบ่งหน้า (Default: 1 / 50) |
Response (200 OK)
⚡ โครงสร้าง Webhook และการยิงส่งข้อมูล (Webhook Specifications)
เมื่อมีข้อความเข้า, ตรวจพบรายการโอนเงินสำเร็จ, หรือบัญชี LINE หลุดการเชื่อมต่อ ระบบจะยิง HTTP POST Request (Content-Type: application/json) ไปยังทุก Webhook URL ที่ตรงเงื่อนไข event ของบัญชีนั้นแบบขนาน (parallel) โดยอัตโนมัติ
- Account Webhook — ผูกกับบัญชี LINE บัญชีเดียว ตั้งได้หลายอันต่อบัญชี ผ่าน
/api/accounts/:id/webhooks(และมี Webhook เดี่ยวแบบเก่า ฟิลด์webhookUrlตอนสร้าง/แก้ไขบัญชี ยิงด้วยเช่นกัน) - Global Webhook — ยิงทุก event จากทุกบัญชีในระบบ ตั้งได้หลายอันผ่าน
/api/settings/webhooks
📦 Event: message
ยิงทุกครั้งที่มีข้อความเข้า/ออกในบัญชี (ก่อนกรองว่าเป็นรายการเงินเข้าหรือไม่)
type เป็น RECEIVE_MESSAGE หรือ SEND_MESSAGE — flexData/contentMetadata เป็น null ถ้าไม่ใช่ Flex Message
💰 Event: payment (Full Mode — Default)
ยิงเมื่อระบบตรวจจับได้ว่าข้อความเป็นรายการแจ้งเตือนเงินเข้า (ยิงก่อน event message ของข้อความเดียวกันเสมอ)
💸 Event: payment (Amount-Only Mode)
ถ้าตั้ง payloadMode: "amount_only" ตอนสร้าง Webhook (เฉพาะ event payment) ระบบจะย่อ payload เหลือแค่ยอดเงิน เหมาะกับระบบเติมเครดิตที่ต้องการแค่จำนวน:
🔌 Event: disconnect
ยิงเมื่อบัญชีหลุดการเชื่อมต่อ / โดน LINE บังคับออกจากระบบ (Token หมดอายุ, ล็อกอินซ้อนจากอุปกรณ์อื่น ฯลฯ)
🔢 Event: pincode_request
ยิงเมื่อล็อกอินด้วย Email/Password (POST /api/accounts/login-password) แล้ว LINE ต้องการ PIN ยืนยันอุปกรณ์ใหม่ — ใช้แทน/คู่กับการ Poll GET /api/accounts/pending-pins
🔒 เรื่องความปลอดภัย (Secret Field)
Webhook แต่ละอันมีฟิลด์ secret ให้ตั้งค่าได้ตอนสร้าง/แก้ไข แต่ ณ ตอนนี้ระบบ ยังไม่ได้เซ็น Request ด้วย HMAC หรือแนบ Header ลายเซ็นใด ๆ มาให้ตรวจสอบ — คำขอที่ยิงออกไปมี Header แค่ Content-Type และ Connection เท่านั้น
📌 Webhook รายบัญชี (Account Multi-Webhook API)
ตั้งได้หลาย Webhook ต่อบัญชี LINE หนึ่งบัญชี แต่ละอันเลือก event ที่จะรับได้อิสระ
GET /api/accounts/:id/webhooks
ดึง Webhook ทั้งหมดของบัญชีนั้น
POST /api/accounts/:id/webhooks
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
url | string | YES | Webhook URL ปลายทาง |
name | string | OPTIONAL | ชื่ออ้างอิง (Default: Webhook) |
events | array | OPTIONAL | เช่น ["message","payment","disconnect"] (Default: ["all"]) |
payloadMode | string | OPTIONAL | full หรือ amount_only (มีผลกับ event payment เท่านั้น) |
secret | string | OPTIONAL | เก็บไว้อ้างอิง (ยังไม่ใช้เซ็น Request จริง — ดูหัวข้อความปลอดภัยด้านบน) |
Response (201 Created)
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
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
url | string | YES | Webhook URL ปลายทาง |
name | string | OPTIONAL | ชื่ออ้างอิง (Default: Global Webhook) |
events | array | OPTIONAL | Default: ["all"] |
payloadMode | string | OPTIONAL | full หรือ amount_only |
Example Code (cURL)
Response (201 Created)
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)
👤 จัดการผู้ใช้ Dashboard (Users API)
ผู้ใช้ Dashboard (แยกจาก API Keys) สำหรับล็อกอินเข้าหน้าเว็บจัดการระบบ ต้องเป็น role: admin เท่านั้นถึงจะจัดการผู้ใช้คนอื่นได้
GET /api/users
รายชื่อผู้ใช้ทั้งหมด (ไม่คืนรหัสผ่าน)
POST /api/users
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
username | string | YES | ต้องไม่ซ้ำกับที่มีอยู่ |
password | string | YES | |
role | string | OPTIONAL | admin หรือ viewer (Default: viewer) |
DEL /api/users/:u
ลบผู้ใช้ (ลบบัญชี admin ไม่ได้)
PATCH /api/users/:u/password
เปลี่ยนรหัสผ่าน — ผู้ใช้ทั่วไปเปลี่ยนได้เฉพาะรหัสผ่านตัวเอง, admin เปลี่ยนของใครก็ได้
| FIELD | TYPE | REQUIRED |
|---|---|---|
password | string | YES |
🔑 จัดการ API Keys (สำหรับเรียกจากภายนอก)
ใช้แทน Session Token เมื่อเรียก API จากระบบภายนอก/เซิร์ฟเวอร์อื่น ไม่หมดอายุอัตโนมัติเว้นแต่ตั้ง expiresIn
GET /api/keys
รายการ API Key ทั้งหมด (Admin only, คืนค่า Key ตัวเต็มเพราะเป็นหน้าจัดการของเจ้าของระบบ)
POST /api/keys
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
name | string | OPTIONAL | Default: Default Key |
permissions | array | OPTIONAL | Default: ["read","write","webhook"] |
allowedIps | array | OPTIONAL | จำกัด IP ที่ใช้ Key นี้ได้ |
rateLimit | number | OPTIONAL | คำขอ/นาที (Default: 100) |
expiresIn | number | OPTIONAL | จำนวนวันก่อนหมดอายุ |
Response (201 Created)
ใช้ 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
POST /api/ip-whitelist
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
ip | string | YES | |
type | string | OPTIONAL | allow หรือ deny (Default: allow) |
description | string | OPTIONAL |
DEL /api/ip-whitelist/:id
PATCH /api/v2/settings
เปิด/ปิดระบบจำกัด IP และตั้งค่า Rate Limit ส่วนกลาง
| FIELD | TYPE |
|---|---|
rateLimitPerMinute | number |
ipRestrictionEnabled | boolean |
🏦 ตั้งค่าธนาคาร (Configurable Bank Detection)
กำหนดคำค้น (keywords) และตำแหน่งข้อมูลใน Flex Message ที่ใช้ตรวจจับยอดเงิน/เลขบัญชีของแต่ละธนาคาร ระบบมีค่าเริ่มต้นให้ 9 ธนาคาร/ช่องทางแล้ว (KBANK, SCB, KTB, BBL, BAY, TTB, GSB, PromptPay, TrueWallet)
GET /api/bank-configs
POST /api/bank-configs
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
name | string | YES | |
keywords | array | YES | คำที่ใช้จับคู่ว่าเป็นข้อความจากธนาคารนี้ |
amountPath / amountKey | string | OPTIONAL | ตำแหน่งยอดเงินใน Flex JSON |
accountPath / accountKey | string | OPTIONAL | ตำแหน่งเลขบัญชีใน Flex JSON |
accountId / fromMid | string | OPTIONAL | ผูกกฎนี้กับบัญชี LINE / ผู้ส่งที่เจาะจง |
minAmount / maxAmount | number | OPTIONAL | Default: 0 / 999999 |
enabled | boolean | OPTIONAL | Default: true |
PATCH / PUT /api/bank-configs/:id
แก้ไขฟิลด์ใดก็ได้จาก POST ด้านบน
DEL /api/bank-configs/:id
🗂️ หมวดหมู่บัญชี (Categories)
GET /api/categories
POST /api/categories
| FIELD | TYPE | REQUIRED |
|---|---|---|
name | string | YES |
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)
GET /api/accounts/:id/logs
Log เหตุการณ์ของบัญชีนี้ 100 รายการล่าสุด (login, error, webhook, ฯลฯ)
POST /api/accounts/:id/reconnect
บังคับเชื่อมต่อบัญชีใหม่ทันที โดยใช้ Auth Token เดิมที่เก็บไว้ใน MySQL (account_sessions) หรือระบุ Token ใหม่ก็ได้
| FIELD | TYPE | REQUIRED |
|---|---|---|
token | string | OPTIONAL — ไม่ส่งจะใช้ 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)
| PARAM | TYPE | DESCRIPTION |
|---|---|---|
accountId | string | OPTIONAL — ไม่ส่งจะนับรวมทุกบัญชี |
🔐 ตรวจสอบ / ออกจากระบบ 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