บทนำ
Partner API ของ Performance Hub ช่วยให้แพลตฟอร์มของพาร์ทเนอร์ภายนอกผสานรวมกับโมดูลหลักของ Performance Hub ได้อย่างราบรื่น API นี้รองรับคอมพิวเตอร์วิทัศน์ การวิเคราะห์ การบันทึกการเข้าถึงของสมาชิก และข้อมูลเชิงลึกของสถานที่
รูปแบบคำขอ
API รองรับเนื้อหาคำขอที่เข้ารหัสแบบ JSON และส่งคืนการตอบกลับที่เข้ารหัสแบบ JSON
การจำกัดอัตราการเรียกใช้
เพื่อให้การใช้งานเป็นธรรมและระบบมีเสถียรภาพ บัญชี Partner API จะเริ่มต้นด้วยขีดจำกัดเริ่มต้นดังนี้:
- 5 คำขอต่อวินาที ต่อปลายทาง
- แนะนำ: สูงสุด 1000 รายการ ต่อคำขอแบบกลุ่มเพื่อประสิทธิภาพสูงสุด
- ขนาดเพย์โหลดสูงสุด 10MB
ขีดจำกัดอัตราการเรียกใช้สามารถปรับได้ และผู้จัดการบัญชีพาร์ทเนอร์ของ Performance Hub สามารถกำหนดค่าเป็นรายกรณีได้ หากการผสานรวมของคุณต้องการปริมาณงานที่สูงขึ้นสำหรับการเปิดตัว การย้ายข้อมูล การเติมข้อมูลรายงานย้อนหลัง หรือสถานที่ที่มีปริมาณการใช้งานสูง ให้แจ้งเรื่องนี้ระหว่างการเริ่มต้นใช้งานหรือก่อนช่วงเวลาการเปลี่ยนแปลงที่วางแผนไว้
Base URL
https://partner-api.performancehub.co/partner/v1/
การยืนยันตัวตน
การเข้าถึง Partner API ต้องยืนยันตัวตนด้วยคีย์ลับของ API สร้างและจัดการคีย์ของคุณได้ผ่าน Partner Console
คีย์ API ทำหน้าที่เป็นข้อมูลประจำตัวของคุณในการเข้าถึงทรัพยากรของพาร์ทเนอร์ คีย์แต่ละรายการมีสิทธิ์เข้าถึงจำกัดเฉพาะข้อมูลขององค์กรที่กำหนด และสามารถปิดใช้งานได้ทันทีเมื่อจำเป็น
จัดการคีย์ API ของคุณอย่างระมัดระวัง เนื่องจากคีย์ให้สิทธิ์เข้าถึงบัญชีของคุณได้เต็มรูปแบบ อย่าเปิดเผยคีย์เหล่านี้ในที่เก็บโค้ดสาธารณะ แอปพลิเคชันฝั่งไคลเอนต์ หรือที่ใดก็ตามที่คีย์อาจถูกเข้าถึงโดยไม่ได้รับอนุญาต
ยืนยันตัวตนของคำขอโดยใช้ HTTP Basic Auth โดยส่งคีย์ API ของคุณเป็นชื่อผู้ใช้ และเว้นรหัสผ่านว่างไว้
API รองรับเฉพาะการเชื่อมต่อ HTTPS ที่ปลอดภัยเท่านั้น คำขอผ่าน HTTP ธรรมดาจะถูกปฏิเสธ เช่นเดียวกับคำขอใด ๆ ที่ไม่มีข้อมูลประจำตัวสำหรับการยืนยันตัวตนที่ถูกต้อง
ตัวอย่างคำขอ
curl https://partner-api.performancehub.co/partner/v1/organisations \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
# The colon prevents curl from asking for a password.
ตรวจสอบคีย์ลับ
curl https://partner-api.performancehub.co/partner/v1/auth/ping \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
# Returns { "message": "You are successfully authorised as <PartnerName>" }
รายการตรวจสอบก่อนเปิดใช้งานจริง
ใช้รายการตรวจสอบนี้ก่อนเปิดใช้การผสานรวมพาร์ทเนอร์สำหรับสถานที่ที่ใช้งานจริง
การตั้งค่า Partner Console
- โปรไฟล์พาร์ทเนอร์ของคุณสมบูรณ์แล้ว
- URL โลโก้ เว็บไซต์ หมวดหมู่ และคำอธิบายของคุณถูกต้อง
- กำหนดค่าวิธีการเชื่อมโยงข้อมูลแล้ว: Direct Link หรือ Linking Identifier
- ทดสอบการเชื่อมโยงสถานที่กับสถานที่จริงอย่างน้อยหนึ่งแห่งแล้ว
- ใช้ประเภทคีย์ที่ถูกต้อง:
- Dryrun สำหรับการทดสอบการเขียนที่ไม่ส่งผลเสียหาย
- Read-only สำหรับการใช้ข้อมูลอย่างปลอดภัย
- Live เฉพาะเมื่อคุณพร้อมที่จะส่งผลต่อข้อมูลการใช้งานจริงเท่านั้น
การยืนยันตัวตนและการจัดการคีย์
- จัดเก็บคีย์ลับไว้ฝั่งเซิร์ฟเวอร์เท่านั้น
- ไม่มีการฝังคีย์ไว้ในแอปพลิเคชันฝั่งไคลเอนต์ แอปบนอุปกรณ์เคลื่อนที่ ที่เก็บโค้ดสาธารณะ หรือตั๋วขอรับการสนับสนุน
- ทดสอบการหมุนเวียนและการเพิกถอนคีย์แล้ว
- ทีมของคุณทราบว่าแต่ละสภาพแวดล้อมใช้คีย์ใด
การตรวจสอบความถูกต้องของข้อมูล
- มีฟิลด์ที่จำเป็นครบสำหรับทุกปลายทางที่คุณเรียกใช้
- ตัวระบุสถานที่ตรงกับวิธีการเชื่อมโยงที่คุณกำหนดค่าไว้
- ID จากระบบของคุณคงที่และไม่เปลี่ยนแปลงระหว่างการซิงค์
- การนำเข้าข้อมูลขนาดใหญ่ถูกแบ่งเป็นกลุ่มที่อยู่ภายในขีดจำกัดที่ระบุไว้ในเอกสาร
- สามารถระบุและส่งรายการในกลุ่มที่ล้มเหลวซ้ำได้
การทดสอบปลายทาง
ก่อนเปิดตัว ให้ทดสอบทุกปลายทางที่การผสานรวมของคุณต้องใช้:
- อ่านข้อมูลองค์กรและสถานที่ได้
- บันทึกและอัปเดตข้อมูลสมาชิกได้
- แผนสมาชิก โซนการเข้าถึง และชั่วโมงการเข้าถึงซิงค์อย่างถูกต้อง
- ระบบรับการเช็กอินและเชื่อมโยงกลับไปยังระบบของคุณได้
- สแนปช็อตรายงานใช้ช่วงเวลาการรายงานและเมตริกตามที่คาดไว้
- ทดสอบขั้นตอนของ Door/Gate Controller กับฮาร์ดแวร์จริงในกรณีที่เกี่ยวข้อง
ความพร้อมของ Access Time Window
หากการผสานรวมส่ง Access Time Windows:
- ตัวอย่างแบบกำหนดวันเวลาแน่นอนและแบบรายสัปดาห์ผ่านรายการตรวจสอบการรับรองผู้ส่งข้อมูล
- ค่า epoch เป็นจำนวนเต็มวินาที Unix ที่ไม่มีเครื่องหมายคำพูด และทดสอบขอบเขต
[from, to)ที่แน่นอนแล้ว - ตรวจสอบค่าเริ่มต้น UTC เขตเวลา IANA แบบกำหนดเองของการผสานรวม และการเปลี่ยนเวลาออมแสงที่เกี่ยวข้องแล้ว
- มีสตรีมเวอร์ชันของสมาชิก/แหล่งข้อมูลที่คงทนและเพิ่มขึ้นทางเดียวเพียงสตรีมเดียว ที่ประสานการอัปเดตแบบส่วนเพิ่ม การกระทบยอด และการลองใหม่
- ผู้ปฏิบัติงานเข้าใจลักษณะการทำงานของการเว้นค่า การแทนที่ทั้งหมด Idempotent ความขัดแย้ง ข้อมูลเก่า และ
[]ที่ระบุอย่างชัดเจน scope_keyทุกรายการ รวมถึงdefaultมีการจับคู่กับ Performance Hub ที่ได้รับอนุมัติ และทดสอบแล้วว่าคีย์ที่ไม่รู้จักจะไม่ให้สิทธิ์เข้าถึง- กำหนดค่ารอบการรีเฟรชที่คาดไว้ อายุสูงสุดของข้อมูลต้นทาง ลักษณะการทำงานเมื่อข้อมูลต้นทางเก่า และการแจ้งเตือนของการผสานรวมแล้ว
- พิสูจน์แล้วว่าความล้มเหลวในการดึงข้อมูลจากต้นทางจะไม่ส่งสแนปช็อตที่ว่างเปล่าหรือไม่ครบถ้วนออกไป
- การบรรจบกันของสตรีมในแต่ละขั้น การยกเลิก/การเพิกถอนสิทธิ์ และขอบเขตเวลาเริ่มต้น/สิ้นสุดที่ประตูจริงเป็นไปตามเป้าหมายที่ตกลงไว้
- ตรวจสอบแล้วว่ากฎปกติและสิทธิ์แบบถาวรทำหน้าที่เป็นเส้นทางสำรอง และช่วงเวลาไม่สามารถข้ามการปิดใช้งานผู้ใช้
blockAllAccessการบำรุงรักษา หรือ Geofence ได้
ความพร้อมของการควบคุมการเข้าถึง
สำหรับการผสานรวมด้านการควบคุมการเข้าถึง:
- ระบบของคุณตัดสินใจเรื่องการเข้าถึงก่อนเรียก Performance Hub
- การผสานรวมจัดการ
device_offline,maintenance_mode_activeและunlock_confirmation_timeoutได้ - ผู้ปฏิบัติงานเข้าใจว่าการหมดเวลาหมายความว่าการปลดล็อกไม่ได้รับการยืนยัน
- บันทึกของคุณจัดเก็บ
event_idและcommand_idที่ส่งคืนมา - คุณมีกระบวนการสำรองแบบดำเนินการด้วยตนเองสำหรับเจ้าหน้าที่ของสถานที่
การจัดการข้อผิดพลาดและการลองใหม่
- การตอบกลับ
400,401,403,404,409และ422จะแจ้งให้ผู้ปฏิบัติงานหรือทีมสนับสนุนทราบ แทนที่จะลองใหม่โดยไม่ไตร่ตรอง - การตอบกลับ
429,500,502,503และ504ใช้ตรรกะการลองใหม่แบบจำกัดจำนวนครั้งพร้อมการเว้นระยะ - ความล้มเหลวซ้ำ ๆ จะสร้างการแจ้งเตือนในระบบของคุณ
- การผสานรวมไม่ทิ้งเรคคอร์ดที่ล้มเหลวไปอย่างเงียบ ๆ
การติดตามและตรวจสอบ
- บันทึกของคุณมีปลายทาง การประทับเวลา ตัวระบุสถานที่ ID ของเรคคอร์ดต้นทาง ผลลัพธ์ของคำขอ และเนื้อหาการตอบกลับ
- ทีมสนับสนุนของคุณค้นหาได้ด้วย ID สมาชิก ID สถานที่ ID การเช็กอิน หรือ ID เหตุการณ์การปลดล็อก
- คุณมีวิธีส่งซ้ำหรือกระทบยอดการซิงค์ที่ล้มเหลว
การเปิดใช้งานจริง
- Performance Hub ยืนยันสิทธิ์การเข้าถึงสำหรับการใช้งานจริงของคุณแล้ว
- มีสถานที่ที่ใช้งานจริงอย่างน้อยหนึ่งแห่งเปิดใช้การผสานรวมของคุณ
- คีย์สำหรับการใช้งานจริงของคุณใช้งานได้อยู่
- ข้อมูลผู้ติดต่อด้านการดำเนินงานและด้านเทคนิคของคุณเป็นปัจจุบัน
- กระบวนการสนับสนุนของคุณมีเอกสารสำหรับลูกค้าแล้ว
หลังจากการตรวจสอบเหล่านี้เสร็จสมบูรณ์ การผสานรวมที่คุณกำหนดค่าไว้จะปรากฏในไดเรกทอรีพาร์ทเนอร์ของ Performance Hub ภายในแพลตฟอร์มหลักของ Performance Hub
แนวทางปฏิบัติที่ดีที่สุด
ใช้รูปแบบเหล่านี้เพื่อให้การผสานรวมของพาร์ทเนอร์คาดการณ์ได้ ตรวจสอบได้ และปลอดภัยสำหรับสถานที่
ระบุสถานที่อย่างสม่ำเสมอ
เลือกวิธีการเชื่อมโยงที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณ และใช้อย่างสม่ำเสมอ:
- Direct Link - ใช้
facility_idของ Performance Hub ที่ส่งคืนจากปลายทางสถานที่ - Linking Identifier - ใช้ตัวระบุตำแหน่งที่ตั้งของคุณเอง เช่น ID สาขา รหัสตำแหน่งที่ตั้ง หรือหมายเลขร้านค้า
อย่าส่งตัวระบุทั้งสองแบบในคำขอเดียวกัน Performance Hub จะประมวลผลคำขอโดยใช้วิธีการเชื่อมโยงที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณ
ดูคำแนะนำในการตั้งค่าได้ที่วิธีการเชื่อมโยงของพาร์ทเนอร์
เขียนข้อมูลแบบกลุ่มอย่างระมัดระวัง
Partner API รองรับเนื้อหาคำขอแบบ JSON และออกแบบมาสำหรับขั้นตอนการซิงค์แบบกลุ่มในส่วนที่มีการระบุไว้ในเอกสาร ให้จำกัดขนาดของแต่ละกลุ่มและออกแบบให้ลองใหม่ได้
แนวทางเริ่มต้น:
- ใช้ไม่เกิน 1000 รายการต่อคำขอแบบกลุ่ม เพื่อประสิทธิภาพสูงสุด
- รักษาขนาดเพย์โหลดให้ต่ำกว่า 10MB
- ไม่เกิน 5 คำขอต่อวินาทีต่อปลายทาง
ขีดจำกัดอัตราการเรียกใช้สามารถปรับได้ และผู้จัดการบัญชีพาร์ทเนอร์ของ Performance Hub สามารถกำหนดค่าเป็นรายกรณีได้ หากคุณคาดว่าจะมีการนำเข้าข้อมูลปริมาณมาก ทราฟฟิกช่วงเปิดตัว หรือการเติมข้อมูลรายงานย้อนหลัง ให้ตกลงปริมาณงานที่ต้องการก่อนถึงช่วงเวลาการเปลี่ยนแปลง
หากต้องการซิงค์ชุดข้อมูลขนาดใหญ่ ให้แบ่งออกเป็นส่วนย่อยที่กำหนดแน่นอน และบันทึก ID ของแต่ละส่วนไว้ฝั่งคุณ วิธีนี้ช่วยให้วิเคราะห์การลองใหม่ที่ล้มเหลวได้ง่ายขึ้น
ลองใหม่อย่างปลอดภัย
ใช้การเว้นระยะแบบเอ็กซ์โพเนนเชียล (exponential backoff) สำหรับความล้มเหลวชั่วคราว เช่น 429, 500, 502, 503 และ 504
หลีกเลี่ยงการลองใหม่แบบวนซ้ำถี่ ๆ จุดเริ่มต้นที่ดีคือ:
- ลองใหม่หลังจาก 1 วินาที
- ลองใหม่หลังจาก 2 วินาที
- ลองใหม่หลังจาก 4 วินาที
- หยุดและแจ้งเตือนหากการดำเนินการยังคงล้มเหลว
สำหรับความล้มเหลวในการตรวจสอบความถูกต้อง เช่น 400 หรือ 422 ให้แก้ไขคำขอก่อนลองใหม่
ใช้ Idempotency ในส่วนที่รองรับ
ปลายทางปลดล็อก Door/Gate Controller รองรับ idempotency_key แบบไม่บังคับ การใช้คีย์เดิมซ้ำสำหรับพาร์ทเนอร์ สถานที่ และประตูเดียวกันจะส่งคืนผลลัพธ์ที่มีอยู่เมื่อมี
ใช้คีย์ที่คงที่สำหรับการดำเนินการที่ทำอยู่ เช่น ID การเช็กอินหรือ ID เหตุการณ์การเข้าถึงจากระบบของคุณ
อย่าสันนิษฐานว่าปลายทางการเขียนทุกตัวรองรับ Idempotency เว้นแต่จะระบุไว้ในเอกสารของปลายทางนั้น
รักษาข้อมูลต้นทางให้สะอาด
ส่งค่าที่คงที่และเป็นมาตรฐานทุกครั้งที่ทำได้:
- ใช้ ID ของสมาชิก แผน สถานที่ และการเช็กอินที่สอดคล้องกันจากระบบต้นทางของคุณ
- ใช้การประทับเวลาแบบ ISO 8601 สำหรับวันที่และเวลา
- ส่งหมายเลขโทรศัพท์ในรูปแบบสากลหากมี
- ส่งสกุลเงินโดยใช้ฟิลด์ที่ระบุไว้ในเอกสารของแต่ละปลายทาง
- หลีกเลี่ยงการใส่ข้อมูลที่ควรอยู่ในฟิลด์แบบมีโครงสร้างลงในฟิลด์ข้อความอิสระมากเกินไป
ออกแบบสำหรับการซิงค์แบบส่วนเพิ่มและแบบเต็ม
การผสานรวมของพาร์ทเนอร์ส่วนใหญ่ต้องใช้ทั้งสองแบบ:
- การซิงค์แบบส่วนเพิ่ม สำหรับการเปลี่ยนแปลงในแต่ละวัน
- การซิงค์เพื่อกระทบยอดแบบเต็ม เพื่อแก้ไขเหตุการณ์ที่ตกหล่น การนำเข้าข้อมูลย้อนหลัง หรือข้อมูลที่คลาดเคลื่อน
การผสานรวมของคุณควรส่งสถานะปัจจุบันของสมาชิก แผนสมาชิก หรือสแนปช็อตรายงานซ้ำได้ โดยไม่ขึ้นอยู่กับว่าคำขอก่อนหน้าสำเร็จหรือไม่
เผยแพร่ Access Time Windows อย่างปลอดภัย
ให้ถือว่าค่า access_time_windows ของสมาชิกแต่ละรายเป็นสแนปช็อตที่สมบูรณ์และมีการกำหนดเวอร์ชันแยกกันอย่างอิสระ:
- ประสานสตรีม
access_time_windows_revisionที่เพิ่มขึ้นทางเดียวเพียงสตรีมเดียวระหว่างเวิร์กเกอร์แบบส่วนเพิ่มและเวิร์กเกอร์กระทบยอด - ลองส่งใหม่สำหรับการส่งที่ไม่แน่นอนหรือล้มเหลวชั่วคราว โดยใช้เวอร์ชันเดิมและเพย์โหลดที่ปรับให้เป็นมาตรฐานแบบเดิม
- เว้น
access_time_windowsไว้เมื่อคุณไม่ได้อัปเดตค่านี้ - ส่ง
[]ก็ต่อเมื่อการดึงข้อมูลจากแหล่งที่เชื่อถือได้สำเร็จและพิสูจน์แล้วว่าไม่มีช่วงเวลาเหลืออยู่เท่านั้น อย่าเปลี่ยนการหมดเวลาของต้นทาง ผลลัพธ์ที่ไม่ครบถ้วน หรือความล้มเหลวในการแยกวิเคราะห์ให้กลายเป็นการเพิกถอนสิทธิ์ - รักษา
external_idและscope_keyให้คงที่ และรับรองการจับคู่ขอบเขตทุกรายการก่อนใช้งานจริง - ติดตามอายุของข้อมูลต้นทางเทียบกับนโยบายความเป็นปัจจุบันที่ตกลงไว้สำหรับการผสานรวมนั้น
ดูคู่มือผู้ส่งข้อมูล Access Time Windows ฉบับทางการ สำหรับสแนปช็อตแบบสมบูรณ์ เขตเวลา DST การยกเลิก และเวกเตอร์ทดสอบ
ถือว่าการควบคุมการเข้าถึงมีความสำคัญด้านความปลอดภัย
สำหรับการปลดล็อก Door/Gate Controller:
- ระบบของคุณต้องตัดสินว่าบุคคลนั้นได้รับอนุญาตให้เข้าหรือไม่ก่อนเรียก Performance Hub
- Performance Hub จะส่งคืน
200ก็ต่อเมื่อตัวควบคุมในสถานที่ยืนยันว่ารีเลย์ปลดล็อกทางกายภาพแล้วเท่านั้น - การยืนยันส่วนใหญ่เสร็จสิ้นภายใน 3-5 วินาที
- การหมดเวลาถือเป็นการปลดล็อกที่ล้มเหลวอย่างชัดเจน ไม่ใช่ความสำเร็จที่เกิดขึ้นเบื้องหลัง
- ลองใหม่ตามกฎด้านการเข้าถึงและความปลอดภัยของคุณเองเท่านั้น
บันทึก event_id และ command_id ที่ส่งคืนจากปลายทางปลดล็อกทุกครั้ง
ติดตามการผสานรวมของคุณ
ใช้บันทึกคำขอใน Partner Console ระหว่างการพัฒนาและการเปิดตัว ในการใช้งานจริง ให้เก็บบันทึกของคุณเองด้วย โดยมีข้อมูลต่อไปนี้:
- การประทับเวลาของคำขอ
- ปลายทาง
- ID ของเรคคอร์ดต้นทาง
- ตัวระบุสถานที่
- รหัสสถานะ HTTP
- เนื้อหาการตอบกลับหรือข้อความแสดงข้อผิดพลาดจาก Performance Hub
ฟิลด์เหล่านี้ช่วยให้การสนับสนุนและการกระทบยอดรวดเร็วขึ้นมากเมื่อลูกค้าสอบถามว่าเกิดอะไรขึ้น
องค์กร
แสดงถึงหน่วยธุรกิจระดับบนสุดที่ดำเนินงานสถานที่ตั้งแต่หนึ่งแห่งขึ้นไปซึ่งผสานรวมกับแพลตฟอร์ม Performance Hub
ปลายทาง
GET /partner/v1/organisations - List all organisations
ออบเจ็กต์ Organisation
แอตทริบิวต์
org_id
stringจำเป็นตัวระบุเฉพาะขององค์กร
name
stringจำเป็นชื่อองค์กร
ออบเจ็กต์ Organisation
{
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Group"
}
แสดงรายการองค์กรทั้งหมด
ส่งคืนรายการองค์กรที่บัญชีพาร์ทเนอร์ของคุณเข้าถึงได้
ค่าที่ส่งคืน
ส่งคืนออบเจ็กต์ JSON ที่มีพร็อพเพอร์ตี data ซึ่งประกอบด้วยอาร์เรย์ของออบเจ็กต์ Organisation
คำขอ
curl https://partner-api.performancehub.co/partner/v1/organisations \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
การตอบกลับ
{
"data": [
{
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Group"
},
{
"org_id": "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
"name": "Wellness Studios Network"
}
]
}
สถานที่
แสดงถึงตำแหน่งที่ตั้งทางกายภาพ เช่น สำนักงาน ร้านค้า สถานที่จัดงาน วิทยาเขต คลินิก หรือยิม ที่สมาชิกสามารถเข้าใช้บริการได้
ปลายทาง
GET /partner/v1/facilities - List all facilities
ออบเจ็กต์สถานที่
แอตทริบิวต์
facility_id
stringจำเป็นตัวระบุเฉพาะของสถานที่
org_id
stringจำเป็นตัวระบุเฉพาะขององค์กรหลัก
name
stringจำเป็นชื่อสถานที่
brand
stringไม่บังคับชื่อแบรนด์ที่สถานที่ใช้
website_url
stringไม่บังคับURL เว็บไซต์ของสถานที่
place_data
objectไม่บังคับข้อมูลตำแหน่งที่ตั้งจาก Google Places API ซึ่งประกอบด้วยประเทศ ที่อยู่ที่จัดรูปแบบแล้ว Google Place ID จังหวัด/รัฐ และเมือง
social_links
objectไม่บังคับลิงก์โซเชียลมีเดียของสถานที่
timezone
stringไม่บังคับตัวระบุเขตเวลา IANA (เช่น
"Australia/Sydney","America/New_York")
ออบเจ็กต์สถานที่
{
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Central",
"brand": "Harbourside",
"website_url": "https://example.com/central",
"social_links": {
"instagram": {
"handle": "@harbourside.central"
},
"facebook": {
"handle": "HarboursideCentral"
}
},
"place_data": {
"country": {
"iso_code": "AU",
"full_name": "Australia"
},
"formatted_address": "123 Main Street, Suite 100, Sydney NSW 2000, Australia",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"province": {
"abbreviation": "NSW",
"full_name": "New South Wales"
},
"city": {
"short_name": "Sydney",
"full_name": "Sydney"
}
},
"timezone": "Australia/Sydney"
}
แสดงรายการสถานที่ทั้งหมด
ส่งคืนรายการสถานที่ที่บัญชีพาร์ทเนอร์ของคุณเข้าถึงได้
ค่าที่ส่งคืน
ส่งคืนออบเจ็กต์ JSON ที่มีพร็อพเพอร์ตี data ซึ่งประกอบด้วยอาร์เรย์ของออบเจ็กต์สถานที่
คำขอ
curl https://partner-api.performancehub.co/partner/v1/facilities \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
การตอบกลับ
{
"data": [
{
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"org_id": "00000000-0000-0000-0000-000000000050",
"name": "Harbourside Central",
"brand": "Harbourside",
"website_url": "https://example.com/central",
"place_data": {
"country": {
"iso_code": "AU",
"full_name": "Australia"
},
"formatted_address": "123 Main Street, Sydney NSW 2000, Australia",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"province": {
"abbreviation": "NSW",
"full_name": "New South Wales"
},
"city": {
"short_name": "Sydney",
"full_name": "Sydney"
}
},
"timezone": "Australia/Sydney"
}
]
}
แผนสมาชิก
กำหนดข้อเสนอที่ซื้อได้จากองค์กรหรือสถานที่ ซึ่งรวมถึงบริการ สิทธิประโยชน์ ตารางเวลา และราคา
ปลายทาง
POST /partner/v1/membership-plans - Save a membership plan
ออบเจ็กต์ Membership Plan
แอตทริบิวต์
membership_plan_id
stringจำเป็นตัวระบุเฉพาะของแผนสมาชิก
facility_id
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุเฉพาะของสถานที่จาก Performance Hub
linking_identifier
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมค่าตัวระบุเฉพาะของแต่ละตำแหน่งที่ตั้งที่พาร์ทเนอร์ใช้ (เช่น "Branch ID", "Location Code", "Store Number") ดูข้อมูลเพิ่มเติม
name
stringจำเป็นชื่อแผนที่มนุษย์อ่านได้ (เช่น
"Office tenant – business hours","Student – term access","Hotel guest","10 Class Pack")billing_cycle
stringไม่บังคับความถี่ในการเรียกเก็บเงิน เป็นค่าใดค่าหนึ่งต่อไปนี้
weekly,fortnightly,monthly,annuallyหรือone_timeprice
integerไม่บังคับราคาพื้นฐานในหน่วยสกุลเงินที่เล็กที่สุด (เซนต์สำหรับ USD/AUD)
currency
stringไม่บังคับรหัสสกุลเงิน ISO 4217 (เช่น
"AUD","USD")description
stringไม่บังคับคำอธิบายเพื่อการตลาดหรือใช้ภายใน (ไม่บังคับ)
active_members
integerไม่บังคับจำนวนสมาชิกที่ใช้งานอยู่ซึ่งใช้แผนสมาชิกนี้
is_recurring
booleanไม่บังคับระบุว่าแผนต่ออายุอัตโนมัติหรือไม่
is_trial
booleanไม่บังคับระบุว่าเป็นข้อเสนอแบบทดลองใช้หรือไม่
visible_to_public
booleanไม่บังคับระบุว่าแผนนี้เปิดให้ซื้อได้ด้วยตนเองหรือไม่
duration_days
integerไม่บังคับจำนวนวันที่แผนสมาชิกมีผลใช้งาน
access_zones
arrayไม่บังคับอาร์เรย์ของโซนการเข้าถึงที่รวมอยู่ในแผนสมาชิก แต่ละโซนสามารถกำหนดชั่วโมงการเข้าถึงของตนเองได้ ดูรายละเอียดได้ที่โซนการเข้าถึง
class_limit
integerไม่บังคับจำนวนคลาสสูงสุดที่อนุญาต (null หมายถึงไม่จำกัด)
ออบเจ็กต์ Membership Plan
ตัวอย่างนี้ใช้ facility_id สำหรับการผสานรวมแบบ Linking Identifier ให้ส่ง "linking_identifier": "branch_downtown" แทน
{
"membership_plan_id": "plan_99999",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Office tenant – business hours",
"description": "Weekday access to the level 3 tenancy and the end-of-trip facilities",
"billing_cycle": "monthly",
"price": 8900,
"currency": "AUD",
"duration_days": 30,
"is_recurring": true,
"is_trial": false,
"visible_to_public": false,
"active_members": 245,
"access_zones": [
{
"name": "Level 3 Tenancy",
"description": "Lift lobby, offices and meeting rooms on level 3",
"access_hours": {
"mon": [["07:00", "19:00"]],
"tue": [["07:00", "19:00"]],
"wed": [["07:00", "19:00"]],
"thu": [["07:00", "19:00"]],
"fri": [["07:00", "19:00"]]
}
},
{
"name": "End-of-trip Facilities",
"description": "Bike storage, lockers and showers",
"access_hours": {
"mon": [["06:00", "20:00"]],
"tue": [["06:00", "20:00"]],
"wed": [["06:00", "20:00"]],
"thu": [["06:00", "20:00"]],
"fri": [["06:00", "20:00"]]
}
}
],
"class_limit": null
}
โซนการเข้าถึง
โซนการเข้าถึงกำหนดพื้นที่เฉพาะภายในสถานที่ที่แผนสมาชิกให้สิทธิ์เข้าถึง แต่ละโซนสามารถมีชั่วโมงการเข้าถึงของตนเอง ทำให้กำหนดข้อจำกัดด้านเวลาแตกต่างกันในแต่ละพื้นที่ได้
โครงสร้าง
โซนการเข้าถึงแต่ละโซนประกอบด้วย:
name
stringจำเป็นชื่อของโซน (เช่น "Level 3 Tenancy", "Library", "Guest Floors", "Main Gym Floor")
description
stringไม่บังคับคำอธิบายสิ่งที่รวมอยู่ในโซนนั้น
access_hours
objectไม่บังคับชั่วโมงการเข้าถึงเฉพาะสำหรับโซนนี้ ดูรูปแบบช่วงเวลาได้ที่ชั่วโมงการเข้าถึง
ตัวอย่าง
อาคารสำนักงานที่มียิมสำหรับผู้เช่า: เข้าถึงพื้นที่เช่าได้ในเวลาทำการ และเข้าถึงยิมได้ตั้งแต่เช้าตรู่จนถึงค่ำ
{
"access_zones": [
{
"name": "Level 3 Tenancy",
"description": "Lift lobby, offices and meeting rooms on level 3",
"access_hours": {
"mon": [["07:00", "19:00"]],
"tue": [["07:00", "19:00"]],
"wed": [["07:00", "19:00"]],
"thu": [["07:00", "19:00"]],
"fri": [["07:00", "19:00"]]
}
},
{
"name": "Tenant Gym",
"description": "Ground-floor gym and change rooms for building tenants",
"access_hours": {
"mon": [["05:00", "22:00"]],
"tue": [["05:00", "22:00"]],
"wed": [["05:00", "22:00"]],
"thu": [["05:00", "22:00"]],
"fri": [["05:00", "22:00"]],
"sat": [["07:00", "18:00"]],
"sun": [["07:00", "18:00"]]
}
}
]
}
ชั่วโมงการเข้าถึง
ชั่วโมงการเข้าถึงระบุช่วงเวลาที่สมาชิกเข้าถึงโซนหนึ่ง ๆ ได้ในแต่ละวันของสัปดาห์ ชั่วโมงการเข้าถึงกำหนดแยกตามโซนการเข้าถึง ทำให้กำหนดข้อจำกัดด้านเวลาที่แตกต่างกันสำหรับพื้นที่ต่าง ๆ ของสถานที่ได้
โครงสร้าง
{
"mon": [["start_time", "end_time"]],
"tue": [["start_time", "end_time"]],
"wed": [["start_time", "end_time"]],
"thu": [["start_time", "end_time"]],
"fri": [["start_time", "end_time"]],
"sat": [["start_time", "end_time"]],
"sun": [["start_time", "end_time"]]
}
แต่ละวันเป็นอาร์เรย์ของช่วงเวลาในรูปแบบ HH:MM (นาฬิกาแบบ 24 ชั่วโมง) อาร์เรย์ว่าง [] หมายถึงไม่มีสิทธิ์เข้าถึงในวันนั้น วันที่ไม่ได้ระบุจะถือเหมือนอาร์เรย์ว่าง
ตัวอย่างกรณีการใช้งาน
ผู้เช่าสำนักงาน – เวลาทำการ: เข้าถึงได้ในเวลาทำการเฉพาะวันธรรมดาเท่านั้น
{
"access_hours": {
"mon": [["07:00", "19:00"]],
"tue": [["07:00", "19:00"]],
"wed": [["07:00", "19:00"]],
"thu": [["07:00", "19:00"]],
"fri": [["07:00", "19:00"]]
}
}
นักศึกษา – การเข้าถึงในภาคเรียน: ห้องสมุดในวิทยาเขตที่เปิดในวันธรรมดา โดยมีช่วงพักกลางวัน และเปิดในเช้าวันเสาร์
{
"access_hours": {
"mon": [["08:00", "12:30"], ["13:30", "21:00"]],
"tue": [["08:00", "12:30"], ["13:30", "21:00"]],
"wed": [["08:00", "12:30"], ["13:30", "21:00"]],
"thu": [["08:00", "12:30"], ["13:30", "21:00"]],
"fri": [["08:00", "12:30"], ["13:30", "17:00"]],
"sat": [["09:00", "13:00"]]
}
}
ยิม – รอบเช้าตรู่: เข้าถึงได้เฉพาะช่วงเช้าในวันธรรมดา
{
"access_hours": {
"mon": [["04:00", "12:00"]],
"tue": [["04:00", "12:00"]],
"wed": [["04:00", "12:00"]],
"thu": [["04:00", "12:00"]],
"fri": [["04:00", "12:00"]]
}
}
แขกของโรงแรม – ตลอด 24 ชั่วโมงทุกวัน: เข้าถึงได้ตลอดเวลา ซึ่งเป็นกรณีการใช้งานที่พบบ่อยที่สุด
{
"access_hours": {
"mon": [["00:00", "23:59"]],
"tue": [["00:00", "23:59"]],
"wed": [["00:00", "23:59"]],
"thu": [["00:00", "23:59"]],
"fri": [["00:00", "23:59"]],
"sat": [["00:00", "23:59"]],
"sun": [["00:00", "23:59"]]
}
}
ตัวอย่างแยกตามโซน
แผนสำหรับแขกของโรงแรมที่เข้าถึงชั้นห้องพักได้ตลอด 24 ชั่วโมง และเข้าถึงสระว่ายน้ำได้ในช่วงเวลาที่สั้นกว่า:
{
"access_zones": [
{
"name": "Guest Floors",
"description": "Lifts and corridors on the guest room levels",
"access_hours": {
"mon": [["00:00", "23:59"]],
"tue": [["00:00", "23:59"]],
"wed": [["00:00", "23:59"]],
"thu": [["00:00", "23:59"]],
"fri": [["00:00", "23:59"]],
"sat": [["00:00", "23:59"]],
"sun": [["00:00", "23:59"]]
}
},
{
"name": "Swimming Pool",
"description": "Access to the swimming pool and change rooms",
"access_hours": {
"mon": [["06:00", "20:00"]],
"tue": [["06:00", "20:00"]],
"wed": [["06:00", "20:00"]],
"thu": [["06:00", "20:00"]],
"fri": [["06:00", "20:00"]],
"sat": [["08:00", "18:00"]],
"sun": [["08:00", "18:00"]]
}
}
]
}
บันทึกแผนสมาชิก
สร้างหรืออัปเดตเรคคอร์ดแผนสมาชิก API จะพิจารณาว่าจะสร้างหรืออัปเดตโดยอิงจาก membership_plan_id
พารามิเตอร์
membership_plans
arrayจำเป็นอาร์เรย์ของออบเจ็กต์ Membership Plan ที่จะบันทึก จำนวนสูงสุดที่แนะนำ: 1000 รายการต่อคำขอเพื่อประสิทธิภาพสูงสุด API จะแบ่งรายการเป็นกลุ่มเพื่อประมวลผลโดยอัตโนมัติ แต่ละรายการต้องมี
facility_id(จำเป็นหากไม่ใช้linking_identifier) หรือlinking_identifier(จำเป็นหากไม่ใช้facility_id)
ค่าที่ส่งคืน
ส่งคืนข้อความสั้น ๆ ที่ยืนยันการดำเนินการซิงค์
คำขอ
ตัวอย่างนี้ใช้ facility_id สำหรับการผสานรวมแบบ Linking Identifier ให้ส่ง "linking_identifier": "branch_downtown" แทน
curl -X POST https://partner-api.performancehub.co/partner/v1/membership-plans \
-u sk_live_YOUR_PARTNER_SECRET_KEY: \
-H "Content-Type: application/json" \
-d '{
"membership_plans": [
{
"membership_plan_id": "plan_99999",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Student – term access",
"description": "Library and student hub access for one teaching term",
"billing_cycle": "one_time",
"price": 4500,
"currency": "AUD",
"duration_days": 84,
"is_recurring": false,
"is_trial": false,
"visible_to_public": true,
"active_members": 245,
"access_zones": [
{
"name": "Library",
"description": "Reading rooms, study spaces and bookable rooms",
"access_hours": {
"mon": [["08:00", "21:00"]],
"tue": [["08:00", "21:00"]],
"wed": [["08:00", "21:00"]],
"thu": [["08:00", "21:00"]],
"fri": [["08:00", "17:00"]],
"sat": [["09:00", "13:00"]]
}
},
{
"name": "Student Hub",
"description": "Common room, kitchen and lockers",
"access_hours": {
"mon": [["07:00", "22:00"]],
"tue": [["07:00", "22:00"]],
"wed": [["07:00", "22:00"]],
"thu": [["07:00", "22:00"]],
"fri": [["07:00", "22:00"]]
}
}
],
"class_limit": null
}
]
}'
การตอบกลับ
ส่งคืนข้อความแสดงความสำเร็จพร้อมข้อมูลเมตาเกี่ยวกับการดำเนินการซิงค์
{
"message": "Membership plan sync successful.",
"metadata": {
"success": 98,
"skipped": 2,
"skipped_items": [
{
"membership_plan_id": "plan_456",
"facility_id": null,
"reason": "Missing facility_id"
}
]
}
}
ฟิลด์ข้อมูลเมตา:
- success - จำนวนแผนสมาชิกที่ประมวลผลสำเร็จ
- skipped - จำนวนแผนที่ถูกข้าม (ถ้ามี)
- skipped_items - อาร์เรย์ของแผนที่ถูกข้ามพร้อมเหตุผล (ถ้ามี)
- dry-run - แฟล็กบูลีนเมื่อใช้คีย์ประเภท dryrun (ถ้ามี)
สมาชิก
แสดงถึงลูกค้ารายบุคคลของสถานที่ ซึ่งอาจเป็นลีด ผู้มีแนวโน้มเป็นลูกค้า ลูกค้าประจำ สมาชิกที่หมดอายุ หรือผู้ใช้ที่ถูกบล็อก
การ upsert สมาชิกยังสามารถส่งสแนปช็อต access_time_windows ที่สมบูรณ์และมีการกำหนดเวอร์ชัน ซึ่งประกอบด้วยการเข้าถึงแบบกำหนดวันเวลาแน่นอนและแบบรายสัปดาห์ที่เกิดซ้ำได้ด้วย โปรดอ่าน Access Time Windows ก่อนสร้างฟิลด์เหล่านี้ ฟิลด์เหล่านี้เป็นสิทธิ์แบบเพิ่มเติม และไม่ได้แทนที่กฎปกติหรือสิทธิ์แบบถาวรของสถานที่
ปลายทาง
POST /partner/v1/members - Save a member
ออบเจ็กต์ Member
แอตทริบิวต์
member_id
stringจำเป็นตัวระบุเฉพาะของสมาชิก
facility_id
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุเฉพาะของสถานที่จาก Performance Hub
linking_identifier
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมค่าตัวระบุเฉพาะของแต่ละตำแหน่งที่ตั้งที่พาร์ทเนอร์ใช้ (เช่น "Branch ID", "Location Code", "Store Number") ดูข้อมูลเพิ่มเติม
first_name
stringจำเป็นชื่อจริงของสมาชิก
last_name
stringจำเป็นนามสกุลของสมาชิก
email
stringไม่บังคับที่อยู่อีเมล
mobile_phone
stringไม่บังคับหมายเลขโทรศัพท์มือถือในรูปแบบ E.123 (เช่น
"+1 415 555 2671")address
objectไม่บังคับออบเจ็กต์ที่อยู่ทางกายภาพซึ่งมีพร็อพเพอร์ตีต่อไปนี้:
address_line_1(string) - ที่อยู่บรรทัดหลักaddress_line_2(string, ไม่บังคับ) - ที่อยู่บรรทัดที่สองcity(string) - ชื่อเมืองstate(string) - รหัสรัฐ/จังหวัดpostal_code(string) - รหัสไปรษณีย์country(string) - รหัสประเทศ ISO 3166-1 alpha-2 (เช่น "AU", "US")country_name(string, ไม่บังคับ) - ชื่อประเทศแบบเต็ม
date_of_birth
stringไม่บังคับวันเกิดในรูปแบบ
YYYY-MM-DDgender
stringไม่บังคับเป็นค่าใดค่าหนึ่งต่อไปนี้
male,female,non_binary,prefer_not_to_sayหรือunknowntype
stringไม่บังคับประเภทสมาชิก (เช่น
staff,member,prospect)tags
arrayไม่บังคับสตริงหรือข้อความช่วยเหลือแบบย่อสำหรับจัดหมวดหมู่และระบุสมาชิกบางราย (เช่น
["vip", "personal-training", "student"])membership_status
stringไม่บังคับสถานะสมาชิกปัจจุบัน (เช่น
active,expired,on_hold)membership_plans
arrayไม่บังคับอาร์เรย์ของแผนสมาชิกที่เชื่อมโยงกับสมาชิก
profile_picture
stringไม่บังคับรูปโปรไฟล์ที่เข้ารหัสแบบ Base64 (ไม่บังคับ)
created
stringไม่บังคับการประทับเวลาแบบ ISO 8601 ของเวลาที่สร้างสมาชิก
updated
stringไม่บังคับการประทับเวลาแบบ ISO 8601 ของเวลาที่อัปเดตสมาชิกครั้งล่าสุด
access_time_windows
arrayไม่บังคับสแนปช็อตที่สมบูรณ์ซึ่งแหล่งข้อมูลเป็นเจ้าของ ของ Access Time Windows แบบกำหนดวันเวลาแน่นอนและ/หรือแบบรายสัปดาห์ที่เกิดซ้ำ เว้นฟิลด์นี้ไว้เพื่อให้สแนปช็อตไม่เปลี่ยนแปลง หรือส่งอาร์เรย์ว่างพร้อมเวอร์ชันที่ใหม่กว่าเพื่อเพิกถอน ดูรูปแบบ การตรวจสอบความถูกต้อง การจับคู่ขอบเขต และหลักการแทนที่ได้ที่ Access Time Windows
access_time_windows_revision
integerจำเป็นเมื่อมี access_time_windowsจำนวนเต็มที่ไม่ติดลบ ปลอดภัยสำหรับ JSON และเพิ่มขึ้นทางเดียว สำหรับสตรีมของสมาชิก/แหล่งข้อมูลนี้ จำเป็นทุกครั้งที่มี
access_time_windows
ออบเจ็กต์ Member
{
"member_id": "member_11111",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
// "linking_identifier": "branch_downtown", // If using linking identifier
"first_name": "John",
"last_name": "Smith",
"email": "john.smith@example.com",
"mobile_phone": "+61 412 345 678",
"date_of_birth": "1985-06-15",
"gender": "male",
"type": "member",
"tags": ["vip", "personal-training"],
"profile_picture": "/9j/4AAQSkZJRgABAQAAAQ...",
"membership_status": "current",
"created": "2024-01-15T10:30:00Z",
"updated": "2024-01-20T14:45:00Z",
"access_time_windows_revision": 1842,
"access_time_windows": [
{
"external_id": "access-4b1782",
"kind": "absolute",
"from": 1792053000,
"to": 1792058400,
"timezone": "Australia/Perth",
"scope_key": "after_hours_entry",
"label": "Temporary site access"
}
],
"address": {
"address_line_1": "456 Bourke Street",
"address_line_2": "Apt 12",
"city": "Melbourne",
"state": "VIC",
"postal_code": "3000",
"country": "AU",
"country_name": "Australia"
},
"membership_plans": [
{
"membership_plan_id": "plan_99999",
"name": "Unlimited Monthly",
"start_date": "2024-01-01T00:00:00Z",
"status": "current",
"is_current": true,
"end_date": null
}
]
}
ช่วงเวลาการเข้าถึง
Access Time Windows ช่วยให้สมาชิกของพาร์ทเนอร์มีสิทธิ์การเข้าถึงชั่วคราวหรือแบบเกิดซ้ำที่ส่งมาจากระบบภายนอก หน้านี้เป็นคู่มือผู้ส่งข้อมูลฉบับทางการสำหรับ access_time_windows และ access_time_windows_revision
Access Time Windows เป็นสิทธิ์แบบเพิ่มเติมที่ใช้อนุญาตเท่านั้น ช่วงเวลาที่ใช้งานอยู่สามารถอนุญาตการเข้าถึงได้ แต่ช่วงเวลาที่ไม่ได้ใช้งาน หมดอายุ ข้อมูลเก่า หรือไม่ได้จับคู่ไว้ จะไม่ปฏิเสธการเข้าถึงที่กฎปกติหรือสิทธิ์แบบถาวรอนุญาตไว้แล้ว การปิดใช้งานผู้ใช้ การบล็อกประตูอย่างชัดเจน โหมดบำรุงรักษา Geofence การจำกัดอัตรา และความพร้อมใช้งานของตัวควบคุมยังคงมีผลอยู่
การพัฒนาสำหรับระบบต้นทางแต่ละระบบเป็นอะแดปเตอร์ที่แยกจากกัน อะแดปเตอร์ต้องแปลงข้อมูลต้นทางให้เป็นไปตามข้อตกลงที่ไม่ผูกกับผู้ให้บริการรายใดนี้ โดยไม่เปลี่ยนความหมายของฟิลด์
ฟิลด์สแนปช็อตของสมาชิก
access_time_windows
arrayไม่บังคับสแนปช็อต Access Time Window ที่สมบูรณ์สำหรับสมาชิกและแหล่งข้อมูลของพาร์ทเนอร์รายนี้ สแนปช็อตหนึ่งสามารถมีทั้งช่วงเวลาแบบ
absoluteและweeklyผสมกัน เว้นฟิลด์นี้ไว้เพื่อให้สแนปช็อตที่จัดเก็บไว้ไม่เปลี่ยนแปลง หรือส่ง[]เพื่อเพิกถอนทุกช่วงเวลาที่แหล่งข้อมูลนี้เป็นเจ้าของaccess_time_windows_revision
integerจำเป็นเมื่อมี access_time_windowsจำนวนเต็มที่ไม่ติดลบ ปลอดภัยสำหรับ JSON และเพิ่มขึ้นทางเดียว สำหรับสตรีมเวอร์ชันของสมาชิก/แหล่งข้อมูลนี้ จำเป็นทุกครั้งที่มี
access_time_windowsและต้องไม่เกิน9007199254740991
แต่ละสแนปช็อตรองรับช่วงเวลาได้สูงสุด 50 รายการ external_id, scope_key และ label รองรับได้สูงสุด 120 อักขระ ช่วงเวลาแบบกำหนดวันเวลาแน่นอนครอบคลุมได้สูงสุด 90 วัน แต่ละวันในช่วงเวลาแบบรายสัปดาห์รองรับบล็อกที่ไม่ทับซ้อนกันได้สูงสุดแปดบล็อก ข้อมูลที่ไม่ถูกต้องจะถูกปฏิเสธ แทนที่จะถูกตัดทอนหรือคาดเดา
รูปแบบของช่วงเวลา
ช่วงเวลาแบบกำหนดวันเวลาแน่นอน (absolute) ระบุช่วงเวลาที่แน่นอนหนึ่งช่วง:
ตัวอย่างคำขอแบบผสมที่สมบูรณ์
คำขอนี้จะแทนที่สแนปช็อตเดิมของสมาชิกที่แหล่งข้อมูลเป็นเจ้าของ ด้วยช่วงเวลาแบบกำหนดวันเวลาแน่นอนหนึ่งช่วงและแบบรายสัปดาห์หนึ่งช่วง:
กฎเกี่ยวกับเวลาและขอบเขต
from, to, active_from และ active_until เป็นจำนวนเต็มวินาที Unix แบบ JSON ที่ระบุเวลา UTC:
- ส่งเป็นจำนวนเต็ม JSON ที่ไม่มีเครื่องหมายคำพูด สตริงตัวเลข ทศนิยม สตริง RFC 3339 และมิลลิวินาที Unix จะถูกปฏิเสธ
- ทุกช่วงเวลาเป็นแบบครึ่งเปิด:
[from, to)การเข้าถึงเริ่มต้นได้ตรงเวลาfromพอดี และสิ้นสุดการใช้งานตรงเวลาtoพอดี fromต้องน้อยกว่าtoเมื่อมีขอบเขตรายสัปดาห์ทั้งสองค่าactive_fromต้องน้อยกว่าactive_until- อย่าคำนวณ epoch จากวันที่/เวลาท้องถิ่นที่ไม่มีเขตเวลา ให้แปลงเวลาต้นทางเป็นเวลา UTC ก่อน แล้วจึงหารมิลลิวินาที Unix ด้วย 1000 และตรวจสอบว่าผลลัพธ์เป็นจำนวนเต็ม
เขตเวลาและเวลาออมแสง
timezone ต้องเป็นเขตเวลา IANA ที่ถูกต้อง เช่น UTC, Australia/Perth หรือ America/New_York หากเว้นไว้ ค่าเริ่มต้นคือ UTC
- ช่วงเวลาแบบกำหนดวันเวลาแน่นอน:
fromและtoระบุเวลา UTC ที่แน่นอนอยู่แล้วtimezoneเป็นเพียงข้อมูลเมตาสำหรับการแสดงผลและการตรวจสอบ การเปลี่ยนค่านี้จะไม่เลื่อนเวลาใดเวลาหนึ่ง - ช่วงเวลาแบบรายสัปดาห์:
timezoneกำหนดนาฬิกาท้องถิ่นและกฎเวลาออมแสงที่ใช้ประเมินaccess_hoursอย่าแปลงบล็อกรายสัปดาห์เป็น UTC ล่วงหน้า - ระหว่างการปรับเวลาเดินหน้า เวลาท้องถิ่นที่เขตเวลาข้ามไปจะไม่เกิดขึ้น
- ระหว่างการปรับเวลาถอยหลัง เวลาจริงทั้งสองช่วงที่มีเวลาท้องถิ่นซ้ำกันจะตรงกับบล็อกรายสัปดาห์
active_fromและactive_untilยังคงเป็นเวลา UTC แม้ช่วงเวลาแบบรายสัปดาห์จะใช้เขตเวลาที่ไม่ใช่ UTC
access_hours ใช้ค่าตัวพิมพ์เล็ก sun ถึง sat แต่ละค่าเป็นอาร์เรย์ของคู่ [start, end] ในรูปแบบ HH:mm แบบ 24 ชั่วโมงที่เติมศูนย์ข้างหน้า บล็อกต้องไม่ว่าง เรียงลำดับ และไม่ทับซ้อนกัน end ไม่รวมอยู่ในช่วง บล็อกไม่สามารถข้ามเที่ยงคืนได้ ให้แยกช่วงเวลาข้ามคืนของต้นทางเป็นบล็อกช่วงดึกในวันแรกและบล็อกช่วงเช้าในวันถัดไป
ID ที่คงที่และการจับคู่ขอบเขต
external_id ต้องคงที่ตลอดอายุของช่วงเวลาเชิงตรรกะ และไม่ซ้ำกันภายในสแนปช็อตของสมาชิก รักษาค่าให้คงที่เมื่อเวลาหรือป้ายกำกับเปลี่ยนแปลง เพื่อให้ผู้ปฏิบัติงานและบันทึกการตรวจสอบเชื่อมโยงเวอร์ชันต่าง ๆ ได้ อย่านำกลับมาใช้กับช่วงเวลาที่ไม่เกี่ยวข้อง
scope_key คือเป้าหมายการเข้าถึงเชิงตรรกะที่คงที่ของคุณ ค่าเริ่มต้นคือ default ผู้ดูแลระบบของสถานที่จะจับคู่คีย์ที่อนุญาตแต่ละรายการกับเป้าหมายใน Performance Hub ได้แก่ ทั้งสถานที่ ประตู หรือขอบเขตการเข้าถึง:
สแนปช็อตที่สมบูรณ์และเวอร์ชัน
ให้ถือว่าฟิลด์ทั้งสองเป็นพาร์ทิชันที่กำหนดเวอร์ชันแยกต่างหากภายใน upsert ของสมาชิก:
| ข้อมูลนำเข้า | ผลลัพธ์ |
|---|---|
เว้น access_time_windows ไว้ |
สแนปช็อตที่มีอยู่ไม่เปลี่ยนแปลง ไม่ต้องระบุเวอร์ชัน |
| มีค่าพร้อมเวอร์ชันที่ใหม่กว่า | สแนปช็อตที่จัดเก็บไว้ทั้งหมดของสมาชิก/แหล่งข้อมูลนี้ถูกแทนที่ |
| เวอร์ชันเดิมและเพย์โหลดที่ปรับให้เป็นมาตรฐานแล้วเหมือนเดิม | การส่งซ้ำแบบ Idempotent สแนปช็อตไม่เปลี่ยนแปลง |
| เวอร์ชันเดิมแต่เพย์โหลดที่ปรับให้เป็นมาตรฐานแล้วต่างกัน | ความขัดแย้ง ให้จัดสรรเวอร์ชันใหม่หลังจากกระทบยอด |
| เวอร์ชันที่เก่ากว่า | สแนปช็อตเก่าจะถูกข้าม และไม่สามารถเขียนทับสถานะที่ใหม่กว่าได้ |
access_time_windows: [] พร้อมเวอร์ชันที่ใหม่กว่า |
เพิกถอนช่วงเวลาทั้งหมดที่แหล่งข้อมูลเป็นเจ้าของอย่างชัดเจน |
สแนปช็อตเป็นข้อมูลที่สมบูรณ์ ไม่ใช่การแก้ไขบางส่วน หากเวอร์ชัน 1842 มีช่วงเวลา A และ B แล้วเวอร์ชัน 1843 มีเพียง B ช่วงเวลา A จะถูกนำออก
ดูแลสตรีมเวอร์ชันที่ประสานกันเพียงสตรีมเดียวต่อพาร์ทเนอร์/สมาชิก ครอบคลุมเวิร์กเกอร์ webhook การโพล การส่งซ้ำ และการกระทบยอดแบบเต็ม แนะนำให้ใช้ลำดับเลขในฐานข้อมูลที่คงทน ค่ามิลลิวินาที Unix ใช้เป็นเวอร์ชันได้ก็ต่อเมื่อผู้เขียนทุกรายประสานงานกันและรับประกันลำดับและความไม่ซ้ำกันอย่างเคร่งครัดเท่านั้น ค่านี้เป็นค่าเวอร์ชัน ไม่ใช่ฟิลด์ epoch
เก็บคำขอและเวอร์ชันที่แน่นอนไว้จนกว่าจะทราบผลการตอบกลับของ API ลองส่งสแนปช็อตที่ปรับให้เป็นมาตรฐานเดิมซ้ำด้วยเวอร์ชันเดิมหลังจากหมดเวลาหรือเกิดข้อผิดพลาดชั่วคราว อย่าจัดสรรเวอร์ชันใหม่เพียงเพราะไม่แน่ใจว่าการรับส่งข้อมูลสำเร็จหรือไม่
การยกเลิก การหมดอายุ และความล้มเหลวของต้นทาง
- ยกเลิกช่วงเวลาหนึ่งช่วง: ดึงสถานะจากแหล่งข้อมูลที่เชื่อถือได้ให้สำเร็จ นำช่วงเวลานั้นออก แล้วส่งสแนปช็อตที่สมบูรณ์ซึ่งเหลืออยู่พร้อมเวอร์ชันที่ใหม่กว่า
- ยกเลิกทุกช่วงเวลา: ส่ง
access_time_windows: []พร้อมเวอร์ชันที่ใหม่กว่า - ปล่อยให้ช่วงเวลาแบบกำหนดวันเวลาแน่นอนหมดอายุ: ช่วงเวลาจะหยุดอนุญาตที่
toให้ส่งการกระทบยอดในภายหลังโดยไม่มีรายการที่หมดอายุ เพื่อให้สแนปช็อตสะอาด - สิ้นสุดช่วงเวลาแบบรายสัปดาห์: นำออกในสแนปช็อตที่ใหม่กว่า หรือใช้
active_untilเมื่อแหล่งข้อมูลทราบเวลาสิ้นสุดที่แน่นอน - การดึงข้อมูลจากต้นทางล้มเหลวหรือไม่ครบถ้วน: อย่าส่ง
[]และอย่าเผยแพร่สแนปช็อตที่ไม่ครบถ้วน ให้แจ้งเตือนและลองดึงข้อมูลใหม่ การเปลี่ยนความล้มเหลวของต้นทางให้เป็นสแนปช็อตว่างคือการเพิกถอนสิทธิ์การเข้าถึงโดยไม่ตั้งใจ - คำขอ Partner API ไม่ผ่านการตรวจสอบความถูกต้อง: แก้ไขข้อมูลและส่งเวอร์ชันที่ใหม่กว่าเฉพาะเมื่อสแนปช็อตที่ปรับให้เป็นมาตรฐานเปลี่ยนแปลงเท่านั้น ลองใหม่สำหรับความล้มเหลวชั่วคราวด้วยเวอร์ชันเดิม
ความเป็นปัจจุบันของแหล่งข้อมูลกำหนดค่าแยกตามการผสานรวม ตามรอบการส่งข้อมูลและการกระทบยอดที่สัญญาไว้ ก่อนเปิดใช้งาน ให้ตกลงเรื่องอายุสูงสุดของข้อมูลต้นทาง สิ่งที่จะเกิดขึ้นเมื่อเกินอายุนั้น เกณฑ์การแจ้งเตือน และผู้ปฏิบัติงานจะรับทราบการพึ่งพาเพียงขอบเขตของแต่ละช่วงเวลาได้หรือไม่ ช่วงเวลาจากแหล่งข้อมูลที่เก่าจะไม่กลายเป็นกฎการปฏิเสธ กฎปกติและสิทธิ์แบบถาวรยังคงเป็นเส้นทางสำรอง
อัลกอริทึมของผู้ส่งข้อมูล
ใช้ขั้นตอนการทำงานที่ไม่ขึ้นกับภาษาโปรแกรมนี้สำหรับการอัปเดตสมาชิกทุกครั้ง:
รายการตรวจสอบการรับรอง
ทำการตรวจสอบเหล่านี้ให้ครบในสถานที่ระดับ stage โดยใช้การจับคู่ scope_key ฉบับสุดท้าย:
- ช่วงเวลาแบบกำหนดวันเวลาแน่นอนที่ไม่ระบุเขตเวลาได้รับการยอมรับและประเมินเป็น UTC
- ช่วงเวลาแบบกำหนดวันเวลาแน่นอนที่ใช้เขตเวลา IANA แบบกำหนดเองคงเวลา
from/toเดิมไว้ - ช่วงเวลาแบบรายสัปดาห์ที่ใช้เขตเวลา IANA แบบกำหนดเองเป็นไปตามเวลานาฬิกาท้องถิ่นตลอดการปรับเวลาเดินหน้าและถอยหลัง
- สแนปช็อตแบบผสมระหว่างกำหนดวันเวลาแน่นอน/รายสัปดาห์แทนที่สแนปช็อตก่อนหน้าทั้งหมด
- การเข้าถึงเริ่มต้นตรงเวลา
fromพอดีและหยุดตรงเวลาtoพอดี และเวลาสิ้นสุดของบล็อกรายสัปดาห์ก็ไม่รวมอยู่ในช่วงเช่นกัน - การอัปเดตเวลาภายใต้
external_idเดิมพร้อมเวอร์ชันที่ใหม่กว่ามีผล - การเว้น
access_time_windowsไว้จะเปลี่ยนฟิลด์อื่นของสมาชิกโดยไม่เปลี่ยนช่วงเวลา - การส่งเวอร์ชัน/เพย์โหลดเดิมซ้ำเป็นแบบ Idempotent
- เวอร์ชันเดิม/เพย์โหลดต่างกันจะส่งคืนความขัดแย้งและไม่เปลี่ยนสแนปช็อต
- เวอร์ชันที่เก่ากว่าซึ่งมาไม่ตามลำดับจะถูกรายงานว่าเก่า และไม่สามารถย้อนสถานะกลับได้
-
[]ที่ใหม่กว่าจะเพิกถอนช่วงเวลาที่แหล่งข้อมูลเป็นเจ้าของ ส่วนความล้มเหลวในการดึงข้อมูลจากต้นทางจะไม่ส่งสิ่งใดออกไป -
scope_keyที่ไม่รู้จักหรือไม่ได้จับคู่ไว้จะไม่ให้สิทธิ์เข้าถึง และสร้างคำเตือนที่ผู้ปฏิบัติงานมองเห็นได้ - การแจ้งเตือนอายุของข้อมูลต้นทางและนโยบายแหล่งข้อมูลเก่าที่กำหนดค่าไว้ทำงานตามเกณฑ์ที่ตกลงไว้
- เส้นทาง webhook และการกระทบยอดแบบเต็มบรรจบกันที่สแนปช็อตและลำดับเวอร์ชันเดียวกัน
- การส่งข้อมูลผ่านสตรีมไปถึง Door & Gate Access ภายในเป้าหมายที่ตกลงไว้
- ช่วงเวลาที่ใช้งานอยู่สามารถอนุญาตประตูจริงที่จับคู่ไว้ได้ แต่ไม่สามารถข้ามการปิดใช้งานผู้ใช้
blockAllAccessการบำรุงรักษา หรือ Geofence ได้ - ก่อน นอก และหลังช่วงเวลา กฎปกติและสิทธิ์แบบถาวรยังคงอนุญาตผู้ใช้ที่มีคุณสมบัติตามปกติ
คำแนะนำที่เกี่ยวข้อง
{
"external_id": "access-4b1782",
"kind": "absolute",
"from": 1792053000,
"to": 1792058400,
"timezone": "Australia/Perth",
"scope_key": "after_hours_entry",
"label": "Temporary site access"
}
ฟิลด์ที่จำเป็นคือ external_id, kind, from และ to ส่วน timezone, scope_key และ label ไม่บังคับ
ช่วงเวลาแบบรายสัปดาห์ (weekly) ระบุช่วงเวลาตามนาฬิกาท้องถิ่นที่เกิดซ้ำ ซึ่งอาจกำหนดขอบเขตด้วยเวลา UTC ได้:
{
"external_id": "weekly-early-access",
"kind": "weekly",
"timezone": "America/New_York",
"access_hours": {
"sun": [],
"mon": [["06:00", "08:30"]],
"tue": [["06:00", "08:30"]],
"wed": [["06:00", "08:30"]],
"thu": [["06:00", "08:30"]],
"fri": [["06:00", "08:30"]],
"sat": []
},
"active_from": 1790812800,
"active_until": 1796083200,
"scope_key": "main_entry",
"label": "Weekday early access"
}
ฟิลด์ที่จำเป็นคือ external_id, kind และ access_hours ส่วน timezone, active_from, active_until, scope_key และ label ไม่บังคับ
curl -X POST https://partner-api.performancehub.co/partner/v1/members \
-u sk_live_YOUR_PARTNER_SECRET_KEY: \
-H "Content-Type: application/json" \
-d '{
"members": [
{
"member_id": "member_11111",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"first_name": "John",
"last_name": "Smith",
"access_time_windows_revision": 1842,
"access_time_windows": [
{
"external_id": "access-4b1782",
"kind": "absolute",
"from": 1792053000,
"to": 1792058400,
"timezone": "Australia/Perth",
"scope_key": "after_hours_entry",
"label": "Temporary site access"
},
{
"external_id": "weekly-early-access",
"kind": "weekly",
"timezone": "America/New_York",
"access_hours": {
"sun": [],
"mon": [["06:00", "08:30"]],
"tue": [["06:00", "08:30"]],
"wed": [["06:00", "08:30"]],
"thu": [["06:00", "08:30"]],
"fri": [["06:00", "08:30"]],
"sat": []
},
"active_from": 1790812800,
"active_until": 1796083200,
"scope_key": "main_entry",
"label": "Weekday early access"
}
]
}
]
}'
ใช้ facility_id หรือ linking_identifier อย่างใดอย่างหนึ่งตามวิธีการเชื่อมโยงที่คุณกำหนดค่าไว้ อย่าส่งทั้งสองค่า
การแปลง epoch
2026-10-15T08:30:00Z แปลงเป็น 1792053000:
UTC instant Unix milliseconds Unix seconds sent
2026-10-15T08:30:00Z 1792053000000 1792053000
การแปลงที่ไม่ขึ้นกับภาษาโปรแกรม:
instant = parse_source_timestamp_with_explicit_zone(source_timestamp)
milliseconds = instant.to_unix_milliseconds()
assert milliseconds modulo 1000 equals 0
seconds = milliseconds / 1000
assert seconds is a JSON-safe nonnegative integer
หากแหล่งข้อมูลมีความละเอียดต่ำกว่าวินาที ให้กำหนดนโยบายการปัดเศษเวลาเริ่มต้น/สิ้นสุดอย่างชัดเจนก่อนการทดสอบการผสานรวม อย่าส่งเป็นมิลลิวินาทีแล้วพึ่งพาให้ API อนุมานหน่วยเอง
Partner scope_key Performance Hub mapping
default Facility's configured default target
main_entry Access Scope "Main entrances"
after_hours_entry Doors approved for after-hours entry
พาร์ทเนอร์ไม่ต้องส่ง ID ของสถานที่ ประตู หรือขอบเขตการเข้าถึงของ Performance Hub ภายในช่วงเวลา scope_key ที่ไม่รู้จัก ถูกปิดใช้งาน หรือไม่ได้จับคู่ไว้จะไม่ให้สิทธิ์เข้าถึง สำหรับช่วงเวลานั้น และจะไม่ขยายสิทธิ์การเข้าถึง ตกลงและทดสอบการจับคู่ก่อนเปิดตัว
function publish_member(member_key):
source_result = fetch_authoritative_access_state(member_key)
if source_result.failed or source_result.incomplete:
record_failure(member_key)
schedule_retry(member_key)
return without sending access_time_windows
windows = []
for source_window in source_result.current_windows:
if source_window.is_absolute:
windows.append({
external_id: stable_window_id(source_window),
kind: "absolute",
from: to_integer_unix_seconds(source_window.start_instant),
to: to_integer_unix_seconds(source_window.end_instant),
timezone: source_window.display_timezone or "UTC",
scope_key: stable_scope_key(source_window) or "default",
label: safe_label(source_window)
})
else:
windows.append({
external_id: stable_window_id(source_window),
kind: "weekly",
timezone: valid_iana_zone(source_window.timezone) or "UTC",
access_hours: split_validate_and_sort_weekly_blocks(source_window),
active_from: optional_integer_unix_seconds(source_window.active_start),
active_until: optional_integer_unix_seconds(source_window.active_end),
scope_key: stable_scope_key(source_window) or "default",
label: safe_label(source_window)
})
normalized_snapshot = validate_sort_and_deduplicate(windows)
revision = next_durable_member_revision(member_key)
request = member_upsert_with(normalized_snapshot, revision)
persist_for_retry(member_key, request)
response = post_request(request)
if response.is_transient_or_unknown:
retry_exact_request_with_same_revision(request)
else if response.is_revision_conflict:
reconcile_with_latest_committed_source_state(member_key)
else if response.is_stale_skip:
stop_replaying_this_revision_and_reconcile(member_key)
เวกเตอร์ทดสอบขั้นต่ำ
[
{
"name": "absolute-half-open",
"window": {
"external_id": "tv-absolute",
"kind": "absolute",
"from": 1792053000,
"to": 1792058400
},
"expect": {
"1792052999": "inactive",
"1792053000": "active",
"1792058399": "active",
"1792058400": "inactive"
}
},
{
"name": "weekly-dst",
"window": {
"external_id": "tv-weekly-dst",
"kind": "weekly",
"timezone": "America/New_York",
"access_hours": {
"sun": [["01:00", "03:30"]],
"mon": [],
"tue": [],
"wed": [],
"thu": [],
"fri": [],
"sat": []
}
},
"expect": "Evaluate local wall time: skipped times do not occur; both repeated 01:30 instants qualify."
}
]
ส่งเวกเตอร์เชิงลบสำหรับมิลลิวินาที Unix สตริงตัวเลข ทศนิยม เขตเวลา IANA ที่ไม่ถูกต้อง from >= to external_id ที่ซ้ำกัน บล็อกที่ทับซ้อนกัน บล็อกข้ามคืน บล็อกมากกว่าแปดบล็อกในหนึ่งวัน ช่วงเวลามากกว่า 50 รายการ และคีย์ขอบเขตที่ไม่ได้จับคู่ไว้ด้วย
บันทึกสมาชิก
สร้างหรืออัปเดตเรคคอร์ดสมาชิก API จะพิจารณาว่าจะสร้างหรืออัปเดตโดยอิงจาก member_id
พารามิเตอร์
members
arrayจำเป็นอาร์เรย์ของออบเจ็กต์ Member ที่จะบันทึก จำนวนสูงสุดที่แนะนำ: 1000 รายการต่อคำขอเพื่อประสิทธิภาพสูงสุด API จะแบ่งรายการเป็นกลุ่มเพื่อประมวลผลโดยอัตโนมัติ แต่ละรายการต้องมี
facility_id(จำเป็นหากไม่ใช้linking_identifier) หรือlinking_identifier(จำเป็นหากไม่ใช้facility_id)เมื่อสมาชิกมี
access_time_windowsต้องมีaccess_time_windows_revisionด้วย อาร์เรย์นี้เป็นสแนปช็อตที่สมบูรณ์ของแหล่งข้อมูล ไม่ใช่การแก้ไขบางส่วน เว้นไว้เพื่อคงสแนปช็อตที่มีอยู่ หรือส่ง[]พร้อมเวอร์ชันที่ใหม่กว่าเพื่อเพิกถอนช่วงเวลาทั้งหมดที่แหล่งข้อมูลเป็นเจ้าของ โปรดอ่านคู่มือ Access Time Windows ก่อนเปิดใช้ฟิลด์นี้
ค่าที่ส่งคืน
ส่งคืนข้อความสั้น ๆ ที่ยืนยันการดำเนินการซิงค์
ฟิลด์โปรไฟล์ของสมาชิกยังคงเป็นการ upsert ตามปกติ แม้สแนปช็อตช่วงเวลาจะถูกรายงานว่าเป็นการส่งซ้ำแบบ Idempotent หรือถูกข้ามเพราะเป็นข้อมูลเก่า สแนปช็อตที่ขัดแย้งกัน (เวอร์ชันเดิม/เพย์โหลดต่างกัน) ไม่สามารถลองใหม่โดยไม่เปลี่ยนแปลงได้ ให้กระทบยอดสถานะของแหล่งข้อมูลแล้วส่งเวอร์ชันที่ใหม่กว่า
คำขอ
curl -X POST https://partner-api.performancehub.co/partner/v1/members \
-u sk_live_YOUR_PARTNER_SECRET_KEY: \
-H "Content-Type: application/json" \
-d '{
"members": [
{
"member_id": "member_11111",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
// "linking_identifier": "branch_downtown", // If using linking identifier
"first_name": "John",
"last_name": "Smith",
"email": "john.smith@example.com",
"mobile_phone": "+61 412 345 678",
"date_of_birth": "1985-06-15",
"gender": "male",
"type": "member",
"tags": ["vip", "personal-training"],
"profile_picture": "/9j/4AAQSkZJRgABAQAAAQ...",
"membership_status": "current",
"created": "2024-01-15T10:30:00Z",
"updated": "2024-01-20T14:45:00Z",
"access_time_windows_revision": 1842,
"access_time_windows": [
{
"external_id": "access-4b1782",
"kind": "absolute",
"from": 1792053000,
"to": 1792058400,
"timezone": "Australia/Perth",
"scope_key": "after_hours_entry",
"label": "Temporary site access"
}
],
"address": {
"address_line_1": "456 Bourke Street",
"address_line_2": "Apt 12",
"city": "Melbourne",
"state": "VIC",
"postal_code": "3000",
"country": "AU",
"country_name": "Australia"
},
"membership_plans": [
{
"membership_plan_id": "plan_99999",
"name": "Unlimited Monthly",
"start_date": "2024-01-01T00:00:00Z",
"status": "current",
"is_current": true,
"end_date": null
}
]
}
]
}'
การตอบกลับ
ส่งคืนข้อความแสดงความสำเร็จพร้อมข้อมูลเมตาเกี่ยวกับการดำเนินการซิงค์
{
"message": "Member sync successful.",
"metadata": {
"success": 245,
"skipped": 5,
"skipped_items": [
{
"member_id": "member_123",
"facility_id": null,
"reason": "Facility integration is disabled in facility-partner-config"
}
]
}
}
ฟิลด์ข้อมูลเมตา:
- success - จำนวนสมาชิกที่ประมวลผลสำเร็จ
- skipped - จำนวนสมาชิกที่ถูกข้าม (ถ้ามี)
- skipped_items - อาร์เรย์ของสมาชิกที่ถูกข้ามพร้อมเหตุผล (ถ้ามี)
- dry-run - แฟล็กบูลีนเมื่อใช้คีย์ประเภท dryrun (ถ้ามี)
การเช็กอิน
แสดงถึงบันทึกการอยู่ของบุคคลที่สถานที่ คลาส หรือกิจกรรม ใช้สำหรับติดตามการเข้าร่วม การวิเคราะห์การใช้งาน และการปรับปรุงความแม่นยำของการตรวจจับด้วยภาพ
ปลายทาง
POST /partner/v1/check-ins - Save check-ins
ออบเจ็กต์ Check-In
แอตทริบิวต์
check_in_id
stringไม่บังคับตัวระบุเฉพาะของการเช็กอิน ไม่บังคับ หากไม่ระบุ ระบบจะสร้างให้อัตโนมัติจากคู่ของ
member_idและtimestampmember_id
stringจำเป็นตัวระบุเฉพาะของสมาชิก
facility_id
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุเฉพาะของสถานที่จาก Performance Hub
linking_identifier
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมค่าตัวระบุเฉพาะของแต่ละตำแหน่งที่ตั้งที่พาร์ทเนอร์ใช้ (เช่น "Branch ID", "Location Code", "Store Number") ดูข้อมูลเพิ่มเติม
check_in_type
stringไม่บังคับประเภทของการเข้าใช้ เป็นค่าใดค่าหนึ่งต่อไปนี้
member,class,staff,guestหรือtrialsource
stringไม่บังคับวิธีที่บันทึกการเช็กอิน ค่าที่ใช้บ่อย ได้แก่
manual,tag,rfid,kiosk,appและอาจใช้ค่าอื่นเพิ่มเติม เช่นdoor_readerหรือbookingได้class_id
stringไม่บังคับไม่บังคับ ใช้เมื่อเชื่อมโยงกับการจองหรือการเข้าร่วมคลาส
timestamp
stringจำเป็นการประทับเวลาในรูปแบบ ISO 8601 ของเวลาที่เกิดการเช็กอิน
ออบเจ็กต์ Check-In
{
// "check_in_id": "checkin_abc123", // Optional - auto-generated from member_id + timestamp if not provided
"member_id": "mem_12345",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
// "linking_identifier": "branch_downtown", // If using linking identifier
"check_in_type": "member",
"source": "rfid",
"timestamp": "2025-01-20T08:45:30Z"
}
บันทึกการเช็กอิน
สร้างเรคคอร์ดการเช็กอิน API จะตัดรายการซ้ำโดยอัตโนมัติตามสมาชิก สถานที่ และการประทับเวลา
พารามิเตอร์
check_ins
arrayจำเป็นอาร์เรย์ของออบเจ็กต์ Check-In ที่จะบันทึก จำนวนสูงสุดที่แนะนำ: 1000 รายการต่อคำขอเพื่อประสิทธิภาพสูงสุด API จะแบ่งรายการเป็นกลุ่มเพื่อประมวลผลโดยอัตโนมัติ แต่ละรายการต้องมี
facility_id(จำเป็นหากไม่ใช้linking_identifier) หรือlinking_identifier(จำเป็นหากไม่ใช้facility_id)
ค่าที่ส่งคืน
ส่งคืนข้อความสั้น ๆ ที่ยืนยันการดำเนินการซิงค์
คำขอ
curl -X POST https://partner-api.performancehub.co/partner/v1/check-ins \
-u sk_live_YOUR_PARTNER_SECRET_KEY: \
-H "Content-Type: application/json" \
-d '{
"check_ins": [
{
// "check_in_id": "checkin_abc123", // Optional - auto-generated from member_id + timestamp if not provided
"member_id": "mem_12345",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
// "linking_identifier": "branch_downtown", // If using linking identifier
"check_in_type": "member",
"source": "rfid",
"timestamp": "2025-01-20T08:45:30Z"
}
]
}'
การตอบกลับ
ส่งคืนข้อความแสดงความสำเร็จพร้อมข้อมูลเมตาเกี่ยวกับการดำเนินการซิงค์
{
"message": "Check-in sync successful.",
"metadata": {
"success": 523,
"skipped": 3,
"skipped_items": [
{
"member_id": "member_789",
"facility_id": null,
"reason": "No matching facility_id for the linking_identifier"
}
]
}
}
ฟิลด์ข้อมูลเมตา:
- success - จำนวนการเช็กอินที่ประมวลผลสำเร็จ
- skipped - จำนวนการเช็กอินที่ถูกข้าม (ถ้ามี)
- skipped_items - อาร์เรย์ของการเช็กอินที่ถูกข้ามพร้อมเหตุผล (ถ้ามี)
- dry-run - แฟล็กบูลีนเมื่อใช้คีย์ประเภท dryrun (ถ้ามี)
การควบคุมการเข้าถึง
Partner API สามารถสั่งงานฮาร์ดแวร์ Door/Gate Controller ของ Performance Hub สำหรับสถานที่ที่เปิดใช้การผสานรวมของคุณ
ใช้ API นี้เมื่อระบบจัดการสมาชิกของคุณได้ตัดสินแล้วว่าบุคคลนั้นได้รับอนุญาตให้เข้า Performance Hub ไม่ได้ประเมินสถานะสมาชิก ชั่วโมงการเข้าถึง กฎโซนประตู การตรวจสอบการฉ้อโกง หรือตรรกะการระงับสมาชิก ระบบของคุณยังคงเป็นผู้มีอำนาจในการตัดสินใจเหล่านั้น
คำขอปลดล็อกเป็นแบบซิงโครนัส Performance Hub จะส่งคำสั่งไปยังตัวควบคุมในสถานที่แบบเรียลไทม์ และจะส่งคืน 200 ก็ต่อเมื่ออุปกรณ์ยืนยันว่ารีเลย์ปลดล็อกทางกายภาพแล้วเท่านั้น การยืนยันส่วนใหญ่ควรเสร็จสิ้นภายใน 3-5 วินาที หากไม่ได้รับการยืนยันภายในช่วงเวลาหมดเวลา API จะส่งคืนความล้มเหลวอย่างชัดเจน
คุณยังสามารถบันทึกความพยายามในการเข้าถึงหรือการปฏิเสธที่ไม่ได้ไปถึงตัวควบคุมได้ด้วย การเรียกนั้นจะไม่ปลดล็อกประตู แต่จะเขียนเหตุการณ์ลงในบันทึกการเข้าถึงของ Door & Gate Access
ปลายทาง
GET /partner/v1/access-control/doors - List available Door/Gate Controllers
GET /partner/v1/access-control/doors/{door_id} - Get Door/Gate Controller status
POST /partner/v1/access-control/doors/{door_id}/unlock - Unlock a Door/Gate Controller
POST /partner/v1/access-control/doors/{door_id}/access-events - Record an access attempt or denial
ออบเจ็กต์ Door/Gate Controller
แอตทริบิวต์
door_id
stringจำเป็นตัวระบุเฉพาะของ Door/Gate Controller จัดเก็บค่านี้ไว้ในระบบของคุณหลังจากค้นพบ และใช้เมื่อเรียกปลายทางปลดล็อก
facility_id
stringจำเป็นID สถานที่ของ Performance Hub
linking_identifier
stringไม่บังคับตัวระบุสถานที่ของพาร์ทเนอร์ เมื่อการผสานรวมของคุณใช้ Linking Identifier ดูข้อมูลเพิ่มเติม
name
stringจำเป็นชื่ออุปกรณ์ที่มนุษย์อ่านได้ซึ่งกำหนดค่าไว้ใน Performance Hub
zone
stringไม่บังคับโซนหรือตำแหน่งของประตู เช่น
Entrancestatus
stringจำเป็นonlineหรือofflinerelay_state
stringไม่บังคับสถานะรีเลย์ล่าสุดที่ทราบ เช่น
lockedหรือunlockedmaintenance_mode
stringจำเป็นโหมดบำรุงรักษาปัจจุบัน เป็นค่าใดค่าหนึ่งต่อไปนี้
off,force-openหรือforce-closedhold_time_seconds
integerจำเป็นระยะเวลาค้างการปลดล็อกเริ่มต้นที่กำหนดค่าไว้สำหรับประตู
last_seen
stringไม่บังคับการประทับเวลาแบบ ISO ของการอัปเดตข้อมูลเมตาของอุปกรณ์ครั้งล่าสุด
ออบเจ็กต์ Door/Gate Controller
{
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"linking_identifier": "branch_downtown",
"name": "Front Door",
"zone": "Entrance",
"status": "online",
"online": true,
"relay_state": "locked",
"maintenance_mode": "off",
"hold_time_seconds": 10,
"last_seen": "2026-05-01T04:30:00.000Z"
}
แสดงรายการ Door/Gate Controller
ส่งคืน Door/Gate Controller ที่การผสานรวมของคุณใช้งานได้
หากไม่ได้ระบุทั้ง facility_id และ linking_identifier API จะส่งคืน Door/Gate Controller จากทุกสถานที่ที่เชื่อมโยงกับบัญชีพาร์ทเนอร์ของคุณ
พารามิเตอร์
facility_id
stringไม่บังคับ อย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมID สถานที่ของ Performance Hub ใช้สำหรับการผสานรวมแบบ Direct Link
linking_identifier
stringไม่บังคับ อย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุสถานที่/ตำแหน่งที่ตั้งของคุณเอง ใช้เมื่อการผสานรวมของคุณกำหนดค่าให้ใช้ Linking Identifier
ค่าที่ส่งคืน
ส่งคืนอาร์เรย์ของออบเจ็กต์ Door/Gate Controller
คำขอ
curl -X GET "https://partner-api.performancehub.co/partner/v1/access-control/doors?facility_id=550e8400-e29b-41d4-a716-446655440000" \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
การตอบกลับ
{
"data": [
{
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Front Door",
"zone": "Entrance",
"status": "online",
"relay_state": "locked",
"maintenance_mode": "off",
"hold_time_seconds": 10,
"last_seen": "2026-05-01T04:30:00.000Z"
}
]
}
ดูสถานะของ Door/Gate Controller
ดึงสถานะล่าสุดที่ทราบและการกำหนดค่าพื้นฐานของ Door/Gate Controller หนึ่งตัว
ระบุตัวระบุสถานที่เพื่อให้ Performance Hub ตรวจสอบได้ว่าประตูเป็นของสถานที่ที่การผสานรวมของคุณเข้าถึงได้
พารามิเตอร์
door_id
stringจำเป็นID ของ Door/Gate Controller ที่ส่งคืนจากปลายทางแสดงรายการ
facility_id
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมID สถานที่ของ Performance Hub จำเป็นสำหรับการผสานรวมแบบ Direct Link
linking_identifier
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุสถานที่ของพาร์ทเนอร์ จำเป็นสำหรับการผสานรวมแบบ Linking Identifier
ค่าที่ส่งคืน
ส่งคืนออบเจ็กต์ Door/Gate Controller
คำขอ
curl -X GET "https://partner-api.performancehub.co/partner/v1/access-control/doors/00000000000000000000000000000007?facility_id=550e8400-e29b-41d4-a716-446655440000" \
-u sk_live_YOUR_PARTNER_SECRET_KEY:
การตอบกลับ
{
"data": {
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Front Door",
"zone": "Entrance",
"status": "online",
"relay_state": "locked",
"maintenance_mode": "off",
"hold_time_seconds": 10,
"last_seen": "2026-05-01T04:30:00.000Z"
}
}
ปลดล็อก Door/Gate Controller
ส่งคำสั่งปลดล็อกไปยัง Door/Gate Controller และรอให้รีเลย์ทางกายภาพยืนยันว่าปลดล็อกแล้ว
ระบบของคุณต้องตัดสินว่าบุคคลนั้นได้รับอนุญาตหรือไม่ก่อนเรียกปลายทางนี้ Performance Hub จะตรวจสอบเฉพาะคีย์พาร์ทเนอร์ การเข้าถึงสถานที่ ความเป็นเจ้าของประตู และสถานะของอุปกรณ์เท่านั้น
พารามิเตอร์
door_id
stringจำเป็นID ของ Door/Gate Controller ที่ส่งคืนจากปลายทางแสดงรายการ
facility_id
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมID สถานที่ของ Performance Hub จำเป็นสำหรับการผสานรวมแบบ Direct Link
linking_identifier
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุสถานที่ของพาร์ทเนอร์ จำเป็นสำหรับการผสานรวมแบบ Linking Identifier
member_id
stringจำเป็นID สมาชิกของพาร์ทเนอร์ ใช้สำหรับการบันทึกเพื่อการตรวจสอบและการเชื่อมโยงข้อมูลในภายหลัง
first_name
stringจำเป็นชื่อจริงของบุคคลที่เปิดประตู
last_name
stringจำเป็นนามสกุลของบุคคลที่เปิดประตู
full_name
stringไม่บังคับไม่บังคับ หากเว้นไว้ Performance Hub จะรวม
first_nameและlast_nameเข้าด้วยกันcheck_in_id
stringไม่บังคับID การเช็กอินจากระบบของคุณ (ไม่บังคับ) สำหรับการเชื่อมโยงข้อมูล
idempotency_key
stringไม่บังคับคีย์ป้องกันการส่งซ้ำ (ไม่บังคับ) การใช้คีย์เดิมซ้ำสำหรับพาร์ทเนอร์ สถานที่ และประตูเดียวกันจะส่งคืนผลลัพธ์ที่มีอยู่เมื่อมี
ค่าที่ส่งคืน
ส่งคืน 200 ก็ต่อเมื่ออุปกรณ์ยืนยันว่ารีเลย์ปลดล็อกทางกายภาพแล้วเท่านั้น ประตูจะใช้ระยะเวลาค้างการปลดล็อกที่กำหนดค่าไว้ในการจัดการอุปกรณ์ของ Performance Hub พาร์ทเนอร์ไม่สามารถแทนที่ระยะเวลาของรีเลย์ในแต่ละคำขอได้ การยืนยันส่วนใหญ่ควรเสร็จสิ้นภายใน 3-5 วินาที ให้ถือว่าการหมดเวลาที่ระบุในเอกสารเป็นการปลดล็อกที่ล้มเหลวอย่างชัดเจน และลองใหม่ตามกฎด้านความปลอดภัยของคุณเองเท่านั้น
ความล้มเหลวที่พบบ่อย:
403 integration_not_enabled- ยังไม่ได้เปิดใช้การผสานรวมของคุณสำหรับสถานที่นั้น409 maintenance_mode_active- เจ้าหน้าที่ของสถานที่เปิดใช้โหมดบำรุงรักษาสำหรับประตูนั้น503 device_offline- Door/Gate Controller ออฟไลน์หรือข้อมูลไม่เป็นปัจจุบัน504 unlock_confirmation_timeout- ส่งคำสั่งแล้วแต่ไม่ได้รับการยืนยันที่ตรงกันก่อนหมดเวลา
คำขอ
curl -X POST https://partner-api.performancehub.co/partner/v1/access-control/doors/00000000000000000000000000000007/unlock \
-u sk_live_YOUR_PARTNER_SECRET_KEY: \
-H "Content-Type: application/json" \
-d '{
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"member_id": "mem_12345",
"first_name": "Jane",
"last_name": "S.",
"full_name": "Jane S.",
"source": "door_reader",
"idempotency_key": "unlock_20260501_0001"
}'
การตอบกลับ
{
"status": "unlocked",
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"event_id": "00000000-0000-0000-0000-000000000045",
"command_id": "00000000-0000-0000-0000-000000000049",
"hold_time_seconds": 10,
"confirmed_at": "2026-05-01T04:30:00.000Z"
}
การตอบกลับเมื่อล้มเหลว
{
"status": "failed",
"reason": "device_offline",
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"event_id": "00000000-0000-0000-0000-000000000045"
}
บันทึกความพยายามในการเข้าถึงหรือการปฏิเสธ
บันทึกความพยายามในการเข้าถึงหรือการปฏิเสธที่ระบบของคุณตัดสินไว้แล้ว ระบบจะไม่ติดต่อ Door/Gate Controller และประตูจะไม่ปลดล็อก
ใช้ปลายทางนี้เมื่อระบบของคุณปฏิเสธการเข้า หรือเมื่อต้องการให้ความพยายามปรากฏในบันทึกการเข้าถึงของ Door & Gate Access โดยไม่มีการปลดล็อก Performance Hub ไม่ได้ประเมินสถานะสมาชิก ชั่วโมงการเข้าถึง หรือกฎการเข้าถึงอื่น ๆ
เหตุการณ์ที่ถูกปฏิเสธจะปรากฏในบันทึกการเข้าถึงของ Door & Gate Access พร้อมผลลัพธ์ Denied ชื่อพาร์ทเนอร์ของคุณ ประตู ตัวระบุสมาชิกเมื่อคุณส่งมา และรหัสเหตุผลในรูปแบบที่อ่านได้ ตัวอย่างเช่น membership_expired จะแสดงเป็น "Membership Expired" ระบบจะจัดเก็บ reason_display_text และ user_email ไว้พร้อมกับเหตุการณ์
พารามิเตอร์
door_id
stringจำเป็นID ของ Door/Gate Controller ที่ส่งคืนจากปลายทางแสดงรายการ
facility_id
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมID สถานที่ของ Performance Hub จำเป็นสำหรับการผสานรวมแบบ Direct Link
linking_identifier
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุสถานที่ของพาร์ทเนอร์ จำเป็นสำหรับการผสานรวมแบบ Linking Identifier
outcome
stringจำเป็นdeniedหรือattemptedreason
stringไม่บังคับรหัสเหตุผลแบบ snake_case ตัวพิมพ์เล็ก ยาวไม่เกิน 64 อักขระ จำเป็นเมื่อ
outcomeเป็นdeniedตัวอย่าง:membership_expiredreason_display_text
stringไม่บังคับเหตุผลที่มนุษย์อ่านได้ ยาวไม่เกิน 256 อักขระ ตัวอย่าง:
Membership expired on 2026-04-01member_id
stringไม่บังคับID สมาชิกของพาร์ทเนอร์ ให้เว้นไว้เมื่อข้อมูลประจำตัวไม่ตรงกับสมาชิกรายใด เช่น บัตรที่ไม่รู้จัก
user_email
stringไม่บังคับอีเมลของบุคคลที่พยายามเข้าถึง
timestamp
stringไม่บังคับเวลาที่เกิดความพยายาม ในรูปแบบ ISO 8601 พร้อมเขตเวลา ตัวอย่าง:
2026-05-18T10:15:30Zค่าเริ่มต้นคือเวลาที่ได้รับคำขอ ต้องไม่เป็นเวลาในอนาคตเกิน 5 นาที หรือย้อนหลังเกิน 30 วันidempotency_key
stringไม่บังคับคีย์ป้องกันการส่งซ้ำ ยาวไม่เกิน 128 อักขระ การใช้คีย์เดิมซ้ำสำหรับพาร์ทเนอร์ สถานที่ และประตูเดียวกันจะส่งคืนผลลัพธ์เดิม
ค่าที่ส่งคืน
ส่งคืน 201 เมื่อบันทึกเหตุการณ์แล้ว การส่ง idempotency_key เดิมซ้ำจะส่งคืน 200 โดยตั้งค่า idempotent เป็น true และไม่สร้างเหตุการณ์ใหม่
คีย์ dry-run จะส่งคืน 200 โดยตั้งค่า dry_run เป็น true และจะไม่มีการบันทึกใด ๆ
ความล้มเหลวที่พบบ่อย:
400- เนื้อหาคำขอไม่ถูกต้อง การปฏิเสธไม่มีreasonการประทับเวลาอยู่นอกช่วง หรือfacility_id/linking_identifierไม่ตรงกับสถานที่ที่เชื่อมโยงไว้403- คีย์เป็นแบบอ่านอย่างเดียว403 integration_not_enabled- ยังไม่ได้เปิดใช้การผสานรวมของคุณสำหรับสถานที่นั้นmessageจะระบุเหตุผล404- ไม่พบ Door/Gate Controller สำหรับสถานที่ที่เชื่อมโยงไว้
คำขอ
curl -X POST https://partner-api.performancehub.co/partner/v1/access-control/doors/00000000000000000000000000000007/access-events \
-u sk_live_YOUR_PARTNER_SECRET_KEY: \
-H "Content-Type: application/json" \
-d '{
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"outcome": "denied",
"reason": "membership_expired",
"reason_display_text": "Membership expired on 2026-04-01",
"member_id": "mem_12345",
"user_email": "member@example.com",
"timestamp": "2026-05-18T10:15:30Z",
"idempotency_key": "evt_abc12345"
}'
การตอบกลับ
{
"status": "recorded",
"event_id": "00000000-0000-0000-0000-000000000045",
"outcome": "denied",
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-05-18T10:15:30.000Z"
}
การส่งซ้ำแบบ Idempotent
{
"status": "recorded",
"event_id": "00000000-0000-0000-0000-000000000045",
"outcome": "denied",
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-05-18T10:15:30.000Z",
"idempotent": true
}
รายงานของสถานที่
บันทึก ณ ช่วงเวลาหนึ่งที่เก็บเมตริกสำคัญด้านการดำเนินงานและการเงินของสถานที่ในช่วงเวลาที่กำหนด
ปลายทาง
POST /partner/v1/report-snapshots - Save report snapshots
ออบเจ็กต์ Report Snapshot
แอตทริบิวต์
facility_id
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมตัวระบุเฉพาะของสถานที่จาก Performance Hub
linking_identifier
stringอย่างใดอย่างหนึ่งระบุประเภทตัวระบุสถานที่ที่กำหนดค่าไว้สำหรับการผสานรวมของคุณ: ใช้ facility_id สำหรับการผสานรวมแบบ Direct Link หรือใช้ linking_identifier สำหรับการผสานรวมแบบ Linking Identifier อย่าส่งทั้งสองค่า API จะใช้ประเภทตัวระบุที่กำหนดค่าไว้สำหรับบัญชีพาร์ทเนอร์ของคุณและละเว้นอีกค่าหนึ่ง ดูข้อมูลเพิ่มเติมค่าตัวระบุเฉพาะของแต่ละตำแหน่งที่ตั้งที่พาร์ทเนอร์ใช้ (เช่น "Branch ID", "Location Code", "Store Number") ดูข้อมูลเพิ่มเติม
start_date
stringจำเป็นวันที่เริ่มต้นของช่วงเวลาสแนปช็อตในรูปแบบ
YYYY-MM-DDend_date
stringจำเป็นวันที่สิ้นสุดของช่วงเวลาสแนปช็อตในรูปแบบ
YYYY-MM-DDmetrics
objectจำเป็นออบเจ็กต์เมตริกที่มีข้อมูลสมาชิกและรายได้ของช่วงเวลานั้น
ออบเจ็กต์ Report Snapshot
{
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
// "linking_identifier": "branch_downtown", // If using linking identifier
"start_date": "2025-01-01",
"end_date": "2025-01-31",
"metrics": {
"members": {
"active": 1200,
"new": 45,
"cancelled": 12
},
"revenue": {
"total_payments": 289000.00,
"total_payments_count": 1200,
"currency": "AUD"
}
}
}
บันทึกสแนปช็อตรายงาน
ส่งเมตริกด้านการดำเนินงานและการเงินของสถานที่ในช่วงเวลาที่กำหนด
พารามิเตอร์
snapshots
arrayจำเป็นอาร์เรย์ของออบเจ็กต์ Report Snapshot ที่จะบันทึก สูงสุด 25 รายการต่อคำขอ แต่ละรายการต้องมี
facility_id(จำเป็นหากไม่ใช้linking_identifier) หรือlinking_identifier(จำเป็นหากไม่ใช้facility_id)
ค่าที่ส่งคืน
ส่งคืนข้อความสั้น ๆ ที่ยืนยันการดำเนินการซิงค์
คำขอ
curl -X POST https://partner-api.performancehub.co/partner/v1/report-snapshots \
-u sk_live_YOUR_PARTNER_SECRET_KEY: \
-H "Content-Type: application/json" \
-d '{
"snapshots": [
{
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
// "linking_identifier": "branch_downtown", // If using linking identifier
"start_date": "2025-01-01",
"end_date": "2025-01-31",
"metrics": {
"members": {
"active": 1200,
"new": 45,
"cancelled": 12
},
"revenue": {
"total_payments": 289000.00,
"currency": "AUD"
}
}
}
]
}'
การตอบกลับ
{
"message": "Report snapshot sync successful."
}
ข้อผิดพลาด
Partner API ใช้รหัสสถานะ HTTP มาตรฐานและเนื้อหาการตอบกลับแบบ JSON เพื่ออธิบายสาเหตุที่คำขอล้มเหลว
รูปแบบการตอบกลับข้อผิดพลาด
ข้อผิดพลาดของ API ส่วนใหญ่จะส่งคืนเนื้อหา JSON ที่มีข้อความ และรายละเอียดแบบมีโครงสร้างหากมี
รหัสสถานะ
ความล้มเหลวของ Access Time Window
การตรวจสอบความถูกต้องของช่วงเวลาจะล้มเหลวก่อนที่สแนปช็อตที่ไม่ถูกต้องจะถูกเขียน สาเหตุที่พบบ่อยซึ่งลองใหม่ไม่ได้ ได้แก่:
- ไม่มี
access_time_windows_revisionเมื่อมีaccess_time_windows - ค่า epoch ที่เป็นสตริง ทศนิยม หรือมีแนวโน้มว่าเป็นมิลลิวินาที
- เขตเวลา IANA ที่ไม่ถูกต้อง ช่วงเวลาที่กลับด้าน
external_idซ้ำ บล็อกรายสัปดาห์ที่ทับซ้อนกัน หรือบล็อกข้ามคืนที่ไม่ได้แยกออก - ค่าที่อยู่นอกขีดจำกัดด้านจำนวน ความยาว หรือช่วงเวลาที่ระบุไว้ในเอกสาร
เวอร์ชันซ้ำที่มีเนื้อหาที่ปรับให้เป็นมาตรฐานแล้วแตกต่างกันจะเป็น 409 Conflict ให้กระทบยอดกับสถานะล่าสุดที่เชื่อถือได้และจัดสรรเวอร์ชันที่ใหม่กว่า อย่าลองส่งคู่ที่ขัดแย้งกันซ้ำ เวอร์ชันที่เก่ากว่าจะถูกรายงานเป็นสแนปช็อตเก่าที่ถูกข้าม แทนที่จะได้รับอนุญาตให้เขียนทับสถานะที่ใหม่กว่า scope_key ที่ไม่รู้จักหรือไม่ได้จับคู่ไว้จะไม่ให้สิทธิ์เข้าถึง สำหรับการให้สิทธิ์ และควรถือเป็นการแจ้งเตือนด้านการกำหนดค่า
หากการส่งหมดเวลาหรือได้รับ 5xx ชั่วคราว ให้ลองส่งสแนปช็อตที่ปรับให้เป็นมาตรฐานเดิมทุกประการซ้ำด้วยเวอร์ชันเดิม หากการดึงข้อมูลจากต้นทางล้มเหลว ให้เว้นฟิลด์ช่วงเวลาไว้ทั้งหมด อย่าแทนที่ด้วยอาร์เรย์ว่างเด็ดขาด
คำแนะนำในการลองใหม่
ลองใหม่สำหรับกรณีต่อไปนี้ด้วยการเว้นระยะแบบเอ็กซ์โพเนนเชียลที่จำกัดจำนวนครั้ง:
429500502503504
อย่าลองใหม่โดยไม่ไตร่ตรองสำหรับกรณีต่อไปนี้:
400401403404409422
สำหรับการควบคุมการเข้าถึง ให้ถือว่าการตอบกลับที่หมดเวลาและออฟไลน์เป็นการปลดล็อกที่ล้มเหลวเสมอ เว้นแต่กฎการเข้าถึงและกระบวนการด้านความปลอดภัยของคุณเองจะระบุไว้เป็นอย่างอื่น
รายละเอียดที่ควรระบุเมื่อติดต่อฝ่ายสนับสนุน
เมื่อติดต่อฝ่ายสนับสนุน ให้ระบุ:
- ปลายทางและเมธอด HTTP
- การประทับเวลาและเขตเวลา
- ID ของคีย์พาร์ทเนอร์ ไม่ใช่คีย์ลับ
- ตัวระบุสถานที่ที่ใช้
- ID ของเรคคอร์ดต้นทางจากระบบของคุณ
- สถานะและเนื้อหาของการตอบกลับ
event_idหรือcommand_idหากมี
{
"success": false,
"message": "Request body.members[0].member_id is required"
}
ปลายทางเฉพาะโดเมนบางรายการจะส่งคืนสถานะและเหตุผลอย่างชัดเจน ตัวอย่างเช่น ความล้มเหลวของการควบคุมการเข้าถึงจะมีฟิลด์ต่าง ๆ เช่น reason, door_id, facility_id และ event_id
{
"status": "failed",
"reason": "device_offline",
"door_id": "00000000000000000000000000000007",
"facility_id": "550e8400-e29b-41d4-a716-446655440000",
"event_id": "00000000-0000-0000-0000-000000000045"
}
400 Bad Request
คำขอมีรูปแบบไม่ถูกต้องหรือไม่มีฟิลด์ที่จำเป็น แก้ไขคำขอก่อนลองใหม่
401 Unauthorized
การยืนยันตัวตนล้มเหลว ตรวจสอบว่าคุณใช้ HTTP Basic Auth โดยใช้คีย์ลับของ API เป็นชื่อผู้ใช้และเว้นรหัสผ่านว่างไว้
403 Forbidden
คีย์ถูกต้องแต่ไม่อนุญาตให้ดำเนินการนี้ สาเหตุที่พบบ่อย ได้แก่ การใช้คีย์แบบอ่านอย่างเดียวสำหรับการดำเนินการเขียน หรือการพยายามเข้าถึงสถานที่ที่ไม่ได้เปิดใช้การผสานรวมของคุณ
404 Not Found
ไม่พบทรัพยากรที่ร้องขอ หรือทรัพยากรนั้นไม่พร้อมให้การผสานรวมของคุณใช้งาน
409 Conflict
คำขอขัดแย้งกับสถานะปัจจุบันของทรัพยากร สำหรับการควบคุมการเข้าถึง อาจรวมถึงกรณีที่ Door/Gate Controller อยู่ในโหมดบำรุงรักษา
422 Unprocessable Entity
คำขอเป็น JSON ที่ถูกต้องแต่ไม่ผ่านการตรวจสอบความถูกต้องเชิงความหมาย แก้ไขข้อมูลก่อนลองใหม่
429 Too Many Requests
การผสานรวมเกินขีดจำกัดอัตราการเรียกใช้ที่ระบุไว้ในเอกสาร ลองใหม่โดยใช้การเว้นระยะแบบเอ็กซ์โพเนนเชียล
500 Internal Server Error
Performance Hub ไม่สามารถดำเนินการตามคำขอได้เนื่องจากข้อผิดพลาดภายใน ลองใหม่โดยเว้นระยะ หากปัญหายังคงอยู่ ให้ติดต่อฝ่ายสนับสนุนพร้อมระบุปลายทาง การประทับเวลา และเนื้อหาการตอบกลับ
503 Service Unavailable
บริการหรืออุปกรณ์ที่เกี่ยวข้องไม่พร้อมใช้งาน สำหรับการปลดล็อก Door/Gate Controller อาจหมายความว่าตัวควบคุมออฟไลน์
504 Gateway Timeout
การดำเนินการหมดเวลา สำหรับการปลดล็อก Door/Gate Controller หมายความว่าการปลดล็อกไม่ได้รับการยืนยันก่อนหมดช่วงเวลาที่กำหนด
การกำหนดเวอร์ชัน
Partner API กำหนดเวอร์ชันไว้ใน URL เวอร์ชันปัจจุบันคือ:
นโยบายการเปลี่ยนแปลง
Performance Hub มุ่งทำการเปลี่ยนแปลงแบบเพิ่มเติมที่เข้ากันได้กับเวอร์ชันก่อนหน้าทุกครั้งที่ทำได้
ตัวอย่างการเปลี่ยนแปลงที่เข้ากันได้กับเวอร์ชันก่อนหน้า:
- การเพิ่มฟิลด์ใหม่แบบไม่บังคับในคำขอ
- การเพิ่มฟิลด์ใหม่ในการตอบกลับ
- การเพิ่มปลายทางใหม่
- การเพิ่มค่า enum ใหม่ในกรณีที่ไคลเอนต์ควรรองรับค่าที่ไม่รู้จัก
- การปรับปรุงข้อความการตรวจสอบความถูกต้องโดยไม่เปลี่ยนข้อตกลงของรหัสสถานะ
access_time_windows และ access_time_windows_revision เป็นฟิลด์คำขอของ Member แบบเพิ่มเติม ไคลเอนต์ที่มีอยู่ซึ่งไม่ส่งฟิลด์เหล่านี้จะคงสแนปช็อต Access Time Window ที่จัดเก็บไว้โดยไม่เปลี่ยนแปลง กฎการเว้นค่านี้รักษาความเข้ากันได้ของการ upsert บางส่วน การเว้นค่าไม่เทียบเท่ากับการส่งอาร์เรย์ว่าง
ตัวอย่างการเปลี่ยนแปลงที่ทำให้เกิดความไม่เข้ากัน:
- การนำฟิลด์ออกหรือเปลี่ยนชื่อฟิลด์
- การเปลี่ยนประเภทของฟิลด์
- การเปลี่ยนฟิลด์คำขอที่ไม่บังคับให้เป็นฟิลด์ที่จำเป็น
- การนำปลายทางออก
- การเปลี่ยนความหมายของรหัสสถานะที่มีอยู่หรือ
reasonเฉพาะโดเมน
การเลิกใช้งาน
เมื่อจำเป็นต้องมีการเปลี่ยนแปลงที่ทำให้เกิดความไม่เข้ากัน Performance Hub จะหลีกเลี่ยงการเปลี่ยนแปลงเวอร์ชันที่มีอยู่โดยตรงเท่าที่ทำได้ แต่จะเปิดตัวเวอร์ชันใหม่หรือแนวทางการย้ายระบบ และแจ้งการเปลี่ยนแปลงให้พาร์ทเนอร์ที่ได้รับผลกระทบทราบ
ประกาศการเลิกใช้งานอาจรวมถึง:
- รายการในบันทึกการเปลี่ยนแปลง
- การสื่อสารกับพาร์ทเนอร์โดยตรง
- หมายเหตุใน Partner Console
- คำแนะนำการย้ายระบบในเอกสาร
คำแนะนำสำหรับไคลเอนต์
สร้างไคลเอนต์ที่รองรับการเปลี่ยนแปลงแบบเพิ่มเติมได้:
- ละเว้นฟิลด์การตอบกลับที่คุณไม่ได้ใช้
- ถือว่าค่า enum ที่ไม่รู้จักเป็นค่าที่ไม่รองรับ แทนที่จะทำให้ระบบขัดข้อง
- หลีกเลี่ยงการตรวจสอบการตอบกลับว่าตรงกันทุกประการอย่างเคร่งครัด
- บันทึกค่าที่ไม่รู้จักไว้เพื่อให้คุณอัปเดตการผสานรวมได้อย่างตั้งใจ
สำหรับพาร์ทิชันของ Member ที่มีการกำหนดเวอร์ชัน เช่น Access Time Windows ให้เก็บเวอร์ชันและเพย์โหลดที่ปรับให้เป็นมาตรฐานที่ส่งไปไว้จนกว่าจะทราบผลลัพธ์ การใช้เวอร์ชันเดิมซ้ำกับเนื้อหาที่เปลี่ยนแปลงถือเป็นความขัดแย้ง ส่วนการส่งเนื้อหาเดิมซ้ำเป็นแบบ Idempotent ดู Access Time Windows
ข้อกำหนด OpenAPI
ใช้ข้อกำหนด OpenAPI ที่เผยแพร่เพื่อสร้างไคลเอนต์ ตรวจสอบความถูกต้องของคำขอ และติดตามการเปลี่ยนแปลงโครงสร้างของ API เมื่อเวลาผ่านไป
https://partner-api.performancehub.co/partner/v1/
บันทึกการเปลี่ยนแปลง
บันทึกการเปลี่ยนแปลงนี้รวบรวมการเปลี่ยนแปลงที่สำคัญของ Partner API และ Partner Console ที่ส่งผลต่อการทำงานของการผสานรวม
2026-09-09
2026-05-06
2026-05-01
หมวดหมู่การเปลี่ยนแปลง
รายการในอนาคตจะใช้หมวดหมู่เหล่านี้:
- เพิ่มใหม่ (Added) - ปลายทาง ฟิลด์ คู่มือ หรือความสามารถใหม่
- เปลี่ยนแปลง (Changed) - มีการเปลี่ยนแปลงการทำงานหรือเอกสารโดยไม่ยกเลิกการรองรับ
- เลิกใช้งาน (Deprecated) - ฟีเจอร์ยังคงใช้งานได้ แต่มีแผนการย้ายไปใช้สิ่งอื่น
- นำออก (Removed) - นำฟีเจอร์หรือปลายทางออกแล้ว
- แก้ไข (Fixed) - แก้ไขข้อบกพร่องหรือแก้ไขเอกสาร
- ความปลอดภัย (Security) - การเปลี่ยนแปลงด้านการยืนยันตัวตน การให้สิทธิ์ การจัดการข้อมูล หรือการจัดการคีย์
เพิ่มใหม่
- เพิ่มสแนปช็อต
access_time_windowsของสมาชิกที่ไม่ผูกกับผู้ให้บริการรายใด ซึ่งรองรับช่วงเวลาแบบกำหนดวันเวลาแน่นอนและแบบรายสัปดาห์ที่เกิดซ้ำผสมกัน - เพิ่มการเรียงลำดับด้วย
access_time_windows_revisionการส่งซ้ำแบบ Idempotent ความขัดแย้ง การข้ามข้อมูลเก่า และหลักการเพิกถอนสิทธิ์อย่างชัดเจน - เพิ่มคำแนะนำเกี่ยวกับเขตเวลา IANA เวลาออมแสง การจับคู่
scope_keyเชิงตรรกะ ความเป็นปัจจุบันของข้อมูลต้นทาง การพัฒนาฝั่งผู้ส่งข้อมูล และการรับรอง
เพิ่มใหม่
- เพิ่มเอกสารโปรแกรมพาร์ทเนอร์ ซึ่งครอบคลุมประเภทพาร์ทเนอร์ การเริ่มต้นใช้งาน แนวทางปฏิบัติที่ดีที่สุด ความพร้อมในการเปิดใช้งานจริง ข้อผิดพลาด การกำหนดเวอร์ชัน และการสนับสนุน
- เพิ่มขั้นตอนการส่งคำขอสมัครเป็นพาร์ทเนอร์โดยเฉพาะ สำหรับผู้ที่สนใจเป็นพาร์ทเนอร์ด้านเทคนิคและด้านการค้า
- เพิ่มเอกสารเกี่ยวกับวิธีที่การผสานรวมพาร์ทเนอร์ที่ได้รับอนุมัติปรากฏในไดเรกทอรีพาร์ทเนอร์ของ Performance Hub ภายในแพลตฟอร์มหลักของ Performance Hub
เพิ่มใหม่
- เพิ่มเอกสารการควบคุมการเข้าถึงของ Door/Gate Controller รวมถึงการดำเนินการแสดงรายการ ดูสถานะ และปลดล็อก
- เพิ่มเอกสารการทำงานของการปลดล็อกแบบซิงโครนัส: API จะส่งคืนผลสำเร็จก็ต่อเมื่อตัวควบคุมในสถานที่ยืนยันว่ารีเลย์ปลดล็อกทางกายภาพแล้วเท่านั้น
- เพิ่มเอกสารการรองรับ
idempotency_keyแบบไม่บังคับสำหรับคำขอปลดล็อก Door/Gate Controller