Changelog
บันทึกการเปลี่ยนแปลงของ SlipBolt API — ฟีเจอร์ใหม่ การแก้ไข และการเปลี่ยนแปลงสำคัญที่นักพัฒนาควรรู้ก่อนอัปเดต
บันทึกฟีเจอร์ใหม่และการเปลี่ยนแปลงที่มีผลต่อ integrator · เรียงจากใหม่ → เก่า
เราพยายามหลีกเลี่ยง breaking change · หากมีจะแจ้งล่วงหน้าและทำ versioning
ตุลาคม 2026
ความน่าเชื่อถือของการเชื่อมต่อ — เพิ่มอย่างเดียว ของเดิมทำงานเหมือนเดิมทุกอย่าง
- ใหม่: header
Idempotency-KeyบนPOST /verify— retry ด้วย key เดิมได้คำตอบชุดเดิม (Idempotent-Replayed: true) ไม่ตรวจซ้ำ ไม่หักโควตาซ้ำ ·409 IDEMPOTENCY_IN_PROGRESS·422 IDEMPOTENCY_KEY_REUSED· MCPverify_slipรับidempotencyKey - Webhook: ส่งซ้ำ 6 ครั้งใน ~7 ชม. (เดิม 5 ครั้งใน ~30 วิ) · header ใหม่
X-Slipbolt-Event-Id+X-Slipbolt-Delivery-Attempt· แท็บ Events ใน Settings → Webhooks พร้อมส่งอีกครั้ง · แจ้งเตือนเจ้าของร้านทางอีเมล/LINE เมื่อส่งไม่ถึง · ปิด endpoint อัตโนมัติเมื่อล้มต่อเนื่องเกิน 3 วัน (เดิมล้มครบ 25 ครั้ง) - ใหม่: หมุน webhook secret แบบ secret เดิมยังเซ็นคู่ 24 ชม. — header มี
v1สองตัวระหว่างนั้น · ตัวอย่างโค้ดตรวจลายเซ็นอัปเดตให้รับv1ตัวใดก็ได้ - ใหม่: เพดานการหักโควตาต่อคีย์ + IP allowlist ต่อคีย์ —
429 SPEND_CAP_EXCEEDED·403 IP_NOT_ALLOWED·GET /meมีapiKey.spendCap+apiKey.ipAllowlist - ใหม่:
GET /api/v1/health·GET /api/v1/ready— ไม่ต้องใช้คีย์ ไว้ตั้ง uptime monitor - method ผิดบน path ที่มีอยู่ (เช่น
GET /verify) ตอบ405+ headerAllowแทน404· หน้า root ของapi.slip-bolt.comและ path ที่ไม่มีตอบเป็น JSON - MCP: ส่ง JSON-RPC แบบ batch (array) ได้
400+ error-32600แทน202ว่าง - ใหม่:
POST /verify/async— ตอบ202ทันที ผลมาทาง webhookverification.completedหรือ pollGET /verifications/{id}· ผลเหมือนPOST /verifyทุกกรณี · MCP tool ใหม่get_verification+verify_slipรับasync: true 429จาก rate limit มีcode: "RATE_LIMITED"แล้ว · body เกิน 5 MB →413JSONPAYLOAD_TOO_LARGE· URL ยาวเกิน →414JSON ·api.slip-bolt.com/openapi.jsonส่งสเปกตรง ๆ (200) แทน redirect · MCP ส่ง{}ได้-32600(เดิม-32700)- Webhook: ครั้งแรกส่งไม่ถึงปลายทางที่อยู่ไกล (ยุโรป/อเมริกา) ราวครึ่งหนึ่ง ต้องรอ retry — แก้แล้ว ·
slip.duplicateมีdata.status: "DUPLICATE"เสมอ ·verification.completedมีlatencyMsตรงกับ REST · ไม่แนบ headersentry-trace/baggageแล้ว - Webhook:
data.transRefของรายการที่อ่านเลขอ้างอิงไม่ได้เป็นnull(เดิมหลุดค่าภายในerr:…ออกไป) — ตรงกับGET /transactions
ผลตรวจสลิปชัดขึ้น (จาก UAT ผ่าน MCP) — เพิ่มฟิลด์เท่านั้น ไม่กระทบโค้ดเดิม
warnings— คำเตือนของสลิปที่ผ่าน (STALE_SLIP) แยกจากเหตุผลที่ไม่ผ่าน ·errorCodeยังเหมือนเดิมreceiverProxyAccount— เลขพร้อมเพย์ที่เห็นบนรูปสลิป คู่กับreceiverAccount(บัญชีธนาคารที่ผูกไว้)quotaCharged(เฉพาะPOST /verify) — คำขอนี้หักโควตา/เครดิตไหม ไม่ต้องเดาจากquota.used- แก้: สลิปที่ส่งผ่าน API แล้วบังเอิญโอนเข้าบัญชีรับค่าบริการของ SlipBolt เคยตอบ
SUCCESSแต่ไม่ถูกบันทึก (ค้นด้วยGET /transactionsไม่เจอ · ไม่หักโควตา · ไม่มีreceipt) — ตอนนี้ตรวจเทียบบัญชีร้านตามปกติ - สร้าง API key ชื่อซ้ำกับคีย์ที่ยังใช้งานไม่ได้แล้ว (
409) — แยกคีย์ออกจากกันได้ด้วยชื่อ
ใหม่: MCP server สำหรับ AI tool — https://docs.slip-bolt.com/mcp
- ต่อ Claude Code · Cursor · Claude Desktop แล้วให้ AI ค้น/อ่านเอกสารนี้ (ไม่ต้องใช้คีย์) · ดูโควตา · ค้นสลิปย้อนหลัง · ดึงใบยืนยัน · ตรวจสลิป
- ใช้คีย์เดิมของร้านใน header
Authorization— สิทธิ์เท่า REST API ทุกอย่าง แนะนำคีย์ scopereadอย่างเดียวถ้าไม่ต้องให้ AI ตรวจสลิปใหม่ - วิธีตั้งค่าแบบก๊อปวาง: MCP สำหรับ AI
ใหม่: ใบยืนยันการตรวจสลิป — หน้าตาเดียวกันทั้งบอท LINE · LIFF · API
GET /api/v1/transactions/:id/receipt.png·receipt.pdf— รูป/PDF ใบยืนยัน ของสลิปที่ผ่าน (?maskSender=trueปิดชื่อผู้โอนบางส่วน)- ผลตรวจมีฟิลด์ใหม่
receipt(code·checkUrl) — เพิ่มฟิลด์เท่านั้น ไม่กระทบโค้ดเดิม - QR บนใบเปิดหน้าเช็คบน
slip-bolt.comให้ใครก็ยืนยันได้ว่าใบออกจาก SlipBolt จริง (กันเอารูปไปตัดต่อ)
เอกสาร API ครบขึ้น + สเปก OpenAPI ละเอียดขึ้น (จากรีวิวของ integrator)
- API Reference เพิ่ม: ตาราง
errorCode/codeครบทุกค่า · หัวข้อ Stale slip · ตาราง รหัสธนาคาร (รหัส 3 หลัก ↔ slug ใน/me) · ตาราง status บอกว่าหักโควตาไหม + ยิง webhook event ไหน · ตัวอย่างผลDUPLICATE/RECEIVER_MISMATCH/INVALID/FRAUD· headerX-RateLimit-* - ชี้แจง:
errorCodeไม่ใช่nullเสมอไปเมื่อSUCCESS— สลิปจริงที่โอนไว้เกิน 24 ชม. ได้SUCCESS+errorCode: "STALE_SLIP"(พฤติกรรมเดิมตั้งแต่ ก.ย. — เอกสารเดิมเขียนว่าเป็นINVALID) - สเปก OpenAPI มี
components.schemas(VerifyResult·Transaction·Quota·Account·ErrorEnvelope…) · ประกาศ response header และ5xxแล้ว - ใหม่: Postman collection ที่
/api/v1/postman.json— สร้างจากสเปก OpenAPI ตัวเดียวกัน ·https://api.slip-bolt.com/openapi.jsonที่รากโดเมน redirect ไปสเปกแล้ว - ใหม่: header
X-Request-Idในทุกคำตอบ — ค่าเดียวกับmeta.requestId/requestIdใน error - เปลี่ยน:
{ "qr": … }ที่เป็น QR รับเงิน (PromptPay — ข้อความขึ้นต้น000201) ได้400แทนที่จะถูกส่งไปตรวจแล้วออกมาเป็นFRAUD· QR ของสลิปจริงไม่กระทบ - เปลี่ยน:
errorMessageของPROVIDER_ERRORเป็นข้อความกลางคงที่ — เดิมเป็นข้อความภายในที่ไม่ได้ตั้งใจให้อ่าน · แตกกิ่งด้วยstatus/errorCodeเหมือนเดิม
แก้: ส่งสลิปที่ตอบ DUPLICATE ไปแล้วซ้ำอีกครั้ง เคยได้ SUCCESS
- สลิปที่เคยใช้ทาง LINE / Dashboard แล้วส่งเข้า
POST /api/v1/verifyสองครั้งติดกัน ครั้งที่สองเคยได้verified: true·duplicate: falseจากแคชรูป — ตอนนี้ได้DUPLICATEทุกครั้ง (duplicate: true·cached: true) - retry ของคำขอที่ API ตรวจผ่านเองครั้งแรกยังได้ผลเดิมเหมือนเดิม · ดู Idempotency
POST /api/v1/verify รับสลิปได้ 5 แบบ — เดิมรับเฉพาะ raw bytes
- เพิ่ม JSON
{ "url": "https://…" }(เราดาวน์โหลดรูปให้) และ{ "qr": "<ข้อความใน QR>" }(ไม่ต้องมีรูป) multipart/form-data(ไฟล์ในฟิลด์file) และ JSON{ "image": "<base64>" }ใช้ได้แล้ว · raw bytes ส่งด้วยContent-Type: image/jpeg/image/pngได้ด้วย- ผลลัพธ์ โควตา และแคช 24 ชม. เหมือนกันทุกแบบ · โค้ดเดิมที่ส่ง
application/octet-streamไม่ต้องแก้อะไร - ตัวอย่างทุกภาษา: ตัวอย่างพร้อมใช้ · สเปก OpenAPI ประกาศครบทุกแบบ
หน้าใหม่: ตัวอย่างพร้อมใช้ — โค้ดก๊อปวางได้ทั้ง Node.js / Python / PHP / Go / Java / C#
- ไคลเอนต์ที่มี timeout + retry (
429/5xx/ เน็ตหลุด) · รับสลิปจากลูกค้าแล้วปิดออเดอร์ครบวงจร · ส่งรูปแบบ multipart / base64 / URL · สคริปต์เซ็น webhook เพื่อทดสอบใน localhost - API Reference เพิ่มตารางฟิลด์ของผลตรวจ และคอลัมน์ "ลองใหม่ได้ไหม" ในตาราง error
- คำแนะนำใหม่: เช็ค 4 ข้อก่อนปล่อยของ (เดิม 3) — เพิ่ม "
transRefติด UNIQUE ฝั่งคุณ" เพราะการส่งรูปเดิมซ้ำ ใน 24 ชม. คืนผลเดิมโดยduplicate: false· พฤติกรรมของ API ไม่ได้เปลี่ยน
กันยายน 2026
เอกสารภาษาอังกฤษ
- เอกสารนักพัฒนาแปลครบทุกหน้าแล้ว — อยู่ที่
docs.slip-bolt.com/en/docs
เครดิตสลิป (จ่ายตามใช้)
- ลำดับการตัดของสลิปที่ผ่าน: โควตาแพ็กรายเดือน → เครดิต → ค่าสลิปเกินโควตา · เครดิตมีอายุ 12 เดือน
GET /api/v1/quotaเพิ่มcreditsAvailable·GET /api/v1/meเพิ่มก้อนcredits(available·usedThisMonth·nextExpiry) —usedยังเป็นยอดที่นับเข้าโควตาแพ็กเหมือนเดิม- ข้อความของ
402 QUOTA_EXCEEDEDพูดถึงเครดิตแล้ว — มาเฉพาะเมื่อทั้งโควตาและเครดิตหมด · ให้แยกกรณีด้วยcodeไม่ใช่ข้อความ
Error body ตรงตามเอกสารแล้ว
- ทุก error มี
success: false·path·requestId·timestampตาม Error envelope (ก่อนหน้านี้บน production บาง error ได้แค่message/error/statusCode) · ฟิลด์codeเดิมยังอยู่ครบ ·429มี headerRetry-After
Webhook: แจ้งเตือนเข้า Discord / Telegram ได้ตรง ๆ — ดู Webhooks
- ปลายทางต้องเป็น
https://สาธารณะ · ไม่ตาม redirect · สลิปปลอมมาเป็น eventslip.fraudแยก
ช่วงทดลอง 7 วัน = สิทธิ์แพ็ก Trial เท่านั้น
- ร้านแรกที่ยังไม่จ่ายสมัครแพ็ก
TRIALเสมอ (50 สลิป · 1 ที่นั่ง · 1 กลุ่ม · 1 OA · ไม่มี REST API) - เลือกการ์ด Pro/Business ตอนสมัครไม่ทำให้ได้ลิมิตแพ็กจ่ายฟรี 7 วัน
GET /api/v1/meและGET /api/v1/quota(scoperead) อ่านแพ็ก + โควตาคงเหลือโดยไม่หักสลิป — ใช้เช็คตอนบูต integration
สถานะระบบ — endpoint ที่ monitor เรียกได้จริง
GET /health·/health/liveness·/health/uptimeตอบที่ path นี้ตรง ๆ แล้ว (เดิมมีแต่/v1/health— uptime monitor ที่ชี้มาที่/healthตามที่เอกสารบอกจะได้404)- เพิ่ม
GET /health/ready(readiness — ตรวจ DB + Redis ชุดเดียวกับGET /health) สำหรับ monitor ที่ใช้ชื่อตามธรรมเนียม liveness/readiness - ใช้
/health*เท่านั้น —/v1/health*ไม่ได้เปิดสู่สาธารณะ บนapi.slip-bolt.com(ตอบ404) · ถ้า monitor ของคุณชี้/v1/healthอยู่ ให้เปลี่ยนเป็น/health - หน้า status อ่านค่าจริงจาก endpoint นี้แล้ว
Anti-fraud — สลิปเก่านำกลับมาใช้ซ้ำ: เปิดเป็นค่าเริ่มต้น
SLIP_STALE_MODEค่าเริ่มต้นเปลี่ยนจากoff→alert· สลิปยังSUCCESSตามปกติ (มีerrorCode: "STALE_SLIP"กำกับในผลตรวจ) แต่เจ้าของร้านจะได้รับแจ้งเตือนเมื่อเวลาธนาคารบนสลิปเก่ากว่าSLIP_STALE_MAX_AGE_HOURS(ค่าเริ่มต้น 24 ชม.)- โหมด
alertไม่ปฏิเสธการชำระเงินใด ๆ · ถ้าต้องการให้ปฏิเสธจริงตั้งSLIP_STALE_MODE=reject
สิงหาคม 2026
Public API
apiAccessของแพ็กถูกบังคับจริง — API key ของร้านที่อยู่ในแพ็กที่ไม่มีสิทธิ์ใช้ API จะถูกปฏิเสธ (เดิมคอลัมน์นี้ถูกเขียนแต่ไม่มีใครอ่าน) · ถ้า integration ของคุณเคยยิงผ่านด้วยแพ็กเล็ก ให้ตรวจแพ็กก่อน- response ไม่มีชื่อผู้ให้บริการตรวจสลิปภายนอกหลุดออกไปอีกแล้ว (ทั้ง body · error · header)
- จัดการ API key ละเอียดขึ้น — scope · usage · rotate/revoke
Webhooks & Realtime
- หน้า Webhooks แสดง ประวัติการส่ง (deliveries) ทุกครั้ง พร้อมสถานะและรอบ retry
- "ส่งทดสอบ" ตอบข้อความชัดเจนเมื่อคิวงานไม่พร้อม (เดิมได้ HTTP 500 เปล่า ๆ)
- แดชบอร์ดขึ้นสลิปใหม่ทันทีที่ตรวจเสร็จผ่าน SSE ไม่ต้องกด refresh
Billing & โควตา
- คิดค่า ส่วนเกินโควตา (overage) ตามจริง พร้อมบัฟเฟอร์ฟรี · เพดานต่อเดือน · เพดานแข็งที่บล็อกเมื่อใช้เกินหลายเท่า
- ใบแจ้งหนี้ที่มีส่วนเกินระบุที่มาของยอดนั้นแยกบรรทัด
- เปลี่ยนแพ็กมี ใบเสนอราคาก่อนตัดเงิน (proration แสดงให้เห็นก่อนกดยืนยัน)
- แจ้งบน LINE เมื่อบัตรถูกปฏิเสธ · ต่ออายุไม่สำเร็จ · และเมื่อชำระเงินสำเร็จ
- เลือกช่องทางจ่ายบิลค้างได้เอง (บัตร / PromptPay)
ทีมงาน · ความปลอดภัย
- ที่นั่งทีมงาน (seats) ตามแพ็ก + คำเชิญทางอีเมล
- 2FA (TOTP) พร้อม backup code · เปิดที่ ตั้งค่า → ความปลอดภัย
- นโยบายรหัสผ่านบังคับจริง · เพิ่ม CSP และ security header ครบชุด
- Audit log ดูย้อนหลังได้จากหน้าตั้งค่า
LINE & LIFF
- LIFF โพสต์ผลการตรวจกลับเข้ากลุ่มที่ลูกค้าส่งมาได้
- Quick reply บนคำสั่งของเจ้าของร้าน
- สลิปไม่ถูกกลืนเมื่อ Redis เต็ม — ระบบตอบให้ลูกค้าส่งใหม่แทนที่จะเงียบ
แอป
- สลับร้านได้ไม่ต้องรีโหลด + command palette (⌘K)
- ทุกลิสต์มีการแบ่งหน้า · ส่งออกได้ทั้งชุดไม่ใช่แค่หน้าที่เห็น
- ภาษาไทย/อังกฤษครบทั้งแอปและเอกสาร
- Product tour สอนใช้งานแดชบอร์ดและการผูก LINE channel
- Cookie consent + analytics ที่รอความยินยอมก่อนทำงาน
กรกฎาคม 2026
- LIFF — จัดการกลุ่ม · ประวัติการตรวจ · ใบเสร็จ · ตั้งค่าการแจ้งเตือน · ผูก/ถอนบัญชี ครบในมินิแอป
- สถานะร้าน แสดงชัดบนแถบข้าง (ทดลองใช้ · ใช้งาน · ค้างชำระ · ระงับ)
- ปิด modal ด้วย Esc ได้ทุกจุด · ปุ่มคัดลอกบอกผลจริงเมื่อคัดลอกสำเร็จ
มิถุนายน 2026
Public API — Quota UX
- ทุก response ของ
POST /api/v1/verifyแนบ headerX-Slipbolt-Quota-{Limit,Remaining,Used,Reset-Days}+ ฟิลด์quotaใน body - โควตาหมด (key
live) → ตอบ HTTP 402QUOTA_EXCEEDEDแทน200เงียบ ๆ — เช็คจาก HTTP status ได้เลย - เพิ่ม
GET /api/v1/quota(scoperead) อ่านยอดคงเหลือโดยไม่เปลือง verify - ยืนยัน: การเรียก API ใช้ โควตา pool เดียวกับสลิป LINE ของร้าน
Anti-fraud — recycled slip detection
- ตรวจจับสลิปจริง "เก่า/นำกลับมาใช้ซ้ำ" จากเวลาธนาคาร (
transDate) · โหมดalert/rejectตั้งค่าได้ · โหมดrejectตอบINVALID+errorCode: STALE_SLIP· โหมดalertตอบSUCCESS+errorCodeเดียวกัน — ตอนนั้นค่าเริ่มต้นคือปิด (ดู กันยายน 2026)
LINE
- Rich Menu ตั้งให้อัตโนมัติเมื่อผูก channel (ดูยอดวันนี้ → LIFF)
- Marketing broadcast ถึงเจ้าของร้านที่ opt-in (ฝั่งแพลตฟอร์ม)
Billing
- เสริมความทนทานของ Stripe webhook (retry เฉพาะ event ที่เกี่ยวกับเงิน · idempotent)
พฤษภาคม 2026
- Public Verify API —
POST /api/v1/verifyรับรูปสลิปเป็น raw bytes, auth ด้วย API key (sk_live_/sk_test_) - Outgoing Webhooks — event
slip.verified/duplicate/failed· HMAC-signed · retry 5 ครั้ง - API Keys — สร้าง/rotate/revoke · scope (
verify/read/webhook) · usage metrics - Prepaid terms — จ่ายล่วงหน้า 1/3/6/9/12 เดือน (card + PromptPay) พร้อมส่วนลดขั้นบันได
- Dashboard — สรุปยอด · รายงาน · ธุรกรรม · จัดการ LINE channel/group
เอกสารที่เกี่ยวข้อง
- API Reference — endpoints ทั้งหมด
- Webhooks — event + signature
- Security & PDPA
