Skip to content

POST /verify/bank/batch

ส่ง หลาย สลิปธนาคารในคำขอเดียว (สูงสุด 100) คืนค่า batchId และ jobId หนึ่งค่าต่อสลิป แต่ละสลิปจะสร้าง Webhook Callback ของตัวเอง

Endpoint

http
POST /verify/bank/batch

URL เต็ม: https://api.thunder.in.th/v2/verify/bank/batch

การยืนยันตัวตน

จำเป็น ดูคู่มือการยืนยันตัวตน

http
Authorization: Bearer YOUR_API_KEY

Request

ส่ง Body แบบ JSON ที่มี callbackUrl (เสริม) และ array slips แต่ละรายการใน slips คือ QR payload อย่างเดียว — ออบเจกต์ { "payload": "...", ... } พร้อมพารามิเตอร์การจับคู่เสริม (กฎเดียวกับ POST /verify/bank/async)

ฟิลด์ประเภทคำอธิบาย
slipsarrayจำเป็น 1-100 ออบเจกต์ payload แต่ละรายการถูกตรวจสอบแยกกัน
callbackUrlstringhttps เท่านั้น ใช้กับ Webhook ของทุกสลิป หากไม่ระบุ จะใช้ Default Webhook URL ของ branch

ข้อจำกัดและการตรวจสอบของ Batch

  • แต่ละสลิปเป็น QR payload อย่างเดียว — ไม่รองรับรูป, Base64 และ URL (แบบซิงโครนัส POST /verify/bank ยังรับครบทุกแบบ)
  • สูงสุด 100 สลิปต่อ batch — เกินกว่านั้นได้ 400 VALIDATION_ERROR
  • แต่ละสลิปถูกตรวจสอบแยกกัน หากมีสลิป ใด payload ว่าง/ขาดหาย ทั้ง batch จะถูกปฏิเสธด้วย 400 และ ไม่มีอะไรเข้าคิว

Type Definitions

typescript
// Request
interface AsyncVerifyBankBatchRequest {
  callbackUrl?: string;        // https เท่านั้น; fallback ไปที่ default ของ branch; ใช้กับทุกสลิป
  slips: AsyncBatchSlip[];     // 1-100 รายการ
}

interface AsyncBatchSlip {
  payload: string;             // จำเป็น — QR payload (1-128 ตัวอักษร)

  // พารามิเตอร์เสริม (เหมือนแบบ sync)
  remark?: string;             // 1-255 ตัวอักษร
  matchAccount?: boolean;
  matchAmount?: number;
  checkDuplicate?: boolean;
}

// Response (202 Accepted)
interface AsyncBatchResponse {
  success: true;
  data: {
    batchId: string;           // UUID ของ batch
    jobs: {
      jobId: string;           // UUID ต่อสลิป
      index: number;           // ตำแหน่งใน array `slips` ที่ส่งมา (เริ่มจาก 0)
    }[];
  };
}

ตัวอย่าง

bash
curl -X POST https://api.thunder.in.th/v2/verify/bank/batch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "callbackUrl": "https://your-app.example.com/webhooks/thunder",
    "slips": [
      { "payload": "00000000000000000000000000000000000000", "remark": "Order #1001" },
      { "payload": "11111111111111111111111111111111111111", "remark": "Order #1002" },
      { "payload": "22222222222222222222222222222222222222", "remark": "Order #1003" }
    ]
  }'

Response

Accepted (202)

ทุกสลิปถูกเข้าคิวแล้ว jobId แต่ละค่าจับคู่กลับไปยังสลิปด้วย index ใน array ที่คุณส่งมา ผลลัพธ์จะมาแบบ 1 Webhook ต่อ 1 สลิป

json
{
  "success": true,
  "data": {
    "batchId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "jobs": [
      { "jobId": "3f2b1c8a-9d4e-4f10-b7a2-6c5d4e3f2a1b", "index": 0 },
      { "jobId": "7c6d5e4f-3a2b-4c1d-9e8f-0a1b2c3d4e5f", "index": 1 },
      { "jobId": "b9a8c7d6-5e4f-4a3b-2c1d-9e8f7a6b5c4d", "index": 2 }
    ]
  }
}

Error Responses

Validation Error (400)

คืนค่าเมื่อ batch ว่าง เกิน 100 สลิป หรือมีสลิป ใด ไม่ถูกต้อง ไม่มีอะไรเข้าคิว

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "slips: array must contain between 1 and 100 items"
  }
}

Invalid Callback URL (400)

json
{
  "success": false,
  "error": {
    "code": "INVALID_CALLBACK_URL",
    "message": "callbackUrl must use the https protocol"
  }
}

หมายเหตุ

  • 1 batch = N Webhook (1 ต่อสลิป) ไม่ใช่ callback รวมอันเดียว จับคู่ด้วย jobId (และ batchId) ใน Body ของ Webhook
  • Quota ถูกหักต่อสลิปที่ตรวจสอบ สำเร็จ สลิปที่ล้มเหลวหรือซ้ำไม่หัก quota
  • เนื่องจากทั้ง batch จะถูกปฏิเสธหากมีสลิปใดไม่ถูกต้อง ควรตรวจสอบข้อมูลฝั่ง client ก่อนส่ง batch ขนาดใหญ่
  • ดึงสถานะสลิปแต่ละรายการด้วย GET /verify/bank/jobs/:jobId

Bank Slip Verification API for Thai Banking