meta

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 · MCP verify_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 + header Allow แทน 404 · หน้า root ของ api.slip-bolt.com และ path ที่ไม่มีตอบเป็น JSON
  • MCP: ส่ง JSON-RPC แบบ batch (array) ได้ 400 + error -32600 แทน 202 ว่าง
  • ใหม่: POST /verify/async — ตอบ 202 ทันที ผลมาทาง webhook verification.completed หรือ poll GET /verifications/{id} · ผลเหมือน POST /verify ทุกกรณี · MCP tool ใหม่ get_verification + verify_slip รับ async: true
  • 429 จาก rate limit มี code: "RATE_LIMITED" แล้ว · body เกิน 5 MB → 413 JSON PAYLOAD_TOO_LARGE · URL ยาวเกิน → 414 JSON · api.slip-bolt.com/openapi.json ส่งสเปกตรง ๆ (200) แทน redirect · MCP ส่ง {} ได้ -32600 (เดิม -32700)
  • Webhook: ครั้งแรกส่งไม่ถึงปลายทางที่อยู่ไกล (ยุโรป/อเมริกา) ราวครึ่งหนึ่ง ต้องรอ retry — แก้แล้ว · slip.duplicate มี data.status: "DUPLICATE" เสมอ · verification.completed มี latencyMs ตรงกับ REST · ไม่แนบ header sentry-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 ทุกอย่าง แนะนำคีย์ scope read อย่างเดียวถ้าไม่ต้องให้ 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 · header X-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 มี header Retry-After

Webhook: แจ้งเตือนเข้า Discord / Telegram ได้ตรง ๆ — ดู Webhooks

  • ปลายทางต้องเป็น https:// สาธารณะ · ไม่ตาม redirect · สลิปปลอมมาเป็น event slip.fraud แยก

ช่วงทดลอง 7 วัน = สิทธิ์แพ็ก Trial เท่านั้น

  • ร้านแรกที่ยังไม่จ่ายสมัครแพ็ก TRIAL เสมอ (50 สลิป · 1 ที่นั่ง · 1 กลุ่ม · 1 OA · ไม่มี REST API)
  • เลือกการ์ด Pro/Business ตอนสมัครไม่ทำให้ได้ลิมิตแพ็กจ่ายฟรี 7 วัน
  • GET /api/v1/me และ GET /api/v1/quota (scope read) อ่านแพ็ก + โควตาคงเหลือโดยไม่หักสลิป — ใช้เช็คตอนบูต 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 แนบ header X-Slipbolt-Quota-{Limit,Remaining,Used,Reset-Days} + ฟิลด์ quota ใน body
  • โควตาหมด (key live) → ตอบ HTTP 402 QUOTA_EXCEEDED แทน 200 เงียบ ๆ — เช็คจาก HTTP status ได้เลย
  • เพิ่ม GET /api/v1/quota (scope read) อ่านยอดคงเหลือโดยไม่เปลือง 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

เอกสารที่เกี่ยวข้อง