{"info":{"name":"SlipBolt Public API","description":"ตั้งค่าตัวแปร `apiKey` (sk_test_… หรือ sk_live_…) ที่แท็บ Variables ของ collection ก่อนส่ง · คู่มือ: https://docs.slip-bolt.com/docs/api","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{apiKey}}","type":"string"}]},"variable":[{"key":"baseUrl","value":"https://api.slip-bolt.com"},{"key":"apiKey","value":"","description":"API key จาก Settings → API Keys — ใช้ sk_test_ ตอนลอง"}],"item":[{"name":"ตรวจสลิปโอนเงิน 1 ใบ — raw bytes (แนะนำ)","request":{"method":"POST","description":"ส่งสลิปได้ 5 แบบ: **raw bytes** (`application/octet-stream`) · `multipart/form-data` (ฟิลด์ไฟล์ `file`) · JSON `{ \"image\": \"<base64>\" }` · JSON `{ \"url\": \"https://…\" }` · JSON `{ \"qr\": \"<ข้อความใน QR>\" }` · ใช้โควตาก้อนเดียวกับสลิปจาก LINE · ส่งรูปเดิมซ้ำภายใน 24 ชม. ได้ผลเดิม (`cached: true`) โดยไม่หักโควตา — retry ได้ปลอดภัย · แนะนำส่ง header `Idempotency-Key` (เช่น UUID ต่อออเดอร์) — retry ด้วย key เดิมได้คำตอบชุดเดิมเป๊ะ พร้อม header `Idempotent-Replayed: true` · key เดิมกับสลิปอื่น = 422 `IDEMPOTENCY_KEY_REUSED` · ครั้งแรกยังไม่จบ = 409 `IDEMPOTENCY_IN_PROGRESS` + `Retry-After` · เก็บ 24 ชม. ต่อร้าน","header":[{"key":"Content-Type","value":"application/octet-stream"}],"url":{"raw":"{{baseUrl}}/api/v1/verify","host":["{{baseUrl}}"],"path":["api","v1","verify"]},"body":{"mode":"file","file":{"src":""}}}},{"name":"ตรวจสลิปโอนเงิน 1 ใบ — multipart","request":{"method":"POST","description":"ส่งสลิปได้ 5 แบบ: **raw bytes** (`application/octet-stream`) · `multipart/form-data` (ฟิลด์ไฟล์ `file`) · JSON `{ \"image\": \"<base64>\" }` · JSON `{ \"url\": \"https://…\" }` · JSON `{ \"qr\": \"<ข้อความใน QR>\" }` · ใช้โควตาก้อนเดียวกับสลิปจาก LINE · ส่งรูปเดิมซ้ำภายใน 24 ชม. ได้ผลเดิม (`cached: true`) โดยไม่หักโควตา — retry ได้ปลอดภัย · แนะนำส่ง header `Idempotency-Key` (เช่น UUID ต่อออเดอร์) — retry ด้วย key เดิมได้คำตอบชุดเดิมเป๊ะ พร้อม header `Idempotent-Replayed: true` · key เดิมกับสลิปอื่น = 422 `IDEMPOTENCY_KEY_REUSED` · ครั้งแรกยังไม่จบ = 409 `IDEMPOTENCY_IN_PROGRESS` + `Retry-After` · เก็บ 24 ชม. ต่อร้าน","header":[],"url":{"raw":"{{baseUrl}}/api/v1/verify","host":["{{baseUrl}}"],"path":["api","v1","verify"]},"body":{"mode":"formdata","formdata":[{"key":"file","type":"file","src":""}]}}},{"name":"ตรวจสลิปโอนเงิน 1 ใบ — JSON base64","request":{"method":"POST","description":"ส่งสลิปได้ 5 แบบ: **raw bytes** (`application/octet-stream`) · `multipart/form-data` (ฟิลด์ไฟล์ `file`) · JSON `{ \"image\": \"<base64>\" }` · JSON `{ \"url\": \"https://…\" }` · JSON `{ \"qr\": \"<ข้อความใน QR>\" }` · ใช้โควตาก้อนเดียวกับสลิปจาก LINE · ส่งรูปเดิมซ้ำภายใน 24 ชม. ได้ผลเดิม (`cached: true`) โดยไม่หักโควตา — retry ได้ปลอดภัย · แนะนำส่ง header `Idempotency-Key` (เช่น UUID ต่อออเดอร์) — retry ด้วย key เดิมได้คำตอบชุดเดิมเป๊ะ พร้อม header `Idempotent-Replayed: true` · key เดิมกับสลิปอื่น = 422 `IDEMPOTENCY_KEY_REUSED` · ครั้งแรกยังไม่จบ = 409 `IDEMPOTENCY_IN_PROGRESS` + `Retry-After` · เก็บ 24 ชม. ต่อร้าน","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/api/v1/verify","host":["{{baseUrl}}"],"path":["api","v1","verify"]},"body":{"mode":"raw","raw":"{\n  \"image\": \"<base64 ของไฟล์รูปสลิป>\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"ตรวจสลิปโอนเงิน 1 ใบ — JSON url","request":{"method":"POST","description":"ส่งสลิปได้ 5 แบบ: **raw bytes** (`application/octet-stream`) · `multipart/form-data` (ฟิลด์ไฟล์ `file`) · JSON `{ \"image\": \"<base64>\" }` · JSON `{ \"url\": \"https://…\" }` · JSON `{ \"qr\": \"<ข้อความใน QR>\" }` · ใช้โควตาก้อนเดียวกับสลิปจาก LINE · ส่งรูปเดิมซ้ำภายใน 24 ชม. ได้ผลเดิม (`cached: true`) โดยไม่หักโควตา — retry ได้ปลอดภัย · แนะนำส่ง header `Idempotency-Key` (เช่น UUID ต่อออเดอร์) — retry ด้วย key เดิมได้คำตอบชุดเดิมเป๊ะ พร้อม header `Idempotent-Replayed: true` · key เดิมกับสลิปอื่น = 422 `IDEMPOTENCY_KEY_REUSED` · ครั้งแรกยังไม่จบ = 409 `IDEMPOTENCY_IN_PROGRESS` + `Retry-After` · เก็บ 24 ชม. ต่อร้าน","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/api/v1/verify","host":["{{baseUrl}}"],"path":["api","v1","verify"]},"body":{"mode":"raw","raw":"{\n  \"url\": \"https://cdn.example.com/slips/1001.jpg\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"ตรวจสลิปโอนเงิน 1 ใบ — JSON qr","request":{"method":"POST","description":"ส่งสลิปได้ 5 แบบ: **raw bytes** (`application/octet-stream`) · `multipart/form-data` (ฟิลด์ไฟล์ `file`) · JSON `{ \"image\": \"<base64>\" }` · JSON `{ \"url\": \"https://…\" }` · JSON `{ \"qr\": \"<ข้อความใน QR>\" }` · ใช้โควตาก้อนเดียวกับสลิปจาก LINE · ส่งรูปเดิมซ้ำภายใน 24 ชม. ได้ผลเดิม (`cached: true`) โดยไม่หักโควตา — retry ได้ปลอดภัย · แนะนำส่ง header `Idempotency-Key` (เช่น UUID ต่อออเดอร์) — retry ด้วย key เดิมได้คำตอบชุดเดิมเป๊ะ พร้อม header `Idempotent-Replayed: true` · key เดิมกับสลิปอื่น = 422 `IDEMPOTENCY_KEY_REUSED` · ครั้งแรกยังไม่จบ = 409 `IDEMPOTENCY_IN_PROGRESS` + `Retry-After` · เก็บ 24 ชม. ต่อร้าน","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/api/v1/verify","host":["{{baseUrl}}"],"path":["api","v1","verify"]},"body":{"mode":"raw","raw":"{\n  \"qr\": \"<ข้อความใน QR บนสลิป>\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"ตรวจสลิปแบบ async (ตอบ 202 ทันที) — raw bytes (แนะนำ)","request":{"method":"POST","description":"body แบบเดียวกับ `POST /verify` ทุกประการ · ตอบ **202** พร้อม `id` (`vrf_…`) + header `Location` ภายในไม่กี่ ms — ผลส่งมาทาง webhook `verification.completed` (ต้องติ๊ก event นี้ที่ endpoint) และ/หรือดึงที่ `GET /verifications/{id}` · ผล (`result`) เหมือน `POST /verify` ทุกฟิลด์ · กรณีที่ sync ตอบ 402/429 งานจะจบเป็น `FAILED` พร้อม `error.code` เดียวกัน (ไม่หักโควตา) · ค้างคิวเกิน 5 นาที = `FAILED` `VERIFY_TIMEOUT` · ใช้ `Idempotency-Key` ได้ (retry ได้ `id` เดิม) · งานรอตรวจต่อร้านมีเพดาน — เต็มได้ 429 `ASYNC_QUEUE_FULL`","header":[{"key":"Content-Type","value":"application/octet-stream"}],"url":{"raw":"{{baseUrl}}/api/v1/verify/async","host":["{{baseUrl}}"],"path":["api","v1","verify","async"]},"body":{"mode":"file","file":{"src":""}}}},{"name":"ผลของงาน `POST /verify/async`","request":{"method":"GET","description":"poll ได้ (แนะนำทุก 1–2 วินาที) · `PENDING`/`PROCESSING` = ยังไม่จบ · `COMPLETED` → `result` · `FAILED` → `error` · อายุ 24 ชม. หลังจากนั้น 404 (ผลถาวรอยู่ที่ `GET /transactions/{result.id}`) · ไม่เปลือง verify","header":[],"url":{"raw":"{{baseUrl}}/api/v1/verifications/:id","host":["{{baseUrl}}"],"path":["api","v1","verifications",":id"],"variable":[{"key":"id","value":"","description":"`id` (`vrf_…`) จาก `POST /verify/async`"}]}}},{"name":"อ่านโควตาคงเหลือ","request":{"method":"GET","description":"ไม่เปลือง verify — เหมาะให้ระบบ poll ก่อนยิงงานชุดใหญ่","header":[],"url":{"raw":"{{baseUrl}}/api/v1/quota","host":["{{baseUrl}}"],"path":["api","v1","quota"]}}},{"name":"ลิสต์ผลตรวจสลิปของร้าน","request":{"method":"GET","description":"ใหม่สุดก่อน · แบ่งหน้าแบบ cursor · รวมสลิปทุกช่องทาง (API / LINE / Dashboard) — กรองด้วย `source`","header":[],"url":{"raw":"{{baseUrl}}/api/v1/transactions","host":["{{baseUrl}}"],"path":["api","v1","transactions"],"query":[{"key":"status","value":"","description":"กรองตามผลตรวจ","disabled":true},{"key":"source","value":"","description":"กรองตามช่องทางที่สลิปเข้ามา","disabled":true},{"key":"transRef","value":"015170106978BTF01234","description":"เลขอ้างอิงธนาคาร (ตรงตัว)","disabled":true},{"key":"from","value":"2026-06-01T00:00:00+07:00","description":"ตั้งแต่ (รวม) — ISO-8601 พร้อม timezone","disabled":true},{"key":"to","value":"2026-06-30T23:59:59+07:00","description":"ถึง (รวม) — ISO-8601 พร้อม timezone","disabled":true},{"key":"cursor","value":"","description":"ค่า `nextCursor` จากหน้าก่อน","disabled":true},{"key":"limit","value":"50","disabled":true}]}}},{"name":"ดึงผลตรวจสลิป 1 รายการ","request":{"method":"GET","description":"ใช้คู่กับ webhook — รับ `data.transactionId` แล้วมาดึงรายละเอียดเต็ม","header":[],"url":{"raw":"{{baseUrl}}/api/v1/transactions/:id","host":["{{baseUrl}}"],"path":["api","v1","transactions",":id"],"variable":[{"key":"id","value":"","description":"`id` จาก `POST /verify` หรือ `transactionId` จาก webhook"}]}}},{"name":"รูปใบยืนยันการตรวจสลิป (PNG)","request":{"method":"GET","description":"เฉพาะรายการที่ `status: SUCCESS` · PNG กว้าง 784px · มี QR + เลขยืนยัน (`receipt.code`) ที่สแกนแล้วเปิดหน้าเช็คบน slip-bolt.com · สร้างใหม่ทุกครั้งที่ขอ ไม่เก็บไฟล์ — เก็บรูปไว้เองถ้าต้องใช้ซ้ำ","header":[],"url":{"raw":"{{baseUrl}}/api/v1/transactions/:id/receipt.png","host":["{{baseUrl}}"],"path":["api","v1","transactions",":id","receipt.png"],"query":[{"key":"maskSender","value":"false","description":"ปิดชื่อผู้โอนบางส่วน (\"สมชาย ใจ***\") และไม่พิมพ์เลขบัญชีผู้โอน — ใช้เมื่อจะโพสต์รูปในที่ที่หลายคนเห็น (กลุ่มแชต ฯลฯ)","disabled":true}],"variable":[{"key":"id","value":"","description":"`id` จาก `POST /verify` หรือ `transactionId` จาก webhook"}]}}},{"name":"ใบยืนยันการตรวจสลิป (PDF)","request":{"method":"GET","description":"หน้าตาเดียวกับ `receipt.png` (หน้าเดียว ขนาดเท่าการ์ด) · เฉพาะรายการที่ `status: SUCCESS`","header":[],"url":{"raw":"{{baseUrl}}/api/v1/transactions/:id/receipt.pdf","host":["{{baseUrl}}"],"path":["api","v1","transactions",":id","receipt.pdf"],"query":[{"key":"maskSender","value":"false","description":"ปิดชื่อผู้โอนบางส่วน (\"สมชาย ใจ***\") และไม่พิมพ์เลขบัญชีผู้โอน — ใช้เมื่อจะโพสต์รูปในที่ที่หลายคนเห็น (กลุ่มแชต ฯลฯ)","disabled":true}],"variable":[{"key":"id","value":"","description":"`id` จาก `POST /verify` หรือ `transactionId` จาก webhook"}]}}},{"name":"ข้อมูลร้าน · คีย์ · แพ็ก · โควตาคงเหลือ","request":{"method":"GET","description":"ไม่เปลืองโควตา · เหมาะเรียกตอนบูตระบบเพื่อตรวจว่าคีย์ถูกร้านและ scope ครบ","header":[],"url":{"raw":"{{baseUrl}}/api/v1/me","host":["{{baseUrl}}"],"path":["api","v1","me"]}}},{"name":"Liveness","request":{"method":"GET","description":"ไม่ต้องใช้คีย์ · ไม่แตะ dependency · ไม่นับ rate limit ของคีย์","header":[],"url":{"raw":"{{baseUrl}}/api/v1/health","host":["{{baseUrl}}"],"path":["api","v1","health"]}}},{"name":"Readiness","request":{"method":"GET","description":"ไม่ต้องใช้คีย์ · เช็คฐานข้อมูล / คิว / ระบบตรวจสลิป (แคชผลสั้น ๆ) · 503 เมื่อมีตัวล้ม","header":[],"url":{"raw":"{{baseUrl}}/api/v1/ready","host":["{{baseUrl}}"],"path":["api","v1","ready"]}}}]}