API Documentation
เอกสาร REST API สำหรับเชื่อมต่อระบบของคุณกับ KYC LIFE
1. Getting Started
KYC LIFE ให้บริการ 4 ระบบหลักผ่าน REST API:
- KYC Sessions — เก็บข้อมูลบัตรประชาชน, selfie, ที่อยู่ พร้อมระบบอนุมัติ
- Payment Links — สร้างลิงก์รับเงิน ตรวจสลิปอัตโนมัติ
- Bank Verifications — ยืนยันว่าลูกค้าเป็นเจ้าของบัญชีธนาคารจริง
- Banks — reference data รหัส/ชื่อ/logo ธนาคารไทย (public)
https://kyc.life2. Authentication
ทุก request ต้องส่ง API key ผ่าน Authorization header:
Authorization: Bearer kyc_live_xxxxxxxxxxxxxxxxxxxxxxxx
- Live keys (
kyc_live_...) — ใช้กับ production - Test keys (
kyc_test_...) — sandbox, ไม่นับโควตา - Rate limit default: 60 req/min (ปรับได้ต่อ key)
- IP allowlist: ระบุได้ต่อ key
- Idempotency-Key header รองรับบน POST endpoints (cache 24 ชม.)
3. KYC Sessions
สร้าง session → รับ URL → ส่งให้ลูกค้ากรอกข้อมูล → admin อนุมัติ → webhook ส่งกลับ
3.1 Endpoints
/api/v1/sessionsscope: sessions:createสร้าง KYC session ใหม่ สำหรับลูกค้าปลายทางกรอก
Request body
externalId— string — ID ลูกค้าในระบบคุณ (optional, ใช้ filter ได้)referenceNote— string — คำอธิบายสำหรับ admin (optional)metadata— object — ข้อมูลเพิ่มเติมที่คุณต้องการเก็บ (optional)webhookUrl— string — override webhook URL เฉพาะ session นี้ (optional)requireBankVerify— boolean — บังคับให้ลูกค้ายืนยันบัญชีธนาคารด้วย (default: false)expiresInHours— number 1–168 — ลิงก์หมดอายุกี่ชั่วโมง (default: 24)Response
{
"id": "uuid",
"sessionToken": "abc123...",
"url": "https://kyc.life/kyc/abc123...",
"status": "created",
"expiresAt": "2026-04-19T12:00:00Z",
"externalId": "customer-123",
"createdAt": "2026-04-18T12:00:00Z",
"environment": "live"
}/api/v1/sessionsscope: sessions:readรายการ sessions (ล่าสุดก่อน)
Query params
status— created | in_progress | submitted | approved | rejected | expiredexternalId— filter ตาม external IDlimit— จำนวนต่อหน้า (default 20, max 100)/api/v1/sessions/:idscope: sessions:readดึงรายละเอียด session พร้อมผลการยืนยัน (รับได้ทั้ง UUID หรือ sessionToken)
Response
{
"id": "uuid",
"sessionToken": "abc123...",
"status": "approved",
"externalId": "customer-123",
"personalInfo": {
"firstName": "สมชาย",
"lastName": "ใจดี",
"idCardNumber": "1234567890123",
"dateOfBirth": "1990-01-15T00:00:00Z",
"nationality": "TH",
"phone": "0812345678",
"email": "[email protected]"
},
"address": { "addressLine1": "...", "district": "...", "province": "...", "postalCode": "..." },
"documents": {
"idCardFrontUrl": "https://...",
"idCardBackUrl": "https://...",
"selfieUrl": "https://..."
},
"bankAccount": {
"status": "verified",
"accountName": "สมชาย ใจดี",
"accountNumber": "1234567890",
"bankCode": "KBANK"
},
"riskScore": 12,
"rejectionReason": null,
"reviewedAt": "2026-04-18T13:00:00Z",
"submittedAt": "2026-04-18T12:30:00Z",
"createdAt": "2026-04-18T12:00:00Z"
}3.2 Session lifecycle
createdเพิ่งสร้างผ่าน API ลูกค้ายังไม่เปิดลิงก์in_progressลูกค้าเปิดลิงก์แล้ว กำลังกรอกข้อมูลsubmittedลูกค้ากดส่งแล้ว รอ admin ตรวจสอบapprovedAdmin อนุมัติ — webhook session.approved ยิงออกrejectedAdmin ปฏิเสธ — webhook session.rejected + ลูกค้าแก้ไขได้expiredลิงก์หมดอายุก่อนกรอกเสร็จ3.3 ตัวอย่าง: สร้าง session ธรรมดา
curl -X POST https://kyc.life/api/v1/sessions \
-H "Authorization: Bearer kyc_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"externalId": "user-123",
"expiresInHours": 48
}'
# Response:
# { "url": "https://kyc.life/kyc/abc123...", ... }3.4 ตัวอย่าง: สร้าง session + ยืนยันบัญชีธนาคาร
curl -X POST https://kyc.life/api/v1/sessions \
-H "Authorization: Bearer kyc_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"externalId": "user-123",
"requireBankVerify": true,
"expiresInHours": 48,
"metadata": { "order_id": "ORD-456" }
}'4. Payment Links
สร้างลิงก์รับเงินผ่าน API → ลูกค้าจ่ายแล้ว upload สลิป → ระบบยืนยันอัตโนมัติผ่าน EasySlip → webhook กลับ
/dashboard/settings ก่อนใช้งาน4.1 Endpoints
/api/v1/payment-linksscope: payments:createสร้าง payment link — ส่งให้ลูกค้าจ่ายเงิน ระบบตรวจสลิปอัตโนมัติ
Request body
description— string — รายละเอียด (required)amount— number — จำนวนเงินบาท (required, > 0)customerName— string (optional)customerEmail— string (optional)customerPhone— string (optional)externalId— string — อ้างอิงภายใน (optional)systemBankAccountId— string — บัญชีรับเงิน (optional, ใช้ primary ถ้าไม่ระบุ)expiresInHours— number — หมดอายุ 1-720 ชม. (default 24)returnUrl— string — redirect หลังจ่าย (optional)webhookUrl— string — override webhook (optional)metadata— object (optional)Response
{
"id": "uuid",
"token": "abc123...",
"url": "https://kyc.life/pay/abc123...",
"status": "pending",
"amount": 1000,
"description": "ค่าสินค้า ORD-123",
"expiresAt": "2026-04-19T12:00:00Z",
"externalId": "ORD-123",
"createdAt": "2026-04-18T12:00:00Z"
}/api/v1/payment-linksscope: payments:readรายการ payment links
Query params
status— pending | verifying | paid | rejected | expired | cancelledexternalId— filter ตาม external IDlimit— default 20, max 100/api/v1/payment-links/:idscope: payments:readดึงรายละเอียด payment link (รับ UUID หรือ token)
/api/v1/payment-links/:idscope: payments:createยกเลิก payment link (เฉพาะสถานะ pending หรือ verifying)
4.2 Verification pipeline
- ลูกค้าเปิดลิงก์ → เห็น QR PromptPay + รายละเอียดบัญชี + จำนวนที่ต้องโอน
- โอนเงิน → upload สลิป → ส่งเข้า EasySlip API
- Duplicate check — trans ref ห้ามซ้ำ (cross-check payment + KYC + bank verify)
- Amount — ตรงกับ amount ใน payment link (tolerance 0.01)
- Receiver account — ต้องตรงกับบัญชีระบบ
- Transaction time — สลิปอายุไม่เกิน 24 ชม.
- ถ้าผ่านทุกข้อ →
paid+ webhookpayment.paid - ถ้าไม่ตรง →
verifyingรอ admin review
4.3 Payment status
pendingรอลูกค้าจ่ายเงินverifyingUpload สลิปแล้ว แต่ verify อัตโนมัติไม่ผ่าน รอ adminpaidชำระเงินสำเร็จ (auto-verified หรือ admin approved)rejectedAdmin ปฏิเสธexpiredลิงก์หมดอายุก่อนจ่ายcancelledTenant ยกเลิกเอง4.4 ตัวอย่าง: สร้าง payment link
curl -X POST https://kyc.life/api/v1/payment-links \
-H "Authorization: Bearer kyc_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"description": "ค่าสินค้า ORD-456",
"amount": 1500.00,
"customerName": "สมชาย ใจดี",
"externalId": "ORD-456",
"expiresInHours": 48
}'5. Bank Verifications
ยืนยันว่าลูกค้าเป็นเจ้าของบัญชีธนาคารจริง — เป็นบริการแยกต่างหากไม่ยึดติดกับ KYC ใช้หลัก: โอนเงินจำนวนสุ่ม 0.01–2.99 บาทจากบัญชีลูกค้า → verify กับสลิปผ่าน EasySlip
/dashboard/settings ก่อน5.1 Endpoints
/api/v1/bank-verificationsscope: bank_verifications:createสร้าง bank verification link — ยืนยันว่าลูกค้าเป็นเจ้าของบัญชีธนาคารจริง (แยกจากระบบ KYC)
Request body
customerName— string — ชื่อลูกค้า (optional, ใช้ตรวจ name match)customerEmail— stringcustomerPhone— stringexternalId— string — ID ลูกค้าในระบบคุณaccountName— string — ชื่อบัญชีลูกค้า (pre-fill)accountNumber— string — เลขบัญชี (pre-fill)bankCode— string — รหัสธนาคาร เช่น KBANK, SCB, BBL (pre-fill)systemBankAccountId— string — บัญชีรับเงิน (optional)expiresInHours— number 1-168 (default 48)returnUrl— string — redirect หลังยืนยันสำเร็จwebhookUrl— string — override webhook URLmetadata— objectResponse
{
"id": "uuid",
"token": "abc123...",
"url": "https://kyc.life/bank-verify/abc123...",
"status": "pending",
"verifyAmount": 1.53,
"verifyCode": "A3F9B2",
"externalId": "user-123",
"expiresAt": "2026-04-22T12:00:00Z",
"createdAt": "2026-04-20T12:00:00Z"
}/api/v1/bank-verificationsscope: bank_verifications:readรายการ bank verifications
Query params
status— pending | verifying | verified | rejected | expired | cancelledexternalId— filter ตาม external IDlimit— default 20, max 100/api/v1/bank-verifications/:idscope: bank_verifications:readดึงรายละเอียด bank verification (รับ UUID หรือ token)
/api/v1/bank-verifications/:idscope: bank_verifications:createยกเลิก bank verification
5.2 Integration flow (เว็บต้นทาง)
- ลูกค้ากรอกข้อมูลบัญชีธนาคารที่เว็บคุณ (ชื่อ, เลขบัญชี, ธนาคาร) แล้วกดส่ง
- Backend ของคุณเรียก
POST /api/v1/bank-verificationsพร้อม accountName, accountNumber, bankCode + returnUrl, webhookUrl - ระบบคืน URL สำหรับลูกค้า → คุณ redirect ลูกค้าไป
- ลูกค้าเห็นสรุปบัญชี (pre-filled) + QR บัญชีปลายทาง + ยอดสุ่ม + ref code
- ลูกค้าโอน + upload สลิป → EasySlip verify → auto
verifiedหรือrejected - ระบบส่ง webhook
bank_verification.verifiedกลับไปที่webhookUrl - ลูกค้าเห็นปุ่ม "กลับสู่หน้าต้นทาง" → redirect กลับ
returnUrl
5.3 Verification pipeline
- Duplicate — trans ref ห้ามซ้ำ (cross-check ระบบ KYC + Payment + Bank Verify)
- Amount — ตรงกับที่ระบบสุ่มไว้
- Receiver — ตรงกับบัญชีระบบ (ของ tenant)
- Sender name — ตรงกับ
accountName(TH/EN name match) - Transaction time — สลิปอายุไม่เกิน 24 ชม.
5.4 ตัวอย่าง: สร้าง bank verification พร้อม pre-fill
curl -X POST https://kyc.life/api/v1/bank-verifications \
-H "Authorization: Bearer kyc_live_xxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: user-123-${timestamp}" \
-d '{
"customerName": "สมชาย ใจดี",
"customerEmail": "[email protected]",
"externalId": "user-123",
"accountName": "สมชาย ใจดี",
"accountNumber": "1234567890",
"bankCode": "KBANK",
"returnUrl": "https://your-site.com/verified",
"webhookUrl": "https://your-site.com/api/kyc-webhook"
}'5.5 Webhook payload: bank_verification.verified
{
"event": "bank_verification.verified",
"timestamp": 1729258800,
"data": {
"id": "uuid",
"token": "abc123...",
"externalId": "user-123",
"status": "verified",
"customer": { "name": "สมชาย ใจดี", "email": "..." },
"account": {
"accountName": "สมชาย ใจดี",
"accountNumber": "1234567890",
"bankCode": "KBANK"
},
"slip": {
"url": "https://kyc.life/uploads/...",
"transRef": "0123456789",
"senderName": "สมชาย ใจดี",
"senderAccount": "xxx-x-x7890",
"senderBank": "Kasikornbank"
},
"verifyAmount": 1.53,
"verifyCode": "A3F9B2",
"verifiedAt": "2026-04-20T12:05:00Z",
"metadata": { "yourOrderId": "..." }
}
}6. Banks Reference
Reference data ของธนาคารไทย — รหัส BOT, ชื่อ TH/EN, abbreviation, และ logo PNG เป็น public endpoint ไม่ต้องใช้ API key
6.1 Endpoints
/api/v1/banksscope: publicรายชื่อธนาคารไทยทั้งหมด (รหัส, ชื่อ TH/EN, abbreviation, logo URL) — ไม่ต้องใช้ API key
Query params
lang— 'th' (default) หรือ 'en'Response
{
"banks": [
{
"code": "004",
"abbreviation": "KBANK",
"name": "ธนาคารกสิกรไทย",
"nameTH": "ธนาคารกสิกรไทย",
"nameEN": "Kasikornbank",
"logo": "https://kyc.life/banks/kbank.png"
}
],
"count": 18
}/api/v1/banks/:codescope: publicดูข้อมูลธนาคาร — ส่งได้ทั้ง BOT code ("004") หรือ abbreviation ("KBANK")
Query params
lang— 'th' (default) หรือ 'en'/api/v1/banks/:code/logoscope: publicดาวน์โหลด logo ธนาคารเป็นไฟล์ PNG โดยตรง (cache 7 วัน)
6.2 ตัวอย่าง: ดึงรายชื่อธนาคารทั้งหมด
curl https://kyc.life/api/v1/banks # ใช้ใน dropdown ตอน customer เลือกธนาคาร # หรือใช้ logo URL แสดงใน UI ของเว็บคุณ
6.3 ตัวอย่าง: แสดง logo ธนาคาร
<!-- ใช้ใน HTML ได้เลย -->
<img src="https://kyc.life/api/v1/banks/KBANK/logo" alt="KBANK" />
# หรือดึง metadata + logo URL ไปใช้
curl https://kyc.life/api/v1/banks/004
# → { "code": "004", "abbreviation": "KBANK", "logo": "...", ... }7. Webhooks
เมื่อ session/payment/bank verification เปลี่ยนสถานะ ระบบจะ POST ไปที่ webhook URL ที่ตั้งไว้ พร้อม HMAC SHA-256 signature
7.1 Events
session.submittedลูกค้าส่ง KYC รอตรวจสอบsession.approvedAdmin อนุมัติ KYCsession.rejectedAdmin ปฏิเสธ KYCpayment.paidPayment ชำระสำเร็จ (auto หรือ manual)payment.rejectedAdmin ปฏิเสธ paymentbank_verification.verifiedยืนยันบัญชีธนาคารสำเร็จbank_verification.rejectedAdmin ปฏิเสธ bank verification7.2 Request headers
X-KYC-Signature: t=1729258800,v1=abc123... X-KYC-Event: session.approved Content-Type: application/json
7.3 Payload (ตัวอย่าง session.approved)
{
"event": "session.approved",
"timestamp": 1729258800,
"data": {
"id": "uuid",
"sessionToken": "abc123...",
"externalId": "user-123",
"status": "approved",
"personalInfo": { "firstName": "...", "idCardNumber": "..." },
"documents": { "idCardFrontUrl": "...", "selfieUrl": "..." },
"riskScore": 12,
"reviewedAt": "2026-04-18T13:00:00Z",
"metadata": { "order_id": "ORD-456" }
}
}7.4 ตรวจสอบลายเซ็น (HMAC SHA-256)
import crypto from 'crypto'
const header = req.headers['x-kyc-signature']
const [ts, sig] = header.split(',').map(p => p.split('=')[1])
const expected = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(`${ts}.${rawBody}`)
.digest('hex')
const valid = crypto.timingSafeEqual(
Buffer.from(sig, 'hex'),
Buffer.from(expected, 'hex')
)7.5 Retry policy
ถ้า webhook endpoint ตอบ non-2xx ระบบจะ retry 5 ครั้ง ด้วย exponential backoff: 1m → 5m → 15m → 1h → 4h
8. Error Codes
missing_api_key401ไม่ได้ส่ง Authorization header
invalid_api_key401API key ไม่ถูกต้อง / หมดอายุ / ถูก revoke
ip_not_allowed403IP ไม่อยู่ใน allowlist
insufficient_scope403API key ไม่มี scope ที่ต้องการ
rate_limited429เกิน rate limit (ดู Retry-After header)
quota_exceeded429เกินโควตาของ plan
session_not_found404ไม่พบ session
tenant_not_found404ไม่พบ tenant
9. Node.js SDK
npm install @kyc-life/node
import { KycLife } from '@kyc-life/node'
const kyc = new KycLife({ apiKey: process.env.KYC_LIFE_API_KEY })
// KYC session
const session = await kyc.sessions.create({ externalId: 'user-123' })
// Payment link
const payment = await kyc.paymentLinks.create({
description: 'Order #456',
amount: 1500,
externalId: 'order-456',
})
// Bank account verification (with pre-fill from your site)
const bv = await kyc.bankVerifications.create({
customerName: 'สมชาย ใจดี',
externalId: 'user-123',
accountName: 'สมชาย ใจดี',
accountNumber: '1234567890',
bankCode: 'KBANK',
returnUrl: 'https://your-site.com/verified',
})
// Redirect customer to bv.url / session.url / payment.url