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 ถ้าไม่ระบุ)expiresInMinutes— number — หมดอายุ 1–43200 นาที (default 15 นาที, สูงสุด 30 วัน)returnUrl— string — redirect ลูกค้าอัตโนมัติ 5 วิหลังชำระสำเร็จ พร้อม ?status=paid&token=... (optional)webhookUrl— string — HTTP callback เฉพาะ link นี้ รับ payment.paid / payment.rejected (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",
"expiresInMinutes": 15,
"returnUrl": "https://your-site.com/order/success",
"webhookUrl": "https://your-site.com/api/payment-callback"
}'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)expiresInMinutes— number 1–10080 นาที (default 5 นาที, สูงสุด 7 วัน)returnUrl— string — redirect ลูกค้าอัตโนมัติ 5 วิหลังยืนยันสำเร็จ พร้อม ?status=verified&token=... (optional)webhookUrl— string — HTTP callback เฉพาะ record นี้ รับ bank_verification.verified / bank_verification.rejected (optional)metadata— 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 - ระบบส่ง callback POST ไปที่
webhookUrlทันที พร้อม eventbank_verification.verified - ลูกค้าเห็น countdown 5 วินาที → auto-redirect ไป
returnUrl?status=verified&token=...
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",
"expiresInMinutes": 5,
"returnUrl": "https://your-site.com/verified",
"webhookUrl": "https://your-site.com/api/bank-verify-callback"
}'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 & Callbacks
ระบบส่งข้อมูลกลับ 2 แบบ — Tenant Webhook Endpoints (ตั้งได้หลาย URL ใน dashboard) และ Per-record Callback (ระบุ webhookUrl ตอนสร้าง resource)
① Tenant Webhook Endpoints
ตั้งค่าใน /dashboard/webhooks — เลือก events ที่ต้องการ ระบบยิงทุกครั้งที่ event นั้นเกิด พร้อม retry 5 ครั้ง (backoff 1m→5m→15m→1h→4h) — ลายเซ็นใช้ Endpoint Secret (แสดงตอนสร้าง/แก้ไข)
② Per-record Callback (webhookUrl)
ระบุ webhookUrl ตอน POST /api/v1/... — ยิงเฉพาะ resource นั้น ทันทีที่สถานะเปลี่ยน (fire-and-forget, ไม่มี retry) — ลายเซ็นใช้ CALLBACK_SECRET env
7.1 Events ทั้งหมด
session.submittedลูกค้าส่ง KYC รอตรวจสอบsession.approvedAdmin อนุมัติ KYCsession.rejectedAdmin ปฏิเสธ KYCsession.expiredSession หมดเวลาก่อนกรอกเสร็จ (cron)payment.paidPayment ชำระสำเร็จ (auto หรือ admin)payment.rejectedAdmin ปฏิเสธ paymentpayment.expiredPayment link หมดเวลาก่อนจ่าย (cron)bank_verification.verifiedยืนยันบัญชีธนาคารสำเร็จbank_verification.rejectedAdmin ปฏิเสธ bank verificationbank_verification.expiredBank verification หมดเวลา (cron)7.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 Payload (ตัวอย่าง payment.paid)
{
"event": "payment.paid",
"timestamp": 1729258900,
"data": {
"id": "uuid",
"token": "abc123...",
"status": "paid",
"amount": 1500.00,
"externalId": "ORD-456",
"paidAt": "2026-05-06T09:00:00Z",
"rejectionReason": null
}
}7.5 Payload (ตัวอย่าง payment.expired / session.expired)
{
"event": "payment.expired",
"timestamp": 1729259000,
"data": {
"id": "uuid",
"token": "abc123...",
"status": "expired",
"amount": 1500.00,
"externalId": "ORD-456",
"paidAt": null,
"rejectionReason": null
}
}
// session.expired → data มี sessionToken, submittedAt = null
// bank_verification.expired → data มี token, verifiedAt = null7.6 ตรวจสอบลายเซ็น (HMAC SHA-256)
import crypto from 'crypto'
// ใช้ Endpoint Secret (tenant webhook) หรือ CALLBACK_SECRET (per-record)
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET
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.7 returnUrl — Browser Redirect
หาก resource มี returnUrl ระบบจะ redirect browser ลูกค้าอัตโนมัติ 5 วินาทีหลังสำเร็จ:
Payment Linkเมื่อ status = paid → redirect ไป returnUrl?status=paid&token=...Bank Verificationเมื่อ status = verified → redirect ไป returnUrl?status=verified&token=...7.8 Retry policy (Tenant Endpoints เท่านั้น)
ถ้า endpoint ตอบ non-2xx ระบบจะ retry 5 ครั้ง ด้วย exponential backoff: 1m → 5m → 15m → 1h → 4h — retry ด้วย cron ที่รันทุกนาที
webhookUrl) ไม่มี retry — fire-and-forget เท่านั้น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