บันทึกการเปลี่ยนแปลง
ทุกการเปลี่ยนแปลงของ API ที่ผู้เรียกสังเกตเห็นได้ถูกบันทึกไว้ที่นี่ ใหม่สุดอยู่บน ตามรูปแบบ Keep a Changelog ถ้าของที่คุณพึ่งพามีการเปลี่ยน หน้านี้คือหน้าที่จะประกาศ
วิธีกำหนดเวอร์ชัน
หัวข้อที่มีชื่อว่า “วิธีกำหนดเวอร์ชัน”เวอร์ชันอยู่ในเส้นทาง · วันนี้ทุกเส้นอยู่ใต้ /v1/ และเอกสาร OpenAPI บอกเวอร์ชันของตัวเองที่ info.version —
ถ้าอยากตรวจด้วยโปรแกรมว่ากำลังทำงานกับสัญญาฉบับไหน ให้ดึง https://api.scanfood.co/ext/v1/openapi.json
สิ่งที่โผล่มาใน /v1/ เมื่อไหร่ก็ได้:
- เส้นใหม่
- พารามิเตอร์ query ตัวใหม่ที่ไม่บังคับ
- ช่องข้อมูลใหม่ในคำตอบ
- รหัส
errorตัวใหม่สำหรับสถานการณ์ที่เดิมตอบด้วยรหัสกว้างกว่า
ทั้งหมดนี้เป็นการ “เพิ่ม” ⇒ ระบบที่ข้ามของที่ไม่รู้จักจะทำงานต่อได้ตามปกติ และนั่นคือสิ่งที่มันเรียกร้องจากฝั่งคุณด้วย — อ่านแบบผ่อนปรน client ที่ตีตกช่องที่ไม่รู้จักจะพังในรุ่นที่ไม่ทำให้ใครพังเลย
สิ่งที่จะไม่มาแบบทับของเดิมใน /v1/: การลบช่อง เปลี่ยนชื่อช่อง
ทำให้เส้นรับค่าได้แคบลง หรือเปลี่ยนความหมายของค่าที่ใช้กันอยู่แล้ว
เวอร์ชันถูกวางไว้ในเส้นทางก็เพื่อให้สัญญาที่ต่างขนาดนั้นมาในรูปเส้นทางใหม่
ไม่ใช่มาโผล่ใต้ระบบที่วิ่งอยู่
การแจ้งล่วงหน้าก่อนเปลี่ยนแบบกระทบผู้ใช้
หัวข้อที่มีชื่อว่า “การแจ้งล่วงหน้าก่อนเปลี่ยนแบบกระทบผู้ใช้”การเปลี่ยนที่ทำให้ของเดิมพังจะถูกแจ้ง ล่วงหน้าอย่างน้อย 30 วัน ผ่านหน้านี้และผ่านผู้ติดต่อ ScanFood ของคุณ
ก่อนที่เส้นทางใหม่จะเปิดใช้ · ระหว่างนั้นเส้นทาง /v1/ เดิมจะไม่ถูกแก้ใต้ระบบของคุณ
สิ่งที่พึ่งพาได้:
- การเปลี่ยนที่ทำให้ของเดิมพัง จะไม่ถูกทำทับลงใน
/v1/ - อะไรก็ตามที่สังเกตได้และมีการเปลี่ยน จะถูกบันทึกที่นี่พร้อมวันที่
- กุญแจของคุณใช้ได้ข้ามรุ่น — ไม่มีการตรึงเวอร์ชันไว้กับกุญแจ และไม่มีอะไรหมดอายุเอง
รุ่นที่ปล่อยแล้ว
หัวข้อที่มีชื่อว่า “รุ่นที่ปล่อยแล้ว”1.3.0 — 2026-09-29
หัวข้อที่มีชื่อว่า “1.3.0 — 2026-09-29”เพิ่ม
categoriesบนทุกร้านที่GET /v1/shopsคืนมา — หมวดสินค้าของสาขาในรูปรายการแบน{ id, name, level, parentId, hidden }·idคือค่าเดียวกับที่อยู่ในitems[].categoryบนบิล ⇒ แปลงรหัสหมวดบนบิลเป็นชื่อและเส้นทางเต็มได้แล้ว · ส่งทุกหมวด รวมหมวดที่ร้านซ่อน (hidden: true) เพราะบิลเก่ายังอ้างรหัสนั้นได้ · รหัสบนบิลที่ไม่มีในรายการ = หมวดที่ร้านลบไปแล้ว กู้ชื่อคืนไม่ได้ · ดู ร้านค้า
รุ่นนี้ไม่มีการลบ เปลี่ยนชื่อ หรือบีบขอบเขตของอะไรเดิมเลย · รายชื่อหมวดคือข้อมูลแคตตาล็อกอย่างเดียวที่เปิด ส่วนสินค้า เมนู สต็อก ต้นทุน และสูตร ยังไม่ถูกเปิดผ่านเส้นใดเลย
1.2.1 — 2026-09-28
หัวข้อที่มีชื่อว่า “1.2.1 — 2026-09-28”แก้
rankLevelของสมาชิกเป็นจำนวนเต็มหรือnullเสมอแล้ว ตรงตามที่เอกสารอ้างอิงประกาศไว้ตั้งแต่ต้น · เดิมส่งค่าตามที่บันทึกไว้ตรง ๆ ⇒ สมาชิกส่วนใหญ่ได้สตริงกลับไป ส่วนมากเป็น""บางรายเป็นตัวเลขในเครื่องหมายคำพูด เช่น"11"· ตอนนี้ตัวเลขในเครื่องหมายคำพูดมาเป็นตัวเลขนั้น ("11"→11) · สตริงว่าง หรือค่าที่ไม่ใช่ตำแหน่งระดับที่ใช้ได้ (เช่น"01") มาเป็นnull· ถ้าโค้ดของคุณถือว่า""คือ “ไม่มีระดับ” อยู่แล้ว ก็ทำงานต่อได้ · ถ้าแปลงสตริงเป็นเลขเอง ตอนนี้อ่านเป็นตัวเลขได้เลยrankของสมาชิกเป็นสตริงหรือnullเสมอแล้ว · ข้อมูลสมาชิกเก่าจำนวนหยิบมือเก็บตัวเลขไว้ในช่องนี้ ตอนนี้มาเป็นnull
เอกสาร
items[].categoryบนบิลถูกเขียนในเอกสารตามที่มันเป็นมาตลอด คือ array ของรหัสหมวด เรียงจากหมวดบนสุดลงไปหมวดย่อยสุด (ส่วนใหญ่มีรหัสเดียว · สินค้าไม่มีหมวด =[]) · เดิมเอกสารอ้างอิงและตัวอย่างเขียนว่าเป็นชื่อหมวด · ตัวข้อมูลไม่ได้เปลี่ยน
1.2.0 — 2026-09-18
หัวข้อที่มีชื่อว่า “1.2.0 — 2026-09-18”เพิ่ม
GET /v1/members/lookup— โทเคนสมาชิกที่อยู่เบื้องหลัง LINE user id ที่คุณถืออยู่แล้ว · ส่งproviderIdกับlineUserIdเข้าไป แล้วได้memberIdของคนนั้นกลับมา ซึ่งเป็นโทเคนตัวเดียวกับที่โผล่บนบิลและในลิสต์สมาชิก ⇒ บอทแชตจึงเดินจาก “มีคนเพิ่งทักเข้ามา” ไปถึงระดับสมาชิก แต้ม และประวัติการซื้อของคนนั้นได้ · การแลกเดินทางเดียว คือส่ง id เข้าไปแล้วได้โทเคนกลับมา และไม่มี response ไหน ส่ง LINE user id กลับออกไป · ดู สมาชิก- สิทธิ์รายกุญแจสำหรับการค้นนี้
allowLineLookup— ปิดไว้เป็นค่าตั้งต้น และให้สิทธิ์แบบเดียวกับtelและemail· มันคุมเฉพาะเส้นใหม่เส้นนี้ ไม่ว่าจะเปิดหรือปิด response เดิมทุกเส้นไม่เปลี่ยนอะไรเลย 403 lookup_not_enabled— คำตอบเมื่อกุญแจที่ไม่มีสิทธิ์นี้เรียกเส้นค้นสมาชิก
รุ่นนี้ไม่มีการลบ เปลี่ยนชื่อ หรือบีบขอบเขตของอะไรเดิมเลย ⇒ ระบบที่ไม่ได้ใช้เส้นใหม่ ไม่ต้องแก้อะไร
1.1.1 — 2026-09-10
หัวข้อที่มีชื่อว่า “1.1.1 — 2026-09-10”แก้
- บิลซื้อกลับบ้านตอบ
channel.codeเป็น"take_away"แล้ว · เดิมตอบเป็น"dine_in"และchannel.nameขึ้นเป็นชื่อเรตราคาของร้านแทนชื่อช่องทาง ⇒ ยอดซื้อกลับบ้านถูกนับรวมเป็นยอดทานที่ร้าน · ทานที่ร้าน มารับเอง และช่องทางที่ร้านตั้งเอง ไม่เปลี่ยน · ถ้าคุณเก็บบิลจาก API นี้ไว้แล้ว ยอดซื้อกลับบ้านในนั้นจะอยู่บนแถวdine_inและย้ายได้ด้วยการดึงช่วงวันนั้นใหม่
1.1.0 — 2026-09-10
หัวข้อที่มีชื่อว่า “1.1.0 — 2026-09-10”เพิ่ม
GET /v1/usage— สถานะโควตาของกุญแจของคุณ อ่านตรงจากตัวนับชุดที่ใช้บังคับจริง ทั้งเพดานต่อนาทีและต่อวันที่กุญแจใบนั้นใช้จริง จำนวนคำขอที่ใช้ไปแล้ววันนี้และที่เหลือ และเจ็ดวันไทยล่าสุด · ไม่รับพารามิเตอร์ และรายงานเฉพาะกุญแจที่เรียกเข้ามาเท่านั้น · ดู ขีดจำกัดการเรียก
เปลี่ยน
- ข้อมูลการใช้งานไม่ได้ถูกเก็บไว้ตลอดไปอีกต่อไป · บันทึกของคำขอรายใบเก็บไว้ 90 วัน
ส่วนยอดรวมรายวันที่
/v1/usageอ่าน เก็บไว้ 400 วัน ซึ่งนานพอให้เทียบเดือนนี้ กับเดือนเดียวกันของปีก่อนได้ · เรื่องอื่นของกุญแจและข้อมูลของคุณไม่กระทบ
1.0.0 — 2026-09-10
หัวข้อที่มีชื่อว่า “1.0.0 — 2026-09-10”รุ่นสาธารณะรุ่นแรก
เพิ่ม
GET /v1/shops— ร้านที่กุญแจใบนั้นเห็นได้ พร้อมshopId,shopName,franchiseId,providerIdและtimezoneของร้าน · ไม่แบ่งหน้าGET /v1/transactions— บิลของร้านหนึ่ง มี 2 โหมด คือช่วงวันปฏิทิน (from/toไม่เกิน 31 วันต่อคำขอ) หรือดึงเฉพาะที่เปลี่ยน (updatedSince) · ไล่หน้าด้วย cursor ·limitสูงสุด 200 ค่าตั้งต้น 100GET /v1/transactions/{id}— บิล 1 ใบแบบเต็ม ทั้งรายการสินค้า ยอดเงิน การชำระ ช่องทางขาย ผู้คิดเงิน และสถานะการยกเลิกbusinessDateบนทุกบิล ควบคู่กับbillDate⇒ ร้านที่ขายข้ามเที่ยงคืนกระทบยอดตามวันขายของตัวเองได้GET /v1/members— สมาชิกของแบรนด์หนึ่ง (providerId) พร้อมแต้ม เครดิต ระดับ คูปอง ป้ายกำกับ และประวัติการมาใช้บริการ · ไล่หน้าด้วย cursorGET /v1/members/{memberToken}— สมาชิก 1 คน อ้างด้วย token ทึบที่ได้จากลิสต์GET /v1/openapi.json— เอกสาร OpenAPI 3.1 ฉบับเต็ม เปิดสาธารณะ ไม่ต้องยืนยันตัวตน- กุญแจรูป
sf_live_<keyId>_<secret>ส่งผ่านAuthorization: Bearer …แต่ละใบผูกขอบเขตกับร้านเดียวหรือทั้งแฟรนไชส์ และมีป้ายชื่อ เพดานต่อนาที และโควตาวันของตัวเอง - การคุมอัตราและการรายงานโควตา:
X-RateLimit-LimitกับX-RateLimit-Remainingสำหรับโควตาวัน ·Retry-Afterเมื่อชนเพดานต่อนาที (429) · ตัวนับรายวันที่รีเซ็ต 00:00 น. เวลาไทย - การเพิกถอนกุญแจ มีผลภายใน 5 นาที หลังจากนั้นกุญแจใบนั้นตอบ
401 key_revoked api.scanfood.coเป็นโฮสต์เดียวทั้งของ API และของเอกสารชุดนี้- เว็บเอกสารชุดนี้ รวมถึง สำเนาที่เครื่องอ่านได้ ของคู่มือทุกหน้า
ข้อจำกัดที่รู้อยู่ ณ 1.0.0
updatedSinceยังใช้กับ/v1/membersไม่ได้ · จะตอบ400 not_supported⇒ สมาชิกต้องซิงก์แบบเต็มโดยไล่ทีละหน้า- บิลที่ปิดก่อนมีระบบติดตามการเปลี่ยนแปลงไม่มี
updatedAt⇒ ไม่โผล่ในผลของupdatedSinceเลย · ให้ดึงย้อนหลังด้วยfrom/toให้ครบก่อน - ไม่มี webhook และไม่มีการ push · ทุกอย่างเป็นการดึงตามรอบของคุณเอง
- ไม่มี sandbox และไม่มีชุดข้อมูลทดสอบ — ดู ข้อมูลทดสอบ
- คำขอข้ามโดเมนถูกปัด · API นี้เป็นแบบเซิร์ฟเวอร์ถึงเซิร์ฟเวอร์เท่านั้น
- สินค้า เมนู สต็อก ต้นทุน และสูตร ไม่ถูกเปิดผ่านเส้นใดเลย
(ตั้งแต่ 1.3.0 รายชื่อหมวดของร้านเปิดที่
/v1/shopsแล้ว · ที่เหลือยังเป็นแบบเดิม)